From 3615193e2031b0ba8b556ad17b3172c875668c22 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Wed, 31 Jul 2024 14:23:36 +0200
Subject: [PATCH 001/106] REL: Begin next release cycle

---
 CHANGELOG.md    | 16 ++++++++++++++++
 setup.py        |  4 ++--
 src/doc/conf.py |  4 ++--
 3 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 92180a7d..831ea7fd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [Unreleased] ##
+
+### Added ###
+
+### Changed ###
+
+### Deprecated ###
+
+### Removed ###
+
+### Fixed ###
+
+### Security ###
+
+### Documentation ###
+
 ## [0.12.0] - 2024-07-31 ##
 
 ### Added ###
diff --git a/setup.py b/setup.py
index 03c515e6..bee11751 100755
--- a/setup.py
+++ b/setup.py
@@ -47,9 +47,9 @@ from setuptools import find_packages, setup
 
 MAJOR = 0
 MINOR = 12
-MICRO = 0
+MICRO = 1
 PRE = ""  # e.g. rc0, alpha.1, 0.beta-23
-ISRELEASED = True
+ISRELEASED = False
 
 if PRE:
     VERSION = "{}.{}.{}-{}".format(MAJOR, MINOR, MICRO, PRE)
diff --git a/src/doc/conf.py b/src/doc/conf.py
index 0fc4ff08..2aa08622 100644
--- a/src/doc/conf.py
+++ b/src/doc/conf.py
@@ -27,9 +27,9 @@ copyright = '2023, IndiScale GmbH'
 author = 'Daniel Hornung'
 
 # The short X.Y version
-version = '0.12.0'
+version = '0.12.1'
 # The full version, including alpha/beta/rc tags
-release = '0.12.0'
+release = '0.12.1-dev'
 
 
 # -- General configuration ---------------------------------------------------
-- 
GitLab


From 6362238ea7f1b231f4b509422acffaa591a2e243 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Tue, 6 Aug 2024 16:52:16 +0200
Subject: [PATCH 002/106] WIP: Add docstrings to more of loadfile's methods

---
 src/caosadvancedtools/loadFiles.py | 86 ++++++++++++++++++++++++++----
 1 file changed, 77 insertions(+), 9 deletions(-)

diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py
index 77872d1d..24b7ddc3 100755
--- a/src/caosadvancedtools/loadFiles.py
+++ b/src/caosadvancedtools/loadFiles.py
@@ -40,6 +40,10 @@ timeout_fallback = 20
 
 
 def convert_size(size):
+    """Convert `size` from B to a human-readable file size in KB,
+    MB, ...
+
+    """
     if (size == 0):
         return '0B'
     size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
@@ -51,8 +55,24 @@ def convert_size(size):
 
 
 def combine_ignore_files(caosdbignore, localignore, dirname=None):
-    """appends the contents of localignore to caosdbignore and saves the result
-    and returns the name
+    """Append the contents of localignore to caosdbignore, save the result,
+    and return the name.
+
+    Parameters
+    ----------
+    caosdbignore : str
+        Path to parent level caosdbignore file
+    localignore : str
+        Path to current working directory's local caosdbignore.
+    dirname : str, optional
+        The path of the directory to which the temporary combined file
+        is written. If None is given, `NamedTemporaryFile`'s default
+        is used. Default is None.
+
+    Returns
+    -------
+    name : str
+        Name of the temporary combined caosdbignore file.
 
     """
 
@@ -67,8 +87,21 @@ def combine_ignore_files(caosdbignore, localignore, dirname=None):
 
 
 def compile_file_list(caosdbignore, localpath):
-    """creates a list of files that contain all files under localpath except
-    those excluded by caosdbignore
+    """Create a list of files that contain all files under localpath except
+    those excluded by caosdbignore.
+
+    Parameters
+    ----------
+    caosdbignore : str
+        Path of caosdbignore file
+    localpath : str
+        Path of the directory from which the file list will be compiled.
+
+    Returns
+    -------
+    file_list : list[str]
+        List of files in `localpath` after appling the ignore rules
+        from `caosdbignore`.
 
     """
 
@@ -111,9 +144,27 @@ def compile_file_list(caosdbignore, localpath):
 
 
 def create_re_for_file_list(files, localroot, remoteroot):
-    """creates a regular expression that matches file paths contained in the
-    files argument and all parent directories. The prefix localroot is replaced
-    by the prefix remoteroot.
+    """Create a regular expression that matches file paths contained
+    in the files argument and all parent directories. The prefix
+    localroot is replaced by the prefix remoteroot.
+
+    Parameters
+    ----------
+    files : list[str]
+        List of file paths to be converted to a regular expression.
+    localroot : str
+        Prefix (of the local directory root) to be removed from the
+        paths in `files`.
+    remoteroot : str
+        Prefix (of the LinkAhead filesystem's directory root) to be
+        prepended to the file paths after the removal of the
+        `localroot` prefix.
+
+    Returns
+    -------
+    regexp : str
+        Regular expression that matches all file paths from `files`
+        adapted for the remote directory root.
 
     """
     regexp = ""
@@ -130,6 +181,19 @@ def create_re_for_file_list(files, localroot, remoteroot):
 
 def loadpath(path, include, exclude, prefix, dryrun, forceAllowSymlinks, caosdbignore=None,
              localpath=None):
+    """Make all files in `path` available to the LinkAhead server as FILE entities.
+
+    Parameters
+    ----------
+    path : str
+        Path to the directory the files of which are to be made
+        available as seen by the linkahead server (i.e., the path from
+        within the Docker container in a typical LinkAhead Control
+        setup.)
+    include : str
+        
+    
+    """
 
     if caosdbignore:
         # create list of files and create regular expression for small chunks
@@ -182,7 +246,11 @@ def loadpath(path, include, exclude, prefix, dryrun, forceAllowSymlinks, caosdbi
 
 
 def main(argv=None):
-    '''Command line options.'''
+    """Run `loadpath` with the arguments specified on the command
+    line, extended by the optional `argv` parameter. See ``--help``
+    for more information.
+
+    """
 
     if argv is None:
         argv = sys.argv
@@ -191,7 +259,7 @@ def main(argv=None):
 
     # Setup argument parser
     parser = ArgumentParser(description="""
-Make files that the LinkAhead server can see available als FILE entities.
+Make files that the LinkAhead server can see available as FILE entities.
 
 In a typical scenario where LinkAhead runs in a Docker container and a host directory `mydir` is
 mounted as an extroot with name `myext`, loadfiles could be called like this:
-- 
GitLab


From 0b01d3f078113135261df79bd1bd32cbfe75be16 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Wed, 7 Aug 2024 10:01:05 +0200
Subject: [PATCH 003/106] DOC: Improve docstrings in loadFiles

---
 src/caosadvancedtools/loadFiles.py | 35 ++++++++++++++++++++++++++----
 1 file changed, 31 insertions(+), 4 deletions(-)

diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py
index 24b7ddc3..1c7d7bf9 100755
--- a/src/caosadvancedtools/loadFiles.py
+++ b/src/caosadvancedtools/loadFiles.py
@@ -181,7 +181,12 @@ def create_re_for_file_list(files, localroot, remoteroot):
 
 def loadpath(path, include, exclude, prefix, dryrun, forceAllowSymlinks, caosdbignore=None,
              localpath=None):
-    """Make all files in `path` available to the LinkAhead server as FILE entities.
+    """Make all files in `path` available to the LinkAhead server as
+    FILE entities.
+
+    Notes
+    -----
+    Run ``linkahead-loadfiles --help`` for more information and examples.
 
     Parameters
     ----------
@@ -190,9 +195,31 @@ def loadpath(path, include, exclude, prefix, dryrun, forceAllowSymlinks, caosdbi
         available as seen by the linkahead server (i.e., the path from
         within the Docker container in a typical LinkAhead Control
         setup.)
-    include : str
-        
-    
+    include : str or None
+        Regular expression matching the files that will be
+        included. If None, all files are matched. This is ignored if a
+        `caosdbignore` is provided.
+    exclude : str or None
+        Regular expression matching files that are to be included.
+    prefix : str
+        The prefix under which the files are to be inserted into
+        LinkAhead's file system.
+    dryrun : bool
+        Whether a dryrun should be performed.
+    forceAllowSymlinks : bool
+        Whether symlinks in the `path` to be inserted should be
+        processed.
+    caosdbignore : str, optional
+        Path to a caosdbignore file that defines which files shall be
+        included and which do not. The syntax is the same as in a
+        gitignore file. You must also provide the `localpath` option
+        since the check is done locally. If this is given, any
+        `include` is ignored.
+    localpath : str, optional
+        Path of `path` on the local machine. Only needed in the
+        combination with a `caosdbignore` file since it is processed
+        locally.
+
     """
 
     if caosdbignore:
-- 
GitLab


From 6a4dddbd04e320baaf7c83ee6f56e4948707d290 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Wed, 7 Aug 2024 10:01:19 +0200
Subject: [PATCH 004/106] DOC: Add short section on loadFiles to utilities
 documentation

---
 src/doc/utilities.rst | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/doc/utilities.rst b/src/doc/utilities.rst
index 4d520ae2..45874352 100644
--- a/src/doc/utilities.rst
+++ b/src/doc/utilities.rst
@@ -35,3 +35,24 @@ behavior can be changed by initializing the ``TableImporter`` with
 :py:class:`~caosadvancedtools.datainconsistency.DataInconsistencyError` is
 raised when an empty field is encountered in a column with an non-nullable
 integer datatype.
+
+The loadfiles module and executable
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+For making files available to the LinkAhead server as File entities
+(see also the server's `file server
+<https://docs.indiscale.com/caosdb-server/specification/Fileserver.html>`_
+documentation), the LinkAhead Advanced User tools provide the
+:py:mod:`~caosadvancedtools.loadFiles` module and a
+`linkahead-loadfiles` executable. Both operate on a path as seen by
+the LinkAhead server (i.e., a path within the Docker container in the
+typical LinkAhead Control setup) and can be further specified to
+exclude or exclude specific files.
+
+Execute
+
+.. code-block:: sh
+
+   linkahead-loadfiles --help
+
+for more information and examples.
-- 
GitLab


From 4f793ddaa068eaa3de1c8968754e7286e7126d32 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Wed, 7 Aug 2024 10:07:15 +0200
Subject: [PATCH 005/106] DOC: Add example to loadfiles section

---
 src/doc/utilities.rst | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/doc/utilities.rst b/src/doc/utilities.rst
index 45874352..36ed6a04 100644
--- a/src/doc/utilities.rst
+++ b/src/doc/utilities.rst
@@ -47,9 +47,15 @@ documentation), the LinkAhead Advanced User tools provide the
 `linkahead-loadfiles` executable. Both operate on a path as seen by
 the LinkAhead server (i.e., a path within the Docker container in the
 typical LinkAhead Control setup) and can be further specified to
-exclude or exclude specific files.
+exclude or exclude specific files. In the typical setup, where a
+directory is mounted as an extroot into the Docker container by
+LinkAhead control, running
 
-Execute
+.. code-block:: sh
+
+   linkahead-loadfiles /opt/caosdb/mnt/extroot
+
+makes all files available. Execute
 
 .. code-block:: sh
 
-- 
GitLab


From 0a90222806e48e450f7e413b73c7cb3026f3969e Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Wed, 7 Aug 2024 10:10:17 +0200
Subject: [PATCH 006/106] DOC: Changelog

---
 CHANGELOG.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 831ea7fd..787b9df8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Documentation ###
 
+* Added documentation of `caosadvancedtools.loadFiles` module.
+
 ## [0.12.0] - 2024-07-31 ##
 
 ### Added ###
-- 
GitLab


From df895484153d110db0157629947c713028663185 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Wed, 7 Aug 2024 11:12:47 +0200
Subject: [PATCH 007/106] MAINT, DOC: More documentation, type hints and
 linting.

---
 src/caosadvancedtools/loadFiles.py | 50 +++++++++++++++++-------------
 1 file changed, 29 insertions(+), 21 deletions(-)

diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py
index 1c7d7bf9..eb40f5c6 100755
--- a/src/caosadvancedtools/loadFiles.py
+++ b/src/caosadvancedtools/loadFiles.py
@@ -23,6 +23,16 @@
 # ** end header
 #
 
+"""Utilities to make the LinkAhead server aware of files.
+
+Installation of `caosadvancedtools` also creates an executable script ``linkahead-loadfiles`` which
+calls the `loadpath` function.  Get the full help with ``linkahead-loadfiles --help``.  In short,
+that script tells the LinkAhead server to create `FILE` entities for existing files in one branch of
+the directory tree.  It is necessary that this directory is already visible for the server (for
+example because it is defined as ``extroot`` in the LinkAhead profile).
+
+"""
+
 import argparse
 import logging
 import os
@@ -31,30 +41,30 @@ import sys
 import re
 from argparse import ArgumentParser
 from tempfile import NamedTemporaryFile
+from typing import Union
 
-import shutil
 import caosdb as db
 
 logger = logging.getLogger(__name__)
 timeout_fallback = 20
 
 
-def convert_size(size):
-    """Convert `size` from B to a human-readable file size in KB,
+def convert_size(size: int):
+    """Convert `size` from bytes to a human-readable file size in KB,
     MB, ...
 
     """
     if (size == 0):
         return '0B'
     size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
-    i = int(math.floor(math.log(size, 1000)))
-    p = math.pow(1000, i)
+    index = int(math.floor(math.log(size, 1000)))
+    p = math.pow(1000, index)
     s = round(size / p, 2)
 
-    return '%s %s' % (s, size_name[i])
+    return f"{s} {size_name[index]}"
 
 
-def combine_ignore_files(caosdbignore, localignore, dirname=None):
+def combine_ignore_files(caosdbignore: str, localignore: str, dirname=None) -> str:
     """Append the contents of localignore to caosdbignore, save the result,
     and return the name.
 
@@ -86,7 +96,7 @@ def combine_ignore_files(caosdbignore, localignore, dirname=None):
     return tmp.name
 
 
-def compile_file_list(caosdbignore, localpath):
+def compile_file_list(caosdbignore: str, localpath: str) -> list[str]:
     """Create a list of files that contain all files under localpath except
     those excluded by caosdbignore.
 
@@ -109,11 +119,11 @@ def compile_file_list(caosdbignore, localpath):
     matches = parse_gitignore(caosdbignore)
     current_ignore = caosdbignore
     non_ignored_files = []
-    ignore_files = []
+    ignore_files: list[tuple[str, str]] = []
     for root, dirs, files in os.walk(localpath):
         # remove local ignore files that do no longer apply to the current subtree (branch switch)
         while len(ignore_files) > 0 and not root.startswith(ignore_files[-1][0]):
-            shutil.os.remove(ignore_files[-1][1])
+            os.remove(ignore_files[-1][1])
             ignore_files.pop()
 
         # use the global one if there are no more local ones
@@ -143,10 +153,10 @@ def compile_file_list(caosdbignore, localpath):
     return non_ignored_files
 
 
-def create_re_for_file_list(files, localroot, remoteroot):
+def create_re_for_file_list(files: list[str], localroot: str, remoteroot: str) -> str:
     """Create a regular expression that matches file paths contained
-    in the files argument and all parent directories. The prefix
-    localroot is replaced by the prefix remoteroot.
+    in the `files` argument and all parent directories. The prefix
+    `localroot is replaced by the prefix `remoteroot`.
 
     Parameters
     ----------
@@ -179,10 +189,10 @@ def create_re_for_file_list(files, localroot, remoteroot):
     return "^("+regexp[1:]+")$"
 
 
-def loadpath(path, include, exclude, prefix, dryrun, forceAllowSymlinks, caosdbignore=None,
-             localpath=None):
-    """Make all files in `path` available to the LinkAhead server as
-    FILE entities.
+def loadpath(path: str, include: Union[str, None], exclude: Union[str, None], prefix: str,
+             dryrun: bool, forceAllowSymlinks: bool, caosdbignore: Union[str, None] = None,
+             localpath: Union[str, None] = None):
+    """Make all files in `path` available to the LinkAhead server as FILE entities.
 
     Notes
     -----
@@ -216,10 +226,8 @@ def loadpath(path, include, exclude, prefix, dryrun, forceAllowSymlinks, caosdbi
         since the check is done locally. If this is given, any
         `include` is ignored.
     localpath : str, optional
-        Path of `path` on the local machine. Only needed in the
-        combination with a `caosdbignore` file since it is processed
-        locally.
-
+        Path of `path` on the local machine. Only needed in combination with a
+        ``caosdbignore`` file since that is processed locally.
     """
 
     if caosdbignore:
-- 
GitLab


From 985570895040d6638b5d540a105fa2aa51cb7b7f Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Wed, 7 Aug 2024 11:13:19 +0200
Subject: [PATCH 008/106] DOC: Fixed unrelated documentation mistake.

---
 src/doc/table-json-conversion/specs.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/doc/table-json-conversion/specs.rst b/src/doc/table-json-conversion/specs.rst
index c98eddc1..62c75a70 100644
--- a/src/doc/table-json-conversion/specs.rst
+++ b/src/doc/table-json-conversion/specs.rst
@@ -181,7 +181,7 @@ a. Properties with primitive data types
            "date": "2023-06-15",
            "url": "www.indiscale.com/next",
            "duration": 2.5,
-           "participants": None,
+           "participants": null,
            "remote": true
          }
        ]
-- 
GitLab


From c8e5998a0c6136f6ade08ac9beca60ce7b5c0583 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Wed, 7 Aug 2024 11:15:52 +0200
Subject: [PATCH 009/106] DOC: Minor formatting.

---
 src/doc/utilities.rst | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/doc/utilities.rst b/src/doc/utilities.rst
index 36ed6a04..f80460f3 100644
--- a/src/doc/utilities.rst
+++ b/src/doc/utilities.rst
@@ -44,11 +44,11 @@ For making files available to the LinkAhead server as File entities
 <https://docs.indiscale.com/caosdb-server/specification/Fileserver.html>`_
 documentation), the LinkAhead Advanced User tools provide the
 :py:mod:`~caosadvancedtools.loadFiles` module and a
-`linkahead-loadfiles` executable. Both operate on a path as seen by
+``linkahead-loadfiles`` executable. Both operate on a path as seen by
 the LinkAhead server (i.e., a path within the Docker container in the
 typical LinkAhead Control setup) and can be further specified to
 exclude or exclude specific files. In the typical setup, where a
-directory is mounted as an extroot into the Docker container by
+directory is mounted as an *extroot* into the Docker container by
 LinkAhead control, running
 
 .. code-block:: sh
-- 
GitLab


From 4724682618393afbe682f2c39eeaff0f109872c1 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Wed, 7 Aug 2024 11:18:19 +0200
Subject: [PATCH 010/106] MAINT: from __future__ import annotations

---
 src/caosadvancedtools/loadFiles.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py
index eb40f5c6..cedef367 100755
--- a/src/caosadvancedtools/loadFiles.py
+++ b/src/caosadvancedtools/loadFiles.py
@@ -33,6 +33,8 @@ example because it is defined as ``extroot`` in the LinkAhead profile).
 
 """
 
+from __future__ import annotations
+
 import argparse
 import logging
 import os
-- 
GitLab


From 63bdb534a7e4aebc3ef8e044d168a23ebe8e8667 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 13 Aug 2024 14:37:23 +0200
Subject: [PATCH 011/106] MAINT: Removed Bloxberg code snippets.

The relevant code is in git@gitlab.indiscale.com:caosdb/src/archived/bloxberg.git
---
 CHANGELOG.md                                  |   2 +
 src/caosadvancedtools/bloxberg/__init__.py    |   4 -
 src/caosadvancedtools/bloxberg/bloxberg.py    | 197 ------
 .../bloxberg/swagger_client/__init__.py       |  35 -
 .../bloxberg/swagger_client/api/__init__.py   |   7 -
 .../swagger_client/api/certificate_api.py     | 132 ----
 .../bloxberg/swagger_client/api/pdf_api.py    | 132 ----
 .../bloxberg/swagger_client/api_client.py     | 628 ------------------
 .../bloxberg/swagger_client/configuration.py  | 244 -------
 .../swagger_client/models/__init__.py         |  21 -
 .../bloxberg/swagger_client/models/batch.py   | 228 -------
 ...ert_tools_generate_pdf_json_certificate.py | 380 -----------
 ...e_unsigned_certificate_json_certificate.py | 380 -----------
 .../models/http_validation_error.py           | 111 ----
 .../swagger_client/models/validation_error.py | 166 -----
 .../bloxberg/swagger_client/rest.py           | 322 ---------
 src/doc/conf.py                               |   1 -
 17 files changed, 2 insertions(+), 2988 deletions(-)
 delete mode 100644 src/caosadvancedtools/bloxberg/__init__.py
 delete mode 100644 src/caosadvancedtools/bloxberg/bloxberg.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/__init__.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/api/__init__.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/api/certificate_api.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/api/pdf_api.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/api_client.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/configuration.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/models/__init__.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/models/batch.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/models/controller_cert_tools_generate_pdf_json_certificate.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/models/controller_cert_tools_generate_unsigned_certificate_json_certificate.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/models/http_validation_error.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/models/validation_error.py
 delete mode 100644 src/caosadvancedtools/bloxberg/swagger_client/rest.py

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 787b9df8..62794e6e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Removed ###
 
+- Bloxberg code snippets. These were just a proof of concept, untested and never used in production.
+
 ### Fixed ###
 
 ### Security ###
diff --git a/src/caosadvancedtools/bloxberg/__init__.py b/src/caosadvancedtools/bloxberg/__init__.py
deleted file mode 100644
index 5ca50276..00000000
--- a/src/caosadvancedtools/bloxberg/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-"""Integration with the Bloxberg proof-of-existence blockchain.
-"""
-
-print("Warning: The Bloxberg module is still experimental and under active development.")
diff --git a/src/caosadvancedtools/bloxberg/bloxberg.py b/src/caosadvancedtools/bloxberg/bloxberg.py
deleted file mode 100644
index 6aa2eaab..00000000
--- a/src/caosadvancedtools/bloxberg/bloxberg.py
+++ /dev/null
@@ -1,197 +0,0 @@
-# This file is a part of the CaosDB Project.
-#
-# Copyright (C) 2021 IndiScale GmbH <info@indiscale.com>
-# Copyright (C) 2021 Daniel Hornung <d.hornung@indiscale.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
-"""Interaction with the Bloxberg blockchain.
-"""
-
-
-import hashlib
-import json
-import secrets
-
-import caosdb as db
-
-from ..models.parser import parse_model_from_string
-from . import swagger_client
-
-
-__model_yaml = """
-BloxbergCertificate:
-  obligatory_properties:
-    pepper:
-      datatype: TEXT
-    hash:
-      datatype: TEXT
-    proofValue:
-      datatype: TEXT
-    certificateJSON:
-      datatype: TEXT
-  recommended_properties:
-    certified:
-      datatype: REFERENCE
-"""
-__model = parse_model_from_string(__model_yaml)
-
-
-class Bloxberg:
-    """A Bloxberg instance can be used to obtain or verify certificates."""
-
-    def __init__(self, connection=None):
-        """A Bloxberg instance can be used to obtain or verify certificates.
-
-Parameters
-----------
-connection : dict
-A dict with the following keys:
-  - url : The bloxberg URL. Default is "https://qa.certify.bloxberg.org"
-        """
-        self._create_conf(connection)
-        self._api_client = swagger_client.ApiClient(configuration=self._conf)
-        self._api = swagger_client.CertificateApi(self._api_client)
-
-    def _create_conf(self, connection=None):
-        """Generate a Swagger configuration object."""
-        self._conf = swagger_client.Configuration()
-        if connection:
-            if "URL" in connection:
-                self._conf.host = connection["URL"]
-
-    def certify(self, entity):
-        """Attempt to certify the given `entity` and return a certificate Record.
-
-Parameters
-----------
-entity : caosdb.Entity
-The entity to be certified
-
-Returns
--------
-out : caosdb.Record
-A BloxbergCertificate Record with all the necessary Properties.
-"""
-        # Calculate hash
-        pepper = str(secrets.randbits(1024))
-        entity.retrieve()
-        hasher = hashlib.sha256()
-        hasher.update(pepper.encode(encoding="utf8"))
-        hasher.update(str(entity).encode(encoding="utf8"))
-        entity_hash = "0x" + hasher.hexdigest()
-        print(entity_hash)
-        pubkey = "0x9858eC18a269EE69ebfD7C38eb297996827DDa98"  # TODO The key of the API server?
-        # Create body
-        body = swagger_client.Batch(public_key=pubkey, crid=[entity_hash], crid_type="sha2-256",
-                                    enable_ipfs=False)
-        # Submit hash & obtain response
-        result = self._api.create_bloxberg_certificate_create_bloxberg_certificate_post(body=body)
-        attribute_map = result[0].attribute_map
-        cert = result[0].to_dict()
-        for old, new in attribute_map.items():
-            if old == new:
-                continue
-            cert[new] = cert.pop(old)
-        json_s = json.dumps(cert)
-        # Generate result Record
-        cert_rec = db.Record().add_parent("BloxbergCertificate")
-        # Extract information and put into result
-        cert_rec.add_property(property="certified", value=entity)
-        cert_rec.add_property(property="pepper", value=pepper)
-        cert_rec.add_property(property="hash", value=entity_hash)
-        cert_rec.add_property(property="proofvalue", value=cert["proof"]["proofValue"])
-        cert_rec.add_property(property="certificateJSON", value=json_s)
-        # Return result
-        return cert_rec
-
-    def verify(self, certificate):
-        """Attempt to verify the certificate.
-
-A certificate passes verification if the Bloxberg instance says it is good.  Typical use cases may
-also include the `validate` step to make sure that the certificate's original data exists and
-contains what it claimed to contain when the certificate was created.
-
-This method does nothing if the verification passes, else it raises an exception.
-
-Parameters
-----------
-certificate : caosdb.Record
-The BloxbergCertificate Record which shall be verified.
-
-        """
-        raise NotImplementedError("Bloxberg first needs to implement a verification API method.")
-
-    @staticmethod
-    def json_from_certificate(certificate, filename=None):
-        """Generate a qa.certify.bloxberg.org JSON string, optionally writing it to a file.
-
-Parameters
-----------
-certificate : caosdb.Record
-The BloxbergCertificate Record for which the JSON is generated.
-
-filename : str
-Write the JSON to this file.
-"""
-        content = {}
-        print(certificate, filename)
-
-        return content
-
-
-def ensure_data_model(force=False):
-    """Make sure that the data model fits our needs.
-
-    Most importantly, this means that a suitable RecordType "BoxbergCertificate" must exist.
-    """
-    __model.sync_data_model(noquestion=force)
-
-
-def certify_entity(entity, json_filename=None):
-    """Certify the given entity and store the result in the CaosDB.
-
-Parameters
-----------
-entity : caosdb.Entity
-  The Entity to be certified.
-
-json_filename : str
-  If given, store the JSON here.
-"""
-    if isinstance(entity, int):
-        entity = db.Entity(id=entity)
-
-    blx = Bloxberg()
-    print("Obtaining certificate...")
-    certificate = blx.certify(entity)
-    print("Certificate was successfully obtained.")
-    certificate.insert()
-    print("Certificate was stored in CaosDB.")
-
-    if json_filename:
-        with open(json_filename, "w") as json_file:
-            json_file.write(certificate.get_property("certificateJSON").value)
-
-
-def demo_run():
-    """Run the core functions for demonstration purposes."""
-    print("Making sure that the remote data model is up to date.")
-    ensure_data_model()
-    print("Data model is up to date.")
-    CertRT = db.RecordType(name="BloxbergCertificate").retrieve()
-    print("Certifying the `BloxbergCertificate` RecordType...")
-    json_filename = "/tmp/cert.json"
-    certify_entity(CertRT, json_filename=json_filename)
-    print("Certificate json file can be found here: {}".format(json_filename))
-    print("You can verify the certificate here: https://certify.bloxberg.org/verify")
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/__init__.py b/src/caosadvancedtools/bloxberg/swagger_client/__init__.py
deleted file mode 100644
index 255d6d31..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/__init__.py
+++ /dev/null
@@ -1,35 +0,0 @@
-# coding: utf-8
-
-# flake8: noqa
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-from __future__ import absolute_import
-from swagger_client.models.validation_error import ValidationError
-from swagger_client.models.http_validation_error import HTTPValidationError
-from swagger_client.models.controller_cert_tools_generate_unsigned_certificate_json_certificate import ControllerCertToolsGenerateUnsignedCertificateJsonCertificate
-from swagger_client.models.controller_cert_tools_generate_pdf_json_certificate import ControllerCertToolsGeneratePdfJsonCertificate
-from swagger_client.models.batch import Batch
-from swagger_client.configuration import Configuration
-from swagger_client.api_client import ApiClient
-from swagger_client.api.pdf_api import PdfApi
-from swagger_client.api.certificate_api import CertificateApi
-
-# Fake the installation
-import sys
-import pathlib
-__this_dir = str(pathlib.Path(__file__).parent.parent)
-if __this_dir not in sys.path:
-    sys.path.append(__this_dir)
-
-# import apis into sdk package
-# import ApiClient
-# import models into sdk package
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/api/__init__.py b/src/caosadvancedtools/bloxberg/swagger_client/api/__init__.py
deleted file mode 100644
index d33c26ea..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/api/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-from __future__ import absolute_import
-
-# flake8: noqa
-
-# import apis into api package
-from swagger_client.api.certificate_api import CertificateApi
-from swagger_client.api.pdf_api import PdfApi
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/api/certificate_api.py b/src/caosadvancedtools/bloxberg/swagger_client/api/certificate_api.py
deleted file mode 100644
index 0f0f1c6a..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/api/certificate_api.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-from __future__ import absolute_import
-
-import re  # noqa: F401
-
-# python 2 and python 3 compatibility library
-import six
-
-from swagger_client.api_client import ApiClient
-
-
-class CertificateApi(object):
-    """NOTE: This class is auto generated by the swagger code generator program.
-
-    Do not edit the class manually.
-    Ref: https://github.com/swagger-api/swagger-codegen
-    """
-
-    def __init__(self, api_client=None):
-        if api_client is None:
-            api_client = ApiClient()
-        self.api_client = api_client
-
-    def create_bloxberg_certificate_create_bloxberg_certificate_post(self, body, **kwargs):  # noqa: E501
-        """Createbloxbergcertificate  # noqa: E501
-
-        Creates, transacts, and signs a research object certificate on the bloxberg blockchain. Hashes must be generated client side for each desired file and provided in an array. Each hash corresponds to one research object certificate returned in a JSON object array.  # noqa: E501
-        This method makes a synchronous HTTP request by default. To make an
-        asynchronous HTTP request, please pass async_req=True
-        >>> thread = api.create_bloxberg_certificate_create_bloxberg_certificate_post(body, async_req=True)
-        >>> result = thread.get()
-
-        :param async_req bool
-        :param Batch body: (required)
-        :return: list[ControllerCertToolsGenerateUnsignedCertificateJsonCertificate]
-                 If the method is called asynchronously,
-                 returns the request thread.
-        """
-        kwargs['_return_http_data_only'] = True
-        if kwargs.get('async_req'):
-            return self.create_bloxberg_certificate_create_bloxberg_certificate_post_with_http_info(body, **kwargs)  # noqa: E501
-        else:
-            (data) = self.create_bloxberg_certificate_create_bloxberg_certificate_post_with_http_info(body, **kwargs)  # noqa: E501
-            return data
-
-    def create_bloxberg_certificate_create_bloxberg_certificate_post_with_http_info(self, body, **kwargs):  # noqa: E501
-        """Createbloxbergcertificate  # noqa: E501
-
-        Creates, transacts, and signs a research object certificate on the bloxberg blockchain. Hashes must be generated client side for each desired file and provided in an array. Each hash corresponds to one research object certificate returned in a JSON object array.  # noqa: E501
-        This method makes a synchronous HTTP request by default. To make an
-        asynchronous HTTP request, please pass async_req=True
-        >>> thread = api.create_bloxberg_certificate_create_bloxberg_certificate_post_with_http_info(body, async_req=True)
-        >>> result = thread.get()
-
-        :param async_req bool
-        :param Batch body: (required)
-        :return: list[ControllerCertToolsGenerateUnsignedCertificateJsonCertificate]
-                 If the method is called asynchronously,
-                 returns the request thread.
-        """
-
-        all_params = ['body']  # noqa: E501
-        all_params.append('async_req')
-        all_params.append('_return_http_data_only')
-        all_params.append('_preload_content')
-        all_params.append('_request_timeout')
-
-        params = locals()
-        for key, val in six.iteritems(params['kwargs']):
-            if key not in all_params:
-                raise TypeError(
-                    "Got an unexpected keyword argument '%s'"
-                    " to method create_bloxberg_certificate_create_bloxberg_certificate_post" % key
-                )
-            params[key] = val
-        del params['kwargs']
-        # verify the required parameter 'body' is set
-        if ('body' not in params or
-                params['body'] is None):
-            raise ValueError("Missing the required parameter `body` when calling `create_bloxberg_certificate_create_bloxberg_certificate_post`")  # noqa: E501
-
-        collection_formats = {}
-
-        path_params = {}
-
-        query_params = []
-
-        header_params = {}
-
-        form_params = []
-        local_var_files = {}
-
-        body_params = None
-        if 'body' in params:
-            body_params = params['body']
-        # HTTP header `Accept`
-        header_params['Accept'] = self.api_client.select_header_accept(
-            ['application/json'])  # noqa: E501
-
-        # HTTP header `Content-Type`
-        header_params['Content-Type'] = self.api_client.select_header_content_type(  # noqa: E501
-            ['application/json'])  # noqa: E501
-
-        # Authentication setting
-        auth_settings = []  # noqa: E501
-
-        return self.api_client.call_api(
-            '/createBloxbergCertificate', 'POST',
-            path_params,
-            query_params,
-            header_params,
-            body=body_params,
-            post_params=form_params,
-            files=local_var_files,
-            response_type='list[ControllerCertToolsGenerateUnsignedCertificateJsonCertificate]',  # noqa: E501
-            auth_settings=auth_settings,
-            async_req=params.get('async_req'),
-            _return_http_data_only=params.get('_return_http_data_only'),
-            _preload_content=params.get('_preload_content', True),
-            _request_timeout=params.get('_request_timeout'),
-            collection_formats=collection_formats)
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/api/pdf_api.py b/src/caosadvancedtools/bloxberg/swagger_client/api/pdf_api.py
deleted file mode 100644
index a5a279de..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/api/pdf_api.py
+++ /dev/null
@@ -1,132 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-from __future__ import absolute_import
-
-import re  # noqa: F401
-
-# python 2 and python 3 compatibility library
-import six
-
-from swagger_client.api_client import ApiClient
-
-
-class PdfApi(object):
-    """NOTE: This class is auto generated by the swagger code generator program.
-
-    Do not edit the class manually.
-    Ref: https://github.com/swagger-api/swagger-codegen
-    """
-
-    def __init__(self, api_client=None):
-        if api_client is None:
-            api_client = ApiClient()
-        self.api_client = api_client
-
-    def generate_pdf_generate_pdf_post(self, body, **kwargs):  # noqa: E501
-        """Generatepdf  # noqa: E501
-
-        Accepts as input the response from the createBloxbergCertificate endpoint, for example a research object JSON array. Returns as response a zip archive with PDF files that correspond to the number of cryptographic identifiers provided. PDF files are embedded with the Research Object Certification which is used for verification.  # noqa: E501
-        This method makes a synchronous HTTP request by default. To make an
-        asynchronous HTTP request, please pass async_req=True
-        >>> thread = api.generate_pdf_generate_pdf_post(body, async_req=True)
-        >>> result = thread.get()
-
-        :param async_req bool
-        :param list[ControllerCertToolsGeneratePdfJsonCertificate] body: (required)
-        :return: Object
-                 If the method is called asynchronously,
-                 returns the request thread.
-        """
-        kwargs['_return_http_data_only'] = True
-        if kwargs.get('async_req'):
-            return self.generate_pdf_generate_pdf_post_with_http_info(body, **kwargs)  # noqa: E501
-        else:
-            (data) = self.generate_pdf_generate_pdf_post_with_http_info(body, **kwargs)  # noqa: E501
-            return data
-
-    def generate_pdf_generate_pdf_post_with_http_info(self, body, **kwargs):  # noqa: E501
-        """Generatepdf  # noqa: E501
-
-        Accepts as input the response from the createBloxbergCertificate endpoint, for example a research object JSON array. Returns as response a zip archive with PDF files that correspond to the number of cryptographic identifiers provided. PDF files are embedded with the Research Object Certification which is used for verification.  # noqa: E501
-        This method makes a synchronous HTTP request by default. To make an
-        asynchronous HTTP request, please pass async_req=True
-        >>> thread = api.generate_pdf_generate_pdf_post_with_http_info(body, async_req=True)
-        >>> result = thread.get()
-
-        :param async_req bool
-        :param list[ControllerCertToolsGeneratePdfJsonCertificate] body: (required)
-        :return: Object
-                 If the method is called asynchronously,
-                 returns the request thread.
-        """
-
-        all_params = ['body']  # noqa: E501
-        all_params.append('async_req')
-        all_params.append('_return_http_data_only')
-        all_params.append('_preload_content')
-        all_params.append('_request_timeout')
-
-        params = locals()
-        for key, val in six.iteritems(params['kwargs']):
-            if key not in all_params:
-                raise TypeError(
-                    "Got an unexpected keyword argument '%s'"
-                    " to method generate_pdf_generate_pdf_post" % key
-                )
-            params[key] = val
-        del params['kwargs']
-        # verify the required parameter 'body' is set
-        if ('body' not in params or
-                params['body'] is None):
-            raise ValueError("Missing the required parameter `body` when calling `generate_pdf_generate_pdf_post`")  # noqa: E501
-
-        collection_formats = {}
-
-        path_params = {}
-
-        query_params = []
-
-        header_params = {}
-
-        form_params = []
-        local_var_files = {}
-
-        body_params = None
-        if 'body' in params:
-            body_params = params['body']
-        # HTTP header `Accept`
-        header_params['Accept'] = self.api_client.select_header_accept(
-            ['application/json'])  # noqa: E501
-
-        # HTTP header `Content-Type`
-        header_params['Content-Type'] = self.api_client.select_header_content_type(  # noqa: E501
-            ['application/json'])  # noqa: E501
-
-        # Authentication setting
-        auth_settings = []  # noqa: E501
-
-        return self.api_client.call_api(
-            '/generatePDF', 'POST',
-            path_params,
-            query_params,
-            header_params,
-            body=body_params,
-            post_params=form_params,
-            files=local_var_files,
-            response_type='Object',  # noqa: E501
-            auth_settings=auth_settings,
-            async_req=params.get('async_req'),
-            _return_http_data_only=params.get('_return_http_data_only'),
-            _preload_content=params.get('_preload_content', True),
-            _request_timeout=params.get('_request_timeout'),
-            collection_formats=collection_formats)
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/api_client.py b/src/caosadvancedtools/bloxberg/swagger_client/api_client.py
deleted file mode 100644
index 7337ca33..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/api_client.py
+++ /dev/null
@@ -1,628 +0,0 @@
-# coding: utf-8
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-from __future__ import absolute_import
-
-import datetime
-import json
-import mimetypes
-from multiprocessing.pool import ThreadPool
-import os
-import re
-import tempfile
-
-# python 2 and python 3 compatibility library
-import six
-from six.moves.urllib.parse import quote
-
-from swagger_client.configuration import Configuration
-import swagger_client.models
-from swagger_client import rest
-
-
-class ApiClient(object):
-    """Generic API client for Swagger client library builds.
-
-    Swagger generic API client. This client handles the client-
-    server communication, and is invariant across implementations. Specifics of
-    the methods and models for each application are generated from the Swagger
-    templates.
-
-    NOTE: This class is auto generated by the swagger code generator program.
-    Ref: https://github.com/swagger-api/swagger-codegen
-    Do not edit the class manually.
-
-    :param configuration: .Configuration object for this client
-    :param header_name: a header to pass when making calls to the API.
-    :param header_value: a header value to pass when making calls to
-        the API.
-    :param cookie: a cookie to include in the header when making calls
-        to the API
-    """
-
-    PRIMITIVE_TYPES = (float, bool, bytes, six.text_type) + six.integer_types
-    NATIVE_TYPES_MAPPING = {
-        'int': int,
-        'long': int if six.PY3 else long,  # noqa: F821
-        'float': float,
-        'str': str,
-        'bool': bool,
-        'date': datetime.date,
-        'datetime': datetime.datetime,
-        'object': object,
-    }
-
-    def __init__(self, configuration=None, header_name=None, header_value=None,
-                 cookie=None):
-        if configuration is None:
-            configuration = Configuration()
-        self.configuration = configuration
-
-        self.pool = ThreadPool()
-        self.rest_client = rest.RESTClientObject(configuration)
-        self.default_headers = {}
-        if header_name is not None:
-            self.default_headers[header_name] = header_value
-        self.cookie = cookie
-        # Set default User-Agent.
-        self.user_agent = 'Swagger-Codegen/1.0.0/python'
-
-    def __del__(self):
-        self.pool.close()
-        self.pool.join()
-
-    @property
-    def user_agent(self):
-        """User agent for this API client"""
-        return self.default_headers['User-Agent']
-
-    @user_agent.setter
-    def user_agent(self, value):
-        self.default_headers['User-Agent'] = value
-
-    def set_default_header(self, header_name, header_value):
-        self.default_headers[header_name] = header_value
-
-    def __call_api(
-            self, resource_path, method, path_params=None,
-            query_params=None, header_params=None, body=None, post_params=None,
-            files=None, response_type=None, auth_settings=None,
-            _return_http_data_only=None, collection_formats=None,
-            _preload_content=True, _request_timeout=None):
-
-        config = self.configuration
-
-        # header parameters
-        header_params = header_params or {}
-        header_params.update(self.default_headers)
-        if self.cookie:
-            header_params['Cookie'] = self.cookie
-        if header_params:
-            header_params = self.sanitize_for_serialization(header_params)
-            header_params = dict(self.parameters_to_tuples(header_params,
-                                                           collection_formats))
-
-        # path parameters
-        if path_params:
-            path_params = self.sanitize_for_serialization(path_params)
-            path_params = self.parameters_to_tuples(path_params,
-                                                    collection_formats)
-            for k, v in path_params:
-                # specified safe chars, encode everything
-                resource_path = resource_path.replace(
-                    '{%s}' % k,
-                    quote(str(v), safe=config.safe_chars_for_path_param)
-                )
-
-        # query parameters
-        if query_params:
-            query_params = self.sanitize_for_serialization(query_params)
-            query_params = self.parameters_to_tuples(query_params,
-                                                     collection_formats)
-
-        # post parameters
-        if post_params or files:
-            post_params = self.prepare_post_parameters(post_params, files)
-            post_params = self.sanitize_for_serialization(post_params)
-            post_params = self.parameters_to_tuples(post_params,
-                                                    collection_formats)
-
-        # auth setting
-        self.update_params_for_auth(header_params, query_params, auth_settings)
-
-        # body
-        if body:
-            body = self.sanitize_for_serialization(body)
-
-        # request url
-        url = self.configuration.host + resource_path
-
-        # perform request and return response
-        response_data = self.request(
-            method, url, query_params=query_params, headers=header_params,
-            post_params=post_params, body=body,
-            _preload_content=_preload_content,
-            _request_timeout=_request_timeout)
-
-        self.last_response = response_data
-
-        return_data = response_data
-        if _preload_content:
-            # deserialize response data
-            if response_type:
-                return_data = self.deserialize(response_data, response_type)
-            else:
-                return_data = None
-
-        if _return_http_data_only:
-            return (return_data)
-        else:
-            return (return_data, response_data.status,
-                    response_data.getheaders())
-
-    def sanitize_for_serialization(self, obj):
-        """Builds a JSON POST object.
-
-        If obj is None, return None.
-        If obj is str, int, long, float, bool, return directly.
-        If obj is datetime.datetime, datetime.date
-            convert to string in iso8601 format.
-        If obj is list, sanitize each element in the list.
-        If obj is dict, return the dict.
-        If obj is swagger model, return the properties dict.
-
-        :param obj: The data to serialize.
-        :return: The serialized form of data.
-        """
-        if obj is None:
-            return None
-        elif isinstance(obj, self.PRIMITIVE_TYPES):
-            return obj
-        elif isinstance(obj, list):
-            return [self.sanitize_for_serialization(sub_obj)
-                    for sub_obj in obj]
-        elif isinstance(obj, tuple):
-            return tuple(self.sanitize_for_serialization(sub_obj)
-                         for sub_obj in obj)
-        elif isinstance(obj, (datetime.datetime, datetime.date)):
-            return obj.isoformat()
-
-        if isinstance(obj, dict):
-            obj_dict = obj
-        else:
-            # Convert model obj to dict except
-            # attributes `swagger_types`, `attribute_map`
-            # and attributes which value is not None.
-            # Convert attribute name to json key in
-            # model definition for request.
-            obj_dict = {obj.attribute_map[attr]: getattr(obj, attr)
-                        for attr, _ in six.iteritems(obj.swagger_types)
-                        if getattr(obj, attr) is not None}
-
-        return {key: self.sanitize_for_serialization(val)
-                for key, val in six.iteritems(obj_dict)}
-
-    def deserialize(self, response, response_type):
-        """Deserializes response into an object.
-
-        :param response: RESTResponse object to be deserialized.
-        :param response_type: class literal for
-            deserialized object, or string of class name.
-
-        :return: deserialized object.
-        """
-        # handle file downloading
-        # save response body into a tmp file and return the instance
-        if response_type == "file":
-            return self.__deserialize_file(response)
-
-        # fetch data from response object
-        try:
-            data = json.loads(response.data)
-        except ValueError:
-            data = response.data
-
-        return self.__deserialize(data, response_type)
-
-    def __deserialize(self, data, klass):
-        """Deserializes dict, list, str into an object.
-
-        :param data: dict, list or str.
-        :param klass: class literal, or string of class name.
-
-        :return: object.
-        """
-        if data is None:
-            return None
-
-        if type(klass) == str:
-            if klass.startswith('list['):
-                sub_kls = re.match(r'list\[(.*)\]', klass).group(1)
-                return [self.__deserialize(sub_data, sub_kls)
-                        for sub_data in data]
-
-            if klass.startswith('dict('):
-                sub_kls = re.match(r'dict\(([^,]*), (.*)\)', klass).group(2)
-                return {k: self.__deserialize(v, sub_kls)
-                        for k, v in six.iteritems(data)}
-
-            # convert str to class
-            if klass in self.NATIVE_TYPES_MAPPING:
-                klass = self.NATIVE_TYPES_MAPPING[klass]
-            else:
-                klass = getattr(swagger_client.models, klass)
-
-        if klass in self.PRIMITIVE_TYPES:
-            return self.__deserialize_primitive(data, klass)
-        elif klass == object:
-            return self.__deserialize_object(data)
-        elif klass == datetime.date:
-            return self.__deserialize_date(data)
-        elif klass == datetime.datetime:
-            return self.__deserialize_datatime(data)
-        else:
-            return self.__deserialize_model(data, klass)
-
-    def call_api(self, resource_path, method,
-                 path_params=None, query_params=None, header_params=None,
-                 body=None, post_params=None, files=None,
-                 response_type=None, auth_settings=None, async_req=None,
-                 _return_http_data_only=None, collection_formats=None,
-                 _preload_content=True, _request_timeout=None):
-        """Makes the HTTP request (synchronous) and returns deserialized data.
-
-        To make an async request, set the async_req parameter.
-
-        :param resource_path: Path to method endpoint.
-        :param method: Method to call.
-        :param path_params: Path parameters in the url.
-        :param query_params: Query parameters in the url.
-        :param header_params: Header parameters to be
-            placed in the request header.
-        :param body: Request body.
-        :param post_params dict: Request post form parameters,
-            for `application/x-www-form-urlencoded`, `multipart/form-data`.
-        :param auth_settings list: Auth Settings names for the request.
-        :param response: Response data type.
-        :param files dict: key -> filename, value -> filepath,
-            for `multipart/form-data`.
-        :param async_req bool: execute request asynchronously
-        :param _return_http_data_only: response data without head status code
-                                       and headers
-        :param collection_formats: dict of collection formats for path, query,
-            header, and post parameters.
-        :param _preload_content: if False, the urllib3.HTTPResponse object will
-                                 be returned without reading/decoding response
-                                 data. Default is True.
-        :param _request_timeout: timeout setting for this request. If one
-                                 number provided, it will be total request
-                                 timeout. It can also be a pair (tuple) of
-                                 (connection, read) timeouts.
-        :return:
-            If async_req parameter is True,
-            the request will be called asynchronously.
-            The method will return the request thread.
-            If parameter async_req is False or missing,
-            then the method will return the response directly.
-        """
-        if not async_req:
-            return self.__call_api(resource_path, method,
-                                   path_params, query_params, header_params,
-                                   body, post_params, files,
-                                   response_type, auth_settings,
-                                   _return_http_data_only, collection_formats,
-                                   _preload_content, _request_timeout)
-        else:
-            thread = self.pool.apply_async(self.__call_api, (resource_path,
-                                           method, path_params, query_params,
-                                           header_params, body,
-                                           post_params, files,
-                                           response_type, auth_settings,
-                                           _return_http_data_only,
-                                           collection_formats,
-                                           _preload_content, _request_timeout))
-        return thread
-
-    def request(self, method, url, query_params=None, headers=None,
-                post_params=None, body=None, _preload_content=True,
-                _request_timeout=None):
-        """Makes the HTTP request using RESTClient."""
-        if method == "GET":
-            return self.rest_client.GET(url,
-                                        query_params=query_params,
-                                        _preload_content=_preload_content,
-                                        _request_timeout=_request_timeout,
-                                        headers=headers)
-        elif method == "HEAD":
-            return self.rest_client.HEAD(url,
-                                         query_params=query_params,
-                                         _preload_content=_preload_content,
-                                         _request_timeout=_request_timeout,
-                                         headers=headers)
-        elif method == "OPTIONS":
-            return self.rest_client.OPTIONS(url,
-                                            query_params=query_params,
-                                            headers=headers,
-                                            post_params=post_params,
-                                            _preload_content=_preload_content,
-                                            _request_timeout=_request_timeout,
-                                            body=body)
-        elif method == "POST":
-            return self.rest_client.POST(url,
-                                         query_params=query_params,
-                                         headers=headers,
-                                         post_params=post_params,
-                                         _preload_content=_preload_content,
-                                         _request_timeout=_request_timeout,
-                                         body=body)
-        elif method == "PUT":
-            return self.rest_client.PUT(url,
-                                        query_params=query_params,
-                                        headers=headers,
-                                        post_params=post_params,
-                                        _preload_content=_preload_content,
-                                        _request_timeout=_request_timeout,
-                                        body=body)
-        elif method == "PATCH":
-            return self.rest_client.PATCH(url,
-                                          query_params=query_params,
-                                          headers=headers,
-                                          post_params=post_params,
-                                          _preload_content=_preload_content,
-                                          _request_timeout=_request_timeout,
-                                          body=body)
-        elif method == "DELETE":
-            return self.rest_client.DELETE(url,
-                                           query_params=query_params,
-                                           headers=headers,
-                                           _preload_content=_preload_content,
-                                           _request_timeout=_request_timeout,
-                                           body=body)
-        else:
-            raise ValueError(
-                "http method must be `GET`, `HEAD`, `OPTIONS`,"
-                " `POST`, `PATCH`, `PUT` or `DELETE`."
-            )
-
-    def parameters_to_tuples(self, params, collection_formats):
-        """Get parameters as list of tuples, formatting collections.
-
-        :param params: Parameters as dict or list of two-tuples
-        :param dict collection_formats: Parameter collection formats
-        :return: Parameters as list of tuples, collections formatted
-        """
-        new_params = []
-        if collection_formats is None:
-            collection_formats = {}
-        for k, v in six.iteritems(params) if isinstance(params, dict) else params:  # noqa: E501
-            if k in collection_formats:
-                collection_format = collection_formats[k]
-                if collection_format == 'multi':
-                    new_params.extend((k, value) for value in v)
-                else:
-                    if collection_format == 'ssv':
-                        delimiter = ' '
-                    elif collection_format == 'tsv':
-                        delimiter = '\t'
-                    elif collection_format == 'pipes':
-                        delimiter = '|'
-                    else:  # csv is the default
-                        delimiter = ','
-                    new_params.append(
-                        (k, delimiter.join(str(value) for value in v)))
-            else:
-                new_params.append((k, v))
-        return new_params
-
-    def prepare_post_parameters(self, post_params=None, files=None):
-        """Builds form parameters.
-
-        :param post_params: Normal form parameters.
-        :param files: File parameters.
-        :return: Form parameters with files.
-        """
-        params = []
-
-        if post_params:
-            params = post_params
-
-        if files:
-            for k, v in six.iteritems(files):
-                if not v:
-                    continue
-                file_names = v if type(v) is list else [v]
-                for n in file_names:
-                    with open(n, 'rb') as f:
-                        filename = os.path.basename(f.name)
-                        filedata = f.read()
-                        mimetype = (mimetypes.guess_type(filename)[0] or
-                                    'application/octet-stream')
-                        params.append(
-                            tuple([k, tuple([filename, filedata, mimetype])]))
-
-        return params
-
-    def select_header_accept(self, accepts):
-        """Returns `Accept` based on an array of accepts provided.
-
-        :param accepts: List of headers.
-        :return: Accept (e.g. application/json).
-        """
-        if not accepts:
-            return
-
-        accepts = [x.lower() for x in accepts]
-
-        if 'application/json' in accepts:
-            return 'application/json'
-        else:
-            return ', '.join(accepts)
-
-    def select_header_content_type(self, content_types):
-        """Returns `Content-Type` based on an array of content_types provided.
-
-        :param content_types: List of content-types.
-        :return: Content-Type (e.g. application/json).
-        """
-        if not content_types:
-            return 'application/json'
-
-        content_types = [x.lower() for x in content_types]
-
-        if 'application/json' in content_types or '*/*' in content_types:
-            return 'application/json'
-        else:
-            return content_types[0]
-
-    def update_params_for_auth(self, headers, querys, auth_settings):
-        """Updates header and query params based on authentication setting.
-
-        :param headers: Header parameters dict to be updated.
-        :param querys: Query parameters tuple list to be updated.
-        :param auth_settings: Authentication setting identifiers list.
-        """
-        if not auth_settings:
-            return
-
-        for auth in auth_settings:
-            auth_setting = self.configuration.auth_settings().get(auth)
-            if auth_setting:
-                if not auth_setting['value']:
-                    continue
-                elif auth_setting['in'] == 'header':
-                    headers[auth_setting['key']] = auth_setting['value']
-                elif auth_setting['in'] == 'query':
-                    querys.append((auth_setting['key'], auth_setting['value']))
-                else:
-                    raise ValueError(
-                        'Authentication token must be in `query` or `header`'
-                    )
-
-    def __deserialize_file(self, response):
-        """Deserializes body to file
-
-        Saves response body into a file in a temporary folder,
-        using the filename from the `Content-Disposition` header if provided.
-
-        :param response:  RESTResponse.
-        :return: file path.
-        """
-        fd, path = tempfile.mkstemp(dir=self.configuration.temp_folder_path)
-        os.close(fd)
-        os.remove(path)
-
-        content_disposition = response.getheader("Content-Disposition")
-        if content_disposition:
-            filename = re.search(r'filename=[\'"]?([^\'"\s]+)[\'"]?',
-                                 content_disposition).group(1)
-            path = os.path.join(os.path.dirname(path), filename)
-
-        with open(path, "wb") as f:
-            f.write(response.data)
-
-        return path
-
-    def __deserialize_primitive(self, data, klass):
-        """Deserializes string to primitive type.
-
-        :param data: str.
-        :param klass: class literal.
-
-        :return: int, long, float, str, bool.
-        """
-        try:
-            return klass(data)
-        except UnicodeEncodeError:
-            return six.text_type(data)
-        except TypeError:
-            return data
-
-    def __deserialize_object(self, value):
-        """Return a original value.
-
-        :return: object.
-        """
-        return value
-
-    def __deserialize_date(self, string):
-        """Deserializes string to date.
-
-        :param string: str.
-        :return: date.
-        """
-        try:
-            from dateutil.parser import parse
-            return parse(string).date()
-        except ImportError:
-            return string
-        except ValueError:
-            raise rest.ApiException(
-                status=0,
-                reason="Failed to parse `{0}` as date object".format(string)
-            )
-
-    def __deserialize_datatime(self, string):
-        """Deserializes string to datetime.
-
-        The string should be in iso8601 datetime format.
-
-        :param string: str.
-        :return: datetime.
-        """
-        try:
-            from dateutil.parser import parse
-            return parse(string)
-        except ImportError:
-            return string
-        except ValueError:
-            raise rest.ApiException(
-                status=0,
-                reason=(
-                    "Failed to parse `{0}` as datetime object"
-                    .format(string)
-                )
-            )
-
-    def __hasattr(self, object, name):
-        return name in object.__class__.__dict__
-
-    def __deserialize_model(self, data, klass):
-        """Deserializes list or dict to model.
-
-        :param data: dict, list.
-        :param klass: class literal.
-        :return: model object.
-        """
-
-        if not klass.swagger_types and not self.__hasattr(klass, 'get_real_child_model'):
-            return data
-
-        kwargs = {}
-        if klass.swagger_types is not None:
-            for attr, attr_type in six.iteritems(klass.swagger_types):
-                if (data is not None and
-                        klass.attribute_map[attr] in data and
-                        isinstance(data, (list, dict))):
-                    value = data[klass.attribute_map[attr]]
-                    kwargs[attr] = self.__deserialize(value, attr_type)
-
-        instance = klass(**kwargs)
-
-        if (isinstance(instance, dict) and
-                klass.swagger_types is not None and
-                isinstance(data, dict)):
-            for key, value in data.items():
-                if key not in klass.swagger_types:
-                    instance[key] = value
-        if self.__hasattr(instance, 'get_real_child_model'):
-            klass_name = instance.get_real_child_model(data)
-            if klass_name:
-                instance = self.__deserialize(data, klass_name)
-        return instance
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/configuration.py b/src/caosadvancedtools/bloxberg/swagger_client/configuration.py
deleted file mode 100644
index 2be9f6a7..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/configuration.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-from __future__ import absolute_import
-
-import copy
-import logging
-import multiprocessing
-import sys
-import urllib3
-
-import six
-from six.moves import http_client as httplib
-
-
-class TypeWithDefault(type):
-    def __init__(cls, name, bases, dct):
-        super(TypeWithDefault, cls).__init__(name, bases, dct)
-        cls._default = None
-
-    def __call__(cls):
-        if cls._default is None:
-            cls._default = type.__call__(cls)
-        return copy.copy(cls._default)
-
-    def set_default(cls, default):
-        cls._default = copy.copy(default)
-
-
-class Configuration(six.with_metaclass(TypeWithDefault, object)):
-    """NOTE: This class is auto generated by the swagger code generator program.
-
-    Ref: https://github.com/swagger-api/swagger-codegen
-    Do not edit the class manually.
-    """
-
-    def __init__(self):
-        """Constructor"""
-        # Default Base url
-        self.host = "https://qa.certify.bloxberg.org"
-        # Temp file folder for downloading files
-        self.temp_folder_path = None
-
-        # Authentication Settings
-        # dict to store API key(s)
-        self.api_key = {}
-        # dict to store API prefix (e.g. Bearer)
-        self.api_key_prefix = {}
-        # function to refresh API key if expired
-        self.refresh_api_key_hook = None
-        # Username for HTTP basic authentication
-        self.username = ""
-        # Password for HTTP basic authentication
-        self.password = ""
-        # Logging Settings
-        self.logger = {}
-        self.logger["package_logger"] = logging.getLogger("swagger_client")
-        self.logger["urllib3_logger"] = logging.getLogger("urllib3")
-        # Log format
-        self.logger_format = '%(asctime)s %(levelname)s %(message)s'
-        # Log stream handler
-        self.logger_stream_handler = None
-        # Log file handler
-        self.logger_file_handler = None
-        # Debug file location
-        self.logger_file = None
-        # Debug switch
-        self.debug = False
-
-        # SSL/TLS verification
-        # Set this to false to skip verifying SSL certificate when calling API
-        # from https server.
-        self.verify_ssl = True
-        # Set this to customize the certificate file to verify the peer.
-        self.ssl_ca_cert = None
-        # client certificate file
-        self.cert_file = None
-        # client key file
-        self.key_file = None
-        # Set this to True/False to enable/disable SSL hostname verification.
-        self.assert_hostname = None
-
-        # urllib3 connection pool's maximum number of connections saved
-        # per pool. urllib3 uses 1 connection as default value, but this is
-        # not the best value when you are making a lot of possibly parallel
-        # requests to the same host, which is often the case here.
-        # cpu_count * 5 is used as default value to increase performance.
-        self.connection_pool_maxsize = multiprocessing.cpu_count() * 5
-
-        # Proxy URL
-        self.proxy = None
-        # Safe chars for path_param
-        self.safe_chars_for_path_param = ''
-
-    @property
-    def logger_file(self):
-        """The logger file.
-
-        If the logger_file is None, then add stream handler and remove file
-        handler. Otherwise, add file handler and remove stream handler.
-
-        :param value: The logger_file path.
-        :type: str
-        """
-        return self.__logger_file
-
-    @logger_file.setter
-    def logger_file(self, value):
-        """The logger file.
-
-        If the logger_file is None, then add stream handler and remove file
-        handler. Otherwise, add file handler and remove stream handler.
-
-        :param value: The logger_file path.
-        :type: str
-        """
-        self.__logger_file = value
-        if self.__logger_file:
-            # If set logging file,
-            # then add file handler and remove stream handler.
-            self.logger_file_handler = logging.FileHandler(self.__logger_file)
-            self.logger_file_handler.setFormatter(self.logger_formatter)
-            for _, logger in six.iteritems(self.logger):
-                logger.addHandler(self.logger_file_handler)
-                if self.logger_stream_handler:
-                    logger.removeHandler(self.logger_stream_handler)
-        else:
-            # If not set logging file,
-            # then add stream handler and remove file handler.
-            self.logger_stream_handler = logging.StreamHandler()
-            self.logger_stream_handler.setFormatter(self.logger_formatter)
-            for _, logger in six.iteritems(self.logger):
-                logger.addHandler(self.logger_stream_handler)
-                if self.logger_file_handler:
-                    logger.removeHandler(self.logger_file_handler)
-
-    @property
-    def debug(self):
-        """Debug status
-
-        :param value: The debug status, True or False.
-        :type: bool
-        """
-        return self.__debug
-
-    @debug.setter
-    def debug(self, value):
-        """Debug status
-
-        :param value: The debug status, True or False.
-        :type: bool
-        """
-        self.__debug = value
-        if self.__debug:
-            # if debug status is True, turn on debug logging
-            for _, logger in six.iteritems(self.logger):
-                logger.setLevel(logging.DEBUG)
-            # turn on httplib debug
-            httplib.HTTPConnection.debuglevel = 1
-        else:
-            # if debug status is False, turn off debug logging,
-            # setting log level to default `logging.WARNING`
-            for _, logger in six.iteritems(self.logger):
-                logger.setLevel(logging.WARNING)
-            # turn off httplib debug
-            httplib.HTTPConnection.debuglevel = 0
-
-    @property
-    def logger_format(self):
-        """The logger format.
-
-        The logger_formatter will be updated when sets logger_format.
-
-        :param value: The format string.
-        :type: str
-        """
-        return self.__logger_format
-
-    @logger_format.setter
-    def logger_format(self, value):
-        """The logger format.
-
-        The logger_formatter will be updated when sets logger_format.
-
-        :param value: The format string.
-        :type: str
-        """
-        self.__logger_format = value
-        self.logger_formatter = logging.Formatter(self.__logger_format)
-
-    def get_api_key_with_prefix(self, identifier):
-        """Gets API key (with prefix if set).
-
-        :param identifier: The identifier of apiKey.
-        :return: The token for api key authentication.
-        """
-        if self.refresh_api_key_hook:
-            self.refresh_api_key_hook(self)
-
-        key = self.api_key.get(identifier)
-        if key:
-            prefix = self.api_key_prefix.get(identifier)
-            if prefix:
-                return "%s %s" % (prefix, key)
-            else:
-                return key
-
-    def get_basic_auth_token(self):
-        """Gets HTTP basic authentication header (string).
-
-        :return: The token for basic HTTP authentication.
-        """
-        return urllib3.util.make_headers(
-            basic_auth=self.username + ':' + self.password
-        ).get('authorization')
-
-    def auth_settings(self):
-        """Gets Auth Settings dict for api client.
-
-        :return: The Auth Settings information dict.
-        """
-        return {
-        }
-
-    def to_debug_report(self):
-        """Gets the essential information for debugging.
-
-        :return: The report for debugging.
-        """
-        return "Python SDK Debug Report:\n"\
-               "OS: {env}\n"\
-               "Python Version: {pyversion}\n"\
-               "Version of the API: 0.2.0\n"\
-               "SDK Package Version: 1.0.0".\
-               format(env=sys.platform, pyversion=sys.version)
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/models/__init__.py b/src/caosadvancedtools/bloxberg/swagger_client/models/__init__.py
deleted file mode 100644
index 55b01c66..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/models/__init__.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# coding: utf-8
-
-# flake8: noqa
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-from __future__ import absolute_import
-
-# import models into model package
-from swagger_client.models.batch import Batch
-from swagger_client.models.controller_cert_tools_generate_pdf_json_certificate import ControllerCertToolsGeneratePdfJsonCertificate
-from swagger_client.models.controller_cert_tools_generate_unsigned_certificate_json_certificate import ControllerCertToolsGenerateUnsignedCertificateJsonCertificate
-from swagger_client.models.http_validation_error import HTTPValidationError
-from swagger_client.models.validation_error import ValidationError
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/models/batch.py b/src/caosadvancedtools/bloxberg/swagger_client/models/batch.py
deleted file mode 100644
index 474ca01a..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/models/batch.py
+++ /dev/null
@@ -1,228 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-import pprint
-import re  # noqa: F401
-
-import six
-
-
-class Batch(object):
-    """NOTE: This class is auto generated by the swagger code generator program.
-
-    Do not edit the class manually.
-    """
-    """
-    Attributes:
-      swagger_types (dict): The key is attribute name
-                            and the value is attribute type.
-      attribute_map (dict): The key is attribute name
-                            and the value is json key in definition.
-    """
-    swagger_types = {
-        'public_key': 'str',
-        'crid': 'list[str]',
-        'crid_type': 'str',
-        'enable_ipfs': 'bool',
-        'metadata_json': 'str'
-    }
-
-    attribute_map = {
-        'public_key': 'publicKey',
-        'crid': 'crid',
-        'crid_type': 'cridType',
-        'enable_ipfs': 'enableIPFS',
-        'metadata_json': 'metadataJson'
-    }
-
-    def __init__(self, public_key=None, crid=None, crid_type=None, enable_ipfs=None, metadata_json=None):  # noqa: E501
-        """Batch - a model defined in Swagger"""  # noqa: E501
-        self._public_key = None
-        self._crid = None
-        self._crid_type = None
-        self._enable_ipfs = None
-        self._metadata_json = None
-        self.discriminator = None
-        self.public_key = public_key
-        self.crid = crid
-        if crid_type is not None:
-            self.crid_type = crid_type
-        self.enable_ipfs = enable_ipfs
-        if metadata_json is not None:
-            self.metadata_json = metadata_json
-
-    @property
-    def public_key(self):
-        """Gets the public_key of this Batch.  # noqa: E501
-
-        Public bloxberg address where the Research Object Certificate token will be minted  # noqa: E501
-
-        :return: The public_key of this Batch.  # noqa: E501
-        :rtype: str
-        """
-        return self._public_key
-
-    @public_key.setter
-    def public_key(self, public_key):
-        """Sets the public_key of this Batch.
-
-        Public bloxberg address where the Research Object Certificate token will be minted  # noqa: E501
-
-        :param public_key: The public_key of this Batch.  # noqa: E501
-        :type: str
-        """
-        if public_key is None:
-            raise ValueError("Invalid value for `public_key`, must not be `None`")  # noqa: E501
-
-        self._public_key = public_key
-
-    @property
-    def crid(self):
-        """Gets the crid of this Batch.  # noqa: E501
-
-        Cryptographic Identifier of each file you wish to certify. One certificate will be generated per hash up to a maximum of 1001 in a single request  # noqa: E501
-
-        :return: The crid of this Batch.  # noqa: E501
-        :rtype: list[str]
-        """
-        return self._crid
-
-    @crid.setter
-    def crid(self, crid):
-        """Sets the crid of this Batch.
-
-        Cryptographic Identifier of each file you wish to certify. One certificate will be generated per hash up to a maximum of 1001 in a single request  # noqa: E501
-
-        :param crid: The crid of this Batch.  # noqa: E501
-        :type: list[str]
-        """
-        if crid is None:
-            raise ValueError("Invalid value for `crid`, must not be `None`")  # noqa: E501
-
-        self._crid = crid
-
-    @property
-    def crid_type(self):
-        """Gets the crid_type of this Batch.  # noqa: E501
-
-        If crid is not self-describing, provide the type of cryptographic function you used to generate the cryptographic identifier. Please use the name field from the multihash list to ensure compatibility: https://github.com/multiformats/multicodec/blob/master/table.csv  # noqa: E501
-
-        :return: The crid_type of this Batch.  # noqa: E501
-        :rtype: str
-        """
-        return self._crid_type
-
-    @crid_type.setter
-    def crid_type(self, crid_type):
-        """Sets the crid_type of this Batch.
-
-        If crid is not self-describing, provide the type of cryptographic function you used to generate the cryptographic identifier. Please use the name field from the multihash list to ensure compatibility: https://github.com/multiformats/multicodec/blob/master/table.csv  # noqa: E501
-
-        :param crid_type: The crid_type of this Batch.  # noqa: E501
-        :type: str
-        """
-
-        self._crid_type = crid_type
-
-    @property
-    def enable_ipfs(self):
-        """Gets the enable_ipfs of this Batch.  # noqa: E501
-
-        EXPERIMENTAL: Set to true to enable posting certificate to IPFS. If set to false, will simply return certificates in the response. By default, this is disabled on the server due to performance and storage problems with IPFS  # noqa: E501
-
-        :return: The enable_ipfs of this Batch.  # noqa: E501
-        :rtype: bool
-        """
-        return self._enable_ipfs
-
-    @enable_ipfs.setter
-    def enable_ipfs(self, enable_ipfs):
-        """Sets the enable_ipfs of this Batch.
-
-        EXPERIMENTAL: Set to true to enable posting certificate to IPFS. If set to false, will simply return certificates in the response. By default, this is disabled on the server due to performance and storage problems with IPFS  # noqa: E501
-
-        :param enable_ipfs: The enable_ipfs of this Batch.  # noqa: E501
-        :type: bool
-        """
-        if enable_ipfs is None:
-            raise ValueError("Invalid value for `enable_ipfs`, must not be `None`")  # noqa: E501
-
-        self._enable_ipfs = enable_ipfs
-
-    @property
-    def metadata_json(self):
-        """Gets the metadata_json of this Batch.  # noqa: E501
-
-        Provide optional metadata to describe the research object batch in more detail that will be included in the certificate.  # noqa: E501
-
-        :return: The metadata_json of this Batch.  # noqa: E501
-        :rtype: str
-        """
-        return self._metadata_json
-
-    @metadata_json.setter
-    def metadata_json(self, metadata_json):
-        """Sets the metadata_json of this Batch.
-
-        Provide optional metadata to describe the research object batch in more detail that will be included in the certificate.  # noqa: E501
-
-        :param metadata_json: The metadata_json of this Batch.  # noqa: E501
-        :type: str
-        """
-
-        self._metadata_json = metadata_json
-
-    def to_dict(self):
-        """Returns the model properties as a dict"""
-        result = {}
-
-        for attr, _ in six.iteritems(self.swagger_types):
-            value = getattr(self, attr)
-            if isinstance(value, list):
-                result[attr] = list(map(
-                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
-                    value
-                ))
-            elif hasattr(value, "to_dict"):
-                result[attr] = value.to_dict()
-            elif isinstance(value, dict):
-                result[attr] = dict(map(
-                    lambda item: (item[0], item[1].to_dict())
-                    if hasattr(item[1], "to_dict") else item,
-                    value.items()
-                ))
-            else:
-                result[attr] = value
-        if issubclass(Batch, dict):
-            for key, value in self.items():
-                result[key] = value
-
-        return result
-
-    def to_str(self):
-        """Returns the string representation of the model"""
-        return pprint.pformat(self.to_dict())
-
-    def __repr__(self):
-        """For `print` and `pprint`"""
-        return self.to_str()
-
-    def __eq__(self, other):
-        """Returns true if both objects are equal"""
-        if not isinstance(other, Batch):
-            return False
-
-        return self.__dict__ == other.__dict__
-
-    def __ne__(self, other):
-        """Returns true if both objects are not equal"""
-        return not self == other
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/models/controller_cert_tools_generate_pdf_json_certificate.py b/src/caosadvancedtools/bloxberg/swagger_client/models/controller_cert_tools_generate_pdf_json_certificate.py
deleted file mode 100644
index 8c1b50d8..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/models/controller_cert_tools_generate_pdf_json_certificate.py
+++ /dev/null
@@ -1,380 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-import pprint
-import re  # noqa: F401
-
-import six
-
-
-class ControllerCertToolsGeneratePdfJsonCertificate(object):
-    """NOTE: This class is auto generated by the swagger code generator program.
-
-    Do not edit the class manually.
-    """
-    """
-    Attributes:
-      swagger_types (dict): The key is attribute name
-                            and the value is attribute type.
-      attribute_map (dict): The key is attribute name
-                            and the value is json key in definition.
-    """
-    swagger_types = {
-        'context': 'list[str]',
-        'id': 'str',
-        'type': 'list[str]',
-        'issuer': 'str',
-        'issuance_date': 'str',
-        'credential_subject': 'object',
-        'display_html': 'str',
-        'crid': 'str',
-        'crid_type': 'str',
-        'metadata_json': 'str',
-        'proof': 'object'
-    }
-
-    attribute_map = {
-        'context': '@context',
-        'id': 'id',
-        'type': 'type',
-        'issuer': 'issuer',
-        'issuance_date': 'issuanceDate',
-        'credential_subject': 'credentialSubject',
-        'display_html': 'displayHtml',
-        'crid': 'crid',
-        'crid_type': 'cridType',
-        'metadata_json': 'metadataJson',
-        'proof': 'proof'
-    }
-
-    def __init__(self, context=None, id=None, type=None, issuer=None, issuance_date=None, credential_subject=None, display_html=None, crid=None, crid_type=None, metadata_json=None, proof=None):  # noqa: E501
-        """ControllerCertToolsGeneratePdfJsonCertificate - a model defined in Swagger"""  # noqa: E501
-        self._context = None
-        self._id = None
-        self._type = None
-        self._issuer = None
-        self._issuance_date = None
-        self._credential_subject = None
-        self._display_html = None
-        self._crid = None
-        self._crid_type = None
-        self._metadata_json = None
-        self._proof = None
-        self.discriminator = None
-        if context is not None:
-            self.context = context
-        self.id = id
-        self.type = type
-        self.issuer = issuer
-        self.issuance_date = issuance_date
-        self.credential_subject = credential_subject
-        if display_html is not None:
-            self.display_html = display_html
-        self.crid = crid
-        if crid_type is not None:
-            self.crid_type = crid_type
-        if metadata_json is not None:
-            self.metadata_json = metadata_json
-        self.proof = proof
-
-    @property
-    def context(self):
-        """Gets the context of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-        Relevant JSON-LD context links in order to validate Verifiable Credentials according to their spec.  # noqa: E501
-
-        :return: The context of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: list[str]
-        """
-        return self._context
-
-    @context.setter
-    def context(self, context):
-        """Sets the context of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-        Relevant JSON-LD context links in order to validate Verifiable Credentials according to their spec.  # noqa: E501
-
-        :param context: The context of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: list[str]
-        """
-
-        self._context = context
-
-    @property
-    def id(self):
-        """Gets the id of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The id of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._id
-
-    @id.setter
-    def id(self, id):
-        """Sets the id of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param id: The id of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: str
-        """
-        if id is None:
-            raise ValueError("Invalid value for `id`, must not be `None`")  # noqa: E501
-
-        self._id = id
-
-    @property
-    def type(self):
-        """Gets the type of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The type of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: list[str]
-        """
-        return self._type
-
-    @type.setter
-    def type(self, type):
-        """Sets the type of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param type: The type of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: list[str]
-        """
-        if type is None:
-            raise ValueError("Invalid value for `type`, must not be `None`")  # noqa: E501
-
-        self._type = type
-
-    @property
-    def issuer(self):
-        """Gets the issuer of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The issuer of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._issuer
-
-    @issuer.setter
-    def issuer(self, issuer):
-        """Sets the issuer of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param issuer: The issuer of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: str
-        """
-        if issuer is None:
-            raise ValueError("Invalid value for `issuer`, must not be `None`")  # noqa: E501
-
-        self._issuer = issuer
-
-    @property
-    def issuance_date(self):
-        """Gets the issuance_date of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The issuance_date of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._issuance_date
-
-    @issuance_date.setter
-    def issuance_date(self, issuance_date):
-        """Sets the issuance_date of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param issuance_date: The issuance_date of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: str
-        """
-        if issuance_date is None:
-            raise ValueError("Invalid value for `issuance_date`, must not be `None`")  # noqa: E501
-
-        self._issuance_date = issuance_date
-
-    @property
-    def credential_subject(self):
-        """Gets the credential_subject of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The credential_subject of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: object
-        """
-        return self._credential_subject
-
-    @credential_subject.setter
-    def credential_subject(self, credential_subject):
-        """Sets the credential_subject of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param credential_subject: The credential_subject of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: object
-        """
-        if credential_subject is None:
-            raise ValueError("Invalid value for `credential_subject`, must not be `None`")  # noqa: E501
-
-        self._credential_subject = credential_subject
-
-    @property
-    def display_html(self):
-        """Gets the display_html of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The display_html of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._display_html
-
-    @display_html.setter
-    def display_html(self, display_html):
-        """Sets the display_html of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param display_html: The display_html of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: str
-        """
-
-        self._display_html = display_html
-
-    @property
-    def crid(self):
-        """Gets the crid of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The crid of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._crid
-
-    @crid.setter
-    def crid(self, crid):
-        """Sets the crid of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param crid: The crid of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: str
-        """
-        if crid is None:
-            raise ValueError("Invalid value for `crid`, must not be `None`")  # noqa: E501
-
-        self._crid = crid
-
-    @property
-    def crid_type(self):
-        """Gets the crid_type of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The crid_type of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._crid_type
-
-    @crid_type.setter
-    def crid_type(self, crid_type):
-        """Sets the crid_type of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param crid_type: The crid_type of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: str
-        """
-
-        self._crid_type = crid_type
-
-    @property
-    def metadata_json(self):
-        """Gets the metadata_json of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The metadata_json of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._metadata_json
-
-    @metadata_json.setter
-    def metadata_json(self, metadata_json):
-        """Sets the metadata_json of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param metadata_json: The metadata_json of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: str
-        """
-
-        self._metadata_json = metadata_json
-
-    @property
-    def proof(self):
-        """Gets the proof of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-
-
-        :return: The proof of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :rtype: object
-        """
-        return self._proof
-
-    @proof.setter
-    def proof(self, proof):
-        """Sets the proof of this ControllerCertToolsGeneratePdfJsonCertificate.
-
-
-        :param proof: The proof of this ControllerCertToolsGeneratePdfJsonCertificate.  # noqa: E501
-        :type: object
-        """
-        if proof is None:
-            raise ValueError("Invalid value for `proof`, must not be `None`")  # noqa: E501
-
-        self._proof = proof
-
-    def to_dict(self):
-        """Returns the model properties as a dict"""
-        result = {}
-
-        for attr, _ in six.iteritems(self.swagger_types):
-            value = getattr(self, attr)
-            if isinstance(value, list):
-                result[attr] = list(map(
-                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
-                    value
-                ))
-            elif hasattr(value, "to_dict"):
-                result[attr] = value.to_dict()
-            elif isinstance(value, dict):
-                result[attr] = dict(map(
-                    lambda item: (item[0], item[1].to_dict())
-                    if hasattr(item[1], "to_dict") else item,
-                    value.items()
-                ))
-            else:
-                result[attr] = value
-        if issubclass(ControllerCertToolsGeneratePdfJsonCertificate, dict):
-            for key, value in self.items():
-                result[key] = value
-
-        return result
-
-    def to_str(self):
-        """Returns the string representation of the model"""
-        return pprint.pformat(self.to_dict())
-
-    def __repr__(self):
-        """For `print` and `pprint`"""
-        return self.to_str()
-
-    def __eq__(self, other):
-        """Returns true if both objects are equal"""
-        if not isinstance(other, ControllerCertToolsGeneratePdfJsonCertificate):
-            return False
-
-        return self.__dict__ == other.__dict__
-
-    def __ne__(self, other):
-        """Returns true if both objects are not equal"""
-        return not self == other
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/models/controller_cert_tools_generate_unsigned_certificate_json_certificate.py b/src/caosadvancedtools/bloxberg/swagger_client/models/controller_cert_tools_generate_unsigned_certificate_json_certificate.py
deleted file mode 100644
index fa0da3cb..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/models/controller_cert_tools_generate_unsigned_certificate_json_certificate.py
+++ /dev/null
@@ -1,380 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-import pprint
-import re  # noqa: F401
-
-import six
-
-
-class ControllerCertToolsGenerateUnsignedCertificateJsonCertificate(object):
-    """NOTE: This class is auto generated by the swagger code generator program.
-
-    Do not edit the class manually.
-    """
-    """
-    Attributes:
-      swagger_types (dict): The key is attribute name
-                            and the value is attribute type.
-      attribute_map (dict): The key is attribute name
-                            and the value is json key in definition.
-    """
-    swagger_types = {
-        'context': 'list[str]',
-        'id': 'str',
-        'type': 'list[str]',
-        'issuer': 'str',
-        'issuance_date': 'str',
-        'credential_subject': 'object',
-        'display_html': 'str',
-        'crid': 'str',
-        'crid_type': 'str',
-        'metadata_json': 'str',
-        'proof': 'object'
-    }
-
-    attribute_map = {
-        'context': '@context',
-        'id': 'id',
-        'type': 'type',
-        'issuer': 'issuer',
-        'issuance_date': 'issuanceDate',
-        'credential_subject': 'credentialSubject',
-        'display_html': 'displayHtml',
-        'crid': 'crid',
-        'crid_type': 'cridType',
-        'metadata_json': 'metadataJson',
-        'proof': 'proof'
-    }
-
-    def __init__(self, context=None, id=None, type=None, issuer=None, issuance_date=None, credential_subject=None, display_html=None, crid=None, crid_type=None, metadata_json=None, proof=None):  # noqa: E501
-        """ControllerCertToolsGenerateUnsignedCertificateJsonCertificate - a model defined in Swagger"""  # noqa: E501
-        self._context = None
-        self._id = None
-        self._type = None
-        self._issuer = None
-        self._issuance_date = None
-        self._credential_subject = None
-        self._display_html = None
-        self._crid = None
-        self._crid_type = None
-        self._metadata_json = None
-        self._proof = None
-        self.discriminator = None
-        if context is not None:
-            self.context = context
-        self.id = id
-        self.type = type
-        self.issuer = issuer
-        self.issuance_date = issuance_date
-        self.credential_subject = credential_subject
-        if display_html is not None:
-            self.display_html = display_html
-        self.crid = crid
-        if crid_type is not None:
-            self.crid_type = crid_type
-        if metadata_json is not None:
-            self.metadata_json = metadata_json
-        self.proof = proof
-
-    @property
-    def context(self):
-        """Gets the context of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-        Relevant JSON-LD context links in order to validate Verifiable Credentials according to their spec.  # noqa: E501
-
-        :return: The context of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: list[str]
-        """
-        return self._context
-
-    @context.setter
-    def context(self, context):
-        """Sets the context of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-        Relevant JSON-LD context links in order to validate Verifiable Credentials according to their spec.  # noqa: E501
-
-        :param context: The context of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: list[str]
-        """
-
-        self._context = context
-
-    @property
-    def id(self):
-        """Gets the id of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The id of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._id
-
-    @id.setter
-    def id(self, id):
-        """Sets the id of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param id: The id of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: str
-        """
-        if id is None:
-            raise ValueError("Invalid value for `id`, must not be `None`")  # noqa: E501
-
-        self._id = id
-
-    @property
-    def type(self):
-        """Gets the type of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The type of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: list[str]
-        """
-        return self._type
-
-    @type.setter
-    def type(self, type):
-        """Sets the type of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param type: The type of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: list[str]
-        """
-        if type is None:
-            raise ValueError("Invalid value for `type`, must not be `None`")  # noqa: E501
-
-        self._type = type
-
-    @property
-    def issuer(self):
-        """Gets the issuer of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The issuer of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._issuer
-
-    @issuer.setter
-    def issuer(self, issuer):
-        """Sets the issuer of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param issuer: The issuer of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: str
-        """
-        if issuer is None:
-            raise ValueError("Invalid value for `issuer`, must not be `None`")  # noqa: E501
-
-        self._issuer = issuer
-
-    @property
-    def issuance_date(self):
-        """Gets the issuance_date of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The issuance_date of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._issuance_date
-
-    @issuance_date.setter
-    def issuance_date(self, issuance_date):
-        """Sets the issuance_date of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param issuance_date: The issuance_date of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: str
-        """
-        if issuance_date is None:
-            raise ValueError("Invalid value for `issuance_date`, must not be `None`")  # noqa: E501
-
-        self._issuance_date = issuance_date
-
-    @property
-    def credential_subject(self):
-        """Gets the credential_subject of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The credential_subject of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: object
-        """
-        return self._credential_subject
-
-    @credential_subject.setter
-    def credential_subject(self, credential_subject):
-        """Sets the credential_subject of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param credential_subject: The credential_subject of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: object
-        """
-        if credential_subject is None:
-            raise ValueError("Invalid value for `credential_subject`, must not be `None`")  # noqa: E501
-
-        self._credential_subject = credential_subject
-
-    @property
-    def display_html(self):
-        """Gets the display_html of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The display_html of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._display_html
-
-    @display_html.setter
-    def display_html(self, display_html):
-        """Sets the display_html of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param display_html: The display_html of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: str
-        """
-
-        self._display_html = display_html
-
-    @property
-    def crid(self):
-        """Gets the crid of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The crid of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._crid
-
-    @crid.setter
-    def crid(self, crid):
-        """Sets the crid of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param crid: The crid of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: str
-        """
-        if crid is None:
-            raise ValueError("Invalid value for `crid`, must not be `None`")  # noqa: E501
-
-        self._crid = crid
-
-    @property
-    def crid_type(self):
-        """Gets the crid_type of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The crid_type of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._crid_type
-
-    @crid_type.setter
-    def crid_type(self, crid_type):
-        """Sets the crid_type of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param crid_type: The crid_type of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: str
-        """
-
-        self._crid_type = crid_type
-
-    @property
-    def metadata_json(self):
-        """Gets the metadata_json of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The metadata_json of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: str
-        """
-        return self._metadata_json
-
-    @metadata_json.setter
-    def metadata_json(self, metadata_json):
-        """Sets the metadata_json of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param metadata_json: The metadata_json of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: str
-        """
-
-        self._metadata_json = metadata_json
-
-    @property
-    def proof(self):
-        """Gets the proof of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-
-
-        :return: The proof of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :rtype: object
-        """
-        return self._proof
-
-    @proof.setter
-    def proof(self, proof):
-        """Sets the proof of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.
-
-
-        :param proof: The proof of this ControllerCertToolsGenerateUnsignedCertificateJsonCertificate.  # noqa: E501
-        :type: object
-        """
-        if proof is None:
-            raise ValueError("Invalid value for `proof`, must not be `None`")  # noqa: E501
-
-        self._proof = proof
-
-    def to_dict(self):
-        """Returns the model properties as a dict"""
-        result = {}
-
-        for attr, _ in six.iteritems(self.swagger_types):
-            value = getattr(self, attr)
-            if isinstance(value, list):
-                result[attr] = list(map(
-                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
-                    value
-                ))
-            elif hasattr(value, "to_dict"):
-                result[attr] = value.to_dict()
-            elif isinstance(value, dict):
-                result[attr] = dict(map(
-                    lambda item: (item[0], item[1].to_dict())
-                    if hasattr(item[1], "to_dict") else item,
-                    value.items()
-                ))
-            else:
-                result[attr] = value
-        if issubclass(ControllerCertToolsGenerateUnsignedCertificateJsonCertificate, dict):
-            for key, value in self.items():
-                result[key] = value
-
-        return result
-
-    def to_str(self):
-        """Returns the string representation of the model"""
-        return pprint.pformat(self.to_dict())
-
-    def __repr__(self):
-        """For `print` and `pprint`"""
-        return self.to_str()
-
-    def __eq__(self, other):
-        """Returns true if both objects are equal"""
-        if not isinstance(other, ControllerCertToolsGenerateUnsignedCertificateJsonCertificate):
-            return False
-
-        return self.__dict__ == other.__dict__
-
-    def __ne__(self, other):
-        """Returns true if both objects are not equal"""
-        return not self == other
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/models/http_validation_error.py b/src/caosadvancedtools/bloxberg/swagger_client/models/http_validation_error.py
deleted file mode 100644
index 67c23fba..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/models/http_validation_error.py
+++ /dev/null
@@ -1,111 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-import pprint
-import re  # noqa: F401
-
-import six
-
-
-class HTTPValidationError(object):
-    """NOTE: This class is auto generated by the swagger code generator program.
-
-    Do not edit the class manually.
-    """
-    """
-    Attributes:
-      swagger_types (dict): The key is attribute name
-                            and the value is attribute type.
-      attribute_map (dict): The key is attribute name
-                            and the value is json key in definition.
-    """
-    swagger_types = {
-        'detail': 'list[ValidationError]'
-    }
-
-    attribute_map = {
-        'detail': 'detail'
-    }
-
-    def __init__(self, detail=None):  # noqa: E501
-        """HTTPValidationError - a model defined in Swagger"""  # noqa: E501
-        self._detail = None
-        self.discriminator = None
-        if detail is not None:
-            self.detail = detail
-
-    @property
-    def detail(self):
-        """Gets the detail of this HTTPValidationError.  # noqa: E501
-
-
-        :return: The detail of this HTTPValidationError.  # noqa: E501
-        :rtype: list[ValidationError]
-        """
-        return self._detail
-
-    @detail.setter
-    def detail(self, detail):
-        """Sets the detail of this HTTPValidationError.
-
-
-        :param detail: The detail of this HTTPValidationError.  # noqa: E501
-        :type: list[ValidationError]
-        """
-
-        self._detail = detail
-
-    def to_dict(self):
-        """Returns the model properties as a dict"""
-        result = {}
-
-        for attr, _ in six.iteritems(self.swagger_types):
-            value = getattr(self, attr)
-            if isinstance(value, list):
-                result[attr] = list(map(
-                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
-                    value
-                ))
-            elif hasattr(value, "to_dict"):
-                result[attr] = value.to_dict()
-            elif isinstance(value, dict):
-                result[attr] = dict(map(
-                    lambda item: (item[0], item[1].to_dict())
-                    if hasattr(item[1], "to_dict") else item,
-                    value.items()
-                ))
-            else:
-                result[attr] = value
-        if issubclass(HTTPValidationError, dict):
-            for key, value in self.items():
-                result[key] = value
-
-        return result
-
-    def to_str(self):
-        """Returns the string representation of the model"""
-        return pprint.pformat(self.to_dict())
-
-    def __repr__(self):
-        """For `print` and `pprint`"""
-        return self.to_str()
-
-    def __eq__(self, other):
-        """Returns true if both objects are equal"""
-        if not isinstance(other, HTTPValidationError):
-            return False
-
-        return self.__dict__ == other.__dict__
-
-    def __ne__(self, other):
-        """Returns true if both objects are not equal"""
-        return not self == other
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/models/validation_error.py b/src/caosadvancedtools/bloxberg/swagger_client/models/validation_error.py
deleted file mode 100644
index 96d1e237..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/models/validation_error.py
+++ /dev/null
@@ -1,166 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-import pprint
-import re  # noqa: F401
-
-import six
-
-
-class ValidationError(object):
-    """NOTE: This class is auto generated by the swagger code generator program.
-
-    Do not edit the class manually.
-    """
-    """
-    Attributes:
-      swagger_types (dict): The key is attribute name
-                            and the value is attribute type.
-      attribute_map (dict): The key is attribute name
-                            and the value is json key in definition.
-    """
-    swagger_types = {
-        'loc': 'list[str]',
-        'msg': 'str',
-        'type': 'str'
-    }
-
-    attribute_map = {
-        'loc': 'loc',
-        'msg': 'msg',
-        'type': 'type'
-    }
-
-    def __init__(self, loc=None, msg=None, type=None):  # noqa: E501
-        """ValidationError - a model defined in Swagger"""  # noqa: E501
-        self._loc = None
-        self._msg = None
-        self._type = None
-        self.discriminator = None
-        self.loc = loc
-        self.msg = msg
-        self.type = type
-
-    @property
-    def loc(self):
-        """Gets the loc of this ValidationError.  # noqa: E501
-
-
-        :return: The loc of this ValidationError.  # noqa: E501
-        :rtype: list[str]
-        """
-        return self._loc
-
-    @loc.setter
-    def loc(self, loc):
-        """Sets the loc of this ValidationError.
-
-
-        :param loc: The loc of this ValidationError.  # noqa: E501
-        :type: list[str]
-        """
-        if loc is None:
-            raise ValueError("Invalid value for `loc`, must not be `None`")  # noqa: E501
-
-        self._loc = loc
-
-    @property
-    def msg(self):
-        """Gets the msg of this ValidationError.  # noqa: E501
-
-
-        :return: The msg of this ValidationError.  # noqa: E501
-        :rtype: str
-        """
-        return self._msg
-
-    @msg.setter
-    def msg(self, msg):
-        """Sets the msg of this ValidationError.
-
-
-        :param msg: The msg of this ValidationError.  # noqa: E501
-        :type: str
-        """
-        if msg is None:
-            raise ValueError("Invalid value for `msg`, must not be `None`")  # noqa: E501
-
-        self._msg = msg
-
-    @property
-    def type(self):
-        """Gets the type of this ValidationError.  # noqa: E501
-
-
-        :return: The type of this ValidationError.  # noqa: E501
-        :rtype: str
-        """
-        return self._type
-
-    @type.setter
-    def type(self, type):
-        """Sets the type of this ValidationError.
-
-
-        :param type: The type of this ValidationError.  # noqa: E501
-        :type: str
-        """
-        if type is None:
-            raise ValueError("Invalid value for `type`, must not be `None`")  # noqa: E501
-
-        self._type = type
-
-    def to_dict(self):
-        """Returns the model properties as a dict"""
-        result = {}
-
-        for attr, _ in six.iteritems(self.swagger_types):
-            value = getattr(self, attr)
-            if isinstance(value, list):
-                result[attr] = list(map(
-                    lambda x: x.to_dict() if hasattr(x, "to_dict") else x,
-                    value
-                ))
-            elif hasattr(value, "to_dict"):
-                result[attr] = value.to_dict()
-            elif isinstance(value, dict):
-                result[attr] = dict(map(
-                    lambda item: (item[0], item[1].to_dict())
-                    if hasattr(item[1], "to_dict") else item,
-                    value.items()
-                ))
-            else:
-                result[attr] = value
-        if issubclass(ValidationError, dict):
-            for key, value in self.items():
-                result[key] = value
-
-        return result
-
-    def to_str(self):
-        """Returns the string representation of the model"""
-        return pprint.pformat(self.to_dict())
-
-    def __repr__(self):
-        """For `print` and `pprint`"""
-        return self.to_str()
-
-    def __eq__(self, other):
-        """Returns true if both objects are equal"""
-        if not isinstance(other, ValidationError):
-            return False
-
-        return self.__dict__ == other.__dict__
-
-    def __ne__(self, other):
-        """Returns true if both objects are not equal"""
-        return not self == other
diff --git a/src/caosadvancedtools/bloxberg/swagger_client/rest.py b/src/caosadvancedtools/bloxberg/swagger_client/rest.py
deleted file mode 100644
index c42e720c..00000000
--- a/src/caosadvancedtools/bloxberg/swagger_client/rest.py
+++ /dev/null
@@ -1,322 +0,0 @@
-# coding: utf-8
-
-"""
-    Research Object Certification
-
-    No description provided (generated by Swagger Codegen https://github.com/swagger-api/swagger-codegen)  # noqa: E501
-
-    OpenAPI spec version: 0.2.0
-    
-    Generated by: https://github.com/swagger-api/swagger-codegen.git
-"""
-
-from __future__ import absolute_import
-
-import io
-import json
-import logging
-import re
-import ssl
-
-import certifi
-# python 2 and python 3 compatibility library
-import six
-from six.moves.urllib.parse import urlencode
-
-try:
-    import urllib3
-except ImportError:
-    raise ImportError('Swagger python client requires urllib3.')
-
-
-logger = logging.getLogger(__name__)
-
-
-class RESTResponse(io.IOBase):
-
-    def __init__(self, resp):
-        self.urllib3_response = resp
-        self.status = resp.status
-        self.reason = resp.reason
-        self.data = resp.data
-
-    def getheaders(self):
-        """Returns a dictionary of the response headers."""
-        return self.urllib3_response.getheaders()
-
-    def getheader(self, name, default=None):
-        """Returns a given response header."""
-        return self.urllib3_response.getheader(name, default)
-
-
-class RESTClientObject(object):
-
-    def __init__(self, configuration, pools_size=4, maxsize=None):
-        # urllib3.PoolManager will pass all kw parameters to connectionpool
-        # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/poolmanager.py#L75  # noqa: E501
-        # https://github.com/shazow/urllib3/blob/f9409436f83aeb79fbaf090181cd81b784f1b8ce/urllib3/connectionpool.py#L680  # noqa: E501
-        # maxsize is the number of requests to host that are allowed in parallel  # noqa: E501
-        # Custom SSL certificates and client certificates: http://urllib3.readthedocs.io/en/latest/advanced-usage.html  # noqa: E501
-
-        # cert_reqs
-        if configuration.verify_ssl:
-            cert_reqs = ssl.CERT_REQUIRED
-        else:
-            cert_reqs = ssl.CERT_NONE
-
-        # ca_certs
-        if configuration.ssl_ca_cert:
-            ca_certs = configuration.ssl_ca_cert
-        else:
-            # if not set certificate file, use Mozilla's root certificates.
-            ca_certs = certifi.where()
-
-        addition_pool_args = {}
-        if configuration.assert_hostname is not None:
-            addition_pool_args['assert_hostname'] = configuration.assert_hostname  # noqa: E501
-
-        if maxsize is None:
-            if configuration.connection_pool_maxsize is not None:
-                maxsize = configuration.connection_pool_maxsize
-            else:
-                maxsize = 4
-
-        # https pool manager
-        if configuration.proxy:
-            self.pool_manager = urllib3.ProxyManager(
-                num_pools=pools_size,
-                maxsize=maxsize,
-                cert_reqs=cert_reqs,
-                ca_certs=ca_certs,
-                cert_file=configuration.cert_file,
-                key_file=configuration.key_file,
-                proxy_url=configuration.proxy,
-                **addition_pool_args
-            )
-        else:
-            self.pool_manager = urllib3.PoolManager(
-                num_pools=pools_size,
-                maxsize=maxsize,
-                cert_reqs=cert_reqs,
-                ca_certs=ca_certs,
-                cert_file=configuration.cert_file,
-                key_file=configuration.key_file,
-                **addition_pool_args
-            )
-
-    def request(self, method, url, query_params=None, headers=None,
-                body=None, post_params=None, _preload_content=True,
-                _request_timeout=None):
-        """Perform requests.
-
-        :param method: http request method
-        :param url: http request url
-        :param query_params: query parameters in the url
-        :param headers: http request headers
-        :param body: request json body, for `application/json`
-        :param post_params: request post parameters,
-                            `application/x-www-form-urlencoded`
-                            and `multipart/form-data`
-        :param _preload_content: if False, the urllib3.HTTPResponse object will
-                                 be returned without reading/decoding response
-                                 data. Default is True.
-        :param _request_timeout: timeout setting for this request. If one
-                                 number provided, it will be total request
-                                 timeout. It can also be a pair (tuple) of
-                                 (connection, read) timeouts.
-        """
-        method = method.upper()
-        assert method in ['GET', 'HEAD', 'DELETE', 'POST', 'PUT',
-                          'PATCH', 'OPTIONS']
-
-        if post_params and body:
-            raise ValueError(
-                "body parameter cannot be used with post_params parameter."
-            )
-
-        post_params = post_params or {}
-        headers = headers or {}
-
-        timeout = None
-        if _request_timeout:
-            if isinstance(_request_timeout, (int, ) if six.PY3 else (int, long)):  # noqa: E501,F821
-                timeout = urllib3.Timeout(total=_request_timeout)
-            elif (isinstance(_request_timeout, tuple) and
-                  len(_request_timeout) == 2):
-                timeout = urllib3.Timeout(
-                    connect=_request_timeout[0], read=_request_timeout[1])
-
-        if 'Content-Type' not in headers:
-            headers['Content-Type'] = 'application/json'
-
-        try:
-            # For `POST`, `PUT`, `PATCH`, `OPTIONS`, `DELETE`
-            if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']:
-                if query_params:
-                    url += '?' + urlencode(query_params)
-                if re.search('json', headers['Content-Type'], re.IGNORECASE):
-                    request_body = '{}'
-                    if body is not None:
-                        request_body = json.dumps(body)
-                    r = self.pool_manager.request(
-                        method, url,
-                        body=request_body,
-                        preload_content=_preload_content,
-                        timeout=timeout,
-                        headers=headers)
-                elif headers['Content-Type'] == 'application/x-www-form-urlencoded':  # noqa: E501
-                    r = self.pool_manager.request(
-                        method, url,
-                        fields=post_params,
-                        encode_multipart=False,
-                        preload_content=_preload_content,
-                        timeout=timeout,
-                        headers=headers)
-                elif headers['Content-Type'] == 'multipart/form-data':
-                    # must del headers['Content-Type'], or the correct
-                    # Content-Type which generated by urllib3 will be
-                    # overwritten.
-                    del headers['Content-Type']
-                    r = self.pool_manager.request(
-                        method, url,
-                        fields=post_params,
-                        encode_multipart=True,
-                        preload_content=_preload_content,
-                        timeout=timeout,
-                        headers=headers)
-                # Pass a `string` parameter directly in the body to support
-                # other content types than Json when `body` argument is
-                # provided in serialized form
-                elif isinstance(body, str):
-                    request_body = body
-                    r = self.pool_manager.request(
-                        method, url,
-                        body=request_body,
-                        preload_content=_preload_content,
-                        timeout=timeout,
-                        headers=headers)
-                else:
-                    # Cannot generate the request from given parameters
-                    msg = """Cannot prepare a request message for provided
-                             arguments. Please check that your arguments match
-                             declared content type."""
-                    raise ApiException(status=0, reason=msg)
-            # For `GET`, `HEAD`
-            else:
-                r = self.pool_manager.request(method, url,
-                                              fields=query_params,
-                                              preload_content=_preload_content,
-                                              timeout=timeout,
-                                              headers=headers)
-        except urllib3.exceptions.SSLError as e:
-            msg = "{0}\n{1}".format(type(e).__name__, str(e))
-            raise ApiException(status=0, reason=msg)
-
-        if _preload_content:
-            r = RESTResponse(r)
-
-            # In the python 3, the response.data is bytes.
-            # we need to decode it to string.
-            if six.PY3:
-                r.data = r.data.decode('utf8')
-
-            # log response body
-            logger.debug("response body: %s", r.data)
-
-        if not 200 <= r.status <= 299:
-            raise ApiException(http_resp=r)
-
-        return r
-
-    def GET(self, url, headers=None, query_params=None, _preload_content=True,
-            _request_timeout=None):
-        return self.request("GET", url,
-                            headers=headers,
-                            _preload_content=_preload_content,
-                            _request_timeout=_request_timeout,
-                            query_params=query_params)
-
-    def HEAD(self, url, headers=None, query_params=None, _preload_content=True,
-             _request_timeout=None):
-        return self.request("HEAD", url,
-                            headers=headers,
-                            _preload_content=_preload_content,
-                            _request_timeout=_request_timeout,
-                            query_params=query_params)
-
-    def OPTIONS(self, url, headers=None, query_params=None, post_params=None,
-                body=None, _preload_content=True, _request_timeout=None):
-        return self.request("OPTIONS", url,
-                            headers=headers,
-                            query_params=query_params,
-                            post_params=post_params,
-                            _preload_content=_preload_content,
-                            _request_timeout=_request_timeout,
-                            body=body)
-
-    def DELETE(self, url, headers=None, query_params=None, body=None,
-               _preload_content=True, _request_timeout=None):
-        return self.request("DELETE", url,
-                            headers=headers,
-                            query_params=query_params,
-                            _preload_content=_preload_content,
-                            _request_timeout=_request_timeout,
-                            body=body)
-
-    def POST(self, url, headers=None, query_params=None, post_params=None,
-             body=None, _preload_content=True, _request_timeout=None):
-        return self.request("POST", url,
-                            headers=headers,
-                            query_params=query_params,
-                            post_params=post_params,
-                            _preload_content=_preload_content,
-                            _request_timeout=_request_timeout,
-                            body=body)
-
-    def PUT(self, url, headers=None, query_params=None, post_params=None,
-            body=None, _preload_content=True, _request_timeout=None):
-        return self.request("PUT", url,
-                            headers=headers,
-                            query_params=query_params,
-                            post_params=post_params,
-                            _preload_content=_preload_content,
-                            _request_timeout=_request_timeout,
-                            body=body)
-
-    def PATCH(self, url, headers=None, query_params=None, post_params=None,
-              body=None, _preload_content=True, _request_timeout=None):
-        return self.request("PATCH", url,
-                            headers=headers,
-                            query_params=query_params,
-                            post_params=post_params,
-                            _preload_content=_preload_content,
-                            _request_timeout=_request_timeout,
-                            body=body)
-
-
-class ApiException(Exception):
-
-    def __init__(self, status=None, reason=None, http_resp=None):
-        if http_resp:
-            self.status = http_resp.status
-            self.reason = http_resp.reason
-            self.body = http_resp.data
-            self.headers = http_resp.getheaders()
-        else:
-            self.status = status
-            self.reason = reason
-            self.body = None
-            self.headers = None
-
-    def __str__(self):
-        """Custom error messages for exception"""
-        error_message = "({0})\n"\
-                        "Reason: {1}\n".format(self.status, self.reason)
-        if self.headers:
-            error_message += "HTTP response headers: {0}\n".format(
-                self.headers)
-
-        if self.body:
-            error_message += "HTTP response body: {0}\n".format(self.body)
-
-        return error_message
diff --git a/src/doc/conf.py b/src/doc/conf.py
index 2aa08622..b769fd1e 100644
--- a/src/doc/conf.py
+++ b/src/doc/conf.py
@@ -201,6 +201,5 @@ autodoc_default_options = {
     'undoc-members': None,
 }
 autodoc_mock_imports = [
-    "caosadvancedtools.bloxberg",
     "labfolder",
 ]
-- 
GitLab


From ef34db532dee1a66c2981be51c24fc0e40fed675 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Fri, 11 Oct 2024 16:06:27 +0200
Subject: [PATCH 012/106] FIX: add datatype, unit and description to properties
 that are part of Records

---
 src/caosadvancedtools/models/data_model.py |  1 +
 src/caosadvancedtools/models/parser.py     | 66 +++++++++++++++-------
 2 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 26641489..7da52788 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -149,6 +149,7 @@ class DataModel(dict):
                                                         ), name=ent.name))
 
                 if diff != "":
+                    breakpoint()
                     if verbose:
                         print(diff)
                     any_change = True
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 175f2f7f..964cf1f5 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -341,6 +341,38 @@ debug : bool, optional
                                               f"invalid keyword in line {entity['__line__']}:", 1)
                 raise ValueError(err_str, *err.args[1:]) from err
 
+        # Update properties that are part of record types:
+        # e.g. add their datatypes, units etc..
+        # Otherwise comparison of existing models and the parsed model become difficult.
+        for name, ent in self.model.items():
+            if not isinstance(ent, db.RecordType):
+                continue
+            props = ent.get_properties()
+            for prop in props:
+                if prop.name in self.model:
+                    model_prop = self.model[prop.name]
+                    # The information must be missing, we don't want to overwrite it accidentally:
+                    if prop.datatype is not None and prop.datatype != model_prop.datatype:
+                        # breakpoint()
+                        raise RuntimeError("datatype must not be set, here. This is probably a bug.")
+                    if prop.unit is not None and prop.unit != model_prop.unit:
+                        # continue
+                        raise RuntimeError("unit must not be set, here. This is probably a bug.")
+                    if prop.description is not None and prop.description != model_prop.description:
+                        # continue
+                        raise RuntimeError("description must not be set, here. This is probably a bug.")
+
+                    # If this property has a more detailed definition in the model,
+                    # copy over the information:
+
+                    if isinstance(model_prop, db.RecordType):
+                        # in this case the datatype equals the name of the record type:
+                        prop.datatype = prop.name
+                    else:
+                        prop.datatype = model_prop.datatype
+                        prop.unit = model_prop.unit
+                        prop.description = model_prop.description
+
         return DataModel(self.model.values())
 
     @staticmethod
@@ -470,6 +502,7 @@ debug : bool, optional
         """
 
         for n, e in props.items():
+
             if n in KEYWORDS:
                 if n in KEYWORDS_IGNORED:
                     continue
@@ -543,6 +576,13 @@ debug : bool, optional
             if name in self.treated:
                 raise TwiceDefinedException(name)
 
+            # for reducing a little bit of code duplication:
+            importance_dict = {
+                "recommended_properties": db.RECOMMENDED,
+                "obligatory_properties": db.OBLIGATORY,
+                "suggested_properties": db.SUGGESTED
+                }
+
             for prop_name, prop in definition.items():
                 if prop_name == "__line__":
                     continue
@@ -558,26 +598,14 @@ debug : bool, optional
                     # Handled above
                     continue
 
-                elif prop_name == "recommended_properties":
-                    self._add_to_recordtype(
-                        name, prop, importance=db.RECOMMENDED)
-
-                    for n, e in prop.items():
-                        self._treat_entity(n, e)
-
-                elif prop_name == "obligatory_properties":
-                    self._add_to_recordtype(
-                        name, prop, importance=db.OBLIGATORY)
-
-                    for n, e in prop.items():
-                        self._treat_entity(n, e)
-
-                elif prop_name == "suggested_properties":
-                    self._add_to_recordtype(
-                        name, prop, importance=db.SUGGESTED)
+                elif prop_name in importance_dict:
+                    for imp_name, imp_val in importance_dict.items():
+                        if prop_name == imp_name:
+                            self._add_to_recordtype(
+                                name, prop, importance=imp_val)
 
-                    for n, e in prop.items():
-                        self._treat_entity(n, e)
+                            for n, e in prop.items():
+                                self._treat_entity(n, e)
 
                 # datatype is already set
                 elif prop_name == "datatype":
-- 
GitLab


From 112df32d7e7ed10f5b1bac9994ba8352ed9c3501 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Mon, 14 Oct 2024 18:12:51 +0200
Subject: [PATCH 013/106] MAINT: Unit tests for Python 3.13

---
 .gitlab-ci.yml | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 61c68e67..65698d86 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -165,15 +165,8 @@ unittest_py312:
 unittest_py313:
   tags: [docker]
   stage: unittest
-  image: python:3.13-rc
-  script:
-    # TODO: Replace by '*python_test_script' as soon as 3.13 has been officially released.
-    - apt update && apt install -y cargo || true
-    - pip install meson[ninja] meson-python || true
-    - pip install pynose pandas pytest pytest-cov gitignore-parser openpyxl>=3.0.7 xlrd==1.2 h5py || true
-    - pip install git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev || true
-    - pip install . || true
-    - pytest --cov=caosadvancedtools unittests || true
+  image: python:3.13
+  script: *python_test_script
 
 # Build the sphinx documentation and make it ready for deployment by Gitlab Pages
 # Special job for serving a static website. See https://docs.gitlab.com/ee/ci/yaml/README.html#pages
-- 
GitLab


From a2256bcfa2382060b3b155b154d2df3c848fd67d Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Tue, 15 Oct 2024 11:59:12 +0200
Subject: [PATCH 014/106] DOC: Update changelog

---
 CHANGELOG.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 62794e6e..3be1b6de 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Added ###
 
+* Official support for Python 3.13
+
 ### Changed ###
 
 ### Deprecated ###
-- 
GitLab


From a76cf9a53713fc1d7b0e67b4ac5d099d26f02c88 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Thu, 24 Oct 2024 13:22:04 +0200
Subject: [PATCH 015/106] TST: test for confirming issue number 71

---
 unittests/test_yaml_model_parser.py | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index d6dbf718..371090cf 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -641,3 +641,21 @@ RT2:
 </RecordType>
 , 'bar': <RecordType name="bar"/>
 }"""
+
+
+def test_setting_values():
+  model = parse_model_from_string("""
+parameter:
+  datatype: INTEGER
+
+Simulation:
+  role: Record
+  obligatory_properties:
+    parameter: 26
+""")
+
+  assert len(model) == 2
+  assert str(model["parameter"])[:-1] == '<Property name="parameter" datatype="INTEGER"/>'
+  assert model["Simulation"].role == "Record"
+  assert model["Simulation"].name == "Simulation"
+  assert model["Simulation"].get_property("parameter").value == 26
-- 
GitLab


From 5f8a472d0c363c0804288f5dee29763ea09cd48c Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Fri, 25 Oct 2024 11:31:09 +0200
Subject: [PATCH 016/106] fix(yaml-models): corrected output labels for the
 yaml model parser

---
 src/caosadvancedtools/models/data_model.py |  6 +-
 unittests/test_yaml_model_parser.py        | 68 ++++++++++++++++++----
 2 files changed, 60 insertions(+), 14 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 26641489..bda8cad6 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -145,8 +145,10 @@ class DataModel(dict):
                 else:
                     query = db.Query(f"FIND ENTITY with id={ent.id}")
                     ref = query.execute(unique=True)
-                diff = (describe_diff(*compare_entities(ent, ref
-                                                        ), name=ent.name))
+                diff = (describe_diff(*compare_entities(ent, ref),
+                                      name=ent.name,
+                                      label_old="version from the yaml file",
+                                      label_new="version from LinkAhead"))
 
                 if diff != "":
                     if verbose:
diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index 371090cf..bef2a1b5 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -21,7 +21,11 @@ from datetime import date
 from tempfile import NamedTemporaryFile
 from pytest import raises, mark
 
+from unittest.mock import Mock
+
 import linkahead as db
+
+import caosadvancedtools
 from caosadvancedtools.models.parser import (TwiceDefinedException,
                                              YamlDefinitionError,
                                              parse_model_from_string,
@@ -644,18 +648,58 @@ RT2:
 
 
 def test_setting_values():
-  model = parse_model_from_string("""
-parameter:
-  datatype: INTEGER
-
-Simulation:
-  role: Record
+    model = parse_model_from_string("""
+  parameter:
+    datatype: INTEGER
+
+  Simulation:
+    role: Record
+    obligatory_properties:
+      parameter: 26
+  """)
+
+    assert len(model) == 2
+    assert str(model["parameter"])[:-1] == '<Property name="parameter" datatype="INTEGER"/>'
+    assert model["Simulation"].role == "Record"
+    assert model["Simulation"].name == "Simulation"
+    assert model["Simulation"].get_property("parameter").value == 26
+
+
+def test_sync_output(capfd):
+    model = parse_model_from_string("""
+RT:
   obligatory_properties:
-    parameter: 26
+    identifier:
+      datatype: TEXT
 """)
 
-  assert len(model) == 2
-  assert str(model["parameter"])[:-1] == '<Property name="parameter" datatype="INTEGER"/>'
-  assert model["Simulation"].role == "Record"
-  assert model["Simulation"].name == "Simulation"
-  assert model["Simulation"].get_property("parameter").value == 26
+    existing_entities = [db.RecordType(name="RT", id=25).add_property(name="identifier",
+                                                                      datatype="INTEGER",
+                                                                      importance="OBLIGATORY",
+                                                                      id=24),
+                         db.Property(name="identifier", datatype="INTEGER", id=24)]
+
+    def get_existing_entities(ent_cont):
+        return existing_entities
+
+    class MockQuery:
+        def __init__(self, q):
+            self.q = q
+
+        def execute(self, unique=True):
+            id = int(self.q.split("=")[1])
+            for existing_ent in existing_entities:
+                if existing_ent.id == id:
+                    return existing_ent
+            return None
+
+    model.get_existing_entities = get_existing_entities
+    caosadvancedtools.models.parser.db.Query = MockQuery
+    caosadvancedtools.models.parser.db.Container.update = Mock()
+
+    model.sync_data_model(True, True)
+    assert caosadvancedtools.models.parser.db.Container.update.called
+    output, err = capfd.readouterr()
+    print(output)
+    assert "version from the yaml file: TEXT" in output
+    assert "version from LinkAhead: INTEGER" in output
-- 
GitLab


From f8b92cdd80b07b1af33a396dd4697b2c41970ec9 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Fri, 25 Oct 2024 11:31:09 +0200
Subject: [PATCH 017/106] fix(yaml-models): corrected output labels for the
 yaml model parser

---
 src/caosadvancedtools/models/data_model.py |  6 ++-
 unittests/test_yaml_model_parser.py        | 44 ++++++++++++++++++++++
 2 files changed, 48 insertions(+), 2 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 26641489..bda8cad6 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -145,8 +145,10 @@ class DataModel(dict):
                 else:
                     query = db.Query(f"FIND ENTITY with id={ent.id}")
                     ref = query.execute(unique=True)
-                diff = (describe_diff(*compare_entities(ent, ref
-                                                        ), name=ent.name))
+                diff = (describe_diff(*compare_entities(ent, ref),
+                                      name=ent.name,
+                                      label_old="version from the yaml file",
+                                      label_new="version from LinkAhead"))
 
                 if diff != "":
                     if verbose:
diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index d6dbf718..5b3116fc 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -21,7 +21,11 @@ from datetime import date
 from tempfile import NamedTemporaryFile
 from pytest import raises, mark
 
+from unittest.mock import Mock
+
 import linkahead as db
+
+import caosadvancedtools
 from caosadvancedtools.models.parser import (TwiceDefinedException,
                                              YamlDefinitionError,
                                              parse_model_from_string,
@@ -641,3 +645,43 @@ RT2:
 </RecordType>
 , 'bar': <RecordType name="bar"/>
 }"""
+
+
+def test_sync_output(capfd):
+    model = parse_model_from_string("""
+RT:
+  obligatory_properties:
+    identifier:
+      datatype: TEXT
+""")
+
+    existing_entities = [db.RecordType(name="RT", id=25).add_property(name="identifier",
+                                                                      datatype="INTEGER",
+                                                                      importance="OBLIGATORY",
+                                                                      id=24),
+                         db.Property(name="identifier", datatype="INTEGER", id=24)]
+
+    def get_existing_entities(ent_cont):
+        return existing_entities
+
+    class MockQuery:
+        def __init__(self, q):
+            self.q = q
+
+        def execute(self, unique=True):
+            id = int(self.q.split("=")[1])
+            for existing_ent in existing_entities:
+                if existing_ent.id == id:
+                    return existing_ent
+            return None
+
+    model.get_existing_entities = get_existing_entities
+    caosadvancedtools.models.parser.db.Query = MockQuery
+    caosadvancedtools.models.parser.db.Container.update = Mock()
+
+    model.sync_data_model(True, True)
+    assert caosadvancedtools.models.parser.db.Container.update.called
+    output, err = capfd.readouterr()
+    print(output)
+    assert "version from the yaml file: TEXT" in output
+    assert "version from LinkAhead: INTEGER" in output
-- 
GitLab


From 3fe65738d4ba2f83270b56a21b90ef92acc4ad36 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Fri, 25 Oct 2024 11:38:55 +0200
Subject: [PATCH 018/106] reverted unwanted commit that also included
 indentation fix

---
 unittests/test_yaml_model_parser.py | 39 -----------------------------
 1 file changed, 39 deletions(-)

diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index bef2a1b5..370c8402 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -664,42 +664,3 @@ def test_setting_values():
     assert model["Simulation"].name == "Simulation"
     assert model["Simulation"].get_property("parameter").value == 26
 
-
-def test_sync_output(capfd):
-    model = parse_model_from_string("""
-RT:
-  obligatory_properties:
-    identifier:
-      datatype: TEXT
-""")
-
-    existing_entities = [db.RecordType(name="RT", id=25).add_property(name="identifier",
-                                                                      datatype="INTEGER",
-                                                                      importance="OBLIGATORY",
-                                                                      id=24),
-                         db.Property(name="identifier", datatype="INTEGER", id=24)]
-
-    def get_existing_entities(ent_cont):
-        return existing_entities
-
-    class MockQuery:
-        def __init__(self, q):
-            self.q = q
-
-        def execute(self, unique=True):
-            id = int(self.q.split("=")[1])
-            for existing_ent in existing_entities:
-                if existing_ent.id == id:
-                    return existing_ent
-            return None
-
-    model.get_existing_entities = get_existing_entities
-    caosadvancedtools.models.parser.db.Query = MockQuery
-    caosadvancedtools.models.parser.db.Container.update = Mock()
-
-    model.sync_data_model(True, True)
-    assert caosadvancedtools.models.parser.db.Container.update.called
-    output, err = capfd.readouterr()
-    print(output)
-    assert "version from the yaml file: TEXT" in output
-    assert "version from LinkAhead: INTEGER" in output
-- 
GitLab


From ac4cc18ecb3a26b092dfc1fb8b9bdfdfcf2848b0 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Fri, 25 Oct 2024 12:23:43 +0200
Subject: [PATCH 019/106] docs(apiutils): updated changelog

---
 CHANGELOG.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3be1b6de..624c2b29 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -130,6 +130,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 * `TableImporter.check_missing` in case of array-valued fields in table
 * YAML model parser has better description handling.
+* YAML model parser shows "LinkAhead" and "the yaml file" in its comparison display
+  instead of "old" and "new".
 
 ### Documentation ###
 
-- 
GitLab


From 499cbc7dc393fd74a36896a4fda9b7fcadaa69d1 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Fri, 25 Oct 2024 15:45:12 +0200
Subject: [PATCH 020/106] maint(yaml-model): remove breakpoint

---
 src/caosadvancedtools/models/data_model.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 7da52788..26641489 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -149,7 +149,6 @@ class DataModel(dict):
                                                         ), name=ent.name))
 
                 if diff != "":
-                    breakpoint()
                     if verbose:
                         print(diff)
                     any_change = True
-- 
GitLab


From b65b8426c987abebb5e5fd2aabc5265e9bff7653 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Fri, 25 Oct 2024 16:28:06 +0200
Subject: [PATCH 021/106] tests(yaml-models): test for comparisons in yaml
 model parser

---
 unittests/test_yaml_model_parser.py | 70 +++++++++++++++++++++++++++++
 1 file changed, 70 insertions(+)

diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index d6dbf718..574b41da 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -27,6 +27,8 @@ from caosadvancedtools.models.parser import (TwiceDefinedException,
                                              parse_model_from_string,
                                              parse_model_from_yaml)
 
+from linkahead.apiutils import compare_entities
+
 
 def to_file(string):
     f = NamedTemporaryFile(mode="w", delete=False)
@@ -641,3 +643,71 @@ RT2:
 </RecordType>
 , 'bar': <RecordType name="bar"/>
 }"""
+
+
+def test_comparison_yaml_model():
+    """
+    Test for this issue:
+    https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/130
+    """
+    model_string = """
+foo:
+  datatype: INTEGER
+  description: bla bla
+  unit: m
+
+RT1:
+  obligatory_properties:
+    foo:
+    RT2:
+    test_reference:
+
+RT2:
+
+test_reference:
+  datatype: RT2
+    """
+    model = parse_model_from_string(model_string)
+
+    # Without the fix, foo will have no datatype, description and no unit **as part of RT1**, so the
+    # comparison with a version taken from a LinkAhead instance will have these attributes.
+    # Furthermore, RT2 will be set as the datatype **in object version** in the yaml definition, while
+    # it is an ID in case of the version from the LinkAhead instance.
+
+    p_foo = db.Property(name="foo", datatype="INTEGER", description="bla bla", unit="m")
+    rt2 = db.RecordType(name="RT2")
+    rt1 = db.RecordType(name="RT1")
+    rt1.add_property(p_foo)
+    rt1.add_property(rt2)
+
+    server_response = """
+<Entities>
+  <noscript>
+    </noscript>
+  <Property id="2272" name="foo" description="bla bla" datatype="INTEGER" unit="m">
+    <Version id="7819eedaeba2aa7305e10c96e8cf7b9ac84aea4a" head="true"/>
+  </Property>
+  <RecordType id="2273" name="RT1">
+    <Version id="0c1b9df6677ee40d1e1429b2123e078ee6c863e0" head="true"/>
+    <Property id="2272" name="foo" description="bla bla" datatype="INTEGER" unit="m" importance="OBLIGATORY" flag="inheritance:FIX"/>
+    <Property id="2274" name="RT2" datatype="RT2" importance="OBLIGATORY" flag="inheritance:FIX"/>
+    <Property id="2275" name="test_reference" datatype="RT2" importance="OBLIGATORY" flag="inheritance:FIX"/>
+  </RecordType>
+  <RecordType id="2274" name="RT2">
+    <Version id="185940642680a7eba7f71914dd8dd7758dd13faa" head="true"/>
+  </RecordType>
+  <Property id="2275" name="test_reference" datatype="RT2">
+    <Version id="03cf86061c78a079b376394dfecdf32566b72fb7" head="true"/>
+  </Property>
+</Entities>"""
+
+    entities = db.Container.from_xml(server_response)
+
+    c1 = compare_entities(model["foo"], entities[0])
+    c2 = compare_entities(model["RT1"], entities[1])
+    c3 = compare_entities(model["RT2"], entities[2])
+    c4 = compare_entities(model["test_reference"], entities[3])
+
+
+
+
-- 
GitLab


From 6f2e80f3e5b66f65d9717c38c738bf82e8345978 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Mon, 28 Oct 2024 15:16:06 +0100
Subject: [PATCH 022/106] MAINT: Remove unused imports

---
 unittests/test_yaml_model_parser.py | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index 370c8402..c578cc33 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -21,11 +21,8 @@ from datetime import date
 from tempfile import NamedTemporaryFile
 from pytest import raises, mark
 
-from unittest.mock import Mock
-
 import linkahead as db
 
-import caosadvancedtools
 from caosadvancedtools.models.parser import (TwiceDefinedException,
                                              YamlDefinitionError,
                                              parse_model_from_string,
@@ -663,4 +660,3 @@ def test_setting_values():
     assert model["Simulation"].role == "Record"
     assert model["Simulation"].name == "Simulation"
     assert model["Simulation"].get_property("parameter").value == 26
-
-- 
GitLab


From 811f08bf9c182410100cee0d29044de10d7a76b0 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Mon, 28 Oct 2024 15:23:45 +0100
Subject: [PATCH 023/106] MAINT: Remove as-of-now unsupported arguments

---
 src/caosadvancedtools/models/data_model.py | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index bda8cad6..bd3888b8 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -146,9 +146,7 @@ class DataModel(dict):
                     query = db.Query(f"FIND ENTITY with id={ent.id}")
                     ref = query.execute(unique=True)
                 diff = (describe_diff(*compare_entities(ent, ref),
-                                      name=ent.name,
-                                      label_old="version from the yaml file",
-                                      label_new="version from LinkAhead"))
+                                      name=ent.name))
 
                 if diff != "":
                     if verbose:
-- 
GitLab


From f11a466d28eca0b6f365e7cad117b9c330dc467c Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Wed, 30 Oct 2024 12:57:13 +0100
Subject: [PATCH 024/106] TST(yaml-model-parser): incomplete test for correct
 output of parser in case of no changes

---
 src/caosadvancedtools/models/data_model.py |  5 +-
 src/caosadvancedtools/models/parser.py     | 57 +++++++++++-----------
 unittests/test_yaml_model_parser.py        | 21 +++++++-
 3 files changed, 53 insertions(+), 30 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 26641489..1390cf2e 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -111,8 +111,11 @@ class DataModel(dict):
         existing_entities = db.Container().extend(
             DataModel.entities_without(
                 self.values(), [e.name.lower() for e in non_existing_entities]))
+
         self.sync_ids_by_name(tmp_exist)
 
+
+
         if len(non_existing_entities) > 0:
             if verbose:
                 print("New entities:")
@@ -174,7 +177,7 @@ class DataModel(dict):
         Args
         ----
         entities : iterable
-            The entities to be retrieved.  This object will not be moidified.
+            The entities to be retrieved. This object will not be modified.
 
         Raises
         ------
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 964cf1f5..4fa529aa 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -341,37 +341,38 @@ debug : bool, optional
                                               f"invalid keyword in line {entity['__line__']}:", 1)
                 raise ValueError(err_str, *err.args[1:]) from err
 
+        # TODO: functionality commented out, to be able to test failing test first.
         # Update properties that are part of record types:
         # e.g. add their datatypes, units etc..
         # Otherwise comparison of existing models and the parsed model become difficult.
-        for name, ent in self.model.items():
-            if not isinstance(ent, db.RecordType):
-                continue
-            props = ent.get_properties()
-            for prop in props:
-                if prop.name in self.model:
-                    model_prop = self.model[prop.name]
-                    # The information must be missing, we don't want to overwrite it accidentally:
-                    if prop.datatype is not None and prop.datatype != model_prop.datatype:
-                        # breakpoint()
-                        raise RuntimeError("datatype must not be set, here. This is probably a bug.")
-                    if prop.unit is not None and prop.unit != model_prop.unit:
-                        # continue
-                        raise RuntimeError("unit must not be set, here. This is probably a bug.")
-                    if prop.description is not None and prop.description != model_prop.description:
-                        # continue
-                        raise RuntimeError("description must not be set, here. This is probably a bug.")
-
-                    # If this property has a more detailed definition in the model,
-                    # copy over the information:
-
-                    if isinstance(model_prop, db.RecordType):
-                        # in this case the datatype equals the name of the record type:
-                        prop.datatype = prop.name
-                    else:
-                        prop.datatype = model_prop.datatype
-                        prop.unit = model_prop.unit
-                        prop.description = model_prop.description
+        # for name, ent in self.model.items():
+        #     if not isinstance(ent, db.RecordType):
+        #         continue
+        #     props = ent.get_properties()
+        #     for prop in props:
+        #         if prop.name in self.model:
+        #             model_prop = self.model[prop.name]
+        #             # The information must be missing, we don't want to overwrite it accidentally:
+        #             if prop.datatype is not None and prop.datatype != model_prop.datatype:
+        #                 # breakpoint()
+        #                 raise RuntimeError("datatype must not be set, here. This is probably a bug.")
+        #             if prop.unit is not None and prop.unit != model_prop.unit:
+        #                 # continue
+        #                 raise RuntimeError("unit must not be set, here. This is probably a bug.")
+        #             if prop.description is not None and prop.description != model_prop.description:
+        #                 # continue
+        #                 raise RuntimeError("description must not be set, here. This is probably a bug.")
+        #
+        #             # If this property has a more detailed definition in the model,
+        #             # copy over the information:
+        #
+        #             if isinstance(model_prop, db.RecordType):
+        #                 # in this case the datatype equals the name of the record type:
+        #                 prop.datatype = prop.name
+        #             else:
+        #                 prop.datatype = model_prop.datatype
+        #                 prop.unit = model_prop.unit
+        #                 prop.description = model_prop.description
 
         return DataModel(self.model.values())
 
diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index 574b41da..56c8672b 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -27,6 +27,8 @@ from caosadvancedtools.models.parser import (TwiceDefinedException,
                                              parse_model_from_string,
                                              parse_model_from_yaml)
 
+from unittests.mock import Mock
+
 from linkahead.apiutils import compare_entities
 
 
@@ -645,7 +647,7 @@ RT2:
 }"""
 
 
-def test_comparison_yaml_model():
+def test_comparison_yaml_model(capfd):
     """
     Test for this issue:
     https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/130
@@ -707,7 +709,24 @@ test_reference:
     c2 = compare_entities(model["RT1"], entities[1])
     c3 = compare_entities(model["RT2"], entities[2])
     c4 = compare_entities(model["test_reference"], entities[3])
+    for cs in (c1, c2, c3, c4):
+        assert "id" not in cs[0]
+        assert "id" in cs[1]
+
+    mq = Mock()
+    def mq_init(self, query):
+        self.query = query
+
+    def mq_execute(self, unique=True):
+        pass
+
+    mq.__init__ = mq_init
+    mq.execute.side_effect = mq_execute
 
+    caosadvancedtools.models.parser.db.Query = mq
 
+    model.sync_data_model(True, True)
 
+    stdout, stderr = capfd.readouterr()
 
+  # TODO: test that there were no changes required
-- 
GitLab


From ba2c56a885b3710e6432ae4d342e46292400ddac Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 5 Nov 2024 11:59:15 +0100
Subject: [PATCH 025/106] STY: Docstring indentation

---
 .../table_json_conversion/convert.py          | 199 +++++++++---------
 1 file changed, 99 insertions(+), 100 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index 09882f96..48a0f676 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -55,10 +55,9 @@ class ForeignError(KeyError):
 class XLSXConverter:
     """Class for conversion from XLSX to JSON.
 
-For a detailed description of the required formatting of the XLSX files, see ``specs.md`` in the
-documentation.
+    For a detailed description of the required formatting of the XLSX files, see ``specs.md`` in the
+    documentation.
     """
-
     PARSER: dict[str, Callable] = {
         "string": str,
         "number": float,
@@ -69,17 +68,17 @@ documentation.
     def __init__(self, xlsx: Union[str, BinaryIO], schema: Union[dict, str, TextIO],
                  strict: bool = False):
         """
-Parameters
-----------
-xlsx: Union[str, BinaryIO]
-  Path to the XLSX file or opened file object.
+        Parameters
+        ----------
+        xlsx: Union[str, BinaryIO]
+          Path to the XLSX file or opened file object.
 
-schema: Union[dict, str, TextIO]
-  Schema for validation of XLSX content.
+        schema: Union[dict, str, TextIO]
+          Schema for validation of XLSX content.
 
-strict: bool, optional
-  If True, fail faster.
-"""
+        strict: bool, optional
+          If True, fail faster.
+        """
         self._workbook = load_workbook(xlsx)
         self._schema = read_or_dict(schema)
         self._defining_path_index = xlsx_utils.get_defining_paths(self._workbook)
@@ -91,20 +90,20 @@ strict: bool, optional
     def to_dict(self, validate: bool = False, collect_errors: bool = True) -> dict:
         """Convert the xlsx contents to a dict.
 
-Parameters
-----------
-validate: bool, optional
-  If True, validate the result against the schema.
+        Parameters
+        ----------
+        validate: bool, optional
+          If True, validate the result against the schema.
 
-collect_errors: bool, optional
-  If True, do not fail at the first error, but try to collect as many errors as possible.  After an
-  Exception is raised, the errors can be collected with ``get_errors()`` and printed with
-  ``get_error_str()``.
+        collect_errors: bool, optional
+          If True, do not fail at the first error, but try to collect as many errors as possible.  After an
+          Exception is raised, the errors can be collected with ``get_errors()`` and printed with
+          ``get_error_str()``.
 
-Returns
--------
-out: dict
-  A dict representing the JSON with the extracted data.
+        Returns
+        -------
+        out: dict
+          A dict representing the JSON with the extracted data.
         """
         self._handled_sheets = set()
         self._result = {}
@@ -177,17 +176,17 @@ out: dict
     def _handle_sheet(self, sheet: Worksheet, fail_later: bool = False) -> None:
         """Add the contents of the sheet to the result (stored in ``self._result``).
 
-Each row in the sheet corresponds to one entry in an array in the result.  Which array exactly is
-defined by the sheet's "proper name" and the content of the foreign columns.
+        Each row in the sheet corresponds to one entry in an array in the result.  Which array exactly is
+        defined by the sheet's "proper name" and the content of the foreign columns.
 
-Look at ``xlsx_utils.get_path_position`` for the specification of the "proper name".
+        Look at ``xlsx_utils.get_path_position`` for the specification of the "proper name".
 
 
-Parameters
-----------
-fail_later: bool, optional
-  If True, do not fail with unresolvable foreign definitions, but collect all errors.
-"""
+        Parameters
+        ----------
+        fail_later: bool, optional
+          If True, do not fail with unresolvable foreign definitions, but collect all errors.
+        """
         row_type_column = xlsx_utils.get_row_type_column_index(sheet)
         foreign_columns = xlsx_utils.get_foreign_key_columns(sheet)
         foreign_column_paths = {col.index: col.path for col in foreign_columns.values()}
@@ -267,9 +266,9 @@ fail_later: bool, optional
     def _get_parent_dict(self, parent_path: list[str], foreign: list[list]) -> dict:
         """Return the dict into which values can be inserted.
 
-This method returns, from the current result-in-making, the entry at ``parent_path`` which matches
-the values given in the ``foreign`` specification.
-"""
+        This method returns, from the current result-in-making, the entry at ``parent_path`` which matches
+        the values given in the ``foreign`` specification.
+        """
         foreign_groups = _group_foreign_paths(foreign, common=parent_path)
 
         current_object = self._result
@@ -296,9 +295,9 @@ the values given in the ``foreign`` specification.
     def _validate_and_convert(self, value: Any, path: list[str]):
         """Apply some basic validation and conversion steps.
 
-This includes:
-- Validation against the type given in the schema
-- List typed values are split at semicolons and validated individually
+        This includes:
+        - Validation against the type given in the schema
+        - List typed values are split at semicolons and validated individually
         """
         if value is None:
             return value
@@ -340,29 +339,29 @@ This includes:
 def _group_foreign_paths(foreign: list[list], common: list[str]) -> list[SimpleNamespace]:
     """Group the foreign keys by their base paths.
 
-Parameters
-----------
-foreign: list[list]
-  A list of foreign definitions, consisting of path components, property and possibly value.
-
-common: list[list[str]]
-  A common path which defines the final target of the foreign definitions.  This helps to understand
-  where the ``foreign`` paths shall be split.
-
-Returns
--------
-out: list[dict[str, list[list]]]
-
-  A list of foreign path segments, grouped by their common segments.  Each element is a namespace
-  with detailed information of all those elements which form the group.  The namespace has the
-  following attributes:
-
-  - ``path``: The full path to this path segment.  This is always the previous segment's ``path``
-    plus this segment's ``subpath``.
-  - ``stringpath``: The stringified ``path``, might be useful for comparison or sorting.
-  - ``subpath``: The path, relative from the previous segment.
-  - ``definitions``: A list of the foreign definitions for this segment, but stripped of the
-    ``path`` components.
+    Parameters
+    ----------
+    foreign: list[list]
+      A list of foreign definitions, consisting of path components, property and possibly value.
+
+    common: list[list[str]]
+      A common path which defines the final target of the foreign definitions.  This helps to understand
+      where the ``foreign`` paths shall be split.
+
+    Returns
+    -------
+    out: list[dict[str, list[list]]]
+
+      A list of foreign path segments, grouped by their common segments.  Each element is a namespace
+      with detailed information of all those elements which form the group.  The namespace has the
+      following attributes:
+
+      - ``path``: The full path to this path segment.  This is always the previous segment's ``path``
+        plus this segment's ``subpath``.
+      - ``stringpath``: The stringified ``path``, might be useful for comparison or sorting.
+      - ``subpath``: The path, relative from the previous segment.
+      - ``definitions``: A list of the foreign definitions for this segment, but stripped of the
+        ``path`` components.
     """
     # Build a simple dict first, without subpath.
     results = {}
@@ -405,31 +404,31 @@ def _set_in_nested(mydict: dict, path: list, value: Any, prefix: list = [], skip
                    overwrite: bool = False, append_to_list: bool = False) -> dict:
     """Set a value in a nested dict.
 
-Parameters
-----------
-mydict: dict
-  The dict into which the ``value`` shall be inserted.
-path: list
-  A list of keys, denoting the location of the value.
-value
-  The value which shall be set inside the dict.
-prefix: list
-  A list of keys which shall be removed from ``path``.  A KeyError is raised if ``path`` does not
-  start with the elements of ``prefix``.
-skip: int = 0
-  Remove this many additional levels from the path, *after* removing the prefix.
-overwrite: bool = False
-  If True, allow overwriting existing content. Otherwise, attempting to overwrite existing values
-  leads to an exception.
-append_to_list: bool = False
-  If True, assume that the element at ``path`` is a list and append the value to it.  If the list
-  does not exist, create it.  If there is a non-list at ``path`` already, overwrite it with a new
-  list, if ``overwrite`` is True, otherwise raise a ValueError.
-
-Returns
--------
-mydict: dict
-  The same dictionary that was given as a parameter, but modified.
+    Parameters
+    ----------
+    mydict: dict
+      The dict into which the ``value`` shall be inserted.
+    path: list
+      A list of keys, denoting the location of the value.
+    value
+      The value which shall be set inside the dict.
+    prefix: list
+      A list of keys which shall be removed from ``path``.  A KeyError is raised if ``path`` does not
+      start with the elements of ``prefix``.
+    skip: int = 0
+      Remove this many additional levels from the path, *after* removing the prefix.
+    overwrite: bool = False
+      If True, allow overwriting existing content. Otherwise, attempting to overwrite existing values
+      leads to an exception.
+    append_to_list: bool = False
+      If True, assume that the element at ``path`` is a list and append the value to it.  If the list
+      does not exist, create it.  If there is a non-list at ``path`` already, overwrite it with a new
+      list, if ``overwrite`` is True, otherwise raise a ValueError.
+
+    Returns
+    -------
+    mydict: dict
+      The same dictionary that was given as a parameter, but modified.
     """
     for idx, el in enumerate(prefix):
         if path[idx] != el:
@@ -473,25 +472,25 @@ def to_dict(xlsx: Union[str, BinaryIO], schema: Union[dict, str, TextIO],
             validate: bool = None, strict: bool = False) -> dict:
     """Convert the xlsx contents to a dict, it must follow a schema.
 
-Parameters
-----------
-xlsx: Union[str, BinaryIO]
-  Path to the XLSX file or opened file object.
+    Parameters
+    ----------
+    xlsx: Union[str, BinaryIO]
+      Path to the XLSX file or opened file object.
 
-schema: Union[dict, str, TextIO]
-  Schema for validation of XLSX content.
+    schema: Union[dict, str, TextIO]
+      Schema for validation of XLSX content.
 
-validate: bool, optional
-  If True, validate the result against the schema.
+    validate: bool, optional
+      If True, validate the result against the schema.
 
-strict: bool, optional
-  If True, fail faster.
+    strict: bool, optional
+      If True, fail faster.
 
 
-Returns
--------
-out: dict
-  A dict representing the JSON with the extracted data.
+    Returns
+    -------
+    out: dict
+      A dict representing the JSON with the extracted data.
     """
     converter = XLSXConverter(xlsx, schema, strict=strict)
     return converter.to_dict()
-- 
GitLab


From 26079795e14165e121690918dfda69147be9652b Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Thu, 7 Nov 2024 14:30:37 +0100
Subject: [PATCH 026/106] STY: Docstring indentation

---
 .../table_json_conversion/xlsx_utils.py       | 158 +++++++++---------
 1 file changed, 79 insertions(+), 79 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/xlsx_utils.py b/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
index 5002f3ac..3cb2de68 100644
--- a/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
+++ b/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
@@ -68,22 +68,22 @@ class RowType(Enum):
 def array_schema_from_model_schema(model_schema: dict) -> dict:
     """Convert a *data model* schema to a *data array* schema.
 
-Practically, this means that the top level properties are converted into lists.  In a simplified
-notation, this can be expressed as:
-
-``array_schema = { elem: [elem typed data...] for elem in model_schema }``
-
-Parameters
-----------
-model_schema: dict
-  The schema description of the data model.  Must be a json schema *object*, with a number of
-  *object* typed properties.
-
-Returns
--------
-array_schema: dict
-  A corresponding json schema, where the properties are arrays with the types of the input's
-  top-level properties.
+    Practically, this means that the top level properties are converted into lists.  In a simplified
+    notation, this can be expressed as:
+
+    ``array_schema = { elem: [elem typed data...] for elem in model_schema }``
+
+    Parameters
+    ----------
+    model_schema: dict
+      The schema description of the data model.  Must be a json schema *object*, with a number of
+      *object* typed properties.
+
+    Returns
+    -------
+    array_schema: dict
+      A corresponding json schema, where the properties are arrays with the types of the input's
+      top-level properties.
     """
     assert model_schema["type"] == "object"
     result = deepcopy(model_schema)
@@ -100,30 +100,30 @@ array_schema: dict
 def get_defining_paths(workbook: Workbook) -> dict[str, list[list[str]]]:
     """For all sheets in ``workbook``, list the paths which they define.
 
-A sheet is said to define a path, if it has data columns for properties inside that path.  For
-example, consider the following worksheet:
-
-| `COL_TYPE` | `SCALAR`       | `SCALAR`      | `LIST`       | `SCALAR`           |
-| `PATH`     | `Training`     | `Training`    | `Training`   | `Training`         |
-| `PATH`     | `url`          | `date`        | `subjects`   | `supervisor`       |
-| `PATH`     |                |               |              | `email`            |
-|------------|----------------|---------------|--------------|--------------------|
-|            | example.com/mp | 2024-02-27    | Math;Physics | steve@example.com  |
-|            | example.com/m  | 2024-02-27    | Math         | stella@example.com |
-
-This worksheet defines properties for the paths `["Training"]` and `["Training", "supervisor"]`, and
-thus these two path lists would be returned for the key with this sheet's sheetname.
-
-Parameters
-----------
-workbook: Workbook
-  The workbook to analyze.
-
-Returns
--------
-out: dict[str, list[list[str]]
-  A dict with worksheet names as keys and lists of paths (represented as string lists) as values.
-"""
+    A sheet is said to define a path, if it has data columns for properties inside that path.  For
+    example, consider the following worksheet:
+
+    | `COL_TYPE` | `SCALAR`       | `SCALAR`      | `LIST`       | `SCALAR`           |
+    | `PATH`     | `Training`     | `Training`    | `Training`   | `Training`         |
+    | `PATH`     | `url`          | `date`        | `subjects`   | `supervisor`       |
+    | `PATH`     |                |               |              | `email`            |
+    |------------|----------------|---------------|--------------|--------------------|
+    |            | example.com/mp | 2024-02-27    | Math;Physics | steve@example.com  |
+    |            | example.com/m  | 2024-02-27    | Math         | stella@example.com |
+
+    This worksheet defines properties for the paths `["Training"]` and `["Training", "supervisor"]`, and
+    thus these two path lists would be returned for the key with this sheet's sheetname.
+
+    Parameters
+    ----------
+    workbook: Workbook
+      The workbook to analyze.
+
+    Returns
+    -------
+    out: dict[str, list[list[str]]
+      A dict with worksheet names as keys and lists of paths (represented as string lists) as values.
+    """
     result: dict[str, list[list[str]]] = {}
     for sheet in workbook.worksheets:
         paths = []
@@ -140,11 +140,11 @@ out: dict[str, list[list[str]]
 def get_data_columns(sheet: Worksheet) -> dict[str, SimpleNamespace]:
     """Return the data paths of the worksheet.
 
-Returns
--------
-out: dict[str, SimpleNamespace]
-  The keys are the stringified paths.  The values are SimpleNamespace objects with ``index``,
-  ``path`` and ``column`` attributes.
+    Returns
+    -------
+    out: dict[str, SimpleNamespace]
+      The keys are the stringified paths.  The values are SimpleNamespace objects with ``index``,
+      ``path`` and ``column`` attributes.
     """
     column_types = _get_column_types(sheet)
     path_rows = get_path_rows(sheet)
@@ -171,11 +171,11 @@ out: dict[str, SimpleNamespace]
 def get_foreign_key_columns(sheet: Worksheet) -> dict[str, SimpleNamespace]:
     """Return the foreign keys of the worksheet.
 
-Returns
--------
-out: dict[str, SimpleNamespace]
-  The keys are the stringified paths.  The values are SimpleNamespace objects with ``index``,
-  ``path`` and ``column`` attributes.
+    Returns
+    -------
+    out: dict[str, SimpleNamespace]
+      The keys are the stringified paths.  The values are SimpleNamespace objects with ``index``,
+      ``path`` and ``column`` attributes.
     """
     column_types = _get_column_types(sheet)
     path_rows = get_path_rows(sheet)
@@ -198,20 +198,20 @@ out: dict[str, SimpleNamespace]
 def get_path_position(sheet: Worksheet) -> tuple[list[str], str]:
     """Return a path which represents the parent element, and the sheet's "proper name".
 
-For top-level sheets / entries (those without foreign columns), the path is an empty list.
+    For top-level sheets / entries (those without foreign columns), the path is an empty list.
 
-A sheet's "proper name" is detected from the data column paths: it is the first component after the
-parent components.
+    A sheet's "proper name" is detected from the data column paths: it is the first component after the
+    parent components.
 
-Returns
--------
-parent: list[str]
-  Path to the parent element.  Note that there may be list elements on the path which are **not**
-  represented in this return value.
+    Returns
+    -------
+    parent: list[str]
+      Path to the parent element.  Note that there may be list elements on the path which are **not**
+      represented in this return value.
 
-proper_name: str
-  The "proper name" of this sheet.  This defines an array where all the data lives, relative to the
-  parent path.
+    proper_name: str
+      The "proper name" of this sheet.  This defines an array where all the data lives, relative to the
+      parent path.
     """
     # Parent element: longest common path shared among any foreign column and all the data columns
     parent: list[str] = []
@@ -285,7 +285,7 @@ def is_exploded_sheet(sheet: Worksheet) -> bool:
     """Return True if this is a an "exploded" sheet.
 
     An exploded sheet is a sheet whose data entries are LIST valued properties of entries in another
-    sheet.  A sheet is detected as exploded iff it has FOREIGN columns.
+    sheet.  A sheet is detected as exploded if it has FOREIGN columns.
     """
     column_types = _get_column_types(sheet)
     return ColumnType.FOREIGN.name in column_types.values()
@@ -308,22 +308,22 @@ def p2s(path: list[str]) -> str:
 def parse_multiple_choice(value: Any) -> bool:
     """Interpret ``value`` as a multiple choice input.
 
-*Truthy* values are:
-- The boolean ``True``.
-- The number "1".
-- The (case-insensitive) strings ``true``, ``wahr``, ``x``, ``√``, ``yes``, ``ja``, ``y``, ``j``.
-
-*Falsy* values are:
-- The boolean ``False``.
-- ``None``, empty strings, lists, dicts.
-- The number "0".
-- The (case-insensitive) strings ``false``, ``falsch``, ``-``, ``no``, ``nein``, ``n``.
-- Everything else.
-
-Returns
--------
-out: bool
-  The interpretation result of ``value``.
+    *Truthy* values are:
+    - The boolean ``True``.
+    - The number "1".
+    - The (case-insensitive) strings ``true``, ``wahr``, ``x``, ``√``, ``yes``, ``ja``, ``y``, ``j``.
+
+    *Falsy* values are:
+    - The boolean ``False``.
+    - ``None``, empty strings, lists, dicts.
+    - The number "0".
+    - The (case-insensitive) strings ``false``, ``falsch``, ``-``, ``no``, ``nein``, ``n``.
+    - Everything else.
+
+    Returns
+    -------
+    out: bool
+      The interpretation result of ``value``.
     """
     # Non-string cases first:
     # pylint: disable-next=too-many-boolean-expressions
@@ -349,7 +349,7 @@ out: bool
 
 def read_or_dict(data: Union[dict, str, TextIO]) -> dict:
     """If data is a json file name or input stream, read data from there.
-If it is a dict already, just return it."""
+    If it is a dict already, just return it."""
     if isinstance(data, dict):
         return data
 
-- 
GitLab


From 5ceee474254b96a769ce908d307e9bc9efd9a2ae Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 12 Nov 2024 09:42:52 +0100
Subject: [PATCH 027/106] ENH: convert.to_dict() now outputs encountered type
 errors in a table

---
 .../table_json_conversion/convert.py          | 182 ++++++++++++++----
 .../data/simple_data_broken.xlsx              | Bin 0 -> 8982 bytes
 .../table_json_conversion/test_read_xlsx.py   |  21 ++
 3 files changed, 170 insertions(+), 33 deletions(-)
 create mode 100644 unittests/table_json_conversion/data/simple_data_broken.xlsx

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index 48a0f676..e874c535 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -46,6 +46,114 @@ def _strict_bool(value: Any) -> bool:
     raise TypeError(f"Not a good boolean: {repr(value)}")
 
 
+def format_exception_table(exceptions: list(tuple), worksheet_title: str,
+                           column_names: Optional[dict, list] = None,
+                           max_line_length: Optional[int] = 120) -> str:
+    """
+    Given a list of tuples containing a row and column number as well as an
+    exception in that order, and the title of the current worksheet, returns
+    a formatted table of the exceptions.
+
+    Optionally takes a dict of column names, if given a header will be
+    generated for each column and exceptions will be clustered by column.
+
+    Default line length is 120 and can be overwritten by max_line_length.
+
+    Params
+    ------
+    exceptions:         list of tuples containing row, column, and exception
+                        Data to be formatted
+    worksheet_title:    str
+                        Name of the current worksheet
+    column_names:       dict or list, optional
+                        column_names[column_num] should return the name of
+                        column column_names.
+                        If given, exceptions will be clustered by column.
+    max_line_length:    int
+                        Soft cap for the line length of the resulting table
+
+    Return
+    ------
+    string_rep:         str
+                        Table containing the given exceptions
+    """
+    def to_char(num):
+        if num < 0:
+            return ""
+        return to_char(int(num / 26) - 1) + chr(int(num % 26) + 65)
+    max_line_length -= 40             # Estimate of Field + Type space use
+
+    headers = {"loc": "Field", "type": "Error Type", "mess": ["Message"]}
+    lengths = {key: len(headers[key]) for key in headers}
+    new_data = []
+
+    current_column = None
+    exceptions.sort(key=lambda tup: tup[1])
+    for row_i, col_i, excep in exceptions:
+        if column_names is not None:
+            # Update Names
+            if current_column != col_i:
+                current_column = col_i
+                new_data.append({
+                    "loc": f"\nErrors in column '{column_names[col_i]}':",
+                    "type": "", "mess": [""]
+                })
+        # Setup
+        row = {}
+        new_data.append(row)
+        # Field
+        if isinstance(row_i, int):
+            row["loc"] = f"{to_char(col_i)}{row_i + 1}"
+        else:
+            row["loc"] = f"{to_char(col_i)}"
+        lengths["loc"] = max(lengths["loc"], len(row["loc"]))
+        # Code
+        row["type"] = type(excep).__name__
+        lengths["type"] = max(lengths["type"], len(row["type"]))
+        # Message
+        lines = str(excep).split('\n')
+        new_lines = []
+        for line in lines:
+            if len(line) > max_line_length:
+                words = line.split(' ')
+                current = ""
+                for word, next_word in zip(words, words[1:] + [""]):
+                    if current != "":
+                        current += " "
+                    current += word
+                    if len(current + next_word) > max_line_length:
+                        lengths["mess"] = max(lengths["mess"], len(current))
+                        new_lines.append(current)
+                        current = ""
+                if current != "":
+                    lengths["mess"] = max(lengths["mess"], len(current))
+                    new_lines.append(current)
+            elif len(line) > 0:
+                lengths["mess"] = max(lengths["mess"], len(line))
+                new_lines.append(line)
+        if new_lines == []:
+            new_lines = [""]
+        row["mess"] = new_lines
+
+    dividers = {key: '–' * l for key, l in lengths.items()}
+    dividers["mess"] = [dividers["mess"]]
+
+    # Fill for the messages is set to 0, if we want another column or align
+    # right we need to use lengths["mess"]
+    string_rep = f"There were failures during validation of worksheet '{worksheet_title}':\n\n"
+    for row in [headers, dividers] + new_data:
+        string_rep += ' {loc: <{fill}}  '.format(loc=row["loc"],
+                                                 fill=lengths["loc"])
+        string_rep += ' {typ: <{fill}}  '.format(typ=row["type"],
+                                                 fill=lengths["type"])
+        string_rep += ' {mes: <{fill}}\n'.format(mes=row["mess"][0], fill=0)
+        for line in row["mess"][1:]:
+            # Front padding
+            string_rep += ' ' * (lengths["loc"] + lengths["type"] + 7)
+            string_rep += ' {mes: <{fill}}\n'.format(mes=line, fill=0)
+    return string_rep
+
+
 class ForeignError(KeyError):
     def __init__(self, *args, definitions: list, message: str = ""):
         super().__init__(message, *args)
@@ -205,9 +313,13 @@ class XLSXConverter:
         # # - data: The actual data of this entry, a dict.
         # entries: dict[str, list[SimpleNamespace]] = {}
 
+        exceptions = []
+        col_names = None
         for row_idx, row in enumerate(sheet.iter_rows(values_only=True)):
-            # Skip non-data rows.
+            # Skip non-data rows and save the row containing column names
             if row[row_type_column] is not None:
+                if row[row_type_column] == "IGNORE" and col_names is None:
+                    col_names = row
                 continue
             foreign_repr = ""
             foreign = []  # A list of lists, each of which is: [path1, path2, ..., leaf, value]
@@ -219,24 +331,27 @@ class XLSXConverter:
                     foreign.append(foreign_column_paths[col_idx] + [value])
                     continue
 
-                if col_idx in data_column_paths:
-                    path = data_column_paths[col_idx]
-                    if self._is_multiple_choice(path):
-                        real_value = path.pop()  # Last component is the enum value, insert above
-                        # set up list
-                        try:
-                            _set_in_nested(mydict=data, path=path, value=[], prefix=parent, skip=1)
-                        except ValueError as err:
-                            if not str(err).startswith("There is already some value at"):
-                                raise
-                        if not xlsx_utils.parse_multiple_choice(value):
-                            continue
-                        _set_in_nested(mydict=data, path=path, value=real_value, prefix=parent,
-                                       skip=1, append_to_list=True)
-                    else:
-                        value = self._validate_and_convert(value, path)
-                        _set_in_nested(mydict=data, path=path, value=value, prefix=parent, skip=1)
-                    continue
+                try:
+                    if col_idx in data_column_paths:
+                        path = data_column_paths[col_idx]
+                        if self._is_multiple_choice(path):
+                            real_value = path.pop()  # Last component is the enum value, insert above
+                            # set up list
+                            try:
+                                _set_in_nested(mydict=data, path=path, value=[], prefix=parent, skip=1)
+                            except ValueError as err:
+                                if not str(err).startswith("There is already some value at"):
+                                    raise
+                            if not xlsx_utils.parse_multiple_choice(value):
+                                continue
+                            _set_in_nested(mydict=data, path=path, value=real_value, prefix=parent,
+                                           skip=1, append_to_list=True)
+                        else:
+                            value = self._validate_and_convert(value, path)
+                            _set_in_nested(mydict=data, path=path, value=value, prefix=parent, skip=1)
+                        continue
+                except (ValueError, jsonschema.ValidationError) as e:
+                    exceptions.append((row_idx, col_idx, e))
 
             try:
                 # Find current position in tree
@@ -250,6 +365,12 @@ class XLSXConverter:
                 if not fail_later:
                     raise
                 self._errors[(sheet.title, row_idx)] = kerr.definitions
+
+        if exceptions != []:
+            exception_table = format_exception_table(exceptions, sheet.title,
+                                                     col_names)
+            raise jsonschema.ValidationError(exception_table)
+
         self._handled_sheets.add(sheet.title)
 
     def _is_multiple_choice(self, path: list[str]) -> bool:
@@ -308,20 +429,15 @@ class XLSXConverter:
             if isinstance(value, str) and ";" in value:
                 values = [self.PARSER[array_type](v) for v in value.split(";")]
                 return values
-        try:
-            # special case: datetime or date
-            if ("anyOf" in subschema):
-                if isinstance(value, datetime.datetime) and (
-                        {'type': 'string', 'format': 'date-time'} in subschema["anyOf"]):
-                    return value
-                if isinstance(value, datetime.date) and (
-                        {'type': 'string', 'format': 'date'} in subschema["anyOf"]):
-                    return value
-            jsonschema.validate(value, subschema)
-        except jsonschema.ValidationError as verr:
-            print(verr)
-            print(path)
-            raise
+        # special case: datetime or date
+        if ("anyOf" in subschema):
+            if isinstance(value, datetime.datetime) and (
+                    {'type': 'string', 'format': 'date-time'} in subschema["anyOf"]):
+                return value
+            if isinstance(value, datetime.date) and (
+                    {'type': 'string', 'format': 'date'} in subschema["anyOf"]):
+                return value
+        jsonschema.validate(value, subschema)
 
         # Finally: convert to target type
         return self.PARSER[subschema.get("type", "string")](value)
diff --git a/unittests/table_json_conversion/data/simple_data_broken.xlsx b/unittests/table_json_conversion/data/simple_data_broken.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..361953f660f12cb37d979ff3b4c49895265131e3
GIT binary patch
literal 8982
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

literal 0
HcmV?d00001

diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index 0eec2e9c..6ee744ef 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -27,6 +27,7 @@ import re
 
 from types import SimpleNamespace
 
+import jsonschema
 import pytest
 from caosadvancedtools.table_json_conversion import convert
 
@@ -112,6 +113,26 @@ def test_missing_columns():
         assert expected in messages
 
 
+def test_wrong_datatype():
+    with pytest.raises(jsonschema.ValidationError) as caught:
+        convert.to_dict(xlsx=rfp("data/simple_data_broken.xlsx"),
+                        schema=rfp("data/simple_schema.json"))
+    # Correct Errors
+    assert "'Not a num' is not of type 'number'" in str(caught.value)
+    assert "1.5 is not of type 'integer'" in str(caught.value)
+    # Correct Locations
+    for line in str(caught.value).split('\n'):
+        if "'Not a num' is not of type 'number'" in line:
+            assert "J7" in line
+        if "1.5 is not of type 'integer'" in line:
+            assert "K7" in line
+    # No additional type errors
+    if "is not of type 'boolean'" in str(caught.value):   # ToDo: Remove when boolean is fixed
+        assert str(caught.value).count("is not of type") == 3
+    else:
+        assert str(caught.value).count("is not of type") == 2
+
+
 def test_faulty_foreign():
     # Simple wrong foreign key
     converter = convert.XLSXConverter(xlsx=rfp("data/simple_data_wrong_foreign.xlsx"),
-- 
GitLab


From 3b55e553fbde2c2ec36c54ef038ee174d8a3494d Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 12 Nov 2024 10:48:49 +0100
Subject: [PATCH 028/106] ENH: Added error message to convert.to_dict() when
 trying to parse a column not in the schema

---
 .../table_json_conversion/convert.py          | 30 ++++++++++++-------
 .../table_json_conversion/test_read_xlsx.py   | 14 +++++++++
 2 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index e874c535..84e3b954 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -83,7 +83,7 @@ def format_exception_table(exceptions: list(tuple), worksheet_title: str,
         return to_char(int(num / 26) - 1) + chr(int(num % 26) + 65)
     max_line_length -= 40             # Estimate of Field + Type space use
 
-    headers = {"loc": "Field", "type": "Error Type", "mess": ["Message"]}
+    headers = {"loc": "Location", "type": "Error Type", "mess": ["Message"]}
     lengths = {key: len(headers[key]) for key in headers}
     new_data = []
 
@@ -103,9 +103,9 @@ def format_exception_table(exceptions: list(tuple), worksheet_title: str,
         new_data.append(row)
         # Field
         if isinstance(row_i, int):
-            row["loc"] = f"{to_char(col_i)}{row_i + 1}"
+            row["loc"] = f"Cell {to_char(col_i)}{row_i + 1}"
         else:
-            row["loc"] = f"{to_char(col_i)}"
+            row["loc"] = f"Column {to_char(col_i)}"
         lengths["loc"] = max(lengths["loc"], len(row["loc"]))
         # Code
         row["type"] = type(excep).__name__
@@ -140,7 +140,7 @@ def format_exception_table(exceptions: list(tuple), worksheet_title: str,
 
     # Fill for the messages is set to 0, if we want another column or align
     # right we need to use lengths["mess"]
-    string_rep = f"There were failures during validation of worksheet '{worksheet_title}':\n\n"
+    string_rep = f"There were errors during the validation of worksheet '{worksheet_title}':\n\n"
     for row in [headers, dividers] + new_data:
         string_rep += ' {loc: <{fill}}  '.format(loc=row["loc"],
                                                  fill=lengths["loc"])
@@ -314,12 +314,10 @@ class XLSXConverter:
         # entries: dict[str, list[SimpleNamespace]] = {}
 
         exceptions = []
-        col_names = None
+        col_names = {}
         for row_idx, row in enumerate(sheet.iter_rows(values_only=True)):
-            # Skip non-data rows and save the row containing column names
+            # Skip non-data rows
             if row[row_type_column] is not None:
-                if row[row_type_column] == "IGNORE" and col_names is None:
-                    col_names = row
                 continue
             foreign_repr = ""
             foreign = []  # A list of lists, each of which is: [path1, path2, ..., leaf, value]
@@ -334,6 +332,7 @@ class XLSXConverter:
                 try:
                     if col_idx in data_column_paths:
                         path = data_column_paths[col_idx]
+                        col_names[col_idx] = '.'.join(path)
                         if self._is_multiple_choice(path):
                             real_value = path.pop()  # Last component is the enum value, insert above
                             # set up list
@@ -350,8 +349,14 @@ class XLSXConverter:
                             value = self._validate_and_convert(value, path)
                             _set_in_nested(mydict=data, path=path, value=value, prefix=parent, skip=1)
                         continue
-                except (ValueError, jsonschema.ValidationError) as e:
-                    exceptions.append((row_idx, col_idx, e))
+                except (ValueError, KeyError, jsonschema.ValidationError) as e:
+                    # Append error for entire column only once
+                    if isinstance(e, KeyError) and 'column' in str(e):
+                        if len([err for ri, ci, err in exceptions
+                                if ci == col_idx and isinstance(err, KeyError)]) == 0:
+                            exceptions.append((None, col_idx, e))
+                    else:
+                        exceptions.append((row_idx, col_idx, e))
 
             try:
                 # Find current position in tree
@@ -422,7 +427,10 @@ class XLSXConverter:
         """
         if value is None:
             return value
-        subschema = self._get_subschema(path)
+        try:
+            subschema = self._get_subschema(path)
+        except KeyError as e:
+            raise KeyError("There is no entry in the schema that corresponds to this column.")
         # Array handling only if schema says it's an array.
         if subschema.get("type") == "array":
             array_type = subschema["items"]["type"]
diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index 6ee744ef..897cd10b 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -133,6 +133,20 @@ def test_wrong_datatype():
         assert str(caught.value).count("is not of type") == 2
 
 
+def test_additional_column():
+    with pytest.raises(jsonschema.ValidationError) as caught:
+        convert.to_dict(xlsx=rfp("data/simple_data_broken.xlsx"),
+                        schema=rfp("data/simple_schema.json"))
+    # Correct Error
+    assert "no entry in the schema that corresponds to this column" in str(caught.value)
+    # Correct Location
+    for line in str(caught.value).split('\n'):
+        if "no entry in the schema that corresponds to this column" in line:
+            assert " M " in line
+    # No additional column errors
+    assert str(caught.value).count("no entry in the schema that corresponds to this column") == 1
+
+
 def test_faulty_foreign():
     # Simple wrong foreign key
     converter = convert.XLSXConverter(xlsx=rfp("data/simple_data_wrong_foreign.xlsx"),
-- 
GitLab


From 7d4e51cdd74552cb54c0ca557dc0aea599d1401b Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 12 Nov 2024 11:34:53 +0100
Subject: [PATCH 029/106] STY: Style fixes

---
 src/caosadvancedtools/table_json_conversion/convert.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index 84e3b954..1f87bc7f 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -28,7 +28,7 @@ import sys
 from functools import reduce
 from operator import getitem
 from types import SimpleNamespace
-from typing import Any, BinaryIO, Callable, TextIO, Union
+from typing import Any, BinaryIO, Callable, TextIO, Union, Optional
 from warnings import warn
 
 import jsonschema
@@ -430,7 +430,7 @@ class XLSXConverter:
         try:
             subschema = self._get_subschema(path)
         except KeyError as e:
-            raise KeyError("There is no entry in the schema that corresponds to this column.")
+            raise KeyError("There is no entry in the schema that corresponds to this column.") from e
         # Array handling only if schema says it's an array.
         if subschema.get("type") == "array":
             array_type = subschema["items"]["type"]
-- 
GitLab


From 865aa2655b542b8333916f1611269c6e044d98d5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Tue, 12 Nov 2024 12:11:23 +0100
Subject: [PATCH 030/106] FIX: correct argument names

---
 src/caosadvancedtools/models/data_model.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index bda8cad6..3be56002 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -147,8 +147,8 @@ class DataModel(dict):
                     ref = query.execute(unique=True)
                 diff = (describe_diff(*compare_entities(ent, ref),
                                       name=ent.name,
-                                      label_old="version from the yaml file",
-                                      label_new="version from LinkAhead"))
+                                      label_e0="version from the yaml file",
+                                      label_e1="version from LinkAhead"))
 
                 if diff != "":
                     if verbose:
-- 
GitLab


From a6910d390a22d418307f0cfef9a798ab6e05544e Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 12 Nov 2024 12:59:17 +0100
Subject: [PATCH 031/106] MNT: Added a warning when column metadata is not
 configured, and a better error message when a column has a type but no path.

---
 .../table_json_conversion/convert.py          | 35 ++++++++++++-------
 .../table_json_conversion/xlsx_utils.py       | 10 ++++++
 2 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index 1f87bc7f..f650fdd9 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -45,10 +45,16 @@ def _strict_bool(value: Any) -> bool:
         return value
     raise TypeError(f"Not a good boolean: {repr(value)}")
 
-
-def format_exception_table(exceptions: list(tuple), worksheet_title: str,
-                           column_names: Optional[dict, list] = None,
-                           max_line_length: Optional[int] = 120) -> str:
+def _column_id_to_chars(num):
+    """Converts a column id (zero based) to the corresponding string
+    representation, e.g. 0 -> 'A', 97 -> 'CT'"""
+    if num < 0:
+        return ""
+    return _column_id_to_chars(int(num / 26) - 1) + chr(int(num % 26) + 65)
+
+def _format_exception_table(exceptions: list(tuple), worksheet_title: str,
+                            column_names: Optional[dict, list] = None,
+                            max_line_length: Optional[int] = 120) -> str:
     """
     Given a list of tuples containing a row and column number as well as an
     exception in that order, and the title of the current worksheet, returns
@@ -77,10 +83,6 @@ def format_exception_table(exceptions: list(tuple), worksheet_title: str,
     string_rep:         str
                         Table containing the given exceptions
     """
-    def to_char(num):
-        if num < 0:
-            return ""
-        return to_char(int(num / 26) - 1) + chr(int(num % 26) + 65)
     max_line_length -= 40             # Estimate of Field + Type space use
 
     headers = {"loc": "Location", "type": "Error Type", "mess": ["Message"]}
@@ -103,9 +105,9 @@ def format_exception_table(exceptions: list(tuple), worksheet_title: str,
         new_data.append(row)
         # Field
         if isinstance(row_i, int):
-            row["loc"] = f"Cell {to_char(col_i)}{row_i + 1}"
+            row["loc"] = f"Cell {_column_id_to_chars(col_i)}{row_i + 1}"
         else:
-            row["loc"] = f"Column {to_char(col_i)}"
+            row["loc"] = f"Column {_column_id_to_chars(col_i)}"
         lengths["loc"] = max(lengths["loc"], len(row["loc"]))
         # Code
         row["type"] = type(excep).__name__
@@ -296,12 +298,17 @@ class XLSXConverter:
           If True, do not fail with unresolvable foreign definitions, but collect all errors.
         """
         row_type_column = xlsx_utils.get_row_type_column_index(sheet)
+        col_type_row = xlsx_utils.get_column_type_row_index(sheet)
         foreign_columns = xlsx_utils.get_foreign_key_columns(sheet)
         foreign_column_paths = {col.index: col.path for col in foreign_columns.values()}
         data_columns = xlsx_utils.get_data_columns(sheet)
         data_column_paths = {col.index: col.path for col in data_columns.values()}
         # Parent path, insert in correct order.
-        parent, proper_name = xlsx_utils.get_path_position(sheet)
+        try:
+            parent, proper_name = xlsx_utils.get_path_position(sheet)
+        except UnboundLocalError as e:
+            raise jsonschema.ValidationError(f"Malformed metadata: Cannot parse "
+                                             f"paths in worksheet '{sheet.title}'.") from e
         if parent:
             parent_sheetname = xlsx_utils.get_worksheet_for_path(parent, self._defining_path_index)
             if parent_sheetname not in self._handled_sheets:
@@ -349,6 +356,8 @@ class XLSXConverter:
                             value = self._validate_and_convert(value, path)
                             _set_in_nested(mydict=data, path=path, value=value, prefix=parent, skip=1)
                         continue
+                    elif sheet.cell(col_type_row+1, col_idx+1).value is None:
+                        warn(f"No metadata configured for column {_column_id_to_chars(col_idx)}.")
                 except (ValueError, KeyError, jsonschema.ValidationError) as e:
                     # Append error for entire column only once
                     if isinstance(e, KeyError) and 'column' in str(e):
@@ -372,8 +381,8 @@ class XLSXConverter:
                 self._errors[(sheet.title, row_idx)] = kerr.definitions
 
         if exceptions != []:
-            exception_table = format_exception_table(exceptions, sheet.title,
-                                                     col_names)
+            exception_table = _format_exception_table(exceptions, sheet.title,
+                                                      col_names)
             raise jsonschema.ValidationError(exception_table)
 
         self._handled_sheets.add(sheet.title)
diff --git a/src/caosadvancedtools/table_json_conversion/xlsx_utils.py b/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
index 3cb2de68..7efe15c8 100644
--- a/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
+++ b/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
@@ -258,6 +258,16 @@ def get_row_type_column_index(sheet: Worksheet):
     raise ValueError("The column which defines row types (COL_TYPE, PATH, ...) is missing")
 
 
+def get_column_type_row_index(sheet: Worksheet):
+    """Return the row index (0-indexed) of the row which defines the column types.
+    """
+    for row in sheet.rows:
+        for cell in row:
+            if cell.value == RowType.COL_TYPE.name:
+                return cell.row - 1
+    raise ValueError("The column which defines row types (COL_TYPE, SCALAR, ...) is missing")
+
+
 def get_subschema(path: list[str], schema: dict) -> dict:
     """Return the sub schema at ``path``."""
     if path:
-- 
GitLab


From 0519fc38facce016711a09dc9d8e98732b909b21 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 12 Nov 2024 13:09:53 +0100
Subject: [PATCH 032/106] STY: style fix

---
 src/caosadvancedtools/table_json_conversion/convert.py | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index f650fdd9..a8df7ec2 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -45,6 +45,7 @@ def _strict_bool(value: Any) -> bool:
         return value
     raise TypeError(f"Not a good boolean: {repr(value)}")
 
+
 def _column_id_to_chars(num):
     """Converts a column id (zero based) to the corresponding string
     representation, e.g. 0 -> 'A', 97 -> 'CT'"""
@@ -52,6 +53,7 @@ def _column_id_to_chars(num):
         return ""
     return _column_id_to_chars(int(num / 26) - 1) + chr(int(num % 26) + 65)
 
+
 def _format_exception_table(exceptions: list(tuple), worksheet_title: str,
                             column_names: Optional[dict, list] = None,
                             max_line_length: Optional[int] = 120) -> str:
-- 
GitLab


From 22dac5d167ec702890e3d6d0675a400e3cf9657e Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Thu, 14 Nov 2024 12:47:14 +0100
Subject: [PATCH 033/106] WIP: XLSX converter errors.

---
 .../table_json_conversion/convert.py          |  10 +++++-----
 .../data/simple_data_broken.xlsx              | Bin 8982 -> 9175 bytes
 .../table_json_conversion/test_read_xlsx.py   |   5 ++++-
 3 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index a8df7ec2..37c39aae 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -54,9 +54,9 @@ def _column_id_to_chars(num):
     return _column_id_to_chars(int(num / 26) - 1) + chr(int(num % 26) + 65)
 
 
-def _format_exception_table(exceptions: list(tuple), worksheet_title: str,
-                            column_names: Optional[dict, list] = None,
-                            max_line_length: Optional[int] = 120) -> str:
+def _format_exception_table(exceptions: list[tuple], worksheet_title: str,
+                            column_names: Optional[Union[dict, list]] = None,
+                            max_line_length: int = 120) -> str:
     """
     Given a list of tuples containing a row and column number as well as an
     exception in that order, and the title of the current worksheet, returns
@@ -77,7 +77,7 @@ def _format_exception_table(exceptions: list(tuple), worksheet_title: str,
                         column_names[column_num] should return the name of
                         column column_names.
                         If given, exceptions will be clustered by column.
-    max_line_length:    int
+    max_line_length:    int, default=120
                         Soft cap for the line length of the resulting table
 
     Return
@@ -382,7 +382,7 @@ class XLSXConverter:
                     raise
                 self._errors[(sheet.title, row_idx)] = kerr.definitions
 
-        if exceptions != []:
+        if exceptions:
             exception_table = _format_exception_table(exceptions, sheet.title,
                                                       col_names)
             raise jsonschema.ValidationError(exception_table)
diff --git a/unittests/table_json_conversion/data/simple_data_broken.xlsx b/unittests/table_json_conversion/data/simple_data_broken.xlsx
index 361953f660f12cb37d979ff3b4c49895265131e3..0221570c942fc28f2b59a282f751781ff4a504fa 100644
GIT binary patch
delta 6743
zcmbQ{cHNyfz?+#xgn@&DgCQ_BZzHb?BXeME-ewcVU?vb_au>5!{flUBPEOwJNm|LL
ztX9ribuW7Dr7i62JdUPj#(uNETtCmw+<0W)>r1PAR~MAF*4ouSud%aZTlfCY&wUHd
zRV%HUvzb-O_TvQSh%=Mtq;h|GR`<7}ZH`ycw1iWVkqektUikdf|Ff5z#?IS9O0rKI
zL%Fw1-Sp>X>FNq^t{B^gs)<~Do;x)*gv3tV8LG+Qr=>92kwv0j&Ha9z|CDVBO)_uw
z9(7LoB%SDz&=vFe!OMaVi|fl`?0y%2eY7>tcC*B_)zix_a^Gb;pQoH_>2GPRHAf*g
z;@s-~bJaefF6+gbxEKA_o|v7hsaI5W;h3SsBVDnnr)Dp^>bPY!w@g*I^ZNV=%jR6t
z^R>Iw_H@sYAfbcTRy{U(`@7zGrC8g_O_%as75+E068>Qz<!?VXpm3J@0;O(?r-uY@
zrZrysx|Qp|*=I5xi*D7QPZwXiZ)IfO4v#C#GM`&Itv%^kG^eob<?N!yARp}}tIO;E
zFlYCkwp3jilISuo_n}@TXV#7>djfi=F*|K}zHZ^6<1Lr0Z#3p#e!T4Cl*_eM`|6V;
z?gmOrZ!!0MyYl6OO-tHM+0}#IcqIQ=DraP{He=q#ra3${sykFRu8~*RT4{OwtwZ{0
z*MEUK+lo%k;^jUsJ@a_NrO&Q?D%C${d9T^4;VaLg_kQX|@1%2+tTr54wf4l#-PQZf
zSw}2g`6k6;%JKIem%8pe>s<8BZP)KFD#7;*{p%Ndf4=g<#y8~to%12lZ1?+TeDv*c
zJ#)1Bwc0Zn6fzY4KkMF<$rnRc&WxEl>!ayP&ixxDw*UXR&i+~T{g0Qu?H_-Cx%1P$
zdFQA6+gp3Ne(9FK5%nCkewXZOr~k>YoPCe$t+(i{A7L4P=j=RtdSUsK%X>ALu57j{
z2-)sXUw>et`rD<sn@_JiGxOcf=Pe!Lta-=#moYcxt6J1o)|W3yaNz1$GFPDGXnWu1
zk^?hsjz}Jv#arR;yC>Y`NEWY^m&Jk?iw`FoiOTo=zal#=&wtX2mt8r=77|}xao<?p
zvF}Vr@8il3*=`J*k8af5P<SBEE$!ORihF0e7}CC_Jw8*vMrOn8i6@%nqh*ZML#9_Q
zOMLO$G2!$IyEnGM0yjU2vCK>VoOYRwCt9ZC%m1R>_}uDNn;7<OrnM`aa*VfzFUno^
zErvPi-0hEl{?%;FEi_5%OI|J8J5ykVrt$IbiJ`f-a;$IkwJhXqj54{NAuuDfo$=3%
z>&Lfw*Vyx%<tRAAWmR*(?LgiZWi!?V2ityptv+R2S-1Ob@m<@0tBZc>2Y9n{+;b^B
zcY>LL;k^t414<U3ti_{JZ>U$1o3l5<xA>8Tz~1-k3w|0bm(Agsp^`k~ltaQcv&l;)
zo$<SRuSGXGH0QMP$q7%c=X?J<FmaBmb@WsjhOP7B%lA)PV14lUah<JYGYXwP&$N}<
zv90y<1UHrY=ia>kzPew1+fmk2%2O`MoPVQ!=I!~<_nT}}`E3qHL^w?NJaaBbec&8R
zK7QdjigpWF&n2oa({W~+mh<{UQ=-Vq_Dxql##}Eqaw*!KWRaZza6zGu)1D=XGatr;
zsPHWJaQI=P$eMpcZn61CSDv?uSJmeEb)3#x{#3e;cVACSPmxr&qsL||6XVmt&%e0N
z>p%0`blF3epu2*Rn(Gx$AKIQWQ}J7Xn0$TXZic01Dyok>RddcWAFV&UX2uex&G{xx
zO2;*xN_^wma<n|6M*qsb9m~xVGPcdFd~k*Td~=6`ZAyyR;g4tR<maue?F?wx&vEbb
zx%6)JlKo9TPKkVM^OL;Z<1$_4c!KDfHND$Q_AhuDeu1ekv;1*B&mvPcw{4s*6`jc!
zgSfWrtUs*D$J!USW2c@gSKPaKn|OVr+c=J|@M-N~{1bTXM!CSJGv}7h(=52;^ef_l
z$<)eQVHz9j8<^{JqR&rBD_8V#T)Oae*|qRjg?F{S?s4(o60+;c?oU~{8nqMDPQE^+
zwbEqCKGsRsH}oCaCJ<4+qwCrEiz~8M%-j0IKU8Sv&1pVC_2u^FS0h(CGhbb|l|i;{
zf`^L0&4LH>ebm=_1x#5V;l&qyk71w6yoD0IOQ+2WGm3vC>&Li$(aT#6drzIKd{`sb
zuq0-$S7C6-2fx3ECUMWY8W_sz<stHLPh_dB#&pT57KMj%pS+setsW{Lu<LBD(bPwO
z()(>Y<zjwq_1<6lQZA<c7xVv+tBX%<{dLNb=`6F`cd_7yp?%tsQSt0Yw<>6r1UH3m
zG1%0+WT|=Ogq=lP=ZiMHdzSa$O-haFqwY?LeJ(nEO4Hm0#oYy0b3NSG7x7>E5MyO@
z@80iMZx|PSHtF>};&J(hMpC6nVWG&zPdu!qM{c?F{5F-_yZ+eX#Zt37I_sBh?EGNb
z>w6^R@(q_c8B+Z`to|VGg}36BfA%T$pY>jK_n^L-OZZKf7h1D9VpD||uC_5Vy~1~7
z7rW7`>6M@M8Tt2}zQZh;EoCaOd}2z{v(;DA?lOP;t@`o*e3kWo8}=<bc_@5h<=qoo
zoHxE{%vk<t5&NRpeN*#29=x1>{^g(gEb*Qvk9GwVcT9Cy&$apR!tHnEens77`dfNC
zG{9|Mre46VhKFpM{rH)LXDKY)`7p%ym-&%xEHcYi{Vrt>zPf6o*W)x!+r_g!sNLK0
zxA|AjiiV~yZ&g-3wG%iprR&_SO!k&d4coRHc++R&JiVCfRB2R#sf9^w%HEu4_uG?1
zuKU#g?0jLj-@l-a_vWFQ2`rOBC*M7zry<NEm{DP_$t8d8^9y$;7whf_gX5*Y{t4{5
z&wBPr$BESE^O9dqFI4>fcD2#%2dfThS;oCg+beRq=|KMspCu~~9u&IN^x#=hXx7>(
zZecEuBwkJ7K3dPQ*)ZPy;?Z{n+Rqq!7iArqS?>_}F*AB$oc$l2l|M@OH;Zmxmyow>
zspP5p{YRrE=0t2=S>Sv==>7A?;s+C_gqrO4&<tH!kuQ?(D`s)mC-LS#?Sy~)pz_U^
zrQ+iT76t}C0nGAEyFR-3mW9ai``?2r{#>{@_hwQ~ac-j@m!e|pvfxW^&+OCOCS$Tu
zH(YGOlgr;d_9djKo-3REL^0vz^WvZLl@pJ=I2<b?Wql^d>G8(Q?YEXSCinkR*(W*s
z{<>%R?8_z=iTu`BVkkHJyM?K}&p(N`n!A0?C5oAOj=a2ar(oWm&1<gQu7AL>RCm?`
zi8Q8DN=F_}x*L&s$l%jc-@pvZw`J$M1Uk>2Ib{7!M%sj<qdon~Z8wW&GX>k6k0|~r
zah|kgL)mlt)AP<>kPFg%w6ewGbedOn+43}fCAr0#ycMSx2g*g+o?d8bbLw-S<^Hsj
z@0?ayD``CyIi~d9GSaQ%Zr<eW3D%7DOV@dN{MhSrV@}VKzxro5JWd!!2g-NJEHF4~
zFnxjao@0Nam7f0;{maCBbc?BE<j=E{C;BgtQ!;9Pn2<B?#``d4M~?^cP2V%0?wy$T
zqK@xluJaVJXHOnTD*u~wM8eJT_Os^rmvvr;i!U(U+G6!lpY387qg$Stz(XPSJtikF
zewC_kzw!9S`g`R&pDJ2J-gm!lqQm>c!r}IWZh-@`sYieCDap;=IKh}@vWcMHG7FyL
z&(4_f`fuRgaR2p;W6Vo0-f~v#NZEdS>g)5L%1T2{>~#5FqMdp&{phJ(%f5v1aPH0x
zRGHa2!Q3%P^jY8xwx)}+=N3ist-5}5t=lhWu@p;-E8g`I>-On;8BdpGUV3gSgXlit
z`S}WZyRW|f+P>FufAlMsP|M>^#WTvH9{gfl71;CS*JYm<s`nlWR7eJt^4O&OjC5!8
zaZ||B`p;eIJY~tEhMj@=vx}sjPE1w3C2;?EVPWW3g;=*2d`&IkLZ`1!xqq6g@mgx#
z+dhF8_SIKZstR5{sn?V3^}e2Y^X~okm(IrSlA7+f`)Yloj`hydeSSCUvOoN`Ei3Mi
zo$J2bw5Czz_s-Mv{K6w-^(Q=4D7U<@yX5!&`%ewZEwAi+v;B^^z_mQ_*PGTBT2)Lm
zd0V7kkz!mBr*tvNd_(E&#<$yYb~>k9$A4pKvY6E)aaY=B(ah&LlXd3S%YM86*w>)B
z`|pp5y&I>=s_4#{%MrW8e}{SN#k)&vH<c;vne!t;{Y`SxEsrx&otLd1YMj_}@kFF@
z;XMx>sm^Y<N5RS)b5z3o1;w^_-PAv~`dfGK`pK8{rJNj>ojtKe(lXcW+1V43#zpsf
zbY@NLPJ0q;yeY>m%wNfU?c;q}uXoh<t_@b-<@G!xXNTAGj0t_0ETvouO|C20E-jul
z@pD?r#h#dq3HvTtN~J6)>0^`Bn)^9L$9?YQ%B$yInv|Z~<EO!DyIMGF<ExfMpBDLP
zD6N0ha{HS0joNKZ?)}R9wGy}gD_m6bsAi4wt5>Uqw_aWDcm<5Z-DAFPj%!}=ds{tQ
z;Gx(I0o6O)zB^vMx~u@frv;Wvd57P(-h2J++_>WR83L}yGi3{>idtM&=(_S*T~@a9
z%Kv&L+ixBJXLwz%v#nUlnI`3u*>u_JQlQ+4^RGJAt|(dOI3+?%%BAzElW_O1CDE>r
z&Ukr8o;lr9=&fcjq2252GxgJ7U(T<u?_J~Y`Dt?K_V+fQBy1|~7S&5-7?t1YoAqbG
zq(58V{l2;?Z^gGAX`%a6)q0NnF`9V%!7(=F!n%5ksJ)glt5+#!$LRg#O?}dMOr|wh
zrud9jd{z03!bext*SzVeXuZM9czmHvP44zzpB79=l@gmiN9_}P+q%p8{}oPWpK>g?
zd&aGP-VZq*mMNc3Z4I60pD(QJ$eEV?sbTZs?o)zmY_{v2GyHt|(}PPUEuG$Ke}9z7
z$LAK*aNcw}E7_Rxl%G4<cwvvRi$#mH()({J-}dKo==UGuoxkwZ#?9@A3%ry+a=U8z
z^*vTDOy_L8)O~>~lwVoSmt$IK`<qRFo*QK!R(E7LRe!w3FQTd-lrR3*znAYW9G@)s
z_3xV#HJ{jAPySx{=l`?g(>{F<S2?uuqvZSE^(Iaq@5g^UYv!Ued&-=*5}&@Nq{zPE
zm>g-cKO;z{JiTnc$L^gQCx)IC(K~&AnwmW$sPx}@aIx5BRtARoQfQ@rBm)RcHV{&+
zj}5+UAyRuk{^3XG`P&NZ=J01s;!{y6X%l06QI>XJB)ZS^#58S9&JVA@d;RNBmiCD@
zvzg#wW%vAEaq98#$LIS6w{Dxkedtl=-OR1I+{fiUd+wQc<NkYbdG~FqDqXcMkv;0)
zgvGu+e;NN+_A$TGk%%Y<f$mOOubFeK`aU?xDAr$0;_ORQO|WqiYO8tM(USb+b+^*1
zlG|?^g%yQvYaZ6D=Vs?-di2opvzcIDs@EYySD{1Vik>d#zP;GrdH#6@`^sk@r#Q`7
zuFV>MeC-F<BaeMHIBc^KOI;Yc*{0Bs?^Df_yZ4h{eNnus8#wjVvy_S7r|BpkkvBW(
z{=o0RO3{Tb^>!~?-oA|Ze7`_jAtdSF)Sm%Q7y=s;bse*7+Mj-RS%12^j9K{SCSzIa
zn@2Bi^j{#SWz_vRA!&Z8-*n~H3k~%g_c||?d$;6lZ}?#*(mBV^U(fR6dXJvOuur~b
zm8Z*$-SiJ~-&ppvwcc>XH2;E4e2Ry(Wll5&ExIbZ?8f99_7m!N-t*wnD)+zGb+PH-
zamHH#E0Y*(kA42B+hVgZ`Kdaq-!zS0$z>r=Go$Ans$*<y%#J?a<617a=t0o(yL!F*
zU!Fc2`SiJHRg&~u?`^B{)`}+cXL)_x7CN;=>ePLfmA4JL4{Z}TlUFEpHg&m;pZ?Y(
z{;`4)+FZ*zPT&80OXth9#`>sqzXopm4t?j2)t9Au+WsC=);Ose)^<2(J8OSOx`wOW
zWXZEZlh=O`3qJ5V;Z*T~dC#87bod`nSaIS1)U6__i$ZMkl~uYot+@25<;eHKIsK=&
zqKusS1ypJ#MbvZsT(X+kPJHLr_EU4>!`66~=-)i8vb%KB;_ugsjcvEPt-qdKKX=dm
zB>Uhu*VAsi+Oz+WLa@vgO}^;=&8rXl6#nR1?YArOay+lf#ga2O&pncw^=eu5?g_W<
zo4N65TJ7(TyK!Oa6NU7p%jUT{bsyTwl(zlyw;MNC{V+OGDf+OCUvYEVi9K8|Wt8-!
z1iRgid@^leW)s&d?|)siU1<8l^Od}ZN_I-t8|Amfm^h1_o$z$^1m@+{$4hrze^J7_
zDBU8KxsZ4HYJuwsJ2TpJW+|QyS7i6weZ2HmZc$a7>lfbcRUM5F14Io?cvdO7ef{^P
z|F!@AUphu|;m<XX=w82eBYm?}N8+PBS}C_;TxXbt3obhwdW74Izc2gqf}78@j+lO$
zZ|eNa)TusiFY{sh;s;C1yQk||$cHtXuQFfV*wf=1#B6C;<|%r~{GQk}(+T2rP44bx
znOEKfiC!|+*|8$gFm{#GuV?4ed5@Hw)Z8njHs{DEtBcP?!#HepJFowitJwR#{;cGS
z!`<fL$4(k|t1dE@alRZ^b^dOWUT1i0!KJi++K;lC4uzE0pL}~Qz`WE(*V(S+UeJ7&
zue%RF;@=cw$Z5JdnzJ-}pE`%c<fR*fWmIy6GUA2Lygy;Q$8&x|@zStJd4nf^)68^c
z`P>c?xgPWSM~?XYc8h&&If=Imm`=VDUeGz$K+jU?g2Z}_Pjcsy{=0jm6s9Hql$m;t
z-6mslx=xV0r&H;VkM)f^KersP?&s1iFSUQXu_Yn4{Dj`w`h}af)d;aXsL>H`>E0V+
zSo`+3`0c-I4P=e)`=2*kCLb`RX4cF9@^yJL{*?GD>8#1GNWZ&@<7oZ;M_=2N=ILd{
zEYE&<e)Go7&jY7qn(X&n*{2$GPx|caiM?}+mKo^qF)sfPE+56J--_{mWMN?N5J4*-
zHwTHUfrt1eS4*hZ`{&<s5IFk&uZXsMRkv?PRA{H+A`KG{6$OR%Ig8F#9k_jK_q%ga
zhqj-$n$i~hMd#-O`~BwD*2Z;ZRyAwAHYy*#HOsL?^1G6w+s&BSZxyOy{PpTwn)aIP
z)LFaGu|%P-?dJ3;H@g)~Z92H#zkaQf7#g5zxy^Luhm_=4)!H2;x9eN7-Ho0%od{38
z^#1EU^{H3Xgie_qYfs%D>$=GBSHAP($8!smy(80K{?@u4<1H%2pE%=A-=Z9w`L^rl
zi*3(*wAm!{p#Oub6(-WUiY10o_Y)H|W||7@(mNsOA{CkVz%6W-jm_adVed~o_;Dw9
z=|!ErY};Sl*5x{TDB@tRmcqoedXCxus%GeKbkmMD6P>nkW5#=zXtP9frJNug&&cWA
z`A4}qMVH+Q?py0#eNl1mwvN~zQ<uwLyFKlSgw@{p4tHdyE|qn9k+Ul*xwZVDLKCNB
zf!r;I#$N4%pZ5Pzd%BVF=`ud`S!)kZ%9Z(-boEl@+7eyf89j?nH65K0-ShiKJdbt#
ziJ8k*htKu2zIAQprp?WBGcWGia_@rQy_3>^_D}3h{Q9_vZDV|D?$2fSU&qIO(L4N+
zYvs4!wQGFWMV_3Ll&bAfs$W~US%Ytls97QZHEvCx=GOTv`uu%-w|27FtEzABNL2r^
zzCpLqW6%GC9m(c?jD6t&9sO)g^EDdPw*M+-n61~{d+zNIbus_>dt*I+sGqsV0IFR1
zCkEy5Gchm(a-pT2$up%?>M!~oG7zc#u03sEeyq8}<(`QeLh>qxf{Q<{-8Mb&?yhCJ
z3ibKh4>~A*d^@k&&;R|)T(h6+P9-oOI~CO{*qJ2K@M!CVRT7J*AJy68*jVbr8Fr29
zSO&Y8@2Ay0*{8CZ{g+)!n8PAnp`5CDJ$Xx!UvQ6ZyyMZFC!(h&pS~4xrZS_RYmMap
zB-RHieeOG$j<Xc=n71u_CwuW;(1&|L>wRxZar7;0;hM5}h6{`QRz9CpeYuR8!l|lv
z{SLdnY<zR|e%QA|Z_A`}FNeK)uKpwU-;X<Pyi2p@bupjX{8wR$bON8t1Ky1CyN#8;
z@0WE;o|<eS*-|K^_EJf)#9~R|pLq}MpVvztUboKo-Ujyv*^JYqSI)hk=>9LOBE~3m
z&EMwdOov|9YQKy=tL2?`_l|z8rsJJ=pEQGoPCZy?mbJEvXTJ8YnydT1$2&MV8AVKJ
z;S-w0=g%a^bIXz^C*`y7=huPN+5NKx%Km=jyi>|q{UBRCmNWKuz`WY?f7n6sV&3&^
zU6}|Y1H&sO^oVhiQLaCjcgTRJ?R|BZ)}vcX*6unKAhjj)7H6h)Nyc_9@7NPl)B=+O
zDu1(HX!u;S>2LJ>xAWI8JE+1g(OkAo&GM`VQ`k<w+qu4Wv$vNxPHMPRcFBU<)Y3^o
z`{Mz7x95p2yo#MH(pj6Fzjz;Ox^+;2xpz~q*ZX6RNjk@Mi)+`5?y=fhFMmKud()aE
z1H~JByRO7HK5>eX`>_AQxs{h|6EDluKH<D~;6bm8z?{36jx99lm2-G<GgxGuYW=r+
z8LEa=O4oi>w|xIBWVT#&?&YLy*UId-#&@q;d+JHvf?oeW4NhTco2TzJi;XHM<F}q@
zF233IpT}m2=Z*X2(#_+Kg2y|PCD;>x{AOTan8S!3I90M&K~ou<gXGphN<L-<GmyY!
z8wD%Az}UP<#8~O%76n~-kP!0lf&{2Z3C9hSFDR%hfYcy2LQ&O}@l3v`AUat`Q4p+9
ztokjyFh*6_F9cF(Xbc*T4e(}U5@CQ(#Y7fqM(8|bU|_IkW?+zlTMuF!6Q7(YE;D(*
zA`jTD$oW+SBoD{$C%;lu20H<qcA!Z|5H1g5I7m;{RgwoAl#CRF0w6g!{yI5ZNgf<#
jy-LzddUBIjDJg=v=ai(G*yJZC%85==7GT?|0MY>fIRtKR

delta 6534
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

diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index 897cd10b..8fbf8a2a 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -126,11 +126,14 @@ def test_wrong_datatype():
             assert "J7" in line
         if "1.5 is not of type 'integer'" in line:
             assert "K7" in line
+        if "1.2345 is not of type 'integer'" in line:
+            assert "K8" in line
     # No additional type errors
     if "is not of type 'boolean'" in str(caught.value):   # ToDo: Remove when boolean is fixed
         assert str(caught.value).count("is not of type") == 3
     else:
-        assert str(caught.value).count("is not of type") == 2
+        assert str(caught.value).count("is not of type") == 2  # FIXME when everything works as
+        #                                                      # expected, set correct number.
 
 
 def test_additional_column():
-- 
GitLab


From cf4f96cef6d90838679858ea770bfb111b5fc77d Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Thu, 14 Nov 2024 13:27:05 +0100
Subject: [PATCH 034/106] WIP: More renaming CaosDB -> LinkAhead

---
 .docker/cert.sh                               |  2 +-
 .gitlab-ci.yml                                |  2 +-
 Makefile                                      |  2 +-
 RELEASE_GUIDELINES.md                         |  2 +-
 extra/emacs/snippets/yaml-mode/RecordType     |  2 +-
 integrationtests/clear_database.py            |  4 +-
 integrationtests/crawl.py                     |  4 +-
 integrationtests/create_analysis.py           |  4 +-
 integrationtests/example_hdf5cfood.py         |  4 +-
 integrationtests/insert_model.py              |  2 +-
 integrationtests/insert_some.py               |  2 +-
 integrationtests/test_assure_functions.py     |  4 +-
 .../test_base_table_exporter_integration.py   |  4 +-
 integrationtests/test_cache.py                |  4 +-
 .../test_crawl_with_datamodel_problems.py     |  4 +-
 integrationtests/test_crawler_basics.py       |  4 +-
 integrationtests/test_crawler_with_cfoods.py  |  6 +-
 integrationtests/test_data_model.py           |  2 +-
 integrationtests/test_datamodel_problems.py   |  6 +-
 integrationtests/test_im_und_export.py        |  4 +-
 .../test_json_schema_datamodel_parser.py      |  4 +-
 integrationtests/test_json_schema_exporter.py |  2 +-
 integrationtests/test_table.py                |  4 +-
 integrationtests/test_yaml_parser.py          |  4 +-
 integrationtests/update_analysis.py           |  4 +-
 manual_tests/test_labfolder_import.py         |  2 +-
 manual_tests/test_labfolder_retrieve.py       |  2 +-
 setup.py                                      |  2 +-
 src/caosadvancedtools/cache.py                |  4 +-
 src/caosadvancedtools/cfood.py                | 28 +++++-----
 src/caosadvancedtools/cfoods/__init__.py      |  2 +-
 src/caosadvancedtools/cfoods/h5.py            |  6 +-
 src/caosadvancedtools/collect_datamodel.py    |  6 +-
 .../converter/labfolder_api.py                |  4 +-
 .../converter/labfolder_export.py             |  4 +-
 src/caosadvancedtools/crawler.py              | 56 +++++++++----------
 src/caosadvancedtools/datainconsistency.py    |  2 +-
 src/caosadvancedtools/datamodel_problems.py   |  4 +-
 src/caosadvancedtools/example_cfood.py        |  4 +-
 src/caosadvancedtools/export_related.py       | 12 ++--
 src/caosadvancedtools/guard.py                |  4 +-
 src/caosadvancedtools/import_from_xml.py      |  6 +-
 src/caosadvancedtools/json_schema_exporter.py |  2 +-
 src/caosadvancedtools/loadFiles.py            |  4 +-
 src/caosadvancedtools/models/data_model.py    | 22 ++++----
 src/caosadvancedtools/models/parser.py        | 16 +++---
 src/caosadvancedtools/pandoc_header_tools.py  |  2 +-
 src/caosadvancedtools/read_md_header.py       |  4 +-
 .../scifolder/analysis_cfood.py               |  4 +-
 .../scifolder/experiment_cfood.py             |  2 +-
 .../scifolder/publication_cfood.py            |  2 +-
 .../scifolder/result_table_cfood.py           |  2 +-
 .../scifolder/simulation_cfood.py             |  2 +-
 .../scifolder/software_cfood.py               |  2 +-
 src/caosadvancedtools/scifolder/utils.py      |  2 +-
 src/caosadvancedtools/scifolder/withreadme.py |  2 +-
 .../serverside/examples/example_script.py     | 10 ++--
 .../serverside/generic_analysis.py            |  4 +-
 src/caosadvancedtools/serverside/helper.py    | 24 ++++----
 src/caosadvancedtools/structure_mapping.py    |  8 +--
 src/caosadvancedtools/table_converter.py      |  4 +-
 src/caosadvancedtools/table_export.py         |  8 +--
 src/caosadvancedtools/utils.py                |  6 +-
 src/doc/Makefile                              |  2 +-
 src/doc/crawler.rst                           |  2 +-
 unittests/create_filetree.py                  |  2 +-
 ...ignore-example => linkaheadignore-example} |  0
 unittests/test_base_table_exporter.py         |  4 +-
 unittests/test_cache.py                       |  4 +-
 unittests/test_caosdbignore.py                |  6 +-
 unittests/test_cfood.py                       |  4 +-
 unittests/test_crawler.py                     |  4 +-
 unittests/test_data_model.py                  |  2 +-
 unittests/test_generic_analysis.py            |  4 +-
 unittests/test_json_schema_exporter.py        |  2 +-
 unittests/test_json_schema_model_parser.py    |  6 +-
 unittests/test_read_md_header.py              |  4 +-
 unittests/test_result_table_cfood.py          |  4 +-
 unittests/test_sss_helper.py                  | 10 ++--
 unittests/test_structure_mapping.py           |  6 +-
 unittests/test_suppressKnown.py               |  2 +-
 unittests/test_table_converter.py             |  6 +-
 unittests/test_update_cache.py                |  4 +-
 unittests/test_utils.py                       | 10 ++--
 unittests/test_yaml_model_parser.py           |  2 +-
 85 files changed, 228 insertions(+), 228 deletions(-)
 rename unittests/{caosdbignore-example => linkaheadignore-example} (100%)

diff --git a/.docker/cert.sh b/.docker/cert.sh
index e22cfba2..c7253c77 100755
--- a/.docker/cert.sh
+++ b/.docker/cert.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2019 Daniel Hornung, Göttingen
 #
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 65698d86..f9702235 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,5 @@
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/Makefile b/Makefile
index 26f5c818..c53f7013 100644
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com>
diff --git a/RELEASE_GUIDELINES.md b/RELEASE_GUIDELINES.md
index adeab4dd..11c84446 100644
--- a/RELEASE_GUIDELINES.md
+++ b/RELEASE_GUIDELINES.md
@@ -1,7 +1,7 @@
 # Release Guidelines for the CaosDB Python Client Library
 
 This document specifies release guidelines in addition to the general release
-guidelines of the CaosDB Project
+guidelines of the LinkAhead project
 ([RELEASE_GUIDELINES.md](https://gitlab.com/caosdb/caosdb/blob/dev/RELEASE_GUIDELINES.md))
 
 ## General Prerequisites
diff --git a/extra/emacs/snippets/yaml-mode/RecordType b/extra/emacs/snippets/yaml-mode/RecordType
index 6b4a9c26..8c0382d5 100644
--- a/extra/emacs/snippets/yaml-mode/RecordType
+++ b/extra/emacs/snippets/yaml-mode/RecordType
@@ -1,5 +1,5 @@
 # -*- mode: snippet -*-
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Daniel Hornung <d.hornung@indiscale.com>
diff --git a/integrationtests/clear_database.py b/integrationtests/clear_database.py
index 138cf4e6..b0b5020f 100644
--- a/integrationtests/clear_database.py
+++ b/integrationtests/clear_database.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -23,7 +23,7 @@
 # ** end header
 #
 """Clear the database before and after the integration tests."""
-import caosdb as db
+import linkahead as db
 
 
 def clear_all():
diff --git a/integrationtests/crawl.py b/integrationtests/crawl.py
index defed2cb..a3e43a19 100755
--- a/integrationtests/crawl.py
+++ b/integrationtests/crawl.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -28,7 +28,7 @@ import logging
 import sys
 from argparse import RawTextHelpFormatter
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfood import fileguide
 from caosadvancedtools.crawler import FileCrawler
 from caosadvancedtools.guard import INSERT, UPDATE
diff --git a/integrationtests/create_analysis.py b/integrationtests/create_analysis.py
index 1b7aa0d2..ec2c707c 100644
--- a/integrationtests/create_analysis.py
+++ b/integrationtests/create_analysis.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2021 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -31,7 +31,7 @@ automated analysis pipeline.
 import sys
 from datetime import datetime
 
-import caosdb as db
+import linkahead as db
 
 
 def main():
diff --git a/integrationtests/example_hdf5cfood.py b/integrationtests/example_hdf5cfood.py
index 5485402d..73688581 100644
--- a/integrationtests/example_hdf5cfood.py
+++ b/integrationtests/example_hdf5cfood.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2021 IndiScale GmbH <www.indiscale.com>
 # Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -27,7 +27,7 @@
 An exemplary definition of a HDF5 CFood for integration testing
 """
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfoods.h5 import H5CFood
 from caosadvancedtools.scifolder import ExperimentCFood
 from caosadvancedtools.scifolder.generic_pattern import readme_pattern
diff --git a/integrationtests/insert_model.py b/integrationtests/insert_model.py
index 26bf478c..170adbc8 100755
--- a/integrationtests/insert_model.py
+++ b/integrationtests/insert_model.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-import caosdb as db
+import linkahead as db
 import h5py
 from caosadvancedtools.cfoods.h5 import H5CFood
 from caosadvancedtools.models.data_model import DataModel
diff --git a/integrationtests/insert_some.py b/integrationtests/insert_some.py
index cf16a45d..19a4c1f2 100644
--- a/integrationtests/insert_some.py
+++ b/integrationtests/insert_some.py
@@ -1,5 +1,5 @@
 #!/usr/bin/env python3
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.scifolder.experiment_cfood import dm
 
 # This inserts two identifiables. When no dependencies are possible among
diff --git a/integrationtests/test_assure_functions.py b/integrationtests/test_assure_functions.py
index e04d481f..91ec1440 100644
--- a/integrationtests/test_assure_functions.py
+++ b/integrationtests/test_assure_functions.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2021 University Medical Center Göttingen, Institute for Medical Informatics
@@ -25,7 +25,7 @@
 no `to_be_updated` is specified.
 
 """
-import caosdb as db
+import linkahead as db
 
 from caosadvancedtools.cfood import (assure_object_is_in_list)
 from caosadvancedtools.guard import (global_guard, RETRIEVE, UPDATE)
diff --git a/integrationtests/test_base_table_exporter_integration.py b/integrationtests/test_base_table_exporter_integration.py
index 5af9caa3..286c4ac3 100644
--- a/integrationtests/test_base_table_exporter_integration.py
+++ b/integrationtests/test_base_table_exporter_integration.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Florian Sprecklelsen <f.spreckelsen@indiscale.com>
@@ -22,7 +22,7 @@
 #
 # ** end header
 #
-import caosdb as db
+import linkahead as db
 import pytest
 from caosadvancedtools import table_export as te
 
diff --git a/integrationtests/test_cache.py b/integrationtests/test_cache.py
index aacef179..13470b8b 100644
--- a/integrationtests/test_cache.py
+++ b/integrationtests/test_cache.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -26,7 +26,7 @@ import os
 import unittest
 from tempfile import NamedTemporaryFile
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cache import UpdateCache
 
 
diff --git a/integrationtests/test_crawl_with_datamodel_problems.py b/integrationtests/test_crawl_with_datamodel_problems.py
index 8623d57d..c2b19a95 100644
--- a/integrationtests/test_crawl_with_datamodel_problems.py
+++ b/integrationtests/test_crawl_with_datamodel_problems.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (c) 2020 IndiScale GmbH <info@indiscale.com>
 # Copyright (c) 2020 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -25,7 +25,7 @@
 
 """
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools import loadFiles
 from caosadvancedtools.cfood import fileguide
 from caosadvancedtools.crawler import FileCrawler
diff --git a/integrationtests/test_crawler_basics.py b/integrationtests/test_crawler_basics.py
index 60c09d73..04eb5459 100644
--- a/integrationtests/test_crawler_basics.py
+++ b/integrationtests/test_crawler_basics.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -29,7 +29,7 @@ cfoods. This is tested in test_crawler_with_cfoods.py.
 """
 import unittest
 
-import caosdb as db
+import linkahead as db
 
 from caosadvancedtools.crawler import Crawler
 from caosadvancedtools.guard import INSERT
diff --git a/integrationtests/test_crawler_with_cfoods.py b/integrationtests/test_crawler_with_cfoods.py
index 1fa5eaa5..472eee0e 100755
--- a/integrationtests/test_crawler_with_cfoods.py
+++ b/integrationtests/test_crawler_with_cfoods.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -25,8 +25,8 @@
 import os
 import unittest
 
-import caosdb as db
-from caosdb.apiutils import retrieve_entity_with_id
+import linkahead as db
+from linkahead.apiutils import retrieve_entity_with_id
 
 
 def get_entity_with_id(eid):
diff --git a/integrationtests/test_data_model.py b/integrationtests/test_data_model.py
index bd74a40b..bde9eda9 100644
--- a/integrationtests/test_data_model.py
+++ b/integrationtests/test_data_model.py
@@ -1,7 +1,7 @@
 import unittest
 import pytest
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.models.data_model import DataModel
 
 
diff --git a/integrationtests/test_datamodel_problems.py b/integrationtests/test_datamodel_problems.py
index 85517033..1ac32bb8 100644
--- a/integrationtests/test_datamodel_problems.py
+++ b/integrationtests/test_datamodel_problems.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -27,10 +27,10 @@ during crawling that tests the integrations of the DataModelProblems
 class in crawler.py and cfood.py can be found in full-tests.
 
 """
-import caosdb as db
+import linkahead as db
 import pytest
 from caosadvancedtools.datamodel_problems import DataModelProblems
-from caosdb.exceptions import (TransactionError,
+from linkahead.exceptions import (TransactionError,
                                UnqualifiedParentsError,
                                UnqualifiedPropertiesError)
 
diff --git a/integrationtests/test_im_und_export.py b/integrationtests/test_im_und_export.py
index 407faa1a..5d0aa26b 100644
--- a/integrationtests/test_im_und_export.py
+++ b/integrationtests/test_im_und_export.py
@@ -2,7 +2,7 @@
 import os
 from tempfile import TemporaryDirectory
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.export_related import export_related_to
 from caosadvancedtools.import_from_xml import import_xml
 
@@ -19,7 +19,7 @@ if __name__ == "__main__":
     assert 0 == len(db.execute_query("FIND File which is stored at "
                                      "**/poster.pdf"))
     print("Importing stored elements")
-    import_xml(os.path.join(directory.name, "caosdb_data.xml"), interactive=False)
+    import_xml(os.path.join(directory.name, "linkahead_data.xml"), interactive=False)
 
     # The following tests the existence of some required entities.
     # However, this is not a full list.
diff --git a/integrationtests/test_json_schema_datamodel_parser.py b/integrationtests/test_json_schema_datamodel_parser.py
index 21ae8d2d..074c4a06 100644
--- a/integrationtests/test_json_schema_datamodel_parser.py
+++ b/integrationtests/test_json_schema_datamodel_parser.py
@@ -1,5 +1,5 @@
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -20,7 +20,7 @@
 
 import os
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.models.parser import parse_model_from_json_schema
 
 
diff --git a/integrationtests/test_json_schema_exporter.py b/integrationtests/test_json_schema_exporter.py
index 44b42826..5b0d758e 100644
--- a/integrationtests/test_json_schema_exporter.py
+++ b/integrationtests/test_json_schema_exporter.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2023 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2023 Florian Spreckelsen <f.spreckelsen@indiscale.com>
diff --git a/integrationtests/test_table.py b/integrationtests/test_table.py
index b8dfe349..4e87a7db 100644
--- a/integrationtests/test_table.py
+++ b/integrationtests/test_table.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python3
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Henrik tom Wörden
 #
@@ -20,7 +20,7 @@
 
 import logging
 
-import caosdb as db
+import linkahead as db
 import pandas as pd
 
 from caosadvancedtools.crawler import TableCrawler
diff --git a/integrationtests/test_yaml_parser.py b/integrationtests/test_yaml_parser.py
index e2a2c4c0..9718c4a2 100644
--- a/integrationtests/test_yaml_parser.py
+++ b/integrationtests/test_yaml_parser.py
@@ -1,6 +1,6 @@
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -19,7 +19,7 @@
 # with this program. If not, see <https://www.gnu.org/licenses/>.
 #
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.models.parser import parse_model_from_string
 
 
diff --git a/integrationtests/update_analysis.py b/integrationtests/update_analysis.py
index ddebc049..18ae8332 100644
--- a/integrationtests/update_analysis.py
+++ b/integrationtests/update_analysis.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2021 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -34,7 +34,7 @@ entities that where changed within a certain period of time.
 
 import sys
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.serverside.generic_analysis import run
 
 
diff --git a/manual_tests/test_labfolder_import.py b/manual_tests/test_labfolder_import.py
index c767feb5..abc5eb11 100644
--- a/manual_tests/test_labfolder_import.py
+++ b/manual_tests/test_labfolder_import.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (c) 2020 IndiScale GmbH
 # Copyright (c) 2020 Daniel Hornung <d.hornung@indiscale.com>
diff --git a/manual_tests/test_labfolder_retrieve.py b/manual_tests/test_labfolder_retrieve.py
index 5bbaf91d..a7f56e80 100644
--- a/manual_tests/test_labfolder_retrieve.py
+++ b/manual_tests/test_labfolder_retrieve.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (c) 2020 IndiScale GmbH
 #
diff --git a/setup.py b/setup.py
index bee11751..a7146ead 100755
--- a/setup.py
+++ b/setup.py
@@ -149,7 +149,7 @@ def setup_package():
     metadata = dict(
         name='caosadvancedtools',
         version=get_version_info()[0],
-        description='advanced utilities for caosdb',
+        description='Advanced utilities for LinkAhead',
         long_description=long_description,
         long_description_content_type="text/markdown",
         author='Henrik tom Wörden',
diff --git a/src/caosadvancedtools/cache.py b/src/caosadvancedtools/cache.py
index bf1287ba..749239fa 100644
--- a/src/caosadvancedtools/cache.py
+++ b/src/caosadvancedtools/cache.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -33,7 +33,7 @@ from abc import ABC, abstractmethod
 from copy import deepcopy
 from hashlib import sha256
 
-import caosdb as db
+import linkahead as db
 from lxml import etree
 
 
diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index 588476bd..e79f0373 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -23,9 +23,9 @@
 #
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
-""" Defines how something that shall be inserted into CaosDB is treated.
+""" Defines how something that shall be inserted into LinkAhead is treated.
 
-CaosDB can automatically be filled with Records based on some structure, a file
+LinkAhead can automatically be filled with Records based on some structure, a file
 structure, a table or similar.
 
 The Crawler will iterate over the respective items and test for each item
@@ -33,9 +33,9 @@ whether a CFood class exists that matches the file path, i.e. whether CFood
 class wants to treat that pariticular item. If one does, it is instanciated to
 treat the match. This occurs in basically three steps:
 
-1. Create a list of identifiables, i.e. unique representation of CaosDB Records
+1. Create a list of identifiables, i.e. unique representation of LinkAhead Records
    (such as an experiment belonging to a project and a date/time).
-2. The identifiables are either found in CaosDB or they are created.
+2. The identifiables are either found in LinkAhead or they are created.
 3. The identifiables are update based on the date in the file structure.
 """
 
@@ -45,10 +45,10 @@ import warnings
 from abc import ABCMeta, abstractmethod
 from datetime import datetime
 
-import caosdb as db
-from caosdb.common.models import Entity
-from caosdb.exceptions import (BadQueryError, EmptyUniqueQueryError,
-                               QueryNotUniqueError, TransactionError)
+import linkahead as db
+from linkahead.common.models import Entity
+from linkahead.exceptions import (BadQueryError, EmptyUniqueQueryError,
+                                  QueryNotUniqueError, TransactionError)
 
 from .datamodel_problems import DataModelProblems
 from .guard import global_guard as guard
@@ -65,7 +65,7 @@ logger = logging.getLogger(__name__)
 def get_entity(name):
     """ Returns the entity with a given name, preferably from a local cache.
 
-    If the local cache does not contain the entity, retrieve it from CaosDB.
+    If the local cache does not contain the entity, retrieve it from LinkAhead.
     """
 
     if name not in ENTITIES:
@@ -81,7 +81,7 @@ def get_property(name):
     cache.
 
     If the local cache does not contain the record type, try to
-    retrieve it from CaosDB. If it does not exist, see whether it
+    retrieve it from LinkAhead. If it does not exist, see whether it
     could be a record type used as a property.
 
     """
@@ -103,7 +103,7 @@ def get_record(name):
     """Returns the record with a given name, preferably from a local cache.
 
     If the local cache does not contain the record, try to retrieve it
-    from CaosDB.
+    from LinkAhead.
 
     """
 
@@ -120,7 +120,7 @@ def get_recordtype(name):
     cache.
 
     If the local cache does not contain the record type, try to
-    retrieve it from CaosDB. If it does not exist, add it to the data
+    retrieve it from LinkAhead. If it does not exist, add it to the data
     model problems
 
     """
@@ -140,7 +140,7 @@ def get_recordtype(name):
 class FileGuide(object):
     def access(self, path):
         """ should be replaced by a function that adds
-        a prefix to paths to allow to access caosdb files locally
+        a prefix to paths to allow to access LinkAhead files locally
 
         This default just returns the unchanged path.
         """
diff --git a/src/caosadvancedtools/cfoods/__init__.py b/src/caosadvancedtools/cfoods/__init__.py
index 30ce05ad..6936568a 100644
--- a/src/caosadvancedtools/cfoods/__init__.py
+++ b/src/caosadvancedtools/cfoods/__init__.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 IndiScale GmbH <www.indiscale.com>
 # Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com>
diff --git a/src/caosadvancedtools/cfoods/h5.py b/src/caosadvancedtools/cfoods/h5.py
index dfd6f290..3b3b5688 100644
--- a/src/caosadvancedtools/cfoods/h5.py
+++ b/src/caosadvancedtools/cfoods/h5.py
@@ -34,7 +34,7 @@ Properties.
 
 from copy import deepcopy
 
-import caosdb as db
+import linkahead as db
 import h5py
 import numpy as np
 from caosadvancedtools.cfood import fileguide
@@ -45,7 +45,7 @@ from ..structure_mapping import (EntityMapping, collect_existing_structure,
 
 
 def h5_attr_to_property(val):
-    """ returns the value and datatype of a CaosDB Property for the given value
+    """ returns the value and datatype of a LinkAhead Property for the given value
 
 
     1d arrays are converted to lists
@@ -168,7 +168,7 @@ class H5CFood(AbstractFileCFood):
         self.to_be_inserted = db.Container()
         self.insert_missing_structure(self.structure)
 
-        # TODO this is a workaround due to the fact that the caosdb library
+        # TODO this is a workaround due to the fact that the linkahead library
         # changes the objects in the Container if it is inserted. The graph
         # structure is flattened. I.e. references to other entity objects are
         # replaced with their IDs. However this code depends on this graph.
diff --git a/src/caosadvancedtools/collect_datamodel.py b/src/caosadvancedtools/collect_datamodel.py
index 806d1533..1c37bab0 100644
--- a/src/caosadvancedtools/collect_datamodel.py
+++ b/src/caosadvancedtools/collect_datamodel.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -25,8 +25,8 @@
 import argparse
 import os
 
-import caosdb as db
-from caosdb.apiutils import retrieve_entities_with_ids
+import linkahead as db
+from linkahead.apiutils import retrieve_entities_with_ids
 
 from export_related import export
 
diff --git a/src/caosadvancedtools/converter/labfolder_api.py b/src/caosadvancedtools/converter/labfolder_api.py
index cf57c015..fe77282a 100644
--- a/src/caosadvancedtools/converter/labfolder_api.py
+++ b/src/caosadvancedtools/converter/labfolder_api.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (c) 2020 IndiScale GmbH
 # Copyright (c) 2020 Daniel Hornung <d.hornung@indiscale.com>
@@ -27,7 +27,7 @@ import time
 
 import html2text
 
-import caosdb as db
+import linkahead as db
 from labfolder.connection import configure_connection  # pylint: disable=import-error
 
 
diff --git a/src/caosadvancedtools/converter/labfolder_export.py b/src/caosadvancedtools/converter/labfolder_export.py
index 6e282218..ae38cb10 100644
--- a/src/caosadvancedtools/converter/labfolder_export.py
+++ b/src/caosadvancedtools/converter/labfolder_export.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (c) 2020 IndiScale GmbH
 # Copyright (c) 2020 Daniel Hornung <d.hornung@indiscale.com>
@@ -25,7 +25,7 @@ import os
 
 from bs4 import BeautifulSoup
 
-import caosdb as db
+import linkahead as db
 
 RERUN = False
 # crawler = Crawler()
diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index fc3b260b..7a840624 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -25,16 +25,16 @@
 #
 # ** end header
 #
-""" Crawls a file structure and inserts Records into CaosDB based on what is
+""" Crawls a file structure and inserts Records into LinkAhead based on what is
 found.
 
-CaosDB can automatically be filled with Records based on some file structure.
+LinkAhead can automatically be filled with Records based on some file structure.
 The Crawler will iterate over the files and test for each file whether a CFood
 exists that matches the file path. If one does, it is instanciated to treat the
 match. This occurs in basically three steps:
-1. create a list of identifiables, i.e. unique representation of CaosDB Records
+1. create a list of identifiables, i.e. unique representation of LinkAhead Records
 (such as an experiment belonging to a project and a date/time)
-2. the identifiables are either found in CaosDB or they are created.
+2. the identifiables are either found in LinkAhead or they are created.
 3. the identifiables are update based on the date in the file structure
 """
 
@@ -47,8 +47,8 @@ import uuid
 from datetime import datetime
 from sqlite3 import IntegrityError
 
-import caosdb as db
-from caosdb.exceptions import BadQueryError
+import linkahead as db
+from linkahead.exceptions import BadQueryError
 
 from .cache import IdentifiableCache, UpdateCache, get_pretty_xml
 from .cfood import RowCFood, add_files, get_ids_for_entities_with_names
@@ -69,7 +69,7 @@ def separated(text):
 
 def apply_list_of_updates(to_be_updated, update_flags={},
                           update_cache=None, run_id=None):
-    """Updates the `to_be_updated` Container, i.e., pushes the changes to CaosDB
+    """Updates the `to_be_updated` Container, i.e., pushes the changes to LinkAhead
     after removing possible duplicates. If a chace is provided, uauthorized
     updates can be cached for further authorization.
 
@@ -78,7 +78,7 @@ def apply_list_of_updates(to_be_updated, update_flags={},
     to_be_updated : db.Container
         Container with the entities that will be updated.
     update_flags : dict, optional
-        Dictionary of CaosDB server flags that will be used for the
+        Dictionary of LinkAhead server flags that will be used for the
         update. Default is an empty dict.
     update_cache : UpdateCache or None, optional
         Cache in which the intended updates will be stored so they can be
@@ -147,7 +147,7 @@ class Crawler(object):
                The Crawler will use those CFoods when crawling.
         use_cache : bool, optional
                     Whether to use caching (not re-inserting probably existing
-                    objects into CaosDB), defaults to False.
+                    objects into LinkAhead), defaults to False.
         abort_on_exception : if true, exceptions are raise.
                     Otherwise the crawler continues if an exception occurs.
         interactive : boolean, optional
@@ -271,7 +271,7 @@ class Crawler(object):
         """
         This is the first phase of the crawl. It collects all cfoods that shall
         be processed. The second phase is iterating over cfoods and updating
-        CaosDB. This separate first step is necessary in order to allow a
+        LinkAhead. This separate first step is necessary in order to allow a
         single cfood being influenced by multiple crawled items. E.g. the
         FileCrawler can have a single cfood treat multiple files.
 
@@ -512,16 +512,16 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3]))
 
         Parameters:
         -----------
-        changes: The CaosDB entities in the version after the update.
+        changes: The LinkAhead entities in the version after the update.
         path: the path defining the subtree that is crawled
 
         """
         from xml.sax.saxutils import escape
 
-        caosdb_config = db.configuration.get_config()
-        if ("advancedtools" in caosdb_config and "crawler.customcssfile" in
-                caosdb_config["advancedtools"]):
-            cssfile = caosdb_config["advancedtools"]["crawler.customcssfile"]
+        linkahead_config = db.configuration.get_config()
+        if ("advancedtools" in linkahead_config and "crawler.customcssfile" in
+                linkahead_config["advancedtools"]):
+            cssfile = linkahead_config["advancedtools"]["crawler.customcssfile"]
         else:
             cssfile = None
         # TODO move path related stuff to sss_helper
@@ -584,11 +584,11 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3]))
     </script>
 </body>
 </html>
-""".format(url=caosdb_config["Connection"]["url"],
+""".format(url=linkahead_config["Connection"]["url"],
            rid=run_id,
            changes=escape("\n".join(changes)),
            customcssfile='<link rel="stylesheet" href="{url}/webinterface/css/{customcssfile}"/>'.format(
-               url=caosdb_config["Connection"]["url"], customcssfile=cssfile) if cssfile else "",
+               url=linkahead_config["Connection"]["url"], customcssfile=cssfile) if cssfile else "",
            path=path)
 
         if "SHARED_DIR" in os.environ:
@@ -611,11 +611,11 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3]))
 
         Parameters:
         -----------
-        changes: The CaosDB entities in the version after the update.
+        changes: The LinkAhead entities in the version after the update.
         filename: path to the html site that allow the authorization
         """
 
-        caosdb_config = db.configuration.get_config()
+        linkahead_config = db.configuration.get_config()
         text = """Dear Curator,
 there where changes that need your authorization. Please check the following
 carefully and if the changes are ok, click on the following link:
@@ -623,12 +623,12 @@ carefully and if the changes are ok, click on the following link:
 {url}/Shared/{filename}
 
 {changes}
-        """.format(url=caosdb_config["Connection"]["url"],
+        """.format(url=linkahead_config["Connection"]["url"],
                    filename=filename,
                    changes="\n".join(changes))
         try:
-            fro = caosdb_config["advancedtools"]["crawler.from_mail"]
-            to = caosdb_config["advancedtools"]["crawler.to_mail"]
+            fro = linkahead_config["advancedtools"]["crawler.from_mail"]
+            to = linkahead_config["advancedtools"]["crawler.to_mail"]
         except KeyError:
             logger.error("Server Configuration is missing a setting for "
                          "sending mails. The administrator should check "
@@ -646,11 +646,11 @@ carefully and if the changes are ok, click on the following link:
     @staticmethod
     def find_or_insert_identifiables(identifiables):
         """ Sets the ids of identifiables (that do not have already an id from the
-        cache) based on searching CaosDB and retrieves those entities.
+        cache) based on searching LinkAhead and retrieves those entities.
         The remaining entities (those which can not be retrieved) have no
-        correspondence in CaosDB and are thus inserted.
+        correspondence in LinkAhead and are thus inserted.
         """
-        # looking for matching entities in CaosDB when there is no valid id
+        # looking for matching entities in LinkAhead when there is no valid id
         # i.e. there was none set from a cache
 
         existing = []
@@ -699,7 +699,7 @@ carefully and if the changes are ok, click on the following link:
         else:
             logger.debug("Did not insert any new entities")
 
-        logger.debug("Retrieving entities from CaosDB...")
+        logger.debug("Retrieving entities from LinkAhead...")
         identifiables.retrieve(unique=True, raise_exception_on_error=False)
 
     @staticmethod
@@ -735,7 +735,7 @@ carefully and if the changes are ok, click on the following link:
 
     @staticmethod
     def find_existing(entity):
-        """searches for an entity that matches the identifiable in CaosDB
+        """searches for an entity that matches the identifiable in LinkAhead
 
         Characteristics of the identifiable like, properties, name or id are
         used for the match.
diff --git a/src/caosadvancedtools/datainconsistency.py b/src/caosadvancedtools/datainconsistency.py
index 3af8b5a2..9931dd68 100644
--- a/src/caosadvancedtools/datainconsistency.py
+++ b/src/caosadvancedtools/datainconsistency.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Henrik tom Wörden <h.tomwoerden@indiscale.com>
diff --git a/src/caosadvancedtools/datamodel_problems.py b/src/caosadvancedtools/datamodel_problems.py
index df5b7e56..07fef07b 100644
--- a/src/caosadvancedtools/datamodel_problems.py
+++ b/src/caosadvancedtools/datamodel_problems.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Florian Sprckelsen <f.spreckelsen@indiscale.com>
@@ -27,7 +27,7 @@ be inserted by hand or gueesed from possible exceptions when inserting
 or updating entities with missing parents and/or properties.
 
 """
-from caosdb.exceptions import (EntityDoesNotExistError,
+from linkahead.exceptions import (EntityDoesNotExistError,
                                TransactionError,
                                UnqualifiedParentsError,
                                UnqualifiedPropertiesError)
diff --git a/src/caosadvancedtools/example_cfood.py b/src/caosadvancedtools/example_cfood.py
index 2e395d5c..45984998 100644
--- a/src/caosadvancedtools/example_cfood.py
+++ b/src/caosadvancedtools/example_cfood.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -20,7 +20,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
-import caosdb as db
+import linkahead as db
 
 from .cfood import AbstractFileCFood, assure_has_property
 
diff --git a/src/caosadvancedtools/export_related.py b/src/caosadvancedtools/export_related.py
index 7ae3a4db..1ac6d2cb 100755
--- a/src/caosadvancedtools/export_related.py
+++ b/src/caosadvancedtools/export_related.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 IndiScale GmbH, Henrik tom Wörden
 #
@@ -24,7 +24,7 @@
 """
 This file allows to create an xml representation of a complete dataset.
 Using the given entity all related entities are collected and saved in a way
-that the data can be imported in another CaosDB instance.
+that the data can be imported in another LinkAhead instance.
 
 Files that are smaller than 1MB are saved in a downloads folder and can be
 imported along with the entities themselves.
@@ -32,9 +32,9 @@ imported along with the entities themselves.
 import argparse
 import os
 
-import caosdb as db
-from caosdb.apiutils import apply_to_ids, retrieve_entities_with_ids
-from caosdb.common.datatype import get_id_of_datatype, is_reference
+import linkahead as db
+from linkahead.apiutils import apply_to_ids, retrieve_entities_with_ids
+from linkahead.common.datatype import get_id_of_datatype, is_reference
 from lxml import etree
 
 
@@ -128,7 +128,7 @@ def export(cont, directory="."):
     xml = etree.tounicode(cont.to_xml(
         local_serialization=True), pretty_print=True)
 
-    with open(os.path.join(directory, "caosdb_data.xml"), "w") as fi:
+    with open(os.path.join(directory, "linkahead_data.xml"), "w") as fi:
         fi.write(xml)
 
 
diff --git a/src/caosadvancedtools/guard.py b/src/caosadvancedtools/guard.py
index aa37448d..efda79ed 100644
--- a/src/caosadvancedtools/guard.py
+++ b/src/caosadvancedtools/guard.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Henrik tom Wörden
 #
@@ -18,7 +18,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
-import caosdb as db
+import linkahead as db
 
 RETRIEVE = 0
 INSERT = 1
diff --git a/src/caosadvancedtools/import_from_xml.py b/src/caosadvancedtools/import_from_xml.py
index 9d0e03f6..7bc9f018 100755
--- a/src/caosadvancedtools/import_from_xml.py
+++ b/src/caosadvancedtools/import_from_xml.py
@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 IndiScale GmbH, Henrik tom Wörden
 #
@@ -31,8 +31,8 @@ import argparse
 import os
 from tempfile import NamedTemporaryFile
 
-import caosdb as db
-from caosdb.apiutils import apply_to_ids
+import linkahead as db
+from linkahead.apiutils import apply_to_ids
 from caosadvancedtools.models.data_model import DataModel
 
 
diff --git a/src/caosadvancedtools/json_schema_exporter.py b/src/caosadvancedtools/json_schema_exporter.py
index c4c6de16..5daa5a4e 100644
--- a/src/caosadvancedtools/json_schema_exporter.py
+++ b/src/caosadvancedtools/json_schema_exporter.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2023 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2023 Florian Spreckelsen <f.spreckelsen@indiscale.com>
diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py
index cedef367..c9258afa 100755
--- a/src/caosadvancedtools/loadFiles.py
+++ b/src/caosadvancedtools/loadFiles.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -45,7 +45,7 @@ from argparse import ArgumentParser
 from tempfile import NamedTemporaryFile
 from typing import Union
 
-import caosdb as db
+import linkahead as db
 
 logger = logging.getLogger(__name__)
 timeout_fallback = 20
diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 3be56002..4d4cada2 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -1,7 +1,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -34,7 +34,7 @@ import linkahead.common.models as models
 from linkahead.apiutils import compare_entities, describe_diff, merge_entities
 
 
-CAOSDB_INTERNAL_PROPERTIES = [
+LINKAHEAD_INTERNAL_PROPERTIES = [
     "description",
     "name",
     "unit",
@@ -44,19 +44,19 @@ CAOSDB_INTERNAL_PROPERTIES = [
 class DataModel(dict):
     """Provides tools for managing a data model.
 
-    When constructing a data model the CaosDB representation can easily be
+    When constructing a data model the LinkAhead representation can easily be
     created using the classes RecordType and Propery, storing them in a
-    Container and inserting it in CaoSDB. However, this has one drawback: You
+    Container and inserting it in LinkAhead. However, this has one drawback: You
     cannot simply change someting and update the container. The container will
     insist on having valid ids for all contained Entities.
 
     This class allows you to define your model as easily but also provides you
     with a method (`sync_data_model`) that will sync with the data model in an
-    existing CaosDB instance.
+    existing LinkAhead instance.
 
     This is possible because entities, defined in this model, are identified
-    with entities in CaosDB using names. I.e. a RecordType "Experiment" in this
-    model will update an existing RecordType with name "Experiment" in CaosDB.
+    with entities in LinkAhead using names. I.e. a RecordType "Experiment" in this
+    model will update an existing RecordType with name "Experiment" in LinkAhead.
     Thus, be carefull not to change existing Entities that were created for a
     different purpose (e.g. someone else's experiment).
 
@@ -90,9 +90,9 @@ class DataModel(dict):
             self.append(entity)
 
     def sync_data_model(self, noquestion: bool = False, verbose: bool = True):
-        """Synchronize this DataModel with a CaosDB instance.
+        """Synchronize this DataModel with a LinkAhead instance.
 
-        Updates existing entities from the CaosDB instance and inserts
+        Updates existing entities from the LinkAhead instance and inserts
         non-existing entities into the instance.  Note: This allows to easily
         overwrite changes that were made to an existing data model. Use this
         function with care and double check its effect.
@@ -138,7 +138,7 @@ class DataModel(dict):
             any_change = False
 
             for ent in existing_entities:
-                if ent.name in CAOSDB_INTERNAL_PROPERTIES:
+                if ent.name in LINKAHEAD_INTERNAL_PROPERTIES:
                     # Workaround for the usage of internal properties like name
                     # in via the extern keyword:
                     ref = db.Property(name=ent.name).retrieve()
@@ -171,7 +171,7 @@ class DataModel(dict):
     @staticmethod
     def get_existing_entities(entities):
         """ Return a list with those entities of the supplied iterable that
-        exist in the CaosDB instance.
+        exist in the LinkAhead instance.
 
         Args
         ----
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 175f2f7f..e74de5ac 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -1,4 +1,4 @@
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2023 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -49,7 +49,7 @@ import jsonschema
 import linkahead as db
 
 from linkahead.common.datatype import get_list_datatype
-from .data_model import CAOSDB_INTERNAL_PROPERTIES, DataModel
+from .data_model import LINKAHEAD_INTERNAL_PROPERTIES, DataModel
 
 # Keywords which are allowed in data model descriptions.
 KEYWORDS = ["importance",
@@ -200,7 +200,7 @@ def parse_model_from_json_schema(
 
     out : Datamodel
         The datamodel generated from the input schema which then can be used for
-        synchronizing with CaosDB.
+        synchronizing with LinkAhead.
 
     Note
     ----
@@ -301,7 +301,7 @@ debug : bool, optional
 
         # Extern keyword:
         # The extern keyword can be used to include Properties and RecordTypes
-        # from existing CaosDB datamodels into the current model.
+        # from existing LinkAhead datamodels into the current model.
         # Any name included in the list specified by the extern keyword
         # will be used in queries to retrieve a property or (if no property exists)
         # a record type with the name of the element.
@@ -312,7 +312,7 @@ debug : bool, optional
             ymlmodel["extern"] = []
 
         for name in ymlmodel["extern"]:
-            if name in CAOSDB_INTERNAL_PROPERTIES:
+            if name in LINKAHEAD_INTERNAL_PROPERTIES:
                 self.model[name] = db.Property(name=name).retrieve()
                 continue
             for role in ("Property", "RecordType", "Record", "File"):
@@ -610,7 +610,7 @@ debug : bool, optional
         iterate over properties and check whether it is a base datatype of a
         name that was defined in the model (or extern part)
 
-        the string representations are replaced with caosdb objects
+        the string representations are replaced with linkahead objects
 
         """
 
@@ -816,12 +816,12 @@ class JsonSchemaParser(Parser):
             raise JsonSchemaDefinitionError(
                 f"`type` is missing in element {name}.")
         if name == "name":
-            # This is identified with the CaosDB name property as long as the
+            # This is identified with the LinkAhead name property as long as the
             # type is correct.
             if not elt["type"] == "string" and "string" not in elt["type"]:
                 raise JsonSchemaDefinitionError(
                     "The 'name' property must be string-typed, otherwise it cannot "
-                    "be identified with CaosDB's name property."
+                    "be identified with LinkAhead's name property."
                 )
             return None, force_list
         # LinkAhead suports null for all types, so in the very special case of
diff --git a/src/caosadvancedtools/pandoc_header_tools.py b/src/caosadvancedtools/pandoc_header_tools.py
index e746a26a..e0e62c8c 100644
--- a/src/caosadvancedtools/pandoc_header_tools.py
+++ b/src/caosadvancedtools/pandoc_header_tools.py
@@ -6,7 +6,7 @@
 # A. Schlemmer, 04/2019
 
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/src/caosadvancedtools/read_md_header.py b/src/caosadvancedtools/read_md_header.py
index ece81c40..cc3e2152 100644
--- a/src/caosadvancedtools/read_md_header.py
+++ b/src/caosadvancedtools/read_md_header.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C)
 # A. Schlemmer, 01/2019
@@ -34,7 +34,7 @@ def get_header(fn):
 # import os
 # import re
 
-# import caosdb as db
+# import linkahead as db
 # import yaml
 
 # from .cfood import AbstractCFood, get_entity
diff --git a/src/caosadvancedtools/scifolder/analysis_cfood.py b/src/caosadvancedtools/scifolder/analysis_cfood.py
index adce7225..0216f534 100644
--- a/src/caosadvancedtools/scifolder/analysis_cfood.py
+++ b/src/caosadvancedtools/scifolder/analysis_cfood.py
@@ -16,7 +16,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfood import (AbstractFileCFood,
                                      assure_has_property,
                                      assure_object_is_in_list,
@@ -51,7 +51,7 @@ class AnalysisCFood(AbstractFileCFood, WithREADME):
     @staticmethod
     def name_beautifier(name):
         """ a function that can be used to rename the project. I.e. if
-        the project in CaosDB shall be named differently than in the folder
+        the project in LinkAhead shall be named differently than in the folder
         structure.
         Use discouraged.
         """
diff --git a/src/caosadvancedtools/scifolder/experiment_cfood.py b/src/caosadvancedtools/scifolder/experiment_cfood.py
index 83329863..b19b2924 100644
--- a/src/caosadvancedtools/scifolder/experiment_cfood.py
+++ b/src/caosadvancedtools/scifolder/experiment_cfood.py
@@ -16,7 +16,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfood import (AbstractFileCFood,
                                      assure_has_property,
                                      assure_object_is_in_list,
diff --git a/src/caosadvancedtools/scifolder/publication_cfood.py b/src/caosadvancedtools/scifolder/publication_cfood.py
index 68e345ac..61e0a0ef 100644
--- a/src/caosadvancedtools/scifolder/publication_cfood.py
+++ b/src/caosadvancedtools/scifolder/publication_cfood.py
@@ -16,7 +16,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfood import (AbstractFileCFood,
                                      assure_object_is_in_list, fileguide,
                                      )
diff --git a/src/caosadvancedtools/scifolder/result_table_cfood.py b/src/caosadvancedtools/scifolder/result_table_cfood.py
index e32cd0bd..fec29039 100644
--- a/src/caosadvancedtools/scifolder/result_table_cfood.py
+++ b/src/caosadvancedtools/scifolder/result_table_cfood.py
@@ -18,7 +18,7 @@
 
 import re
 
-import caosdb as db
+import linkahead as db
 import pandas as pd
 from caosadvancedtools.cfood import (AbstractFileCFood,
                                      )
diff --git a/src/caosadvancedtools/scifolder/simulation_cfood.py b/src/caosadvancedtools/scifolder/simulation_cfood.py
index f8f3d07e..5127cbfd 100644
--- a/src/caosadvancedtools/scifolder/simulation_cfood.py
+++ b/src/caosadvancedtools/scifolder/simulation_cfood.py
@@ -16,7 +16,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfood import (AbstractFileCFood,
                                      assure_has_property,
                                      assure_object_is_in_list,
diff --git a/src/caosadvancedtools/scifolder/software_cfood.py b/src/caosadvancedtools/scifolder/software_cfood.py
index d91817f1..589112c5 100644
--- a/src/caosadvancedtools/scifolder/software_cfood.py
+++ b/src/caosadvancedtools/scifolder/software_cfood.py
@@ -17,7 +17,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfood import (AbstractFileCFood,
                                      assure_has_property, assure_name_is,
                                      assure_object_is_in_list,
diff --git a/src/caosadvancedtools/scifolder/utils.py b/src/caosadvancedtools/scifolder/utils.py
index cbf87c4b..8e832c10 100644
--- a/src/caosadvancedtools/scifolder/utils.py
+++ b/src/caosadvancedtools/scifolder/utils.py
@@ -21,7 +21,7 @@ import logging
 import os
 from itertools import chain
 
-import caosdb as db
+import linkahead as db
 import pandas as pd
 from caosadvancedtools.cfood import assure_object_is_in_list, fileguide
 from caosadvancedtools.utils import (find_records_that_reference_ids,
diff --git a/src/caosadvancedtools/scifolder/withreadme.py b/src/caosadvancedtools/scifolder/withreadme.py
index d8388e1d..94280b80 100644
--- a/src/caosadvancedtools/scifolder/withreadme.py
+++ b/src/caosadvancedtools/scifolder/withreadme.py
@@ -22,7 +22,7 @@ import logging
 import os
 from dataclasses import dataclass
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfood import (assure_has_description, assure_has_parent,
                                      assure_object_is_in_list, fileguide)
 from caosadvancedtools.read_md_header import get_header as get_md_header
diff --git a/src/caosadvancedtools/serverside/examples/example_script.py b/src/caosadvancedtools/serverside/examples/example_script.py
index d97d2d0d..fe9bbaa7 100755
--- a/src/caosadvancedtools/serverside/examples/example_script.py
+++ b/src/caosadvancedtools/serverside/examples/example_script.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2021 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -45,7 +45,7 @@ import sys
 from argparse import RawTextHelpFormatter
 from datetime import datetime
 
-import caosdb as db
+import linkahead as db
 import matplotlib.pyplot as plt
 import numpy as np
 from caosadvancedtools.cfood import assure_property_is
@@ -68,18 +68,18 @@ def send_mail(changes: [db.Entity], receipient: str):
 
     Parameters:
     -----------
-    changes: The CaosDB entities in the version after the update.
+    changes: The LinkAhead entities in the version after the update.
     receipient: The person who shall receive the mail.
     """
 
-    caosdb_config = db.configuration.get_config()
+    linkahead_config = db.configuration.get_config()
     text = """Dear Curator,
 The following changes where done automatically.
 
 {changes}
     """.format(changes="\n".join(changes))
     try:
-        fro = caosdb_config["advancedtools"]["automated_updates.from_mail"]
+        fro = linkahead_config["advancedtools"]["automated_updates.from_mail"]
     except KeyError:
         logger.error("Server Configuration is missing a setting for "
                      "sending mails. The administrator should check "
diff --git a/src/caosadvancedtools/serverside/generic_analysis.py b/src/caosadvancedtools/serverside/generic_analysis.py
index 7c7b26cc..e32e02d0 100644
--- a/src/caosadvancedtools/serverside/generic_analysis.py
+++ b/src/caosadvancedtools/serverside/generic_analysis.py
@@ -87,8 +87,8 @@ import logging
 import os
 import sys
 
-import caosdb as db
-from caosdb.utils.server_side_scripting import run_server_side_script
+import linkahead as db
+from linkahead.utils.server_side_scripting import run_server_side_script
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/caosadvancedtools/serverside/helper.py b/src/caosadvancedtools/serverside/helper.py
index b7289c7f..ec8083ab 100644
--- a/src/caosadvancedtools/serverside/helper.py
+++ b/src/caosadvancedtools/serverside/helper.py
@@ -30,7 +30,7 @@ import sys
 from email import message, policy, utils
 from tempfile import NamedTemporaryFile
 
-import caosdb as db
+import linkahead as db
 
 
 def wrap_bootstrap_alert(text, kind):
@@ -165,7 +165,7 @@ def recordtype_is_child_of(rt, parent):
     Parameters
     ----------
 
-    rt : caosdb.Entity
+    rt : linkahead.Entity
         The child RecordType.
     parent : str or int
         The parent's name or id.
@@ -193,7 +193,7 @@ def init_data_model(entities):
     Parameters
     ----------
 
-    entities : iterable of caosdb.Entity
+    entities : iterable of linkahead.Entity
         The data model entities which are to be checked for existence.
 
     Raises
@@ -339,7 +339,7 @@ def send_mail(from_addr, to, subject, body, cc=None, bcc=None,
               send_mail_bin=None):
     """ Send an email via the configured send_mail client.
 
-    The relevant options in the pycaosdb.ini are:
+    The relevant options in the pylinkahead.ini are:
 
         [Misc]
         sendmail = ...
@@ -365,8 +365,8 @@ def send_mail(from_addr, to, subject, body, cc=None, bcc=None,
     ------
     subprocess.CalledProcessError
         If the sendmail client returned with a non-zero code.
-    caosdb.ConfigurationException
-        If the caosdb configuration has no `Misc.sendmail` configured while the
+    linkahead.ConfigurationException
+        If the linkahead configuration has no `Misc.sendmail` configured while the
         `send_mail_bin` parameter is None.
     """
 
@@ -389,14 +389,14 @@ def send_mail(from_addr, to, subject, body, cc=None, bcc=None,
     if send_mail_bin is not None:
         sendmail = send_mail_bin
     else:
-        caosdb_config = db.configuration.get_config()
+        linkahead_config = db.configuration.get_config()
 
-        if "Misc" not in caosdb_config or "sendmail" not in caosdb_config["Misc"]:
+        if "Misc" not in linkahead_config or "sendmail" not in linkahead_config["Misc"]:
             err_msg = ("No sendmail executable configured. "
                        "Please configure `Misc.sendmail` "
-                       "in your pycaosdb.ini.")
+                       "in your pylinkahead.ini.")
             raise db.ConfigurationError(err_msg)
-        sendmail = caosdb_config["Misc"]["sendmail"]
+        sendmail = linkahead_config["Misc"]["sendmail"]
 
     # construct sendmail command
     # options explained (from `man sendmail`):
@@ -438,7 +438,7 @@ def get_file_via_download(ent, logger=logging.getLogger(__name__)):
     try:
         # TODO remove the following treatment of size=0 when the
         # following issue is resolved:
-        # https://gitlab.com/caosdb/caosdb-server/-/issues/107
+        # https://gitlab.com/linkahead/linkahead-server/-/issues/107
 
         if ent.size > 0:
             val_file = ent.download()
@@ -450,7 +450,7 @@ def get_file_via_download(ent, logger=logging.getLogger(__name__)):
         logger.error("The checksum of the downloaded file with id={} did not "
                      "match.".format(ent.id))
         raise e
-    except db.CaosDBException as e:
+    except db.LinkAheadException as e:
         logger.error("Cannot download the file with id={}.".format(ent.id))
         raise e
 
diff --git a/src/caosadvancedtools/structure_mapping.py b/src/caosadvancedtools/structure_mapping.py
index 50e57ac4..bf446c2a 100644
--- a/src/caosadvancedtools/structure_mapping.py
+++ b/src/caosadvancedtools/structure_mapping.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2021 IndiScale GmbH <www.indiscale.com>
 # Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -18,9 +18,9 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program. If not, see <https://www.gnu.org/licenses/>.
 
-import caosdb as db
-from caosdb.apiutils import resolve_reference
-from caosdb.common.utils import uuid
+import linkahead as db
+from linkahead.apiutils import resolve_reference
+from linkahead.common.utils import uuid
 
 from .cfood import (assure_has_description, assure_has_parent,
                     assure_property_is)
diff --git a/src/caosadvancedtools/table_converter.py b/src/caosadvancedtools/table_converter.py
index 7d1097e1..2f0d4cc9 100644
--- a/src/caosadvancedtools/table_converter.py
+++ b/src/caosadvancedtools/table_converter.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2019 Henrik tom Wörden
 #
@@ -24,7 +24,7 @@ import argparse
 import re
 import sys
 
-import caosdb as db
+import linkahead as db
 import numpy as np
 import pandas as pd
 
diff --git a/src/caosadvancedtools/table_export.py b/src/caosadvancedtools/table_export.py
index eabb1075..00e644e4 100644
--- a/src/caosadvancedtools/table_export.py
+++ b/src/caosadvancedtools/table_export.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Florian Sprecklelsen <f.spreckelsen@indiscale.com>
@@ -22,7 +22,7 @@
 #
 # ** end header
 #
-"""Collect optional and mandatory data from CaosDB records and prepare
+"""Collect optional and mandatory data from LinkAhead records and prepare
 them for an export as a table, e.g., for the export to metadata
 repositories.
 
@@ -31,7 +31,7 @@ from inspect import signature
 import json
 import logging
 
-import caosdb as db
+import linkahead as db
 
 FIND_FUNCTION = "find_func"
 QUERY = "query"
@@ -39,7 +39,7 @@ QUERY = "query"
 logger = logging.getLogger(__name__)
 
 
-class TableExportError(db.CaosDBException):
+class TableExportError(db.LinkAheadException):
     """Error that is raised in case of failing export, e.g., because of
     missing mandatory entries.
 
diff --git a/src/caosadvancedtools/utils.py b/src/caosadvancedtools/utils.py
index 05000a34..9a0342e9 100644
--- a/src/caosadvancedtools/utils.py
+++ b/src/caosadvancedtools/utils.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -27,8 +27,8 @@ import logging
 import os
 import pathlib
 
-import caosdb as db
-from caosdb.exceptions import TransactionError
+import linkahead as db
+from linkahead.exceptions import TransactionError
 
 logger = logging.getLogger(__name__)
 
diff --git a/src/doc/Makefile b/src/doc/Makefile
index 7a1bec10..2df1aff8 100644
--- a/src/doc/Makefile
+++ b/src/doc/Makefile
@@ -1,5 +1,5 @@
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Daniel Hornung <d.hornung@indiscale.com>
diff --git a/src/doc/crawler.rst b/src/doc/crawler.rst
index d7b351bb..3323631e 100644
--- a/src/doc/crawler.rst
+++ b/src/doc/crawler.rst
@@ -241,7 +241,7 @@ Let’s look at the following Example:
 
    >>> # Example CFood
    >>> from caosadvancedtools.cfood import AbstractFileCFood, assure_has_property
-   >>> import caosdb as db
+   >>> import linkahead as db
    >>> 
    >>> class ExampleCFood(AbstractFileCFood):
    ...     @staticmethod
diff --git a/unittests/create_filetree.py b/unittests/create_filetree.py
index f80b9681..bbd7783c 100644
--- a/unittests/create_filetree.py
+++ b/unittests/create_filetree.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
diff --git a/unittests/caosdbignore-example b/unittests/linkaheadignore-example
similarity index 100%
rename from unittests/caosdbignore-example
rename to unittests/linkaheadignore-example
diff --git a/unittests/test_base_table_exporter.py b/unittests/test_base_table_exporter.py
index 8a65b71a..c69a64a0 100644
--- a/unittests/test_base_table_exporter.py
+++ b/unittests/test_base_table_exporter.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Florian Sprecklelsen <f.spreckelsen@indiscale.com>
@@ -28,7 +28,7 @@ tested without db connection.
 """
 import json
 import os
-import caosdb as db
+import linkahead as db
 from pytest import raises
 from caosadvancedtools import table_export as te
 
diff --git a/unittests/test_cache.py b/unittests/test_cache.py
index de3430bf..1a53f16d 100644
--- a/unittests/test_cache.py
+++ b/unittests/test_cache.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2019 Henrik tom Wörden
 #
@@ -26,7 +26,7 @@ from copy import deepcopy
 from tempfile import NamedTemporaryFile
 import sqlite3
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cache import IdentifiableCache, cleanXML
 from lxml import etree
 
diff --git a/unittests/test_caosdbignore.py b/unittests/test_caosdbignore.py
index 9394bf0c..c044a8e8 100644
--- a/unittests/test_caosdbignore.py
+++ b/unittests/test_caosdbignore.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2022 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -34,12 +34,12 @@ from caosadvancedtools.loadFiles import compile_file_list, create_re_for_file_li
 BASEDIR = os.path.dirname(os.path.realpath(__file__))
 
 
-class Caosdbignore(unittest.TestCase):
+class Linkaheadignore(unittest.TestCase):
     def setUp(self):
         pass
 
     def test_compile(self):
-        files = compile_file_list(os.path.join(BASEDIR, "caosdbignore-example"),
+        files = compile_file_list(os.path.join(BASEDIR, "linkaheadignore-example"),
                                   os.path.join(BASEDIR, "data"))
         assert len(files) == 3
         assert os.path.join(BASEDIR, "data", "datatypes.xlsx") in files
diff --git a/unittests/test_cfood.py b/unittests/test_cfood.py
index e2f15ffd..77fd654b 100644
--- a/unittests/test_cfood.py
+++ b/unittests/test_cfood.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -24,7 +24,7 @@
 import re
 import unittest
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cfood import (AbstractCFood, AbstractFileCFood, CMeal,
                                      assure_has_parent, assure_has_property,
                                      assure_object_is_in_list,
diff --git a/unittests/test_crawler.py b/unittests/test_crawler.py
index 64bf291c..15e783a6 100644
--- a/unittests/test_crawler.py
+++ b/unittests/test_crawler.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2020 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -23,7 +23,7 @@
 import re
 import unittest
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.crawler import Crawler
 
 
diff --git a/unittests/test_data_model.py b/unittests/test_data_model.py
index cafeb6ca..354e0bf6 100644
--- a/unittests/test_data_model.py
+++ b/unittests/test_data_model.py
@@ -1,6 +1,6 @@
 import unittest
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.models.data_model import DataModel
 from caosadvancedtools.models.parser import parse_model_from_string
 
diff --git a/unittests/test_generic_analysis.py b/unittests/test_generic_analysis.py
index a1077b97..3e6f4dbc 100644
--- a/unittests/test_generic_analysis.py
+++ b/unittests/test_generic_analysis.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2021 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -27,7 +27,7 @@
 module description
 """
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.serverside.generic_analysis import \
     check_referenced_script
 
diff --git a/unittests/test_json_schema_exporter.py b/unittests/test_json_schema_exporter.py
index 1cea2f58..fd6dbf7c 100644
--- a/unittests/test_json_schema_exporter.py
+++ b/unittests/test_json_schema_exporter.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 # encoding: utf-8
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2023 Indiscale GmbH <info@indiscale.com>
 # Copyright (C) 2023 Florian Spreckelsen <f.spreckelsen@indiscale.com>
diff --git a/unittests/test_json_schema_model_parser.py b/unittests/test_json_schema_model_parser.py
index a991076e..cdd4c074 100644
--- a/unittests/test_json_schema_model_parser.py
+++ b/unittests/test_json_schema_model_parser.py
@@ -1,5 +1,5 @@
 #
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2022 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
@@ -24,7 +24,7 @@
 import os
 import pytest
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.models.parser import (parse_model_from_json_schema,
                                              JsonSchemaDefinitionError)
 
@@ -357,7 +357,7 @@ def test_name_property():
         broken = parse_model_from_json_schema(os.path.join(
             FILEPATH, "datamodel_name_wrong_type.schema.json"))
     assert str(err.value).startswith(
-        "The 'name' property must be string-typed, otherwise it cannot be identified with CaosDB's "
+        "The 'name' property must be string-typed, otherwise it cannot be identified with LinkAhead's "
         "name property.")
 
 
diff --git a/unittests/test_read_md_header.py b/unittests/test_read_md_header.py
index 994f8f16..71873e05 100644
--- a/unittests/test_read_md_header.py
+++ b/unittests/test_read_md_header.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2019 Henrik tom Wörden
 #
@@ -25,7 +25,7 @@ import unittest
 from copy import deepcopy
 from tempfile import NamedTemporaryFile
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.read_md_header import get_header
 
 
diff --git a/unittests/test_result_table_cfood.py b/unittests/test_result_table_cfood.py
index 3341a239..ad0d6397 100644
--- a/unittests/test_result_table_cfood.py
+++ b/unittests/test_result_table_cfood.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2018 Research Group Biomedical Physics,
 # Max-Planck-Institute for Dynamics and Self-Organization Göttingen
@@ -32,7 +32,7 @@ import os
 import re
 import unittest
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.scifolder.result_table_cfood import ResultTableCFood
 
 
diff --git a/unittests/test_sss_helper.py b/unittests/test_sss_helper.py
index 71408fa6..c040f503 100644
--- a/unittests/test_sss_helper.py
+++ b/unittests/test_sss_helper.py
@@ -3,13 +3,13 @@ from email import message_from_file, policy
 from os import listdir, remove
 from os.path import abspath, dirname, exists, isfile, join
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.serverside.helper import (NameCollector, get_data,
                                                  get_file_via_download,
                                                  init_data_model,
                                                  parse_arguments, send_mail)
-from caosdb import RecordType, configure_connection, get_config
-from caosdb.connection.mockup import MockUpResponse, MockUpServerConnection
+from linkahead import RecordType, configure_connection, get_config
+from linkahead.connection.mockup import MockUpResponse, MockUpServerConnection
 from pytest import mark, raises
 
 
@@ -110,8 +110,8 @@ def test_get_file_via_download():
     # TODO test whether something ends up in the logger
     class NotThere(DummyFile):
         def download(*args, **kwargs):
-            raise db.CaosDBException()
-    with raises(db.CaosDBException):
+            raise db.LinkAheadException()
+    with raises(db.LinkAheadException):
         get_file_via_download(Inconsistent())
 
 
diff --git a/unittests/test_structure_mapping.py b/unittests/test_structure_mapping.py
index 5cc4114f..a426cf78 100644
--- a/unittests/test_structure_mapping.py
+++ b/unittests/test_structure_mapping.py
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
 
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2021 IndiScale GmbH <www.indiscale.com>
 # Copyright (C) 2021 Henrik tom Wörden <h.tomwoerden@indiscale.com>
@@ -22,10 +22,10 @@
 import unittest
 from os import name
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.structure_mapping import (EntityMapping,
                                                  collect_existing_structure)
-from caosdb.common import datatype
+from linkahead.common import datatype
 
 
 class structureMappingTest(unittest.TestCase):
diff --git a/unittests/test_suppressKnown.py b/unittests/test_suppressKnown.py
index 07c2e18e..6f87e842 100644
--- a/unittests/test_suppressKnown.py
+++ b/unittests/test_suppressKnown.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 IndiScale GmbH
 # Copyright (C) 2020 Henrik tom Wörden
diff --git a/unittests/test_table_converter.py b/unittests/test_table_converter.py
index 9b1ac11b..b4f0c4d3 100644
--- a/unittests/test_table_converter.py
+++ b/unittests/test_table_converter.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2019 Henrik tom Wörden
 #
@@ -24,9 +24,9 @@ import os
 import unittest
 from tempfile import NamedTemporaryFile
 
-import caosdb as db
+import linkahead as db
 import pandas as pd
-from caosdb.apiutils import compare_entities
+from linkahead.apiutils import compare_entities
 from numpy import nan
 
 from caosadvancedtools.table_converter import (from_table, from_tsv, to_table,
diff --git a/unittests/test_update_cache.py b/unittests/test_update_cache.py
index 8376da48..318a35ae 100644
--- a/unittests/test_update_cache.py
+++ b/unittests/test_update_cache.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2020 Henrik tom Wörden
 #
@@ -26,7 +26,7 @@ import unittest
 from copy import deepcopy
 from tempfile import NamedTemporaryFile
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.cache import UpdateCache, get_pretty_xml
 
 
diff --git a/unittests/test_utils.py b/unittests/test_utils.py
index 468e9200..09688f97 100644
--- a/unittests/test_utils.py
+++ b/unittests/test_utils.py
@@ -2,7 +2,7 @@
 # encoding: utf-8
 #
 # ** header v3.0
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2019 Henrik tom Wörden
 #
@@ -24,12 +24,12 @@ import logging
 import unittest
 from tempfile import NamedTemporaryFile
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.utils import (check_win_path, get_referenced_files,
                                      string_to_person, create_entity_link)
-from caosdb import RecordType, configure_connection, get_config
-from caosdb.connection.mockup import MockUpResponse, MockUpServerConnection
-from caosdb.exceptions import TransactionError
+from linkahead import RecordType, configure_connection, get_config
+from linkahead.connection.mockup import MockUpResponse, MockUpServerConnection
+from linkahead.exceptions import TransactionError
 
 
 class BaseMockUpTest(unittest.TestCase):
diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index 9ca92a1d..f8e27507 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -1,4 +1,4 @@
-# This file is a part of the CaosDB Project.
+# This file is a part of the LinkAhead project.
 #
 # Copyright (C) 2023 IndiScale GmbH <info@indiscale.com>
 # Copyright (C) 2023 Daniel Hornung <d.hornung@indiscale.com>
-- 
GitLab


From 612208e7ad2e3ab22cb62f1783b463416244ae49 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Thu, 14 Nov 2024 13:34:35 +0100
Subject: [PATCH 035/106] WIP STY: More renaming CaosDB -> LinkAhead

---
 src/caosadvancedtools/datamodel_problems.py | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/caosadvancedtools/datamodel_problems.py b/src/caosadvancedtools/datamodel_problems.py
index 07fef07b..d14a384b 100644
--- a/src/caosadvancedtools/datamodel_problems.py
+++ b/src/caosadvancedtools/datamodel_problems.py
@@ -28,9 +28,9 @@ or updating entities with missing parents and/or properties.
 
 """
 from linkahead.exceptions import (EntityDoesNotExistError,
-                               TransactionError,
-                               UnqualifiedParentsError,
-                               UnqualifiedPropertiesError)
+                                  TransactionError,
+                                  UnqualifiedParentsError,
+                                  UnqualifiedPropertiesError)
 
 
 class DataModelProblems(object):
-- 
GitLab


From 472799d9bf8e68909f02546341a9461975eb7527 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Thu, 14 Nov 2024 13:57:21 +0100
Subject: [PATCH 036/106] DOC: Changelog.

---
 CHANGELOG.md | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 624c2b29..d97250f2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Changed ###
 
+- Using the official name "LinkAhead" wherever possible without large effort. This includes the
+  following exposed names / features:
+  - `models.data_model.LINKAHEAD_INTERNAL_PROPERTIES`
+  - `export_related.export` exports to `linkahead_data.xml` now.
+
 ### Deprecated ###
 
 ### Removed ###
-- 
GitLab


From d0f4f3f5ba5c6fc314bafc9bdf66b7f0450a8f16 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Fri, 15 Nov 2024 20:39:21 +0100
Subject: [PATCH 037/106] MNT: Implement review feedback, extend test, some
 more comments

---
 .../table_json_conversion/convert.py          | 108 ++++++++++--------
 .../data/simple_data_broken.xlsx              | Bin 9175 -> 9133 bytes
 .../data/simple_data_broken_paths.xlsx        | Bin 0 -> 9175 bytes
 .../table_json_conversion/test_read_xlsx.py   |  32 +++++-
 4 files changed, 89 insertions(+), 51 deletions(-)
 create mode 100644 unittests/table_json_conversion/data/simple_data_broken_paths.xlsx

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index 37c39aae..3bc25556 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -25,6 +25,7 @@ from __future__ import annotations
 import datetime
 import itertools
 import sys
+import textwrap
 from functools import reduce
 from operator import getitem
 from types import SimpleNamespace
@@ -95,65 +96,52 @@ def _format_exception_table(exceptions: list[tuple], worksheet_title: str,
     exceptions.sort(key=lambda tup: tup[1])
     for row_i, col_i, excep in exceptions:
         if column_names is not None:
-            # Update Names
+            # Add a line with information about the current column
             if current_column != col_i:
                 current_column = col_i
                 new_data.append({
                     "loc": f"\nErrors in column '{column_names[col_i]}':",
                     "type": "", "mess": [""]
                 })
-        # Setup
-        row = {}
-        new_data.append(row)
-        # Field
+        # Setup for current Exception
+        curr_err_data = {}
+        new_data.append(curr_err_data)
+        # Get field
         if isinstance(row_i, int):
-            row["loc"] = f"Cell {_column_id_to_chars(col_i)}{row_i + 1}"
+            curr_err_data["loc"] = f"Cell {_column_id_to_chars(col_i)}{row_i + 1}"
         else:
-            row["loc"] = f"Column {_column_id_to_chars(col_i)}"
-        lengths["loc"] = max(lengths["loc"], len(row["loc"]))
-        # Code
-        row["type"] = type(excep).__name__
-        lengths["type"] = max(lengths["type"], len(row["type"]))
-        # Message
+            curr_err_data["loc"] = f"Column {_column_id_to_chars(col_i)}"
+        lengths["loc"] = max(lengths["loc"], len(curr_err_data["loc"]))
+        # Add error code
+        curr_err_data["type"] = type(excep).__name__
+        lengths["type"] = max(lengths["type"], len(curr_err_data["type"]))
+        # Format message - split into lines
         lines = str(excep).split('\n')
         new_lines = []
         for line in lines:
-            if len(line) > max_line_length:
-                words = line.split(' ')
-                current = ""
-                for word, next_word in zip(words, words[1:] + [""]):
-                    if current != "":
-                        current += " "
-                    current += word
-                    if len(current + next_word) > max_line_length:
-                        lengths["mess"] = max(lengths["mess"], len(current))
-                        new_lines.append(current)
-                        current = ""
-                if current != "":
-                    lengths["mess"] = max(lengths["mess"], len(current))
-                    new_lines.append(current)
-            elif len(line) > 0:
-                lengths["mess"] = max(lengths["mess"], len(line))
-                new_lines.append(line)
+            new_lines += textwrap.wrap(line, max_line_length, break_long_words=False)
+        for line in new_lines:
+            lengths["mess"] = max(lengths["mess"], len(line))
         if new_lines == []:
             new_lines = [""]
-        row["mess"] = new_lines
+        curr_err_data["mess"] = new_lines
 
+    # Generate underline for each header
     dividers = {key: '–' * l for key, l in lengths.items()}
     dividers["mess"] = [dividers["mess"]]
-
-    # Fill for the messages is set to 0, if we want another column or align
-    # right we need to use lengths["mess"]
+    # Fill with spaces for alignment
     string_rep = f"There were errors during the validation of worksheet '{worksheet_title}':\n\n"
-    for row in [headers, dividers] + new_data:
-        string_rep += ' {loc: <{fill}}  '.format(loc=row["loc"],
+    for curr_err_data in [headers, dividers] + new_data:
+        string_rep += ' {loc: <{fill}}  '.format(loc=curr_err_data["loc"],
                                                  fill=lengths["loc"])
-        string_rep += ' {typ: <{fill}}  '.format(typ=row["type"],
+        string_rep += ' {typ: <{fill}}  '.format(typ=curr_err_data["type"],
                                                  fill=lengths["type"])
-        string_rep += ' {mes: <{fill}}\n'.format(mes=row["mess"][0], fill=0)
-        for line in row["mess"][1:]:
-            # Front padding
-            string_rep += ' ' * (lengths["loc"] + lengths["type"] + 7)
+        # Fill for the messages is set to 0, if we want another column or align
+        # right we need to use lengths["mess"]
+        string_rep += ' {mes: <{fill}}\n'.format(mes=curr_err_data["mess"][0], fill=0)
+        for line in curr_err_data["mess"][1:]:
+            # Front padding for lines without location and error type
+            string_rep += ' ' * (lengths["loc"] + lengths["type"] + 6)
             string_rep += ' {mes: <{fill}}\n'.format(mes=line, fill=0)
     return string_rep
 
@@ -194,7 +182,11 @@ class XLSXConverter:
         self._workbook = load_workbook(xlsx)
         self._schema = read_or_dict(schema)
         self._defining_path_index = xlsx_utils.get_defining_paths(self._workbook)
-        self._check_columns(fail_fast=strict)
+        try:
+            self._check_columns(fail_fast=strict)
+        except KeyError as e:
+            raise jsonschema.ValidationError(f"Malformed metadata: Cannot parse paths. "
+                                             f"Unknown path: {e}") from e
         self._handled_sheets: set[str] = set()
         self._result: dict = {}
         self._errors: dict = {}
@@ -220,9 +212,29 @@ class XLSXConverter:
         self._handled_sheets = set()
         self._result = {}
         self._errors = {}
-        for sheetname in self._workbook.sheetnames:
-            if sheetname not in self._handled_sheets:
-                self._handle_sheet(self._workbook[sheetname], fail_later=collect_errors)
+        if not collect_errors:
+            for sheetname in self._workbook.sheetnames:
+                if sheetname not in self._handled_sheets:
+                    self._handle_sheet(self._workbook[sheetname], fail_later=collect_errors)
+        else:
+            # Collect errors from converting
+            exceptions = []
+            for sheetname in self._workbook.sheetnames:
+                if sheetname not in self._handled_sheets:
+                    try:
+                        self._handle_sheet(self._workbook[sheetname], fail_later=collect_errors)
+                    except jsonschema.ValidationError as e:
+                        exceptions.append(e)
+                        # do not collect errors from sheet again
+                        self._handled_sheets.add(sheetname)
+            if len(exceptions) == 1:
+                raise exceptions[0]
+            elif len(exceptions) > 1:
+                mess = "There were errors during the validation of several worksheets:\n\n"
+                mess += '\n\n'.join([str(e).replace("There were errors during the validation of worksheet",
+                                                    "In worksheet")
+                                     for e in exceptions])
+                raise jsonschema.ValidationError(mess)
         if validate:
             jsonschema.validate(self._result, self._schema)
         if self._errors:
@@ -323,6 +335,7 @@ class XLSXConverter:
         # entries: dict[str, list[SimpleNamespace]] = {}
 
         exceptions = []
+        warns = []
         col_names = {}
         for row_idx, row in enumerate(sheet.iter_rows(values_only=True)):
             # Skip non-data rows
@@ -359,7 +372,12 @@ class XLSXConverter:
                             _set_in_nested(mydict=data, path=path, value=value, prefix=parent, skip=1)
                         continue
                     elif sheet.cell(col_type_row+1, col_idx+1).value is None:
-                        warn(f"No metadata configured for column {_column_id_to_chars(col_idx)}.")
+                        mess = (f"\nNo metadata configured for column "
+                                f"'{_column_id_to_chars(col_idx)}' in worksheet "
+                                f"'{sheet.title}'.\n")
+                        if mess not in warns:
+                            print(mess, file=sys.stderr)
+                            warns.append(mess)  # Prevent multiple instances of same warning
                 except (ValueError, KeyError, jsonschema.ValidationError) as e:
                     # Append error for entire column only once
                     if isinstance(e, KeyError) and 'column' in str(e):
diff --git a/unittests/table_json_conversion/data/simple_data_broken.xlsx b/unittests/table_json_conversion/data/simple_data_broken.xlsx
index 0221570c942fc28f2b59a282f751781ff4a504fa..a65d464a53459de73e41fd20d807899c44728cda 100644
GIT binary patch
delta 6686
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
ZoTaP;=JhK}Gu@G!yhd4-ty=-40{~k)NcjK&

delta 6811
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
Mq^!!eRRN?60LICL-2eap

diff --git a/unittests/table_json_conversion/data/simple_data_broken_paths.xlsx b/unittests/table_json_conversion/data/simple_data_broken_paths.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..0221570c942fc28f2b59a282f751781ff4a504fa
GIT binary patch
literal 9175
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

literal 0
HcmV?d00001

diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index 8fbf8a2a..f51e114f 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -113,27 +113,47 @@ def test_missing_columns():
         assert expected in messages
 
 
-def test_wrong_datatype():
+def test_error_table():
     with pytest.raises(jsonschema.ValidationError) as caught:
         convert.to_dict(xlsx=rfp("data/simple_data_broken.xlsx"),
                         schema=rfp("data/simple_schema.json"))
     # Correct Errors
+    assert "Malformed metadata: Cannot parse paths in worksheet 'Person'." in str(caught.value)
     assert "'Not a num' is not of type 'number'" in str(caught.value)
+    assert "'Yes a number?' is not of type 'number'" in str(caught.value)
     assert "1.5 is not of type 'integer'" in str(caught.value)
+    assert "1.2345 is not of type 'integer'" in str(caught.value)
+    assert "'There is no entry in the schema" in str(caught.value)
+    assert "'Not an enum' is not one of [" in str(caught.value)
     # Correct Locations
     for line in str(caught.value).split('\n'):
         if "'Not a num' is not of type 'number'" in line:
             assert "J7" in line
+        if "'Yes a number?' is not of type 'number'" in line:
+            assert "J8" in line
         if "1.5 is not of type 'integer'" in line:
             assert "K7" in line
         if "1.2345 is not of type 'integer'" in line:
             assert "K8" in line
-    # No additional type errors
-    if "is not of type 'boolean'" in str(caught.value):   # ToDo: Remove when boolean is fixed
-        assert str(caught.value).count("is not of type") == 3
+        if "'There is no entry in the schema" in line:
+            assert "Column M" in line
+        if "'Not an enum' is not one of [" in line:
+            assert "G8" in line
+    # No additional errors
+    assert str(caught.value).count("Malformed metadata: Cannot parse paths in worksheet") == 1
+    assert str(caught.value).count("There is no entry in the schema") == 1
+    assert str(caught.value).count("is not one of") == 1
+    # FIXME ToDo: Remove when boolean is fixed / when everything works as
+    #             expected, set correct number.
+    if "is not of type 'boolean'" in str(caught.value):
+        assert str(caught.value).count("is not of type") == 6
     else:
-        assert str(caught.value).count("is not of type") == 2  # FIXME when everything works as
-        #                                                      # expected, set correct number.
+        assert str(caught.value).count("is not of type") == 4
+    # Check correct error message for completely unknown path
+    with pytest.raises(jsonschema.ValidationError) as caught:
+        convert.to_dict(xlsx=rfp("data/simple_data_broken_paths.xlsx"),
+                        schema=rfp("data/simple_schema.json"))
+    assert "Malformed metadata: Cannot parse paths" in str(caught.value)
 
 
 def test_additional_column():
-- 
GitLab


From dc5554d06b1b1141a34e38c14de8dbf4171ffb2b Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 11:06:27 +0100
Subject: [PATCH 038/106] STY(yaml-model-parser): formatting of test

---
 unittests/test_yaml_model_parser.py | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index 79a7c6a3..5df3b8ea 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -742,10 +742,11 @@ RT:
       datatype: TEXT
 """)
 
-    existing_entities = [db.RecordType(name="RT", id=25).add_property(name="identifier",
-                                                                      datatype="INTEGER",
-                                                                      importance="OBLIGATORY",
-                                                                      id=24),
+    existing_entities = [db.RecordType(
+      name="RT", id=25).add_property(name="identifier",
+                                     datatype="INTEGER",
+                                     importance="OBLIGATORY",
+                                     id=24),
                          db.Property(name="identifier", datatype="INTEGER", id=24)]
 
     def get_existing_entities(ent_cont):
-- 
GitLab


From d753df87fc6d345f87a7354cdfd2d94b8ef3d966 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 11:46:38 +0100
Subject: [PATCH 039/106] TST(yaml-model-parser): unit test for data model
 comparison

---
 unittests/test_yaml_model_parser.py | 53 ++++++++++++++++++-----------
 1 file changed, 34 insertions(+), 19 deletions(-)

diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index 5df3b8ea..e645dcd6 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -30,8 +30,6 @@ from caosadvancedtools.models.parser import (TwiceDefinedException,
 from linkahead.apiutils import compare_entities
 from pytest import mark, raises
 
-from unittests.mock import Mock
-
 
 def to_file(string):
     f = NamedTemporaryFile(mode="w", delete=False)
@@ -676,12 +674,14 @@ test_reference:
     # comparison with a version taken from a LinkAhead instance will have these attributes.
     # Furthermore, RT2 will be set as the datatype **in object version** in the yaml definition, while
     # it is an ID in case of the version from the LinkAhead instance.
+    # p_foo = db.Property(name="foo", datatype="INTEGER", description="bla bla", unit="m")
+    # rt2 = db.RecordType(name="RT2")
+    # rt1 = db.RecordType(name="RT1")
+    # rt1.add_property(p_foo)
+    # rt1.add_property(rt2)
 
-    p_foo = db.Property(name="foo", datatype="INTEGER", description="bla bla", unit="m")
-    rt2 = db.RecordType(name="RT2")
-    rt1 = db.RecordType(name="RT1")
-    rt1.add_property(p_foo)
-    rt1.add_property(rt2)
+    # existing_entities = [
+    #   p_foo, rt2, rt1]
 
     server_response = """
 <Entities>
@@ -710,26 +710,39 @@ test_reference:
     c2 = compare_entities(model["RT1"], entities[1])
     c3 = compare_entities(model["RT2"], entities[2])
     c4 = compare_entities(model["test_reference"], entities[3])
+
     for cs in (c1, c2, c3, c4):
-        assert "id" not in cs[0]
+        assert "id" in cs[0]
+        assert cs[0]["id"] is None
         assert "id" in cs[1]
+        assert cs[1]["id"] is not None
 
-    mq = Mock()
-
-    def mq_init(self, query):
-        self.query = query
+    # The server response would be the same as the xml above:
+    def get_existing_entities(ent_cont):
+        return entities
 
-    def mq_execute(self, unique=True):
-        pass
+    class MockQuery:
+        def __init__(self, q):
+            self.q = q
 
-    mq.__init__ = mq_init
-    mq.execute.side_effect = mq_execute
+        def execute(self, unique=True):
+            id = int(self.q.split("=")[1])
+            for existing_ent in entities:
+                if existing_ent.id == id:
+                    return existing_ent
+            return None
 
-    caosadvancedtools.models.parser.db.Query = mq
+    model.get_existing_entities = get_existing_entities
+    caosadvancedtools.models.parser.db.Query = MockQuery
+    caosadvancedtools.models.parser.db.Container.update = Mock()
+    caosadvancedtools.models.parser.db.Container.insert = Mock()
 
     model.sync_data_model(True, True)
-
-    stdout, stderr = capfd.readouterr()
+    assert caosadvancedtools.models.parser.db.Container.update.called
+    assert not caosadvancedtools.models.parser.db.Container.insert.called
+    output, err = capfd.readouterr()
+    print(output)
+    assert False
 
     # TODO: test that there were no changes required
 
@@ -766,9 +779,11 @@ RT:
     model.get_existing_entities = get_existing_entities
     caosadvancedtools.models.parser.db.Query = MockQuery
     caosadvancedtools.models.parser.db.Container.update = Mock()
+    caosadvancedtools.models.parser.db.Container.insert = Mock()
 
     model.sync_data_model(True, True)
     assert caosadvancedtools.models.parser.db.Container.update.called
+    assert not caosadvancedtools.models.parser.db.Container.insert.called
     output, err = capfd.readouterr()
     print(output)
     assert "version from the yaml file: TEXT" in output
-- 
GitLab


From dd637a408f32ae4ba2dae6bd6799c1fca368b7e8 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 11:51:39 +0100
Subject: [PATCH 040/106] FIX(yaml-model-parser): add datatype and other
 missing attributes to properties belonging to record types in data model

---
 src/caosadvancedtools/models/parser.py | 70 +++++++++++++-------------
 1 file changed, 34 insertions(+), 36 deletions(-)

diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index b3c5c7e2..27505329 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -37,18 +37,17 @@ to be a list with the names. Here, NO NEW entities can be defined.
 """
 import argparse
 import json
-import jsonref
 import re
 import sys
-import yaml
-
 from typing import List, Optional
 from warnings import warn
 
+import jsonref
 import jsonschema
 import linkahead as db
-
+import yaml
 from linkahead.common.datatype import get_list_datatype
+
 from .data_model import LINKAHEAD_INTERNAL_PROPERTIES, DataModel
 
 # Keywords which are allowed in data model descriptions.
@@ -341,38 +340,37 @@ debug : bool, optional
                                               f"invalid keyword in line {entity['__line__']}:", 1)
                 raise ValueError(err_str, *err.args[1:]) from err
 
-        # TODO: functionality commented out, to be able to test failing test first.
-        # Update properties that are part of record types:
-        # e.g. add their datatypes, units etc..
-        # Otherwise comparison of existing models and the parsed model become difficult.
-        # for name, ent in self.model.items():
-        #     if not isinstance(ent, db.RecordType):
-        #         continue
-        #     props = ent.get_properties()
-        #     for prop in props:
-        #         if prop.name in self.model:
-        #             model_prop = self.model[prop.name]
-        #             # The information must be missing, we don't want to overwrite it accidentally:
-        #             if prop.datatype is not None and prop.datatype != model_prop.datatype:
-        #                 # breakpoint()
-        #                 raise RuntimeError("datatype must not be set, here. This is probably a bug.")
-        #             if prop.unit is not None and prop.unit != model_prop.unit:
-        #                 # continue
-        #                 raise RuntimeError("unit must not be set, here. This is probably a bug.")
-        #             if prop.description is not None and prop.description != model_prop.description:
-        #                 # continue
-        #                 raise RuntimeError("description must not be set, here. This is probably a bug.")
-        #
-        #             # If this property has a more detailed definition in the model,
-        #             # copy over the information:
-        #
-        #             if isinstance(model_prop, db.RecordType):
-        #                 # in this case the datatype equals the name of the record type:
-        #                 prop.datatype = prop.name
-        #             else:
-        #                 prop.datatype = model_prop.datatype
-        #                 prop.unit = model_prop.unit
-        #                 prop.description = model_prop.description
+#         Update properties that are part of record types:
+#         e.g. add their datatypes, units etc..
+#         Otherwise comparison of existing models and the parsed model become difficult.
+        for name, ent in self.model.items():
+            if not isinstance(ent, db.RecordType):
+                continue
+            props = ent.get_properties()
+            for prop in props:
+                if prop.name in self.model:
+                    model_prop = self.model[prop.name]
+                    # The information must be missing, we don't want to overwrite it accidentally:
+                    if prop.datatype is not None and prop.datatype != model_prop.datatype:
+                        # breakpoint()
+                        raise RuntimeError("datatype must not be set, here. This is probably a bug.")
+                    if prop.unit is not None and prop.unit != model_prop.unit:
+                        # continue
+                        raise RuntimeError("unit must not be set, here. This is probably a bug.")
+                    if prop.description is not None and prop.description != model_prop.description:
+                        # continue
+                        raise RuntimeError("description must not be set, here. This is probably a bug.")
+
+                    # If this property has a more detailed definition in the model,
+                    # copy over the information:
+
+                    if isinstance(model_prop, db.RecordType):
+                        # in this case the datatype equals the name of the record type:
+                        prop.datatype = prop.name
+                    else:
+                        prop.datatype = model_prop.datatype
+                        prop.unit = model_prop.unit
+                        prop.description = model_prop.description
 
         return DataModel(self.model.values())
 
-- 
GitLab


From d75f64686d3ebc943f9b753c8d8b623e27d44471 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 11:52:04 +0100
Subject: [PATCH 041/106] TST(yaml-model-parser): test for correct comparison
 of yaml models

---
 unittests/test_yaml_model_parser.py | 16 +++-------------
 1 file changed, 3 insertions(+), 13 deletions(-)

diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index e645dcd6..e3e9a0af 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -674,14 +674,6 @@ test_reference:
     # comparison with a version taken from a LinkAhead instance will have these attributes.
     # Furthermore, RT2 will be set as the datatype **in object version** in the yaml definition, while
     # it is an ID in case of the version from the LinkAhead instance.
-    # p_foo = db.Property(name="foo", datatype="INTEGER", description="bla bla", unit="m")
-    # rt2 = db.RecordType(name="RT2")
-    # rt1 = db.RecordType(name="RT1")
-    # rt1.add_property(p_foo)
-    # rt1.add_property(rt2)
-
-    # existing_entities = [
-    #   p_foo, rt2, rt1]
 
     server_response = """
 <Entities>
@@ -738,13 +730,11 @@ test_reference:
     caosadvancedtools.models.parser.db.Container.insert = Mock()
 
     model.sync_data_model(True, True)
-    assert caosadvancedtools.models.parser.db.Container.update.called
+    assert not caosadvancedtools.models.parser.db.Container.update.called
     assert not caosadvancedtools.models.parser.db.Container.insert.called
     output, err = capfd.readouterr()
-    print(output)
-    assert False
-
-    # TODO: test that there were no changes required
+    assert "No new entities." in output
+    assert "No differences found. No update" in output
 
 
 def test_sync_output(capfd):
-- 
GitLab


From 0c25885d62026b47e2c6f7f6fd49d333b72d3e28 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 13:00:48 +0100
Subject: [PATCH 042/106] FIX(yaml-model-parser): removed data type check

---
 src/caosadvancedtools/models/parser.py | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 27505329..fb8f75ab 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -352,14 +352,14 @@ debug : bool, optional
                     model_prop = self.model[prop.name]
                     # The information must be missing, we don't want to overwrite it accidentally:
                     if prop.datatype is not None and prop.datatype != model_prop.datatype:
-                        # breakpoint()
-                        raise RuntimeError("datatype must not be set, here. This is probably a bug.")
+                        continue
+                        # TODO: Data type overwrite is allowed here (because
+                        #       of lists), but this might change in the future.
+                        # raise RuntimeError("datatype must not be set, here. This is probably a bug.")
                     if prop.unit is not None and prop.unit != model_prop.unit:
-                        # continue
-                        raise RuntimeError("unit must not be set, here. This is probably a bug.")
+                        continue
                     if prop.description is not None and prop.description != model_prop.description:
-                        # continue
-                        raise RuntimeError("description must not be set, here. This is probably a bug.")
+                        continue
 
                     # If this property has a more detailed definition in the model,
                     # copy over the information:
-- 
GitLab


From 18ccd72dcfbeea1e62affa9d1fa1e3e32650fbe1 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 13:01:21 +0100
Subject: [PATCH 043/106] TST(data-model-parser): replaced static xml tests by
 more specific ones

---
 unittests/test_yaml_model_parser.py | 32 +++++++++++++----------------
 1 file changed, 14 insertions(+), 18 deletions(-)

diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index e3e9a0af..cf999789 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -612,14 +612,13 @@ RT2:
   obligatory_properties: *RT1_oblig
     """
     model = parse_model_from_string(model_string)
-    assert str(model) == """{'foo': <Property name="foo" datatype="INTEGER"/>
-, 'RT1': <RecordType name="RT1">
-  <Property name="foo" importance="OBLIGATORY" flag="inheritance:FIX"/>
-</RecordType>
-, 'RT2': <RecordType name="RT2">
-  <Property name="foo" importance="OBLIGATORY" flag="inheritance:FIX"/>
-</RecordType>
-}"""
+
+    assert len(model) == 3
+    assert isinstance(model["foo"], db.Property)
+    assert model["foo"].datatype == db.INTEGER
+    for st in ("RT1", "RT2"):
+        assert isinstance(model[st], db.RecordType)
+        assert model[st].get_property("foo").datatype == db.INTEGER
 
     # Aliasing with override
     model_string = """
@@ -634,16 +633,13 @@ RT2:
     bar:
     """
     model = parse_model_from_string(model_string)
-    assert str(model) == """{'foo': <Property name="foo" datatype="INTEGER"/>
-, 'RT1': <RecordType name="RT1">
-  <Property name="foo" importance="OBLIGATORY" flag="inheritance:FIX"/>
-</RecordType>
-, 'RT2': <RecordType name="RT2">
-  <Property name="foo" importance="OBLIGATORY" flag="inheritance:FIX"/>
-  <Property name="bar" importance="OBLIGATORY" flag="inheritance:FIX"/>
-</RecordType>
-, 'bar': <RecordType name="bar"/>
-}"""
+
+    assert len(model) == 4
+    assert isinstance(model["bar"], db.RecordType)
+    for st in ("RT1", "RT2"):
+        assert isinstance(model[st], db.RecordType)
+        assert model[st].get_property("foo").datatype == db.INTEGER
+    assert model["RT2"].get_property("bar").datatype == "bar"
 
 
 def test_comparison_yaml_model(capfd):
-- 
GitLab


From f2bfc455bf5f3770fc4543057f722c0ec5421886 Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 13:26:00 +0100
Subject: [PATCH 044/106] MAINT(json-schema-export): added error detection when
 datatype is given as string

---
 src/caosadvancedtools/json_schema_exporter.py |  8 ++++++-
 unittests/test_json_schema_exporter.py        | 24 +++++++++----------
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/caosadvancedtools/json_schema_exporter.py b/src/caosadvancedtools/json_schema_exporter.py
index 5daa5a4e..7a92eaad 100644
--- a/src/caosadvancedtools/json_schema_exporter.py
+++ b/src/caosadvancedtools/json_schema_exporter.py
@@ -58,8 +58,9 @@ from collections import OrderedDict
 from typing import Any, Dict, Iterable, List, Optional, Sequence, Tuple, Union
 
 import linkahead as db
-from linkahead.cached import cached_query, cache_clear
+from linkahead.cached import cache_clear, cached_query
 from linkahead.common.datatype import get_list_datatype, is_list_datatype
+
 from .models.data_model import DataModel
 
 
@@ -322,6 +323,10 @@ ui_schema : dict
                             rt = results[0]
                         else:
                             rt = db.Entity()
+
+                    if isinstance(rt, str):
+                        raise NotImplementedError("Behavior is not implemented when _no_remote == True and datatype is given as a string.")
+
                     subschema, ui_schema = self._make_segment_from_recordtype(rt)
                     if prop.is_reference():
                         if prop.name:
@@ -431,6 +436,7 @@ ui_schema : dict
                 }
             }
         """
+
         schema: OrderedDict[str, Any] = OrderedDict({
             "type": "object"
         })
diff --git a/unittests/test_json_schema_exporter.py b/unittests/test_json_schema_exporter.py
index fd6dbf7c..3b37f638 100644
--- a/unittests/test_json_schema_exporter.py
+++ b/unittests/test_json_schema_exporter.py
@@ -23,18 +23,16 @@
 """Tests the Json schema exporter."""
 
 import json
-
-import linkahead as db
-import caosadvancedtools.json_schema_exporter as jsex
-
 from collections import OrderedDict
-
-from jsonschema import FormatChecker, validate, ValidationError
-from pytest import raises
 from unittest.mock import Mock, patch
 
-from caosadvancedtools.json_schema_exporter import recordtype_to_json_schema as rtjs
+import caosadvancedtools.json_schema_exporter as jsex
+import linkahead as db
+from caosadvancedtools.json_schema_exporter import \
+    recordtype_to_json_schema as rtjs
 from caosadvancedtools.models.parser import parse_model_from_string
+from jsonschema import FormatChecker, ValidationError, validate
+from pytest import raises
 
 GLOBAL_MODEL = parse_model_from_string("""
 RT1:
@@ -920,10 +918,12 @@ RT3:
     schema_noexist = rtjs(model.get_deep("RT3"))
     assert schema_noexist["properties"]["NoRecords"].get("type") == "object"
 
-    schema_noexist_noremote = rtjs(model.get_deep("RT3"), no_remote=True)
-    assert schema_noexist_noremote["properties"]["NoRecords"].get("type") == "object"
-    assert (schema_noexist_noremote["properties"]["NoRecords"].get("properties")
-            == OrderedDict([('some_text', {'type': 'string'})]))
+    with raises(NotImplementedError,
+                match="Behavior is not implemented when _no_remote == True and datatype is given as a string."):
+        schema_noexist_noremote = rtjs(model.get_deep("RT3"), no_remote=True)
+        assert schema_noexist_noremote["properties"]["NoRecords"].get("type") == "object"
+        assert (schema_noexist_noremote["properties"]["NoRecords"].get("properties")
+                == OrderedDict([('some_text', {'type': 'string'})]))
 
     uischema = {}
     schema_noexist_noretrieve = rtjs(model.get_deep("RT2"), do_not_retrieve=["RT1"],
-- 
GitLab


From e613db9a5420747b173734ff10c63874cc3aecfe Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 13:26:30 +0100
Subject: [PATCH 045/106] TST(yaml-model-parser): updated test to new behavior

---
 unittests/test_data_model.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/unittests/test_data_model.py b/unittests/test_data_model.py
index 354e0bf6..174f15fc 100644
--- a/unittests/test_data_model.py
+++ b/unittests/test_data_model.py
@@ -44,7 +44,10 @@ RT1:
         """
         model_recursive = parse_model_from_string(model_recursive_str)
         prop1 = model_recursive["RT1"].get_property("RT1")
-        assert prop1.datatype is None
+
+        assert prop1.datatype is not None
+        assert prop1.datatype == "RT1"
+
         # TODO The next line actually changes model_recursive in place, is this OK?
         RT1 = model_recursive.get_deep("RT1")
         assert model_recursive["RT1"] == RT1
-- 
GitLab


From dd6cf0846f4e4f8182fe9458a56b01e65998577c Mon Sep 17 00:00:00 2001
From: Alexander Schlemmer <a.schlemmer@indiscale.com>
Date: Mon, 18 Nov 2024 13:32:13 +0100
Subject: [PATCH 046/106] DOC(yaml-model-parser): updated changelog

---
 CHANGELOG.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d97250f2..3b7e7185 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Fixed ###
 
+- Yaml data model parser adds data types of properties of record types and other attributes which fixes https://gitlab.indiscale.com/caosdb/customers/f-fit/management/-/issues/58
+
 ### Security ###
 
 ### Documentation ###
-- 
GitLab


From 1a6a00ab40d773b70b41a43ee768c8f54975b54f Mon Sep 17 00:00:00 2001
From: Daniel Hornung <d.hornung@indiscale.com>
Date: Tue, 19 Nov 2024 09:22:05 +0100
Subject: [PATCH 047/106] ENH: Even better error message.

---
 .../table_json_conversion/convert.py                | 13 +++++++------
 unittests/table_json_conversion/test_read_xlsx.py   |  3 ++-
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index 3bc25556..bffab78e 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -186,7 +186,8 @@ class XLSXConverter:
             self._check_columns(fail_fast=strict)
         except KeyError as e:
             raise jsonschema.ValidationError(f"Malformed metadata: Cannot parse paths. "
-                                             f"Unknown path: {e}") from e
+                                             f"Unknown path: '{e.args[1]}' in sheet '{e.args[0]}'."
+                                             ) from e
         self._handled_sheets: set[str] = set()
         self._result: dict = {}
         self._errors: dict = {}
@@ -270,8 +271,11 @@ class XLSXConverter:
                 parents[xlsx_utils.p2s(col.path[:-1])] = col.path[:-1]
                 col_paths.append(col.path)
             for path in parents.values():
-                subschema = xlsx_utils.get_subschema(path, self._schema)
-
+                try:
+                    subschema = xlsx_utils.get_subschema(path, self._schema)
+                except KeyError as kerr:
+                    kerr.args = (sheetname, *kerr.args)
+                    raise
                 # Unfortunately, there are a lot of special cases to handle here.
                 if subschema.get("type") == "array":
                     subschema = subschema["items"]
@@ -544,9 +548,6 @@ def _group_foreign_paths(foreign: list[list], common: list[str]) -> list[SimpleN
         last_level = len(elem.path)
         resultlist.append(elem)
 
-    # from IPython import embed
-    # embed()
-
     if last_level != len(common):
         raise ValueError("Foreign keys must cover the complete `common` depth.")
     return resultlist
diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index f51e114f..ac0a42b5 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -153,7 +153,8 @@ def test_error_table():
     with pytest.raises(jsonschema.ValidationError) as caught:
         convert.to_dict(xlsx=rfp("data/simple_data_broken_paths.xlsx"),
                         schema=rfp("data/simple_schema.json"))
-    assert "Malformed metadata: Cannot parse paths" in str(caught.value)
+    assert ("Malformed metadata: Cannot parse paths. Unknown path: 'There' in sheet 'Person'."
+            == str(caught.value))
 
 
 def test_additional_column():
-- 
GitLab


From 008b1bcf9caee57ea69ab907e5d0c23f0dc96364 Mon Sep 17 00:00:00 2001
From: Daniel Hornung <d.hornung@indiscale.com>
Date: Tue, 19 Nov 2024 09:35:41 +0100
Subject: [PATCH 048/106] DOC: if and only if

---
 src/caosadvancedtools/table_json_conversion/xlsx_utils.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/caosadvancedtools/table_json_conversion/xlsx_utils.py b/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
index 7efe15c8..7770e3ec 100644
--- a/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
+++ b/src/caosadvancedtools/table_json_conversion/xlsx_utils.py
@@ -295,7 +295,7 @@ def is_exploded_sheet(sheet: Worksheet) -> bool:
     """Return True if this is a an "exploded" sheet.
 
     An exploded sheet is a sheet whose data entries are LIST valued properties of entries in another
-    sheet.  A sheet is detected as exploded if it has FOREIGN columns.
+    sheet.  A sheet is detected as exploded if and only if it has FOREIGN columns.
     """
     column_types = _get_column_types(sheet)
     return ColumnType.FOREIGN.name in column_types.values()
-- 
GitLab


From 5f8ef3fe9ae284e9c7ed9d0c973e104c420204b2 Mon Sep 17 00:00:00 2001
From: Daniel Hornung <d.hornung@indiscale.com>
Date: Tue, 19 Nov 2024 09:59:27 +0100
Subject: [PATCH 049/106] MAINT: Explicit dependencies for testing and
 documentation.

---
 .gitlab-ci.yml |  4 ++--
 setup.py       | 18 +++++++++++++-----
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index f9702235..cc0a1f73 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -139,9 +139,9 @@ unittest_py38:
   stage: unittest
   image: python:3.8
   script: &python_test_script
-    - pip install pynose pandas pytest pytest-cov gitignore-parser openpyxl>=3.0.7 xlrd==1.2 h5py
+    - pip install pynose pandas
     - pip install git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev
-    - pip install .
+    - pip install .[test,h5-crawler,gitignore-parser]
     - pytest --cov=caosadvancedtools unittests
 
 unittest_py310:
diff --git a/setup.py b/setup.py
index a7146ead..08908baa 100755
--- a/setup.py
+++ b/setup.py
@@ -165,13 +165,21 @@ def setup_package():
                           ],
         extras_require={"h5-crawler": ["h5py>=3.3.0", ],
                         "gitignore-parser": ["gitignore-parser >=0.1.0", ],
+                        "doc": [
+                            "sphinx",
+                            "sphinx-autoapi",
+                            "sphinx-rtd-theme",
+                            "recommonmark >= 0.6.0",
+                        ],
+                        "test": [
+                            "gitignore-parser",
+                            "pytest",
+                            "pytest-pythonpath",
+                            "pytest-cov",
+                            "coverage>=4.4.2",
+                        ],
                         },
         setup_requires=["pytest-runner>=2.0,<3dev"],
-        tests_require=["pytest",
-                       "pytest-pythonpath",
-                       "pytest-cov",
-                       "coverage>=4.4.2",
-                       ],
         packages=find_packages('src'),
         package_dir={'': 'src'},
         entry_points={"console_scripts": [
-- 
GitLab


From 3cb23ce97ea61ef3ee9890c07ecb53551790c17c Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 19 Nov 2024 11:55:21 +0100
Subject: [PATCH 050/106] STY: Added type definition.

---
 src/caosadvancedtools/table_json_conversion/convert.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index bffab78e..3c5b78fa 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -104,7 +104,7 @@ def _format_exception_table(exceptions: list[tuple], worksheet_title: str,
                     "type": "", "mess": [""]
                 })
         # Setup for current Exception
-        curr_err_data = {}
+        curr_err_data: Any = {}
         new_data.append(curr_err_data)
         # Get field
         if isinstance(row_i, int):
-- 
GitLab


From ed483239a7eade92fa2fb656a3ecc66448c443b6 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Tue, 19 Nov 2024 14:36:26 +0100
Subject: [PATCH 051/106] STY: autopep8'd

---
 src/caosadvancedtools/models/data_model.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 1067a09c..92afb7eb 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -114,8 +114,6 @@ class DataModel(dict):
 
         self.sync_ids_by_name(tmp_exist)
 
-
-
         if len(non_existing_entities) > 0:
             if verbose:
                 print("New entities:")
-- 
GitLab


From bc112cf6f2ac96950b3a0c3b98c23c938c694de7 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Tue, 19 Nov 2024 15:18:08 +0100
Subject: [PATCH 052/106] FIX: Don't ignore top-level description or unit if
 datatype is given

---
 src/caosadvancedtools/models/parser.py | 33 +++++++++++---------------
 unittests/test_yaml_model_parser.py    | 25 +++++++++++++++++--
 2 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index fb8f75ab..b1e3aa95 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -351,25 +351,20 @@ debug : bool, optional
                 if prop.name in self.model:
                     model_prop = self.model[prop.name]
                     # The information must be missing, we don't want to overwrite it accidentally:
-                    if prop.datatype is not None and prop.datatype != model_prop.datatype:
-                        continue
-                        # TODO: Data type overwrite is allowed here (because
-                        #       of lists), but this might change in the future.
-                        # raise RuntimeError("datatype must not be set, here. This is probably a bug.")
-                    if prop.unit is not None and prop.unit != model_prop.unit:
-                        continue
-                    if prop.description is not None and prop.description != model_prop.description:
-                        continue
-
-                    # If this property has a more detailed definition in the model,
-                    # copy over the information:
-
-                    if isinstance(model_prop, db.RecordType):
-                        # in this case the datatype equals the name of the record type:
-                        prop.datatype = prop.name
-                    else:
-                        prop.datatype = model_prop.datatype
-                        prop.unit = model_prop.unit
+                    if prop.datatype is None:
+                        if isinstance(model_prop, db.RecordType):
+                            prop.datatype = model_prop.name
+                        else:
+                            prop.datatype = model_prop.datatype
+                    # TODO: Data type overwrite is allowed here (because
+                    #       of lists), but this might change in the future.
+                    # elif prop.datatype != model_prop.datatype:
+                    #     raise RuntimeError("datatype must not be set, here. This is probably a bug.")
+                    if prop.unit is None:
+                        # No unit for plain reference properties
+                        if not isinstance(model_prop, db.RecordType):
+                            prop.unit = model_prop.unit
+                    if prop.description is None:
                         prop.description = model_prop.description
 
         return DataModel(self.model.values())
diff --git a/unittests/test_yaml_model_parser.py b/unittests/test_yaml_model_parser.py
index cf999789..8728e128 100644
--- a/unittests/test_yaml_model_parser.py
+++ b/unittests/test_yaml_model_parser.py
@@ -657,9 +657,11 @@ RT1:
   obligatory_properties:
     foo:
     RT2:
+      datatype: LIST<RT2>
     test_reference:
 
 RT2:
+  description: Describe RT2
 
 test_reference:
   datatype: RT2
@@ -681,10 +683,10 @@ test_reference:
   <RecordType id="2273" name="RT1">
     <Version id="0c1b9df6677ee40d1e1429b2123e078ee6c863e0" head="true"/>
     <Property id="2272" name="foo" description="bla bla" datatype="INTEGER" unit="m" importance="OBLIGATORY" flag="inheritance:FIX"/>
-    <Property id="2274" name="RT2" datatype="RT2" importance="OBLIGATORY" flag="inheritance:FIX"/>
+    <Property id="2274" name="RT2" description="Describe RT2" datatype="LIST&lt;RT2&gt;" importance="OBLIGATORY" flag="inheritance:FIX"/>
     <Property id="2275" name="test_reference" datatype="RT2" importance="OBLIGATORY" flag="inheritance:FIX"/>
   </RecordType>
-  <RecordType id="2274" name="RT2">
+  <RecordType id="2274" name="RT2" description="Describe RT2">
     <Version id="185940642680a7eba7f71914dd8dd7758dd13faa" head="true"/>
   </RecordType>
   <Property id="2275" name="test_reference" datatype="RT2">
@@ -699,13 +701,32 @@ test_reference:
     c3 = compare_entities(model["RT2"], entities[2])
     c4 = compare_entities(model["test_reference"], entities[3])
 
+    # Make sure the mock response matches the datamodel definiton
+    # exactly, i.e., they only differ in ids which are None for all
+    # entities from the datamodel and not None for the mocked
+    # response.
     for cs in (c1, c2, c3, c4):
         assert "id" in cs[0]
         assert cs[0]["id"] is None
+        assert cs[0]["parents"] == []
+        for name, val in cs[0]["properties"].items():
+            # Also properties differ in ids: The one from the
+            # datamodel have None
+            assert len(val) == 1
+            assert "id" in val
+            assert val["id"] is None
         assert "id" in cs[1]
         assert cs[1]["id"] is not None
+        assert cs[1]["parents"] == []
+        for name, val in cs[1]["properties"].items():
+            # Also properties differ in ids: The one from the
+            # mock response have not None
+            assert len(val) == 1
+            assert "id" in val
+            assert val["id"] is not None
 
     # The server response would be the same as the xml above:
+
     def get_existing_entities(ent_cont):
         return entities
 
-- 
GitLab


From 92644ba4f92edf900967511e3962be213917d6a3 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Sat, 23 Nov 2024 15:39:53 +0100
Subject: [PATCH 053/106] BUG: convert.XLSXConverter._validate_and_convert now
 parses booleans that were retrieved as integer or a formula

---
 src/caosadvancedtools/table_json_conversion/convert.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index 3c5b78fa..f775709a 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -478,6 +478,12 @@ class XLSXConverter:
             if isinstance(value, datetime.date) and (
                     {'type': 'string', 'format': 'date'} in subschema["anyOf"]):
                 return value
+        # booleans might be retrieved as an integer or formula
+        if subschema.get('type') == 'boolean':
+            if value == 0 or isinstance(value, str) and 'false' in value.lower():
+                value = False
+            if value == 1 or isinstance(value, str) and 'true' in value.lower():
+                value = True
         jsonschema.validate(value, subschema)
 
         # Finally: convert to target type
-- 
GitLab


From 1056109870169a2d4e029a1c07d40bdc358082d7 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Sat, 23 Nov 2024 15:41:10 +0100
Subject: [PATCH 054/106] TST: test_read_xlsx..test_error_table now fails if
 boolean is not parsed correctly

---
 unittests/table_json_conversion/test_read_xlsx.py | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index ac0a42b5..cd5d53dd 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -143,12 +143,7 @@ def test_error_table():
     assert str(caught.value).count("Malformed metadata: Cannot parse paths in worksheet") == 1
     assert str(caught.value).count("There is no entry in the schema") == 1
     assert str(caught.value).count("is not one of") == 1
-    # FIXME ToDo: Remove when boolean is fixed / when everything works as
-    #             expected, set correct number.
-    if "is not of type 'boolean'" in str(caught.value):
-        assert str(caught.value).count("is not of type") == 6
-    else:
-        assert str(caught.value).count("is not of type") == 4
+    assert str(caught.value).count("is not of type") == 4
     # Check correct error message for completely unknown path
     with pytest.raises(jsonschema.ValidationError) as caught:
         convert.to_dict(xlsx=rfp("data/simple_data_broken_paths.xlsx"),
-- 
GitLab


From dce79e16be5be0b087405858933ccae02d97e300 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Mon, 25 Nov 2024 13:26:52 +0100
Subject: [PATCH 055/106] DOC: Changelog.

---
 CHANGELOG.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d97250f2..aa1511c8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added ###
 
 * Official support for Python 3.13
+* New setup extras `test` and `doc` which install the dependencies for testing and documentation.
 
 ### Changed ###
 
-- 
GitLab


From 2f34d766793a160c7a356417e79942eed9f267fe Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 26 Nov 2024 09:30:15 +0100
Subject: [PATCH 056/106] MAINT: Pipeline cleanup.

---
 .gitlab-ci.yml |  3 +--
 CHANGELOG.md   |  5 ++++-
 setup.py       |  9 ++++++---
 tox.ini        | 14 ++++----------
 4 files changed, 15 insertions(+), 16 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cc0a1f73..0e953065 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -139,9 +139,8 @@ unittest_py38:
   stage: unittest
   image: python:3.8
   script: &python_test_script
-    - pip install pynose pandas
     - pip install git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev
-    - pip install .[test,h5-crawler,gitignore-parser]
+    - pip install .[all]
     - pytest --cov=caosadvancedtools unittests
 
 unittest_py310:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa1511c8..18647b88 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,7 +9,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Added ###
 
 * Official support for Python 3.13
-* New setup extras `test` and `doc` which install the dependencies for testing and documentation.
 
 ### Changed ###
 
@@ -17,6 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
   following exposed names / features:
   - `models.data_model.LINKAHEAD_INTERNAL_PROPERTIES`
   - `export_related.export` exports to `linkahead_data.xml` now.
+- Renamed (and added) installation "extra" options:
+  - `h5` instead of `h5-crawler`
+  - `doc`, `test` and `all` are new, they install the dependencies for testing, documentation and
+    everything.
 
 ### Deprecated ###
 
diff --git a/setup.py b/setup.py
index 08908baa..747324fb 100755
--- a/setup.py
+++ b/setup.py
@@ -163,7 +163,7 @@ def setup_package():
                           "pandas>=1.2.0",
                           "xlrd>=2.0",
                           ],
-        extras_require={"h5-crawler": ["h5py>=3.3.0", ],
+        extras_require={"h5": ["h5py>=3.3.0", ],
                         "gitignore-parser": ["gitignore-parser >=0.1.0", ],
                         "doc": [
                             "sphinx",
@@ -171,13 +171,16 @@ def setup_package():
                             "sphinx-rtd-theme",
                             "recommonmark >= 0.6.0",
                         ],
-                        "test": [
-                            "gitignore-parser",
+                        "test": [  # include: h5, gitignore-parser
                             "pytest",
                             "pytest-pythonpath",
                             "pytest-cov",
                             "coverage>=4.4.2",
+                            "caosadvancedtools[h5, gitignore-parser]",
                         ],
+                        "all": [  # include: doc, test
+                            "caosadvancedtools[doc, test]",
+                        ]
                         },
         setup_requires=["pytest-runner>=2.0,<3dev"],
         packages=find_packages('src'),
diff --git a/tox.ini b/tox.ini
index a7e06bf5..12c7ad50 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,18 +1,12 @@
 [tox]
-envlist=py38, py39, py310, py311, py312, py313
+envlist = py38, py39, py310, py311, py312, py313
 skip_missing_interpreters = true
 
 [testenv]
-deps=nose
-    pandas
+deps =
     git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev
-    pytest
-    pytest-cov
-    gitignore-parser
-    openpyxl >= 3.0.7
-    xlrd == 1.2
-    h5py
-commands=py.test --cov=caosadvancedtools --cov-report=html:.tox/cov_html -vv {posargs}
+extras = test
+commands = py.test --cov=caosadvancedtools --cov-report=html:.tox/cov_html -vv {posargs}
 
 [flake8]
 max-line-length=100
-- 
GitLab


From 8773ccbecbc61d34ea6890573d01f474a3cf82a4 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 26 Nov 2024 12:36:36 +0100
Subject: [PATCH 057/106] FIX: Dockerfile

---
 .docker/Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.docker/Dockerfile b/.docker/Dockerfile
index 5b26c03c..f028bbb1 100644
--- a/.docker/Dockerfile
+++ b/.docker/Dockerfile
@@ -29,6 +29,6 @@ RUN pip3 install -U html2text pycodestyle pylint recommonmark sphinx-rtd-theme g
 COPY . /git
 RUN rm -r /git/.git \
     && mv /git/.docker/pycaosdb.ini /git/integrationtests
-RUN cd /git && pip3 install .[h5-crawler]
+RUN cd /git && pip3 install .[all]
 WORKDIR /git/integrationtests
 CMD /wait-for-it.sh caosdb-server:10443 -t 500 -- ./test.sh --force
-- 
GitLab


From 4b6826d00d991bc3eb00a7ef99bc15106f14837c Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 26 Nov 2024 13:03:50 +0100
Subject: [PATCH 058/106] FIX: Use current pip in pipeline.

---
 .docker/Dockerfile | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/.docker/Dockerfile b/.docker/Dockerfile
index f028bbb1..5e412efc 100644
--- a/.docker/Dockerfile
+++ b/.docker/Dockerfile
@@ -21,14 +21,15 @@ RUN apt-get update && \
 
 COPY .docker/wait-for-it.sh /wait-for-it.sh
 ADD https://gitlab.com/api/v4/projects/13656973/repository/branches/dev \
-   pylib_version.json
+  pylib_version.json
+RUN pip install -U pip
 RUN git clone https://gitlab.com/caosdb/caosdb-pylib.git && \
-   cd caosdb-pylib && git checkout dev && pip3 install .
+   cd caosdb-pylib && git checkout dev && pip install .
 # At least recommonmark 0.6 required.
-RUN pip3 install -U html2text pycodestyle pylint recommonmark sphinx-rtd-theme gitignore-parser
+RUN pip install -U html2text pycodestyle pylint recommonmark sphinx-rtd-theme gitignore-parser
 COPY . /git
 RUN rm -r /git/.git \
     && mv /git/.docker/pycaosdb.ini /git/integrationtests
-RUN cd /git && pip3 install .[all]
+RUN cd /git && pip install .[all]
 WORKDIR /git/integrationtests
 CMD /wait-for-it.sh caosdb-server:10443 -t 500 -- ./test.sh --force
-- 
GitLab


From 0506e93eb8ac7916872c04a566db4174e7aa81a9 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 26 Nov 2024 13:07:14 +0100
Subject: [PATCH 059/106] MAINT: Pipeline optimization

---
 .docker/Dockerfile | 16 ++++------------
 setup.py           |  7 ++++++-
 2 files changed, 10 insertions(+), 13 deletions(-)

diff --git a/.docker/Dockerfile b/.docker/Dockerfile
index 5e412efc..03b8278d 100644
--- a/.docker/Dockerfile
+++ b/.docker/Dockerfile
@@ -2,20 +2,12 @@ FROM debian:11
 RUN apt-get update && \
     apt-get install \
     curl \
-    libhdf5-dev \
     pkgconf \
     python3 \
     python3-pip \
-    python3-requests \
-    python3-pandas \
-    python3-html2text \
-    python3-sphinx \
     tox \
     git \
     openjdk-11-jdk-headless \
-    python3-autopep8 \
-    python3-pytest \
-    libxml2 \
     -y
 
 
@@ -23,13 +15,13 @@ COPY .docker/wait-for-it.sh /wait-for-it.sh
 ADD https://gitlab.com/api/v4/projects/13656973/repository/branches/dev \
   pylib_version.json
 RUN pip install -U pip
-RUN git clone https://gitlab.com/caosdb/caosdb-pylib.git && \
-   cd caosdb-pylib && git checkout dev && pip install .
+RUN git clone --depth 1 --branch dev https://gitlab.com/caosdb/caosdb-pylib.git && \
+   cd caosdb-pylib && pip install -U .
 # At least recommonmark 0.6 required.
-RUN pip install -U html2text pycodestyle pylint recommonmark sphinx-rtd-theme gitignore-parser
+# RUN pip install -U html2text pycodestyle pylint recommonmark sphinx-rtd-theme gitignore-parser
 COPY . /git
 RUN rm -r /git/.git \
     && mv /git/.docker/pycaosdb.ini /git/integrationtests
-RUN cd /git && pip install .[all]
+RUN cd /git && pip install -U .[all]
 WORKDIR /git/integrationtests
 CMD /wait-for-it.sh caosdb-server:10443 -t 500 -- ./test.sh --force
diff --git a/setup.py b/setup.py
index 747324fb..732bbf61 100755
--- a/setup.py
+++ b/setup.py
@@ -165,6 +165,11 @@ def setup_package():
                           ],
         extras_require={"h5": ["h5py>=3.3.0", ],
                         "gitignore-parser": ["gitignore-parser >=0.1.0", ],
+                        "dev": [
+                            "autopep8",
+                            "pycodestyle",
+                            "pylint",
+                        ],
                         "doc": [
                             "sphinx",
                             "sphinx-autoapi",
@@ -179,7 +184,7 @@ def setup_package():
                             "caosadvancedtools[h5, gitignore-parser]",
                         ],
                         "all": [  # include: doc, test
-                            "caosadvancedtools[doc, test]",
+                            "caosadvancedtools[dev, doc, test]",
                         ]
                         },
         setup_requires=["pytest-runner>=2.0,<3dev"],
-- 
GitLab


From a47f95adc9ab823ac6ebf622a235058d5a84be6f Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 26 Nov 2024 13:16:15 +0100
Subject: [PATCH 060/106] MAINT: Debian 12 in pipeline

---
 .docker/Dockerfile | 12 ++++--------
 .gitlab-ci.yml     | 18 +++++++++---------
 2 files changed, 13 insertions(+), 17 deletions(-)

diff --git a/.docker/Dockerfile b/.docker/Dockerfile
index 03b8278d..0ce75f43 100644
--- a/.docker/Dockerfile
+++ b/.docker/Dockerfile
@@ -1,27 +1,23 @@
-FROM debian:11
+FROM debian:12
 RUN apt-get update && \
     apt-get install \
-    curl \
-    pkgconf \
     python3 \
     python3-pip \
     tox \
     git \
-    openjdk-11-jdk-headless \
     -y
 
 
 COPY .docker/wait-for-it.sh /wait-for-it.sh
 ADD https://gitlab.com/api/v4/projects/13656973/repository/branches/dev \
   pylib_version.json
-RUN pip install -U pip
-RUN git clone --depth 1 --branch dev https://gitlab.com/caosdb/caosdb-pylib.git && \
-   cd caosdb-pylib && pip install -U .
+RUN pip install --break-system-packages -U pip
+RUN pip install --break-system-packages -U git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev
 # At least recommonmark 0.6 required.
 # RUN pip install -U html2text pycodestyle pylint recommonmark sphinx-rtd-theme gitignore-parser
 COPY . /git
 RUN rm -r /git/.git \
     && mv /git/.docker/pycaosdb.ini /git/integrationtests
-RUN cd /git && pip install -U .[all]
+RUN cd /git && pip install --break-system-packages -U .[all]
 WORKDIR /git/integrationtests
 CMD /wait-for-it.sh caosdb-server:10443 -t 500 -- ./test.sh --force
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0e953065..aeb28eca 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -123,14 +123,14 @@ linting:
       - make lint
   allow_failure: true
 
-unittest_py39:
+unittest_py311:
   tags: [docker]
   stage: unittest
   image: $CI_REGISTRY_IMAGE
   needs: [build-testenv]
   script:
-    # First verify that system Python actually is 3.9
-    - python3 -c "import sys; assert sys.version.startswith('3.9')"
+    # First verify that system Python actually is 3.11
+    - python3 -c "import sys; assert sys.version.startswith('3.11')"
     - python3 -c "import linkahead; print('LinkAhead Version:', linkahead.__version__)"
     - tox
 
@@ -139,20 +139,20 @@ unittest_py38:
   stage: unittest
   image: python:3.8
   script: &python_test_script
-    - pip install git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev
-    - pip install .[all]
+    - pip install --break-system-packages git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev
+    - pip install --break-system-packages .[all]
     - pytest --cov=caosadvancedtools unittests
 
-unittest_py310:
+unittest_py39:
   tags: [docker]
   stage: unittest
-  image: python:3.10
+  image: python:3.9
   script: *python_test_script
 
-unittest_py311:
+unittest_py310:
   tags: [docker]
   stage: unittest
-  image: python:3.11
+  image: python:3.10
   script: *python_test_script
 
 unittest_py312:
-- 
GitLab


From 8ab1417f0d793e3dec344c3b4a90192e4f977230 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 26 Nov 2024 13:30:41 +0100
Subject: [PATCH 061/106] DOC: CHANGELOG

---
 .gitlab-ci.yml | 1 +
 CHANGELOG.md   | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index aeb28eca..d2c7f75b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -123,6 +123,7 @@ linting:
       - make lint
   allow_failure: true
 
+# The Python version provided by the OS.
 unittest_py311:
   tags: [docker]
   stage: unittest
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 18647b88..d156dced 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -18,8 +18,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
   - `export_related.export` exports to `linkahead_data.xml` now.
 - Renamed (and added) installation "extra" options:
   - `h5` instead of `h5-crawler`
-  - `doc`, `test` and `all` are new, they install the dependencies for testing, documentation and
-    everything.
+  - `dev`, `doc`, `test` and `all` are new, they install the dependencies for developing, testing,
+    documentation and everything.
 
 ### Deprecated ###
 
-- 
GitLab


From 74510469da1c0a7efd25ad30e2faccbaf2525a0d Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 26 Nov 2024 15:41:27 +0100
Subject: [PATCH 062/106] FIX: Pipeline (also some LinkAhead renaming)

---
 .docker/Dockerfile                        | 5 +++--
 .docker/docker-compose.yml                | 4 ++--
 .docker/local_testing.sh                  | 2 +-
 .docker/{pycaosdb.ini => pylinkahead.ini} | 2 +-
 .gitlab-ci.yml                            | 2 +-
 integrationtests/test.sh                  | 2 +-
 6 files changed, 9 insertions(+), 8 deletions(-)
 rename .docker/{pycaosdb.ini => pylinkahead.ini} (88%)

diff --git a/.docker/Dockerfile b/.docker/Dockerfile
index 0ce75f43..905cf5e3 100644
--- a/.docker/Dockerfile
+++ b/.docker/Dockerfile
@@ -5,6 +5,7 @@ RUN apt-get update && \
     python3-pip \
     tox \
     git \
+    openjdk-17-jdk-headless \
     -y
 
 
@@ -17,7 +18,7 @@ RUN pip install --break-system-packages -U git+https://gitlab.indiscale.com/caos
 # RUN pip install -U html2text pycodestyle pylint recommonmark sphinx-rtd-theme gitignore-parser
 COPY . /git
 RUN rm -r /git/.git \
-    && mv /git/.docker/pycaosdb.ini /git/integrationtests
+    && mv /git/.docker/pylinkahead.ini /git/integrationtests
 RUN cd /git && pip install --break-system-packages -U .[all]
 WORKDIR /git/integrationtests
-CMD /wait-for-it.sh caosdb-server:10443 -t 500 -- ./test.sh --force
+CMD /wait-for-it.sh docker-linkahead-server-1:10443 -t 300 --strict -- ./test.sh --force
diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml
index 36964ee6..61d455f4 100644
--- a/.docker/docker-compose.yml
+++ b/.docker/docker-compose.yml
@@ -1,12 +1,12 @@
 version: '3.7'
 services:
   sqldb:
-    image: mariadb:10.4
+    image: mariadb:10.11
     environment:
       MYSQL_ROOT_PASSWORD: caosdb1234
     networks:
       - caosnet
-  caosdb-server:
+  linkahead-server:
     image: "$CI_REGISTRY/caosdb/src/caosdb-deploy:$CAOSDB_TAG"
     user: 999:999
     depends_on:
diff --git a/.docker/local_testing.sh b/.docker/local_testing.sh
index bdecf73b..bbe7d8af 100755
--- a/.docker/local_testing.sh
+++ b/.docker/local_testing.sh
@@ -10,7 +10,7 @@ CI_REGISTRY_IMAGE=registry.indiscale.com/caosdb-advanced-testenv \
 CI_REGISTRY=registry.indiscale.com EXEPATH=`pwd` CAOSDB_TAG=dev-latest \
 	docker-compose -f .docker/docker-compose.yml up -d
 cd .docker
-CAOSHOSTNAME=caosdb-server ./cert.sh
+CAOSHOSTNAME=linkahead-server ./cert.sh
 CI_REGISTRY_IMAGE=registry.indiscale.com/caosdb-advanced-testenv  ./run.sh
 docker-compose  down
 
diff --git a/.docker/pycaosdb.ini b/.docker/pylinkahead.ini
similarity index 88%
rename from .docker/pycaosdb.ini
rename to .docker/pylinkahead.ini
index 652d5369..bfa5705b 100644
--- a/.docker/pycaosdb.ini
+++ b/.docker/pylinkahead.ini
@@ -2,7 +2,7 @@
 test_server_side_scripting.bin_dir=../caosdb-server/test_scripting/bin/
 
 [Connection]
-url=https://caosdb-server:10443
+url=https://linkahead-server:10443
 username=admin
 cacert=/opt/caosdb/cert/caosdb.cert.pem
 debug=0
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d2c7f75b..5f9d7fe4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -58,7 +58,7 @@ test:
       - cd .docker
       - /bin/sh ./run.sh
       - cd ..
-      - docker logs docker-caosdb-server-1 &> caosdb_log.txt
+      - docker logs docker-linkahead-server-1 &> caosdb_log.txt
       - docker logs docker-sqldb-1 &> mariadb_log.txt
       - docker-compose -f .docker/docker-compose.yml down
       - rc=`cat .docker/result`
diff --git a/integrationtests/test.sh b/integrationtests/test.sh
index a31afcfd..952a4dd2 100755
--- a/integrationtests/test.sh
+++ b/integrationtests/test.sh
@@ -15,7 +15,7 @@ then
 fi
 OUT=/tmp/crawler.output
 ls
-cat pycaosdb.ini
+cat pylinkahead.ini
 python3 -c "import linkahead; print('LinkAhead Version:', linkahead.__version__)"
 rm -rf /tmp/caosdb_identifiable_cache.db
 set -e
-- 
GitLab


From 85745c50611d29a38573c3bdc1bd476628caf315 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Tue, 26 Nov 2024 15:53:35 +0100
Subject: [PATCH 063/106] MAINT: Cleanup pipeline

---
 .docker/Dockerfile | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/.docker/Dockerfile b/.docker/Dockerfile
index 905cf5e3..7ab3e655 100644
--- a/.docker/Dockerfile
+++ b/.docker/Dockerfile
@@ -12,10 +12,7 @@ RUN apt-get update && \
 COPY .docker/wait-for-it.sh /wait-for-it.sh
 ADD https://gitlab.com/api/v4/projects/13656973/repository/branches/dev \
   pylib_version.json
-RUN pip install --break-system-packages -U pip
 RUN pip install --break-system-packages -U git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev
-# At least recommonmark 0.6 required.
-# RUN pip install -U html2text pycodestyle pylint recommonmark sphinx-rtd-theme gitignore-parser
 COPY . /git
 RUN rm -r /git/.git \
     && mv /git/.docker/pylinkahead.ini /git/integrationtests
-- 
GitLab


From fcbffa468f967b306002ea10cc1aa74f7926fbd2 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Wed, 27 Nov 2024 14:24:15 +0100
Subject: [PATCH 064/106] !MAINT: Removed labfolder converter.

For the time being, it lives on in the `f-labfolder-converter` branch.
---
 CHANGELOG.md                                  |     2 +
 manual_tests/test_labfolder_import.py         |    46 -
 manual_tests/test_labfolder_retrieve.py       |    46 -
 pylintrc                                      |     2 +-
 src/caosadvancedtools/converter/__init__.py   |     0
 .../converter/labfolder_api.py                |   164 -
 .../converter/labfolder_export.py             |   228 -
 src/doc/conf.py                               |     1 -
 .../example_labfolder_data/projects.html      |   138 -
 .../click_on_extract_4624688_10.xlsx          |   Bin 21312 -> 0 bytes
 .../click_on_preview_4624688_9.docx           |   Bin 68424 -> 0 bytes
 .../click_on_view_4624688_8.pdf               |   Bin 69318 -> 0 bytes
 .../image_945829_4624688_image_element.png    |   Bin 65912 -> 0 bytes
 .../image_946047_4625717_blank.png            |   Bin 8356 -> 0 bytes
 .../118217_Example project/index.html         |  1788 --
 .../labfolder_table_4624688_11.xlsx           |   Bin 12036 -> 0 bytes
 .../labfolder_table_4625212_3.xlsx            |   Bin 5564 -> 0 bytes
 .../original_image_946047_4625717_blank.png   |   Bin 2399 -> 0 bytes
 .../118224_subproj 1/index.html               |     0
 .../static/css/combined.css                   | 10061 -----------
 .../static/css/data-elements.css              |   104 -
 .../static/css/eln_layout.css                 |  3101 ----
 .../static/css/export-entry-footer.css        |    43 -
 .../static/css/export-table-element.css       |    35 -
 .../static/css/jquery-ui.css                  |   474 -
 .../static/css/notebook.css                   |  2194 ---
 .../static/css/pixel_icon.css                 |   570 -
 .../static/css/redactor.css                   |  1112 --
 .../static/css/tree.css                       |   454 -
 .../static/font/icons11.eot                   |   Bin 37880 -> 0 bytes
 .../static/font/icons11.svg                   |   114 -
 .../static/font/icons11.ttf                   |   Bin 37716 -> 0 bytes
 .../static/font/icons11.woff                  |   Bin 26056 -> 0 bytes
 .../static/font/redactor-font.eot             |   Bin 6224 -> 0 bytes
 .../static/img/favicon2.ico                   |   Bin 1150 -> 0 bytes
 .../static/img/labfolder_icons.png            |   Bin 17304 -> 0 bytes
 .../static/img/squares.png                    |   Bin 228 -> 0 bytes
 .../static/js/jquery-1.8.2.min.js             |     2 -
 .../static/js/jquery-ui.js                    | 14912 ----------------
 .../static/js/labfolder-global.js             |    81 -
 .../example_labfolder_data/static/js/tree.js  |   505 -
 .../example_labfolder_data/templates.html     |   135 -
 .../118218_test_template/index.html           |   437 -
 .../118219_template2/index.html               |   653 -
 .../labfolder_table_4625184_3.xlsx            |   Bin 5564 -> 0 bytes
 45 files changed, 3 insertions(+), 37399 deletions(-)
 delete mode 100644 manual_tests/test_labfolder_import.py
 delete mode 100644 manual_tests/test_labfolder_retrieve.py
 delete mode 100644 src/caosadvancedtools/converter/__init__.py
 delete mode 100644 src/caosadvancedtools/converter/labfolder_api.py
 delete mode 100644 src/caosadvancedtools/converter/labfolder_export.py
 delete mode 100644 unittests/example_labfolder_data/projects.html
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_extract_4624688_10.xlsx
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_preview_4624688_9.docx
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_view_4624688_8.pdf
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/image_945829_4624688_image_element.png
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/image_946047_4625717_blank.png
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/index.html
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/labfolder_table_4624688_11.xlsx
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/labfolder_table_4625212_3.xlsx
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/original_image_946047_4625717_blank.png
 delete mode 100644 unittests/example_labfolder_data/projects/My private projects_0/118224_subproj 1/index.html
 delete mode 100644 unittests/example_labfolder_data/static/css/combined.css
 delete mode 100644 unittests/example_labfolder_data/static/css/data-elements.css
 delete mode 100644 unittests/example_labfolder_data/static/css/eln_layout.css
 delete mode 100644 unittests/example_labfolder_data/static/css/export-entry-footer.css
 delete mode 100644 unittests/example_labfolder_data/static/css/export-table-element.css
 delete mode 100644 unittests/example_labfolder_data/static/css/jquery-ui.css
 delete mode 100644 unittests/example_labfolder_data/static/css/notebook.css
 delete mode 100644 unittests/example_labfolder_data/static/css/pixel_icon.css
 delete mode 100644 unittests/example_labfolder_data/static/css/redactor.css
 delete mode 100644 unittests/example_labfolder_data/static/css/tree.css
 delete mode 100644 unittests/example_labfolder_data/static/font/icons11.eot
 delete mode 100644 unittests/example_labfolder_data/static/font/icons11.svg
 delete mode 100644 unittests/example_labfolder_data/static/font/icons11.ttf
 delete mode 100644 unittests/example_labfolder_data/static/font/icons11.woff
 delete mode 100644 unittests/example_labfolder_data/static/font/redactor-font.eot
 delete mode 100644 unittests/example_labfolder_data/static/img/favicon2.ico
 delete mode 100644 unittests/example_labfolder_data/static/img/labfolder_icons.png
 delete mode 100644 unittests/example_labfolder_data/static/img/squares.png
 delete mode 100644 unittests/example_labfolder_data/static/js/jquery-1.8.2.min.js
 delete mode 100644 unittests/example_labfolder_data/static/js/jquery-ui.js
 delete mode 100644 unittests/example_labfolder_data/static/js/labfolder-global.js
 delete mode 100644 unittests/example_labfolder_data/static/js/tree.js
 delete mode 100644 unittests/example_labfolder_data/templates.html
 delete mode 100644 unittests/example_labfolder_data/templates/My private templates_0/118218_test_template/index.html
 delete mode 100644 unittests/example_labfolder_data/templates/My private templates_0/118219_template2/index.html
 delete mode 100644 unittests/example_labfolder_data/templates/My private templates_0/118219_template2/labfolder_table_4625184_3.xlsx

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d156dced..d070d8da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -26,6 +26,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Removed ###
 
 - Bloxberg code snippets. These were just a proof of concept, untested and never used in production.
+- Labfolder converter. It was broken anyway, not used by anyone we know and there were no automated
+  tests.  For the time being, it lives on in the `f-labfolder-converter` branch.
 
 ### Fixed ###
 
diff --git a/manual_tests/test_labfolder_import.py b/manual_tests/test_labfolder_import.py
deleted file mode 100644
index abc5eb11..00000000
--- a/manual_tests/test_labfolder_import.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python3
-#
-# This file is a part of the LinkAhead project.
-#
-# Copyright (c) 2020 IndiScale GmbH
-# Copyright (c) 2020 Daniel Hornung <d.hornung@indiscale.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
-#
-
-""" Imports labfolder exports """
-
-import argparse
-import sys
-
-import caosmodels
-from caosmodels.parser import parse_model_from_yaml
-
-from caosadvancedtools.converter import labfolder_export as labfolder
-
-
-def main(args):
-    """The main function."""
-    model = parse_model_from_yaml("./models/model.yml")
-
-    model.sync_data_model()
-    labfolder.import_data(args.folder)
-
-
-if __name__ == "__main__":
-    parser = argparse.ArgumentParser()
-    parser.add_argument("folder", default="./example_labfolder_data",
-                        nargs="?", help='folder that contains the data')
-    args = parser.parse_args()
-    sys.exit(main(args))
diff --git a/manual_tests/test_labfolder_retrieve.py b/manual_tests/test_labfolder_retrieve.py
deleted file mode 100644
index a7f56e80..00000000
--- a/manual_tests/test_labfolder_retrieve.py
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/usr/bin/env python3
-#
-# This file is a part of the LinkAhead project.
-#
-# Copyright (c) 2020 IndiScale GmbH
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
-#
-
-""" Retrieve Labfolder data from API """
-
-import argparse
-import sys
-
-import caosmodels
-from caosmodels.parser import parse_model_from_yaml
-
-from caosadvancedtools.converter.labfolder_api import Importer
-
-
-def main(args):
-    """The main function."""
-    model = parse_model_from_yaml("./models/model.yml")
-
-    # model.sync_data_model()
-    importer = Importer()
-    importer.import_data()
-
-
-if __name__ == "__main__":
-    parser = argparse.ArgumentParser()
-    parser.add_argument("folder", default="./example_labfolder_data",
-                        nargs="?", help='folder that contains the data')
-    args = parser.parse_args()
-    sys.exit(main(args))
diff --git a/pylintrc b/pylintrc
index d3a2e89a..1be7cd8d 100644
--- a/pylintrc
+++ b/pylintrc
@@ -6,7 +6,7 @@ good-names=ii,rt,df
 # List of module names for which member attributes should not be checked
 # (useful for modules/projects where namespaces are manipulated during runtime
 # and thus existing member attributes cannot be deduced by static analysis
-ignored-modules=etree,h5py,labfolder
+ignored-modules=etree,h5py
 
 [MASTER]
 # TODO: The max_inferred size is necessary for https://github.com/PyCQA/pylint/issues/4577,
diff --git a/src/caosadvancedtools/converter/__init__.py b/src/caosadvancedtools/converter/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/caosadvancedtools/converter/labfolder_api.py b/src/caosadvancedtools/converter/labfolder_api.py
deleted file mode 100644
index fe77282a..00000000
--- a/src/caosadvancedtools/converter/labfolder_api.py
+++ /dev/null
@@ -1,164 +0,0 @@
-#!/usr/bin/env python3
-#
-# This file is a part of the LinkAhead project.
-#
-# Copyright (c) 2020 IndiScale GmbH
-# Copyright (c) 2020 Daniel Hornung <d.hornung@indiscale.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
-#
-
-""" Imports data from labfolder via api """
-
-import json
-import os
-import time
-
-import html2text
-
-import linkahead as db
-from labfolder.connection import configure_connection  # pylint: disable=import-error
-
-
-class Importer(object):
-    def __init__(self):
-        self.connection = configure_connection()
-        self.projects = self.connection.retrieve_projects()
-        self.entries = self.connection.retrieve_entries()
-
-    def create_project(self, project):
-        dbproject = db.Record(name=project['title'])
-        dbproject.add_parent(name="Project")
-        dbproject.add_property(name="projectId", value=project['id'])
-        # crawler.cached_find_identifiables([dbproject])
-
-        return dbproject
-
-    def get_entries(self, project_id):
-        return [ent for ent in self.entries if ent["project_id"] == project_id]
-
-    def treat_project(self, project):
-        cont = db.Container()
-        dbproject = self.create_project(project)
-        cont.append(dbproject)
-
-        for entry in self.get_entries(project["id"]):
-            recs = self.create_entry(entry, dbproject)
-            cont.extend(recs)
-
-        print(cont)
-        cont.insert(unique=False)
-        # import IPython
-        # IPython.embed()
-
-    def import_data(self):
-        for project in self.projects:
-            self.treat_project(project)
-
-    def add_property_from_data_element(self, dbrecord, element):
-
-        if element['type'] == "DATA_ELEMENT_GROUP":
-            for c in element["children"]:
-                self.add_property_from_data_element(dbrecord, c)
-        elif element['type'] == "SINGLE_DATA_ELEMENT":
-
-            # if quant is not None:
-            # quant = quant.strip(": ")
-            # title = title+" - "+quant
-            res = db.execute_query("FIND PROPERTY '{}'".format(element['title']))
-
-            if len(res) == 0:
-                p = db.Property(name=element['title'], unit=element['unit'], datatype=db.DOUBLE)
-                try:
-                    p.insert()
-                except db.exceptions.TransactionError as e:
-                    print(e)
-
-                    return
-            val = element['value']
-            try:
-                val = float(val)
-            except (ValueError, TypeError):
-                print("Value is no float!!!", val)
-
-                return
-            dbrecord.add_property(name=element['title'], value=val, unit=element['unit'])
-        elif element['type'] == "DESCRIPTIVE_DATA_ELEMENT":
-            res = db.execute_query("FIND PROPERTY '{}'".format(element['title']))
-
-            if len(res) == 0:
-                p = db.Property(name=element['title'], datatype=db.TEXT)
-                p.insert()
-            dbrecord.add_property(name=element['title'],
-                                  value=element['description'])
-
-    def create_element(self, element_id, el_type, dbrecord):
-        print(element_id, el_type)
-
-        if el_type == "IMAGE":
-            el_type = "FILE"
-        elif el_type == "DATA_ELEMENT":
-            el_type = "DATA"
-
-        try:
-            element = self.connection.retrieve_element(element_id, el_type=el_type)
-        except BaseException:
-            print("Could not retrieve: ", element_id)
-
-            return
-
-        if el_type == "TEXT":
-            dbrecord.add_property(
-                name="textElement",
-                value=html2text.html2text(element["content"]))
-        elif el_type == "FILE":
-            local_file = self.connection.download_file(element_id)
-            f = db.File(name=element["file_name"],
-                        path=os.path.join("labfolder", str(time.time()),
-                                          element["file_name"]),
-                        file=local_file)
-            f.insert(unique=False)
-            dbrecord.add_property(name="associatedFile", value=f)
-
-        elif el_type == "DATA":
-            for subel in element["data_elements"]:
-                self.add_property_from_data_element(dbrecord=dbrecord,
-                                                    element=subel)
-        elif el_type == "TABLE":
-            print(element)
-
-    def create_entry(self, entry, dbproject):
-        cont = db.Container()
-        dbrecord = db.Record(name=entry["title"])
-        dbrecord.add_parent(name="LabbookEntry")
-        dbrecord.add_property(name="Project", value=dbproject)
-        dbrecord.add_property(name="entryId", value=entry['id'])
-        # crawler.cached_find_identifiables([dbrecord])
-
-        # TODO resolve id
-        # person = get_author_from_entry(entry)
-        # dbrecord.add_property(name="responsible", value=person)
-
-        for element in entry["elements"]:
-
-            print(json.dumps(element, sort_keys=True, indent=4))
-            self.create_element(element["id"], element["type"], dbrecord)
-            # If all text field would have the class dd_text_entry the
-            # following would be sufficient:
-            # if 'dd_text_entry' in block['class']:
-            # instead we check whether an editor field exists.
-
-        cont.extend([dbrecord])
-
-        return cont
diff --git a/src/caosadvancedtools/converter/labfolder_export.py b/src/caosadvancedtools/converter/labfolder_export.py
deleted file mode 100644
index ae38cb10..00000000
--- a/src/caosadvancedtools/converter/labfolder_export.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/usr/bin/env python3
-#
-# This file is a part of the LinkAhead project.
-#
-# Copyright (c) 2020 IndiScale GmbH
-# Copyright (c) 2020 Daniel Hornung <d.hornung@indiscale.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
-#
-
-""" Imports labfolder exports """
-
-import os
-
-from bs4 import BeautifulSoup
-
-import linkahead as db
-
-RERUN = False
-# crawler = Crawler()
-
-print("""
-WARNING: This is an ALPHA version. Parsing of the by labfolder exported data
-might not work correctly! There might be missing elements! Check the result
-carefully before inserting it.
-""")
-
-
-def create_project(project):
-    dbproject = db.Record(name=project.attrs['data-name'])
-    dbproject.add_parent(name="Project")
-    dbproject.add_property(name="projectId", value=project.attrs['data-id'])
-    # crawler.cached_find_identifiables([dbproject])
-
-    return dbproject
-
-
-def get_author_from_entry(entry):
-    person = db.Record()
-    person.add_parent(name="Person")
-    resp = entry.find_all(attrs={'class': 'author_name'})
-
-    for name in ["firstname", "lastname"]:
-        person.add_property(
-            name=name,
-            value=resp[0].find_all(attrs={'class': 'author_'+name})[0].getText())
-    # crawler.cached_find_identifiables([person])
-
-    return person
-
-
-def val_or_none(stuff):
-    if len(stuff) == 0:
-        return None
-
-    return stuff[0].getText()
-
-
-def add_property_from_data_element(dbrecord, element):
-    unit = val_or_none(element.find_all(attrs={'class': 'element-unit'}))
-    title = val_or_none(element.find_all(attrs={'class': 'element-title'}))
-    quant = val_or_none(element.find_all(attrs={'class': 'element-quantity'}))
-    val = val_or_none(element.find_all(attrs={'class': 'element-value'}))
-
-    print("tit", title)
-    print("qu", quant)
-    if quant is not None:
-        quant = quant.strip(": ")
-        title = title+" - "+quant
-    res = db.execute_query("FIND PROPERTY '{}'".format(title))
-    if len(res) == 0:
-        p = db.Property(name=title, unit=unit, datatype=db.DOUBLE)
-        p.insert()
-    try:
-        val = float(val)
-    except TypeError:
-        print("Value is no float!!!", val)
-        return
-    dbrecord.add_property(name=title, value=val, unit=unit)
-
-
-def create_file(name, filename, root):
-    local_path = os.path.join(root, filename)
-    local_path = os.path.normpath(local_path)
-    if not os.path.exists(local_path):
-        raise ValueError("FILE DOES NOT EXIST: ", local_path)
-    f = db.File(path=local_path, file=local_path, name=name)
-    return f
-
-
-def create_entry(entry, dbproject, root):
-    cont = db.Container()
-    dbrecord = db.Record()
-    dbrecord.add_parent(name="LabbookEntry")
-    dbrecord.add_property(name="Project", value=dbproject)
-    dbrecord.add_property(name="entryId", value=entry.attrs['data-id'])
-    # crawler.cached_find_identifiables([dbrecord])
-
-    person = get_author_from_entry(entry)
-    dbrecord.add_property(name="responsible", value=person)
-
-    for block in entry.find_all(attrs={'class': 'dd_entry_cell'}):
-        # If all text field would have the class dd_text_entry the
-        # following would be sufficient:
-        # if 'dd_text_entry' in block['class']:
-        # instead we check whether an editor field exists.
-        editor = block.find_all(attrs={'class': 'redactor_editor'})
-
-        if len(editor) > 0:
-            dbrecord.add_property(name="textElement", value=editor[0].getText())
-
-            continue
-
-        download = block.find_all(
-            attrs={'class': 'dd_entry_cell_file_download'})
-
-        if len(download) > 0:
-            name = ((download[0].parent).attrs['data-filename']).strip('"')
-            if name == "blank.png":
-                continue
-            if len(download[0].find_all("img")) > 0:
-                filename = download[0].find_all("img")[0].attrs['src']
-            elif len(download[0].find_all("a")) > 0:
-                filename = download[0].find_all("a")[0].attrs['href']
-            else:
-                raise ValueError("could not get filename")
-            print(name)
-            print(filename)
-            f = create_file(name, filename, root)
-            if RERUN:
-                f.retrieve()
-            else:
-                f.insert()
-            dbrecord.add_property(name="associatedFile", value=f)
-            cont.append(f)
-
-            continue
-
-        elements = block.find_all(
-            attrs={'class': 'data-element-display'})
-
-        if len(elements) > 0:
-            for el in elements:
-                add_property_from_data_element(dbrecord=dbrecord, element=el)
-
-            continue
-
-        tables = block.find_all(
-            attrs={'class': 'table-el-container'})
-
-        if len(tables) > 0:
-            name = (tables[0]).find_all(
-                        attrs={'class': 'table-el-filename'}
-                    )[0].getText().strip()
-            f = create_file(name, name, root)
-            if RERUN:
-                f.retrieve()
-            else:
-                f.insert()
-            dbrecord.add_property(name="table", value=f)
-            cont.append(f)
-
-            continue
-
-        empty = block.find_all(
-            attrs={'class': 'dd_entry_empty_element'})
-
-        if len(tables) > 0:
-            print("\n\nempty")
-
-            continue
-
-    cont.extend([dbrecord, person])
-
-    return cont
-
-
-def treat_project(path):
-    with open(os.path.join(path, "index.html")) as fp:
-        tree = BeautifulSoup(fp, features="lxml")
-
-    cont = db.Container()
-    project = tree.find_all(id="eln_project_content")
-
-    if len(project) == 0:
-        return
-    else:
-        project = project[0]
-    dbproject = create_project(project)
-    cont.append(dbproject)
-
-    for entry in project.find_all(lambda x: x.has_attr('data-id')):
-        recs = create_entry(entry, dbproject, path)
-        cont.extend(recs)
-
-    print(cont)
-    cont.insert()
-    # import IPython
-    # IPython.embed()
-
-
-def import_data(folder):
-    """imports the data of a labfolder export"""
-
-    if not os.path.exists(folder):
-        raise ValueError("folder does not exist")
-
-    projects_folder = os.path.join(folder, "projects")
-
-    if not os.path.exists(projects_folder):
-        raise ValueError("folder does not contain a projects folder")
-
-    for root, dirs, files in os.walk(projects_folder):
-        print(root, dirs, files)
-
-        if "index.html" in files:
-            treat_project(root)
diff --git a/src/doc/conf.py b/src/doc/conf.py
index b769fd1e..e8975650 100644
--- a/src/doc/conf.py
+++ b/src/doc/conf.py
@@ -201,5 +201,4 @@ autodoc_default_options = {
     'undoc-members': None,
 }
 autodoc_mock_imports = [
-    "labfolder",
 ]
diff --git a/unittests/example_labfolder_data/projects.html b/unittests/example_labfolder_data/projects.html
deleted file mode 100644
index 6aafb8e2..00000000
--- a/unittests/example_labfolder_data/projects.html
+++ /dev/null
@@ -1,138 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-	<meta name="apple-mobile-web-app-capable" content="yes">
-	<meta name="apple-mobile-web-app-status-bar-style"
-		  content="black-translucent">
-	<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-	<title>Projects</title>
-
-	<link rel="shortcut icon" type="image/x-icon"
-		  href="static/img/favicon2.ico"/>
-
-	<script
-			src="static/js/jquery-1.8.2.min.js"
-			type="text/javascript"></script>
-
-	<script src="static/js/tree.js"
-			type="text/javascript"></script>
-
-
-	<!-- This must be the first labfolder JS file included -->
-	<script
-			src="static/js/labfolder-global.js?13fcc6eeb30608bb104f4b234c2fa3fd86699ffe"
-			type="text/javascript"></script>
-
-	<link rel="stylesheet" type="text/css"
-		  href="static/css/eln_layout.css"/>
-
-
-	<link rel="stylesheet" type="text/css"
-		  href="static/css/pixel_icon.css"/>
-
-	<link rel="stylesheet" type="text/css"
-		  href="static/css/tree.css"/>
-
-	<link rel="stylesheet" type="text/css"
-		  href="static/css/notebook.css"/>
-
-</head>
-<body>
-<div class="body_bg"></div>
-<div class="eln_header eln_row">
-	<div class="headerbar_top">
-		<a href="/eln/"><span class="logo-img"></span></a>
-		<header>
-			<span aria-hidden="true" class="manage_s-img"></span> Projects
-		</header>
-		<nav>
-			<div class="nav_top">
-				<ul>
-					<li><a href="templates.html">
-						<button class="header_btn ">
-							<span class="desk-img"></span>
-							<p>Templates</p>
-						</button>
-					</a></li>
-				</ul>
-			</div>
-		</nav>
-	</div>
-</div>
-<div class="action_bar clearfix"></div>
-<div id="data_element" data-viewname="WORKSPACE_INDEX"></div>
-<div id="eln_main_content"
-	 class="eln_main_content eln_row eln_scroll-y">
-	<div class="eln_main_content_box projects-list">
-        <div class="headers">
-            <div class="owner">Owner</div>
-            <div class="update">Last Modified</div>
-            <div class="created">Created</div>
-        </div>
-        <div class="tree_my_eln_projects tree_top_level" data-treeid="eln_projects">
-    <a id="treeline_eln_projects_0_0"
-       data-groupid="0"
-       data-objectid="0"
-       data-ownerid="{{ownerId}}"
-       class="treeline is_folder ui-droppable is_closed_folder">
-        <span class="updateTS"></span>
-        <span class="folder_up-img"></span>
-        <span class="name">My private projects</span>
-        <span class="details">
-            <span class="box-owner">
-    <label>Owner:</label>
-    
-    
-</span>
-<span class="box-last-update">
-    <label>Last update:</label>
-    
-</span>
-
-		</span>
-    </a>
-    <div class="treeline_children"style="overflow: hidden; display: none;"><a id="treeline_eln_projects"  data-id="118217"  data-parentId="0"  data-userId="30003"  data-groupId="0"  data-name="Example project"  data-folder="false"  data-template="false"  data-createTS="22.10.2019 15:49"  data-hidden="false"  data-shareable="false"  data-owner-profilePictureHash="null"  data-owner-tutorial="1"  data-owner-zoneId="Europe/Berlin"  data-owner-id="30003"  data-owner-firstname="max"  data-owner-lastname="muster"  data-owner-email="max.muster@posteo.de"  data-numberOfBlocks="4"  data-lastEditedTS="28.01.2020 10:12"  data-adminUserIds="[]"  data-adminOrOwner="true"  class="treeline is_item ui-draggable" href="./projects/My private projects_0/118217_Example%20project/index.html">
-    <span class="updateTS">22.10.2019 15:49</span>
-    <span class="project_s-img"></span>
-    <span class="name">Example project</span>
-    <span class="details">
-            <span class="box-owner">
-    <label>Owner:</label>
-    max
-    muster
-</span>
-<span class="box-last-update">
-    <label>Last update:</label>
-    28.01.2020 10:12
-</span>
-
-    </span>
-</a>
-<div class="treeline_children"style="overflow: hidden; display: none;"></div>
-<a id="treeline_eln_projects"  data-id="118224"  data-parentId="0"  data-userId="30003"  data-groupId="0"  data-name="subproj 1"  data-folder="false"  data-template="false"  data-createTS="22.10.2019 16:49"  data-hidden="false"  data-shareable="false"  data-owner-profilePictureHash="null"  data-owner-tutorial="1"  data-owner-zoneId="Europe/Berlin"  data-owner-id="30003"  data-owner-firstname="max"  data-owner-lastname="muster"  data-owner-email="max.muster@posteo.de"  data-numberOfBlocks="0"  data-lastEditedTS="22.10.2019 16:49"  data-adminUserIds="[]"  data-adminOrOwner="true"  class="treeline is_item ui-draggable" href="./projects/My private projects_0/118224_subproj%201/index.html">
-    <span class="updateTS">22.10.2019 16:49</span>
-    <span class="project_s-img"></span>
-    <span class="name">subproj 1</span>
-    <span class="details">
-            <span class="box-owner">
-    <label>Owner:</label>
-    max
-    muster
-</span>
-<span class="box-last-update">
-    <label>Last update:</label>
-    22.10.2019 16:49
-</span>
-
-    </span>
-</a>
-<div class="treeline_children"style="overflow: hidden; display: none;"></div>
-</div>
-</div>
-
-    </div>
-</div>
-</body>
-</html>
diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_extract_4624688_10.xlsx b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_extract_4624688_10.xlsx
deleted file mode 100644
index 81ad1fa3196ba4235ce116dc408ba5ad0379cc5e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 21312
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

diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_preview_4624688_9.docx b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_preview_4624688_9.docx
deleted file mode 100644
index 5b07c13c7997239ff51c78839e90bf34a98482d9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 68424
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
Y3GikGUl=0BAjU9{m4RUjD`?CP0PrA|ZU6uP

diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_view_4624688_8.pdf b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/click_on_view_4624688_8.pdf
deleted file mode 100644
index 211d0f4b9c8b61ee87b4d276d2da0460f187935e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 69318
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
RxeN`>c)3(nUH#p7xd7qFBUu0d

diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/image_945829_4624688_image_element.png b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/image_945829_4624688_image_element.png
deleted file mode 100644
index 7a57e0e322072c8d8914dd0453761e3f0e519b24..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 65912
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
A6951J

diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/image_946047_4625717_blank.png b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/image_946047_4625717_blank.png
deleted file mode 100644
index 1939e07a484248d5b92ebae2fd50056a492ccad9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8356
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

diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/index.html b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/index.html
deleted file mode 100644
index 2450911f..00000000
--- a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/index.html	
+++ /dev/null
@@ -1,1788 +0,0 @@
-<html>
-<head>
-	<style type="text/css">
-		@charset "UTF-8";
-		[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak, .ng-hide:not(.ng-hide-animate) {
-			display: none !important;
-		}
-
-		ng\:form {
-			display: block;
-		}
-	</style>
-
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-	<meta name="apple-mobile-web-app-capable" content="yes">
-	<meta name="apple-mobile-web-app-status-bar-style"
-		  content="black-translucent">
-	<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-
-	<title>Notebook</title>
-
-
-	<link rel="shortcut icon" type="image/x-icon"
-		  href="../../../static/img/favicon2.ico">
-
-	<script src="../../../static/js/jquery-1.8.2.min.js"
-			type="text/javascript"></script>
-	<style type="text/css"></style>
-
-
-	<!-- This must be the first labfolder JS file included -->
-	<script
-			src="../../../static/js/labfolder-global.js?no-build-number"
-			type="text/javascript"></script>
-
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/export-table-element.css">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/jquery-ui.css">
-
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/data-elements.css?no-build-number">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/combined.css?no-build-number">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/export-entry-footer.css">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/redactor.css"/>
-
-	<script type="text/javascript">
-        function getTemplateText(className) {
-            return $("#jsTemplate_jsText").find(".jstext_" + className).text();
-        }
-
-        $(document).ready(function () {
-            // expand tags and custom dates container on hover
-            $(".entry_menu_less").hover(
-                function () {
-                    if (!$(this).children(":first").hasClass("entry_name_menu")) {
-                        $(this).addClass('entry_menu_more');
-                        $(this).children(":first").addClass('show_list_more');
-                        if ($(this).children(":first").hasClass("entry_tags")) {
-                            $(".entry_tags").css("height", "auto");
-                        }
-                    }
-                },
-                function () {
-                    if (!$(this).children(":first").hasClass("entry_name_menu")) {
-                        $(this).removeClass('entry_menu_more');
-                        $(this).children(":first").removeClass('show_list_more');
-                        if ($(this).children(":first").hasClass("entry_tags")) {
-                            $(".entry_tags").css("height", "100%");
-                        }
-                    }
-                }
-            );
-
-            //selects the table sheet according to click
-            $(".sheet_tab").click(function () {
-                if ($(this).hasClass('selected') === false) {
-                    var previous = $(this).siblings(".selected");
-                    var previousElementId = previous.data("elementid");
-                    var previousSheetIndex = previous.data("sheetidx");
-                    previous.removeClass("selected");
-
-                    var targetElementId = $(this).data("elementid");
-                    var targetSheetIndex = $(this).data("sheetidx");
-                    $(this).addClass("selected");
-
-                    $("#table_" + targetElementId + "_" + targetSheetIndex).css("display", "block");
-                    $("#table_" + previousElementId + "_" + previousSheetIndex).css("display", "none");
-                }
-            });
-        });
-	</script>
-
-	<script src="../../../static/js/jquery-ui.js"
-			type="text/javascript"></script>
-</head>
-
-<body>
-<div class="body_bg"></div>
-<div id="global_data"></div>
-<div class="eln_header eln_row">
-	<div class="headerbar_top">
-		<a href="/eln/"><span class="logo-img"></span></a>
-		<header>
-			<span class="notebook_s-img"></span> Notebook
-		</header>
-		<nav>
-			<div class="nav_top">
-				<ul>
-					<li><a href="../../../projects.html">
-						<button class="header_btn ">
-							<span class="desk-img"></span>
-							<p>Projects</p>
-						</button>
-					</a></li>
-					<li><a href="../../../templates.html">
-						<button class="header_btn ">
-							<span class="desk-img"></span>
-							<p>Templates</p>
-						</button>
-					</a></li>
-				</ul>
-			</div>
-		</nav>
-	</div>
-
-
-</div>
-<div class="ng-scope">
-	<div class="action_bar clearfix ng-scope">
-		<div class="plus_btn_wrap">
-			<div class="plus_btn_hover">
-				<div class="add_dropdown more_options_menu" style="display: none;">
-					<ul>
-					</ul>
-				</div>
-			</div>
-		</div>
-		<div class="action_menu_wrap">
-			<div class="filter_wrap list_horizontal"></div>
-		</div>
-	</div>
-	<div id="eln_project_content"
-		 class="eln_project_content eln_row eln_scroll-y ng-scope"  data-id="118217"  data-parentId="0"  data-userId="30003"  data-groupId="0"  data-name="Example project"  data-folder="false"  data-template="false"  data-createTS="22.10.2019 15:49"  data-hidden="false"  data-shareable="false"  data-owner-profilePictureHash="null"  data-owner-tutorial="1"  data-owner-zoneId="Europe/Berlin"  data-owner-id="30003"  data-owner-firstname="max"  data-owner-lastname="muster"  data-owner-email="max.muster@posteo.de"  data-numberOfBlocks="4"  data-lastEditedTS="28.01.2020 10:12"  data-adminUserIds="[]"  data-adminOrOwner="true" >
-		<div id="epb_container"><div data-id="4624688"data-blockId="4624662"data-elnProjectId="118217"data-sourceId="0"data-userAction="8"data-groupId="0"data-hidden="false"data-readOnly="false"data-versionTS="22.10.2019 17:49"data-createTS="22.10.2019 17:49"data-signHash="null"data-signHashDescription=""data-signHashVersion="null"data-signTS="null"data-witnessTS="null"data-title="Example entry"data-blockNumber="1"data-totalBlocksInProject="4"data-projectName="Example project"data-projectReferenceId="null"data-signBiometricsDocId="null"data-witnessBiometricsDocId="null"data-referenced="false">
-	<div class="epb_header_container">
-	<div class="epb_header clearfix" style="display: block;">
-
-		<div class="entry_container">
-			<header class="entry_header">
-				<div class="entry_author">
-					<figure>
-						<span class="avatar-img"></span>
-						<img ng-src="">
-					</figure>
-
-					<div class="author_name">
-						<div class="author_firstname ng-binding">max</div>
-						<div class="author_lastname ng-binding">muster</div>
-					</div>
-				</div>
-				<div class="entry_menu_less entry_title_wrap ng-scope">
-					<div class="entry_name_menu has_tooltip">
-						<ul>
-							<li>
-								<div style="display:block">Entry 1/4:</div>
-								<div>In Project:</div>
-							</li>
-							<li>
-								<div style="display:block" class="entry_title ng-binding">Example entry</div>
-								<div>Example project</div>
-							</li>
-						</ul>
-					</div>
-					<div class="entry_menu_options">
-					</div>
-					<div class="entry_dropdown entry_name">
-						<div class="close_entry_menu">
-							<span class="cancel_entry_title close_box-img"></span>
-						</div>
-						<ul>
-							<li><label>Entry name</label> <input
-									class="entry_name_input ng-pristine ng-untouched ng-valid"
-									type="text" data-title="" value=""></li>
-							<li><label>located in project</label> <select
-									class="ng-pristine ng-untouched ng-valid">
-								<option
-										value="0">tableproject
-								</option>
-								<option value="1" selected="selected">a project</option>
-							</select></li>
-							<li>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown cancel_entry_title grey_link"
-										  ng-click="cancel()">cancel</span>
-									<button class="save_entry_title btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</li>
-						</ul>
-					</div>
-				</div>
-
-				<div class="entry_menus">
-					<ul>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryDateController">
-							<div class="entry_menu_list has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<ul>
-									<li><span>created:</span> <span class="ng-binding">22.10.2019 17:49</span>
-									</li>
-									<li><span>modified</span> <span class="ng-binding">22.10.2019 17:49</span>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li>
-    <span>due date</span>
-    <span class=\"ng-binding\">22.10.2019</span>
-</li>
-<li>
-    <span>my date</span>
-    <span class=\"ng-binding\">22.10.2019</span>
-</li>
-
-								</ul>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown"
-								 ng-mouseenter="activateElement($event)">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<ul class="entry_dates">
-									<li><label>Dates</label></li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="created" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.createTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="modified" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.versionTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li style="overflow: visible;">
-										<div class="date_key">
-
-											<div class="selectize-control single ng-valid"
-												 ng-keyup="updateInput($select.search)"
-												 reset-search-input="false" ng-model="dateKeyInput.selected"
-												 theme="selectize" style="min-width: 120px;">
-												<div class="selectize-input"
-													 ng-class="{'focus': $select.open, 'disabled': $select.disabled, 'selectize-focus' : $select.focus}"
-													 ng-click="$select.activate()">
-													<div
-															ng-hide="$select.searchEnabled &amp;&amp; ($select.open || $select.isEmpty())"
-															class="ui-select-match ng-hide" ng-transclude=""
-															placeholder="Custom date"
-															ng-keydown="inputKeydown($event)">
-														<span class="ng-binding ng-scope"></span>
-													</div>
-													<input type="text" autocomplete="off" tabindex="-1"
-														   class="ui-select-search ui-select-toggle ng-pristine ng-untouched ng-valid"
-														   ng-click="$select.toggle($event)"
-														   placeholder="Custom date" ng-model="$select.search"
-														   ng-hide="!$select.searchEnabled || ($select.selected &amp;&amp; !$select.open)"
-														   ng-disabled="$select.disabled">
-												</div>
-												<div ng-show="$select.open"
-													 class="ui-select-choices selectize-dropdown single ng-scope ng-hide"
-													 repeat="date in availableDates | filter: $select.search">
-													<div
-															class="ui-select-choices-content selectize-dropdown-content">
-														<div class="ui-select-choices-group optgroup">
-															<div ng-show="$select.isGrouped"
-																 class="ui-select-choices-group-label optgroup-header ng-binding ng-hide"></div>
-															<!-- ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">due date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">my date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-														</div>
-													</div>
-												</div>
-												<input ng-disabled="$select.disabled"
-													   class="ui-select-focusser ui-select-offscreen ng-scope"
-													   type="text" aria-haspopup="true" role="button">
-											</div>
-										</div>
-
-										<div class="date_value">
-											<input type="text"
-												   class="entry_datepicker date_input ng-pristine ng-untouched ng-valid"
-												   ng-model="dateValueInput" ng-keydown="inputKeydown($event)">
-										</div>
-									</li>
-								</ul>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-									<button class="btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</div>
-						</li>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryTagsController">
-							<div class="entry_tags has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<span>demo</span><span>example</span><span>entry</span>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<label>Create new tags by using commas</label>
-								<div class="token_input token_input_width"></div>
-								<div class="tags_input entry_tags_input" ng-click="focusInput()">
-
-									<!-- ngRepeat: tag in currentTokens -->
-
-									<textarea class="token_input ng-pristine ng-untouched ng-valid"
-											  ng-model="tagInput" ng-keydown="inputKeydown($event)"></textarea>
-								</div>
-
-								<!--											<div class="save_entry_menu">
-												<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-												<button class="btn_on_grey" ng-click='fromViewModel()'>fromViewModel</button>
-											</div> -->
-								<h3 class="all_tags">All tags</h3>
-								<div class="tag_data_wrap">
-									<div class="tag_register">
-										<ul>
-											<li>
-												<ul class="my_tags">
-													<!-- ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">demo</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">Entry</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">example</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-												</ul>
-											</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</li>
-						<li>
-							<div class="entry_options">
-								<ul>
-								</ul>
-							</div>
-						</li>
-					</ul>
-				</div>
-			</header>
-			<div class="entry_toolbar"></div>
-		</div>
-		<div class="clear"></div>
-	</div>
-</div>
-
-	<div class="epb_content_wrap">
-	<div class="epb_content_container">
-		<div class="hdrop ui-droppable"></div>
-		<div class="dd_entry_table">
-			<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content redactor_editor">
-	<p><p style="text-align: center;text-align: center;"><span style="color: rgb(61, 142, 185);"><strong>Use the buttons above to add text, tables, handwritten sketches, files, or data elements.</strong></span></p></p>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content redactor_editor">
-	<p><p style="text-align: center;text-align: center;"><strong><span style="font-size: 24px;">I am a text block</span></strong>.</p><p><br /></p><p style="text-align: justify;text-align: justify;">You can capture all your notes in me immediately after creating an entry. Use all the tools in the editor to style your texts, add numbered and bulleted lists, insert simple tables, and use special characters.</p><p style="text-align: justify;text-align: justify;"><br /></p><p style="text-align: justify;text-align: justify;">Look at this example:</p><p style="text-align: justify;text-align: justify;"><br /></p><h2 style="text-align: justify;text-align: justify;"><strong><span style="color: rgb(51, 51, 51);">Cloning plasmid for inducible mCherry-Wt1</span></strong></h2><table style="width: 100%;"><tbody><tr><td style="background-color: rgb(239, 239, 239);width: 33.3333%;"><strong>Primer</strong></td><td style="background-color: rgb(239, 239, 239);width: 33.3333%;"><strong>Sequence (5' -3')</strong></td><td style="background-color: rgb(239, 239, 239);width: 33.3333%;"><strong>Melting temperature (T<sub>m</sub>)</strong></td></tr><tr><td style="width: 33.3333%;">Fwd pSV40 Kan/Neo</td><td style="width: 33.3333%;">gtc ttc aag aat tcc tca gaa gaa ctc gtc aag<br /></td><td style="width: 33.3333%;">56 °C<br /></td></tr><tr><td style="width: 33.3333%;">Rev pSV40 Kan/Neo</td><td style="width: 33.3333%;">tga tag gga gta aac gag gtg cac tct cag tac<br /></td><td style="width: 33.3333%;">55 °C<br /></td></tr><tr><td style="width: 33.3333%;">Fwd IRES</td><td style="width: 33.3333%;">cct ttc gtc ttc aag gat atc cgg ccc ggt tgt ggc cat a<br /></td><td style="width: 33.3333%;">56 °C<br /></td></tr><tr><td style="width: 33.3333%;">Rev IRES</td><td style="width: 33.3333%;">cga gtt ctt ctg acg gcc ggc ccc tct ccc t<br /></td><td style="width: 33.3333%;">52 °C<br /></td></tr><tr><td style="width: 33.3333%;">Fwd PolyA Tet-ON 3G</td><td style="width: 33.3333%;">cga gtt ctt ctg acg gcc ggc ccc tct ccc t<br /></td><td style="width: 33.3333%;">53 °C<br /></td></tr><tr><td style="width: 33.3333%;">Rev PolyA Tet-ON 3G</td><td style="width: 33.3333%;">a caa ccg ggc cgg ata tgt cta gac tgg aca aga g<br /></td><td style="width: 33.3333%;">58 °C<br /></td></tr></tbody></table><p style="text-align: justify;text-align: justify;"><br /></p></p>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper"  data-imageOriginalDocId=&quot;945829&quot;  data-imageLayerDocId=&quot;null&quot;  data-zoomLevel=&quot;50&quot;  data-blockVersionId=&quot;4624688&quot;  data-filename=&quot;image_element.png&quot;  data-elementNumber=&quot;7&quot; >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_file_download">
-	<i>image_element.png</i>
-	<br>
-	<div class="dd_entry_cell_content">
-		<img class="imageOriginal" src="image_945829_4624688_image_element.png" width="50%">
-	</div>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content redactor_editor">
-	<p><p style="text-align: center;text-align: center;"><span style="font-size: 24px;"><strong>Table Element</strong></span></p><p style="text-align: center;text-align: center;">You can record your data with the Table Element below to later perform operations, do calculations, or create charts.</p></p>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" {{elementMeta1}}>
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content table-el-container">
-    <div>
-        <div class="table-el-info">
-            Your labfolder table is available for visualization as the following Excel file:
-        </div>
-        <div class="table-el-download">
-            <a href="labfolder_table_4624688_11.xlsx">
-                <svg class="table-el-icon" viewBox="0 0 475.1 402.5">
-                    <title>icon-table</title>
-                    <path d="M461.7,14C452.7,5,442,0.5,429.4,0.5H45.7C33.1,0.5,22.4,5,13.4,14C4.5,22.9,0,33.7,0,46.2v310.6   c0,12.6,4.5,23.3,13.4,32.3c8.9,8.9,19.7,13.4,32.3,13.4h383.7c12.6,0,23.3-4.5,32.3-13.4c8.9-9,13.4-19.7,13.4-32.3V46.2   C475.1,33.7,470.6,22.9,461.7,14z M146.2,356.9c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7c-2.7,0-4.9-0.9-6.6-2.6   c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6   L146.2,356.9L146.2,356.9z M146.2,247.2c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7c-2.7,0-4.9-0.9-6.6-2.6   c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L146.2,247.2L146.2,247.2z M146.2,137.6c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7   c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L146.2,137.6L146.2,137.6z M292.4,356.9c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6h-91.4   c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L292.4,356.9L292.4,356.9L292.4,356.9z M292.4,247.2c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6   h-91.4c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6h91.4   c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6L292.4,247.2L292.4,247.2z M292.4,137.6c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6h-91.4c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.9-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6L292.4,137.6L292.4,137.6z M438.5,356.9   c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V356.9z M438.5,247.2c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V247.2z M438.5,137.6c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V137.6z"/>
-                </svg>
-                <div class="table-el-filename">
-                    labfolder_table_4624688_11.xlsx
-                </div>
-            </a>
-        </div>
-    </div>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell" data-width="50"
-			style="width: 50%;">
-			<div class="dd_entry_cell_wrapper" ><div class="dd_entry_cell_content redactor_editor">
-	<p><p><span style="font-size: 24px;"><strong>File Elements</strong></span></p><p><br /></p><p>You can upload and directly view PDF files in labfolder. See the example one on the right side. &gt;&gt;</p></p>
-</div>
-</div>
-		</div>
-		<div class="dd_entry_cell">
-			<div class="dd_entry_cell_wrapper"  data-blockId="4624688"  data-elementNumber="8"  data-filename="click_on_view.pdf"  data-fileSize="67.7 KB"  data-fileDocId="945830"  data-fileExists="true" ><div class="dd_entry_cell_file_download">
-	<div class="file_icon">
-		<div class="file_extension">pdf</div>
-		<span class="icon-file"></span>
-	</div>
-	<div class="file_details">
-		<div class="file_name">click_on_view.pdf</div>
-		<div class="file_size_link">
-			67.7 KB <a href="click_on_view_4624688_8.pdf"
-							target="_blank"> Download </a>
-		</div>
-	</div>
-</div>
-</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content redactor_editor">
-	<p>Check out the Microsoft Word® and Excel® support. After uploading a file you can do the following: <ul> <li><strong>Preview:</strong> Shows you a preview to see the content of the file.</li> <li><strong>Extract: </strong>All content from a file will be extracted and added to the entry.</li> <li><strong>Download: </strong>You can always download a file, which you uploaded to labfolder.</li> </ul></p>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell" data-width="50"
-			style="width: 50%;">
-			<div class="dd_entry_cell_wrapper"  data-blockId="4624688"  data-elementNumber="9"  data-filename="click_on_preview.docx"  data-fileSize="66.8 KB"  data-fileDocId="945831"  data-fileExists="true" ><div class="dd_entry_cell_file_download">
-	<div class="file_icon">
-		<div class="file_extension">docx</div>
-		<span class="icon-file"></span>
-	</div>
-	<div class="file_details">
-		<div class="file_name">click_on_preview.docx</div>
-		<div class="file_size_link">
-			66.8 KB <a href="click_on_preview_4624688_9.docx"
-							target="_blank"> Download </a>
-		</div>
-	</div>
-</div>
-</div>
-		</div>
-		<div class="dd_entry_cell">
-			<div class="dd_entry_cell_wrapper"  data-blockId="4624688"  data-elementNumber="10"  data-filename="click_on_extract.xlsx"  data-fileSize="20.8 KB"  data-fileDocId="945832"  data-fileExists="true" ><div class="dd_entry_cell_file_download">
-	<div class="file_icon">
-		<div class="file_extension">xlsx</div>
-		<span class="icon-file"></span>
-	</div>
-	<div class="file_details">
-		<div class="file_name">click_on_extract.xlsx</div>
-		<div class="file_size_link">
-			20.8 KB <a href="click_on_extract_4624688_10.xlsx"
-							target="_blank"> Download </a>
-		</div>
-	</div>
-</div>
-</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell" data-width="53"
-			style="width: 53%;">
-			<div class="dd_entry_cell_wrapper" ><div class="dd_entry_cell_content redactor_editor">
-	<p><p><span style="font-size: 24px;"><strong>Data Element</strong></span></p><p><br /></p><p>The Data Element (DE) can be found in the entry toolbar next to the <em>Text</em>, <em>Table</em>, <em>Sketch</em> and <em>Upload</em> functions. You have these possibilities when working on the DE:</p><p><br /></p><ul><li>Insert a <em>Numerical Data Element</em> for quantitative experimental parameters.</li><li>Insert a <em>Descriptive Data Element</em> to document parameters with qualitative data.</li><li>Insert a <em>Data Group</em> with several experimental parameters.</li><li>Insert an item from your Material Database, referenced here as a <em>Material Element</em>.</li></ul><p><br /></p><p>Explore the example to the right. &gt;&gt;</p></p>
-</div>
-</div>
-		</div>
-		<div class="dd_entry_cell">
-			<div class="dd_entry_cell_wrapper" ><div class="notebook-element-content data-elements-container data-elements">
-  <html><head></head><body><div class="data-element-wrap data-group-wrap">
-  <svg class="data-element-icon data-group-icon" viewbox="0 0 67 64">
-    <title>icon-vf-group-filled</title>
-    <path d="M32.119 39.613c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M0.952 39.019c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.275c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.138z"></path>
-    <path d="M29.502 36.996c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M49.487 11.063c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M19.39 10.587c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.427-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M46.87 8.565c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M66.498 40.327c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M35.331 39.851c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0 0 0 0 0 0 0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M64 37.71c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595c0 0 0 0 0 0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-  </svg>
-
-  <div class="data-group-content display-mode">
-    <div class="data-element-wrap data-group-header">
-      <div class="data-element-display data-group-display">
-        <span class="element-title">PCR reaction pSV40-Tet3G-TRE3G-mCherry</span>
-      </div>
-    </div>
-
-    <div class="data-group-children">
-      <div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">5X In-Fusion HD Enzyme Premix</span>
-    <span class="element-quantity">: Volume: </span>
-    <span class="element-value ">2 </span>
-    <span class="element-unit">µL</span>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">Linearized pSV40 vector</span>
-    <span class="element-quantity">: Volume: </span>
-    <span class="element-value ">7 </span>
-    <span class="element-unit">µL</span>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">Purified PCR fragment</span>
-    <span class="element-quantity">: Volume: </span>
-    <span class="element-value ">8 </span>
-    <span class="element-unit">µL</span>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">dH2O (as needed)</span>
-    <span class="element-quantity">: Volume: </span>
-    <span class="element-value ">8 </span>
-    <span class="element-unit">µL</span>
-  </div>
-</div>
-
-    </div>
-  </div>
-</div>
-</body></html><html><head></head><body><div class="data-element-wrap descriptive-element-wrap">
-  <svg class="data-element-icon descriptive-element-icon" viewbox="0 0 64 64">
-    <title>icon-dde</title>
-    <path d="M62.080 48.96h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.024-0.832-1.92-1.92-1.92z"></path>
-    <path d="M62.080 24.192h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-    <path d="M37.504 0h-35.584c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h35.584c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-  </svg>
-
-  <div class="data-element-display descriptive-element-display">
-    <span class="element-title">Human Monocytes: </span>
-    <span class="element-description ">Prepared</span>
-  </div>
-</div>
-</body></html>
-</div>
-</div>
-		</div>
-	</div>
-</div>
-
-		</div>
-	</div>
-</div>
-
-	
-</div><div data-id="4625717"data-blockId="4625197"data-elnProjectId="118217"data-sourceId="0"data-userAction="5"data-groupId="0"data-hidden="false"data-readOnly="false"data-versionTS="22.10.2019 20:01"data-createTS="22.10.2019 18:47"data-signHash="null"data-signHashDescription=""data-signHashVersion="null"data-signTS="null"data-witnessTS="null"data-title="null"data-blockNumber="2"data-totalBlocksInProject="4"data-projectName="Example project"data-projectReferenceId="null"data-signBiometricsDocId="null"data-witnessBiometricsDocId="null"data-referenced="false">
-	<div class="epb_header_container">
-	<div class="epb_header clearfix" style="display: block;">
-
-		<div class="entry_container">
-			<header class="entry_header">
-				<div class="entry_author">
-					<figure>
-						<span class="avatar-img"></span>
-						<img ng-src="">
-					</figure>
-
-					<div class="author_name">
-						<div class="author_firstname ng-binding">max</div>
-						<div class="author_lastname ng-binding">muster</div>
-					</div>
-				</div>
-				<div class="entry_menu_less entry_title_wrap ng-scope">
-					<div class="entry_name_menu has_tooltip">
-						<ul>
-							<li>
-								<div style="display:block">Entry 2/4:</div>
-								<div>In Project:</div>
-							</li>
-							<li>
-								<div style="display:block" class="entry_title ng-binding"><em>No entry title yet</em></div>
-								<div>Example project</div>
-							</li>
-						</ul>
-					</div>
-					<div class="entry_menu_options">
-					</div>
-					<div class="entry_dropdown entry_name">
-						<div class="close_entry_menu">
-							<span class="cancel_entry_title close_box-img"></span>
-						</div>
-						<ul>
-							<li><label>Entry name</label> <input
-									class="entry_name_input ng-pristine ng-untouched ng-valid"
-									type="text" data-title="" value=""></li>
-							<li><label>located in project</label> <select
-									class="ng-pristine ng-untouched ng-valid">
-								<option
-										value="0">tableproject
-								</option>
-								<option value="1" selected="selected">a project</option>
-							</select></li>
-							<li>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown cancel_entry_title grey_link"
-										  ng-click="cancel()">cancel</span>
-									<button class="save_entry_title btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</li>
-						</ul>
-					</div>
-				</div>
-
-				<div class="entry_menus">
-					<ul>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryDateController">
-							<div class="entry_menu_list has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<ul>
-									<li><span>created:</span> <span class="ng-binding">22.10.2019 18:47</span>
-									</li>
-									<li><span>modified</span> <span class="ng-binding">22.10.2019 20:01</span>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									
-								</ul>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown"
-								 ng-mouseenter="activateElement($event)">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<ul class="entry_dates">
-									<li><label>Dates</label></li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="created" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.createTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="modified" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.versionTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li style="overflow: visible;">
-										<div class="date_key">
-
-											<div class="selectize-control single ng-valid"
-												 ng-keyup="updateInput($select.search)"
-												 reset-search-input="false" ng-model="dateKeyInput.selected"
-												 theme="selectize" style="min-width: 120px;">
-												<div class="selectize-input"
-													 ng-class="{'focus': $select.open, 'disabled': $select.disabled, 'selectize-focus' : $select.focus}"
-													 ng-click="$select.activate()">
-													<div
-															ng-hide="$select.searchEnabled &amp;&amp; ($select.open || $select.isEmpty())"
-															class="ui-select-match ng-hide" ng-transclude=""
-															placeholder="Custom date"
-															ng-keydown="inputKeydown($event)">
-														<span class="ng-binding ng-scope"></span>
-													</div>
-													<input type="text" autocomplete="off" tabindex="-1"
-														   class="ui-select-search ui-select-toggle ng-pristine ng-untouched ng-valid"
-														   ng-click="$select.toggle($event)"
-														   placeholder="Custom date" ng-model="$select.search"
-														   ng-hide="!$select.searchEnabled || ($select.selected &amp;&amp; !$select.open)"
-														   ng-disabled="$select.disabled">
-												</div>
-												<div ng-show="$select.open"
-													 class="ui-select-choices selectize-dropdown single ng-scope ng-hide"
-													 repeat="date in availableDates | filter: $select.search">
-													<div
-															class="ui-select-choices-content selectize-dropdown-content">
-														<div class="ui-select-choices-group optgroup">
-															<div ng-show="$select.isGrouped"
-																 class="ui-select-choices-group-label optgroup-header ng-binding ng-hide"></div>
-															<!-- ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">due date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">my date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-														</div>
-													</div>
-												</div>
-												<input ng-disabled="$select.disabled"
-													   class="ui-select-focusser ui-select-offscreen ng-scope"
-													   type="text" aria-haspopup="true" role="button">
-											</div>
-										</div>
-
-										<div class="date_value">
-											<input type="text"
-												   class="entry_datepicker date_input ng-pristine ng-untouched ng-valid"
-												   ng-model="dateValueInput" ng-keydown="inputKeydown($event)">
-										</div>
-									</li>
-								</ul>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-									<button class="btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</div>
-						</li>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryTagsController">
-							<div class="entry_tags has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<i>No tags associated</i>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<label>Create new tags by using commas</label>
-								<div class="token_input token_input_width"></div>
-								<div class="tags_input entry_tags_input" ng-click="focusInput()">
-
-									<!-- ngRepeat: tag in currentTokens -->
-
-									<textarea class="token_input ng-pristine ng-untouched ng-valid"
-											  ng-model="tagInput" ng-keydown="inputKeydown($event)"></textarea>
-								</div>
-
-								<!--											<div class="save_entry_menu">
-												<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-												<button class="btn_on_grey" ng-click='fromViewModel()'>fromViewModel</button>
-											</div> -->
-								<h3 class="all_tags">All tags</h3>
-								<div class="tag_data_wrap">
-									<div class="tag_register">
-										<ul>
-											<li>
-												<ul class="my_tags">
-													<!-- ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">demo</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">Entry</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">example</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-												</ul>
-											</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</li>
-						<li>
-							<div class="entry_options">
-								<ul>
-								</ul>
-							</div>
-						</li>
-					</ul>
-				</div>
-			</header>
-			<div class="entry_toolbar"></div>
-		</div>
-		<div class="clear"></div>
-	</div>
-</div>
-
-	<div class="epb_content_wrap">
-	<div class="epb_content_container">
-		<div class="hdrop ui-droppable"></div>
-		<div class="dd_entry_table">
-			<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content redactor_editor">
-	<p><h1>bcvncbvn</h1></p>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_empty_element"><div><i>Empty File Element</i></div></div>
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper"  data-imageOriginalDocId=&quot;946047&quot;  data-imageLayerDocId=&quot;946048&quot;  data-zoomLevel=&quot;50&quot;  data-blockVersionId=&quot;4625717&quot;  data-filename=&quot;blank.png&quot;  data-elementNumber=&quot;4&quot; >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_file_download">
-	<i>blank.png</i>
-	<br>
-	<div class="dd_entry_cell_content">
-		<img class="imageOriginal" src="image_946047_4625717_blank.png" width="50%">
-	</div>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-
-		</div>
-	</div>
-</div>
-
-	
-</div><div data-id="4625212"data-blockId="4625203"data-elnProjectId="118217"data-sourceId="4625184"data-userAction="24"data-groupId="0"data-hidden="false"data-readOnly="false"data-versionTS="22.10.2019 18:48"data-createTS="22.10.2019 18:48"data-signHash="null"data-signHashDescription=""data-signHashVersion="null"data-signTS="null"data-witnessTS="null"data-title="null"data-blockNumber="3"data-totalBlocksInProject="4"data-projectName="Example project"data-projectReferenceId="null"data-signBiometricsDocId="null"data-witnessBiometricsDocId="null"data-referenced="false">
-	<div class="epb_header_container">
-	<div class="epb_header clearfix" style="display: block;">
-
-		<div class="entry_container">
-			<header class="entry_header">
-				<div class="entry_author">
-					<figure>
-						<span class="avatar-img"></span>
-						<img ng-src="">
-					</figure>
-
-					<div class="author_name">
-						<div class="author_firstname ng-binding">max</div>
-						<div class="author_lastname ng-binding">muster</div>
-					</div>
-				</div>
-				<div class="entry_menu_less entry_title_wrap ng-scope">
-					<div class="entry_name_menu has_tooltip">
-						<ul>
-							<li>
-								<div style="display:block">Entry 3/4:</div>
-								<div>In Project:</div>
-							</li>
-							<li>
-								<div style="display:block" class="entry_title ng-binding"><em>No entry title yet</em></div>
-								<div>Example project</div>
-							</li>
-						</ul>
-					</div>
-					<div class="entry_menu_options">
-					</div>
-					<div class="entry_dropdown entry_name">
-						<div class="close_entry_menu">
-							<span class="cancel_entry_title close_box-img"></span>
-						</div>
-						<ul>
-							<li><label>Entry name</label> <input
-									class="entry_name_input ng-pristine ng-untouched ng-valid"
-									type="text" data-title="" value=""></li>
-							<li><label>located in project</label> <select
-									class="ng-pristine ng-untouched ng-valid">
-								<option
-										value="0">tableproject
-								</option>
-								<option value="1" selected="selected">a project</option>
-							</select></li>
-							<li>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown cancel_entry_title grey_link"
-										  ng-click="cancel()">cancel</span>
-									<button class="save_entry_title btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</li>
-						</ul>
-					</div>
-				</div>
-
-				<div class="entry_menus">
-					<ul>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryDateController">
-							<div class="entry_menu_list has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<ul>
-									<li><span>created:</span> <span class="ng-binding">22.10.2019 18:48</span>
-									</li>
-									<li><span>modified</span> <span class="ng-binding">22.10.2019 18:48</span>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li>
-    <span>todo</span>
-    <span class=\"ng-binding\">31.10.2019</span>
-</li>
-
-								</ul>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown"
-								 ng-mouseenter="activateElement($event)">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<ul class="entry_dates">
-									<li><label>Dates</label></li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="created" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.createTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="modified" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.versionTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li style="overflow: visible;">
-										<div class="date_key">
-
-											<div class="selectize-control single ng-valid"
-												 ng-keyup="updateInput($select.search)"
-												 reset-search-input="false" ng-model="dateKeyInput.selected"
-												 theme="selectize" style="min-width: 120px;">
-												<div class="selectize-input"
-													 ng-class="{'focus': $select.open, 'disabled': $select.disabled, 'selectize-focus' : $select.focus}"
-													 ng-click="$select.activate()">
-													<div
-															ng-hide="$select.searchEnabled &amp;&amp; ($select.open || $select.isEmpty())"
-															class="ui-select-match ng-hide" ng-transclude=""
-															placeholder="Custom date"
-															ng-keydown="inputKeydown($event)">
-														<span class="ng-binding ng-scope"></span>
-													</div>
-													<input type="text" autocomplete="off" tabindex="-1"
-														   class="ui-select-search ui-select-toggle ng-pristine ng-untouched ng-valid"
-														   ng-click="$select.toggle($event)"
-														   placeholder="Custom date" ng-model="$select.search"
-														   ng-hide="!$select.searchEnabled || ($select.selected &amp;&amp; !$select.open)"
-														   ng-disabled="$select.disabled">
-												</div>
-												<div ng-show="$select.open"
-													 class="ui-select-choices selectize-dropdown single ng-scope ng-hide"
-													 repeat="date in availableDates | filter: $select.search">
-													<div
-															class="ui-select-choices-content selectize-dropdown-content">
-														<div class="ui-select-choices-group optgroup">
-															<div ng-show="$select.isGrouped"
-																 class="ui-select-choices-group-label optgroup-header ng-binding ng-hide"></div>
-															<!-- ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">due date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">my date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-														</div>
-													</div>
-												</div>
-												<input ng-disabled="$select.disabled"
-													   class="ui-select-focusser ui-select-offscreen ng-scope"
-													   type="text" aria-haspopup="true" role="button">
-											</div>
-										</div>
-
-										<div class="date_value">
-											<input type="text"
-												   class="entry_datepicker date_input ng-pristine ng-untouched ng-valid"
-												   ng-model="dateValueInput" ng-keydown="inputKeydown($event)">
-										</div>
-									</li>
-								</ul>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-									<button class="btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</div>
-						</li>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryTagsController">
-							<div class="entry_tags has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<label>Create new tags by using commas</label>
-								<div class="token_input token_input_width"></div>
-								<div class="tags_input entry_tags_input" ng-click="focusInput()">
-
-									<!-- ngRepeat: tag in currentTokens -->
-
-									<textarea class="token_input ng-pristine ng-untouched ng-valid"
-											  ng-model="tagInput" ng-keydown="inputKeydown($event)"></textarea>
-								</div>
-
-								<!--											<div class="save_entry_menu">
-												<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-												<button class="btn_on_grey" ng-click='fromViewModel()'>fromViewModel</button>
-											</div> -->
-								<h3 class="all_tags">All tags</h3>
-								<div class="tag_data_wrap">
-									<div class="tag_register">
-										<ul>
-											<li>
-												<ul class="my_tags">
-													<!-- ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">demo</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">Entry</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">example</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-												</ul>
-											</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</li>
-						<li>
-							<div class="entry_options">
-								<ul>
-								</ul>
-							</div>
-						</li>
-					</ul>
-				</div>
-			</header>
-			<div class="entry_toolbar"></div>
-		</div>
-		<div class="clear"></div>
-	</div>
-</div>
-
-	<div class="epb_content_wrap">
-	<div class="epb_content_container">
-		<div class="hdrop ui-droppable"></div>
-		<div class="dd_entry_table">
-			<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content redactor_editor">
-	<p><p>Text ist hier</p></p>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="notebook-element-content data-elements-container data-elements">
-  <html><head></head><body><div class="data-element-wrap data-group-wrap">
-  <svg class="data-element-icon data-group-icon" viewbox="0 0 67 64">
-    <title>icon-vf-group-filled</title>
-    <path d="M32.119 39.613c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M0.952 39.019c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.275c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.138z"></path>
-    <path d="M29.502 36.996c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M49.487 11.063c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M19.39 10.587c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.427-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M46.87 8.565c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M66.498 40.327c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M35.331 39.851c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0 0 0 0 0 0 0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M64 37.71c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595c0 0 0 0 0 0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-  </svg>
-
-  <div class="data-group-content display-mode">
-    <div class="data-element-wrap data-group-header">
-      <div class="data-element-display data-group-display">
-        <span class="element-title">gruppe 1</span>
-      </div>
-    </div>
-
-    <div class="data-group-children">
-      <div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">foo</span>
-    <span class="element-quantity">: Angular Momentum: </span>
-    <span class="element-value ">20€ </span>
-    <span class="element-unit">kg/m<sup>2</sup> s<sup>-1</sup></span>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">barium</span>
-    <span class="element-quantity">: Fugacity: </span>
-    <span class="element-value ">12 </span>
-    <span class="element-unit">Pa</span>
-  </div>
-</div>
-
-    </div>
-  </div>
-</div>
-</body></html><html><head></head><body><div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">dsf</span>
-    <span class="element-quantity">: Electric Displacement: </span>
-    <span class="element-value ">8765^98x90 </span>
-    <span class="element-unit">C/m<sup>2</sup></span>
-  </div>
-</div>
-</body></html><html><head></head><body><div class="data-element-wrap descriptive-element-wrap">
-  <svg class="data-element-icon descriptive-element-icon" viewbox="0 0 64 64">
-    <title>icon-dde</title>
-    <path d="M62.080 48.96h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.024-0.832-1.92-1.92-1.92z"></path>
-    <path d="M62.080 24.192h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-    <path d="M37.504 0h-35.584c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h35.584c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-  </svg>
-
-  <div class="data-element-display descriptive-element-display">
-    <span class="element-title">DE name: </span>
-    <span class="element-description ">fdgdfghgfdhgdfhh dfghdfghdfghfgh dfghdfgd</span>
-  </div>
-</div>
-</body></html><html><head></head><body><div class="data-element-wrap data-group-wrap">
-  <svg class="data-element-icon data-group-icon" viewbox="0 0 67 64">
-    <title>icon-vf-group-filled</title>
-    <path d="M32.119 39.613c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M0.952 39.019c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.275c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.138z"></path>
-    <path d="M29.502 36.996c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M49.487 11.063c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M19.39 10.587c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.427-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M46.87 8.565c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M66.498 40.327c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M35.331 39.851c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0 0 0 0 0 0 0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M64 37.71c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595c0 0 0 0 0 0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-  </svg>
-
-  <div class="data-group-content display-mode">
-    <div class="data-element-wrap data-group-header">
-      <div class="data-element-display data-group-display">
-        <span class="element-title">gruppe 2</span>
-      </div>
-    </div>
-
-    <div class="data-group-children">
-      <div class="data-element-wrap data-group-wrap">
-  <svg class="data-element-icon data-group-icon" viewbox="0 0 67 64">
-    <title>icon-vf-group-filled</title>
-    <path d="M32.119 39.613c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M0.952 39.019c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.275c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.138z"></path>
-    <path d="M29.502 36.996c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M49.487 11.063c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M19.39 10.587c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.427-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M46.87 8.565c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M66.498 40.327c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M35.331 39.851c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0 0 0 0 0 0 0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M64 37.71c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595c0 0 0 0 0 0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-  </svg>
-
-  <div class="data-group-content display-mode">
-    <div class="data-element-wrap data-group-header">
-      <div class="data-element-display data-group-display">
-        <span class="element-title">Untergruppe 2.1</span>
-      </div>
-    </div>
-
-    <div class="data-group-children">
-      <div class="data-element-wrap descriptive-element-wrap">
-  <svg class="data-element-icon descriptive-element-icon" viewbox="0 0 64 64">
-    <title>icon-dde</title>
-    <path d="M62.080 48.96h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.024-0.832-1.92-1.92-1.92z"></path>
-    <path d="M62.080 24.192h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-    <path d="M37.504 0h-35.584c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h35.584c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-  </svg>
-
-  <div class="data-element-display descriptive-element-display">
-    <span class="element-title">DE name 2 (desc): </span>
-    <span class="element-description empty-value">⎵</span>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">DE 2.1.1</span>
-    <span class="element-quantity">: Amount of substance: </span>
-    <span class="element-value ">20 </span>
-    <span class="element-unit">mol</span>
-  </div>
-</div>
-
-    </div>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">DE 2.2</span>
-    <span class="element-quantity">: Capacitance: </span>
-    <span class="element-value ">876x876x87 </span>
-    <span class="element-unit">µF</span>
-  </div>
-</div>
-
-    </div>
-  </div>
-</div>
-</body></html>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" {{elementMeta1}}>
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content table-el-container">
-    <div>
-        <div class="table-el-info">
-            Your labfolder table is available for visualization as the following Excel file:
-        </div>
-        <div class="table-el-download">
-            <a href="labfolder_table_4625212_3.xlsx">
-                <svg class="table-el-icon" viewBox="0 0 475.1 402.5">
-                    <title>icon-table</title>
-                    <path d="M461.7,14C452.7,5,442,0.5,429.4,0.5H45.7C33.1,0.5,22.4,5,13.4,14C4.5,22.9,0,33.7,0,46.2v310.6   c0,12.6,4.5,23.3,13.4,32.3c8.9,8.9,19.7,13.4,32.3,13.4h383.7c12.6,0,23.3-4.5,32.3-13.4c8.9-9,13.4-19.7,13.4-32.3V46.2   C475.1,33.7,470.6,22.9,461.7,14z M146.2,356.9c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7c-2.7,0-4.9-0.9-6.6-2.6   c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6   L146.2,356.9L146.2,356.9z M146.2,247.2c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7c-2.7,0-4.9-0.9-6.6-2.6   c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L146.2,247.2L146.2,247.2z M146.2,137.6c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7   c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L146.2,137.6L146.2,137.6z M292.4,356.9c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6h-91.4   c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L292.4,356.9L292.4,356.9L292.4,356.9z M292.4,247.2c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6   h-91.4c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6h91.4   c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6L292.4,247.2L292.4,247.2z M292.4,137.6c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6h-91.4c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.9-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6L292.4,137.6L292.4,137.6z M438.5,356.9   c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V356.9z M438.5,247.2c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V247.2z M438.5,137.6c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V137.6z"/>
-                </svg>
-                <div class="table-el-filename">
-                    labfolder_table_4625212_3.xlsx
-                </div>
-            </a>
-        </div>
-    </div>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-
-		</div>
-	</div>
-</div>
-
-	
-</div><div data-id="5026191"data-blockId="5026165"data-elnProjectId="118217"data-sourceId="4624688"data-userAction="36"data-groupId="0"data-hidden="false"data-readOnly="false"data-versionTS="28.01.2020 11:12"data-createTS="28.01.2020 11:10"data-signHash="null"data-signHashDescription=""data-signHashVersion="null"data-signTS="null"data-witnessTS="null"data-title="null"data-blockNumber="4"data-totalBlocksInProject="4"data-projectName="Example project"data-projectReferenceId="null"data-signBiometricsDocId="null"data-witnessBiometricsDocId="null"data-referenced="false">
-	<div class="epb_header_container">
-	<div class="epb_header clearfix" style="display: block;">
-
-		<div class="entry_container">
-			<header class="entry_header">
-				<div class="entry_author">
-					<figure>
-						<span class="avatar-img"></span>
-						<img ng-src="">
-					</figure>
-
-					<div class="author_name">
-						<div class="author_firstname ng-binding">max</div>
-						<div class="author_lastname ng-binding">muster</div>
-					</div>
-				</div>
-				<div class="entry_menu_less entry_title_wrap ng-scope">
-					<div class="entry_name_menu has_tooltip">
-						<ul>
-							<li>
-								<div style="display:block">Entry 4/4:</div>
-								<div>In Project:</div>
-							</li>
-							<li>
-								<div style="display:block" class="entry_title ng-binding"><em>No entry title yet</em></div>
-								<div>Example project</div>
-							</li>
-						</ul>
-					</div>
-					<div class="entry_menu_options">
-					</div>
-					<div class="entry_dropdown entry_name">
-						<div class="close_entry_menu">
-							<span class="cancel_entry_title close_box-img"></span>
-						</div>
-						<ul>
-							<li><label>Entry name</label> <input
-									class="entry_name_input ng-pristine ng-untouched ng-valid"
-									type="text" data-title="" value=""></li>
-							<li><label>located in project</label> <select
-									class="ng-pristine ng-untouched ng-valid">
-								<option
-										value="0">tableproject
-								</option>
-								<option value="1" selected="selected">a project</option>
-							</select></li>
-							<li>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown cancel_entry_title grey_link"
-										  ng-click="cancel()">cancel</span>
-									<button class="save_entry_title btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</li>
-						</ul>
-					</div>
-				</div>
-
-				<div class="entry_menus">
-					<ul>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryDateController">
-							<div class="entry_menu_list has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<ul>
-									<li><span>created:</span> <span class="ng-binding">28.01.2020 11:10</span>
-									</li>
-									<li><span>modified</span> <span class="ng-binding">28.01.2020 11:12</span>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li>
-    <span>due date</span>
-    <span class=\"ng-binding\">22.10.2019</span>
-</li>
-<li>
-    <span>my date</span>
-    <span class=\"ng-binding\">22.10.2019</span>
-</li>
-
-								</ul>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown"
-								 ng-mouseenter="activateElement($event)">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<ul class="entry_dates">
-									<li><label>Dates</label></li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="created" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.createTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="modified" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.versionTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li style="overflow: visible;">
-										<div class="date_key">
-
-											<div class="selectize-control single ng-valid"
-												 ng-keyup="updateInput($select.search)"
-												 reset-search-input="false" ng-model="dateKeyInput.selected"
-												 theme="selectize" style="min-width: 120px;">
-												<div class="selectize-input"
-													 ng-class="{'focus': $select.open, 'disabled': $select.disabled, 'selectize-focus' : $select.focus}"
-													 ng-click="$select.activate()">
-													<div
-															ng-hide="$select.searchEnabled &amp;&amp; ($select.open || $select.isEmpty())"
-															class="ui-select-match ng-hide" ng-transclude=""
-															placeholder="Custom date"
-															ng-keydown="inputKeydown($event)">
-														<span class="ng-binding ng-scope"></span>
-													</div>
-													<input type="text" autocomplete="off" tabindex="-1"
-														   class="ui-select-search ui-select-toggle ng-pristine ng-untouched ng-valid"
-														   ng-click="$select.toggle($event)"
-														   placeholder="Custom date" ng-model="$select.search"
-														   ng-hide="!$select.searchEnabled || ($select.selected &amp;&amp; !$select.open)"
-														   ng-disabled="$select.disabled">
-												</div>
-												<div ng-show="$select.open"
-													 class="ui-select-choices selectize-dropdown single ng-scope ng-hide"
-													 repeat="date in availableDates | filter: $select.search">
-													<div
-															class="ui-select-choices-content selectize-dropdown-content">
-														<div class="ui-select-choices-group optgroup">
-															<div ng-show="$select.isGrouped"
-																 class="ui-select-choices-group-label optgroup-header ng-binding ng-hide"></div>
-															<!-- ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">due date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">my date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-														</div>
-													</div>
-												</div>
-												<input ng-disabled="$select.disabled"
-													   class="ui-select-focusser ui-select-offscreen ng-scope"
-													   type="text" aria-haspopup="true" role="button">
-											</div>
-										</div>
-
-										<div class="date_value">
-											<input type="text"
-												   class="entry_datepicker date_input ng-pristine ng-untouched ng-valid"
-												   ng-model="dateValueInput" ng-keydown="inputKeydown($event)">
-										</div>
-									</li>
-								</ul>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-									<button class="btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</div>
-						</li>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryTagsController">
-							<div class="entry_tags has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<span>demo</span><span>example</span><span>entry</span>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<label>Create new tags by using commas</label>
-								<div class="token_input token_input_width"></div>
-								<div class="tags_input entry_tags_input" ng-click="focusInput()">
-
-									<!-- ngRepeat: tag in currentTokens -->
-
-									<textarea class="token_input ng-pristine ng-untouched ng-valid"
-											  ng-model="tagInput" ng-keydown="inputKeydown($event)"></textarea>
-								</div>
-
-								<!--											<div class="save_entry_menu">
-												<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-												<button class="btn_on_grey" ng-click='fromViewModel()'>fromViewModel</button>
-											</div> -->
-								<h3 class="all_tags">All tags</h3>
-								<div class="tag_data_wrap">
-									<div class="tag_register">
-										<ul>
-											<li>
-												<ul class="my_tags">
-													<!-- ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">demo</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">Entry</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">example</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-												</ul>
-											</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</li>
-						<li>
-							<div class="entry_options">
-								<ul>
-								</ul>
-							</div>
-						</li>
-					</ul>
-				</div>
-			</header>
-			<div class="entry_toolbar"></div>
-		</div>
-		<div class="clear"></div>
-	</div>
-</div>
-
-	<div class="epb_content_wrap">
-	<div class="epb_content_container">
-		<div class="hdrop ui-droppable"></div>
-		<div class="dd_entry_table">
-			
-		</div>
-	</div>
-</div>
-
-	
-</div></div>
-		<div id="epb_newer_blocks_panel"></div>
-	</div>
-</div>
-</body>
-</html>
diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/labfolder_table_4624688_11.xlsx b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/labfolder_table_4624688_11.xlsx
deleted file mode 100644
index 251f84c2f7ef25c567bef65102a16134b5d453e7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12036
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

diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/labfolder_table_4625212_3.xlsx b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/labfolder_table_4625212_3.xlsx
deleted file mode 100644
index 83d3d8119085d311ceb5a54e56c5363351aa1c0d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5564
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

diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/original_image_946047_4625717_blank.png b/unittests/example_labfolder_data/projects/My private projects_0/118217_Example project/original_image_946047_4625717_blank.png
deleted file mode 100644
index 27d041f3a61aa472e57cb5447c3eb8aa364ca210..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2399
zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV2a>iVqjnp6%kcuU|?V@4sv&5Sa(k5B?AKk
zXMsm#F#`j)FbFd;%$g&?z`(#>;_2(kewT}jM~ROw^Za!N1_sFz*N775{M_8syb=cI
zqSVBa)D(sC%#sWRcTeAd@J2py1_q8Zo-U3d6}R4AGZbWC;5cG%VE^;uEXSvKytv{Q
z#K3Szl9PdfM~tE2AQOW@1OtPF4g*6oD?`Et1~8Y6o8dqLBbZByB9I<}CLt+;*^X%)
zc118JLfu3iMGR2ep$<oK6OwhvilDZGf{l$E9&9{f3^)`)4F-iR^%OyEhXnzWn~<zS
zQUtXf<~xFlU<Tt&6r?JG*$xeHBsU?Mgro>50zje!6(L7JGb=oC<Blbw6d{EzZj+D{
zA%!hb@r@KqAg$O<LQyoDccDp#<OoL!T$;osO(GoXSx^=LB?C|*p=!1SnGZ6U*lY>P
zhaf%BzyxujZh|=xHEcnm1Qn4Sm7{qVUV|eAE+}3GJT9pl;SbI;F{ZGuP0i$rVqjok
N@O1TaS?83{1OO{trceL?

diff --git a/unittests/example_labfolder_data/projects/My private projects_0/118224_subproj 1/index.html b/unittests/example_labfolder_data/projects/My private projects_0/118224_subproj 1/index.html
deleted file mode 100644
index e69de29b..00000000
diff --git a/unittests/example_labfolder_data/static/css/combined.css b/unittests/example_labfolder_data/static/css/combined.css
deleted file mode 100644
index a2cc2529..00000000
--- a/unittests/example_labfolder_data/static/css/combined.css
+++ /dev/null
@@ -1,10061 +0,0 @@
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-table.adminTable {
-  background-color: white;
-  border-collapse: collapse;
-}
-table.adminTable th {
-  font-weight: bold;
-  border: 1px solid black;
-  padding: 10px;
-}
-table.adminTable th .info {
-  font-size: 10px;
-  width: 120px;
-}
-table.adminTable td {
-  border: 1px solid black;
-  padding: 10px;
-}
-#percentage {
-  border: 1px solid black;
-  height: 20px;
-  width: 200px;
-  background: white;
-  position: relative;
-  text-align: center;
-  color: black;
-  font-weight: bold;
-  display: none;
-}
-#percentage div {
-  height: 100%;
-  width: 0%;
-  background: #33FF33;
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-#percentage span {
-  height: 100%;
-  width: 100%;
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-#messages {
-  width: 500px;
-  height: 300px;
-  overflow: scroll;
-}
-#buttonCancel {
-  margin-top: 20px;
-  width: 150px;
-  height: 30px;
-  display: none;
-}
-
-/***********
-* apps.css *
-************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-.app_card {
-  background-color: white;
-  border: 1px solid #bac7d4;
-  float: left;
-  height: 260px;
-  margin: 10px;
-  padding: 10px;
-  overflow: hidden;
-  text-align: center;
-  width: 144px;
-  -webkit-transition: all 0.1s ease;
-  -moz-transition: all 0.1s ease;
-  -o-transition: all 0.1s ease;
-  transition: all 0.1s ease;
-}
-.app_card:hover {
-  -webkit-box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-}
-.app_card_icon {
-  width: 100px;
-  height: 100px;
-}
-.app_card_icon:hover,
-.app_card_title:hover {
-  cursor: pointer;
-}
-.app_card .app_install_button {
-  width: 100%;
-}
-.app_installed_info {
-  line-height: 1.4;
-  font-size: 13px;
-}
-.app_card_title {
-  margin-top: 5px;
-  margin-bottom: 5px;
-  font-size: 16px;
-  height: 44px;
-}
-.app_card_lastUpdate {
-  font-size: 12px;
-  line-height: 1.6;
-  color: #7b95ad;
-  margin-bottom: 20px;
-}
-.app_info_top_left {
-  float: left;
-  width: 200px;
-  padding-top: 25px;
-  text-align: center;
-}
-.app_info_top_right {
-  margin-left: 202px;
-  padding-top: 25px;
-}
-.app_info_icon {
-  border: 1px solid #CCC;
-  border-radius: 10px;
-  width: 150px;
-  height: 150px;
-}
-.app_info_top_left .app_install_button {
-  width: 150px;
-  margin-top: 15px;
-  margin-left: 25px;
-}
-.app_info_title {
-  margin-top: 0;
-  margin-bottom: 20px;
-  font-size: 24px;
-}
-.app_info_description {
-  line-height: 20px;
-  max-width: 600px;
-}
-.app_info_lastUpdate {
-  font-size: 12px;
-  color: #aaa;
-  margin-bottom: 20px;
-}
-.app_info_preview {
-  padding-top: 15px;
-  padding-bottom: 25px;
-}
-.app_info_preview_left {
-  float: left;
-  width: 175px;
-  padding-left: 25px;
-}
-.app_info_preview_right {
-  margin-left: 202px;
-}
-.app_info_preview_small {
-  border: 3px solid #CCC;
-  width: 150px;
-  margin-bottom: 10px;
-  cursor: pointer;
-  transition: all ease 0.3s;
-}
-.app_info_preview_big {
-  border: 3px solid #CCC;
-  width: 600px;
-  height: 350px;
-}
-.app_info_preview_small.selected {
-  border: 3px solid #69bfee;
-  box-shadow: 0 0 10px #69bfee;
-}
-
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-
-/******************************
- 	COMMENTS COLLECTION
-*******************************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-.eln_main_content_box.comments {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  height: auto;
-  min-height: 400px;
-  margin: 0 25px 0 0;
-}
-#comments_header {
-  background: #EEE;
-  border-bottom: 1px solid #D6D4D5;
-  border-radius: 10px 10px 0 0;
-  display: block;
-  font-size: 14px;
-  height: 35px;
-  padding: 10px 0px 5px 15px;
-}
-#comments_content {
-  max-width: 900px;
-  padding-left: 10px;
-  display: block;
-  line-height: 18px;
-  position: relative;
-  overflow: auto;
-}
-.comment_pagination {
-  position: relative;
-  float: left;
-}
-.comment_pagination,
-.comment_total,
-.comment_shown {
-  font-size: 11px;
-}
-.message_pagination {
-  position: relative;
-  float: left;
-}
-.comment_page_change {
-  box-sizing: border-box;
-  cursor: pointer;
-  display: inline-block;
-  width: 30px;
-  text-align: center;
-  font-size: 22px;
-  margin: 0;
-  line-height: 0.6;
-  height: 17px;
-  margin-top: 4px;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-}
-.comment_page_change.disabled .disabled {
-  color: #5e7b97;
-  cursor: default;
-}
-.comment_empty_folder {
-  padding: 50px;
-  text-align: center;
-  font-size: 12px;
-}
-.comment_list {
-  font-size: 14px;
-}
-.comment_list table {
-  border-collapse: collapse;
-  outline: none;
-  table-layout: fixed;
-  width: 100%;
-}
-.comment_list table tr td:last-child {
-  font-size: 11px;
-}
-.comment_list_line {
-  font-size: 12px;
-  border-bottom: 1px solid #bac7d4;
-  cursor: pointer;
-  height: 34px;
-  line-height: 1.2;
-  white-space: nowrap;
-}
-.comment_list_line:hover {
-  background: #ecf0f3;
-}
-.comment_list_line:first-child:hover {
-  background: none;
-  cursor: default;
-}
-.comment_line_name {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  vertical-align: bottom;
-  overflow: hidden;
-  padding-left: 4px;
-}
-.comment_line_text {
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.column_comment_name {
-  min-width: 100px;
-  width: 25%;
-}
-.column_comment_project {
-  min-width: 100px;
-  width: 25%;
-}
-.column_comment_content {
-  min-width: 100px;
-  width: 50%;
-}
-.column_comment_date {
-  width: 89px;
-}
-.table_header {
-  color: #7b95ad;
-  font-size: 12px;
-}
-.grey_line {
-  border-bottom: solid 1px #9baec0;
-}
-/******************************
- 	COMMENT SIDE VIEW
-*******************************/
-.comment_block_container {
-  /* 	border-left: 1px solid #DDD; */
-  display: none;
-  font-size: 12px;
-  min-height: 25px;
-  overflow-y: auto;
-  overflow-x: hidden;
-  position: relative;
-  vertical-align: top;
-  min-width: 250px;
-  width: 15%;
-}
-.comment_block {
-  border-radius: 0 0 10px 0;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 15px;
-  right: 0;
-}
-.add_comment {
-  display: block;
-  margin: 10px;
-  text-align: center;
-}
-.epb_entry_removed .comment_block_container {
-  display: none !important;
-}
-.epb_entry_removed .epb_comments_alert {
-  display: none !important;
-}
-/******************************
- 	COMMENT THREAD
-*******************************/
-.comment_thread_box {
-  background: white;
-  border: 1px solid #bac7d4;
-  margin-bottom: 10px;
-  min-height: 40px;
-  padding: 5px;
-  position: relative;
-}
-.comment_thread_box:after,
-.comment_thread_box:before {
-  right: 100%;
-  top: 23px;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-}
-.comment_thread_box:after {
-  border-right-color: white;
-  border-width: 13px;
-  margin-top: -13px;
-}
-.comment_thread_box:before {
-  border-right-color: #c0ccd8 !important;
-  border-width: 15px;
-  margin-top: -15px;
-}
-.comment_thread_resolve {
-  cursor: pointer;
-  text-align: right;
-  margin-bottom: 10px;
-}
-.comment_thread_resolve span {
-  font-size: 8px;
-}
-.comment_thread_resolve:hover {
-  color: #4bb1d7;
-}
-.comment_thread_resolve.disabled {
-  color: #aaa;
-  cursor: default;
-}
-/******************************
- 	COMMENT ITEM
-*******************************/
-.comment_content_wrap {
-  float: left;
-  width: 174px;
-}
-.comment_item {
-  /* 	border-bottom: 1px solid lighten(@dark_blue, 60%); */
-  margin-bottom: 10px;
-  overflow: auto;
-}
-.comment_item:last-child {
-  border: 0;
-  padding-bottom: 20px;
-}
-.comment_author_picture {
-  border: 1px solid #bac7d4;
-  float: left;
-  margin-right: 6px;
-  margin-top: 2px;
-}
-.comment_author {
-  color: #3babe9;
-  margin-right: 3px;
-  font-weight: bold;
-}
-.comment_content,
-.comment_content_resizer {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  line-height: 18px;
-  margin: 5px 0px 0px;
-  width: 174px;
-  white-space: pre-line;
-  word-wrap: break-word;
-}
-.comment_content.default_textfield,
-.comment_content_resizer.default_textfield {
-  background: #FFF;
-  font-size: 12px;
-  min-height: 26px;
-  line-height: 18px;
-  margin: 2px 0 0 0;
-  overflow: hidden;
-  padding: 5px;
-  resize: none;
-  border-radius: 0;
-  border-color: #d9e1e8;
-  vertical-align: middle;
-}
-.comment_content.default_textfield {
-  height: 25px;
-}
-.comment_content.default_textfield:focus {
-  /* 	box-shadow: 0 0 3px #4bb1d7; */
-}
-.comment_content_label {
-  position: relative;
-}
-.comment_content_label label {
-  position: absolute;
-  top: -20px;
-  left: 6px;
-  color: #9baec0;
-  font-style: italic;
-  font-family: Arial;
-  cursor: text;
-  font-size: 12px;
-}
-.comment_cancel {
-  float: right;
-  padding: 10px;
-}
-.comment_publish,
-.comment_edit {
-  float: right;
-  height: 22px;
-  position: relative;
-  margin: 5px 0 0 0;
-}
-.comment_user_actions {
-  display: none;
-  margin: 8px 0;
-}
-.comment_user_actions .edit_light-img {
-  margin: 2px 20px 0 0;
-}
-.comment_timestamp {
-  margin-right: 23px;
-  line-height: 1.8;
-  float: left;
-  font-size: 10px;
-  color: #9baec0;
-}
-.comment_action {
-  padding: 5px;
-}
-.comment_content_resizer,
-.comment_edit,
-.comment_published.readOnly .comment_user_actions,
-.comment_published.comment_editing .comment_user_actions,
-.comment_published .comment_publish {
-  display: none;
-}
-.comment_editing .comment_edit,
-.comment_published .comment_user_actions {
-  display: block;
-}
-.comment_editing {
-  padding-bottom: 35px;
-}
-.bottonShowComments,
-.bottonHideComments {
-  display: none;
-}
-.comment_content_wrap .default_textfield {
-  border: 1px solid #bac7d4;
-}
-
-/******************************
- 	Dashboard VIEW
-*******************************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-.dashboard_item {
-  width: 50%;
-  min-width: 460px;
-  height: 45%;
-  min-height: 300px;
-  padding: 10px 20px 0 4px;
-  margin-top: 5px;
-  overflow: auto;
-  float: left;
-}
-.dashboard_item_menu {
-  background: #EEE;
-  border-bottom: 1px solid #D6D4D5;
-  display: block;
-  font-size: 14px;
-  height: 35px;
-  padding: 10px 0px 5px 15px;
-  margin: 0;
-  list-style-type: none;
-}
-.dashboard_item_menu > li {
-  height: 65%;
-  float: left;
-  display: block;
-  margin-right: 10px;
-  padding-right: 14px;
-  padding-top: 9px;
-  border-right: solid 1px #D6D4D5;
-}
-.dashboard_item h2 {
-  margin-top: 2px;
-  display: block;
-  font-weight: normal;
-}
-.dashboard_item h2 a {
-  color: #374858;
-  text-decoration: none;
-}
-.dashboard_item .default_button {
-  float: right;
-  margin-right: 10px;
-}
-.eln_main_content_box.apps {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  margin: 0 25px 0 0;
-  padding: 20px;
-  height: 95%;
-  overflow: auto;
-}
-.apps_decoration {
-  opacity: 0.3;
-  font-size: 45px;
-  text-align: center;
-  margin-top: 50px;
-}
-.dashboard_apps_info {
-  cursor: default;
-  font-size: 14px;
-}
-.dashboard_apps_tooltip {
-  opacity: 0;
-  font-size: 14px;
-  transition: all ease-in 0.3s;
-}
-.dashboard_apps_info:hover + .dashboard_apps_tooltip {
-  opacity: 1;
-}
-.create_list,
-.create_item {
-  background: rgba(255, 255, 255, 0.6);
-  border: 1px solid #bac7d4;
-  height: 25px;
-  padding-left: 5px;
-  color: #4b6277;
-  margin-top: 10px;
-  width: 90%;
-  font-size: 14px;
-  /*   .inner-shadow(-1px, -1px, 1px, 0.2); */
-}
-.create_item {
-  margin: 0 0 10px 0;
-}
-.done_item_wrap .listed_item {
-  text-decoration: line-through;
-}
-.todolist_btn {
-  text-align: left;
-  color: #4b6277;
-  background: #f3f5f7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e0e6eb), color-stop(1, #f3f5f7));
-  background: -ms-linear-gradient(bottom, #e0e6eb, #f3f5f7);
-  background: -moz-linear-gradient(center bottom, #e0e6eb 0%, #f3f5f7 100%);
-  background: -o-linear-gradient(#f3f5f7, #e0e6eb);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f5f7', endColorstr='#e0e6eb', GradientType=0);
-  border: 1px solid #9baec0;
-  width: 90%;
-  margin: 0 0 4px 0;
-  cursor: pointer;
-}
-.todolist_btn:hover {
-  opacity: 1;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  border: 1px solid #7b95ad;
-  -webkit-box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-  -moz-box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-  box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-}
-.todolist_btn:active {
-  color: #4b6277;
-  opacity: 1;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #7b95ad;
-  background: #cad4de;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e0e6eb), color-stop(1, #cad4de));
-  background: -ms-linear-gradient(bottom, #e0e6eb, #cad4de);
-  background: -moz-linear-gradient(center bottom, #e0e6eb 0%, #cad4de 100%);
-  background: -o-linear-gradient(#cad4de, #e0e6eb);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cad4de', endColorstr='#e0e6eb', GradientType=0);
-}
-.active_todo_list {
-  background: white;
-  border: 1px solid #9baec0;
-  cursor: default;
-  position: relative;
-}
-.active_todo_list:hover,
-.active_todo_list:active {
-  border: 1px solid #5e7b97;
-}
-.active_todo_list:after {
-  right: 0px;
-  top: 11px;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(136, 183, 213, 0);
-  border-left-color: #374858;
-  border-width: 5px;
-  margin-top: -5px;
-}
-.todolist_collection {
-  width: 34%;
-  height: 100%;
-  padding-right: 3%;
-  display: inline-block;
-}
-.todolist_collection > ul {
-  margin: 0;
-  padding: 0;
-}
-.todolist_collection > ul li {
-  list-style-type: none;
-}
-.selected_list {
-  width: 65%;
-  min-height: 100%;
-  height: auto;
-  display: inline-block;
-  padding: 2% 2% 2% 5%;
-  vertical-align: top;
-  background: white;
-  border-radius: 3px;
-  border: 1px solid #9baec0;
-}
-.selected_list ul {
-  margin: 0;
-  padding: 0;
-  list-style: none;
-}
-.item_wrap {
-  margin: 3px 0;
-}
-.item_wrap .trash-img {
-  display: none;
-  cursor: pointer;
-}
-.item_wrap:hover {
-  background: #f3f5f7;
-}
-.item_wrap:hover .trash-img {
-  display: block;
-}
-.todolist_btn_wrap .trash-img {
-  display: none;
-  cursor: pointer;
-}
-.todolist_btn_wrap:hover .trash-img {
-  display: block;
-}
-.todolist_wrap {
-  padding-top: 20px;
-}
-.todolist_wrap label {
-  color: #a7b8c8;
-  font-size: 12px;
-}
-.todolist_wrap h3 {
-  font-weight: normal;
-  font-size: 14px;
-  margin: 0 0 10px 10px;
-  display: inline-block;
-}
-.todolist_wrap .trash-img {
-  margin-top: 2px;
-}
-.todolist_wrap input {
-  position: relative;
-  vertical-align: middle;
-  bottom: 1px;
-}
-.listed_item {
-  display: inline-block;
-}
-::-webkit-input-placeholder {
-  /* WebKit browsers */
-  color: #9baec0;
-}
-:-moz-placeholder {
-  /* Mozilla Firefox 4 to 18 */
-  color: #9baec0;
-  opacity: 1;
-}
-::-moz-placeholder {
-  /* Mozilla Firefox 19+ */
-  color: #9baec0;
-  opacity: 1;
-}
-:-ms-input-placeholder {
-  /* Internet Explorer 10+ */
-  color: #9baec0;
-}
-@media (max-width: 1380px) {
-  .todolist_btn {
-    width: 80%;
-  }
-}
-@media (max-width: 970px) {
-  .todolist_btn {
-    width: 88%;
-  }
-  .dashboard_item {
-    width: 100%;
-  }
-}
-
-.re-deviceData {
-	background-image: url(/static/img/design/devices-icon.png);
-}
-
-.re-deviceData:hover {
-	background-image: url(/static/img/design/devices-hover-icon.png);
-}
-
-#devices_library .device_log {
-	padding: 10px;
-	margin: 10px;
-	border-bottom: 1px solid #BBB;
-}
-
-#devices_library li {
-	list-style: none;
-}
-
-#devices_library .device_line {
-	font-size: 14px;
-	line-height: 30px;
-	list-style: none;
-	width: 600px;
-	padding: 5px;
-}
-
-#devices_library .device_line:hover {
-	background: #EDEDED;
-}
-
-#devices_library .device_header {
-	font-size: 14px;
-	margin-bottom: 10px;
-}
-
-.device_file, .device_data {
-	cursor: pointer !important;
-	float: right !important;
-	right: 0 !important;
-}
-
-.devices_popup {
-	width: 750px !important;
-	left: 50% !important;
-	margin-left: -375px !important;
-}/*******************
-*  eln_layout.css  *
-********************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-::selection {
-  background: #c5e6f8;
-}
-::-moz-selection {
-  background: #c5e6f8;
-}
-*,
-*::before,
-*::after {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-a {
-  cursor: pointer;
-}
-body {
-  font-size: 14px;
-  margin: 0;
-  padding: 0;
-  font-family: arial, sans-serif;
-  height: 100%;
-  width: 100%;
-}
-html {
-  height: 100%;
-}
-.body_bg {
-  background: #ffffff url(../img/squares.png);
-  height: 100%;
-  width: 100%;
-  position: fixed;
-  z-index: -1;
-  top: 33px;
-  left: -10px;
-}
-a {
-  text-decoration: none;
-  color: #1995d8;
-  outline: none;
-}
-a:hover {
-  text-decoration: none;
-}
-img {
-  border: 0;
-}
-button {
-  margin: 0;
-}
-button::-moz-focus-inner {
-  border: 0;
-}
-.clear {
-  clear: both;
-}
-.content_top_margin {
-  margin-top: 50px;
-}
-/******************************
- DEFAULT BLUE BUTTONS
-*******************************/
-.default_button {
-  border: 1px solid #455a6e;
-  padding: 4px 8px;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-  color: white;
-  opacity: 1;
-  line-height: 1.2;
-  background: #304d69;
-  font-size: 14px;
-  -webkit-transition: all 0.1s linear;
-  -moz-transition: all 0.1s linear;
-  -o-transition: all 0.1s linear;
-  transition: all 0.1s linear;
-  -webkit-backface-visibility: hidden;
-  cursor: pointer;
-  /* 	background-color:#374858; */
-  /* 	border:1px solid #ffffff; */
-  /* 	border-radius:6px; */
-  /*   	box-shadow:0px 0px 1px black; */
-  /* 	-webkit-box-sizing: border-box; */
-  /*     -moz-box-sizing: border-box; */
-  /*     box-sizing: border-box; */
-  /* 	color:#ffffff; */
-  /* 	cursor:pointer; */
-  /*   	display:inline-block; */
-  /*   	float:left; */
-  /* 	font-family:din-medi; */
-  /* 	font-size:14px; */
-  /* 	height:28px; */
-  /*    	line-height:28px; */
-  /* 	margin:0 1px 1px 0; */
-  /*   	outline: none; */
-  /*   	padding: 0 10px; */
-  /*   	transition: background-color 0.2s ease, box-shadow 0.2s ease; */
-}
-.default_button:hover,
-.default_button:focus {
-  background: #375877;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  color: white;
-  text-decoration: none;
-}
-.default_button:active {
-  background: #304d69;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.5);
-  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.5);
-  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.5);
-}
-.default_button:hover {
-  /* 	background-color: #607D99; */
-  /*   	text-decoration:none; */
-}
-.default_button:active {
-  opacity: 1.0;
-  /* 	  	box-shadow:0px 0px 10px #888888; */
-  /*   	text-decoration:none; */
-}
-.default_button.disabled {
-  opacity: 0.5;
-  /* 	background-color:#DDD; */
-  /* 	border:1px solid #FFF; */
-  /*   	box-shadow:0px 0px 1px #AAA; */
-  /* 	color:#AAA; */
-  /* 	cursor:default; */
-}
-/******************************
- DEFAULT FIELDS
-*******************************/
-.default_textfield {
-  background-color: white;
-  border: 0;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  font-family: Arial;
-  color: #4b6277;
-  font-size: 14px;
-  line-height: 1.8;
-  font-style: normal;
-  font-variant: normal;
-  font-weight: normal;
-  margin: 0 5px 5px 0;
-  padding-left: 5px;
-  min-height: 30px;
-  transition: box-shadow ease 0.2s;
-}
-.textfield_on_white {
-  border: solid 1px #bac7d4;
-}
-.default_textfield:hover {
-  /* 	box-shadow: 0 0 3px #69bfee;	 */
-}
-.default_textfield:focus {
-  /* 	border: 1px solid #69bfee; */
-  /* 	box-shadow: 0 0 6px #69bfee;	 */
-}
-/******************************
- DEFAULT SELECT
-*******************************/
-.default_select {
-  background: #FFF;
-  border: 1px solid #d9e1e8;
-  color: #4b6277;
-  cursor: pointer;
-  margin: 0 0 0 10px;
-  padding: 4px 4px 4px 8px;
-}
-.dialog_wide_select {
-  margin: 0;
-  width: 100%;
-}
-/******************************
- DEFAULT PROFILE PICTURE
-*******************************/
-img.default_profile_picture {
-  border: 1px solid #888;
-  height: 100px;
-  width: 100px;
-}
-img.default_profile_picture_small {
-  border: 1px solid #888;
-  height: 32px;
-  width: 32px;
-  margin-top: 3px;
-}
-/* ****************** */
-/* more_options START */
-/* ****************** */
-.more_options {
-  float: right;
-  position: relative;
-}
-.more_options_panel {
-  position: absolute;
-  right: 0;
-  z-index: 10;
-  display: none;
-  -webkit-box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-  border: 1px solid #CDCDCD;
-  /* 	border-radius: 10px; */
-  background-color: #FDFDFD;
-}
-.more_options_panel.in_project {
-  top: 38px;
-}
-.more_options_panel.in_block {
-  top: 40px;
-}
-.more_options_item {
-  font-size: 12px;
-  /* 	line-height: 40px; */
-  padding-left: 12px;
-  padding-right: 12px;
-  cursor: pointer;
-  /* 	border-top: 1px solid #D6D4D5; */
-  transition: background ease 0.2s;
-}
-.more_options_item:hover {
-  /* 	background: #ededed; */
-  /* 	color: #69bfee; */
-}
-.more_options_item:first-child {
-  /* 	border-radius: 10px 10px 0 0; */
-  /* 	border: 0; */
-}
-.more_options_item:last-child {
-  /* 	border-radius: 0 0 10px 10px; */
-}
-.more_options_item span {
-  position: absolute;
-  right: 0;
-}
-div.zoom_bar {
-  width: 180px;
-  padding: 4px 14px !important;
-  height: 44px;
-  -webkit-user-select: none;
-  /* Chrome all / Safari all */
-  -moz-user-select: none;
-  /* Firefox all */
-  -ms-user-select: none;
-  /* IE 10+ */
-}
-div.zoom_bar:hover {
-  background: #e6ebef;
-}
-div.zoom_bar:hover {
-  color: #374858;
-}
-/* **************** */
-/* more_options END */
-/* **************** */
-/* ****************** */
-/* gear_button START */
-/* ****************** */
-/* ************ */
-/* layout START */
-/* ************ */
-/* generic rules */
-.eln_row {
-  left: 0;
-  right: 0;
-  /* 	overflow:hidden; */
-  position: absolute;
-}
-.eln_scroll-x {
-  overflow-x: auto;
-}
-.eln_scroll-y {
-  overflow-y: scroll;
-}
-/* specific rules */
-.eln_header.eln_row {
-  position: relative;
-  /* 	height:50px; */
-  /* 	background: #FFF; */
-  /* 	box-shadow:0 3px 10px #BBB; */
-  min-width: 800px;
-}
-.eln_content.eln_row {
-  top: 70px;
-  bottom: 0;
-  margin-left: 200px;
-  min-width: 600px;
-}
-.eln_main_title.eln_row {
-  top: 70px;
-  margin-right: 40px;
-  margin-left: 100px;
-  min-width: 436px;
-  overflow: visible;
-}
-.eln_main_content.eln_row {
-  top: 86px;
-  bottom: 0;
-  margin-left: 49px;
-  min-width: 600px;
-}
-.eln_folder_title.eln_row {
-  top: 70px;
-  margin-left: 100px;
-  min-width: 600px;
-  overflow: visible;
-}
-.eln_folder_content.eln_row {
-  top: 86px;
-  bottom: 0;
-  margin-left: 49px;
-  min-width: 640px;
-}
-.eln_project_title.eln_row {
-  top: 70px;
-  margin-left: 100px;
-  min-width: 640px;
-  overflow: visible;
-}
-.eln_project_content.eln_row {
-  top: 86px;
-  bottom: 0;
-  /* 	margin-left:100px; */
-  margin-left: 29px;
-  min-width: 600px;
-}
-.eln_main_content_box {
-  height: auto;
-  min-height: 400px;
-  margin: 0 25px 25px 0;
-  background-color: white;
-  border-bottom: solid 1px #cad4de;
-  border-left: solid 1px #cad4de;
-  border-right: solid 1px #cad4de;
-  position: relative;
-  padding: 20px 20px 20px 135px;
-  color: #4b6277;
-}
-.eln_main_content_box .header {
-  display: block;
-  font-size: 24px;
-  height: 35px;
-}
-.eln_main_content_box .header button {
-  margin-right: 10px;
-}
-.app_wrap {
-  position: relative;
-  background: #f3f5f7;
-  border: solid 1px #cad4de;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  height: calc(95% - 15px);
-}
-.app_content_wrap {
-  max-width: 900px;
-  padding: 10px;
-  display: block;
-  line-height: 18px;
-  position: absolute;
-  overflow: auto;
-  top: 10px;
-  left: 0;
-  right: 0;
-  bottom: 0px;
-}
-.app_header {
-  height: 29px;
-  background: #cad4de;
-  padding: 6px;
-}
-.app_header > h2 {
-  display: block;
-  float: left;
-  font-size: 14px;
-  margin: 0 13px 0 0;
-  color: #374858;
-}
-.app_header .filter_dn_wrap {
-  top: 23px;
-}
-.app_header .dropdown_button {
-  height: 20px;
-}
-.app_header .dropdown_button p {
-  margin: 0;
-  float: left;
-}
-.app_header .dropdown_button span {
-  height: 4px;
-  width: 12px;
-  display: block;
-  float: left;
-  margin: 2px 0 0 4px;
-}
-.app_plus_btn {
-  width: 35px;
-  height: 18px;
-  line-height: 1;
-  margin-right: 2px !important;
-  padding: 0;
-}
-.get_more_apps {
-  height: 100%;
-  padding: 20px;
-}
-/* ********** */
-/* layout END */
-/* ********** */
-/* ****************** */
-/* action links START */
-/* ****************** */
-.action_link_submit {
-  background: url(/static/img/design/action/submit.png) top right no-repeat;
-  width: 112px;
-  height: 25px;
-  display: block;
-}
-.action_link_submit:hover {
-  background-image: url(/static/img/design/action/submit_hover.png);
-}
-.action_link_signout {
-  background: url(/static/img/design/action/signout.png);
-  width: 83px;
-  height: 24px;
-  display: block;
-  float: right;
-  margin: 10px 0;
-}
-.action_link_signout:hover {
-  background: url(/static/img/design/action/signout_hover.png);
-}
-.action_link_profile {
-  background: url(/static/img/design/action/profile.png);
-  width: 71px;
-  height: 24px;
-  display: block;
-  float: right;
-  margin: 10px 0;
-}
-.action_link_profile:hover {
-  background: url(/static/img/design/action/profile_hover.png);
-}
-/* **************** */
-/* action links END */
-/* **************** */
-/* ************ */
-/* header START */
-/* ************ */
-/* LOGO */
-.eln_header_logo {
-  float: left;
-  padding-top: 7px;
-  padding-left: 17px;
-}
-/* Storage icon */
-#eln_header_storage_button {
-  background: none repeat scroll 0 0 transparent;
-  border: none;
-  cursor: pointer;
-  float: right;
-  font-size: 14px;
-  margin-top: 5px;
-  padding: 0;
-  height: 27px;
-  width: 32px;
-}
-#eln_header_storage_button span {
-  font-size: 10px;
-  margin-top: 14px;
-  position: absolute;
-  text-align: center;
-  width: 32px;
-  z-index: 6;
-}
-#eln_header_storage_stored {
-  background-color: #ededed;
-  height: 32px;
-  width: 32px;
-}
-#eln_header_storage_mask {
-  position: absolute;
-  z-index: 5;
-}
-#eln_header_storage_fill {
-  background-color: #BDCA70;
-  bottom: -5px;
-  position: absolute;
-  width: 32px;
-  z-index: 2;
-}
-/* Storage drop down panel */
-#eln_header_storage_panel {
-  background-color: #FFFFFF;
-  border: 3px solid #DDDDDD;
-  top: 53px;
-  z-index: 7;
-}
-#eln_header_storage_info {
-  cursor: default;
-}
-#eln_header_storage_info:hover {
-  color: #374858;
-}
-#eln_header_storage_info span {
-  font-size: 14px;
-  padding-right: 10px;
-  text-align: right;
-  width: 80px;
-}
-/* Storage percent bar */
-#eln_header_storage_bar_container {
-  float: right;
-  padding: 12px 10px 0;
-}
-#eln_header_storage_bar {
-  border: 1px solid #888;
-  height: auto;
-  line-height: 15px;
-  padding: 2px;
-  position: relative;
-  width: 80px;
-}
-span#eln_header_storage_bar_percent {
-  font-size: 12px;
-  line-height: 12px;
-  padding: 0;
-  position: absolute;
-  text-align: center;
-  width: 80px;
-}
-#eln_header_storage_bar_fill {
-  background-color: #bdca70;
-  height: 10px;
-}
-#eln_header_name {
-  display: inline-block;
-  line-height: 40px;
-  text-align: center;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  padding: 0 5px;
-  vertical-align: top;
-  white-space: nowrap;
-}
-#eln_header_name div {
-  display: inline;
-}
-#eln_header_actions {
-  margin-right: 43px;
-}
-#eln_header_actions_button {
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  background: none repeat scroll 0 0 transparent;
-  border: none;
-  cursor: pointer;
-  float: right;
-  font-size: 14px;
-  height: 50px;
-  margin: 0;
-  padding: 5px;
-}
-#eln_header_storage_button:hover,
-#eln_header_actions_button:hover {
-  cursor: pointer;
-  background: #ededed;
-  border: none;
-  border-radius: 0;
-}
-#eln_header_storage_button:active {
-  margin: 5px 1px 0px 0px;
-}
-div#eln_header_actions_button.active {
-  background: #ededed;
-  border: none;
-  border-radius: 0;
-  margin: 0;
-}
-#eln_header_arrow span {
-  font-size: 18px;
-}
-#eln_header_arrow {
-  display: inline-block;
-  margin-top: 8px;
-  padding-left: 5px;
-  vertical-align: top;
-}
-#eln_header_actions_panel {
-  background-color: #FFFFFF;
-  position: absolute;
-  top: 53px;
-  z-index: 7;
-}
-.eln_header_actions_item {
-  border-top: 1px solid #D6D4D5;
-  cursor: pointer;
-  font-size: 14px;
-  line-height: 40px;
-  padding: 0 20px;
-}
-.eln_header_actions_item:first-child {
-  border-top: 0;
-}
-.eln_header_actions_item span {
-  float: right;
-  font-size: 18px;
-  line-height: 18px;
-  padding-top: 12px;
-  text-align: center;
-  width: 36px;
-}
-.eln_header_actions_item:hover {
-  background: #ededed;
-  color: #69bfee;
-}
-.colorbar {
-  height: 4px;
-  background: url(/static/img/design/colorbar.png);
-}
-/* ************ */
-/* header END */
-/* ************ */
-/* **************** */
-/* navigation START */
-/* **************** */
-#eln_navigation {
-  position: fixed;
-  top: 70px;
-  width: 75px;
-  border-radius: 0 10px 0 0;
-  box-shadow: 0 3px 10px #888;
-  background: #FFF;
-  bottom: 0;
-  left: 0;
-  z-index: 2;
-  text-align: center;
-}
-#eln_navigation a {
-  border-bottom: 1px solid #d6d4d5;
-  display: block;
-  text-decoration: none;
-  padding: 10px 0;
-  font-size: 12px;
-  color: #374858;
-  transition: all ease 0.2s;
-}
-#eln_navigation a:hover {
-  background: #ededed;
-  color: #69bfee;
-}
-#eln_navigation a:first-child {
-  border-radius: 0 10px 0 0;
-}
-#eln_navigation span {
-  display: block;
-  font-size: 24px;
-  margin-bottom: 3px;
-}
-#eln_navigation span.icon-group {
-  font-size: 20px;
-  margin-left: 9px;
-}
-#eln_navigation span.icon-inventory {
-  margin-left: 4px;
-}
-#eln_navigation span.icon-template {
-  margin-left: 5px;
-}
-#eln_navigation .highlight {
-  color: #69bfee;
-}
-#eln_navigation .disabled,
-#eln_navigation .disabled:hover {
-  color: #ccc;
-}
-#eln_navigation button {
-  border: 5px solid white;
-  border-radius: 10px;
-  color: #FFF;
-  cursor: pointer;
-  font-size: 11px;
-  outline: none;
-  width: 70px;
-  height: 70px;
-}
-#feedback_button span,
-#invite_button span {
-  font-size: 22px;
-}
-#invite_button {
-  background-color: #bdca70;
-}
-#feedback_submit {
-  margin-right: 6px;
-  width: 60px;
-  height: 30px;
-  font-weight: bold;
-}
-#feedback_button {
-  background-color: #ad4e88;
-}
-.eln_navigation_support_buttons {
-  margin-top: 100px;
-}
-#feedback_panel {
-  display: none;
-  position: fixed;
-  top: -2px;
-  left: 0;
-  z-index: 102;
-  background: #d9e1e8;
-  border: 3px solid #ab48a9;
-  -webkit-box-shadow: 2px 6px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 2px 6px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 2px 6px 10px rgba(55, 72, 88, 0.3);
-}
-.feedback_title {
-  background: #ab48a9;
-  color: white;
-  padding: 5px;
-  text-align: center;
-  font-size: 15px;
-  line-height: 20px;
-}
-.feedback_title h4 {
-  display: inline-block;
-}
-.feedback_title img {
-  vertical-align: top;
-  margin-left: 10px;
-}
-.feedback_content {
-  padding: 10px;
-  width: 390px;
-}
-.feedback_content h4 {
-  font-size: 12px;
-}
-#feedback_panel h4 {
-  margin: 10px;
-  margin-bottom: 5px;
-}
-#feedback_comment {
-  margin: 0 10px 30px 10px;
-  margin-top: 0;
-  width: 350px;
-  height: 120px;
-}
-#feedback_submit_loader {
-  display: none;
-  margin: 8px 15px;
-}
-/* ************** */
-/* navigation END */
-/* ************** */
-/* ********* */
-/* EPB START */
-/* ********* */
-#epb_container {
-  /* 	padding-top: 10px; */
-  /* 	padding-bottom: 80px; */
-}
-img.imageOriginal {
-  border: 1px solid #DDD;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  transition: all linear 0.2s;
-}
-img.imageLayer {
-  left: 0;
-  margin-left: auto;
-  margin-right: auto;
-  position: absolute;
-  right: 0;
-  top: 0;
-  transition: all linear 0.2s;
-}
-#commentBlock {
-  border-radius: 10px;
-  cursor: pointer;
-  position: absolute;
-  right: 15px;
-  width: 200px;
-  background: #FFF;
-  top: 1px;
-}
-#epb_older_blocks_panel,
-#epb_newer_blocks_panel {
-  text-align: center;
-  color: #999;
-  height: 30px;
-  line-height: 30px;
-  margin: 10px 0;
-}
-.show_more_entries {
-  font-size: 13px;
-  margin: auto;
-  width: 300px;
-  background: white;
-  padding: 10px;
-  text-align: center;
-  -webkit-box-shadow: 0 3px 4px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 3px 4px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 3px 4px rgba(55, 72, 88, 0.3);
-}
-.show_more_entries span {
-  color: #1995d8;
-  cursor: pointer;
-}
-.epb_entry {
-  /* 	background-color: white; */
-  /* 	border: 1px solid #CCC; */
-  /* 	border-radius: 10px; */
-  display: inline-block;
-  /* 	margin-right:25px; */
-  margin-bottom: 20px;
-}
-#epb_container {
-  padding-bottom: 60px;
-}
-#epb_container > div {
-  margin: 1.5em 0;
-}
-.epb_entry:last-child {
-  margin-bottom: 10px;
-}
-.epb_entry_removed {
-  border: 1px solid #F88;
-  box-sizing: border-box;
-}
-.epb_entry p {
-  margin: 0 !important;
-}
-.epb_header {
-  /* 	height: 35px; */
-  /* 	min-width: 640px; */
-  /* 	border-bottom: 1px solid #d6d4d5; */
-  /* 	padding: 10px 10px 0 10px; */
-  /* 	background-color: #ededed; */
-  /* 	border-radius: 10px 10px 0 0; */
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-}
-/* .epb_header_container { */
-/* 	height: 45px; */
-/* } */
-.epb_header_sticky {
-  position: fixed;
-  top: 86px;
-  z-index: 10;
-  transition: width ease-in 0.3s;
-}
-.epb_header_sticky div.action_button_text {
-  margin-left: 5px;
-}
-.epb_header_sticky div.more_options {
-  margin-right: 5px;
-}
-/*Hack for comments*/
-.epb_content_wrap {
-  display: table;
-  /* 	width: 100%; */
-}
-.epb_show_comments .epb_content_container {
-  display: table-cell;
-  width: 85%;
-}
-.epb_show_comments .comment_block_container {
-  display: table-cell;
-}
-/*End of comment Hack */
-.epb_footer {
-  font-size: 9px;
-  height: auto;
-  margin-left: 30px;
-  margin-right: 45px;
-  position: relative;
-  padding: 5px;
-  background: #cad4de;
-  border-top: solid 1px white;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-}
-.epb_footer_signing_infos {
-  display: inline-block;
-  text-align: left;
-}
-.epb_footer_witness_actions {
-  display: inline-block;
-  margin-right: 10px;
-}
-.epb_footer_witness_actions a {
-  padding-left: 10px;
-  line-height: 25px;
-}
-.epb_date {
-  border-right: 1px solid #d6d4d5;
-  margin-right: 10px;
-  padding-right: 10px;
-  padding-top: 2px;
-  font-size: 12px;
-  float: right;
-  text-align: right;
-}
-.epb_author {
-  border-right: 1px solid #d6d4d5;
-  margin-right: 10px;
-  padding-right: 10px;
-  padding-top: 2px;
-  padding-left: 5px;
-  font-size: 12px;
-  float: right;
-}
-.epb_author_picture {
-  border: 1px solid #d6d4d5;
-  float: right;
-  margin-top: 2px;
-}
-.epb_comments_alert {
-  /* 	color: #FFFFFF; */
-  /* 	float:right; */
-  /* 	margin-right: 5px; */
-  cursor: pointer;
-}
-.epb_comments_count {
-  /* 	position: relative; */
-  /* 	top: 7px; */
-  /* 	left: 50%; */
-  /* 	margin-left: 3px; */
-  /* 	vertical-align: top; */
-}
-.epb_header_action {
-  line-height: 24px;
-  padding-right: 15px;
-  padding-top: 2px;
-  font-size: 12px;
-  float: left;
-}
-.epb_default_slider_container {
-  cursor: pointer;
-}
-div.epb_relative_zoom {
-  margin-left: 2px;
-  font-size: 14px;
-  display: inline-block;
-  position: relative;
-  width: 12px;
-  height: 16px;
-  vertical-align: text-bottom;
-}
-div.epb_relative_zoom:hover {
-  /* 	color: #69bfee; */
-}
-.epb_default_slider {
-  background-color: #ededed;
-  border: 1px solid #DDDDDD;
-  border-radius: 7px;
-  box-shadow: #B6B4A8 0 1px 7px inset;
-  box-sizing: border-box;
-  cursor: pointer;
-  display: inline-block;
-  height: 14px;
-  max-width: 100%;
-  overflow: hidden;
-  padding: 0;
-  position: relative;
-  width: 114px;
-  margin: 0 5px 0 4px;
-}
-.epb_default_slider_active {
-  background-color: #EFEFE7;
-  border: 1px solid #99968F;
-  border-radius: 6px;
-  box-sizing: border-box;
-  height: 12px;
-  position: relative;
-  width: 12px;
-  transition: all ease 0.2s;
-  left: 0;
-  z-index: 2;
-}
-.epb_default_slider_active:hover {
-  box-shadow: #888888 -1px -1px 3px inset;
-}
-.epb_default_slider_active:active {
-  background-color: #DDD;
-  box-shadow: #AAA 1px 1px 2px inset;
-}
-.epb_default_slider_bar {
-  background: #69bfee;
-  /* fallback */
-  background: rgba(75, 177, 215, 0.5);
-  box-shadow: #B6B4A8 0 1px 7px inset;
-  box-sizing: border-box;
-  border-bottom-left-radius: 6px;
-  border-top-left-radius: 6px;
-  border: 0;
-  height: 16px;
-  margin-top: -14px;
-  padding: 0;
-  position: relative;
-  width: 0px;
-  transition: all ease 0.2s;
-  z-index: 1;
-}
-.epb_default_slider_zoom {
-  cursor: default;
-  display: block;
-  line-height: 30px;
-  width: 100%;
-  text-align: center;
-}
-.epb_text_save_cancel {
-  display: none;
-}
-.epb_text_save_cancel a {
-  padding-left: 10px;
-}
-.epb_file {
-  margin: 20px 0;
-}
-.epb_image {
-  margin: 20px 0;
-  position: relative;
-}
-.epb_image .imageLayer {
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-.epb_image_zoom {
-  margin-top: 5px;
-}
-.epb_image_zoom img {
-  cursor: pointer;
-}
-.epb_image_zoom_square {
-  background-color: transparent;
-  border: 1px solid #666;
-  margin: 0 1px;
-}
-.epb_image_zoom_square_active {
-  background-color: #666;
-}
-.epb_new_panel {
-  background: #ededed;
-  border: 2px solid #CCC;
-  border-bottom: none;
-  border-radius: 5px 5px 0 0;
-  bottom: 0;
-  height: 40px;
-  left: 50%;
-  margin-left: -250px;
-  padding: 5px;
-  position: absolute;
-  text-align: center;
-  z-index: 2;
-}
-.epb_new_panel_middle {
-  background: url(/static/img/design/epb_new_panel_middle.png) repeat-x;
-  float: left;
-  height: 55px;
-  padding-top: 25px;
-}
-.epb_new_panel_left {
-  background: url(/static/img/design/epb_new_panel_left.png) no-repeat;
-  float: left;
-  height: 80px;
-  width: 30px;
-  position: relative;
-}
-.epb_new_panel_right {
-  background: url(/static/img/design/epb_new_panel_right.png) no-repeat;
-  float: left;
-  height: 80px;
-  width: 30px;
-}
-.epb_new_panel .default_button {
-  margin: 0 5px;
-}
-#epb_new_panel_jump_to_end {
-  display: none;
-}
-#epb_new_panel_jump_to_end div {
-  float: left;
-  font-size: 14px;
-  line-height: 30px;
-}
-.epb_entry_removed_msg_head {
-  display: none;
-  margin: 0 200px;
-  text-align: center;
-  color: #F88;
-  padding-top: 5px;
-}
-/* ******* */
-/* EPB END */
-/* ******* */
-/* ******************* */
-/* block history START */
-/* ******************* */
-.block_history_table {
-  border-collapse: collapse;
-  width: 100%;
-}
-tr.history_row:nth-child(odd) {
-  background-color: #fff;
-  cursor: pointer;
-  height: 23px;
-}
-tr.history_row:nth-child(even) {
-  background-color: #f0f0f0;
-  cursor: pointer;
-  height: 23px;
-}
-.block_history_table td.col1 {
-  padding: 3px 0 3px 5px;
-}
-.block_history_table td.col2 {
-  padding: 3px 10px 3px 10px;
-}
-.block_history_table td.col3 {
-  padding: 3px 0;
-}
-#block_history_navigation {
-  position: absolute;
-  width: 350px;
-  bottom: 0;
-  top: 30px;
-  left: 0;
-  overflow: auto;
-  border-right: 2px solid #374858;
-}
-#block_history_item_content {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  top: 30px;
-  left: 350px;
-  padding: 0 20px;
-  overflow: scroll;
-}
-.block_history_row_selected {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  background-color: #DDD !important;
-  color: #4BB1D1;
-}
-/* ***************** */
-/* block history END */
-/* ***************** */
-/* ************** */
-/* plupload START */
-/* ************** */
-.plupload_select {
-  width: 110px;
-  height: 24px;
-  margin: 0 auto;
-}
-.plupload_drop {
-  border: 2px dashed black;
-  width: 200px;
-  height: 80px;
-  margin: 0 auto;
-  background-color: #77ff66;
-}
-#plupload_container {
-  position: absolute;
-  top: -100px;
-  left: 0;
-  width: 100px;
-  height: 50px;
-  overflow: hidden;
-}
-/* ************ */
-/* plupload END */
-/* ************ */
-/* *************** */
-/* workspace START */
-/* *************** */
-.workspace_header_actions {
-  height: 50px;
-}
-.workspace_header_actions .default_button {
-  margin-right: 15px;
-}
-.workspace_header_link {
-  margin-right: 15px;
-  line-height: 36px;
-}
-.workspace_header_link span {
-  font-weight: bold;
-}
-/** Modified at the end of the section
-.workspace_header {
-	background-color: #F3F3F3;
-	border: 1px solid #DDD;
-	line-height: 36px;
-	padding: 5px;
-	padding-left: 15px;
-}*/
-.workspace_header_path a {
-  outline: none;
-  color: #fff;
-  text-decoration: none;
-}
-.workspace_header_path a:hover {
-  color: #69bfee;
-}
-.project_list_children {
-  display: none;
-  margin-left: 30px;
-}
-.project_list_head {
-  border: 1px solid #DDD;
-  border-radius: 10px;
-  background-color: #f3f3f3;
-  padding: 10px 0;
-  height: 12px;
-}
-.project_list_head .name {
-  margin-left: 15px;
-}
-.project_list_head .updateTS {
-  float: right;
-  margin-right: 15px;
-}
-.project_list {
-  min-height: 350px;
-  margin: 0 25px 25px 0;
-  background-color: #ffffff;
-  border-bottom: solid 1px #cad4de;
-  border-left: solid 1px #cad4de;
-  border-right: solid 1px #cad4de;
-  position: relative;
-  padding: 20px 20px 20px 135px;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-}
-.project_list_line {
-  /* 	background: url(/static/icon/project40.png) no-repeat 0 -40px; */
-  display: block;
-  outline: none;
-  color: #4b6277;
-  cursor: pointer;
-  text-decoration: none;
-  line-height: 1.2;
-  font-size: 14px;
-  padding: 5px 15px;
-  border: 1px solid transparent;
-  overflow: hidden;
-}
-.project_list_line > span {
-  color: #4b6277;
-  line-height: 1.2;
-  font-size: 14px;
-}
-.project_list_line:hover {
-  background-position: 0 0;
-  background: #ecf0f3;
-  text-decoration: none;
-}
-.project_list_line.is_folder {
-  background: url(/static/icon/folder40.png) no-repeat 0 -40px;
-}
-.project_list_line:hover.is_folder {
-  background-position: 0 0;
-}
-.project_list_line.is_group {
-  /* 	background: url(/static/icon/group40.png) no-repeat 0 -40px; */
-}
-.project_list_line:hover.is_group {
-  background-position: 0 0;
-}
-.project_list_line img {
-  vertical-align: top;
-}
-.project_list_line .name {
-  font-size: 14px;
-}
-.project_list_line .updateTS {
-  font-size: 15px;
-  float: right;
-  margin-right: 15px;
-}
-a.order_link {
-  font-size: 12px;
-  outline: none;
-  color: #374858;
-  text-decoration: none;
-}
-a.order_link:hover {
-  color: #69bfee;
-}
-a.order_link_asc {
-  padding-right: 12px;
-  background: url(/static/icon/order_sign.png) no-repeat right -65px;
-}
-a.order_link_desc {
-  padding-right: 12px;
-  background: url(/static/icon/order_sign.png) no-repeat right -45px;
-}
-a.order_link_asc:hover {
-  padding-right: 12px;
-  background: url(/static/icon/order_sign.png) no-repeat right -25px;
-}
-a.order_link_desc:hover {
-  padding-right: 12px;
-  background: url(/static/icon/order_sign.png) no-repeat right -5px;
-}
-.workspace_header {
-  background: #374858 repeat-x 0 0;
-  border: 1px solid #DDD;
-  border-radius: 10px;
-  height: 35px;
-  line-height: 5px;
-  padding: 5px 10px;
-}
-.workspace_name {
-  color: #FFFFFF;
-  float: left;
-  font-size: 24px;
-  height: 32px;
-  line-height: 32px;
-  margin-top: 5px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  width: 90%;
-  white-space: nowrap;
-}
-.workspace_name a {
-  color: #FFF;
-}
-.workspace_name a:hover {
-  color: #69bfee;
-  text-decoration: none;
-}
-/* ************* */
-/* workspace END */
-/* ************* */
-/* ******************* */
-/* profile block START */
-/* ******************* */
-#user_settings_innovation_level_form select {
-  background: #ffffff;
-  border: 1px solid #d9e1e8;
-  color: #5e7b97;
-  cursor: pointer;
-  margin: 0 0 0 10px;
-  padding: 4px 4px 4px 8px;
-  outline: 0;
-}
-#profile_picture_edit_panel {
-  float: left;
-  margin-right: 20px;
-  margin-bottom: 15px;
-  padding-left: 5px;
-}
-#profile_picture_edit_panel img {
-  border: 1px solid #bac7d4;
-  margin-top: 10px;
-  width: 100px;
-  height: 100px;
-}
-.profile_block {
-  padding-left: 15px;
-  width: 550px;
-  margin-bottom: 20px;
-}
-.profile_block_edit {
-  display: block;
-  float: right;
-  margin-right: 5px;
-  font-size: 12px;
-}
-.profile_edit .placeholder_frame {
-  margin: 0 5px 5px 0;
-}
-.project_pdf_export_list {
-  background: #ffffff;
-  border: 1px solid #DDD;
-  height: 125px;
-  margin: 15px 0 30px 0;
-  padding: 5px;
-  overflow-y: scroll;
-}
-.project_pdf_export_list div {
-  line-height: 18px;
-  height: 18px;
-  overflow: hidden;
-}
-.pdf_range_export label {
-  display: block;
-  text-align: left;
-}
-/*FIND A BETTER WAY WITH last-child*/
-#profile_contact {
-  border: none;
-  padding-bottom: 0px;
-}
-#profile_picture_edit_link {
-  position: relative;
-}
-#profile_picture_edit_panel span {
-  opacity: 0;
-  height: 25px;
-  left: 0;
-  line-height: 25px;
-  position: absolute;
-  text-align: center;
-  top: 86px;
-  width: 100px;
-  -webkit-transition: all 0.3s ease;
-  -moz-transition: all 0.3s ease;
-  -o-transition: all 0.3s ease;
-  transition: all 0.3s ease;
-}
-#profile_picture_edit_panel:hover span {
-  background: rgba(75, 98, 119, 0.95);
-  opacity: 1;
-  color: white;
-}
-.profile_block_img {
-  display: block;
-}
-#updatePersonalForm .placeholder_frame {
-  float: none;
-  width: 380px;
-}
-.profile_block_key {
-  float: left;
-  font-weight: bold;
-  font-size: 12px;
-  height: 24px;
-  line-height: 24px;
-  margin-bottom: 10px;
-  width: 100px;
-}
-#profile_settings .profile_block_key {
-  padding-left: 5px;
-  width: 200px;
-}
-#profile_settings .profile_block h2 {
-  margin: 0 0 15px 0;
-}
-.edit_wrap {
-  width: 100%;
-  height: 10px;
-}
-.profile_block_value {
-  float: left;
-  line-height: 24px;
-  font-size: 12px;
-}
-.general_setting_item {
-  margin-bottom: 20px;
-}
-.profile_block_value input[type=text],
-.profile_block_value input[type=password] {
-  width: 330px;
-}
-.profile_block_error {
-  color: red;
-  display: block;
-  line-height: 20px;
-}
-.cancel_save_panel {
-  float: right;
-  margin-right: 5px;
-  line-height: 36px;
-  margin-top: 20px;
-}
-.cancel_save_panel .cancel {
-  float: left;
-  padding-right: 10px;
-  font-size: 12px;
-}
-.profile_block h1 {
-  margin: 0;
-  font-size: 14px;
-}
-.profile_block h2 {
-  margin: 0 0 5px 0;
-  padding: 0 0 2px 4px;
-  color: #7b95ad;
-  border-bottom: 1px solid #9baec0;
-  font-size: 12px;
-  font-weight: normal;
-}
-.profile_show {
-  padding: 10px 0 2px 4px;
-  margin-bottom: 20px;
-}
-.profile_edit {
-  padding: 10px 0 2px 4px;
-  float: left;
-  display: block;
-}
-.profile_edit_personal {
-  width: 400px;
-}
-.profile_block h3 {
-  font-size: 12px;
-  margin: 10px 0;
-  font-weight: normal;
-}
-.profile_section {
-  min-height: 100px;
-  display: block;
-  overflow: auto;
-  margin-bottom: 20px;
-}
-.profile_prof_head {
-  width: 400px;
-}
-.profile_name_field {
-  width: 200px;
-}
-.placeholder_frame label.profile_personalEdit {
-  padding: 5px;
-}
-.profileTitle_field {
-  width: 200px;
-}
-#profile_personal .profile_show div {
-  display: inline;
-}
-/* ***************** */
-/* profile block END */
-/* ***************** */
-/* ******************** */
-/* sticky infobox START */
-/* ******************** */
-.sticky_infobox {
-  width: 350px;
-  height: 310px;
-  background: url(/static/img/design/sticky_infobox_big.png) 0 0 no-repeat;
-  padding: 50px 65px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-/* ****************** */
-/* sticky infobox END */
-/* ****************** */
-/* ************ */
-/* search START */
-/* ************ */
-.search_wrap {
-  padding-left: 15px;
-}
-.search_wrap .placeholder_frame {
-  height: 30px;
-}
-.search_wrap .placeholder_frame input {
-  height: 30px;
-}
-.search_wrap .placeholder_frame label {
-  padding: 4px 0 0 5px;
-  font-size: 14px;
-}
-.search_wrap .placeholder_frame button.search_button {
-  height: 30px;
-}
-.top_searchbox_form {
-  float: right;
-  position: relative;
-  top: 12px;
-  padding-right: 10px;
-}
-.search_result_item {
-  padding-bottom: 20px;
-  width: 560px;
-}
-.search_result_item_title {
-  text-decoration: underline;
-  font-size: 12px;
-}
-.search_result_item_title:hover {
-  text-decoration: underline;
-  color: #3b97ed;
-}
-.search_result_item_text {
-  font-size: 12px;
-}
-#search_result_load_more_spinner {
-  display: none;
-}
-#search_result_load_more_link {
-  display: none;
-}
-#search_result_error_message {
-  display: none;
-  color: red;
-}
-#search_result_num_all_results {
-  display: none;
-  color: #999;
-  font-size: 12px;
-  padding: 3px;
-}
-.search_result_content {
-  padding-top: 20px;
-}
-/* ********** */
-/* search END */
-/* ********** */
-.default_font {
-  font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif;
-  font-size: 15px;
-  line-height: 1.45em;
-  white-space: normal;
-}
-#data_element {
-  display: none;
-}
-
-
-/**************/
-/* IE WARNING */
-/**************/
-#ie_warning {
-  display: none;
-  background-color: #E66873;
-  color: #FFF;
-  font-size: 14px;
-  height: 30px;
-  left: 50%;
-  line-height: 14px;
-  margin-left: -310px;
-  padding: 5px;
-  position: fixed;
-  text-align: center;
-  width: 550px;
-  z-index: 9999;
-}
-a#ie_warning_close {
-  color: #FFF;
-  float: right;
-  font-size: 12px;
-  cursor: pointer;
-}
-a#ie_warning_update {
-  color: #FFF;
-  font-size: 14px;
-  text-decoration: underline;
-}
-/****************************/
-/* admin active weeks START */
-/****************************/
-.activeWeeksTable {
-  border-spacing: 0;
-  border-collapse: collapse;
-  font-size: 8px;
-  background-color: #e5e5e5;
-  text-align: center;
-}
-.activeWeeksTable th {
-  border: 1px solid #374858;
-}
-.activeWeeksTable td {
-  border: 1px solid #374858;
-}
-.activeWeeksTable .week {
-  width: 20px;
-  height: 20px;
-}
-.activeWeeksTable .week.status1 {
-  background-color: white;
-}
-.activeWeeksTable .week.status2 {
-  background-color: #fcc;
-}
-.activeWeeksTable .week.status3 {
-  background-color: #cfc;
-}
-.activeWeeksTable .week.status3 {
-  background-color: #cfc;
-}
-.activeWeeksTable .premium {
-  background-color: #cfc;
-}
-/**************************/
-/* admin active weeks END */
-/**************************/
-/**************************/
-/* pdf viewer       START */
-/**************************/
-#pdf_viewer {
-  border: 0;
-  display: block;
-  height: 100%;
-  width: 100%;
-}
-/**************************/
-/* pdf viewer         END */
-/**************************/
-.activeExcelSheet {
-  font-weight: bold;
-}
-a.editor_reference {
-  color: #a21621;
-  cursor: pointer;
-  font-weight: bold;
-  text-decoration: none;
-}
-.pdf_checkbox_label {
-  line-height: 32px;
-  margin-left: 25px;
-}
-.pdf_checkbox_sublabel {
-  line-height: 32px;
-  margin-left: 45px;
-}
-.pdf_setting_description {
-  margin-left: 50px;
-  font-size: 12px;
-}
-.pdf_filename_label {
-  display: block;
-  margin: 10px 0 10px 32px;
-}
-/**************************/
-/*          END */
-/**************************/
-#block_history_item_content .extract_preview_link,
-.readOnly .extract_preview_link {
-  display: none;
-}
-.extract_preview {
-  overflow: auto;
-}
-.extract_preview_confirm {
-  float: right !important;
-  margin-right: 25px;
-}
-/*********************/
-/* jsTemplates START */
-/*********************/
-#jsTemplates {
-  display: none;
-}
-p.jsTemplate_dialog_title {
-  display: none;
-}
-/*******************/
-/* jsTemplates END */
-/*******************/
-/***************/
-/* popup START */
-/***************/
-.popup {
-  display: none;
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  z-index: 98;
-  -moz-opacity: .8;
-  opacity: 0.8;
-  background-color: white !important;
-}
-.popup_window {
-  display: none;
-  position: absolute;
-  z-index: 99;
-  background-color: white;
-  /* 	border: 2px solid #374858; */
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-}
-.popup_window_default {
-  top: 75px;
-  bottom: 75px;
-  left: 75px;
-  right: 75px;
-}
-#my_popup_inner {
-  background-color: #cad4de;
-}
-.popup_dialog {
-  display: none;
-  position: absolute;
-  z-index: 99;
-  background-color: #cad4de;
-  top: 30%;
-  left: 50%;
-  width: 400px;
-  margin-top: -125px;
-  margin-left: -200px;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.8);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.8);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.8);
-}
-.popup_title {
-  height: 30px;
-  line-height: 30px;
-  margin-top: -1px;
-  padding-left: 5px;
-  background: #304d69;
-  color: white;
-}
-.popup_title_close {
-  font-size: 20px;
-  width: 20px;
-  height: 20px;
-  text-align: center;
-  line-height: 20px;
-  float: right;
-  cursor: pointer;
-  margin: 4px;
-}
-.popup_title_left {
-  float: left;
-}
-.popup_title_center {
-  text-align: center;
-}
-.popup_title_center span {
-  display: none;
-}
-.popup_loading_image {
-  margin: 50px auto;
-  background: url(/static/img/ajax-loader-big.gif) no-repeat;
-  width: 32px;
-  height: 32px;
-}
-.popup_dialog .popup_dialog_content {
-  max-height: 650px;
-  overflow: auto;
-  padding: 10px;
-}
-.popup_dialog_cancel_save_panel {
-  float: right;
-  margin-top: 10px;
-  line-height: 30px;
-}
-.popup_dialog_cancel_save_panel .cancel {
-  float: left;
-  padding-right: 5px;
-  font-size: 12px;
-  visibility: hidden;
-}
-.popup_dialog_cancel_save_panel .dialog_confirm {
-  visibility: hidden;
-}
-#import_footer .dialog_confirm {
-  visibility: visible;
-}
-.popup_dialog_cancel_save_panel .default_button {
-  margin-left: 5px;
-}
-.popup_scroll_content {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  top: 30px;
-  left: 0;
-  padding: 10px;
-  overflow: auto;
-}
-.popup_list_row {
-  padding-bottom: 15px;
-  margin-bottom: 15px;
-  border-bottom: 1px solid #DDD;
-}
-.popup_list_row .default_button {
-  float: right;
-}
-.popup_list_row .deny_link {
-  float: right;
-  line-height: 36px;
-  font-size: 12px;
-  margin: 0 5px;
-}
-.popup_list_row_desc {
-  padding-top: 12px;
-  margin-right: 125px;
-}
-.popup_dialog_error {
-  background-color: #E66873;
-  color: #FFF;
-  display: none;
-  font-size: 14px;
-  line-height: 18px;
-  padding: 5px;
-  text-align: center;
-}
-.popup_dialog_loading_button {
-  padding: 0 10px;
-}
-#my_popup_content {
-  height: calc(100% - 29px);
-  overflow: auto;
-}
-.input_block {
-  margin-bottom: 20px;
-  word-wrap: break-word;
-  font-size: 12px;
-}
-.input_block .folder_up-img {
-  background-position: -738px -5px;
-  width: 24px;
-  height: 13px;
-}
-.tagline_hidden {
-  display: none;
-}
-.input_title {
-  margin: 10px 0 5px;
-  font-size: 12px;
-  color: #4b6277;
-}
-#my_popup_content .input_title:first-of-type {
-  /* 	margin: 0 0 5px 0; */
-}
-#my_popup_content .spinner {
-  display: block;
-  margin: auto;
-}
-#my_popup_content textarea {
-  color: #4b6277;
-  line-height: 1.4;
-  font-size: 14px;
-  height: 150px;
-  resize: none;
-}
-/*************/
-/* popup END */
-/*************/
-/**************************/
-/* custom selectbox START */
-/**************************/
-div.lfSelectBox {
-  position: relative;
-  cursor: pointer;
-  background-color: white;
-  width: 0;
-  float: left;
-}
-div.lfSelectTitle {
-  border: 1px solid black;
-}
-div.lfSelectOptions {
-  position: absolute;
-  border: 1px solid black;
-  background: white;
-  z-index: 99;
-  display: none;
-}
-div.lfSelectOption:hover {
-  color: #E7E7E7;
-  background: #3988e5;
-}
-/************************/
-/* custom selectbox END */
-/************************/
-/* ************ */
-/* button START */
-/* ************ */
-a.btn,
-button.btn {
-  background: transparent url(/static/img/button/button_right.gif) no-repeat scroll top right;
-  border: 0;
-  color: #666;
-  cursor: pointer;
-  display: block;
-  float: left;
-  font-size: 14px;
-  line-height: 16px;
-  height: 24px;
-  margin-right: 6px;
-  outline: none;
-  padding-right: 16px;
-  padding-top: 0;
-  text-decoration: none;
-}
-a.btn span,
-button.btn span {
-  background: transparent url(/static/img/button/button_left.gif) no-repeat;
-  display: block;
-  padding: 4px 0 4px 18px;
-}
-a.btn img,
-button.btn img {
-  vertical-align: top;
-}
-a.btn:active,
-button.btn:active {
-  background-position: bottom right;
-}
-a.btn:active span,
-button.btn:active span {
-  background-position: bottom left;
-  padding: 5px 0 3px 18px;
-}
-/* a.btn36, button.btn36 { */
-/* 	background-color: transparent; */
-/* 	border: 0; */
-/* 	margin: 0; */
-/* 	padding: 0; */
-/* 	color: white; */
-/* 	cursor: pointer; */
-/* 	display: block; */
-/* 	float: left; */
-/* 	font-size: 14px; */
-/* 	line-height: 16px; */
-/* 	height: 36px; */
-/* 	outline: none; */
-/* 	text-decoration: none; */
-/* 	font-family: 'din-medi'; */
-/* } */
-/* a.btn36 img, button.btn36 img { */
-/* 	vertical-align: top; */
-/* 	margin-right: 7px; */
-/* } */
-/* a.btn36 span, button.btn36 span { */
-/* 	display: block; */
-/* 	float: left; */
-/* } */
-/* a.btn36 span.m, button.btn36 span.m { */
-/* 	background: url(/static/img/button/b36_m.png) repeat-x 0 0; */
-/* 	height: 16px; */
-/* 	padding: 10px 1px 10px 1px; */
-/* } */
-/* a.btn36 span.l, button.btn36 span.l { */
-/* 	background: url(/static/img/button/b36_l.png) no-repeat 0 0; */
-/* 	width: 15px; */
-/* 	height: 36px; */
-/* } */
-/* a.btn36 span.r, button.btn36 span.r { */
-/* 	background: url(/static/img/button/b36_r.png) no-repeat 0 0; */
-/* 	width: 15px; */
-/* 	height: 36px; */
-/* } */
-/* a.btn36:hover span, button.btn36:hover span { */
-/* 	background-position: 0 -36px; */
-/* } */
-/* a.btn36:active span, button.btn36:active span { */
-/* 	background-position: 0 -72px; */
-/* } */
-/* a.btn36:active span.m, button.btn36:active span.m { */
-/* 	padding: 11px 0px 9px 2px; */
-/* } */
-/* ********** */
-/* button END */
-/* ********** */
-/* ************ */
-/* errors START */
-/* ************ */
-.errorBox {
-  border: 1px solid red;
-}
-.errorInput {
-  background-color: red;
-}
-.errorMessage {
-  color: red;
-}
-/* ********** */
-/* errors END */
-/* ********** */
-/* *********************** */
-/* input placeholder START */
-/* *********************** */
-.placeholder_frame {
-  position: relative;
-  float: left;
-}
-.placeholder_frame label {
-  position: absolute;
-  padding: 7px 0 0 5px;
-  top: 2px;
-  left: 0;
-  color: #9baec0;
-  font-style: italic;
-  font-family: Arial;
-  cursor: text;
-  font-size: 14px;
-}
-.placeholder_frame input {
-  padding: 5px;
-  margin: 0;
-  font-size: 14px;
-  line-height: 14px;
-  color: #4b6277;
-}
-.placeholder_frame button {
-  position: absolute;
-  height: 28px;
-  padding: 7px;
-  top: 0;
-  right: 0;
-}
-.placeholder_frame input.searchbox_input {
-  width: 250px ;
-  padding-right: 30px;
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.placeholder_frame.big label {
-  font-size: 20px;
-  padding: 10px 0 0 12px;
-}
-.placeholder_frame.big input {
-  padding: 10px;
-  padding-right: 50px;
-  width: 500px;
-  font-size: 20px;
-  line-height: 20px;
-}
-.placeholder_frame.big button {
-  padding: 10px;
-  font-size: 20px;
-}
-/* *********************** */
-/* input placeholder END */
-/* *********************** */
-/* ************ */
-/* inputs START */
-/* ************ */
-.input_with_padding {
-  padding: 3px;
-  width: 100%;
-}
-.form_around_input_with_padding {
-  padding-right: 5px;
-}
-/* ********** */
-/* inputs END */
-/* ********** */
-.aligned_radio_button {
-  display: -moz-inline-box;
-  display: inline-block;
-  vertical-align: middle;
-  line-height: 18px;
-  margin-bottom: 5px;
-}
-input {
-  outline: 0;
-}
-textarea {
-  outline-color: #69bfee;
-}
-input[type="checkbox"].default_checkbox {
-  position: absolute;
-  opacity: 0;
-}
-input[type="checkbox"].default_checkbox + div {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: middle;
-  width: 46px;
-  height: 13px;
-  border: 1px solid rgba(55, 72, 88, 0.47);
-  border-radius: 999px;
-  margin: 0 .5em;
-  background: #f9fafb;
-  background-image: linear-gradient(rgba(176, 205, 231, 0.2), rgba(0, 0, 0, 0)), linear-gradient(90deg, #374858, rgba(0, 0, 0, 0) 65%);
-  background-size: 200% 100%;
-  background-position: 100% 0;
-  background-origin: border-box;
-  background-clip: border-box;
-  overflow: hidden;
-  transition-duration: .3s;
-  transition-property: padding, width, background-position, text-indent;
-  box-shadow: 0 0.2em 0.4em rgba(14, 27, 37, 0.12) inset, 0 0.45em 0 0.1em rgba(45, 98, 133, 0.05) inset;
-  font-size: 150%;
-}
-input[type="checkbox"].default_checkbox:checked + div {
-  padding-left: 33px;
-  width: 46px;
-  background-position: 0 0;
-}
-input[type="checkbox"].default_checkbox + div:before {
-  content: 'On';
-  float: left;
-  width: 13px;
-  height: 13px;
-  margin: -1px;
-  border: 1px solid rgba(55, 72, 88, 0.35);
-  border-radius: inherit;
-  background: white;
-  background-image: linear-gradient(#8fa1b4, transparent);
-  box-shadow: 0 0.1em 0.1em 0.1em rgba(255, 255, 255, 0.8) inset, 0 0 0.5em rgba(55, 72, 88, 0.3);
-  color: white;
-  text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.3);
-  text-indent: -2.5em;
-}
-input[type="checkbox"].default_checkbox:active + div:before {
-  background-color: #eee;
-}
-input[type="checkbox"].default_checkbox + div:before,
-input[type="checkbox"].default_checkbox + div:after {
-  font-size: 9px;
-  line-height: 12px;
-  font-weight: bold;
-  text-transform: uppercase;
-}
-input[type="checkbox"].default_checkbox + div:after {
-  content: 'Off';
-  float: left;
-  text-indent: .5em;
-  color: #4b6277;
-  text-shadow: none;
-}
-/* Draggable */
-div.action_button.dragging_helper {
-  width: 42px;
-  height: 24px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 2px 10px;
-  background-image: url('/static/img/design/blank.png') !important;
-  background-color: #FFF;
-  border-radius: 2px;
-  box-shadow: 0 1px 4px #646464;
-  color: #69bfee;
-  cursor: pointer;
-  opacity: 0.8;
-  text-decoration: none;
-  z-index: 50;
-}
-a.dragging_helper {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  background-image: url('/static/img/design/blank.png') !important;
-  background-color: #FFF;
-  border-radius: 2px;
-  box-shadow: 1px 1px 5px #000;
-  color: #69bfee;
-  cursor: pointer;
-  opacity: 0.5;
-  padding: 10px 30px;
-  text-decoration: none;
-  z-index: 50;
-}
-.dialog_message_form textarea {
-  min-height: 150px;
-}
-/*************
-* header css *
-**************/
-.arrow_box {
-  position: relative;
-  background: white;
-}
-.arrow_box:after,
-.arrow_box:before {
-  bottom: 100%;
-  left: 50%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-}
-.arrow_box:after {
-  border-color: rgba(0, 0, 0, 0);
-  border-bottom-color: white;
-  border-width: 5px;
-  margin-left: -4px;
-}
-.arrow_box:before {
-  border-color: rgba(0, 0, 0, 0);
-  border-bottom-color: #bac7d4;
-  border-width: 6px;
-  margin-left: -5px;
-}
-.headerbar_top {
-  width: 100%;
-  height: 50px;
-  background: white;
-  border-bottom: solid 1px #bac7d4;
-}
-.headerbar_top > header {
-  margin: 21px 0 0 65px;
-  font-weight: bold;
-  float: left;
-  position: relative;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  color: #415568;
-}
-.headerbar_top > header:hover .page_title {
-  position: absolute;
-  overflow: visible;
-  white-space: normal;
-  display: block;
-  margin-left: 21px;
-  z-index: 999;
-  background: white;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-}
-.headerbar_top h1 {
-  font-size: 14px;
-  font-weight: normal;
-  margin: 0;
-}
-.headerbar_top > nav {
-  float: right;
-  height: 50px;
-}
-.headerbar_top a {
-  color: inherit;
-  text-decoration: none;
-  cursor: pointer;
-}
-.page_title {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  display: block;
-  overflow: hidden;
-  padding: 0;
-  background: white;
-  margin-left: 0;
-}
-.page_title a {
-  white-space: nowrap;
-}
-.nav_top {
-  float: left;
-  margin: 0 100px 0 10px;
-}
-.nav_top > ul {
-  margin: 0;
-  padding: 0;
-}
-.nav_top > ul > li {
-  width: 72px;
-  height: 49px;
-  margin-left: -1px;
-  list-style-type: none;
-  float: left;
-  position: relative;
-  -webkit-transition: all 0.2s ease;
-  -moz-transition: all 0.2s ease;
-  -o-transition: all 0.2s ease;
-  transition: all 0.2s ease;
-}
-.header_btn {
-  width: 100%;
-  height: 100%;
-  color: #4b6277;
-  padding: 0;
-  text-align: center;
-  font-size: 10px;
-  position: relative;
-  cursor: pointer;
-  background: transparent;
-  border-left: solid 1px transparent;
-  border-right: solid 1px transparent;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-  -webkit-transition: all 0.2s ease;
-  -moz-transition: all 0.2s ease;
-  -o-transition: all 0.2s ease;
-  transition: all 0.2s ease;
-}
-.header_btn span {
-  margin-left: auto;
-  margin-right: auto;
-  margin-top: 2px;
-  display: block;
-  float: none;
-}
-.header_btn p {
-  margin: 7px 0;
-}
-.header_btn:hover {
-  background: #f3f5f7;
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  border-left: solid 1px #cad4de;
-  border-right: solid 1px #cad4de;
-  padding-top: 0;
-}
-.header_btn:active {
-  background: #d9e1e8;
-  padding-top: 0;
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-}
-.nav_top_active {
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  background: #e0e6eb !important;
-  border-left: solid 1px #cad4de !important;
-  border-right: solid 1px #cad4de !important;
-}
-.manage_hover:hover .header_btn {
-  background: #f3f5f7;
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  border-left: solid 1px #bac7d4;
-  border-right: solid 1px #bac7d4;
-  padding-top: 0px;
-}
-.manage_hover:active .header_btn {
-  background: #d9e1e8;
-  padding-top: 0px;
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-}
-.manage_dropdown {
-  position: absolute;
-  top: 49px;
-  left: 0;
-  font-size: 13px;
-  z-index: 999;
-}
-.manage_dropdown li {
-  width: 120px;
-}
-.manage_dropdown > span {
-  position: absolute;
-  top: -11px;
-  left: 25px;
-}
-.header_top_dropdown {
-  background: white;
-  display: none;
-  border: solid 1px #bac7d4;
-  border-right: solid 1px #bac7d4;
-  border-bottom: solid 1px #bac7d4;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  font-size: 13px;
-}
-.header_top_dropdown > ul {
-  margin: 0;
-  padding: 0;
-}
-.header_top_dropdown > ul li {
-  list-style-type: none;
-}
-.header_top_dropdown > ul {
-  padding: 12px 0 12px 0;
-}
-.header_top_dropdown > ul > li {
-  display: block;
-  text-align: left;
-  cursor: pointer;
-}
-.header_top_dropdown > ul > li > a {
-  padding: 8px 0 8px 12px;
-  display: block;
-}
-.header_top_dropdown > ul > li:hover {
-  background: #ecf0f3;
-}
-.bread_arrow {
-  font-size: 11px;
-}
-.options_top {
-  float: right;
-  margin: 10px 0 0 10px;
-  position: relative;
-}
-.options_top > ul {
-  margin: 0;
-  padding: 0;
-}
-.options_top > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-.options_top > ul > li {
-  width: 40px;
-  height: 50px;
-  margin-right: 15px;
-  display: block;
-  float: left;
-  font-size: 10px;
-  position: relative;
-}
-.options_top > ul > li:first-child > span {
-  margin-left: 10px;
-}
-.signout_wrap {
-  position: relative;
-  display: block;
-  width: 40px;
-  height: 32px;
-}
-.notes_count {
-  padding: 2px 2px 1px 2px;
-  line-height: 10px;
-  color: white;
-  background: #22a6ee;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-  position: absolute;
-  text-align: right;
-  left: 20px;
-  top: 0px;
-}
-.avatar {
-  border-radius: 50%;
-  width: 28px;
-  height: 28px;
-  background: #cad4de;
-  margin-top: -3px;
-  float: left;
-  -webkit-box-shadow: 0px 1px 2px rgba(55, 72, 88, 0.6);
-  -moz-box-shadow: 0px 1px 2px rgba(55, 72, 88, 0.6);
-  box-shadow: 0px 1px 2px rgba(55, 72, 88, 0.6);
-}
-.avatar span {
-  display: block;
-  float: none;
-}
-.avatar img {
-  border-radius: 50%;
-  width: 28px;
-  height: 28px;
-  position: absolute;
-}
-.avatar .avatar-img {
-  margin: 3px 0 0 4px;
-}
-.avatar .arrow_down_s-img {
-  position: absolute;
-  top: 12px;
-  right: 2px;
-}
-.dropdown_button {
-  cursor: pointer;
-}
-.search_dropdown {
-  width: 250px;
-  height: 51px;
-  padding: 10px;
-  position: absolute;
-  top: 39px;
-  left: -111px;
-  z-index: 999;
-}
-.search_dropdown > span {
-  position: absolute;
-  top: -11px;
-  left: 114px;
-}
-.search_dropdown input {
-  height: 30px;
-  width: 100%;
-  font-size: 14px;
-  color: #4b6277;
-  padding-left: 4px;
-  display: block;
-  margin: auto;
-  border: solid 1px #bac7d4;
-}
-.search_dropdown button {
-  position: absolute;
-  top: 10px;
-  right: 10px;
-  padding: 7px;
-  height: 30px;
-}
-.bell_dropdown {
-  position: absolute;
-  top: 39px;
-  left: -166px;
-  font-size: 12px;
-  line-height: 1.4;
-  z-index: 99;
-  max-height: 530px;
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-.bell_dropdown > span {
-  position: absolute;
-  top: -11px;
-  left: 169px;
-}
-.bell_dropdown li {
-  width: 250px;
-  padding: 8px 0 8px 8px;
-}
-.bell_dropdown li span {
-  color: #69bfee;
-  font-weight: bold;
-}
-.bell_dropdown li article {
-  width: 200px;
-  display: inline-block;
-  margin-left: 10px;
-}
-.bell_dropdown li p {
-  color: #9baec0;
-  margin: 5px 0;
-}
-.bell_dropdown li:last-child {
-  text-align: center;
-  margin: 14px 0 -12px 0 !important;
-  background: #d9e1e8;
-}
-.profile_dropdown {
-  position: absolute;
-  top: 39px;
-  left: -70px;
-  font-size: 13px;
-  z-index: 999;
-  width: 120px;
-}
-.profile_dropdown > span {
-  position: absolute;
-  top: -11px;
-  left: 77px;
-}
-.profile_dropdown ul > li {
-  padding-left: 10px;
-}
-.profile_dropdown ul > li a {
-  width: 100%;
-}
-.med_blue_btn {
-  padding: 8px 17px 8px 17px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  color: white;
-  opacity: 1;
-  background: #3277b8;
-  font-size: 16px;
-  -webkit-transition: all 0.1s linear;
-  -moz-transition: all 0.1s linear;
-  -o-transition: all 0.1s linear;
-  transition: all 0.1s linear;
-  -webkit-backface-visibility: hidden;
-}
-.med_blue_btn:hover,
-.med_blue_btn:focus {
-  background: #2a6398;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  color: white;
-  text-decoration: none;
-}
-.med_blue_btn:active {
-  background: #245684;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.4);
-  -moz-box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.4);
-  box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.4);
-}
-.orange_btn {
-  padding: 4px 17px 5px 17px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  color: #ffffff;
-  opacity: 1;
-  background: #e37900;
-  font-size: 20px;
-  -webkit-transition: all 0.1s linear;
-  -moz-transition: all 0.1s linear;
-  -o-transition: all 0.1s linear;
-  transition: all 0.1s linear;
-  -webkit-backface-visibility: hidden;
-}
-.upgrade_box {
-  position: relative;
-  background: #ffffff;
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 6px;
-}
-.upgrade_btn {
-  color: white;
-  background: #ff8617;
-  border: 0;
-  opacity: 1;
-  position: absolute;
-  top: 44px;
-  right: 40px;
-  border-radius: 3px;
-  color: white !important;
-  text-decoration: none;
-  padding: 3px 16px;
-  font-weight: bold;
-  height: 22px;
-  margin-top: 3px;
-  font-size: 14px;
-  display: block;
-}
-.upgrade_btn:hover {
-  background: #ffa14a;
-  outline: 0;
-}
-.upgrade_btn:active {
-  background: #ff8617;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.3);
-  box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.3);
-}
-.upgrade_box:after {
-  left: 100%;
-  top: 50%;
-  border: solid rgba(0, 0, 0, 0);
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(213, 213, 213, 0);
-  border-left-color: #ffffff;
-  border-width: 4px;
-  margin-top: -5px;
-}
-.filterbox_wrap {
-  position: relative;
-  float: left;
-  min-width: 100px;
-  width: auto;
-}
-.filterbox_wrap .filter_btn {
-  border-left: solid 1px #bac7d4;
-  border-right: solid 1px #bac7d4;
-  border-top: solid 1px #bac7d4;
-}
-.filterbox_task_wrap {
-  position: relative;
-  float: left;
-  min-width: 150px;
-}
-.filterbox_task_wrap .filter_btn {
-  border-left: solid 1px #bac7d4;
-  border-right: solid 1px #bac7d4;
-  border-top: solid 1px #bac7d4;
-}
-.filter_box_dropdown {
-  width: auto;
-  min-width: 100px;
-  padding: 10px 0;
-  float: left;
-  border: solid 1px #cad4de;
-  background: white;
-  font-size: 12px;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-}
-.filter_box_dropdown > ul {
-  margin: 0;
-  padding: 0;
-}
-.filter_box_dropdown li {
-  list-style-type: none;
-  padding: 8px 8px 8px 8px;
-  cursor: pointer;
-}
-.filter_box_dropdown li:hover {
-  background: #ecf0f3;
-}
-.notebook_notification {
-  font-size: 16px;
-  margin: 40px auto;
-  width: 390px;
-  padding: 20px;
-  background: #ffffff;
-  -webkit-box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-}
-/*********************
-* overwrite jqueryUI *
-*********************/
-.ui-datepicker {
-  -webkit-box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.ui-widget-header {
-  border: 0 /*{borderColorHeader}*/;
-  background: #d9e1e8;
-  color: #4b6277;
-  /*{fcHeader}*/
-  font-weight: normal;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
-  border: 0;
-  position: absolute;
-  top: 0;
-  width: 1.8em;
-  height: 100%;
-}
-.ui-datepicker .ui-datepicker-prev:hover,
-.ui-datepicker .ui-datepicker-next:hover {
-  border: 0;
-  background: #bac7d4;
-}
-.ui-datepicker th {
-  padding: .7em .3em;
-  text-align: center;
-  font-weight: normal;
-  color: #4b6277;
-  border: 0;
-}
-.ui-widget-content {
-  border: 1px solid #9baec0;
-  background: #ecf0f3;
-  color: #4b6277;
-}
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
-  border: 1px solid #cad4de;
-  background: white;
-  font-weight: normal /*{fwDefault}*/;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
-  border: 1px solid #bac7d4 /*{borderColorHover}*/;
-  background: #e4eef7;
-  font-weight: normal /*{fwDefault}*/;
-  color: #4b6277;
-  /*{fcHover}*/
-}
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
-  color: #4b6277;
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
-  background-image: none;
-}
-.ui-widget-header .ui-icon {
-  background-image: none;
-}
-.ui-icon {
-  overflow: visible !important;
-}
-.ui-icon-circle-triangle-w {
-  position: relative;
-  background: white;
-  display: inline-block;
-  height: 0;
-  width: 0;
-}
-.ui-icon-circle-triangle-w:after {
-  right: 100%;
-  top: 50%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(136, 183, 213, 0);
-  border-right-color: #4b6277;
-  border-width: 8px;
-  margin-top: -7px;
-}
-.ui-icon-circle-triangle-e {
-  position: relative;
-  background: white;
-  display: inline-block;
-  height: 0;
-  width: 0;
-}
-.ui-icon-circle-triangle-e:after {
-  left: 100%;
-  top: 50%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(136, 183, 213, 0);
-  border-left-color: #4b6277;
-  border-width: 8px;
-  margin-top: -7px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
-  display: block;
-  position: absolute;
-  left: 50%;
-  margin-left: -2px;
-  top: 50%;
-  margin-top: 0px;
-}
-.ui-tooltip {
-  padding: 5px 10px;
-  background: #374858;
-  -webkit-box-shadow: 0 2px 3px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 3px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 3px rgba(55, 72, 88, 0.3);
-  font: normal 14px;
-  color: white;
-  border: 0;
-  z-index: 11;
-}
-.ui-tooltip:after {
-  bottom: 100%;
-  left: 13px;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: transparent;
-  border-bottom-color: #374858;
-  border-width: 7px;
-  margin-left: -7px;
-}
-/****************
-* media queries *
-****************/
-@media (max-width: 1750px) {
-  .headerbar_top > header {
-    width: 30%;
-  }
-}
-@media (max-width: 1160px) {
-  .group_content_block {
-    width: 100%;
-  }
-  .headerbar_top > header {
-    width: 30%;
-    margin: 19px 0 0 20px;
-  }
-  .eln_main_content_box,
-  .project_list {
-    padding: 20px 20px 20px 20px;
-    width: auto;
-  }
-  #messages_content,
-  #task_content,
-  #comments_content {
-    padding: 0 10px 0 10px;
-  }
-}
-@media (max-width: 1100px) {
-  .author_firstname,
-  .author_lastname {
-    width: 100px;
-  }
-}
-@media (max-width: 970px) {
-  .nav_top {
-    margin: 0 30px 0 10px;
-  }
-  .headerbar_top > header {
-    width: 200px;
-  }
-  .page_title {
-    margin-top: 2px;
-    font-size: 12px;
-  }
-  .author_firstname,
-  .author_lastname {
-    width: 66px;
-  }
-  .group_content_box {
-    padding: 20px;
-  }
-  .profile_block {
-    max-width: 550px;
-    width: calc(100% - 25px);
-  }
-}
-@media (max-height: 600px) {
-  .popup_dialog {
-    top: 50%;
-  }
-}
-
-/******************************
- GROUP HEADER AND NAVIGATION BAR
-*******************************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-.is_group .group-img {
-  margin-top: 1px;
-}
-.group_header {
-  background: #374858 repeat-x 0 0;
-  border-left: 1px solid #DDD;
-  border-right: 1px solid #DDD;
-  border-top: 1px solid #DDD;
-  border-radius: 10px 10px 0px 0px;
-  height: 35px;
-  line-height: 14px;
-  padding: 5px 10px;
-}
-/*.group_name{
-	color: #FFFFFF;
-    display: block;
-    font-size: 24px;
-    height: 24px;
-    line-height: 24px;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    white-space: nowrap;
-}*/
-.group_tagline {
-  color: #FFFFFF;
-  display: block;
-  font-size: 14px;
-  height: 14px;
-  line-height: 14px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.group_nav {
-  font-size: 16px;
-  background-color: #FFF;
-  margin: 0;
-}
-.group_nav a {
-  color: #5e7b97;
-  border: 1px solid #D6D4D5;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  display: inline-block;
-  position: relative;
-  width: 20%;
-  padding: 8px 0;
-  text-align: center;
-  white-space: nowrap;
-  transition: all ease 0.2s;
-}
-.group_nav a:hover {
-  background: #ededed;
-  color: #69bfee;
-  text-decoration: none;
-}
-.group_nav .active {
-  color: #69bfee;
-  text-decoration: none;
-}
-.group_first_nav {
-  border-radius: 0px 0px 0px 10px;
-}
-.group_last_nav {
-  border-radius: 0px 0px 10px 0px;
-}
-.group_main_icon {
-  color: #FFFFFF;
-  display: inline-block;
-  float: left;
-  font-size: 24px;
-  margin-top: 5px;
-}
-.group_main_title {
-  height: 35px;
-}
-.group_search_form {
-  float: right;
-  margin: 2px 10px 0 0;
-}
-.group_search_input {
-  border: 1px solid #D6D4D5;
-  border-radius: 5px;
-  font-size: 14px;
-  padding: 5px;
-}
-/******************************
- GROUP CONTENT STYLES
-*******************************/
-.group_content_box {
-  height: auto;
-  margin: 0 25px 25px 0;
-  background-color: #ffffff;
-  border-bottom: solid 1px #cad4de;
-  border-left: solid 1px #cad4de;
-  border-right: solid 1px #cad4de;
-  position: relative;
-  padding: 20px 20px 20px 135px;
-}
-.group_content_block {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  display: block;
-  width: 900px;
-  padding-left: 31px;
-}
-.group_content_block .tree_my_eln_projects {
-  max-width: 500px;
-}
-#group_activities {
-  float: left;
-}
-#group_about {
-  float: right;
-  width: 400px;
-  margin-right: 35px;
-}
-.group_content_header {
-  color: #7b95ad;
-  font-size: 12px;
-  white-space: nowrap;
-  padding: 0 0 2px 4px;
-  width: 100%;
-  border-bottom: 1px solid #bac7d4;
-  display: block;
-  margin-bottom: 10px;
-}
-.group_description {
-  padding-left: 4px;
-}
-.group_content_subheader {
-  display: block;
-  font-size: 18px;
-  height: 18px;
-  padding: 5px 0px 10px 0;
-  white-space: nowrap;
-}
-.group_header_add_search {
-  border-bottom: 1px solid #D6D4D5;
-  display: block;
-  font-size: 24px;
-  height: 35px;
-  padding: 10px 0px 5px 15px;
-}
-.group_header_add_search button {
-  margin-right: 10px;
-}
-.group_content {
-  display: block;
-  font-size: 12px;
-  line-height: 18px;
-  margin-bottom: 20px;
-}
-/******************************
- INDEX
-*******************************/
-#group_invitations {
-  display: none;
-  font-size: 12px;
-  line-height: 1.4;
-  left: 0;
-  top: 25px;
-  padding: 10px;
-  position: absolute;
-  width: 230px;
-  z-index: 10;
-}
-#group_invitations span {
-  color: #69bfee;
-  font-weight: bold;
-}
-.group_invitations_options {
-  height: 20px;
-  padding: 10px 0;
-}
-.group_invitation_line {
-  padding: 6px 0 6px 0;
-}
-/* .group_invitation_line:last-of-type{ */
-/* 	border-bottom: 0 !important; */
-/* } */
-.invitation_count {
-  top: -2px;
-  padding: 1px 2px 1px 2px;
-  line-height: 1;
-  color: white;
-  background: #22a6ee;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-  position: relative;
-  text-align: right;
-}
-#group_show_invite {
-  font-size: 12px;
-  display: block;
-  position: relative;
-}
-.group_invite_wrap {
-  display: block;
-  float: left;
-  padding: 6px 0 0 0;
-  position: relative;
-}
-#group_show_invite:hover {
-  cursor: pointer;
-}
-#group_boxes {
-  margin-top: 10px;
-}
-#group_boxes label {
-  cursor: pointer;
-}
-#group_row_features,
-#group_mini_features,
-#group_maxi_features {
-  display: inline-block;
-  border: 1px solid transparent;
-}
-#group_row_features div,
-#group_mini_features div,
-#group_maxi_features div {
-  padding: 5px;
-  height: 20px;
-  border: 1px solid #DDD;
-  box-sizing: box-border;
-  line-height: 20px;
-  margin: 0;
-}
-#group_mini_features div,
-#group_maxi_features div {
-  text-align: center;
-}
-#group_mini_features.active,
-#group_maxi_features.active {
-  color: #69bfee;
-  border: 1px solid #69bfee;
-}
-tr.pair_row {
-  background: #DDD;
-}
-.group_join {
-  float: right;
-}
-button.group_join {
-  margin: 0;
-}
-button.group_join:active {
-  margin: 0;
-}
-a.group_join {
-  margin-right: 10px;
-  margin-top: 8px;
-}
-td.group_features {
-  padding: 10px;
-  text-align: center;
-}
-#group_table {
-  width: 100%;
-}
-#group_table td.features {
-  padding: 10px;
-}
-#group_table td.feature_header {
-  background-color: #374858;
-  color: #FFF;
-  height: 25px;
-  text-align: center;
-}
-#group_table td.mini_feature,
-#group_table td.maxi_feature {
-  height: 20px;
-  text-align: center;
-  width: 100px;
-}
-#group_table td.cross {
-  color: #ad1c28;
-}
-#group_table td.check {
-  color: #bdca70;
-}
-#group_table td.mini_feature button,
-#group_table td.maxi_feature button {
-  float: none;
-  text-align: center;
-}
-/******************************
- OVERVIEW
-*******************************/
-.group_feed_date {
-  padding-right: 4px;
-  font-size: 11px;
-  text-align: right;
-  float: right;
-}
-.group_feed {
-  display: table;
-  margin-bottom: 15px;
-  padding: 0 0 6px 4px;
-  width: 100%;
-}
-.feed_line {
-  border-bottom: 1px solid #d9e1e8;
-}
-.group_feed_pic {
-  display: block;
-  float: left;
-  margin-right: 10px;
-  width: auto;
-}
-.group_feed_pic img {
-  border: 1px solid #bac7d4;
-}
-.group_feed_text {
-  display: inline-block;
-  vertical-align: top;
-}
-.group_feed_text b {
-  color: #3babe9;
-}
-.group_stats_row {
-  display: table-row;
-}
-.group_stats_elem {
-  display: table-cell;
-  font-weight: bold;
-  width: 10em;
-}
-.group_stats_num {
-  display: table-cell;
-  text-align: left;
-  width: 5em;
-}
-/******************************
- MEMBERS
-*******************************/
-#group_members div.content_block {
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-#group_members a.group_treeline {
-  background: url("/static/img/design/t.png") repeat-y;
-  color: #4b6277;
-  cursor: pointer;
-  display: block;
-  height: 26px;
-  padding-left: 30px;
-  white-space: nowrap;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-}
-#group_members a.group_treeline:hover {
-  background-color: #ecf0f3 !important;
-  text-decoration: none;
-}
-#group_members a.group_treeline span.name {
-  display: inline-block;
-  height: 26px;
-  line-height: 1.5;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  width: 100%;
-}
-.tree_button button {
-  padding: 4px;
-  background: rgba(0, 0, 0, 0);
-  cursor: pointer;
-}
-/* #group_members .group_treeline:hover span.icon-user, */
-/* #group_members .group_treeline:hover span.icon-group, */
-/* #group_members .group_treeline:hover span.name{ */
-/* 	color: #69bfee; */
-/* } */
-/* #group_members a.group_treeline div.more_options_panel{ */
-/* 	margin-top: -5px; */
-/* } */
-.subgroup .menu_arrow-img {
-  position: absolute;
-  top: -11px !important;
-  left: 66px !important;
-}
-#group_members .more_options_panel .menu_arrow-img {
-  position: absolute;
-  top: -11px;
-  left: 100px;
-}
-#group_members a.group_treeline:last-of-type {
-  background: url("/static/img/design/l.png") no-repeat;
-  margin-top: -1px;
-}
-#group_members a.group_treeline div.tree_button {
-  float: right;
-  display: none;
-}
-#group_members a.group_treeline:hover div.tree_button {
-  display: inline;
-}
-#group_members div.group_treeline_children {
-  background: url("/static/img/design/straight.png") repeat-y;
-  padding-left: 34px;
-  margin-left: 0px;
-  box-sizing: border-box;
-}
-#group_members div.tree_my_eln_projects > div.group_treeline_children {
-  padding-left: 14px;
-}
-#group_members div.group_treeline_children:last-child {
-  background: url("/static/img/design/blank.png") repeat-y;
-}
-#group_members a.GROUP {
-  background-image: url("/static/img/design/blank.png") !important;
-  background-repeat: repeat-y !important;
-  font-size: 14px;
-  padding: 2px 8px 2px 4px;
-}
-#group_members a.GROUP span.name {
-  font-size: 14px;
-  height: 20px;
-  line-height: 1.5;
-}
-#group_members a.SUBGROUP {
-  padding: 2px 8px 2px 25px;
-}
-#group_members a.SUBGROUP span.icon-group {
-  font-size: 15px;
-  text-decoration: none;
-  line-height: 1.5;
-}
-#group_members a.SUBGROUP span.icon-group:before {
-  letter-spacing: 0.1em !important;
-}
-#group_members a.SUBGROUP span.name {
-  font-style: italic;
-}
-#group_members a.subgroup_selected {
-  background-color: #8ad97d !important;
-}
-#group_members a.MEMBER {
-  padding: 2px 8px 2px 25px;
-}
-#group_members a.MEMBER span.icon-user {
-  font-size: 14px;
-  line-height: 1;
-  padding-right: 2px;
-  text-decoration: none;
-}
-#group_members .droppable_group {
-  background-color: #e5ffe1 !important;
-}
-#group_members .hover_droppable_group {
-  background-color: #dde7ff !important;
-}
-/******************************
- PROJECTS
-*******************************/
-.group_share_block {
-  display: none;
-}
-.group_share_member_tree {
-  background: white;
-  box-sizing: border-box;
-  max-height: 150px;
-  min-height: 70px;
-  overflow: auto;
-  padding: 10px;
-  margin-top: 10px;
-}
-.group_share_member_tree input[type=checkbox] {
-  vertical-align: middle;
-  position: relative;
-  bottom: 1px;
-}
-.group_share_member_tree a {
-  color: #374858;
-  line-height: 25px;
-  text-decoration: none;
-}
-.group_share_member_tree div.group_treeline_children {
-  padding-left: 15px;
-  margin-left: 0px;
-  box-sizing: border-box;
-}
-/******************************
- SETTINGS
-*******************************/
-.group_settings {
-  float: right;
-}
-.group_settings_block {
-  background-color: white;
-  border: 1px solid #DDDDDD;
-  border-radius: 10px;
-  padding: 10px;
-  width: 595px;
-}
-.group_settings_block_key {
-  float: left;
-  font-size: 14px;
-  font-weight: bold;
-  line-height: 26px;
-  width: 200px;
-}
-.group_settings_block_value {
-  line-height: 26px;
-  font-size: 14px;
-  margin-left: 250px;
-}
-.group_settings_block_value input[type="text"],
-.group_settings_block_value textarea {
-  width: 330px;
-}
-.group_settings_header h2 {
-  float: left;
-  margin: 5px 0 10px;
-}
-@media (max-width: 1200px) {
-  #group_about {
-    float: none;
-    margin-bottom: 60px;
-  }
-}
-
-/**************************/
-/* i18n             START */
-/**************************/
-
-#i18n_translation_panel {
-	border: 1px solid black;
-	min-height: 150px;
-	background: #DDD;
-	position: fixed;
-	bottom: 0;
-	left: 75%;
-	right: 50px;
-	z-index: 10000;
-	font-family: 'Arial';
-	padding: 10px;
-}
-
-#i18n_translation_save_button {
-	width: 100%;
-	outline: none;
-	border: none;
-	color: #ffffff;
-	background: #69bfee;
-	height: 40px;
-	text-transform: uppercase;
-	cursor: pointer;
-	font-weight: bold;
-	transition: all ease-in 0.2s;
-}
-
-#i18n_translation_save_button:hover {
-	background:#374858;
-}
-
-#i18n_translation_save_button:active {
-	opacity: 0.8;
-	background:#374858;
-}
-
-#i18n_translation_english_text {
-	padding: 15px;
-	display: block
-}
-
-#i18n_translation_textarea {
-	padding: 10px;
-	width: 100%;
-	box-sizing: border-box;
-	margin-bottom: 10px;
-	font-size: 14px;
-}
-
-.i18n_highlight.i18n_translation_untranslated {
-	color: #FF3D2B !important;
-}
-
-.i18n_highlight.i18n_translation_translated {
-	color: #00AA00 !important;
-}
-
-/**************************/
-/* i18n               END */
-/**************************/@font-face {
-	font-family: 'LabFolderWebFont';
-	src:url('../font/icons11.eot');
-	src:url('../font/icons11.eot?#iefix') format('embedded-opentype'),
-		url('../font/icons11.svg#LabFolderWebFont') format('svg'),
-		url('../font/icons11.woff') format('woff'),
-		url('../font/icons11.ttf') format('truetype');
-	font-weight: normal;
-	font-style: normal;
-}
-
-/* Use the following CSS code if you want to use data attributes for inserting your icons */
-[data-icon]:before {
-	font-family: 'LabFolderWebFont';
-	content: attr(data-icon);
-	speak: none;
-	font-weight: normal;
-	-webkit-font-smoothing: antialiased;
-}
-
-/* Use the following CSS code if you want to have a class per icon */
-/*
-Instead of a list of all class selectors,
-you can use the generic selector below, but it's slower:
-[class*="icon-"] {
-*/
-
-.icon-date, .icon-stop_contract, .icon-change_plan, .icon-update, .icon-add_notebook, .icon-sign, .icon-witness, .icon-checkbox, .icon-alert, .icon-speech, .icon-file, .icon-arrowhead, .icon-undo, .icon-text, .icon-selection, .icon-redo, .icon-rectangle, .icon-pencil, .icon-line, .icon-circle, .icon-asterisk, .icon-arrow, .icon-zoom_out, .icon-zoom_in, .icon-arrow_right, .icon-add_template, .icon-folder_selected, .icon-folder, .icon-add_group_notebook, .icon-add_group_folder, .icon-feedback, .icon-triangle_right, .icon-triangle_left, .icon-experiment3, .icon-add_folder, .icon-add_file, .icon-experiment2, .icon-triangle_down, .icon-sync, .icon-experiment1, .icon-edit_image, .icon-sign, .icon-search, .icon-edit, .icon-down_pdf, .icon-save, .icon-rename_proj, .icon-double_sign, .icon-double_arrow_right, .icon-remove, .icon-cross, .icon-copy, .icon-publish_to_world, .icon-publish_to_group, .icon-conf_drop, .icon-conf, .icon-print, .icon-notebook, .icon-check, .icon-back_up, .icon-template, .icon-invite_user, .icon-inventory, .icon-arrow_down, .icon-add_user, .icon-group_proj, .icon-group_folder_selected, .icon-add_text, .icon-add_proj, .icon-group_folder, .icon-group, .icon-add_notebook, .icon-forward, .icon-user_change, .icon-overview, .icon-user, .icon-add_img, .icon-drag_handle, .icon-add_protocol, .icon-save2, .icon-add_template2, .icon-add_entry, .icon-circle_arrow_down, .icon-arrow_up, .icon-expand, .icon-placeholder, .icon-dashboard, .icon-information  {
-	font-family: 'LabFolderWebFont';
-	speak: none;
-	font-style: normal;
-	font-weight: normal;
-	font-variant: normal;
-	text-transform: none;
-	line-height: 1;
-	-webkit-font-smoothing: antialiased;
-}
-
-
-
-.icon-zoom_out:before {
-	content: "\e600";
-}
-.icon-zoom_in:before {
-	content: "\e601";
-}
-.icon-user_change:before {
-	content: "\e602";
-}
-.icon-user:before {
-	content: "\e603";
-}
-.icon-untitled12:before {
-	content: "\e604";
-}
-.icon-undo:before {
-	content: "\e605";
-}
-.icon-triangle_right:before {
-	content: "\e606";
-}
-.icon-triangle_left:before {
-	content: "\e607";
-}
-.icon-triangle_down:before {
-	content: "\e608";
-}
-.icon-time:before {
-	content: "\e609";
-}
-.icon-text:before {
-	content: "\e60a";
-}
-.icon-template:before {
-	content: "\e60b";
-}
-.icon-tell:before {
-	content: "\e60c";
-}
-.icon-talk:before {
-	content: "\e60d";
-}
-.icon-sync:before {
-	content: "\e60e";
-}
-.icon-speech:before {
-	content: "\e60f";
-}
-.icon-selection:before {
-	content: "\e610";
-}
-.icon-search:before {
-	content: "\e611";
-}
-.icon-save2:before {
-	content: "\e612";
-}
-.icon-save:before {
-	content: "\e613";
-}
-.icon-rename_proj:before {
-	content: "\e614";
-}
-.icon-remove:before {
-	content: "\e615";
-}
-.icon-redo:before {
-	content: "\e616";
-}
-.icon-rectangle:before {
-	content: "\e617";
-}
-.icon-raster:before {
-	content: "\e618";
-}
-.icon-publish_to_world:before {
-	content: "\e619";
-}
-.icon-publish_to_group:before {
-	content: "\e61a";
-}
-.icon-print:before {
-	content: "\e61b";
-}
-.icon-placeholder:before {
-	content: "\e61c";
-}
-.icon-pencil:before {
-	content: "\e61d";
-}
-.icon-overview:before {
-	content: "\e61e";
-}
-.icon-outbox:before {
-	content: "\e61f";
-}
-.icon-notebook:before {
-	content: "\e620";
-}
-.icon-move_templ:before {
-	content: "\e621";
-}
-.icon-move_folder:before {
-	content: "\e622";
-}
-.icon-move_entr:before {
-	content: "\e623";
-}
-.icon-man:before {
-	content: "\e624";
-}
-.icon-lock_pen:before {
-	content: "\e625";
-}
-.icon-line:before {
-	content: "\e626";
-}
-.icon-invite_user:before {
-	content: "\e627";
-}
-.icon-inventory:before {
-	content: "\e628";
-}
-.icon-information:before {
-	content: "\e629";
-}
-.icon-inbox:before {
-	content: "\e62a";
-}
-.icon-group_proj:before {
-	content: "\e62b";
-}
-.icon-group_folder_selected:before {
-	content: "\e62c";
-}
-.icon-group_folder:before {
-	content: "\e62d";
-}
-.icon-group:before {
-	content: "\e62e";
-}
-.icon-forward:before {
-	content: "\e62f";
-}
-.icon-folder_selected:before {
-	content: "\e630";
-}
-.icon-folder:before {
-	content: "\e631";
-}
-.icon-file:before {
-	content: "\e632";
-}
-.icon-feedback:before {
-	content: "\e633";
-}
-.icon-eye:before {
-	content: "\e634";
-}
-.icon-experiment3:before {
-	content: "\e635";
-}
-.icon-experiment2:before {
-	content: "\e636";
-}
-.icon-experiment1:before {
-	content: "\e637";
-}
-.icon-expand:before {
-	content: "\e638";
-}
-.icon-edit_image:before {
-	content: "\e639";
-}
-.icon-edit:before {
-	content: "\e63a";
-}
-.icon-drag_handle:before {
-	content: "\e63b";
-}
-.icon-down_pdf:before {
-	content: "\e63c";
-}
-.icon-double_sign:before {
-	content: "\e63d";
-}
-.icon-double_arrow_right:before {
-	content: "\e63e";
-}
-.icon-delete_text:before {
-	content: "\e63f";
-}
-.icon-delete_pen:before {
-	content: "\e640";
-}
-.icon-date:before {
-	content: "\e641";
-}
-.icon-dashboard:before {
-	content: "\e642";
-}
-.icon-cross:before {
-	content: "\e643";
-}
-.icon-copy:before {
-	content: "\e644";
-}
-.icon-conf_drop:before {
-	content: "\e645";
-}
-.icon-conf:before {
-	content: "\e646";
-}
-.icon-clip:before {
-	content: "\e647";
-}
-.icon-circle_arrow_down:before {
-	content: "\e648";
-}
-.icon-circle:before {
-	content: "\e649";
-}
-.icon-checkbox:before {
-	content: "\e64a";
-}
-.icon-check:before {
-	content: "\e64b";
-}
-.icon-back_up:before {
-	content: "\e64c";
-}
-.icon-asterisk:before {
-	content: "\e64d";
-}
-.icon-arrowhead:before {
-	content: "\e64e";
-}
-.icon-arrow_up:before {
-	content: "\e64f";
-}
-.icon-arrow_right:before {
-	content: "\e650";
-}
-.icon-arrow_down:before {
-	content: "\e651";
-}
-.icon-arrow:before {
-	content: "\e652";
-}
-.icon-alert:before {
-	content: "\e653";
-}
-.icon-alarm:before {
-	content: "\e654";
-}
-.icon-add-date:before {
-	content: "\e655";
-}
-.icon-add_user:before {
-	content: "\e656";
-}
-.icon-add_text:before {
-	content: "\e657";
-}
-.icon-add_template2:before {
-	content: "\e658";
-}
-.icon-add_template:before {
-	content: "\e659";
-}
-.icon-add_speech:before {
-	content: "\e65a";
-}
-.icon-add_proj:before {
-	content: "\e65b";
-}
-.icon-add_note:before {
-	content: "\e65c";
-}
-.icon-add_label:before {
-	content: "\e65d";
-}
-.icon-add_img:before {
-	content: "\e65e";
-}
-.icon-add_folder:before {
-	content: "\e65f";
-}
-.icon-add_file:before {
-	content: "\e660";
-}
-.icon-add_entry:before {
-	content: "\e661";
-}
-.icon-add_notebook:before {
-	content: "\e662";
-}
-.icon-sign:before {
-	content: "\e663";
-}
-.icon-witness:before {
-	content: "\e664";
-}
-.icon-update:before {
-	content: "\e667";
-}
-.icon-change_plan:before {
-	content: "\e665";
-}
-.icon-stop_contract:before {
-	content: "\e666";
-}
-
-
-/*Letter spacing grouping*/
-
-
-.icon-checkbox:before {
-	letter-spacing:0.3em;
-}
-.icon-speech:before {
-	letter-spacing:0.5em;
-}
-.icon-alert:before {
-	letter-spacing:0.3em;
-}
-.icon-publish_to_world:before {
-	letter-spacing:0.5em;
-}
-.icon-publish_to_group:before {
-	letter-spacing:0.5em;
-}
-.icon-invite_user:before {
-	letter-spacing:0.5em;
-}
-.icon-inventory:before {
-	letter-spacing: 0.5em;
-}
-.icon-group_proj:before {
-	letter-spacing: 0.5em;
-}
-.icon-group_folder_selected:before {
-	letter-spacing:0.5em;
-}
-.icon-group_folder:before {
-	letter-spacing: 0.5em;
-}
-.icon-group:before {
-	letter-spacing:0.5em;
-}
-.icon-copy:before{
-	letter-spacing:0.5em;
-}
-.icon-conf_drop:before {
-	letter-spacing: 0em;
-}
-.icon-check:before {
-	letter-spacing:0.5em;
-}
-.icon-add_user:before {
-	letter-spacing:0.5em;
-}
-.icon-add_text:before {
-	letter-spacing:0.5em;
-}
-.icon-add_proj:before {
-	letter-spacing:0.5em;
-}
-.icon-add_notebook:before {
-	letter-spacing:0.5em;
-}
-.icon-add_template:before {
-	letter-spacing:0.5em;
-}
-.icon-add_img:before {
-	letter-spacing:0.5em;
-}
-.icon-add_group_proj:before {
-	letter-spacing:0.5em;
-}
-.icon-add_group_folder:before {
-	letter-spacing:0.5em;
-}
-.icon-add_folder:before {
-	letter-spacing:0.5em;
-}
-.icon-add_file:before {
-	letter-spacing:0.5em;
-}
-.icon-overview:before {
-	letter-spacing:0.5em;
-}
-.icon-add_protocol:before {
-	letter-spacing:0.5em;
-}
-.icon-add_template2:before {
-	letter-spacing:0.5em;
-}
-.icon-add_entry:before {
-	letter-spacing:0.5em;
-}
-.icon-update:before {
-	letter-spacing:0.5em;
-}
-.icon-change_plan{
-	letter-spacing:0.5em;
-}
-.icon-stop_contract{
-	letter-spacing:0.5em;
-}
-/**********************/
-/* image marker START */
-/**********************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-#image_marker_tools {
-  background: #FFF;
-  border: 0;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.3);
-  display: block;
-  height: 40px;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 30px;
-  z-index: 95;
-}
-.image_marker_btn_group {
-  display: inline-block;
-  height: 30px;
-  margin: 5px 10px 5px 10px;
-  position: relative;
-  vertical-align: middle;
-  white-space: nowrap;
-}
-#more_options_image_marker,
-#image_marker_zoom,
-#image_marker_edition {
-  float: right;
-}
-button.image_marker_button {
-  border-radius: 0;
-  background-color: #FFF;
-  border: 1px solid transparent;
-  color: #374858;
-  cursor: pointer;
-  display: inline-block;
-  font-size: 14px;
-  height: 30px;
-  line-height: 20px;
-  margin-bottom: 0;
-  margin-left: -1px;
-  padding: 4px 10px;
-  position: relative;
-  text-align: center;
-  vertical-align: middle;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-}
-button.image_marker_delete_disabled,
-button.image_marker_delete_disabled:hover {
-  color: #5e7b97 !important;
-  cursor: default !important;
-  z-index: 5;
-}
-button.image_marker_button:hover {
-  background: #f3f5f7;
-}
-button.image_marker_button_active {
-  border: 1px solid #69bfee;
-  z-index: 5;
-}
-div.image_marker_toolbar_label {
-  display: inline-block;
-  height: 30px;
-  padding: 0 5px;
-  text-align: center;
-}
-div.image_marker_options {
-  background: #FFF;
-  display: none;
-  line-height: 30px;
-  margin-top: 5px;
-  padding: 5px;
-  position: absolute;
-  z-index: 25;
-}
-#image_marker_toolbar_list,
-#image_marker_opacity_list,
-#image_marker_stroke_size_list,
-#image_marker_font_size_list {
-  margin: 0;
-  padding: 0;
-  position: relative;
-  overflow: hidden;
-}
-li.image_marker_size_options {
-  border-top: none;
-  cursor: pointer;
-  display: list-item;
-  line-height: 15px;
-  list-style: none;
-  margin: 0;
-  padding: 8px 0;
-  text-align: center;
-}
-li.image_marker_size_options:hover {
-  background: #f3f5f7;
-}
-#image_marker_size_user_input input {
-  background: #f9fafb;
-  border: 1px solid #d9e1e8;
-  height: 25px;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  margin: 0 0 5px;
-  outline: none;
-  text-align: center;
-  width: 50px;
-}
-#image_marker_size_drop_down {
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  background: none repeat scroll 0 0 #FFFFFF;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.3);
-  margin-left: -2px;
-  position: absolute;
-  width: 60px;
-  z-index: 1010;
-}
-#image_marker_stroke_color_box {
-  background: #F00;
-  border: 1px solid #AAA;
-  display: inline-block;
-  height: 20px;
-  width: 20px;
-}
-#image_marker_stroke_empty_box {
-  height: 14px;
-  margin: 3px;
-  width: 14px;
-}
-div.image_marker_options.image_marker_stroke_color_options {
-  left: 65px;
-}
-#image_marker_stroke_color_list {
-  list-style-type: none;
-  width: 100px;
-  padding: 0;
-  margin: 0;
-  z-index: 99;
-}
-li.image_marker_stroke_color_options {
-  float: left;
-  margin: 0;
-}
-li.image_marker_stroke_color_options a {
-  background: url(/static/img/transparent_bg.png);
-  display: block;
-  width: 20px;
-  height: 20px;
-  text-decoration: none;
-  text-indent: -100000px;
-  outline: 0;
-  border: none;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-}
-#image_marker_fill_color_box {
-  background: url('/static/img/transparent_color.png');
-  border: 1px solid #9baec0;
-  display: inline-block;
-  height: 20px;
-  width: 20px;
-}
-div.image_marker_options.image_marker_fill_color_options {
-  left: 65px;
-}
-#image_marker_fill_color_list {
-  list-style-type: none;
-  width: 100px;
-  padding: 0;
-  margin: 0;
-  z-index: 99;
-}
-li.image_marker_fill_color_options {
-  float: left;
-  margin: 0;
-}
-li.image_marker_fill_color_options a {
-  display: block;
-  width: 20px;
-  height: 20px;
-  text-decoration: none;
-  text-indent: -100000px;
-  outline: 0;
-  border: none;
-}
-li.image_marker_opacity_options {
-  border: 1px solid #5e7b97;
-  border-top: none;
-  cursor: pointer;
-  display: list-item;
-  line-height: 15px;
-  list-style: none;
-  margin: 0;
-  padding: 5px 0;
-  text-align: center;
-}
-li.image_marker_opacity_options:first-of-type {
-  border-top: 1px solid #5e7b97;
-}
-li.image_marker_opacity_options:hover {
-  color: #69bfee;
-}
-#image_marker_opacity_drop_down {
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  background: none repeat scroll 0 0 #FFFFFF;
-  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
-  position: absolute;
-  right: 0;
-  width: 60px;
-  z-index: 1010;
-}
-li.image_marker_toolbar_options {
-  border-top: none;
-  cursor: pointer;
-  display: list-item;
-  line-height: 15px;
-  list-style: none;
-  margin: 0;
-  padding: 8px;
-  text-align: left;
-}
-li.image_marker_toolbar_options:hover {
-  background: #f9fafb;
-}
-#image_marker_toolbar_drop_down {
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  background: #e6ebef;
-  box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
-  top: 30px;
-  padding: 10px 0 10px 0;
-  position: absolute;
-  right: 0;
-  z-index: 1010;
-}
-#image_marker_toolbar_drop_down:after {
-  top: -11px;
-  right: 16px;
-  border: solid rgba(0, 0, 0, 0);
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(136, 183, 213, 0);
-  border-bottom-color: #e9edf1;
-  border-width: 7px;
-  margin-left: -3px;
-}
-.image_marker_options button.image_marker_button {
-  display: block;
-  width: 60px;
-  margin-top: -1px;
-}
-.image_marker_toolbar_label span {
-  vertical-align: middle;
-}
-/* .image_marker_settings{ */
-/* 	position:absolute; */
-/* 	background:#FFF; */
-/* 	width:100%; */
-/* 	height:50px; */
-/* 	overflow:auto; */
-/* 	display: block; */
-/* } */
-/* .image_marker_settings h4{ */
-/* 	padding: 0; */
-/* 	margin: 0; */
-/* 	text-decoration: underline; */
-/* 	margin-bottom: 10px; */
-/* } */
-#image_marker_settings button {
-  width: 55px;
-  padding-left: 0px;
-}
-#image_marker_settings span.icon-triangle_down {
-  font-size: 8px;
-  position: absolute;
-  right: 5px;
-  top: 14px;
-  vertical-align: top;
-}
-.image_marker_tools {
-  margin-bottom: 25px;
-}
-.image_marker_tools input:checked + label {
-  font-weight: bold;
-}
-.image_marker_options_name {
-  float: left;
-  width: 75px;
-  margin-bottom: 20px;
-}
-.image_marker_canvasview {
-  background: url(/static/img/transparent_bg.png);
-  position: absolute;
-  bottom: 0;
-  top: 70px;
-  left: 0;
-  right: 0;
-  overflow: auto;
-}
-.image_marker_pointer_cursor {
-  cursor: pointer;
-}
-.image_marker_text_cursor {
-  cursor: text;
-}
-#image_marker_canvaslayer {
-  position: absolute;
-  display: block;
-  z-index: 15;
-}
-#image_marker_canvastextarea {
-  background: rgba(255, 255, 255, 0.7);
-  border: none;
-  display: none;
-  font-family: sans-serif;
-  outline: none;
-  overflow: hidden;
-  position: absolute;
-  padding: 5px;
-  transition-property: width, height;
-  transition: 0.2s ease;
-  white-space: pre;
-  z-index: 2;
-}
-#image_marker_canvasframe {
-  position: relative;
-  -webkit-user-select: none;
-  /*Chrome all / Safari all*/
-  -moz-user-select: none;
-  /*Firefox all*/
-  -ms-user-select: none;
-  /*IE 10+*/
-}
-#canvas_textarea_span {
-  font-family: sans-serif;
-  line-height: normal;
-  display: none;
-  color: white;
-  position: absolute;
-  padding: 5px;
-  word-wrap: normal;
-  white-space: nowrap;
-}
-.image_marker_notification {
-  display: none;
-  position: absolute;
-  left: 50%;
-  top: 50%;
-  width: 100px;
-  margin-left: -50px;
-  padding: 10px;
-  color: #fff;
-  font-size: 32;
-  text-align: center;
-  box-shadow: 4px 4px 5px #666;
-}
-#savingBox {
-  background: #ddb933;
-  z-index: 10;
-}
-#savedBox {
-  background: #bdca70;
-  z-index: 15;
-}
-#errorBox {
-  background-color: #E66873;
-}
-.image_marker_tooltip {
-  display: none;
-  background-color: #FFF;
-  border: 1px solid #9baec0;
-  color: #5e7b97;
-  font-size: 12px;
-  padding: 5px;
-  position: absolute;
-  top: 35px;
-  z-index: 100;
-}
-.image_marker_button:hover .image_marker_tooltip {
-  display: block;
-}
-#image_marker_popup {
-  z-index: 95;
-}
-#image_marker_popup_window {
-  z-index: 97;
-}
-/********************/
-/* image marker END */
-/********************/
-
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-#import_header {
-  border-bottom: 1px solid #DDD;
-  height: 50px;
-}
-#import_header .placeholder_frame {
-  display: inline-block;
-  float: right;
-  margin: 10px 10px 10px 0;
-}
-#import_header .placeholder_frame label {
-  width: 150px;
-}
-#import_loading {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  text-align: center;
-  width: 80px;
-  height: 80px;
-  margin-top: -40px;
-  margin-left: -40px;
-}
-.import_popup_content {
-  height: 100%;
-  position: relative;
-  width: 100%;
-}
-#import_container {
-  position: absolute;
-  left: 0;
-  right: 0;
-  top: 80px;
-  bottom: 60px;
-  overflow: auto;
-}
-#import_container ul {
-  padding-right: 40px;
-}
-#import_container li {
-  display: inline-block;
-  overflow: hidden;
-  width: 100%;
-}
-#import_container li > div {
-  border: 1px solid transparent;
-  position: relative;
-  cursor: pointer;
-  margin: 0 5px;
-  padding: 10px;
-  font-size: 18px;
-}
-#import_container .active > div {
-  background: #ededed;
-  font-weight: bold;
-  border: 1px solid #69bfee;
-  color: #69bfee;
-}
-#import_container li > div:hover {
-  border: 1px solid #69bfee;
-  color: #69bfee;
-}
-#import_container div > span {
-  position: absolute;
-  left: 10px;
-}
-#import_container div.info {
-  margin-left: 30px;
-}
-.info img {
-  width: 20px;
-  margin-left: 5px;
-  position: absolute;
-}
-#import_container .info div {
-  display: block;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  overflow: hidden;
-}
-#import_container .figshare_main_search {
-  left: 50%;
-  margin: -40px 0 0 -200px;
-  position: absolute;
-  height: 80px;
-  text-align: center;
-  top: 50%;
-  width: 400px;
-}
-#import_container .figshare_main_search input {
-  width: 400px;
-}
-#import_container h3,
-#import_container .load_more {
-  font-weight: normal;
-  text-align: center;
-}
-#import_footer {
-  position: absolute;
-  bottom: 0;
-  height: 60px;
-  left: 0;
-  border-top: 1px solid #DDD;
-  right: 0;
-}
-#import_footer .popup_dialog_cancel_save_panel {
-  position: absolute;
-  bottom: 15px;
-  right: 15px;
-}
-#import_footer .select_file {
-  float: left;
-  font-size: 12px;
-}
-#import_footer .popup_dialog_error {
-  margin: 15px 150px;
-}
-#breadcrumbs {
-  position: absolute;
-  left: 0;
-  right: 200px;
-  font-size: 18px;
-  padding: 15px;
-}
-div.import_source,
-div.export_source {
-  height: 180px;
-  width: 800px;
-}
-div.import_logo,
-div.export_logo {
-  /* 	display: inline-block; */
-  float: left;
-  width: 130px;
-  height: 130px;
-}
-.upload_btn_wrap {
-  margin: 55px 20px;
-}
-.upload_btn_wrap .btn_on_grey {
-  height: 50px;
-  width: 112px;
-  padding-left: 8px;
-}
-.import_logo img,
-.export_logo img {
-  cursor: pointer;
-  border: 1px solid transparent;
-  background: #ffffff;
-  width: 100%;
-  -webkit-transition: all 0.1s ease;
-  -moz-transition: all 0.1s ease;
-  -o-transition: all 0.1s ease;
-  transition: all 0.1s ease;
-}
-.import_logo img:hover,
-.export_logo img:hover {
-  border: 1px solid #bac7d4;
-}
-.import_logo_set,
-.export_logo_set {
-  line-height: 18px;
-  text-align: center;
-}
-.dropbox_folder_view {
-  box-shadow: 0px 0px 10px #AAA;
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-  max-height: 150px;
-  overflow-x: hidden;
-  overflow-y: auto;
-  padding: 0 10px;
-  margin-top: 10px;
-}
-.dropbox_folder_view ul {
-  margin: 0;
-  padding: 10px 0;
-}
-.dropbox_folder_view .name {
-  margin-left: 10px;
-}
-.dropbox_folder_view .folder {
-  border: 1px solid transparent;
-  cursor: pointer;
-  display: inline-block;
-  padding: 2px;
-  overflow: hidden;
-  width: 100%;
-}
-.dropbox_folder_view .folder:hover {
-  border: 1px solid #69bfee;
-  color: #69bfee;
-}
-
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-#mendeley_auth {
-  background-color: #FFF;
-  border: 0;
-  border-radius: 5px;
-  height: 335px;
-  left: 50%;
-  margin: -155px 0 0 -235px;
-  outline: none;
-  overflow: hidden;
-  position: absolute;
-  top: 240px;
-  width: 470px;
-}
-.mendeley_auth_header {
-  text-align: center;
-}
-#my_popup_inner.mendeley_popup {
-  transition: all ease 1s;
-  overflow: hidden;
-}
-#mendeley_loading {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  text-align: center;
-  width: 80px;
-  height: 80px;
-  margin-top: -40px;
-  margin-left: -40px;
-}
-.reference_files_loading {
-  width: 20px;
-}
-.mendeley_library_loading {
-  position: absolute;
-  left: 41%;
-  text-align: center;
-  top: 35%;
-  font-size: 20px;
-}
-.mendeley_files_loading {
-  width: 20px;
-  margin-bottom: -4px;
-}
-.mendeley_popup_content {
-  height: 100%;
-  position: relative;
-  width: 100%;
-}
-#mendeley_library_view {
-  display: inline-block;
-  position: absolute;
-  width: 100%;
-  transition: all ease 0.5s;
-}
-.mendeley_library_progress {
-  display: none;
-  margin: 15px 0 0 15px;
-}
-.mendeley_loaded {
-  margin-left: 15px;
-}
-#mendeley_library_header .placeholder_frame {
-  float: right;
-  margin: 10px 10px 10px 0;
-}
-#mendeley_library_header .placeholder_frame label {
-  width: 150px;
-}
-#mend_lib_table {
-  width: 100%;
-}
-#mend_headers {
-  width: 100%;
-  height: 24px;
-  outline: 1px solid #DDD;
-  line-height: 24px;
-}
-#mend_headers th:hover {
-  color: #69bfee;
-}
-tr.mend_table_row_pair,
-tr.mend_table_row {
-  display: block;
-  padding: 10px 0;
-  width: 100%;
-  min-height: 18px;
-}
-tr.mend_table_row:hover {
-  color: #69bfee;
-  outline: 1px solid #69bfee;
-  cursor: pointer;
-}
-tr.mend_table_row_pair {
-  background-color: #DDD;
-}
-#mend_headers th {
-  cursor: pointer;
-  display: inline-block;
-  -webkit-user-select: none;
-  /* Chrome all / Safari all */
-  -moz-user-select: none;
-  /* Firefox all */
-  -ms-user-select: none;
-  /* IE 10+ */
-}
-td.mend_added,
-td.mend_year {
-  text-align: center;
-}
-span.highlight {
-  background-color: yellow;
-}
-td.mend_author span {
-  margin-left: 10px;
-}
-td.mend_author,
-#mend_header_author {
-  width: 25%;
-}
-td.mend_title {
-  width: 40%;
-}
-#mend_header_title {
-  width: 39%;
-}
-td.mend_year,
-#mend_header_year {
-  width: 5%;
-}
-td.mend_published,
-#mend_header_published {
-  text-align: center;
-  width: 15%;
-}
-td.mend_added,
-#mend_header_added {
-  width: 10%;
-}
-#mend_lib_table_body {
-  overflow-x: hidden;
-  overflow-y: scroll;
-  height: 600px;
-  display: block;
-}
-#mend_lib_table th,
-#mend_lib_table td {
-  display: inline-block;
-  height: 100%;
-}
-.placeholder_frame label {
-  pointer-events: none;
-}
-.epb_header_sticky div.action_button_import {
-  margin-left: 0px !important;
-}
-#mendeley_detail_view {
-  display: inline-block;
-  left: 100%;
-  position: absolute;
-  width: 100%;
-  height: 100%;
-  transition: all ease 0.5s;
-}
-#mendeley_detail_view div.popup_dialog_cancel_save_panel {
-  bottom: 25px;
-  left: 50px;
-  padding: 20px 0;
-  position: absolute;
-  right: 15px;
-}
-#mendeley_back_to_library {
-  background-color: #DDD;
-  cursor: pointer;
-  display: inline-block;
-  font-size: 30px;
-  height: 100%;
-  padding-right: 5px;
-  position: absolute;
-}
-#mendeley_back_to_library span {
-  margin-left: 5px;
-  top: calc(20%);
-  position: relative;
-}
-#mendeley_detail_page {
-  bottom: 30px;
-  display: inline-block;
-  left: 50px;
-  overflow: auto;
-  padding: 0 20px 20px 0;
-  position: absolute;
-  right: 0px;
-  top: 0px;
-}
-.reference_detail_label {
-  font-weight: bold;
-  margin-right: 5px;
-}
-button.mend_add_reference {
-  float: right !important;
-}
-div.mend_file_line {
-  height: 40px;
-  line-height: 30px;
-  padding-left: 20px;
-}
-.mend_file_line button {
-  margin-left: 20px;
-}
-.doc_details {
-  margin: 10px 0;
-}
-span.mend {
-  white-space: pre;
-}
-
-/******************************
- 	MESSAGE LIST VIEW
-*******************************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-#messages_header {
-  background: #EEE;
-  border-bottom: 1px solid #D6D4D5;
-  border-radius: 10px 10px 0 0;
-  display: block;
-  font-size: 14px;
-  height: 25px;
-  padding: 10px 0px 5px 15px;
-}
-#messages_content {
-  max-width: 900px;
-  padding-left: 10px;
-  display: block;
-  line-height: 18px;
-  overflow: auto;
-}
-.message_page_change {
-  box-sizing: border-box;
-  cursor: pointer;
-  display: inline-block;
-  width: 30px;
-  text-align: center;
-  font-size: 22px;
-  margin: 0;
-  line-height: 0.6;
-  height: 17px;
-  margin-top: 4px;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-}
-.message_pagination,
-.message_total,
-.message_shown {
-  font-size: 11px;
-}
-.message_pagination {
-  position: relative;
-  float: left;
-}
-.pagination_count {
-  float: left;
-  position: relative;
-  width: auto;
-  margin-right: 20px;
-  padding-top: 7px;
-}
-.message_page_change.disabled {
-  color: #4b6277;
-  cursor: default;
-}
-.message_empty_folder {
-  padding: 50px;
-  text-align: center;
-  font-size: 12px;
-}
-.message_list {
-  font-size: 14px;
-}
-.message_list table {
-  border-collapse: collapse;
-  outline: none;
-  table-layout: fixed;
-  width: 100%;
-  position: relative;
-}
-.message_list table td {
-  line-height: 1.2;
-  position: relative;
-}
-.column_name {
-  min-width: 100px;
-  width: 25%;
-}
-.column_delete {
-  width: 30px;
-}
-.column_date {
-  width: 89px;
-}
-.message_list_line {
-  font-size: 12px;
-  border-bottom: 1px solid #bac7d4;
-  cursor: pointer;
-  height: 34px;
-  line-height: 1.2;
-  white-space: nowrap;
-}
-.message_list_line:last-child {
-  border: none;
-}
-.message_list_line:hover .message_line_delete {
-  display: block;
-}
-.message_list_line:hover {
-  background: #ecf0f3;
-}
-.message_list_line:first-child:hover {
-  background: none;
-  cursor: default;
-}
-.unread_message {
-  font-weight: bold;
-}
-.unread_message .message_line_name:after {
-  content: "";
-  width: 4px;
-  height: 4px;
-  border-radius: 50%;
-  background: #69bfee;
-  position: absolute;
-  left: -4px;
-  top: 14px;
-}
-.message_line_name {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  vertical-align: bottom;
-  overflow: hidden;
-  padding-left: 4px;
-}
-.message_line_text {
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.message_line_content {
-  color: #9baec0;
-}
-.message_line_delete {
-  display: none;
-  text-align: center;
-}
-.message_line_delete .trash-img {
-  margin-top: -4px;
-}
-.message_line_delete:hover {
-  color: #4bb1d7;
-  text-align: center;
-}
-.message_line_date {
-  padding-right: 10px;
-  font-size: 11px;
-}
-.filter_dn_wrap {
-  width: 190px;
-  height: 200px;
-  position: absolute;
-  left: 0;
-  top: 25px;
-  z-index: 999;
-  display: none;
-}
-/******************************
- 	MESSAGE DIALOG VIEW
-*******************************/
-#dialog_message_form div.input_block {
-  margin: 0;
-  padding: 3px 5px;
-}
-.message_content {
-  margin-top: 10px !important;
-  background: white;
-  color: #4b6277;
-  min-height: 150px;
-}
-#message_select_group {
-  margin: 0 0 10px 0;
-}
-#dialog_message_form .recipient_label {
-  display: inline-block;
-  vertical-align: top;
-  width: 22px;
-  padding: 5px 0 0 0;
-  margin-bottom: 5px;
-}
-#dialog_message_form .recipient_field {
-  cursor: text;
-  display: inline-block;
-  min-height: 33px;
-  width: 700px;
-}
-#dialog_message_form .add_recipient {
-  cursor: pointer;
-  display: inline-block;
-  margin-bottom: 5px;
-  padding: 5px 0 0 0;
-  vertical-align: top;
-  width: 20px;
-}
-#dialog_message_form .add_recipient.disabled {
-  cursor: default;
-  color: #bac7d4;
-}
-#recipientIds,
-#recipientEmails {
-  display: none;
-}
-#dialog_message_form .recipient_token {
-  background: #f9fafb;
-  border: 1px solid #7b95ad;
-  border-radius: 3px;
-  cursor: move;
-  height: 25px;
-  width: auto;
-  display: inline-block;
-  padding: 5px;
-  margin: 0px 6px 0 0;
-}
-#dialog_message_form .recipient_token.selected {
-  border: 1px solid #4bb1d7 !important;
-}
-#dialog_message_form .recipient_token.invalid {
-  border: 1px solid #E66873;
-  color: #E66873;
-}
-#dialog_message_form .name_token {
-  display: inline-block;
-  line-height: 14px;
-  height: auto;
-  margin-right: 5px;
-  max-width: 250px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-#dialog_message_form .erase_token {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: top;
-}
-#dialog_message_form .message_recipient textarea,
-#recipient_width {
-  border: 1px solid rgba(0, 0, 0, 0);
-  display: inline-block;
-  font-size: 12px;
-  font-family: arial, sans-serif;
-  color: #4b6277;
-  height: 26px;
-  line-height: 12px;
-  outline: none;
-  padding: 6px;
-  resize: none;
-  vertical-align: bottom;
-  overflow: hidden;
-}
-#recipient_width {
-  display: none;
-}
-#dialog_message_form .message_content {
-  max-height: 450px;
-  overflow: auto;
-}
-#dialog_message_form .message_content textarea {
-  display: block;
-  font-size: 14px;
-  color: #4b6277;
-  height: 200px;
-  margin: 0;
-  resize: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-#dialog_message_form .placeholder_frame {
-  float: none;
-  width: 100%;
-}
-.recipient_tree {
-  display: none;
-  position: relative;
-  background: #ecf0f3;
-  box-sizing: border-box;
-  max-height: 150px;
-  overflow: auto;
-  padding: 0 10px;
-  margin-bottom: 10px;
-  font-size: 12px;
-}
-.recipient_tree a {
-  color: #4b6277;
-  line-height: 25px;
-  text-decoration: none;
-}
-.recipient_tree div.group_treeline_children {
-  padding-left: 15px;
-  margin-left: 0px;
-  box-sizing: border-box;
-}
-.recipient {
-  line-height: 24px;
-}
-.recipient:after {
-  content: ", ";
-}
-.recipient:last-child:after {
-  content: "";
-}
-.message_subject {
-  font-weight: bold;
-}
-.member_input {
-  vertical-align: middle;
-  position: relative;
-  bottom: 1px;
-}
-
-/****************
-* notebook.less *
-*****************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-#action_buttons {
-  display: inline-block;
-  float: right;
-  height: 250px;
-  left: 50%;
-  margin-left: 410px;
-  position: fixed;
-  top: 110px;
-  width: 150px;
-}
-/****************
-* button + input*
-****************/
-button {
-  border: 0;
-  font-size: 12px;
-  padding: 3px 4px;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-}
-button:focus {
-  opacity: 1;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-}
-.search_button {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-  border: solid 1px #bac7d4 !important;
-}
-.btn_on_grey {
-  color: #415568;
-  background: #f3f5f7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e0e6eb), color-stop(1, #f3f5f7));
-  background: -ms-linear-gradient(bottom, #e0e6eb, #f3f5f7);
-  background: -moz-linear-gradient(center bottom, #e0e6eb 0%, #f3f5f7 100%);
-  background: -o-linear-gradient(#f3f5f7, #e0e6eb);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f5f7', endColorstr='#e0e6eb', GradientType=0);
-  border: 1px solid #7b95ad;
-  line-height: 1.2;
-}
-.btn_on_grey:hover {
-  color: #415568;
-  background: #f3f5f7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e0e6eb), color-stop(1, #f3f5f7));
-  background: -ms-linear-gradient(bottom, #e0e6eb, #f3f5f7);
-  background: -moz-linear-gradient(center bottom, #e0e6eb 0%, #f3f5f7 100%);
-  background: -o-linear-gradient(#f3f5f7, #e0e6eb);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f5f7', endColorstr='#e0e6eb', GradientType=0);
-  outline: 0;
-  border: 1px solid #5e7b97;
-  -webkit-box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-  -moz-box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-  box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-}
-.btn_on_grey:active {
-  color: #4b6277;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #4b6277;
-  background: #cad4de;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e0e6eb), color-stop(1, #cad4de));
-  background: -ms-linear-gradient(bottom, #e0e6eb, #cad4de);
-  background: -moz-linear-gradient(center bottom, #e0e6eb 0%, #cad4de 100%);
-  background: -o-linear-gradient(#cad4de, #e0e6eb);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cad4de', endColorstr='#e0e6eb', GradientType=0);
-}
-.btn_on_white {
-  color: #4b6277;
-  background: #e6ebef;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d9e1e8), color-stop(1, #e6ebef));
-  background: -ms-linear-gradient(bottom, #d9e1e8, #e6ebef);
-  background: -moz-linear-gradient(center bottom, #d9e1e8 0%, #e6ebef 100%);
-  background: -o-linear-gradient(#e6ebef, #d9e1e8);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6ebef', endColorstr='#d9e1e8', GradientType=0);
-  border: 1px solid #cad4de;
-  opacity: 1;
-  line-height: 13px;
-}
-.btn_on_white:hover:enabled {
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  border: 1px solid #b4c2d0;
-}
-.btn_on_white:active {
-  color: #4b6277;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #c7d2dc;
-  background: #d9e1e8;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d9e1e8), color-stop(1, #d0d9e2));
-  background: -ms-linear-gradient(bottom, #d9e1e8, #d0d9e2);
-  background: -moz-linear-gradient(center bottom, #d9e1e8 0%, #d0d9e2 100%);
-  background: -o-linear-gradient(#d0d9e2, #d9e1e8);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d0d9e2', endColorstr='#d9e1e8', GradientType=0);
-}
-.btn_on_white.disabled {
-  opacity: 0.6;
-}
-.btn_on_white.disabled:active {
-  color: #4b6277;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0);
-  border: 1px solid #cad4de;
-  background: #e6ebef;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d9e1e8), color-stop(1, #e6ebef));
-  background: -ms-linear-gradient(bottom, #d9e1e8, #e6ebef);
-  background: -moz-linear-gradient(center bottom, #d9e1e8 0%, #e6ebef 100%);
-  background: -o-linear-gradient(#e6ebef, #d9e1e8);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6ebef', endColorstr='#d9e1e8', GradientType=0);
-}
-.btn_on_white.disabled:hover {
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  border: 1px solid #cad4de;
-}
-.filter_btn {
-  color: #526c84;
-  background: #ecf0f3;
-  height: 24px;
-  padding: 2px 8px;
-  font-size: 12px;
-  cursor: pointer;
-  -webkit-border-radius: 0px;
-  -moz-border-radius: 0px;
-  border-radius: 0px;
-  -webkit-transition: all 0.1s ease;
-  -moz-transition: all 0.1s ease;
-  -o-transition: all 0.1s ease;
-  transition: all 0.1s ease;
-}
-.filter_btn > span {
-  height: 4px;
-  width: 12px;
-  display: block;
-  float: left;
-  margin: 2px 0 0 8px;
-}
-.filter_btn > p {
-  margin: 0;
-  float: left;
-}
-.filter_btn:hover {
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.1);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.1);
-  background: #e0e6eb;
-  padding-top: 2px;
-}
-.filter_btn:active {
-  -webkit-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  background: #cdd7e0;
-}
-span.close-x {
-  display: block;
-  float: left;
-  margin: 0 0 0 8px;
-  display: none;
-}
-.filter_on {
-  background: #527ca3;
-  color: white;
-}
-.filter_on:hover,
-.filter_on:active {
-  background: #527ca3;
-  color: #e0e6eb;
-}
-.filter_active {
-  background: #5b96cd;
-  color: #ffffff;
-}
-.filter_active .arrow_down_s-img:after {
-  border-top-color: white;
-}
-.filter_active:hover {
-  background: #5b96cd;
-  color: #e6ebef;
-}
-.grey_link {
-  color: #4b6277;
-  background: transparent;
-  font-size: 12px;
-  padding: 0;
-  text-decoration: underline;
-  display: block;
-  cursor: pointer;
-}
-.grey_link:hover {
-  color: #415568;
-  text-decoration: underline;
-}
-.grey_link:active {
-  text-decoration: none;
-}
-.blue_link {
-  color: #1995d8;
-  background: transparent;
-  font-size: 12px;
-  padding: 0;
-  text-decoration: underline;
-  display: block;
-  cursor: pointer;
-}
-.blue_link:hover {
-  color: #69bfee;
-  text-decoration: underline;
-}
-.blue_link:active {
-  color: #1995d8;
-  text-decoration: none;
-}
-.feedback_btn {
-  color: white;
-  border: 1px solid #994097;
-  font-weight: bold;
-  font-size: 14px;
-  padding: 5px 0 5px 5px;
-  position: absolute;
-  top: 213px;
-  left: -2px;
-  z-index: 101;
-  background: #ab48a9;
-  cursor: pointer;
-}
-.feedback_btn > p {
-  margin: 0;
-}
-.feedback_btn:hover,
-.feedback_btn:focus {
-  background: #ab48a9;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #bc60ba), color-stop(1, #ab48a9));
-  background: -ms-linear-gradient(bottom, #bc60ba, #ab48a9);
-  background: -moz-linear-gradient(center bottom, #bc60ba 0%, #ab48a9 100%);
-  background: -o-linear-gradient(#ab48a9, #bc60ba);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ab48a9', endColorstr='#bc60ba', GradientType=0);
-}
-.feedback_btn:active {
-  opacity: 1;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #873986;
-  background: #ab48a9;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #c575c3), color-stop(1, #ab48a9));
-  background: -ms-linear-gradient(bottom, #c575c3, #ab48a9);
-  background: -moz-linear-gradient(center bottom, #c575c3 0%, #ab48a9 100%);
-  background: -o-linear-gradient(#ab48a9, #c575c3);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ab48a9', endColorstr='#c575c3', GradientType=0);
-}
-.feedback_btn_dialog {
-  color: white;
-  font-weight: bold;
-  font-size: 16px;
-  padding: 8px 10px;
-  background: #ab48a9;
-  cursor: pointer;
-  border: 0;
-  display: block;
-  margin: 90px auto 20px auto;
-}
-.feedback_btn_dialog > p {
-  margin: 0;
-}
-.feedback_btn_dialog:hover {
-  color: #e5c1e4;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-}
-.feedback_btn_dialog:active {
-  -webkit-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-}
-.invite_btn_dialog {
-  color: white;
-  font-weight: bold;
-  font-size: 16px;
-  padding: 8px 10px;
-  background: #93ba48;
-  cursor: pointer;
-  border: 0;
-  display: block;
-  margin: 20px auto;
-}
-.invite_btn_dialog > p {
-  margin: 0;
-}
-.invite_btn_dialog:hover {
-  color: #e0ebca;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-}
-.invite_btn_dialog:active {
-  -webkit-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-}
-.invite_btn {
-  border: 1px solid #85a940;
-  color: white;
-  font-weight: bold;
-  font-size: 14px;
-  padding: 4px 3px 5px 1px;
-  position: absolute;
-  top: 296px;
-  left: -2px;
-  z-index: 50;
-  background: #93ba48;
-  cursor: pointer;
-}
-.invite_btn > p {
-  margin: 0;
-  float: left;
-}
-.invite_btn > span {
-  margin: 2px 2px 0 4px;
-}
-.invite_btn:hover,
-.invite_btnfocus {
-  background: #93ba48;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #a0c25e), color-stop(1, #93ba48));
-  background: -ms-linear-gradient(bottom, #a0c25e, #93ba48);
-  background: -moz-linear-gradient(center bottom, #a0c25e 0%, #93ba48 100%);
-  background: -o-linear-gradient(#93ba48, #a0c25e);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#93ba48', endColorstr='#a0c25e', GradientType=0);
-}
-.invite_btn:active {
-  opacity: 1;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #769639;
-  background: #93ba48;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #adcb74), color-stop(1, #93ba48));
-  background: -ms-linear-gradient(bottom, #adcb74, #93ba48);
-  background: -moz-linear-gradient(center bottom, #adcb74 0%, #93ba48 100%);
-  background: -o-linear-gradient(#93ba48, #adcb74);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#93ba48', endColorstr='#adcb74', GradientType=0);
-}
-.checkbox_filled[type="checkbox"] {
-  display: none;
-}
-.checkbox_filled[type="checkbox"]:checked + label:after {
-  background: #69bfee;
-  border: 1px solid #5e7b97;
-}
-.checkbox_filled_bg {
-  font-size: 12px;
-  position: relative;
-  display: inline-block;
-  padding: 4px 0 4px 25px;
-  display: block;
-  width: 110px;
-  cursor: pointer;
-}
-.checkbox_filled_bg:hover {
-  background: #ecf0f3;
-}
-.checkbox_filled_bg:after {
-  content: "";
-  position: absolute;
-  display: block;
-  top: 6px;
-  left: 5px;
-  width: 10px;
-  height: 10px;
-  border: 1px solid #bac7d4;
-}
-.checkbox_button_input[type="checkbox"] {
-  display: none;
-}
-.checkbox_button_input[type="checkbox"]:checked + label {
-  background: #e0e6eb;
-}
-.checkbox_button_input[type="checkbox"]:checked + label:after {
-  background: #69bfee;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  border: 1px solid #c5e6f8;
-}
-.empty_folder {
-  font-size: 12px;
-  color: #aabbca;
-}
-.checkbox_button {
-  font-size: 12px;
-  position: relative;
-  padding: 4px 0 4px 1px;
-  display: inline-block;
-  width: 100%;
-  margin: 0;
-  cursor: pointer;
-}
-.checkbox_button:hover {
-  background: #ecf0f3;
-}
-.checkbox_button b .folder_dn-img,
-.checkbox_button b .folder_up-img {
-  margin-top: -2px;
-  margin-right: 6px;
-}
-.checkbox_button:after {
-  content: "";
-  position: absolute;
-  display: block;
-  top: 5px;
-  right: 10px;
-  width: 10px;
-  height: 10px;
-  border: 1px solid #bac7d4;
-  border-radius: 50%;
-  -webkit-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-}
-.own_name {
-  font-size: 12px;
-  position: relative;
-  padding: 4px 0 4px 1px;
-  display: inline-block;
-  width: 100%;
-  margin: 0;
-  background: #ecf0f3;
-  padding-left: 10px;
-  margin-bottom: 14px;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  cursor: default;
-}
-.own_name:after {
-  content: "";
-  position: absolute;
-  display: block;
-  top: 5px;
-  right: 10px;
-  width: 10px;
-  height: 10px;
-  border-radius: 50%;
-  background: #69bfee;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  border: 1px solid #c5e6f8;
-}
-.label_title {
-  display: inline-block;
-  width: calc(80% - 12px);
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.input_label_wrap {
-  position: relative;
-}
-.input_label_wrap p {
-  font-size: 12px;
-  margin: 0 0 4px 4px;
-}
-.input_label_wrap label {
-  position: absolute;
-  bottom: 4px;
-  left: 4px;
-  color: #aabbca;
-}
-/* div.action_button { */
-/*     background: #FFF; */
-/*     border: 1px solid #CCC; */
-/*     border-radius: 5px 5px 5px 5px; */
-/*     color: #374858; */
-/*     cursor: pointer; */
-/*     display: inline-block; */
-/*     float: left; */
-/*     font-size: 14px; */
-/*     height: 25px; */
-/*     line-height: 30px; */
-/*     margin-right: 10px; */
-/*     padding: 0 10px; */
-/*     text-align: center; */
-/*     top: 0; */
-/* } */
-/* div.action_button:hover { */
-/* 	color: #69bfee; */
-/*     border: 1px solid #69bfee; */
-/* } */
-div.action_button_click_only {
-  cursor: pointer;
-}
-div.bigger_button {
-  font-size: 18px;
-  margin: 0;
-  padding: 5px;
-  width: 250px;
-  cursor: pointer;
-  transition: background 0.3s ease;
-}
-#button_add_entry {
-  /* 	margin-right: 10px; */
-}
-.action_button {
-  height: 19px;
-  width: 24px;
-}
-.action_button img {
-  width: 24px;
-  height: 24px;
-  display: inline-block;
-  margin: auto;
-}
-.action_button p {
-  display: inline-block;
-  margin: 0;
-  margin-left: 5px;
-  text-align: left;
-}
-.file_upload_button {
-  width: auto;
-  height: 30px;
-}
-#saved_entry {
-  display: none;
-  background-color: #BDCA70;
-  border-radius: 5px;
-  color: white;
-  font-size: 18px;
-  left: 50%;
-  margin-left: -60px;
-  padding: 10px;
-  position: absolute;
-  text-align: center;
-  top: 0;
-  width: 100px;
-}
-div.dragging_entry {
-  background: #69bfee;
-  border-radius: 2px;
-  color: #FFF;
-  cursor: move;
-  font-size: 18px;
-  margin-top: -10px;
-  margin-left: -30px;
-  opacity: 0.5;
-  padding: 10px;
-  text-align: left;
-  width: 80px !important;
-  z-index: 100;
-}
-div.dd_entry_table {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-  height: 0;
-}
-div.dd_entry_row {
-  display: table-row;
-}
-div.dd_entry_cell {
-  border: 1px solid transparent;
-  display: table-cell;
-  vertical-align: top;
-}
-div.dd_entry_cell:hover {
-  border: 1px solid #CCC;
-}
-div.dd_entry_cell_wrapper {
-  position: relative;
-  height: 100%;
-  margin: 5px;
-}
-div.dd_entry_cell_content {
-  position: relative;
-  display: block;
-  min-height: 66px;
-  vertical-align: top;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  overflow: hidden;
-  /* For tables */
-}
-.handsontable {
-  overflow: scroll;
-}
-div.dd_entry_empty_element {
-  font-size: 16px;
-  padding: 15px 10px;
-  text-align: center;
-  overflow: hidden;
-  word-break: break-word;
-}
-div.dd_entry_cell_content img {
-  -webkit-user-select: none;
-  /* Chrome all / Safari all */
-  -moz-user-select: none;
-  /* Firefox all */
-  -ms-user-select: none;
-  /* IE 10+ */
-}
-div.dd_entry_cell_content .imageLayer {
-  left: 0;
-  margin-left: auto;
-  margin-right: auto;
-  position: absolute;
-  right: 0;
-  top: 0;
-}
-.file_placeholder {
-  text-align: center;
-  background-color: #d9e1e8;
-  border: 1px solid rgba(0, 0, 0, 0);
-  padding-top: 5px;
-  transition: background 0.3s ease;
-}
-.file_placeholder button {
-  cursor: pointer;
-  margin: 5px;
-  padding: 5px;
-}
-div.dd_entry_cell_file_download {
-  font-size: 16px;
-  padding: 15px 10px;
-  text-align: center;
-  overflow: hidden;
-  word-break: break-word;
-}
-div.dd_entry_cell_file_download span.icon-file {
-  font-size: 36px;
-}
-div.file_icon {
-  vertical-align: bottom;
-  display: inline-block;
-}
-div.file_extension {
-  position: absolute;
-  background-color: #374858;
-  color: #FFF;
-  font-size: 12px;
-  line-height: 12px;
-  margin: 12px 0 0 -16px;
-  padding: 2px;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  border: 1px solid #FFF;
-  width: 32px;
-}
-div.file_details {
-  display: inline-block;
-  text-align: left;
-  vertical-align: top;
-  line-height: 20px;
-}
-div.file_name {
-  display: block;
-  font-size: 18px;
-}
-div.file_size_link {
-  display: block;
-}
-div.file_size_link a {
-  margin-left: 10px;
-}
-div.dd_image_entry .dd_entry_cell_content {
-  text-align: center;
-  overflow: hidden;
-}
-.entry_button {
-  background-color: #e6ebef;
-  cursor: pointer;
-  display: none;
-  height: 30px;
-  margin: 0;
-  padding: 5px 0 0;
-  position: relative;
-  float: left;
-  text-align: center;
-  width: 35px;
-  z-index: 2;
-  font-size: 18px;
-  -webkit-transition: all 0.2s ease;
-  -moz-transition: all 0.2s ease;
-  -o-transition: all 0.2s ease;
-  transition: all 0.2s ease;
-}
-.entry_button:hover {
-  background-color: #d9e1e8;
-}
-.entry_button:active {
-  -webkit-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-}
-div.zoom_button,
-div.settings_button {
-  /* 	border-bottom: 1px solid #CCC; */
-  /* 	border-left: 1px solid #CCC; */
-  border-right: 0;
-  border-top: 0;
-  border-radius: 0;
-  right: 0;
-}
-div.cancel_button,
-div.drag_button {
-  /* 	right: 35px; */
-}
-div.save_button,
-div.edit_button {
-  /* 	border-right: 1px solid #CCCCCC; */
-  /*     right: 70px; */
-}
-div.zoom_button {
-  /* 	border-right: 1px solid #CCCCCC; */
-  /*     right: 105px; */
-}
-div.zoom_button span {
-  font-size: 14px;
-  margin: 10px;
-  line-height: 1.6;
-  color: #4b6277;
-}
-div.drag_button {
-  cursor: move;
-}
-div.cancel_button,
-div.save_button {
-  display: none;
-}
-div.zoom_button:hover,
-div.cancel_button:hover,
-.save_button:hover,
-.settings_button:hover,
-.drag_button:hover,
-.edit_button:hover {
-  /* 	color: #69bfee; */
-}
-div.zoom_button:hover,
-div.settings_button:hover {
-  margin: 0;
-}
-div.dd_entry_cell:hover div.zoom_button,
-div.dd_entry_cell:hover div.settings_button,
-div.dd_entry_cell:hover div.drag_button,
-div.dd_entry_cell:hover div.edit_button {
-  display: block;
-}
-/* we need !important to override inline css set in labfolder-project.js when showing or hiding buttons for redactor enabled/disabled */
-div.epb_entry.readOnly div.cancel_button,
-div.epb_entry.readOnly div.drag_button,
-div.epb_entry.readOnly div.settings_button,
-div.epb_entry.readOnly div.save_button,
-div.epb_entry.readOnly div.edit_button,
-div.epb_entry.readOnly div.zoom_button,
-div.epb_entry.readOnly button.file_upload_button,
-div.epb_entry.readOnly div.more_options_item_remove_block_element {
-  display: none !important;
-}
-div.disabled_button {
-  display: none !important;
-}
-/*TODO nest better hdrop*/
-.hdrop {
-  height: 15px;
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-  transition: background 0.3s ease;
-}
-.hdrop:only-child {
-  box-sizing: border-box;
-  height: 100px;
-  padding: 40px;
-}
-.hdrop:only-child:before {
-  content: "This entry is empty. You can add a TEXT, a SKETCH, a TABLE or attach a FILE by clicking or dragging the buttons in the toolbar above.";
-  font-size: 13px;
-  background: #ffffff;
-  padding: 2px 4px;
-}
-.hdrop.drop_active:only-child:before {
-  content: "Drag it here.";
-}
-.hdrop.drop_hover:only-child:before {
-  content: "Now drop it.";
-}
-.hdrop:last-child {
-  /* 	border-radius: 0 0 10px 10px; */
-}
-.vdrop {
-  width: 20px;
-  display: table-cell;
-  transition: background 0.3s ease;
-}
-#button_add_entry.drop_active,
-.drop_active {
-  background-color: #aea;
-}
-.file_placeholder.drop_active {
-  background-color: #97d3f3;
-}
-#button_add_entry.drop_hover,
-.drop_hover {
-  background: #69bfee;
-}
-.file_placeholder.drop_hover {
-  background-color: #69bfee;
-}
-.dragBar {
-  cursor: col-resize;
-  display: table-cell;
-  text-align: center;
-  vertical-align: middle;
-  width: 10px;
-}
-.dragBar img {
-  height: 10px;
-  width: 2px;
-}
-.dragBar:hover {
-  background-color: #DDD;
-}
-div.epb_entry.readOnly .dragBar {
-  cursor: default;
-}
-div.epb_entry.readOnly .dragBar img {
-  display: none;
-}
-div.epb_entry.readOnly .dragBar:hover {
-  background-color: initial;
-}
-.hidden_entry {
-  visibility: hidden;
-}
-.button_wrapper_sticky {
-  position: fixed !important;
-  top: 131px !important;
-  right: inherit !important;
-  z-index: 20;
-}
-.dd_entry_cell.ui-state-disabled,
-.dd_entry_cell.ui-widget-content .ui-state-disabled,
-.dd_entry_cell.ui-widget-header .ui-state-disabled {
-  background-image: none !important;
-  opacity: 1 !important;
-}
-#paste_hidden_input {
-  opacity: 0;
-  position: absolute;
-  right: 10000px;
-  top: -10000px;
-}
-/*************
-* action bar *
-**************/
-.action_bar {
-  width: 100%;
-  height: 36px;
-  min-width: 800px;
-  padding-top: 10px;
-  background: white;
-  border-bottom: solid 2px #a1b3c4;
-  -webkit-box-shadow: 0 3px 4px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: 0 3px 4px rgba(55, 72, 88, 0.2);
-  box-shadow: 0 3px 4px rgba(55, 72, 88, 0.2);
-}
-.plus_btn {
-  width: 64px;
-  height: 22px;
-  color: white;
-  background: #38abf7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0b89dd), color-stop(1, #38abf7));
-  background: -ms-linear-gradient(bottom, #0b89dd, #38abf7);
-  background: -moz-linear-gradient(center bottom, #0b89dd 0%, #38abf7 100%);
-  background: -o-linear-gradient(#38abf7, #0b89dd);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#38abf7', endColorstr='#0b89dd', GradientType=0);
-  text-align: left;
-  font-size: 27px;
-  font-family: Arial !important;
-  line-height: 0.6;
-  padding: 2px 9px;
-  position: relative;
-}
-.plus_btn:hover {
-  outline: 0;
-  color: #dcf0fb;
-}
-.plus_btn:active {
-  -webkit-box-shadow: inset 0 3px 2px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 3px 2px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 3px 2px rgba(55, 72, 88, 0.5);
-}
-.plus_btn:after {
-  content: "Add";
-  font-size: 13px;
-  position: absolute;
-  right: 10px;
-  top: 12px;
-  font-weight: bold;
-  line-height: 0;
-}
-.plus_btn_wrap {
-  width: 200px;
-  float: left;
-  margin-top: -3px;
-}
-.plus_btn_hover {
-  height: 23px;
-  margin: 0 0 0 55px;
-}
-.add_dropdown {
-  display: none;
-  position: absolute;
-  top: 85px;
-  left: 0;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  z-index: 999;
-}
-.add_dropdown .default_button {
-  border: 0;
-  background: none;
-}
-.add_dropdown .default_button:active {
-  background: #4fb9f3;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0);
-  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0);
-  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0);
-}
-.add_dropdown > ul {
-  width: 180px;
-  font-size: 14px;
-  color: white;
-  margin: 0;
-  padding: 12px 0 12px 0;
-  background: #18a2ed;
-}
-.add_dropdown > ul li {
-  list-style-type: none;
-  padding: 8px 10px 8px 50px;
-  cursor: pointer;
-}
-.add_dropdown > ul li:hover {
-  background: #4fb9f3;
-}
-.add_link {
-  padding: 0 0 0 50px !important;
-  height: 32px;
-}
-.add_link a {
-  width: auto;
-  padding: 8px 0 8px 0;
-  color: white;
-  text-decoration: none;
-  display: block;
-}
-.add_link a:hover {
-  text-decoration: none;
-}
-.action_menu_wrap {
-  float: left;
-  margin-top: -1px;
-}
-.filter_wrap > ul > li {
-  position: relative;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  border-left: solid 1px #bac7d4;
-  border-top: solid 1px #bac7d4;
-  height: 25px;
-}
-.filter_wrap > ul > li:last-child {
-  padding: 6px 3px 0 10px;
-  border-left: solid 1px #bac7d4;
-  border-top: 0;
-}
-.filter_wrap > ul > li:first-child {
-  background: none;
-  border: none;
-  color: #7b95ad;
-  font-size: 12px;
-  padding: 6px 10px 0 0;
-  margin-left: 18px;
-}
-.more_filters {
-  /* 	display: none; */
-}
-.filter_dropdown_wrap {
-  width: 190px;
-  height: auto;
-  position: absolute;
-  left: -1px;
-  top: 25px;
-  z-index: 999;
-  display: none;
-  color: #4b6277;
-}
-.filter_dropdown_wrap .folder_dn-img {
-  margin-top: 2px;
-}
-.filter_dropdown_wrap .folder_up-img {
-  margin-top: 0;
-}
-.filter_dropdown_wrap header {
-  font-size: 11px;
-  color: #d9e1e8;
-  background: #4b6277;
-  padding: 3px 6px 2px 6px;
-  float: left;
-}
-.filter_dropdown_wrap header > p {
-  margin: 0;
-  float: left;
-}
-.filter_dropdown_wrap header > span {
-  float: right;
-  padding: 0px 0 3px 8px;
-  color: white;
-  cursor: pointer;
-}
-.filter_dropdown {
-  overflow-y: auto;
-  overflow-x: hidden;
-  min-width: 190px;
-  max-height: 600px;
-  width: auto;
-  padding-bottom: 20px;
-  float: left;
-  border: solid 1px #bac7d4;
-  background: white;
-  -webkit-box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-}
-.filter_dropdown .list_vertical {
-  padding-top: 10px;
-}
-.filter_dropdown ul {
-  padding-left: 20px;
-}
-.filter_dropdown > ul {
-  margin: 0;
-  padding: 0;
-  width: 230px;
-}
-.filter_dropdown li {
-  list-style-type: none;
-}
-.filter_dropdown nav {
-  display: block;
-  height: 30px;
-  padding-top: 10px;
-}
-.filter_dropdown nav button {
-  float: left;
-  margin-right: 20px;
-}
-.filterOverlay.active {
-  opacity: 0.5;
-}
-.filter_project_dropdown > ul {
-  margin: 0;
-  padding: 0;
-  width: 270px;
-}
-.invalid_tag {
-  font-size: 12px;
-  color: #e66873;
-}
-.project_filter {
-  min-width: 255px !important;
-  padding: 0 6px 10px 4px;
-}
-.project_filter .tree_button {
-  display: none !important;
-}
-.project_filter .updateTS {
-  display: none !important;
-}
-.project_filter .treeline,
-.project_filter .treeline_children_empty {
-  font-size: 12px;
-}
-.root_folder {
-  padding: 4px 0 4px 2px !important;
-  width: calc(100% - 29px);
-}
-.not_possible_project {
-  display: none;
-}
-.not_possible_author {
-  display: none;
-}
-.folder_label {
-  padding: 4px 0 4px 2px !important;
-  width: calc(100% - 29px);
-}
-.root_folder_wrap {
-  overflow: auto;
-  width: 100%;
-}
-.filter_date_header {
-  width: 190px;
-}
-.dropdown_padding {
-  padding: 10px;
-}
-.author_filter {
-  min-width: 255px !important;
-  padding: 0 6px 0 4px;
-}
-.tags_input {
-  margin-top: 10px;
-  border: solid 1px #bac7d4;
-  cursor: text;
-  padding: 2px;
-  min-height: 50px;
-  width: 100%;
-  overflow: auto;
-}
-.tags_input > span {
-  font-size: 11px;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-  height: 18px;
-  margin: 2px;
-  cursor: pointer;
-  display: inline-block;
-}
-.tags_input > span.selected_token {
-  border: 1px solid #4bb1d7;
-}
-.tags_input > span.invalid {
-  border: 1px solid #E66873;
-  color: #E66873;
-}
-.token_input {
-  border: none;
-  outline: none;
-  resize: none;
-  white-space: pre;
-  font-size: 11px;
-  line-height: 11px;
-  vertical-align: top;
-  font-family: arial, sans-serif;
-  padding: 5px 0 0 2px;
-  margin: 0px;
-  width: auto;
-  overflow: auto;
-}
-.token_input_width {
-  position: absolute;
-  height: 11px;
-  display: inline-block;
-  padding: 0px 10px;
-  visibility: hidden;
-}
-.tag_name {
-  display: inline-block;
-  margin-right: 5px;
-  max-width: 250px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.delete_tag {
-  color: #9baec0;
-  cursor: pointer;
-  display: inline-block;
-  padding: 1px 3px 1px 0px;
-  vertical-align: top;
-}
-.delete_tag:after {
-  content: "\00d7";
-}
-.tag_data_wrap {
-  margin-top: 10px;
-}
-.tag_data_wrap > ul {
-  margin: 0;
-  padding: 0;
-}
-.tag_data_wrap > ul li {
-  list-style-type: none;
-}
-.tag_index {
-  padding-right: 5px;
-  text-align: center;
-  font-size: 10px;
-  font-weight: bold;
-  border-right: solid 1px #bac7d4;
-  float: left;
-}
-.tag_index > ul {
-  margin: 0;
-  padding: 0;
-}
-.tag_index > ul li {
-  list-style-type: none;
-}
-.tag_index li {
-  width: 15px;
-  padding: 3px 0 3px 0;
-  margin-bottom: 1px;
-  display: block;
-  cursor: pointer;
-}
-.tag_index li:hover {
-  background: #ecf0f3;
-}
-.existing_tag {
-  cursor: pointer;
-}
-.existing_tag.disabled {
-  color: white;
-  background: #7b95ad;
-  border: 1px solid #7b95ad;
-}
-li.index_selected {
-  background: #d9e1e8;
-}
-li.index_selected:hover {
-  background: #d9e1e8;
-}
-.all_tags_head {
-  font-size: 12px;
-  margin: 10px 0 5px 0;
-}
-.all_tags {
-  font-size: 12px;
-  margin: 40px 0 5px 0;
-}
-.tag_register {
-  overflow: auto;
-  max-height: 300px;
-  width: 100%;
-  float: left;
-  margin-left: 10px;
-  font-size: 11px;
-}
-.tag_register ul {
-  margin: 0;
-  padding: 0;
-}
-.tag_register ul li {
-  list-style-type: none;
-}
-.tag_register > ul > li {
-  margin-bottom: 15px;
-}
-.tag {
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-  display: inline-block;
-}
-.my_tags li {
-  margin-bottom: 5px;
-}
-.my_tags span {
-  display: inline-block;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-}
-.my_tags .selected_tag {
-  background: #38abf7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0b89dd), color-stop(1, #38abf7));
-  background: -ms-linear-gradient(bottom, #0b89dd, #38abf7);
-  background: -moz-linear-gradient(center bottom, #0b89dd 0%, #38abf7 100%);
-  background: -o-linear-gradient(#38abf7, #0b89dd);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#38abf7', endColorstr='#0b89dd', GradientType=0);
-  color: #ffffff;
-}
-.my_tags .selected_tag.disabled.selected_tag {
-  background: #f3f5f7;
-  border: 1px solid #E66873;
-  color: #E66873;
-}
-.group_tags li {
-  margin-bottom: 7px;
-}
-.group_tags span {
-  display: inline-block;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-}
-.managed_tags li {
-  margin-bottom: 7px;
-}
-.managed_tags span {
-  display: inline-block;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-}
-.custom_selectbox {
-  min-width: 100px;
-}
-.filter_date_input {
-  background: white;
-  border: solid 1px #bac7d4;
-  width: 120px;
-  height: 26px;
-  padding: 2px;
-  color: #4b6277;
-}
-.datepicker_wrap {
-  margin-top: 20px;
-}
-.datepicker_wrap > div:first-child {
-  margin-bottom: 15px;
-}
-.input_label_wrap label.hidden {
-  display: none;
-}
-.filter_date_icon {
-  display: block;
-  position: absolute;
-  right: 24px;
-  top: 20px;
-  font-size: 20px;
-  cursor: pointer;
-}
-.empty_filter_message {
-  font-size: 12px;
-  margin: 0 0 10px 10px;
-}
-/*******
-* entry *
-********/
-#epb_container {
-  position: relative;
-  width: 100%;
-}
-.epb_entry {
-  width: 100%;
-  margin: 19px 0 15px 0;
-  display: inline-block;
-}
-.readOnly .entry_toolbar_btns {
-  display: none;
-}
-.entry_loading {
-  background: rgba(255, 255, 255, 0.7);
-  position: fixed;
-  top: 85px;
-  bottom: 0;
-  left: 0;
-  z-index: 99;
-  right: 0;
-}
-.entry_loading span {
-  padding: 25px;
-  background: #fff;
-  opacity: 1;
-  border-radius: 10px;
-  border: 1px solid #9baec0;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  color: #5e7b97;
-  font-size: 24px;
-  top: 300px;
-  width: 250px;
-  margin-left: -125px;
-  left: 50%;
-  text-align: center;
-  position: absolute;
-}
-.entry_container {
-  min-width: 726px;
-  margin-right: 45px;
-}
-.entry_header {
-  width: 100%;
-  height: 33px;
-  font-size: 12px;
-  background: #cdd7e0;
-}
-.entry_author {
-  color: #374858;
-  float: left;
-}
-.entry_author > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_author > ul li {
-  list-style-type: none;
-}
-.entry_author figure {
-  background: #ecf0f3;
-  border: solid 1px #7b95ad;
-  margin: 2px;
-  width: 29px;
-  height: 29px;
-  float: left;
-  position: relative;
-}
-.entry_author figure img {
-  width: 27px;
-  height: 27px;
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-.entry_author figure > span {
-  margin-left: 4px;
-}
-.author_name {
-  float: left;
-  padding: 2px;
-  line-height: 1.3;
-  width: 196px;
-}
-.author_firstname,
-.author_lastname {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  display: block;
-  overflow: hidden;
-  padding: 0;
-  margin-left: 0;
-}
-.entry_title_wrap {
-  float: left;
-  position: relative;
-  padding: 2px 4px 3px 4px;
-  line-height: 1.3;
-  border-left: 1px solid #ffffff;
-}
-.entry_name_menu {
-  float: left;
-  height: 30px;
-  overflow: hidden;
-}
-.entry_name_menu > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_name_menu > ul li {
-  list-style-type: none;
-}
-.entry_name_menu p {
-  margin: 0;
-  display: inline-block;
-}
-.entry_name_menu li {
-  max-width: 800px;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.entry_name_menu li:first-child {
-  float: left;
-  color: #4f677e;
-  margin-right: 10px;
-  font-size: 11px;
-  line-height: 1.4;
-}
-.entry_name_menu li:last-child {
-  float: left;
-}
-.entry_menu_list {
-  float: left;
-  width: 164px;
-  height: 30px;
-  overflow: hidden;
-}
-.entry_menu_list > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_menu_list > ul li {
-  list-style-type: none;
-}
-.entry_menu_list p {
-  margin: 0;
-  display: inline-block;
-}
-.entry_menu_list li {
-  width: 100%;
-  display: block;
-  clear: both;
-  white-space: nowrap;
-}
-.entry_menu_list li span {
-  display: inline-block;
-  vertical-align: top;
-}
-.entry_menu_list li span:first-child {
-  min-width: 45px;
-  max-width: 92px;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  float: left;
-  margin-right: 10px;
-  color: #4f677e;
-  font-size: 11px;
-}
-.entry_menu_list li span:last-child {
-  float: left;
-  color: #374858;
-}
-.entry_menus {
-  height: 100%;
-  float: right;
-  position: relative;
-}
-.entry_menus > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_menus > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-.entry_menus > ul {
-  height: 100%;
-}
-.entry_menus > ul > li {
-  width: 200px;
-  border-right: solid 1px white;
-  padding: 2px 4px 3px 4px;
-  height: 33px;
-  line-height: 1.3;
-  background: #cdd7e0;
-  position: relative;
-}
-.entry_menus > ul > li:first-child {
-  border-left: solid 1px white;
-}
-.entry_menus > ul > li:last-child {
-  border-right: none;
-  width: 90px;
-}
-.entry_menu_more {
-  min-height: 33px;
-  height: auto !important;
-  overflow: visible;
-  border-bottom: solid 1px #ffffff;
-  border-left: solid 1px #ffffff;
-  -webkit-box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  z-index: 10;
-}
-.entry_menu_more .entry_menu_options span:last-child {
-  position: absolute;
-  bottom: 6px;
-}
-.show_list_more {
-  height: auto;
-}
-.readOnly .drop_edit_menu {
-  display: none;
-}
-.entry_menu_less {
-  /* 	overflow: hidden; */
-}
-.entry_menu_show {
-  overflow: visible;
-}
-.entry_menu_edit .entry_dropdown {
-  display: block;
-}
-.entry_menu_options {
-  float: right;
-  margin-left: 10px;
-  padding-left: 4px;
-  height: 100%;
-  width: 15px;
-}
-.entry_menu_options > span {
-  display: block;
-  margin-right: 0;
-  cursor: pointer;
-}
-.entry_menu_options .arrow_menu_dn-img {
-  height: 10px !important;
-  margin-top: 7px;
-}
-.entry_options {
-  padding-top: 5px;
-  float: right;
-}
-.entry_options > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_options > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-.entry_options > ul > li {
-  margin-left: 6px;
-}
-.entry_options > span {
-  cursor: pointer;
-}
-.epb_comments_count {
-  color: #ffffff;
-  width: 17px;
-  display: block;
-  text-align: center;
-  margin-top: 1px;
-  font-size: 9px;
-  height: 12px;
-  line-height: 12px;
-}
-@-moz-document url-prefix() {
-  .epb_comments_count {
-    line-height: 11px;
-  }
-}
-.entry_toolbar {
-  height: 25px;
-  margin-left: 31px;
-  position: relative;
-  padding: 5px;
-  background: #cdd7e0;
-  border-top: solid 1px white;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-}
-.entry_toolbar > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_toolbar > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-.entry_toolbar > ul > li {
-  margin-right: 12px;
-  cursor: pointer;
-}
-.entry_toolbar > ul > li:first-child {
-  margin-left: 6px;
-}
-.entry_toolbar_btns {
-  /*display: none;*/
-}
-.entry_content {
-  min-height: 300px;
-  background: #f9fafb;
-  border: solid 1px #cad4de;
-}
-.entry_footer {
-  margin-left: 30px;
-  height: 25px;
-  background: #cad4de;
-}
-.tag {
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-}
-.entry_tags {
-  float: left;
-  height: 100%;
-  overflow: hidden;
-  max-width: 138px;
-}
-.entry_tags > span {
-  display: inline-block;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-  float: left;
-  line-height: 1;
-  padding: 0px 3px;
-  border: solid 1px #aabbca;
-  margin-right: 2px;
-}
-.entry_dropdown {
-  width: 101%;
-  min-width: 260px;
-  height: auto;
-  padding: 10px;
-  background: #cdd7e0;
-  border-left: solid 1px white;
-  border-right: solid 1px white;
-  border-bottom: solid 1px white;
-  position: absolute;
-  top: 0;
-  right: -1px;
-  z-index: 14;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  display: none;
-}
-.entry_dropdown > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_dropdown > ul li {
-  list-style-type: none;
-}
-.entry_dropdown input {
-  border: none;
-  height: 28px;
-  font-size: 12px;
-  padding-left: 6px;
-  width: 100%;
-  color: #4b6277;
-}
-.entry_dropdown label {
-  font-size: 11px;
-  display: block;
-  margin-bottom: 4px;
-}
-.entry_dropdown > nav {
-  width: 100%;
-  height: 18px;
-}
-.entry_name {
-  right: auto !important;
-  left: -1px !important;
-}
-.entry_name select {
-  width: 60%;
-}
-.entry_name > ul > li {
-  margin: 4px 0 12px 0;
-}
-.entry_name > ul > li:first-child {
-  margin-top: -8px;
-}
-.project_tree {
-  width: 100%;
-  height: 140px;
-  overflow: auto;
-  background: white;
-}
-.close_entry_menu {
-  height: 18px;
-  width: 100%;
-  margin-top: -5px;
-}
-.close_entry_menu span {
-  float: right;
-}
-.save_entry_menu {
-  height: 20px;
-  float: right;
-  margin-top: 10px;
-}
-.save_entry_menu .grey_link {
-  display: block;
-  float: left;
-  padding: 4px 20px 0 0;
-}
-.select_entry_menu {
-  width: 100%;
-  height: 25px;
-  float: left;
-  margin-top: 20px;
-}
-.select_entry_menu span,
-.select_entry_menu button {
-  float: left;
-  margin-right: 15px;
-}
-.select_entry_menu .blue_link {
-  color: #3b97ed;
-}
-.entry_tag_index li:hover {
-  background: #d9e1e8;
-}
-.entry_tag_index li.index_selected {
-  background: #e6ebef;
-}
-.entry_tag_index li.index_selected:hover {
-  background: #e6ebef;
-}
-.entry_tags_input {
-  margin: 0;
-  background: white;
-  border: none;
-}
-.entry_dates {
-  width: 100%;
-}
-.entry_dates > li {
-  display: block;
-  width: 100%;
-  clear: both;
-  overflow: auto;
-  margin-bottom: 15px;
-}
-.entry_dates > li > span {
-  margin: 5px 0 0 6px;
-  cursor: pointer;
-}
-.entry_dates > li > span:active {
-  margin: 6px 0 0 6px;
-}
-.entry_dates input {
-  height: 25px;
-  background: #e9edf1;
-}
-.entry_dates input:focus {
-  background: white;
-}
-.entry_dates > li:last-child {
-  margin-bottom: 5px;
-}
-.entry_dates > li:last-child input {
-  background: white;
-}
-.entry_dates > li:first-child {
-  margin-bottom: 0;
-}
-.drag_handle {
-  background: #d9e1e8;
-  width: 9px;
-  height: 25px;
-  padding: 5px 3px;
-  float: left;
-  cursor: move;
-}
-.drag_handle span {
-  width: 3px;
-  height: 3px;
-  display: block;
-  background: #bac7d4;
-  margin: 1px 0 2px 0;
-}
-.date_key {
-  width: 120px;
-  float: left;
-  margin-right: 10px;
-  position: relative;
-}
-.date_key:after {
-  content: ":";
-  position: absolute;
-  left: 123px;
-  top: 4px;
-  font-size: 12px;
-  font-weight: bold;
-}
-.date_value {
-  width: 80px;
-  float: left;
-  position: relative;
-}
-.entry_settings {
-  width: 150px;
-  background: white;
-  line-height: 1.0;
-  position: absolute !important;
-  top: 24px;
-  right: -13px;
-  z-index: 30;
-  display: none;
-  margin-right: 0 !important;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.8);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.8);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.8);
-}
-.entry_settings > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_settings > ul li {
-  list-style-type: none;
-}
-.entry_settings .trash_dark-img {
-  right: 4px;
-}
-.entry_settings ul {
-  padding: 10px 0 10px 0;
-}
-.entry_settings li {
-  font-size: 12px;
-  padding: 8px 10px;
-  display: block;
-  cursor: pointer;
-}
-.entry_settings li:hover {
-  background: #e0e6eb;
-}
-.entry_settings_arrow {
-  position: relative;
-  background: #f9fafb;
-}
-.entry_settings_arrow:after {
-  top: -11px;
-  right: 19px;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(136, 183, 213, 0);
-  border-bottom-color: #f9fafb;
-  border-width: 7px;
-  margin-left: -3px;
-}
-.epb_content_wrap {
-  display: table;
-  min-width: 696px;
-  margin-left: 30px;
-  margin-right: 45px;
-  min-height: 100px;
-  background: #f3f5f7;
-  border: solid 1px #aabbca;
-}
-.handsontable th {
-  background: #d9e1e8;
-  font-size: 12px;
-  color: #4b6277;
-}
-.handsontable th,
-.handsontable td {
-  border-right: 1px solid #cad4de;
-  border-bottom: 1px solid #cad4de;
-}
-.handsontable tr:first-child th,
-.handsontable tr:first-child td {
-  border-top: 1px solid #cad4de;
-}
-.handsontable th:first-child,
-.handsontable td:first-child,
-.handsontable .htNoFrame + th,
-.handsontable .htNoFrame + td {
-  border-left: 1px solid #cad4de;
-}
-div.dd_entry_cell {
-  border: 1px solid #d9e1e8;
-  -webkit-transition: border 0.2s ease;
-  -moz-transition: border 0.2s ease;
-  -o-transition: border 0.2s ease;
-  transition: border 0.2s ease;
-}
-div.dd_entry_cell:hover {
-  border: 1px solid #3babe9;
-}
-div.dd_entry_cell:hover .button_wrapper {
-  display: block;
-}
-#button_add_entry.drop_active,
-.drop_active {
-  background-color: #d8f1ff;
-}
-#button_add_entry.drop_hover,
-.drop_hover {
-  background: #69bfee;
-}
-.settings_button span {
-  margin-top: 10px;
-  display: block;
-}
-.edit_button span {
-  margin: 5px 0 0 12px;
-}
-.drag_button span {
-  margin: 3px 0 0 10px;
-}
-.drag_button:active {
-  -webkit-box-shadow: inset 0 0 0 rgba(55, 72, 88, 0) !important;
-  -moz-box-shadow: inset 0 0 0 rgba(55, 72, 88, 0) !important;
-  box-shadow: inset 0 0 0 rgba(55, 72, 88, 0) !important;
-}
-.cancel_button span {
-  margin: 5px 0 0 12px;
-}
-.save_button span {
-  margin: 2px 0 0 10px;
-}
-.button_wrapper {
-  position: absolute;
-  right: -1px;
-  top: -1px;
-  display: none;
-  border: solid 1px #cad4de;
-  z-index: 8;
-  -webkit-box-shadow: -2px 1px 1px rgba(55, 72, 88, 0.1) !important;
-  -moz-box-shadow: -2px 1px 1px rgba(55, 72, 88, 0.1) !important;
-  box-shadow: -2px 1px 1px rgba(55, 72, 88, 0.1) !important;
-}
-.button_wrapper .more_options_panel {
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4) !important;
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4) !important;
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4) !important;
-  border: 0;
-}
-.button_wrapper .more_options_item {
-  min-width: 140px;
-}
-.more_options_panel.in_block {
-  right: -1px;
-  top: 36px;
-  padding: 10px 0 10px 0;
-  background-color: #e6ebef;
-}
-.more_options_item_remove_block_element span {
-  float: left;
-}
-.more_options_item {
-  padding: 6px;
-}
-.more_options_item:hover {
-  background: #f9fafb;
-}
-/*********
-* tables *
-**********/
-.htContextMenu table.htCore {
-  outline: 1px solid #d9e1e8;
-  line-height: 1.0;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4);
-}
-.htContextMenu table tbody tr td {
-  font-size: 12px;
-  color: #4b6277;
-  background: #e9edf1;
-}
-.htContextMenu table tbody tr td:hover {
-  background: #f9fafb;
-}
-.htContextMenu table tbody tr td.current {
-  background: #f9fafb;
-}
-.htContextMenu table tbody tr td.htSeparator {
-  border-top: 1px solid #cad4de;
-}
-/****************
-* media queries *
-****************/
-@media (max-height: 750px) {
-  .filter_dropdown {
-    max-height: 460px;
-  }
-}
-@media (max-width: 1750px) {
-  .entry_name_menu li {
-    max-width: 400px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-  }
-}
-@media (max-width: 1380px) {
-  .entry_name_menu li {
-    max-width: 190px;
-  }
-  .entry_menus > ul > li {
-    width: 174px;
-  }
-  .entry_menu_list {
-    width: 138px;
-  }
-  .entry_menu_list li span {
-  font-size: 11px;
-  }
-  .entry_menu_list li span:first-child {
-  margin: 0;
-  }
-}
-@media (max-width: 1100px) {
-  .author_name {
-    width: auto;
-    margin-right: 20px;
-  }
-  .author_firstname,
-  .author_lastname {
-    width: 100px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-  }
-}
-@media (max-width: 970px) {
-  .page_title {
-    margin-top: 2px;
-    font-size: 12px;
-  }
-  .plus_btn_wrap {
-    width: 130px;
-  }
-  .author_firstname,
-  .author_lastname {
-    width: 66px;
-  }
-  .entry_menus > ul > li {
-    width: 120px;
-  }
-  .entry_menu_list {
-    width: 84px;
-  }
-  .entry_menu_list li span:first-child {
-    display: block;
-    float: none;
-  }
-  .entry_tags {
-    width: 84px;
-  }
-  .entry_tags > span {
-    max-width: 84px;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-}
-@media (max-width: 870px) {
-  .entry_name_menu li {
-    max-width: 90px;
-  }
-}
-
-
-
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-/*********
-* icons	*
-**********/
-.icon_source {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-}
-.logo-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -6px -10px;
-  width: 130px;
-  height: 30px;
-  margin: 16px 0 0 22px;
-}
-.author_only-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -140px -3px;
-  width: 15px;
-  height: 15px;
-}
-.add_text-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -161px -3px;
-  width: 22px;
-  height: 15px;
-}
-.add_text-img:hover {
-  background-position: -161px -31px;
-}
-.add_text-img:active {
-  margin-top: 1px;
-}
-.add_sketch-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -190px -3px;
-  width: 22px;
-  height: 15px;
-}
-.add_sketch-img:hover {
-  background-position: -190px -31px;
-}
-.add_sketch-img:active {
-  margin-top: 1px;
-}
-.add_table-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -218px -3px;
-  width: 23px;
-  height: 15px;
-}
-.add_table-img:hover {
-  background-position: -218px -31px;
-}
-.add_table-img:active {
-  margin-top: 1px;
-}
-.add_upload-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -942px -3px;
-  width: 18px;
-  height: 15px;
-}
-.add_upload-img:hover {
-  background-position: -942px -31px;
-}
-.add_upload-img:active {
-  margin-top: 1px;
-}
-.add_import-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -246px -3px;
-  width: 23px;
-  height: 15px;
-}
-.add_import-img:hover {
-  background-position: -246px -31px;
-}
-.add_import-img:active {
-  margin-top: 1px;
-}
-.wheel-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -282px -3px;
-  width: 15px;
-  height: 15px;
-}
-.wheel-img:hover {
-  background-position: -282px -31px;
-}
-.arrow_down-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -303px -3px;
-  width: 15px;
-  height: 15px;
-  cursor: pointer;
-}
-.arrow_down-img:hover {
-  background-position: -303px -31px;
-}
-.arrow_up-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -327px -3px;
-  width: 15px;
-  height: 15px;
-  cursor: pointer;
-}
-.arrow_up-img:hover {
-  background-position: -327px -31px;
-}
-.comment-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -348px -3px;
-  width: 19px;
-  height: 19px;
-}
-.comment-img:hover {
-  background-position: -348px -31px;
-}
-.todo-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1085px -4px;
-  width: 14px;
-  height: 13px;
-}
-.project-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -375px -3px;
-  width: 16px;
-  height: 16px;
-  margin-top: 6px !important;
-}
-/* .project-img:hover{ */
-/* 	background-position: -375px -31px;  */
-/* }	 */
-.manage-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -400px -2px;
-  width: 20px;
-  height: 20px;
-}
-.manage_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1050px -35px;
-  width: 10px;
-  height: 10px;
-  margin-top: 2px;
-}
-.desk-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -428px -3px;
-  width: 16px;
-  height: 16px;
-  margin-top: 6px !important;
-}
-.desk_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1067px -35px;
-  width: 10px;
-  height: 10px;
-  margin-top: 3px;
-}
-.template_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -796px -3px;
-  width: 10px;
-  height: 16px;
-}
-.bell-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -454px -1px;
-  width: 22px;
-  height: 22px;
-}
-.bell-img:hover {
-  background-position: -454px -29px;
-}
-.search-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -488px -1px;
-  width: 26px;
-  height: 23px;
-}
-.search-img:hover {
-  background-position: -488px -29px;
-}
-.avatar-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -522px 1px;
-  width: 16px;
-  height: 22px;
-}
-.avatar_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -837px -37px;
-  width: 8px;
-  height: 10px;
-  margin-top: 4px;
-}
-.group-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -853px -35px;
-  width: 20px;
-  height: 13px;
-  margin-top: 3px;
-}
-.arrow_down_s-img {
-  position: relative;
-  background: transparent;
-}
-.arrow_down_s-img:after {
-  top: 100%;
-  left: 50%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(213, 213, 213, 0);
-  border-top-color: #374858;
-  border-width: 4px;
-  margin-left: -4px;
-}
-.arrow_down_s-img:hover {
-  background-position: -691px -39px;
-}
-.close_x-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -895px -8px;
-  width: 10px;
-  height: 9px;
-}
-.feedback-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -912px -2px;
-  width: 10px;
-  height: 61px;
-}
-.invite-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -925px -2px;
-  width: 10px;
-  height: 52px;
-}
-.pending-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1011px -9px;
-  width: 17px;
-  height: 10px;
-}
-.single_tag_img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -970px -5px;
-  width: 12px;
-  height: 14px;
-}
-.root_tag_img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -986px -4px;
-  width: 19px;
-  height: 15px;
-}
-.menu_arrow-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -853px -7px;
-  width: 14px;
-  height: 11px;
-}
-.folder_up-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -738px -3px;
-  width: 24px;
-  height: 15px;
-}
-.folder_dn-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -764px -5px;
-  width: 24px;
-  height: 13px;
-}
-.project_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -814px -5px;
-  width: 12px;
-  height: 14px;
-}
-.notebook_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1035px -34px;
-  width: 10px;
-  height: 12px;
-  margin-top: 2px;
-}
-.edit-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -659px -7px;
-  width: 11px;
-  height: 10px;
-}
-.trash_dark-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -631px -5px;
-  width: 10px;
-  height: 13px;
-}
-.trash-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -646px -4px;
-  width: 10px;
-  height: 13px;
-}
-.trash-img:hover {
-  background-position: -631px -4px;
-}
-.edit_light-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -674px -7px;
-  width: 11px;
-  height: 10px;
-}
-.edit_light-img:hover {
-  background-position: -659px -7px;
-}
-.edit_light-img:active {
-  margin-top: 1px;
-  margin-bottom: -1px;
-}
-.arrow_menu_dn-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -729px -11px;
-  width: 9px;
-  height: 5px;
-}
-.arrow_menu_dn-img:hover {
-  background-position: -729px -39px;
-}
-.arrow_menu_up-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -716px -11px;
-  width: 9px;
-  height: 5px;
-}
-.arrow_menu_up-img:hover {
-  background-position: -716px -39px;
-}
-.close_box-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  float: right;
-  margin: 0;
-  background-position: -546px -5px;
-  width: 17px;
-  height: 15px;
-  cursor: pointer;
-}
-.close_box-img:hover {
-  background-position: -546px -33px;
-}
-.close_box-img:active {
-  -webkit-box-shadow: 0 0 5px #ffffff;
-  -moz-box-shadow: 0 0 5px #ffffff;
-  box-shadow: 0 0 5px #ffffff;
-  background-position: -546px -5px;
-}
-.save-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  margin: 0;
-  background-position: -585px -5px;
-  width: 15px;
-  height: 15px;
-  cursor: pointer;
-}
-.drag-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  margin: 0;
-  background-position: -608px -5px;
-  width: 15px;
-  height: 15px;
-  cursor: pointer;
-}
-.close_dark_x-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -569px -8px;
-  width: 10px;
-  height: 9px;
-}
-.edit_dark-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -659px -7px;
-  width: 11px;
-  height: 10px;
-}
-
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-.signing_statement {
-  margin-bottom: 10px;
-}
-.signing_method {
-  margin: 0;
-  padding: 0;
-}
-.signpad_canvas {
-  width: 100%;
-  height: 150px;
-  border: 1px solid black;
-  background-color: #ffffff;
-}
-#signing_clear_button {
-  font-size: 12px;
-  cursor: pointer;
-}
-.signing_method_container {
-  display: block;
-  border: 1px solid #d2d2d2;
-  margin-bottom: 10px;
-  transition: background-color 0.3s ease;
-}
-.signing_method_container.selected {
-  background: #ededed;
-}
-.signing_content_title {
-  line-height: 26px;
-  padding: 10px;
-}
-.signing_method_description {
-  display: block;
-}
-.signing_method_container .signing_content_body {
-  padding: 0 10px;
-}
-.selected .signing_content_body {
-  padding: 0 10px 10px 10px;
-}
-.signing_toggle {
-  cursor: pointer;
-}
-.signing_label {
-  display: inline-block;
-  margin-right: 50px;
-}
-.signing_method_container .triangle {
-  display: inline-block;
-  font-size: 10px;
-  margin: 10px 10px 0 0;
-}
-/* .signing_method_container .icon-triangle_down { */
-/* 	margin-top: 10px;	 */
-/* } */
-
-/******************************
- 	TASK LIST VIEW
-*******************************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-.eln_main_content_box.tasks {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  height: auto;
-  min-height: 400px;
-  margin: 0 25px 0 0;
-}
-#tasks_header {
-  background: #EEE;
-  border-bottom: 1px solid #D6D4D5;
-  border-radius: 10px 10px 0 0;
-  display: block;
-  font-size: 14px;
-  height: 35px;
-  padding: 10px 0px 5px 15px;
-}
-#task_filter_status.hidden {
-  display: none;
-}
-#task_filter_status .checkbox_filled_bg:hover {
-  background: none;
-}
-#task_content {
-  max-width: 1300px;
-  padding-left: 10px;
-  display: block;
-  line-height: 18px;
-  position: relative;
-  overflow: auto;
-}
-.task_empty_folder {
-  display: none;
-  padding: 50px;
-  text-align: center;
-  font-size: 12px;
-}
-.task_list {
-  font-size: 14px;
-}
-.task_list table {
-  border-collapse: collapse;
-  outline: none;
-  table-layout: fixed;
-  width: 100%;
-}
-.task_list table tr td:last-child {
-  font-size: 11px;
-}
-.column_task_name {
-  min-width: 100px;
-  width: 25%;
-}
-.column_task_delete {
-  width: 30px;
-}
-.column_task_date {
-  width: 89px;
-}
-.task_list_line {
-  font-size: 12px;
-  border-bottom: 1px solid #bac7d4;
-  cursor: pointer;
-  height: 34px;
-  line-height: 1.2;
-  white-space: nowrap;
-}
-.task_list_line:last-child {
-  border: none;
-}
-.task_list_line:hover {
-  background: #ecf0f3;
-}
-.task_list_line:hover .task_line_delete {
-  display: block;
-}
-.task_list_line:first-child {
-  cursor: auto;
-}
-.task_list_line:first-child:hover {
-  background: none;
-}
-.unread_task {
-  background: #EEF;
-}
-.task_line_name {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  vertical-align: bottom;
-  overflow: hidden;
-  padding-left: 4px;
-}
-.task_line_text {
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.task_line_content {
-  color: #AAA;
-}
-.task_line_delete {
-  display: none;
-  text-align: center;
-}
-.task_line_delete:hover {
-  color: #4bb1d7;
-}
-.task_line_date {
-  padding-right: 10px;
-  text-align: right;
-}
-.task_checkbox_wrap {
-  position: relative;
-  float: left;
-  display: block;
-  font-size: 12px;
-}
-/******************************
- 	TASK DIALOG VIEW
-*******************************/
-.task_select_left {
-  float: left;
-}
-.task_select {
-  border: 0;
-  outline: 0;
-  background: #FFF;
-  cursor: pointer;
-  margin-right: 10px;
-  padding: 4px 4px 4px 8px;
-  color: #5e7b97;
-}
-.task_options {
-  height: 45px;
-}
-.task_set_option {
-  display: inline-block;
-  margin: 5px 15px 0 15px;
-}
-#choose_asignee,
-#choose_status,
-#status_created {
-  display: none;
-}
-#dialog_task_form .input_block {
-  margin: 0;
-  padding-bottom: 20px;
-  overflow: auto;
-  height: auto;
-}
-#dialog_task_form .task_recipient_label {
-  display: inline-block;
-  vertical-align: top;
-  width: 20px;
-  padding: 5px 0 0 0;
-  margin-bottom: 5px;
-}
-.task_info_label {
-  margin-left: 16px;
-  margin-bottom: 6px;
-}
-.task_content_bg {
-  background: white;
-  padding: 0 10px 10px 10px;
-}
-#dialog_task_form .task_recipient_field {
-  cursor: text;
-  display: inline-block;
-  min-height: 33px;
-  width: 700px;
-}
-#dialog_task_form .add_task_recipient {
-  cursor: pointer;
-  display: inline-block;
-  margin-bottom: 5px;
-  padding: 5px 0 0 0;
-  vertical-align: top;
-}
-#dialog_task_form .add_task_recipient.disabled {
-  cursor: default;
-  color: #AAA;
-}
-#taskRecipientIds,
-#taskRecipientEmails {
-  display: none;
-}
-#dialog_task_form .task_recipient textarea,
-#task_recipient_width {
-  border: 1px solid transparent;
-  display: inline-block;
-  font-size: 14px;
-  color: #374858;
-  height: 14px;
-  margin: 0 5px 5px 0;
-  outline: none;
-  padding: 5px;
-  resize: none;
-  vertical-align: bottom;
-  overflow: hidden;
-}
-#task_recipient_width {
-  display: none;
-}
-#dialog_task_form .task_message_content {
-  max-height: 450px;
-  height: auto;
-  overflow: auto;
-}
-.task_message_text {
-  margin: 10px 0 0 15px;
-}
-#dialog_task_form .task_message_content textarea {
-  font-size: 14px;
-  height: 200px;
-  margin: 0;
-  resize: none;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-#dialog_task_form .placeholder_frame {
-  float: none;
-  width: 100%;
-}
-.task_recipient_tree {
-  display: none;
-  position: relative;
-  box-shadow: 0px 0px 10px #AAA;
-  box-sizing: border-box;
-  max-height: 150px;
-  overflow: auto;
-  padding: 0 10px;
-}
-.task_recipient_tree a {
-  color: #374858;
-  line-height: 25px;
-  text-decoration: none;
-}
-.task_recipient_tree div.group_treeline_children {
-  padding-left: 15px;
-  margin-left: 0px;
-  box-sizing: border-box;
-}
-.task_recipient {
-  line-height: 24px;
-}
-.task_recipient:last-child:after {
-  content: "";
-}
-/******************************
- 	TASK FILTERING
-*******************************/
-.task_filter {
-  list-style-type: none;
-  overflow: auto;
-  margin: 0;
-  padding: 6px 0 0 10px;
-}
-.task_filter > li {
-  float: left;
-  padding-left: 6px;
-  padding-right: 6px;
-}
-.task_filter label {
-  vertical-align: middle;
-  bottom: 3px;
-  position: relative;
-  margin-left: 2px;
-}
-.CLOSED,
-.not_assigned,
-.assigned {
-  display: none;
-}
-
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-.treeInPopup .treeline {
-  background-repeat: no-repeat;
-  color: #374858;
-  cursor: pointer;
-  border: 1px solid transparent;
-  display: block;
-  font-size: 14px;
-  height: 21px;
-  line-height: 22px;
-  outline: none;
-  padding-left: 5px;
-  text-decoration: none;
-}
-/* .treeline:hover{ */
-/* 	background-position: 0 0; */
-/* 	border: 1px solid #69bfee; */
-/* 	text-decoration: none; */
-/* } */
-.treeline:hover .icon-arrow_down,
-.treeline:hover .icon-arrow_right,
-.treeline:hover .icon-folder,
-.treeline:hover .icon-notebook,
-.treeline:hover .icon-template,
-.treeline:hover .name,
-.treeline:hover .updateTS {
-  /* 	color: #69bfee; */
-}
-.treeline.active {
-  background-color: #ededed;
-}
-.treeInPopup .treeline.active {
-  background-color: transparent;
-}
-.treeline.is_hidden_item .icon-arrow_down,
-.treeline.is_hidden_item .icon-arrow_right,
-.treeline.is_hidden_item .icon-folder,
-.treeline.is_hidden_item .icon-notebook,
-.treeline.is_hidden_item .icon-template,
-.treeline.is_hidden_item .name,
-.treeline.is_hidden_item .updateTS,
-.treeline.is_hidden_item:hover .icon-arrow_down,
-.treeline.is_hidden_item:hover .icon-arrow_right,
-.treeline.is_hidden_item:hover .icon-folder,
-.treeline.is_hidden_item:hover .icon-notebook,
-.treeline.is_hidden_item:hover .icon-template,
-.treeline.is_hidden_item:hover .name,
-.treeline.is_hidden_item:hover .updateTS {
-  color: #CCC;
-}
-.treeline img {
-  vertical-align: top;
-}
-.treeline .icon-arrow_right {
-  font-size: 33px;
-  margin-right: -10px;
-  margin-left: -3px;
-  vertical-align: -4px;
-}
-.treeInPopup .icon-arrow_right {
-  font-size: 23px;
-  margin-right: -6px;
-  line-height: 14px;
-  margin-left: -3px;
-}
-.treeline span {
-  /* 		float: left; */
-  margin-right: 5px;
-}
-.treeline .icon-template {
-  float: left;
-}
-.treeline .name {
-  overflow: hidden;
-  margin-left: 5px;
-}
-.treeInPopup .name {
-  font-size: 12px;
-  overflow: hidden;
-}
-.treeline .updateTS {
-  font-size: 15px;
-  float: right;
-  margin-right: 15px;
-}
-.treeline .tree_button {
-  float: right;
-  display: none;
-  margin-top: 0;
-  margin-right: 10px;
-}
-.droppable_folder {
-  background-color: #e4eef7 !important;
-}
-.hover_droppable_folder {
-  background-color: #d0e1f1 !important;
-}
-.treeline:hover .tree_button {
-  display: inline;
-}
-.treeline.active .tree_button {
-  display: inline;
-}
-.treeline_children {
-  display: none;
-  margin-left: 30px;
-}
-.treeInPopup .treeline_children {
-  margin-left: 20px;
-}
-.treeline_children_empty {
-  font-size: 15px;
-  font-style: italic;
-  padding: 10px 0 10px 30px;
-}
-.treeInPopup .treeline_children_empty {
-  font-size: 12px;
-  font-style: italic;
-  padding: 0 0 0 25px;
-}
-.treeInPopupContainer {
-  display: none;
-  background: white;
-  box-sizing: border-box;
-  max-height: 150px;
-  margin-top: 10px;
-  overflow-y: auto;
-  -webkit-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-}
-.treeInPopupContainer img {
-  display: block;
-  margin: auto;
-}
-.treeInPopup {
-  overflow-y: auto;
-  height: 148px;
-  padding-top: 10px;
-  margin-top: 2px;
-}
-.treeInPopup .treeline.selected {
-  background-color: #e6ebef;
-}
-.tree_my_eln_projects,
-.tree_my_eln_templates {
-  max-width: 900px;
-}
-.tree_my_eln_projects .folder_dn-img,
-.tree_my_eln_templates .folder_dn-img,
-.tree_my_eln_projects .project_s-img,
-.tree_my_eln_templates .project_s-img {
-  margin-top: 2px;
-}
-.treeline {
-  color: #4b6277;
-  background-repeat: no-repeat;
-  cursor: pointer;
-  border: 1px solid transparent;
-  display: block;
-  font-size: 14px;
-  height: 26px;
-  line-height: 20px;
-  outline: none;
-  padding: 2px 8px 2px 4px;
-  text-decoration: none;
-  transition: background 0.1s ease;
-}
-.treeline:hover {
-  background: #e0e6eb;
-  text-decoration: none;
-}
-.treeline .updateTS {
-  font-size: 13px;
-  float: right;
-  margin-right: 15px;
-}
-.treeline .tree_button {
-  float: right;
-  display: none;
-  margin: 0 10px;
-}
-.treeline .tree_button button {
-  padding: 3px;
-  background: transparent;
-  cursor: pointer;
-}
-.treeline .name {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  display: block;
-  overflow: hidden;
-  padding: 0;
-  margin-left: 0;
-  line-height: 1.5;
-  float: left;
-}
-.treeline .icon-template {
-  margin-top: 3px;
-}
-.more_options_panel {
-  position: absolute;
-  right: 10px;
-  z-index: 10;
-  display: none;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  border: solid 1px #bac7d4;
-}
-.more_options_panel > ul {
-  margin: 0;
-  padding: 0;
-}
-.more_options_panel > ul li {
-  list-style-type: none;
-}
-.more_options_panel .more_options_item {
-  min-width: 140px;
-  font-size: 12px;
-  padding-left: 5px;
-  cursor: pointer;
-}
-.more_options_panel .menu_arrow-img {
-  position: absolute;
-  top: -11px;
-  left: 60px;
-}
-.more_options_panel > ul > li {
-  padding: 2px 7px 2px 6px;
-  display: block;
-  text-align: left;
-  cursor: pointer;
-  line-height: 20px;
-  position: relative;
-}
-.more_options_panel > ul > li:hover {
-  background: #ecf0f3;
-}
-.more_options_panel > ul > li > span {
-  right: 0;
-  top: 3px;
-  position: absolute;
-}
-.more_options_panel > ul li:first-child {
-  margin-top: 8px;
-}
-.more_options_panel.in_tree {
-  top: 23px;
-}
-.group_more_options {
-  width: 200px;
-}
-
-/******************************
- 	WITNESS COLLECTION
-*******************************/
-.eln_main_content_box.witness {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  height: 95%;
-  margin: 0 25px 0 0;
-}
-#witness_header {
-  background: #EEE;
-  border-bottom: 1px solid #D6D4D5;
-  border-radius: 10px 10px 0 0;
-  display: block;
-  font-size: 14px;
-  height: 35px;
-  padding: 10px 0px 5px 15px;
-}
-#witness_content {
-  display: block;
-  line-height: 18px;
-  position: absolute;
-  overflow: auto;
-  padding: 10px;
-  top: 50px;
-  left: 0;
-  right: 0;
-  bottom: 0px;
-}
-.witness_empty_folder {
-  padding: 50px;
-  text-align: center;
-  font-size: 12px;
-}
-.witness_list {
-  font-size: 14px;
-}
-.witness_list table {
-  border-collapse: collapse;
-  outline: none;
-  table-layout: fixed;
-  width: 100%;
-}
-.witness_list table tr td:last-child {
-  font-size: 11px;
-}
-.witness_list_line {
-  border-bottom: 1px solid #DDD;
-  cursor: pointer;
-  height: 40px;
-  line-height: 40px;
-  white-space: nowrap;
-}
-.witness_list_line:hover {
-  background: #EEE;
-}
-.witness_list_line:first-child:hover {
-  background: none;
-  cursor: default;
-}
-.witness_line_name {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  vertical-align: bottom;
-  overflow: hidden;
-  padding-left: 10px;
-}
-.witness_line_text {
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.column_witness_name {
-  min-width: 100px;
-  width: 25%;
-}
-.column_witness_project {
-  min-width: 100px;
-  width: 60%;
-}
-.column_witness_date {
-  width: 106px;
-}
-
diff --git a/unittests/example_labfolder_data/static/css/data-elements.css b/unittests/example_labfolder_data/static/css/data-elements.css
deleted file mode 100644
index 5d451615..00000000
--- a/unittests/example_labfolder_data/static/css/data-elements.css
+++ /dev/null
@@ -1,104 +0,0 @@
-.data-elements {
-  display: block;
-  font-family: 'Open Sans', Helvetica, Arial, sans-serif;
-}
-.notebook-element-content {
-  height: calc(100% - 10px);
-  background: #FFF;
-  padding: 1.25em 0 0.75em;
-}
-.notebook-element-content .data-element {
-  display: block;
-  -webkit-touch-callout: none;
-  /* iOS Safari */
-  -webkit-user-select: none;
-  /* Chrome/Safari/Opera */
-  -khtml-user-select: none;
-  /* Konqueror */
-  -moz-user-select: none;
-  /* Firefox */
-  -ms-user-select: none;
-  /* Internet Explorer/Edge */
-  user-select: none;
-  /* Non-prefixed version, currently not supported by any browser */
-}
-/* Match element or class (class is used in compose mode) */
-.data-element-wrap {
-  margin-bottom: 0.75em;
-  margin-right: 1em;
-  display: flex;
-  align-items: baseline;
-  position: relative;
-}
-.data-element-wrap .data-element-icon {
-  width: 12px;
-  height: 12px;
-  margin: 0.65em;
-  margin-right: 0.75em;
-  margin-left: 1.15em;
-  fill: #9D9D9D;
-  flex-shrink: 0;
-}
-.data-element-wrap .data-element-display {
-  border: solid 1px #c0c0c0;
-  border-radius: 5px;
-  padding: 0.5em 0.75em;
-  overflow-wrap: break-word;
-  word-wrap: break-word;
-  -ms-word-break: break-all;
-  word-break: break-all;
-  word-break: break-word;
-}
-.data-element-wrap .data-element-display .empty-value {
-  color: #9D9D9D;
-  font-size: 1.75em;
-  line-height: 0.25em;
-}
-.data-element-wrap .data-element-display .element-title {
-  font-weight: bold;
-}
-.data-group-wrap .data-group-icon {
-  align-self: flex-start;
-}
-.data-group-wrap .data-group-content.display-mode {
-  /**
-   * Fix for nested flexbox sizing in IE11. See:
-   * https://github.com/philipwalton/flexbugs/issues/170
-   * https://github.com/philipwalton/flexbugs/issues/71
-   */
-  min-width: 0%;
-  border: solid 1px #c0c0c0;
-  border-radius: 5px;
-  padding: 0.5em 0.75em 0;
-}
-.data-group-wrap .data-group-content.display-mode .data-element-display {
-  border: none;
-  padding: 0;
-}
-.data-group-wrap .data-group-content .data-group-header .element-title {
-  font-weight: bold;
-}
-.data-group-wrap .data-group-content .data-element-icon {
-  margin: 0;
-  margin-right: 0.75em;
-}
-.data-group-wrap .data-group-content .data-group-icon {
-  margin-top: 0.75em;
-}
-.descriptive-element-wrap {
-  align-items: baseline;
-}
-.descriptive-element-wrap .descriptive-element-display .element-title {
-  font-weight: bold;
-}
-.material-element-wrap {
-  align-items: flex-start;
-}
-.material-element-wrap .material-element-display .element-title {
-  color: #6cc0ec;
-  font-weight: bold;
-  word-wrap: break-word;
-}
-.material-element-wrap .material-element-display .element-title:hover {
-  color: #96dbff;
-}
diff --git a/unittests/example_labfolder_data/static/css/eln_layout.css b/unittests/example_labfolder_data/static/css/eln_layout.css
deleted file mode 100644
index 97944ad5..00000000
--- a/unittests/example_labfolder_data/static/css/eln_layout.css
+++ /dev/null
@@ -1,3101 +0,0 @@
-/*******************
-*  eln_layout.css  *
-********************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-::selection {
-  background: #c5e6f8;
-}
-::-moz-selection {
-  background: #c5e6f8;
-}
-*,
-*::before,
-*::after {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-a {
-  cursor: pointer;
-}
-
-@font-face {
-  font-family: 'Oxygen';
-  src: url('/static/font/Oxygen-Regular.ttf');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'Oxygen Bold';
-  src: url('/static/font/Oxygen-Bold.woff');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'Source Sans Pro Light';
-  src: url('/static/font/SourceSansPro-Light.ttf');
-  font-weight: normal;
-  font-style: normal;
-}
-@font-face {
-  font-family: 'Source Sans Pro';
-  src: url('/static/font/SourceSansPro-Regular.woff');
-  font-weight: normal;
-  font-style: normal;
-}
-body {
-  font-size: 14px;
-  margin: 0;
-  padding: 0;
-  font-family: arial, sans-serif;
-  height: 100%;
-  width: 100%;
-}
-html {
-  height: 100%;
-}
-.body_bg {
-  background: #ffffff url(../img/squares.png);
-  height: 100%;
-  width: 100%;
-  position: fixed;
-  z-index: -1;
-  top: 33px;
-  left: -10px;
-}
-a {
-  text-decoration: none;
-  color: #1995d8;
-  outline: none;
-}
-a:hover {
-  text-decoration: none;
-}
-img {
-  border: 0;
-}
-button {
-  margin: 0;
-}
-button::-moz-focus-inner {
-  border: 0;
-}
-.clear {
-  clear: both;
-}
-.content_top_margin {
-  margin-top: 50px;
-}
-/******************************
- DEFAULT BLUE BUTTONS
-*******************************/
-.default_button {
-  border: 1px solid #455a6e;
-  padding: 4px 8px;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-  color: white;
-  opacity: 1;
-  line-height: 1.2;
-  background: #304d69;
-  font-size: 14px;
-  -webkit-transition: all 0.1s linear;
-  -moz-transition: all 0.1s linear;
-  -o-transition: all 0.1s linear;
-  transition: all 0.1s linear;
-  -webkit-backface-visibility: hidden;
-  cursor: pointer;
-  /* 	background-color:#374858; */
-  /* 	border:1px solid #ffffff; */
-  /* 	border-radius:6px; */
-  /*   	box-shadow:0px 0px 1px black; */
-  /* 	-webkit-box-sizing: border-box; */
-  /*     -moz-box-sizing: border-box; */
-  /*     box-sizing: border-box; */
-  /* 	color:#ffffff; */
-  /* 	cursor:pointer; */
-  /*   	display:inline-block; */
-  /*   	float:left; */
-  /* 	font-family:din-medi; */
-  /* 	font-size:14px; */
-  /* 	height:28px; */
-  /*    	line-height:28px; */
-  /* 	margin:0 1px 1px 0; */
-  /*   	outline: none; */
-  /*   	padding: 0 10px; */
-  /*   	transition: background-color 0.2s ease, box-shadow 0.2s ease; */
-}
-.default_button:hover,
-.default_button:focus {
-  background: #375877;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  color: white;
-  text-decoration: none;
-}
-.default_button:active {
-  background: #304d69;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.5);
-  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.5);
-  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.5);
-}
-.default_button:hover {
-  /* 	background-color: #607D99; */
-  /*   	text-decoration:none; */
-}
-.default_button:active {
-  opacity: 1.0;
-  /* 	  	box-shadow:0px 0px 10px #888888; */
-  /*   	text-decoration:none; */
-}
-.default_button.disabled {
-  opacity: 0.5;
-  /* 	background-color:#DDD; */
-  /* 	border:1px solid #FFF; */
-  /*   	box-shadow:0px 0px 1px #AAA; */
-  /* 	color:#AAA; */
-  /* 	cursor:default; */
-}
-/******************************
- DEFAULT FIELDS
-*******************************/
-.default_textfield {
-  background-color: white;
-  border: 0;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  font-family: Arial;
-  color: #4b6277;
-  font-size: 14px;
-  line-height: 1.8;
-  font-style: normal;
-  font-variant: normal;
-  font-weight: normal;
-  margin: 0 5px 5px 0;
-  padding-left: 5px;
-  min-height: 30px;
-  transition: box-shadow ease 0.2s;
-}
-.textfield_on_white {
-  border: solid 1px #bac7d4;
-}
-.default_textfield:hover {
-  /* 	box-shadow: 0 0 3px #69bfee;	 */
-}
-.default_textfield:focus {
-  /* 	border: 1px solid #69bfee; */
-  /* 	box-shadow: 0 0 6px #69bfee;	 */
-}
-/******************************
- DEFAULT SELECT
-*******************************/
-.default_select {
-  background: #FFF;
-  border: 1px solid #d9e1e8;
-  color: #4b6277;
-  cursor: pointer;
-  margin: 0 0 0 10px;
-  padding: 4px 4px 4px 8px;
-}
-.dialog_wide_select {
-  margin: 0;
-  width: 100%;
-}
-/******************************
- DEFAULT PROFILE PICTURE
-*******************************/
-img.default_profile_picture {
-  border: 1px solid #888;
-  height: 100px;
-  width: 100px;
-}
-img.default_profile_picture_small {
-  border: 1px solid #888;
-  height: 32px;
-  width: 32px;
-  margin-top: 3px;
-}
-/* ****************** */
-/* more_options START */
-/* ****************** */
-.more_options {
-  float: right;
-  position: relative;
-}
-.more_options_panel {
-  position: absolute;
-  right: 0;
-  z-index: 10;
-  display: none;
-  -webkit-box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 6px rgba(55, 72, 88, 0.3);
-  border: 1px solid #CDCDCD;
-  /* 	border-radius: 10px; */
-  background-color: #FDFDFD;
-}
-.more_options_panel.in_project {
-  top: 38px;
-}
-.more_options_panel.in_block {
-  top: 40px;
-}
-.more_options_item {
-  font-size: 12px;
-  /* 	line-height: 40px; */
-  padding-left: 12px;
-  padding-right: 12px;
-  cursor: pointer;
-  /* 	border-top: 1px solid #D6D4D5; */
-  transition: background ease 0.2s;
-}
-.more_options_item:hover {
-  /* 	background: #ededed; */
-  /* 	color: #69bfee; */
-}
-.more_options_item:first-child {
-  /* 	border-radius: 10px 10px 0 0; */
-  /* 	border: 0; */
-}
-.more_options_item:last-child {
-  /* 	border-radius: 0 0 10px 10px; */
-}
-.more_options_item span {
-  position: absolute;
-  right: 0;
-}
-div.zoom_bar {
-  width: 180px;
-  padding: 4px 14px !important;
-  height: 44px;
-  -webkit-user-select: none;
-  /* Chrome all / Safari all */
-  -moz-user-select: none;
-  /* Firefox all */
-  -ms-user-select: none;
-  /* IE 10+ */
-}
-div.zoom_bar:hover {
-  background: #e6ebef;
-}
-div.zoom_bar:hover {
-  color: #374858;
-}
-/* **************** */
-/* more_options END */
-/* **************** */
-/* ****************** */
-/* gear_button START */
-/* ****************** */
-/* ************ */
-/* layout START */
-/* ************ */
-/* generic rules */
-.eln_row {
-  left: 0;
-  right: 0;
-  /* 	overflow:hidden; */
-  position: absolute;
-}
-.eln_scroll-x {
-  overflow-x: auto;
-}
-.eln_scroll-y {
-  overflow-y: scroll;
-}
-/* specific rules */
-.eln_header.eln_row {
-  position: relative;
-  /* 	height:50px; */
-  /* 	background: #FFF; */
-  /* 	box-shadow:0 3px 10px #BBB; */
-  min-width: 800px;
-}
-.eln_content.eln_row {
-  top: 70px;
-  bottom: 0;
-  margin-left: 200px;
-  min-width: 600px;
-}
-.eln_main_title.eln_row {
-  top: 70px;
-  margin-right: 40px;
-  margin-left: 100px;
-  min-width: 436px;
-  overflow: visible;
-}
-.eln_main_content.eln_row {
-  top: 86px;
-  bottom: 0;
-  margin-left: 49px;
-  min-width: 600px;
-}
-.eln_folder_title.eln_row {
-  top: 70px;
-  margin-left: 100px;
-  min-width: 600px;
-  overflow: visible;
-}
-.eln_folder_content.eln_row {
-  top: 86px;
-  bottom: 0;
-  margin-left: 49px;
-  min-width: 640px;
-}
-.eln_project_title.eln_row {
-  top: 70px;
-  margin-left: 100px;
-  min-width: 640px;
-  overflow: visible;
-}
-.eln_project_content.eln_row {
-  top: 86px;
-  bottom: 0;
-  /* 	margin-left:100px; */
-  margin-left: 29px;
-  min-width: 600px;
-}
-.eln_main_content_box {
-  height: auto;
-  min-height: 400px;
-  margin: 0 25px 25px 0;
-  background-color: white;
-  border-bottom: solid 1px #cad4de;
-  border-left: solid 1px #cad4de;
-  border-right: solid 1px #cad4de;
-  position: relative;
-  padding: 20px 20px 20px 135px;
-  color: #4b6277;
-}
-.eln_main_content_box .header {
-  display: block;
-  font-size: 24px;
-  height: 35px;
-}
-.eln_main_content_box .header button {
-  margin-right: 10px;
-}
-.app_wrap {
-  position: relative;
-  background: #f3f5f7;
-  border: solid 1px #cad4de;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  height: calc(95% - 15px);
-}
-.app_content_wrap {
-  max-width: 900px;
-  padding: 10px;
-  display: block;
-  line-height: 18px;
-  position: absolute;
-  overflow: auto;
-  top: 10px;
-  left: 0;
-  right: 0;
-  bottom: 0px;
-}
-.app_header {
-  height: 29px;
-  background: #cad4de;
-  padding: 6px;
-}
-.app_header > h2 {
-  display: block;
-  float: left;
-  font-size: 14px;
-  margin: 0 13px 0 0;
-  color: #374858;
-}
-.app_header .filter_dn_wrap {
-  top: 23px;
-}
-.app_header .dropdown_button {
-  height: 20px;
-}
-.app_header .dropdown_button p {
-  margin: 0;
-  float: left;
-}
-.app_header .dropdown_button span {
-  height: 4px;
-  width: 12px;
-  display: block;
-  float: left;
-  margin: 2px 0 0 4px;
-}
-.app_plus_btn {
-  width: 35px;
-  height: 18px;
-  line-height: 1;
-  margin-right: 2px !important;
-  padding: 0;
-}
-.get_more_apps {
-  height: 100%;
-  padding: 20px;
-}
-/* ********** */
-/* layout END */
-/* ********** */
-/* ****************** */
-/* action links START */
-/* ****************** */
-.action_link_submit {
-  background: url(/static/img/design/action/submit.png) top right no-repeat;
-  width: 112px;
-  height: 25px;
-  display: block;
-}
-.action_link_submit:hover {
-  background-image: url(/static/img/design/action/submit_hover.png);
-}
-.action_link_signout {
-  background: url(/static/img/design/action/signout.png);
-  width: 83px;
-  height: 24px;
-  display: block;
-  float: right;
-  margin: 10px 0;
-}
-.action_link_signout:hover {
-  background: url(/static/img/design/action/signout_hover.png);
-}
-.action_link_profile {
-  background: url(/static/img/design/action/profile.png);
-  width: 71px;
-  height: 24px;
-  display: block;
-  float: right;
-  margin: 10px 0;
-}
-.action_link_profile:hover {
-  background: url(/static/img/design/action/profile_hover.png);
-}
-/* **************** */
-/* action links END */
-/* **************** */
-/* ************ */
-/* header START */
-/* ************ */
-/* LOGO */
-.eln_header_logo {
-  float: left;
-  padding-top: 7px;
-  padding-left: 17px;
-}
-/* Storage icon */
-#eln_header_storage_button {
-  background: none repeat scroll 0 0 transparent;
-  border: none;
-  cursor: pointer;
-  float: right;
-  font-size: 14px;
-  margin-top: 5px;
-  padding: 0;
-  height: 27px;
-  width: 32px;
-}
-#eln_header_storage_button span {
-  font-size: 10px;
-  margin-top: 14px;
-  position: absolute;
-  text-align: center;
-  width: 32px;
-  z-index: 6;
-}
-#eln_header_storage_stored {
-  background-color: #ededed;
-  height: 32px;
-  width: 32px;
-}
-#eln_header_storage_mask {
-  position: absolute;
-  z-index: 5;
-}
-#eln_header_storage_fill {
-  background-color: #BDCA70;
-  bottom: -5px;
-  position: absolute;
-  width: 32px;
-  z-index: 2;
-}
-/* Storage drop down panel */
-#eln_header_storage_panel {
-  background-color: #FFFFFF;
-  border: 3px solid #DDDDDD;
-  top: 53px;
-  z-index: 7;
-}
-#eln_header_storage_info {
-  cursor: default;
-}
-#eln_header_storage_info:hover {
-  color: #374858;
-}
-#eln_header_storage_info span {
-  font-size: 14px;
-  padding-right: 10px;
-  text-align: right;
-  width: 80px;
-}
-/* Storage percent bar */
-#eln_header_storage_bar_container {
-  float: right;
-  padding: 12px 10px 0;
-}
-#eln_header_storage_bar {
-  border: 1px solid #888;
-  height: auto;
-  line-height: 15px;
-  padding: 2px;
-  position: relative;
-  width: 80px;
-}
-span#eln_header_storage_bar_percent {
-  font-size: 12px;
-  line-height: 12px;
-  padding: 0;
-  position: absolute;
-  text-align: center;
-  width: 80px;
-}
-#eln_header_storage_bar_fill {
-  background-color: #bdca70;
-  height: 10px;
-}
-#eln_header_name {
-  display: inline-block;
-  line-height: 40px;
-  text-align: center;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  padding: 0 5px;
-  vertical-align: top;
-  white-space: nowrap;
-}
-#eln_header_name div {
-  display: inline;
-}
-#eln_header_actions {
-  margin-right: 43px;
-}
-#eln_header_actions_button {
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  background: none repeat scroll 0 0 transparent;
-  border: none;
-  cursor: pointer;
-  float: right;
-  font-size: 14px;
-  height: 50px;
-  margin: 0;
-  padding: 5px;
-}
-#eln_header_storage_button:hover,
-#eln_header_actions_button:hover {
-  cursor: pointer;
-  background: #ededed;
-  border: none;
-  border-radius: 0;
-}
-#eln_header_storage_button:active {
-  margin: 5px 1px 0px 0px;
-}
-div#eln_header_actions_button.active {
-  background: #ededed;
-  border: none;
-  border-radius: 0;
-  margin: 0;
-}
-#eln_header_arrow span {
-  font-size: 18px;
-}
-#eln_header_arrow {
-  display: inline-block;
-  margin-top: 8px;
-  padding-left: 5px;
-  vertical-align: top;
-}
-#eln_header_actions_panel {
-  background-color: #FFFFFF;
-  position: absolute;
-  top: 53px;
-  z-index: 7;
-}
-.eln_header_actions_item {
-  border-top: 1px solid #D6D4D5;
-  cursor: pointer;
-  font-size: 14px;
-  line-height: 40px;
-  padding: 0 20px;
-}
-.eln_header_actions_item:first-child {
-  border-top: 0;
-}
-.eln_header_actions_item span {
-  float: right;
-  font-size: 18px;
-  line-height: 18px;
-  padding-top: 12px;
-  text-align: center;
-  width: 36px;
-}
-.eln_header_actions_item:hover {
-  background: #ededed;
-  color: #69bfee;
-}
-.colorbar {
-  height: 4px;
-  background: url(/static/img/design/colorbar.png);
-}
-/* ************ */
-/* header END */
-/* ************ */
-/* **************** */
-/* navigation START */
-/* **************** */
-#eln_navigation {
-  position: fixed;
-  top: 70px;
-  width: 75px;
-  border-radius: 0 10px 0 0;
-  box-shadow: 0 3px 10px #888;
-  background: #FFF;
-  bottom: 0;
-  left: 0;
-  z-index: 2;
-  text-align: center;
-}
-#eln_navigation a {
-  border-bottom: 1px solid #d6d4d5;
-  display: block;
-  text-decoration: none;
-  padding: 10px 0;
-  font-size: 12px;
-  color: #374858;
-  transition: all ease 0.2s;
-}
-#eln_navigation a:hover {
-  background: #ededed;
-  color: #69bfee;
-}
-#eln_navigation a:first-child {
-  border-radius: 0 10px 0 0;
-}
-#eln_navigation span {
-  display: block;
-  font-size: 24px;
-  margin-bottom: 3px;
-}
-#eln_navigation span.icon-group {
-  font-size: 20px;
-  margin-left: 9px;
-}
-#eln_navigation span.icon-inventory {
-  margin-left: 4px;
-}
-#eln_navigation span.icon-template {
-  margin-left: 5px;
-}
-#eln_navigation .highlight {
-  color: #69bfee;
-}
-#eln_navigation .disabled,
-#eln_navigation .disabled:hover {
-  color: #ccc;
-}
-#eln_navigation button {
-  border: 5px solid white;
-  border-radius: 10px;
-  color: #FFF;
-  cursor: pointer;
-  font-size: 11px;
-  outline: none;
-  width: 70px;
-  height: 70px;
-}
-#feedback_button span,
-#invite_button span {
-  font-size: 22px;
-}
-#invite_button {
-  background-color: #bdca70;
-}
-#feedback_submit {
-  margin-right: 6px;
-  width: 60px;
-  height: 30px;
-  font-weight: bold;
-}
-#feedback_button {
-  background-color: #ad4e88;
-}
-.eln_navigation_support_buttons {
-  margin-top: 100px;
-}
-#feedback_panel {
-  display: none;
-  position: fixed;
-  top: -2px;
-  left: 0;
-  z-index: 102;
-  background: #d9e1e8;
-  border: 3px solid #ab48a9;
-  -webkit-box-shadow: 2px 6px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 2px 6px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 2px 6px 10px rgba(55, 72, 88, 0.3);
-}
-.feedback_title {
-  background: #ab48a9;
-  color: white;
-  padding: 5px;
-  text-align: center;
-  font-size: 15px;
-  line-height: 20px;
-}
-.feedback_title h4 {
-  display: inline-block;
-}
-.feedback_title img {
-  vertical-align: top;
-  margin-left: 10px;
-}
-.feedback_content {
-  padding: 10px;
-  width: 390px;
-}
-.feedback_content h4 {
-  font-size: 12px;
-}
-#feedback_panel h4 {
-  margin: 10px;
-  margin-bottom: 5px;
-}
-#feedback_comment {
-  margin: 0 10px 30px 10px;
-  margin-top: 0;
-  width: 350px;
-  height: 120px;
-}
-#feedback_submit_loader {
-  display: none;
-  margin: 8px 15px;
-}
-/* ************** */
-/* navigation END */
-/* ************** */
-/* ********* */
-/* EPB START */
-/* ********* */
-#epb_container {
-  /* 	padding-top: 10px; */
-  /* 	padding-bottom: 80px; */
-}
-img.imageOriginal {
-  border: 1px solid #DDD;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  transition: all linear 0.2s;
-}
-img.imageLayer {
-  left: 0;
-  margin-left: auto;
-  margin-right: auto;
-  position: absolute;
-  right: 0;
-  top: 0;
-  transition: all linear 0.2s;
-}
-#commentBlock {
-  border-radius: 10px;
-  cursor: pointer;
-  position: absolute;
-  right: 15px;
-  width: 200px;
-  background: #FFF;
-  top: 1px;
-}
-#epb_older_blocks_panel,
-#epb_newer_blocks_panel {
-  text-align: center;
-  color: #999;
-  height: 30px;
-  line-height: 30px;
-  margin: 10px 0;
-}
-.show_more_entries {
-  font-size: 13px;
-  margin: auto;
-  width: 300px;
-  background: white;
-  padding: 10px;
-  text-align: center;
-  -webkit-box-shadow: 0 3px 4px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 3px 4px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 3px 4px rgba(55, 72, 88, 0.3);
-}
-.show_more_entries span {
-  color: #1995d8;
-  cursor: pointer;
-}
-.epb_entry {
-  /* 	background-color: white; */
-  /* 	border: 1px solid #CCC; */
-  /* 	border-radius: 10px; */
-  display: inline-block;
-  /* 	margin-right:25px; */
-  margin-bottom: 20px;
-}
-#epb_container {
-  padding-bottom: 60px;
-}
-.epb_entry:last-child {
-  margin-bottom: 10px;
-}
-.epb_entry_removed {
-  border: 1px solid #F88;
-  box-sizing: border-box;
-}
-.epb_entry p {
-  margin: 0 !important;
-}
-.epb_header {
-  /* 	height: 35px; */
-  /* 	min-width: 640px; */
-  /* 	border-bottom: 1px solid #d6d4d5; */
-  /* 	padding: 10px 10px 0 10px; */
-  /* 	background-color: #ededed; */
-  /* 	border-radius: 10px 10px 0 0; */
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-}
-/* .epb_header_container { */
-/* 	height: 45px; */
-/* } */
-.epb_header_sticky {
-  position: fixed;
-  top: 86px;
-  z-index: 10;
-  transition: width ease-in 0.3s;
-}
-.epb_header_sticky div.action_button_text {
-  margin-left: 5px;
-}
-.epb_header_sticky div.more_options {
-  margin-right: 5px;
-}
-/*Hack for comments*/
-.epb_content_wrap {
-  display: table;
-  /* 	width: 100%; */
-}
-.epb_show_comments .epb_content_container {
-  display: table-cell;
-  width: 85%;
-}
-.epb_show_comments .comment_block_container {
-  display: table-cell;
-}
-/*End of comment Hack */
-.epb_footer {
-  font-size: 9px;
-  height: auto;
-  margin-left: 30px;
-  margin-right: 45px;
-  position: relative;
-  padding: 5px;
-  background: #cad4de;
-  border-top: solid 1px white;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-}
-.epb_footer_signing_infos {
-  display: inline-block;
-  text-align: left;
-}
-.epb_footer_witness_actions {
-  display: inline-block;
-  margin-right: 10px;
-}
-.epb_footer_witness_actions a {
-  padding-left: 10px;
-  line-height: 25px;
-}
-.epb_date {
-  border-right: 1px solid #d6d4d5;
-  margin-right: 10px;
-  padding-right: 10px;
-  padding-top: 2px;
-  font-size: 12px;
-  float: right;
-  text-align: right;
-}
-.epb_author {
-  border-right: 1px solid #d6d4d5;
-  margin-right: 10px;
-  padding-right: 10px;
-  padding-top: 2px;
-  padding-left: 5px;
-  font-size: 12px;
-  float: right;
-}
-.epb_author_picture {
-  border: 1px solid #d6d4d5;
-  float: right;
-  margin-top: 2px;
-}
-.epb_comments_alert {
-  /* 	color: #FFFFFF; */
-  /* 	float:right; */
-  /* 	margin-right: 5px; */
-  cursor: pointer;
-}
-.epb_comments_count {
-  /* 	position: relative; */
-  /* 	top: 7px; */
-  /* 	left: 50%; */
-  /* 	margin-left: 3px; */
-  /* 	vertical-align: top; */
-}
-.epb_header_action {
-  line-height: 24px;
-  padding-right: 15px;
-  padding-top: 2px;
-  font-size: 12px;
-  float: left;
-}
-.epb_default_slider_container {
-  cursor: pointer;
-}
-div.epb_relative_zoom {
-  margin-left: 2px;
-  font-size: 14px;
-  display: inline-block;
-  position: relative;
-  width: 12px;
-  height: 16px;
-  vertical-align: text-bottom;
-}
-div.epb_relative_zoom:hover {
-  /* 	color: #69bfee; */
-}
-.epb_default_slider {
-  background-color: #ededed;
-  border: 1px solid #DDDDDD;
-  border-radius: 7px;
-  box-shadow: #B6B4A8 0 1px 7px inset;
-  box-sizing: border-box;
-  cursor: pointer;
-  display: inline-block;
-  height: 14px;
-  max-width: 100%;
-  overflow: hidden;
-  padding: 0;
-  position: relative;
-  width: 114px;
-  margin: 0 5px 0 4px;
-}
-.epb_default_slider_active {
-  background-color: #EFEFE7;
-  border: 1px solid #99968F;
-  border-radius: 6px;
-  box-sizing: border-box;
-  height: 12px;
-  position: relative;
-  width: 12px;
-  transition: all ease 0.2s;
-  left: 0;
-  z-index: 2;
-}
-.epb_default_slider_active:hover {
-  box-shadow: #888888 -1px -1px 3px inset;
-}
-.epb_default_slider_active:active {
-  background-color: #DDD;
-  box-shadow: #AAA 1px 1px 2px inset;
-}
-.epb_default_slider_bar {
-  background: #69bfee;
-  /* fallback */
-  background: rgba(75, 177, 215, 0.5);
-  box-shadow: #B6B4A8 0 1px 7px inset;
-  box-sizing: border-box;
-  border-bottom-left-radius: 6px;
-  border-top-left-radius: 6px;
-  border: 0;
-  height: 16px;
-  margin-top: -14px;
-  padding: 0;
-  position: relative;
-  width: 0px;
-  transition: all ease 0.2s;
-  z-index: 1;
-}
-.epb_default_slider_zoom {
-  cursor: default;
-  display: block;
-  line-height: 30px;
-  width: 100%;
-  text-align: center;
-}
-.epb_text_save_cancel {
-  display: none;
-}
-.epb_text_save_cancel a {
-  padding-left: 10px;
-}
-.epb_file {
-  margin: 20px 0;
-}
-.epb_image {
-  margin: 20px 0;
-  position: relative;
-}
-.epb_image .imageLayer {
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-.epb_image_zoom {
-  margin-top: 5px;
-}
-.epb_image_zoom img {
-  cursor: pointer;
-}
-.epb_image_zoom_square {
-  background-color: transparent;
-  border: 1px solid #666;
-  margin: 0 1px;
-}
-.epb_image_zoom_square_active {
-  background-color: #666;
-}
-.epb_new_panel {
-  background: #ededed;
-  border: 2px solid #CCC;
-  border-bottom: none;
-  border-radius: 5px 5px 0 0;
-  bottom: 0;
-  height: 40px;
-  left: 50%;
-  margin-left: -250px;
-  padding: 5px;
-  position: absolute;
-  text-align: center;
-  z-index: 2;
-}
-.epb_new_panel_middle {
-  background: url(/static/img/design/epb_new_panel_middle.png) repeat-x;
-  float: left;
-  height: 55px;
-  padding-top: 25px;
-}
-.epb_new_panel_left {
-  background: url(/static/img/design/epb_new_panel_left.png) no-repeat;
-  float: left;
-  height: 80px;
-  width: 30px;
-  position: relative;
-}
-.epb_new_panel_right {
-  background: url(/static/img/design/epb_new_panel_right.png) no-repeat;
-  float: left;
-  height: 80px;
-  width: 30px;
-}
-.epb_new_panel .default_button {
-  margin: 0 5px;
-}
-#epb_new_panel_jump_to_end {
-  display: none;
-}
-#epb_new_panel_jump_to_end div {
-  float: left;
-  font-size: 14px;
-  line-height: 30px;
-}
-.epb_entry_removed_msg_head {
-  display: none;
-  margin: 0 200px;
-  text-align: center;
-  color: #F88;
-  padding-top: 5px;
-}
-/* ******* */
-/* EPB END */
-/* ******* */
-/* ******************* */
-/* block history START */
-/* ******************* */
-.block_history_table {
-  border-collapse: collapse;
-  width: 100%;
-}
-tr.history_row:nth-child(odd) {
-  background-color: #fff;
-  cursor: pointer;
-  height: 23px;
-}
-tr.history_row:nth-child(even) {
-  background-color: #f0f0f0;
-  cursor: pointer;
-  height: 23px;
-}
-.block_history_table td.col1 {
-  padding: 3px 0 3px 5px;
-}
-.block_history_table td.col2 {
-  padding: 3px 10px 3px 10px;
-}
-.block_history_table td.col3 {
-  padding: 3px 0;
-}
-#block_history_navigation {
-  position: absolute;
-  width: 350px;
-  bottom: 0;
-  top: 30px;
-  left: 0;
-  overflow: auto;
-  border-right: 2px solid #374858;
-}
-#block_history_item_content {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  top: 30px;
-  left: 350px;
-  padding: 0 20px;
-  overflow: scroll;
-}
-.block_history_row_selected {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  background-color: #DDD !important;
-  color: #4BB1D1;
-}
-/* ***************** */
-/* block history END */
-/* ***************** */
-/* ************** */
-/* plupload START */
-/* ************** */
-.plupload_select {
-  width: 110px;
-  height: 24px;
-  margin: 0 auto;
-}
-.plupload_drop {
-  border: 2px dashed black;
-  width: 200px;
-  height: 80px;
-  margin: 0 auto;
-  background-color: #77ff66;
-}
-#plupload_container {
-  position: absolute;
-  top: -100px;
-  left: 0;
-  width: 100px;
-  height: 50px;
-  overflow: hidden;
-}
-/* ************ */
-/* plupload END */
-/* ************ */
-/* *************** */
-/* workspace START */
-/* *************** */
-.workspace_header_actions {
-  height: 50px;
-}
-.workspace_header_actions .default_button {
-  margin-right: 15px;
-}
-.workspace_header_link {
-  margin-right: 15px;
-  line-height: 36px;
-}
-.workspace_header_link span {
-  font-weight: bold;
-}
-/** Modified at the end of the section
-.workspace_header {
-	background-color: #F3F3F3;
-	border: 1px solid #DDD;
-	line-height: 36px;
-	padding: 5px;
-	padding-left: 15px;
-}*/
-.workspace_header_path a {
-  outline: none;
-  color: #fff;
-  text-decoration: none;
-}
-.workspace_header_path a:hover {
-  color: #69bfee;
-}
-.project_list_children {
-  display: none;
-  margin-left: 30px;
-}
-.project_list_head {
-  border: 1px solid #DDD;
-  border-radius: 10px;
-  background-color: #f3f3f3;
-  padding: 10px 0;
-  height: 12px;
-}
-.project_list_head .name {
-  margin-left: 15px;
-}
-.project_list_head .updateTS {
-  float: right;
-  margin-right: 15px;
-}
-.project_list {
-  min-height: 350px;
-  margin: 0 25px 25px 0;
-  background-color: #ffffff;
-  border-bottom: solid 1px #cad4de;
-  border-left: solid 1px #cad4de;
-  border-right: solid 1px #cad4de;
-  position: relative;
-  padding: 20px 20px 20px 135px;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.1);
-}
-.project_list_line {
-  /* 	background: url(/static/icon/project40.png) no-repeat 0 -40px; */
-  display: block;
-  outline: none;
-  color: #4b6277;
-  cursor: pointer;
-  text-decoration: none;
-  line-height: 1.2;
-  font-size: 14px;
-  padding: 5px 15px;
-  border: 1px solid transparent;
-  overflow: hidden;
-}
-.project_list_line > span {
-  color: #4b6277;
-  line-height: 1.2;
-  font-size: 14px;
-}
-.project_list_line:hover {
-  background-position: 0 0;
-  background: #ecf0f3;
-  text-decoration: none;
-}
-.project_list_line.is_folder {
-  background: url(/static/icon/folder40.png) no-repeat 0 -40px;
-}
-.project_list_line:hover.is_folder {
-  background-position: 0 0;
-}
-.project_list_line.is_group {
-  /* 	background: url(/static/icon/group40.png) no-repeat 0 -40px; */
-}
-.project_list_line:hover.is_group {
-  background-position: 0 0;
-}
-.project_list_line img {
-  vertical-align: top;
-}
-.project_list_line .name {
-  font-size: 14px;
-}
-.project_list_line .updateTS {
-  font-size: 15px;
-  float: right;
-  margin-right: 15px;
-}
-a.order_link {
-  font-size: 12px;
-  outline: none;
-  color: #374858;
-  text-decoration: none;
-}
-a.order_link:hover {
-  color: #69bfee;
-}
-a.order_link_asc {
-  padding-right: 12px;
-  background: url(/static/icon/order_sign.png) no-repeat right -65px;
-}
-a.order_link_desc {
-  padding-right: 12px;
-  background: url(/static/icon/order_sign.png) no-repeat right -45px;
-}
-a.order_link_asc:hover {
-  padding-right: 12px;
-  background: url(/static/icon/order_sign.png) no-repeat right -25px;
-}
-a.order_link_desc:hover {
-  padding-right: 12px;
-  background: url(/static/icon/order_sign.png) no-repeat right -5px;
-}
-.workspace_header {
-  background: #374858 repeat-x 0 0;
-  border: 1px solid #DDD;
-  border-radius: 10px;
-  height: 35px;
-  line-height: 5px;
-  padding: 5px 10px;
-}
-.workspace_name {
-  color: #FFFFFF;
-  float: left;
-  font-size: 24px;
-  height: 32px;
-  line-height: 32px;
-  margin-top: 5px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  width: 90%;
-  white-space: nowrap;
-}
-.workspace_name a {
-  color: #FFF;
-}
-.workspace_name a:hover {
-  color: #69bfee;
-  text-decoration: none;
-}
-/* ************* */
-/* workspace END */
-/* ************* */
-/* ******************* */
-/* profile block START */
-/* ******************* */
-#user_settings_innovation_level_form select {
-  background: #ffffff;
-  border: 1px solid #d9e1e8;
-  color: #5e7b97;
-  cursor: pointer;
-  margin: 0 0 0 10px;
-  padding: 4px 4px 4px 8px;
-  outline: 0;
-}
-#profile_picture_edit_panel {
-  float: left;
-  margin-right: 20px;
-  margin-bottom: 15px;
-  padding-left: 5px;
-}
-#profile_picture_edit_panel img {
-  border: 1px solid #bac7d4;
-  margin-top: 10px;
-  width: 100px;
-  height: 100px;
-}
-.profile_block {
-  padding-left: 15px;
-  width: 550px;
-  margin-bottom: 20px;
-}
-.profile_block_edit {
-  display: block;
-  float: right;
-  margin-right: 5px;
-  font-size: 12px;
-}
-.profile_edit .placeholder_frame {
-  margin: 0 5px 5px 0;
-}
-.project_pdf_export_list {
-  background: #ffffff;
-  border: 1px solid #DDD;
-  height: 125px;
-  margin: 15px 0 30px 0;
-  padding: 5px;
-  overflow-y: scroll;
-}
-.project_pdf_export_list div {
-  line-height: 18px;
-  height: 18px;
-  overflow: hidden;
-}
-.pdf_range_export label {
-  display: block;
-  text-align: left;
-}
-/*FIND A BETTER WAY WITH last-child*/
-#profile_contact {
-  border: none;
-  padding-bottom: 0px;
-}
-#profile_picture_edit_link {
-  position: relative;
-}
-#profile_picture_edit_panel span {
-  opacity: 0;
-  height: 25px;
-  left: 0;
-  line-height: 25px;
-  position: absolute;
-  text-align: center;
-  top: 86px;
-  width: 100px;
-  -webkit-transition: all 0.3s ease;
-  -moz-transition: all 0.3s ease;
-  -o-transition: all 0.3s ease;
-  transition: all 0.3s ease;
-}
-#profile_picture_edit_panel:hover span {
-  background: rgba(75, 98, 119, 0.95);
-  opacity: 1;
-  color: white;
-}
-.profile_block_img {
-  display: block;
-}
-#updatePersonalForm .placeholder_frame {
-  float: none;
-  width: 380px;
-}
-.profile_block_key {
-  float: left;
-  font-weight: bold;
-  font-size: 12px;
-  height: 24px;
-  line-height: 24px;
-  margin-bottom: 10px;
-  width: 100px;
-}
-#profile_settings .profile_block_key {
-  padding-left: 5px;
-  width: 200px;
-}
-#profile_settings .profile_block h2 {
-  margin: 0 0 15px 0;
-}
-.edit_wrap {
-  width: 100%;
-  height: 10px;
-}
-.profile_block_value {
-  float: left;
-  line-height: 24px;
-  font-size: 12px;
-}
-.general_setting_item {
-  margin-bottom: 20px;
-}
-.profile_block_value input[type=text],
-.profile_block_value input[type=password] {
-  width: 330px;
-}
-.profile_block_error {
-  color: red;
-  display: block;
-  line-height: 20px;
-}
-.cancel_save_panel {
-  float: right;
-  margin-right: 5px;
-  line-height: 36px;
-  margin-top: 20px;
-}
-.cancel_save_panel .cancel {
-  float: left;
-  padding-right: 10px;
-  font-size: 12px;
-}
-.profile_block h1 {
-  margin: 0;
-  font-size: 14px;
-}
-.profile_block h2 {
-  margin: 0 0 5px 0;
-  padding: 0 0 2px 4px;
-  color: #7b95ad;
-  border-bottom: 1px solid #9baec0;
-  font-size: 12px;
-  font-weight: normal;
-}
-.profile_show {
-  padding: 10px 0 2px 4px;
-  margin-bottom: 20px;
-}
-.profile_edit {
-  padding: 10px 0 2px 4px;
-  float: left;
-  display: block;
-}
-.profile_edit_personal {
-  width: 400px;
-}
-.profile_block h3 {
-  font-size: 12px;
-  margin: 10px 0;
-  font-weight: normal;
-}
-.profile_section {
-  min-height: 100px;
-  display: block;
-  overflow: auto;
-  margin-bottom: 20px;
-}
-.profile_prof_head {
-  width: 400px;
-}
-.profile_name_field {
-  width: 200px;
-}
-.placeholder_frame label.profile_personalEdit {
-  padding: 5px;
-}
-.profileTitle_field {
-  width: 200px;
-}
-#profile_personal .profile_show div {
-  display: inline;
-}
-/* ***************** */
-/* profile block END */
-/* ***************** */
-/* ******************** */
-/* sticky infobox START */
-/* ******************** */
-.sticky_infobox {
-  width: 350px;
-  height: 310px;
-  background: url(/static/img/design/sticky_infobox_big.png) 0 0 no-repeat;
-  padding: 50px 65px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-}
-/* ****************** */
-/* sticky infobox END */
-/* ****************** */
-/* ************ */
-/* search START */
-/* ************ */
-.search_wrap {
-  padding-left: 15px;
-}
-.search_wrap .placeholder_frame {
-  height: 30px;
-}
-.search_wrap .placeholder_frame input {
-  height: 30px;
-}
-.search_wrap .placeholder_frame label {
-  padding: 4px 0 0 5px;
-  font-size: 14px;
-}
-.search_wrap .placeholder_frame button.search_button {
-  height: 30px;
-}
-.top_searchbox_form {
-  float: right;
-  position: relative;
-  top: 12px;
-  padding-right: 10px;
-}
-.search_result_item {
-  padding-bottom: 20px;
-  width: 560px;
-}
-.search_result_item_title {
-  text-decoration: underline;
-  font-size: 12px;
-}
-.search_result_item_title:hover {
-  text-decoration: underline;
-  color: #3b97ed;
-}
-.search_result_item_text {
-  font-size: 12px;
-}
-#search_result_load_more_spinner {
-  display: none;
-}
-#search_result_load_more_link {
-  display: none;
-}
-#search_result_error_message {
-  display: none;
-  color: red;
-}
-#search_result_num_all_results {
-  display: none;
-  color: #999;
-  font-size: 12px;
-  padding: 3px;
-}
-.search_result_content {
-  padding-top: 20px;
-}
-/* ********** */
-/* search END */
-/* ********** */
-.default_font {
-  font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif;
-  font-size: 15px;
-  line-height: 1.45em;
-  white-space: normal;
-}
-#data_element {
-  display: none;
-}
-
-/**************/
-/* IE WARNING */
-/**************/
-#ie_warning {
-  display: none;
-  background-color: #E66873;
-  color: #FFF;
-  font-size: 14px;
-  height: 30px;
-  left: 50%;
-  line-height: 14px;
-  margin-left: -310px;
-  padding: 5px;
-  position: fixed;
-  text-align: center;
-  width: 550px;
-  z-index: 9999;
-}
-a#ie_warning_close {
-  color: #FFF;
-  float: right;
-  font-size: 12px;
-  cursor: pointer;
-}
-a#ie_warning_update {
-  color: #FFF;
-  font-size: 14px;
-  text-decoration: underline;
-}
-/****************************/
-/* admin active weeks START */
-/****************************/
-.activeWeeksTable {
-  border-spacing: 0;
-  border-collapse: collapse;
-  font-size: 8px;
-  background-color: #e5e5e5;
-  text-align: center;
-}
-.activeWeeksTable th {
-  border: 1px solid #374858;
-}
-.activeWeeksTable td {
-  border: 1px solid #374858;
-}
-.activeWeeksTable .week {
-  width: 20px;
-  height: 20px;
-}
-.activeWeeksTable .week.status1 {
-  background-color: white;
-}
-.activeWeeksTable .week.status2 {
-  background-color: #fcc;
-}
-.activeWeeksTable .week.status3 {
-  background-color: #cfc;
-}
-.activeWeeksTable .week.status3 {
-  background-color: #cfc;
-}
-.activeWeeksTable .premium {
-  background-color: #cfc;
-}
-/**************************/
-/* admin active weeks END */
-/**************************/
-/**************************/
-/* pdf viewer       START */
-/**************************/
-#pdf_viewer {
-  border: 0;
-  display: block;
-  height: 100%;
-  width: 100%;
-}
-/**************************/
-/* pdf viewer         END */
-/**************************/
-.activeExcelSheet {
-  font-weight: bold;
-}
-a.editor_reference {
-  color: #a21621;
-  cursor: pointer;
-  font-weight: bold;
-  text-decoration: none;
-}
-.pdf_checkbox_label {
-  line-height: 32px;
-  margin-left: 25px;
-}
-.pdf_checkbox_sublabel {
-  line-height: 32px;
-  margin-left: 45px;
-}
-.pdf_setting_description {
-  margin-left: 50px;
-  font-size: 12px;
-}
-.pdf_filename_label {
-  display: block;
-  margin: 10px 0 10px 32px;
-}
-/**************************/
-/*          END */
-/**************************/
-#block_history_item_content .extract_preview_link,
-.readOnly .extract_preview_link {
-  display: none;
-}
-.extract_preview {
-  overflow: auto;
-}
-.extract_preview_confirm {
-  float: right !important;
-  margin-right: 25px;
-}
-/*********************/
-/* jsTemplates START */
-/*********************/
-#jsTemplates {
-  display: none;
-}
-p.jsTemplate_dialog_title {
-  display: none;
-}
-/*******************/
-/* jsTemplates END */
-/*******************/
-/***************/
-/* popup START */
-/***************/
-.popup {
-  display: none;
-  position: absolute;
-  top: 0;
-  bottom: 0;
-  left: 0;
-  right: 0;
-  z-index: 98;
-  -moz-opacity: .8;
-  opacity: 0.8;
-  background-color: white !important;
-}
-.popup_window {
-  display: none;
-  position: absolute;
-  z-index: 99;
-  background-color: white;
-  /* 	border: 2px solid #374858; */
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-}
-.popup_window_default {
-  top: 75px;
-  bottom: 75px;
-  left: 75px;
-  right: 75px;
-}
-#my_popup_inner {
-  background-color: #cad4de;
-}
-.popup_dialog {
-  display: none;
-  position: absolute;
-  z-index: 99;
-  background-color: #cad4de;
-  top: 30%;
-  left: 50%;
-  width: 400px;
-  margin-top: -125px;
-  margin-left: -200px;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.8);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.8);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.8);
-}
-.popup_title {
-  height: 30px;
-  line-height: 30px;
-  margin-top: -1px;
-  padding-left: 5px;
-  background: #304d69;
-  color: white;
-}
-.popup_title_close {
-  font-size: 20px;
-  width: 20px;
-  height: 20px;
-  text-align: center;
-  line-height: 20px;
-  float: right;
-  cursor: pointer;
-  margin: 4px;
-}
-.popup_title_left {
-  float: left;
-}
-.popup_title_center {
-  text-align: center;
-}
-.popup_title_center span {
-  display: none;
-}
-.popup_loading_image {
-  margin: 50px auto;
-  background: url(/static/img/ajax-loader-big.gif) no-repeat;
-  width: 32px;
-  height: 32px;
-}
-.popup_dialog .popup_dialog_content {
-  max-height: 650px;
-  overflow: auto;
-  padding: 10px;
-}
-.popup_dialog_cancel_save_panel {
-  float: right;
-  margin-top: 10px;
-  line-height: 30px;
-}
-.popup_dialog_cancel_save_panel .cancel {
-  float: left;
-  padding-right: 5px;
-  font-size: 12px;
-  visibility: hidden;
-}
-.popup_dialog_cancel_save_panel .dialog_confirm {
-  visibility: hidden;
-}
-#import_footer .dialog_confirm {
-  visibility: visible;
-}
-.popup_dialog_cancel_save_panel .default_button {
-  margin-left: 5px;
-}
-.popup_scroll_content {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-  top: 30px;
-  left: 0;
-  padding: 10px;
-  overflow: auto;
-}
-.popup_list_row {
-  padding-bottom: 15px;
-  margin-bottom: 15px;
-  border-bottom: 1px solid #DDD;
-}
-.popup_list_row .default_button {
-  float: right;
-}
-.popup_list_row .deny_link {
-  float: right;
-  line-height: 36px;
-  font-size: 12px;
-  margin: 0 5px;
-}
-.popup_list_row_desc {
-  padding-top: 12px;
-  margin-right: 125px;
-}
-.popup_dialog_error {
-  background-color: #E66873;
-  color: #FFF;
-  display: none;
-  font-size: 14px;
-  line-height: 18px;
-  padding: 5px;
-  text-align: center;
-}
-.popup_dialog_loading_button {
-  padding: 0 10px;
-}
-#my_popup_content {
-  height: calc(100% - 29px);
-  overflow: auto;
-}
-.input_block {
-  margin-bottom: 20px;
-  word-wrap: break-word;
-  font-size: 12px;
-}
-.input_block .folder_up-img {
-  background-position: -738px -5px;
-  width: 24px;
-  height: 13px;
-}
-.tagline_hidden {
-  display: none;
-}
-.input_title {
-  margin: 10px 0 5px;
-  font-size: 12px;
-  color: #4b6277;
-}
-#my_popup_content .input_title:first-of-type {
-  /* 	margin: 0 0 5px 0; */
-}
-#my_popup_content .spinner {
-  display: block;
-  margin: auto;
-}
-#my_popup_content textarea {
-  color: #4b6277;
-  line-height: 1.4;
-  font-size: 14px;
-  height: 150px;
-  resize: none;
-}
-/*************/
-/* popup END */
-/*************/
-/**************************/
-/* custom selectbox START */
-/**************************/
-div.lfSelectBox {
-  position: relative;
-  cursor: pointer;
-  background-color: white;
-  width: 0;
-  float: left;
-}
-div.lfSelectTitle {
-  border: 1px solid black;
-}
-div.lfSelectOptions {
-  position: absolute;
-  border: 1px solid black;
-  background: white;
-  z-index: 99;
-  display: none;
-}
-div.lfSelectOption:hover {
-  color: #E7E7E7;
-  background: #3988e5;
-}
-/************************/
-/* custom selectbox END */
-/************************/
-/* ************ */
-/* button START */
-/* ************ */
-a.btn,
-button.btn {
-  background: transparent url(/static/img/button/button_right.gif) no-repeat scroll top right;
-  border: 0;
-  color: #666;
-  cursor: pointer;
-  display: block;
-  float: left;
-  font-size: 14px;
-  line-height: 16px;
-  height: 24px;
-  margin-right: 6px;
-  outline: none;
-  padding-right: 16px;
-  padding-top: 0;
-  text-decoration: none;
-}
-a.btn span,
-button.btn span {
-  background: transparent url(/static/img/button/button_left.gif) no-repeat;
-  display: block;
-  padding: 4px 0 4px 18px;
-}
-a.btn img,
-button.btn img {
-  vertical-align: top;
-}
-a.btn:active,
-button.btn:active {
-  background-position: bottom right;
-}
-a.btn:active span,
-button.btn:active span {
-  background-position: bottom left;
-  padding: 5px 0 3px 18px;
-}
-/* a.btn36, button.btn36 { */
-/* 	background-color: transparent; */
-/* 	border: 0; */
-/* 	margin: 0; */
-/* 	padding: 0; */
-/* 	color: white; */
-/* 	cursor: pointer; */
-/* 	display: block; */
-/* 	float: left; */
-/* 	font-size: 14px; */
-/* 	line-height: 16px; */
-/* 	height: 36px; */
-/* 	outline: none; */
-/* 	text-decoration: none; */
-/* 	font-family: 'din-medi'; */
-/* } */
-/* a.btn36 img, button.btn36 img { */
-/* 	vertical-align: top; */
-/* 	margin-right: 7px; */
-/* } */
-/* a.btn36 span, button.btn36 span { */
-/* 	display: block; */
-/* 	float: left; */
-/* } */
-/* a.btn36 span.m, button.btn36 span.m { */
-/* 	background: url(/static/img/button/b36_m.png) repeat-x 0 0; */
-/* 	height: 16px; */
-/* 	padding: 10px 1px 10px 1px; */
-/* } */
-/* a.btn36 span.l, button.btn36 span.l { */
-/* 	background: url(/static/img/button/b36_l.png) no-repeat 0 0; */
-/* 	width: 15px; */
-/* 	height: 36px; */
-/* } */
-/* a.btn36 span.r, button.btn36 span.r { */
-/* 	background: url(/static/img/button/b36_r.png) no-repeat 0 0; */
-/* 	width: 15px; */
-/* 	height: 36px; */
-/* } */
-/* a.btn36:hover span, button.btn36:hover span { */
-/* 	background-position: 0 -36px; */
-/* } */
-/* a.btn36:active span, button.btn36:active span { */
-/* 	background-position: 0 -72px; */
-/* } */
-/* a.btn36:active span.m, button.btn36:active span.m { */
-/* 	padding: 11px 0px 9px 2px; */
-/* } */
-/* ********** */
-/* button END */
-/* ********** */
-/* ************ */
-/* errors START */
-/* ************ */
-.errorBox {
-  border: 1px solid red;
-}
-.errorInput {
-  background-color: red;
-}
-.errorMessage {
-  color: red;
-}
-/* ********** */
-/* errors END */
-/* ********** */
-/* *********************** */
-/* input placeholder START */
-/* *********************** */
-.placeholder_frame {
-  position: relative;
-  float: left;
-}
-.placeholder_frame label {
-  position: absolute;
-  padding: 7px 0 0 5px;
-  top: 2px;
-  left: 0;
-  color: #9baec0;
-  font-style: italic;
-  font-family: Arial;
-  cursor: text;
-  font-size: 14px;
-}
-.placeholder_frame input {
-  padding: 5px;
-  margin: 0;
-  font-size: 14px;
-  line-height: 14px;
-  color: #4b6277;
-}
-.placeholder_frame button {
-  position: absolute;
-  height: 28px;
-  padding: 7px;
-  top: 0;
-  right: 0;
-}
-.placeholder_frame input.searchbox_input {
-  width: 250px ;
-  padding-right: 30px;
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-}
-.placeholder_frame.big label {
-  font-size: 20px;
-  padding: 10px 0 0 12px;
-}
-.placeholder_frame.big input {
-  padding: 10px;
-  padding-right: 50px;
-  width: 500px;
-  font-size: 20px;
-  line-height: 20px;
-}
-.placeholder_frame.big button {
-  padding: 10px;
-  font-size: 20px;
-}
-/* *********************** */
-/* input placeholder END */
-/* *********************** */
-/* ************ */
-/* inputs START */
-/* ************ */
-.input_with_padding {
-  padding: 3px;
-  width: 100%;
-}
-.form_around_input_with_padding {
-  padding-right: 5px;
-}
-/* ********** */
-/* inputs END */
-/* ********** */
-.aligned_radio_button {
-  display: -moz-inline-box;
-  display: inline-block;
-  vertical-align: middle;
-  line-height: 18px;
-  margin-bottom: 5px;
-}
-input {
-  outline: 0;
-}
-textarea {
-  outline-color: #69bfee;
-}
-input[type="checkbox"].default_checkbox {
-  position: absolute;
-  opacity: 0;
-}
-input[type="checkbox"].default_checkbox + div {
-  cursor: pointer;
-  display: inline-block;
-  vertical-align: middle;
-  width: 46px;
-  height: 13px;
-  border: 1px solid rgba(55, 72, 88, 0.47);
-  border-radius: 999px;
-  margin: 0 .5em;
-  background: #f9fafb;
-  background-image: linear-gradient(rgba(176, 205, 231, 0.2), rgba(0, 0, 0, 0)), linear-gradient(90deg, #374858, rgba(0, 0, 0, 0) 65%);
-  background-size: 200% 100%;
-  background-position: 100% 0;
-  background-origin: border-box;
-  background-clip: border-box;
-  overflow: hidden;
-  transition-duration: .3s;
-  transition-property: padding, width, background-position, text-indent;
-  box-shadow: 0 0.2em 0.4em rgba(14, 27, 37, 0.12) inset, 0 0.45em 0 0.1em rgba(45, 98, 133, 0.05) inset;
-  font-size: 150%;
-}
-input[type="checkbox"].default_checkbox:checked + div {
-  padding-left: 33px;
-  width: 46px;
-  background-position: 0 0;
-}
-input[type="checkbox"].default_checkbox + div:before {
-  content: 'On';
-  float: left;
-  width: 13px;
-  height: 13px;
-  margin: -1px;
-  border: 1px solid rgba(55, 72, 88, 0.35);
-  border-radius: inherit;
-  background: white;
-  background-image: linear-gradient(#8fa1b4, transparent);
-  box-shadow: 0 0.1em 0.1em 0.1em rgba(255, 255, 255, 0.8) inset, 0 0 0.5em rgba(55, 72, 88, 0.3);
-  color: white;
-  text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.3);
-  text-indent: -2.5em;
-}
-input[type="checkbox"].default_checkbox:active + div:before {
-  background-color: #eee;
-}
-input[type="checkbox"].default_checkbox + div:before,
-input[type="checkbox"].default_checkbox + div:after {
-  font-size: 9px;
-  line-height: 12px;
-  font-weight: bold;
-  text-transform: uppercase;
-}
-input[type="checkbox"].default_checkbox + div:after {
-  content: 'Off';
-  float: left;
-  text-indent: .5em;
-  color: #4b6277;
-  text-shadow: none;
-}
-/* Draggable */
-div.action_button.dragging_helper {
-  width: 42px;
-  height: 24px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  padding: 2px 10px;
-  background-image: url('/static/img/design/blank.png') !important;
-  background-color: #FFF;
-  border-radius: 2px;
-  box-shadow: 0 1px 4px #646464;
-  color: #69bfee;
-  cursor: pointer;
-  opacity: 0.8;
-  text-decoration: none;
-  z-index: 50;
-}
-a.dragging_helper {
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  background-image: url('/static/img/design/blank.png') !important;
-  background-color: #FFF;
-  border-radius: 2px;
-  box-shadow: 1px 1px 5px #000;
-  color: #69bfee;
-  cursor: pointer;
-  opacity: 0.5;
-  padding: 10px 30px;
-  text-decoration: none;
-  z-index: 50;
-}
-.dialog_message_form textarea {
-  min-height: 150px;
-}
-/*************
-* header css *
-**************/
-.arrow_box {
-  position: relative;
-  background: white;
-}
-.arrow_box:after,
-.arrow_box:before {
-  bottom: 100%;
-  left: 50%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-}
-.arrow_box:after {
-  border-color: rgba(0, 0, 0, 0);
-  border-bottom-color: white;
-  border-width: 5px;
-  margin-left: -4px;
-}
-.arrow_box:before {
-  border-color: rgba(0, 0, 0, 0);
-  border-bottom-color: #bac7d4;
-  border-width: 6px;
-  margin-left: -5px;
-}
-.headerbar_top {
-  width: 100%;
-  height: 50px;
-  background: white;
-  border-bottom: solid 1px #bac7d4;
-}
-.headerbar_top > header {
-  margin: 21px 0 0 65px;
-  font-weight: bold;
-  float: left;
-  position: relative;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  color: #415568;
-}
-.headerbar_top > header:hover .page_title {
-  position: absolute;
-  overflow: visible;
-  white-space: normal;
-  display: block;
-  margin-left: 21px;
-  z-index: 999;
-  background: white;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-}
-.headerbar_top h1 {
-  font-size: 14px;
-  font-weight: normal;
-  margin: 0;
-}
-.headerbar_top > nav {
-  float: right;
-  height: 50px;
-}
-.headerbar_top a {
-  color: inherit;
-  text-decoration: none;
-  cursor: pointer;
-}
-.page_title {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  display: block;
-  overflow: hidden;
-  padding: 0;
-  background: white;
-  margin-left: 0;
-}
-.page_title a {
-  white-space: nowrap;
-}
-.nav_top {
-  float: left;
-  margin: 0 100px 0 10px;
-}
-.nav_top > ul {
-  margin: 0;
-  padding: 0;
-}
-.nav_top > ul > li {
-  width: 72px;
-  height: 49px;
-  margin-left: -1px;
-  list-style-type: none;
-  float: left;
-  position: relative;
-  -webkit-transition: all 0.2s ease;
-  -moz-transition: all 0.2s ease;
-  -o-transition: all 0.2s ease;
-  transition: all 0.2s ease;
-}
-.header_btn {
-  width: 100%;
-  height: 100%;
-  color: #4b6277;
-  padding: 0;
-  text-align: center;
-  font-size: 10px;
-  position: relative;
-  cursor: pointer;
-  background: transparent;
-  border-left: solid 1px transparent;
-  border-right: solid 1px transparent;
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-  -webkit-transition: all 0.2s ease;
-  -moz-transition: all 0.2s ease;
-  -o-transition: all 0.2s ease;
-  transition: all 0.2s ease;
-}
-.header_btn span {
-  margin-left: auto;
-  margin-right: auto;
-  margin-top: 2px;
-  display: block;
-  float: none;
-}
-.header_btn p {
-  margin: 7px 0;
-}
-.header_btn:hover {
-  background: #f3f5f7;
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  border-left: solid 1px #cad4de;
-  border-right: solid 1px #cad4de;
-  padding-top: 0;
-}
-.header_btn:active {
-  background: #d9e1e8;
-  padding-top: 0;
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-}
-.nav_top_active {
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  background: #e0e6eb !important;
-  border-left: solid 1px #cad4de !important;
-  border-right: solid 1px #cad4de !important;
-}
-.manage_hover:hover .header_btn {
-  background: #f3f5f7;
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.1);
-  border-left: solid 1px #bac7d4;
-  border-right: solid 1px #bac7d4;
-  padding-top: 0px;
-}
-.manage_hover:active .header_btn {
-  background: #d9e1e8;
-  padding-top: 0px;
-  -webkit-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 6px rgba(55, 72, 88, 0.2);
-}
-.manage_dropdown {
-  position: absolute;
-  top: 49px;
-  left: 0;
-  font-size: 13px;
-  z-index: 999;
-}
-.manage_dropdown li {
-  width: 120px;
-}
-.manage_dropdown > span {
-  position: absolute;
-  top: -11px;
-  left: 25px;
-}
-.header_top_dropdown {
-  background: white;
-  display: none;
-  border: solid 1px #bac7d4;
-  border-right: solid 1px #bac7d4;
-  border-bottom: solid 1px #bac7d4;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  font-size: 13px;
-}
-.header_top_dropdown > ul {
-  margin: 0;
-  padding: 0;
-}
-.header_top_dropdown > ul li {
-  list-style-type: none;
-}
-.header_top_dropdown > ul {
-  padding: 12px 0 12px 0;
-}
-.header_top_dropdown > ul > li {
-  display: block;
-  text-align: left;
-  cursor: pointer;
-}
-.header_top_dropdown > ul > li > a {
-  padding: 8px 0 8px 12px;
-  display: block;
-}
-.header_top_dropdown > ul > li:hover {
-  background: #ecf0f3;
-}
-.bread_arrow {
-  font-size: 11px;
-}
-.options_top {
-  float: right;
-  margin: 10px 0 0 10px;
-  position: relative;
-}
-.options_top > ul {
-  margin: 0;
-  padding: 0;
-}
-.options_top > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-.options_top > ul > li {
-  width: 40px;
-  height: 50px;
-  margin-right: 15px;
-  display: block;
-  float: left;
-  font-size: 10px;
-  position: relative;
-}
-.options_top > ul > li:first-child > span {
-  margin-left: 10px;
-}
-.signout_wrap {
-  position: relative;
-  display: block;
-  width: 40px;
-  height: 32px;
-}
-.notes_count {
-  padding: 2px 2px 1px 2px;
-  line-height: 10px;
-  color: white;
-  background: #22a6ee;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-  position: absolute;
-  text-align: right;
-  left: 20px;
-  top: 0px;
-}
-.avatar {
-  border-radius: 50%;
-  width: 28px;
-  height: 28px;
-  background: #cad4de;
-  margin-top: -3px;
-  float: left;
-  -webkit-box-shadow: 0px 1px 2px rgba(55, 72, 88, 0.6);
-  -moz-box-shadow: 0px 1px 2px rgba(55, 72, 88, 0.6);
-  box-shadow: 0px 1px 2px rgba(55, 72, 88, 0.6);
-}
-.avatar span {
-  display: block;
-  float: none;
-}
-.avatar img {
-  border-radius: 50%;
-  width: 28px;
-  height: 28px;
-  position: absolute;
-}
-.avatar .avatar-img {
-  margin: 3px 0 0 4px;
-}
-.avatar .arrow_down_s-img {
-  position: absolute;
-  top: 12px;
-  right: 2px;
-}
-.dropdown_button {
-  cursor: pointer;
-}
-.search_dropdown {
-  width: 250px;
-  height: 51px;
-  padding: 10px;
-  position: absolute;
-  top: 39px;
-  left: -111px;
-  z-index: 999;
-}
-.search_dropdown > span {
-  position: absolute;
-  top: -11px;
-  left: 114px;
-}
-.search_dropdown input {
-  height: 30px;
-  width: 100%;
-  font-size: 14px;
-  color: #4b6277;
-  padding-left: 4px;
-  display: block;
-  margin: auto;
-  border: solid 1px #bac7d4;
-}
-.search_dropdown button {
-  position: absolute;
-  top: 10px;
-  right: 10px;
-  padding: 7px;
-  height: 30px;
-}
-.bell_dropdown {
-  position: absolute;
-  top: 39px;
-  left: -166px;
-  font-size: 12px;
-  line-height: 1.4;
-  z-index: 99;
-  max-height: 530px;
-  overflow-y: auto;
-  overflow-x: hidden;
-}
-.bell_dropdown > span {
-  position: absolute;
-  top: -11px;
-  left: 169px;
-}
-.bell_dropdown li {
-  width: 250px;
-  padding: 8px 0 8px 8px;
-}
-.bell_dropdown li span {
-  color: #69bfee;
-  font-weight: bold;
-}
-.bell_dropdown li article {
-  width: 200px;
-  display: inline-block;
-  margin-left: 10px;
-}
-.bell_dropdown li p {
-  color: #9baec0;
-  margin: 5px 0;
-}
-.bell_dropdown li:last-child {
-  text-align: center;
-  margin: 14px 0 -12px 0 !important;
-  background: #d9e1e8;
-}
-.profile_dropdown {
-  position: absolute;
-  top: 39px;
-  left: -70px;
-  font-size: 13px;
-  z-index: 999;
-  width: 120px;
-}
-.profile_dropdown > span {
-  position: absolute;
-  top: -11px;
-  left: 77px;
-}
-.profile_dropdown ul > li {
-  padding-left: 10px;
-}
-.profile_dropdown ul > li a {
-  width: 100%;
-}
-.med_blue_btn {
-  padding: 8px 17px 8px 17px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  color: white;
-  opacity: 1;
-  background: #3277b8;
-  font-size: 16px;
-  -webkit-transition: all 0.1s linear;
-  -moz-transition: all 0.1s linear;
-  -o-transition: all 0.1s linear;
-  transition: all 0.1s linear;
-  -webkit-backface-visibility: hidden;
-}
-.med_blue_btn:hover,
-.med_blue_btn:focus {
-  background: #2a6398;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  color: white;
-  text-decoration: none;
-}
-.med_blue_btn:active {
-  background: #245684;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.4);
-  -moz-box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.4);
-  box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.4);
-}
-.orange_btn {
-  padding: 4px 17px 5px 17px;
-  -webkit-border-radius: 3px;
-  -moz-border-radius: 3px;
-  border-radius: 3px;
-  color: #ffffff;
-  opacity: 1;
-  background: #e37900;
-  font-size: 20px;
-  -webkit-transition: all 0.1s linear;
-  -moz-transition: all 0.1s linear;
-  -o-transition: all 0.1s linear;
-  transition: all 0.1s linear;
-  -webkit-backface-visibility: hidden;
-}
-.upgrade_box {
-  position: relative;
-  background: #ffffff;
-  display: inline-block;
-  vertical-align: middle;
-  margin-right: 6px;
-}
-.upgrade_btn {
-  color: white;
-  background: #ff8617;
-  border: 0;
-  opacity: 1;
-  position: absolute;
-  top: 44px;
-  right: 40px;
-  border-radius: 3px;
-  color: white !important;
-  text-decoration: none;
-  padding: 3px 16px;
-  font-weight: bold;
-  height: 22px;
-  margin-top: 3px;
-  font-size: 14px;
-  display: block;
-}
-.upgrade_btn:hover {
-  background: #ffa14a;
-  outline: 0;
-}
-.upgrade_btn:active {
-  background: #ff8617;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.3);
-  box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.3);
-}
-.upgrade_box:after {
-  left: 100%;
-  top: 50%;
-  border: solid rgba(0, 0, 0, 0);
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(213, 213, 213, 0);
-  border-left-color: #ffffff;
-  border-width: 4px;
-  margin-top: -5px;
-}
-.filterbox_wrap {
-  position: relative;
-  float: left;
-  min-width: 100px;
-  width: auto;
-}
-.filterbox_wrap .filter_btn {
-  border-left: solid 1px #bac7d4;
-  border-right: solid 1px #bac7d4;
-  border-top: solid 1px #bac7d4;
-}
-.filterbox_task_wrap {
-  position: relative;
-  float: left;
-  min-width: 150px;
-}
-.filterbox_task_wrap .filter_btn {
-  border-left: solid 1px #bac7d4;
-  border-right: solid 1px #bac7d4;
-  border-top: solid 1px #bac7d4;
-}
-.filter_box_dropdown {
-  width: auto;
-  min-width: 100px;
-  padding: 10px 0;
-  float: left;
-  border: solid 1px #cad4de;
-  background: white;
-  font-size: 12px;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.2);
-}
-.filter_box_dropdown > ul {
-  margin: 0;
-  padding: 0;
-}
-.filter_box_dropdown li {
-  list-style-type: none;
-  padding: 8px 8px 8px 8px;
-  cursor: pointer;
-}
-.filter_box_dropdown li:hover {
-  background: #ecf0f3;
-}
-.notebook_notification {
-  font-size: 16px;
-  margin: 40px auto;
-  width: 390px;
-  padding: 20px;
-  background: #ffffff;
-  -webkit-box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-}
-/*********************
-* overwrite jqueryUI *
-*********************/
-.ui-datepicker {
-  -webkit-box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-}
-.ui-corner-all,
-.ui-corner-bottom,
-.ui-corner-right,
-.ui-corner-br {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-}
-.ui-widget-header {
-  border: 0 /*{borderColorHeader}*/;
-  background: #d9e1e8;
-  color: #4b6277;
-  /*{fcHeader}*/
-  font-weight: normal;
-}
-.ui-datepicker .ui-datepicker-prev,
-.ui-datepicker .ui-datepicker-next {
-  border: 0;
-  position: absolute;
-  top: 0;
-  width: 1.8em;
-  height: 100%;
-}
-.ui-datepicker .ui-datepicker-prev:hover,
-.ui-datepicker .ui-datepicker-next:hover {
-  border: 0;
-  background: #bac7d4;
-}
-.ui-datepicker th {
-  padding: .7em .3em;
-  text-align: center;
-  font-weight: normal;
-  color: #4b6277;
-  border: 0;
-}
-.ui-widget-content {
-  border: 1px solid #9baec0;
-  background: #ecf0f3;
-  color: #4b6277;
-}
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
-  border: 1px solid #cad4de;
-  background: white;
-  font-weight: normal /*{fwDefault}*/;
-}
-.ui-state-hover,
-.ui-widget-content .ui-state-hover,
-.ui-widget-header .ui-state-hover,
-.ui-state-focus,
-.ui-widget-content .ui-state-focus,
-.ui-widget-header .ui-state-focus {
-  border: 1px solid #bac7d4 /*{borderColorHover}*/;
-  background: #e4eef7;
-  font-weight: normal /*{fwDefault}*/;
-  color: #4b6277;
-  /*{fcHover}*/
-}
-.ui-state-default,
-.ui-widget-content .ui-state-default,
-.ui-widget-header .ui-state-default {
-  color: #4b6277;
-}
-.ui-state-hover .ui-icon,
-.ui-state-focus .ui-icon {
-  background-image: none;
-}
-.ui-widget-header .ui-icon {
-  background-image: none;
-}
-.ui-icon {
-  overflow: visible !important;
-}
-.ui-icon-circle-triangle-w {
-  position: relative;
-  background: white;
-  display: inline-block;
-  height: 0;
-  width: 0;
-}
-.ui-icon-circle-triangle-w:after {
-  right: 100%;
-  top: 50%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(136, 183, 213, 0);
-  border-right-color: #4b6277;
-  border-width: 8px;
-  margin-top: -7px;
-}
-.ui-icon-circle-triangle-e {
-  position: relative;
-  background: white;
-  display: inline-block;
-  height: 0;
-  width: 0;
-}
-.ui-icon-circle-triangle-e:after {
-  left: 100%;
-  top: 50%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(136, 183, 213, 0);
-  border-left-color: #4b6277;
-  border-width: 8px;
-  margin-top: -7px;
-}
-.ui-datepicker .ui-datepicker-prev span,
-.ui-datepicker .ui-datepicker-next span {
-  display: block;
-  position: absolute;
-  left: 50%;
-  margin-left: -2px;
-  top: 50%;
-  margin-top: 0px;
-}
-.ui-tooltip {
-  padding: 5px 10px;
-  background: #374858;
-  -webkit-box-shadow: 0 2px 3px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 3px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 3px rgba(55, 72, 88, 0.3);
-  font: normal 14px;
-  color: white;
-  border: 0;
-  z-index: 11;
-}
-.ui-tooltip:after {
-  bottom: 100%;
-  left: 13px;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: transparent;
-  border-bottom-color: #374858;
-  border-width: 7px;
-  margin-left: -7px;
-}
-/****************
-* media queries *
-****************/
-@media (max-width: 1750px) {
-  .headerbar_top > header {
-    width: 30%;
-  }
-}
-@media (max-width: 1160px) {
-  .group_content_block {
-    width: 100%;
-  }
-  .headerbar_top > header {
-    width: 30%;
-    margin: 19px 0 0 20px;
-  }
-  .eln_main_content_box,
-  .project_list {
-    padding: 20px 20px 20px 20px;
-    width: auto;
-  }
-  #messages_content,
-  #task_content,
-  #comments_content {
-    padding: 0 10px 0 10px;
-  }
-}
-@media (max-width: 1100px) {
-  .author_firstname,
-  .author_lastname {
-    width: 100px;
-  }
-}
-@media (max-width: 970px) {
-  .nav_top {
-    margin: 0 30px 0 10px;
-  }
-  .headerbar_top > header {
-    width: 200px;
-  }
-  .page_title {
-    margin-top: 2px;
-    font-size: 12px;
-  }
-  .author_firstname,
-  .author_lastname {
-    width: 66px;
-  }
-  .group_content_box {
-    padding: 20px;
-  }
-  .profile_block {
-    max-width: 550px;
-    width: calc(100% - 25px);
-  }
-}
-@media (max-height: 600px) {
-  .popup_dialog {
-    top: 50%;
-  }
-}
-
diff --git a/unittests/example_labfolder_data/static/css/export-entry-footer.css b/unittests/example_labfolder_data/static/css/export-entry-footer.css
deleted file mode 100644
index 22800c8c..00000000
--- a/unittests/example_labfolder_data/static/css/export-entry-footer.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.entry_footer {
-    background: #cad4de;
-    margin-left: 30px;
-    margin-right: 45px;
-    padding-top: 2px;
-    padding-bottom: 2px;
-    min-width: 696px;
-    height: auto;
-    font-size: 0.6em;
-}
-
-.entry_footer > span {
-    color: #748dad;
-    font-weight: 900;
-    padding: 8px 8px 6px 8px;
-}
-
-.entry_footer_line {
-    margin-top: 2px;
-    height: auto;
-    display: flex;
-    flex-direction: column;
-    position: relative;
-    padding: 5px 5px 5px 22px;
-    background: #f2f5f7;
-    border-left: solid 1px #aabbca;
-    border-right: solid 1px #aabbca;
-}
-
-.entry_footer_signature > img {
-    position: absolute;
-    right: 10px;
-    margin-top: -2px;
-    height: 30px;
-}
-
-.width_80_percent {
-    width: 80%;
-}
-
-.min_height_35 {
-    min-height: 35px;
-}
diff --git a/unittests/example_labfolder_data/static/css/export-table-element.css b/unittests/example_labfolder_data/static/css/export-table-element.css
deleted file mode 100644
index b1032434..00000000
--- a/unittests/example_labfolder_data/static/css/export-table-element.css
+++ /dev/null
@@ -1,35 +0,0 @@
-.table-el-container, .well-plate-el-container {
-    padding: 100px 10px;
-    min-height: calc(100% - 10px) !important;
-    height: 243px;
-    background: white;
-    text-align: center;
-}
-
-.table-el-info, .well-plate-el-info {
-    color: #bababa;
-}
-
-.table-el-download, .well-plate-el-download {
-    margin-top: 8px;
-}
-
-.table-el-download > a, .well-plate-el-download > a {
-    color: #6cc0ec;
-}
-
-.table-el-icon, .well-plate-el-icon {
-    width: 16px;
-    height: 16px;
-    vertical-align: middle;
-    margin-right: 0.2em;
-    fill: #6cc0ec;;
-    flex-shrink: 0;
-}
-
-.table-el-filename, .well-plate-el-filename {
-    display: inline-block;
-    vertical-align: middle;
-    font-size: 16px;
-    word-break: break-all
-}
diff --git a/unittests/example_labfolder_data/static/css/jquery-ui.css b/unittests/example_labfolder_data/static/css/jquery-ui.css
deleted file mode 100644
index 3f4d674f..00000000
--- a/unittests/example_labfolder_data/static/css/jquery-ui.css
+++ /dev/null
@@ -1,474 +0,0 @@
-/*! jQuery UI - v1.9.2 - 2012-11-23
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css, jquery.ui.theme.css
-* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; }
-.ui-helper-clearfix:after { clear: both; }
-.ui-helper-clearfix { zoom: 1; }
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
-
-.ui-accordion .ui-accordion-header { display: block; cursor: pointer; position: relative; margin-top: 2px; padding: .5em .5em .5em .7em; zoom: 1; }
-.ui-accordion .ui-accordion-icons { padding-left: 2.2em; }
-.ui-accordion .ui-accordion-noicons { padding-left: .7em; }
-.ui-accordion .ui-accordion-icons .ui-accordion-icons { padding-left: 2.2em; }
-.ui-accordion .ui-accordion-header .ui-accordion-header-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
-.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; overflow: auto; zoom: 1; }
-
-.ui-autocomplete {
-	position: absolute;
-	top: 0;
-	left: 0;
-	cursor: default;
-}
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
-.ui-button, .ui-button:link, .ui-button:visited, .ui-button:hover, .ui-button:active { text-decoration: none; }
-.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
-button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; } 
-button.ui-button-icons-only { width: 3.7em; } 
-
-/*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4;  }
-.ui-button-text-only .ui-button-text { padding: .4em 1em; }
-.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
-.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
-.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
-.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
-/* no icon support for input elements, provide padding by default */
-input.ui-button { padding: .4em 1em; }
-
-/*button icon element(s) */
-.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
-.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
-.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
-.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
-.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
-
-/*button sets*/
-.ui-buttonset { margin-right: 7px; }
-.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
-
-/* workarounds */
-button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
-
-.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
-.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
-.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
-.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
-.ui-datepicker .ui-datepicker-prev { left:2px; }
-.ui-datepicker .ui-datepicker-next { right:2px; }
-.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
-.ui-datepicker .ui-datepicker-next-hover { right:1px; }
-.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
-.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
-.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
-.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
-.ui-datepicker select.ui-datepicker-month, 
-.ui-datepicker select.ui-datepicker-year { width: 49%;}
-.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
-.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
-.ui-datepicker td { border: 0; padding: 1px; }
-.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
-.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
-.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi { width:auto; }
-.ui-datepicker-multi .ui-datepicker-group { float:left; }
-.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
-.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
-.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
-.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
-.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
-
-/* RTL support */
-.ui-datepicker-rtl { direction: rtl; }
-.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-
-/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
-.ui-datepicker-cover {
-    position: absolute; /*must have*/
-    z-index: -1; /*must have*/
-    filter: mask(); /*must have*/
-    top: -4px; /*must have*/
-    left: -4px; /*must have*/
-    width: 200px; /*must have*/
-    height: 200px; /*must have*/
-}
-.ui-dialog { position: absolute; top: 0; left: 0; padding: .2em; width: 300px; overflow: hidden; }
-.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; }
-.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
-.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
-.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
-.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
-.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
-.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
-.ui-draggable .ui-dialog-titlebar { cursor: move; }
-
-.ui-menu { list-style:none; padding: 2px; margin: 0; display:block; outline: none; }
-.ui-menu .ui-menu { margin-top: -3px; position: absolute; }
-.ui-menu .ui-menu-item { margin: 0; padding: 0; zoom: 1; width: 100%; }
-.ui-menu .ui-menu-divider { margin: 5px -2px 5px -2px; height: 0; font-size: 0; line-height: 0; border-width: 1px 0 0 0; }
-.ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.5; zoom: 1; font-weight: normal; }
-.ui-menu .ui-menu-item a.ui-state-focus,
-.ui-menu .ui-menu-item a.ui-state-active { font-weight: normal; margin: -1px; }
-
-.ui-menu .ui-state-disabled { font-weight: normal; margin: .4em 0 .2em; line-height: 1.5; }
-.ui-menu .ui-state-disabled a { cursor: default; }
-
-/* icon support */
-.ui-menu-icons { position: relative; }
-.ui-menu-icons .ui-menu-item a { position: relative; padding-left: 2em; }
-
-/* left-aligned */
-.ui-menu .ui-icon { position: absolute; top: .2em; left: .2em; }
-
-/* right-aligned */
-.ui-menu .ui-menu-icon { position: static; float: right; }
-
-.ui-progressbar { height:2em; text-align: left; overflow: hidden; }
-.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px; display: block; }
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}
-.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
-
-.ui-slider { position: relative; text-align: left; }
-.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
-.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
-
-.ui-slider-horizontal { height: .8em; }
-.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
-.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
-.ui-slider-horizontal .ui-slider-range-min { left: 0; }
-.ui-slider-horizontal .ui-slider-range-max { right: 0; }
-
-.ui-slider-vertical { width: .8em; height: 100px; }
-.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
-.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
-.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
-.ui-slider-vertical .ui-slider-range-max { top: 0; }
-.ui-spinner { position:relative; display: inline-block; overflow: hidden; padding: 0; vertical-align: middle; }
-.ui-spinner-input { border: none; background: none; padding: 0; margin: .2em 0; vertical-align: middle; margin-left: .4em; margin-right: 22px; }
-.ui-spinner-button { width: 16px; height: 50%; font-size: .5em; padding: 0; margin: 0; text-align: center; position: absolute; cursor: default; display: block; overflow: hidden; right: 0; }
-.ui-spinner a.ui-spinner-button { border-top: none; border-bottom: none; border-right: none; } /* more specificity required here to overide default borders */
-.ui-spinner .ui-icon { position: absolute; margin-top: -8px; top: 50%; left: 0; } /* vertical centre icon */
-.ui-spinner-up { top: 0; }
-.ui-spinner-down { bottom: 0; }
-
-/* TR overrides */
-.ui-spinner .ui-icon-triangle-1-s {
-	/* need to fix icons sprite */
-	background-position:-65px -16px;
-}
-
-.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
-.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 0; margin: 1px .2em 0 0; border-bottom: 0; padding: 0; white-space: nowrap; }
-.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-active { margin-bottom: -1px; padding-bottom: 1px; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-active a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-tabs-loading a { cursor: text; }
-.ui-tabs .ui-tabs-nav li a, .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-
-.ui-tooltip {
-	padding: 8px;
-	position: absolute;
-	z-index: 9999;
-/* 	max-width: 300px; labfolder hack*/ 
-	-webkit-box-shadow: 0 0 5px #aaa;
-	box-shadow: 0 0 5px #aaa;
-}
-/* Fades and background-images don't work well together in IE6, drop the image */
-* html .ui-tooltip {
-	background-image: none;
-}
-body .ui-tooltip { border-width: 2px; }
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; }
-.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; }
-.ui-widget-content a { color: #222222/*{fcContent}*/; }
-.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; }
-.ui-widget-header a { color: #222222/*{fcHeader}*/; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; }
-.ui-state-hover a, .ui-state-hover a:hover, .ui-state-hover a:link, .ui-state-hover a:visited { color: #212121/*{fcHover}*/; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-.ui-state-disabled .ui-icon { filter:Alpha(Opacity=35); } /* For IE8 - See #6059 */
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
-.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/; }
-.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; }
-.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/; }
-.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/; }
-.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-on { background-position: -96px -144px; }
-.ui-icon-radio-off { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; }
-.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; }
-
-/* Overlays */
-.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; }
-.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; }
\ No newline at end of file
diff --git a/unittests/example_labfolder_data/static/css/notebook.css b/unittests/example_labfolder_data/static/css/notebook.css
deleted file mode 100644
index 75a33689..00000000
--- a/unittests/example_labfolder_data/static/css/notebook.css
+++ /dev/null
@@ -1,2194 +0,0 @@
-/****************
-* notebook.less *
-*****************/
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-#action_buttons {
-  display: inline-block;
-  float: right;
-  height: 250px;
-  left: 50%;
-  margin-left: 410px;
-  position: fixed;
-  top: 110px;
-  width: 150px;
-}
-/****************
-* button + input*
-****************/
-button {
-  border: 0;
-  font-size: 12px;
-  padding: 3px 4px;
-  -webkit-border-radius: 2px;
-  -moz-border-radius: 2px;
-  border-radius: 2px;
-}
-button:focus {
-  opacity: 1;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-}
-.search_button {
-  -webkit-border-radius: 0;
-  -moz-border-radius: 0;
-  border-radius: 0;
-  border: solid 1px #bac7d4 !important;
-}
-.btn_on_grey {
-  color: #415568;
-  background: #f3f5f7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e0e6eb), color-stop(1, #f3f5f7));
-  background: -ms-linear-gradient(bottom, #e0e6eb, #f3f5f7);
-  background: -moz-linear-gradient(center bottom, #e0e6eb 0%, #f3f5f7 100%);
-  background: -o-linear-gradient(#f3f5f7, #e0e6eb);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f5f7', endColorstr='#e0e6eb', GradientType=0);
-  border: 1px solid #7b95ad;
-  line-height: 1.2;
-}
-.btn_on_grey:hover {
-  color: #415568;
-  background: #f3f5f7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e0e6eb), color-stop(1, #f3f5f7));
-  background: -ms-linear-gradient(bottom, #e0e6eb, #f3f5f7);
-  background: -moz-linear-gradient(center bottom, #e0e6eb 0%, #f3f5f7 100%);
-  background: -o-linear-gradient(#f3f5f7, #e0e6eb);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3f5f7', endColorstr='#e0e6eb', GradientType=0);
-  outline: 0;
-  border: 1px solid #5e7b97;
-  -webkit-box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-  -moz-box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-  box-shadow: 0 0 8px rgba(255, 255, 255, 0.5);
-}
-.btn_on_grey:active {
-  color: #4b6277;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #4b6277;
-  background: #cad4de;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e0e6eb), color-stop(1, #cad4de));
-  background: -ms-linear-gradient(bottom, #e0e6eb, #cad4de);
-  background: -moz-linear-gradient(center bottom, #e0e6eb 0%, #cad4de 100%);
-  background: -o-linear-gradient(#cad4de, #e0e6eb);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cad4de', endColorstr='#e0e6eb', GradientType=0);
-}
-.btn_on_white {
-  color: #4b6277;
-  background: #e6ebef;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d9e1e8), color-stop(1, #e6ebef));
-  background: -ms-linear-gradient(bottom, #d9e1e8, #e6ebef);
-  background: -moz-linear-gradient(center bottom, #d9e1e8 0%, #e6ebef 100%);
-  background: -o-linear-gradient(#e6ebef, #d9e1e8);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6ebef', endColorstr='#d9e1e8', GradientType=0);
-  border: 1px solid #cad4de;
-  opacity: 1;
-  line-height: 13px;
-}
-.btn_on_white:hover:enabled {
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  border: 1px solid #b4c2d0;
-}
-.btn_on_white:active {
-  color: #4b6277;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #c7d2dc;
-  background: #d9e1e8;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d9e1e8), color-stop(1, #d0d9e2));
-  background: -ms-linear-gradient(bottom, #d9e1e8, #d0d9e2);
-  background: -moz-linear-gradient(center bottom, #d9e1e8 0%, #d0d9e2 100%);
-  background: -o-linear-gradient(#d0d9e2, #d9e1e8);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d0d9e2', endColorstr='#d9e1e8', GradientType=0);
-}
-.btn_on_white.disabled {
-  opacity: 0.6;
-}
-.btn_on_white.disabled:active {
-  color: #4b6277;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0);
-  border: 1px solid #cad4de;
-  background: #e6ebef;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #d9e1e8), color-stop(1, #e6ebef));
-  background: -ms-linear-gradient(bottom, #d9e1e8, #e6ebef);
-  background: -moz-linear-gradient(center bottom, #d9e1e8 0%, #e6ebef 100%);
-  background: -o-linear-gradient(#e6ebef, #d9e1e8);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e6ebef', endColorstr='#d9e1e8', GradientType=0);
-}
-.btn_on_white.disabled:hover {
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  border: 1px solid #cad4de;
-}
-.filter_btn {
-  color: #526c84;
-  background: #ecf0f3;
-  height: 24px;
-  padding: 2px 8px;
-  font-size: 12px;
-  cursor: pointer;
-  -webkit-border-radius: 0px;
-  -moz-border-radius: 0px;
-  border-radius: 0px;
-  -webkit-transition: all 0.1s ease;
-  -moz-transition: all 0.1s ease;
-  -o-transition: all 0.1s ease;
-  transition: all 0.1s ease;
-}
-.filter_btn > span {
-  height: 4px;
-  width: 12px;
-  display: block;
-  float: left;
-  margin: 2px 0 0 8px;
-}
-.filter_btn > p {
-  margin: 0;
-  float: left;
-}
-.filter_btn:hover {
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.1);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.1);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.1);
-  background: #e0e6eb;
-  padding-top: 2px;
-}
-.filter_btn:active {
-  -webkit-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  background: #cdd7e0;
-}
-span.close-x {
-  display: block;
-  float: left;
-  margin: 0 0 0 8px;
-  display: none;
-}
-.filter_on {
-  background: #527ca3;
-  color: white;
-}
-.filter_on:hover,
-.filter_on:active {
-  background: #527ca3;
-  color: #e0e6eb;
-}
-.filter_active {
-  background: #5b96cd;
-  color: #ffffff;
-}
-.filter_active .arrow_down_s-img:after {
-  border-top-color: white;
-}
-.filter_active:hover {
-  background: #5b96cd;
-  color: #e6ebef;
-}
-.grey_link {
-  color: #4b6277;
-  background: transparent;
-  font-size: 12px;
-  padding: 0;
-  text-decoration: underline;
-  display: block;
-  cursor: pointer;
-}
-.grey_link:hover {
-  color: #415568;
-  text-decoration: underline;
-}
-.grey_link:active {
-  text-decoration: none;
-}
-.blue_link {
-  color: #1995d8;
-  background: transparent;
-  font-size: 12px;
-  padding: 0;
-  text-decoration: underline;
-  display: block;
-  cursor: pointer;
-}
-.blue_link:hover {
-  color: #69bfee;
-  text-decoration: underline;
-}
-.blue_link:active {
-  color: #1995d8;
-  text-decoration: none;
-}
-.feedback_btn {
-  color: white;
-  border: 1px solid #994097;
-  font-weight: bold;
-  font-size: 14px;
-  padding: 5px 0 5px 5px;
-  position: absolute;
-  top: 213px;
-  left: -2px;
-  z-index: 101;
-  background: #ab48a9;
-  cursor: pointer;
-}
-.feedback_btn > p {
-  margin: 0;
-}
-.feedback_btn:hover,
-.feedback_btn:focus {
-  background: #ab48a9;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #bc60ba), color-stop(1, #ab48a9));
-  background: -ms-linear-gradient(bottom, #bc60ba, #ab48a9);
-  background: -moz-linear-gradient(center bottom, #bc60ba 0%, #ab48a9 100%);
-  background: -o-linear-gradient(#ab48a9, #bc60ba);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ab48a9', endColorstr='#bc60ba', GradientType=0);
-}
-.feedback_btn:active {
-  opacity: 1;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #873986;
-  background: #ab48a9;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #c575c3), color-stop(1, #ab48a9));
-  background: -ms-linear-gradient(bottom, #c575c3, #ab48a9);
-  background: -moz-linear-gradient(center bottom, #c575c3 0%, #ab48a9 100%);
-  background: -o-linear-gradient(#ab48a9, #c575c3);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ab48a9', endColorstr='#c575c3', GradientType=0);
-}
-.feedback_btn_dialog {
-  color: white;
-  font-weight: bold;
-  font-size: 16px;
-  padding: 8px 10px;
-  background: #ab48a9;
-  cursor: pointer;
-  border: 0;
-  display: block;
-  margin: 90px auto 20px auto;
-}
-.feedback_btn_dialog > p {
-  margin: 0;
-}
-.feedback_btn_dialog:hover {
-  color: #e5c1e4;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-}
-.feedback_btn_dialog:active {
-  -webkit-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-}
-.invite_btn_dialog {
-  color: white;
-  font-weight: bold;
-  font-size: 16px;
-  padding: 8px 10px;
-  background: #93ba48;
-  cursor: pointer;
-  border: 0;
-  display: block;
-  margin: 20px auto;
-}
-.invite_btn_dialog > p {
-  margin: 0;
-}
-.invite_btn_dialog:hover {
-  color: #e0ebca;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.4);
-}
-.invite_btn_dialog:active {
-  -webkit-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.5);
-}
-.invite_btn {
-  border: 1px solid #85a940;
-  color: white;
-  font-weight: bold;
-  font-size: 14px;
-  padding: 4px 3px 5px 1px;
-  position: absolute;
-  top: 296px;
-  left: -2px;
-  z-index: 50;
-  background: #93ba48;
-  cursor: pointer;
-}
-.invite_btn > p {
-  margin: 0;
-  float: left;
-}
-.invite_btn > span {
-  margin: 2px 2px 0 4px;
-}
-.invite_btn:hover,
-.invite_btnfocus {
-  background: #93ba48;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #a0c25e), color-stop(1, #93ba48));
-  background: -ms-linear-gradient(bottom, #a0c25e, #93ba48);
-  background: -moz-linear-gradient(center bottom, #a0c25e 0%, #93ba48 100%);
-  background: -o-linear-gradient(#93ba48, #a0c25e);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#93ba48', endColorstr='#a0c25e', GradientType=0);
-}
-.invite_btn:active {
-  opacity: 1;
-  -ms-filter: none;
-  filter: none;
-  outline: 0;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.2);
-  border: 1px solid #769639;
-  background: #93ba48;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #adcb74), color-stop(1, #93ba48));
-  background: -ms-linear-gradient(bottom, #adcb74, #93ba48);
-  background: -moz-linear-gradient(center bottom, #adcb74 0%, #93ba48 100%);
-  background: -o-linear-gradient(#93ba48, #adcb74);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#93ba48', endColorstr='#adcb74', GradientType=0);
-}
-.checkbox_filled[type="checkbox"] {
-  display: none;
-}
-.checkbox_filled[type="checkbox"]:checked + label:after {
-  background: #69bfee;
-  border: 1px solid #5e7b97;
-}
-.checkbox_filled_bg {
-  font-size: 12px;
-  position: relative;
-  display: inline-block;
-  padding: 4px 0 4px 25px;
-  display: block;
-  width: 110px;
-  cursor: pointer;
-}
-.checkbox_filled_bg:hover {
-  background: #ecf0f3;
-}
-.checkbox_filled_bg:after {
-  content: "";
-  position: absolute;
-  display: block;
-  top: 6px;
-  left: 5px;
-  width: 10px;
-  height: 10px;
-  border: 1px solid #bac7d4;
-}
-.checkbox_button_input[type="checkbox"] {
-  display: none;
-}
-.checkbox_button_input[type="checkbox"]:checked + label {
-  background: #e0e6eb;
-}
-.checkbox_button_input[type="checkbox"]:checked + label:after {
-  background: #69bfee;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  border: 1px solid #c5e6f8;
-}
-.empty_folder {
-  font-size: 12px;
-  color: #aabbca;
-}
-.checkbox_button {
-  font-size: 12px;
-  position: relative;
-  padding: 4px 0 4px 1px;
-  display: inline-block;
-  width: 100%;
-  margin: 0;
-  cursor: pointer;
-}
-.checkbox_button:hover {
-  background: #ecf0f3;
-}
-.checkbox_button b .folder_dn-img,
-.checkbox_button b .folder_up-img {
-  margin-top: -2px;
-  margin-right: 6px;
-}
-.checkbox_button:after {
-  content: "";
-  position: absolute;
-  display: block;
-  top: 5px;
-  right: 10px;
-  width: 10px;
-  height: 10px;
-  border: 1px solid #bac7d4;
-  border-radius: 50%;
-  -webkit-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 1px 2px rgba(55, 72, 88, 0.2);
-}
-.own_name {
-  font-size: 12px;
-  position: relative;
-  padding: 4px 0 4px 1px;
-  display: inline-block;
-  width: 100%;
-  margin: 0;
-  background: #ecf0f3;
-  padding-left: 10px;
-  margin-bottom: 14px;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  cursor: default;
-}
-.own_name:after {
-  content: "";
-  position: absolute;
-  display: block;
-  top: 5px;
-  right: 10px;
-  width: 10px;
-  height: 10px;
-  border-radius: 50%;
-  background: #69bfee;
-  -webkit-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 1px 1px rgba(55, 72, 88, 0.5);
-  border: 1px solid #c5e6f8;
-}
-.label_title {
-  display: inline-block;
-  width: calc(80% - 12px);
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-.input_label_wrap {
-  position: relative;
-}
-.input_label_wrap p {
-  font-size: 12px;
-  margin: 0 0 4px 4px;
-}
-.input_label_wrap label {
-  position: absolute;
-  bottom: 4px;
-  left: 4px;
-  color: #aabbca;
-}
-/* div.action_button { */
-/*     background: #FFF; */
-/*     border: 1px solid #CCC; */
-/*     border-radius: 5px 5px 5px 5px; */
-/*     color: #374858; */
-/*     cursor: pointer; */
-/*     display: inline-block; */
-/*     float: left; */
-/*     font-size: 14px; */
-/*     height: 25px; */
-/*     line-height: 30px; */
-/*     margin-right: 10px; */
-/*     padding: 0 10px; */
-/*     text-align: center; */
-/*     top: 0; */
-/* } */
-/* div.action_button:hover { */
-/* 	color: #69bfee; */
-/*     border: 1px solid #69bfee; */
-/* } */
-div.action_button_click_only {
-  cursor: pointer;
-}
-div.bigger_button {
-  font-size: 18px;
-  margin: 0;
-  padding: 5px;
-  width: 250px;
-  cursor: pointer;
-  transition: background 0.3s ease;
-}
-#button_add_entry {
-  /* 	margin-right: 10px; */
-}
-.action_button {
-  height: 19px;
-  width: 24px;
-}
-.action_button img {
-  width: 24px;
-  height: 24px;
-  display: inline-block;
-  margin: auto;
-}
-.action_button p {
-  display: inline-block;
-  margin: 0;
-  margin-left: 5px;
-  text-align: left;
-}
-.file_upload_button {
-  width: auto;
-  height: 30px;
-}
-#saved_entry {
-  display: none;
-  background-color: #BDCA70;
-  border-radius: 5px;
-  color: white;
-  font-size: 18px;
-  left: 50%;
-  margin-left: -60px;
-  padding: 10px;
-  position: absolute;
-  text-align: center;
-  top: 0;
-  width: 100px;
-}
-div.dragging_entry {
-  background: #69bfee;
-  border-radius: 2px;
-  color: #FFF;
-  cursor: move;
-  font-size: 18px;
-  margin-top: -10px;
-  margin-left: -30px;
-  opacity: 0.5;
-  padding: 10px;
-  text-align: left;
-  width: 80px !important;
-  z-index: 100;
-}
-div.dd_entry_table {
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-}
-div.dd_entry_row {
-  display: table-row;
-}
-div.dd_entry_cell {
-  border: 1px solid transparent;
-  display: table-cell;
-  vertical-align: top;
-}
-div.dd_entry_cell:hover {
-  border: 1px solid #CCC;
-}
-div.dd_entry_cell_wrapper {
-  position: relative;
-}
-div.dd_entry_cell_content {
-  position: relative;
-  display: block;
-  min-height: 66px;
-  vertical-align: top;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  overflow: hidden;
-  /* For tables */
-}
-.handsontable {
-  overflow: scroll;
-}
-div.dd_entry_cell_content img {
-  -webkit-user-select: none;
-  /* Chrome all / Safari all */
-  -moz-user-select: none;
-  /* Firefox all */
-  -ms-user-select: none;
-  /* IE 10+ */
-}
-div.dd_entry_cell_content .imageLayer {
-  left: 0;
-  margin-left: auto;
-  margin-right: auto;
-  position: absolute;
-  right: 0;
-  top: 0;
-}
-.file_placeholder {
-  text-align: center;
-  background-color: #d9e1e8;
-  border: 1px solid rgba(0, 0, 0, 0);
-  padding-top: 5px;
-  transition: background 0.3s ease;
-}
-.file_placeholder button {
-  cursor: pointer;
-  margin: 5px;
-  padding: 5px;
-}
-div.dd_entry_cell_file_download {
-  font-size: 16px;
-  padding: 15px 10px;
-  text-align: center;
-  overflow: hidde;
-  word-break: break-word;
-}
-div.dd_entry_cell_file_download span.icon-file {
-  font-size: 36px;
-}
-div.file_icon {
-  vertical-align: bottom;
-  display: inline-block;
-}
-div.file_extension {
-  position: absolute;
-  background-color: #374858;
-  color: #FFF;
-  font-size: 12px;
-  line-height: 12px;
-  margin: 12px 0 0 -16px;
-  padding: 2px;
-  -webkit-box-sizing: border-box;
-  /* Safari/Chrome, other WebKit */
-  -moz-box-sizing: border-box;
-  /* Firefox, other Gecko */
-  box-sizing: border-box;
-  /* Opera/IE 8+ */
-  border: 1px solid #FFF;
-  width: 32px;
-}
-div.file_details {
-  display: inline-block;
-  text-align: left;
-  vertical-align: top;
-  line-height: 20px;
-}
-div.file_name {
-  display: block;
-  font-size: 18px;
-}
-div.file_size_link {
-  display: block;
-}
-div.file_size_link a {
-  margin-left: 10px;
-}
-div.dd_image_entry .dd_entry_cell_content {
-  text-align: center;
-  overflow: hidden;
-}
-.entry_button {
-  background-color: #e6ebef;
-  cursor: pointer;
-  display: none;
-  height: 30px;
-  margin: 0;
-  padding: 5px 0 0;
-  position: relative;
-  float: left;
-  text-align: center;
-  width: 35px;
-  z-index: 2;
-  font-size: 18px;
-  -webkit-transition: all 0.2s ease;
-  -moz-transition: all 0.2s ease;
-  -o-transition: all 0.2s ease;
-  transition: all 0.2s ease;
-}
-.entry_button:hover {
-  background-color: #d9e1e8;
-}
-.entry_button:active {
-  -webkit-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-}
-div.zoom_button,
-div.settings_button {
-  /* 	border-bottom: 1px solid #CCC; */
-  /* 	border-left: 1px solid #CCC; */
-  border-right: 0;
-  border-top: 0;
-  border-radius: 0;
-  right: 0;
-}
-div.cancel_button,
-div.drag_button {
-  /* 	right: 35px; */
-}
-div.save_button,
-div.edit_button {
-  /* 	border-right: 1px solid #CCCCCC; */
-  /*     right: 70px; */
-}
-div.zoom_button {
-  /* 	border-right: 1px solid #CCCCCC; */
-  /*     right: 105px; */
-}
-div.zoom_button span {
-  font-size: 14px;
-  margin: 10px;
-  line-height: 1.6;
-  color: #4b6277;
-}
-div.drag_button {
-  cursor: move;
-}
-div.cancel_button,
-div.save_button {
-  display: none;
-}
-div.zoom_button:hover,
-div.cancel_button:hover,
-.save_button:hover,
-.settings_button:hover,
-.drag_button:hover,
-.edit_button:hover {
-  /* 	color: #69bfee; */
-}
-div.zoom_button:hover,
-div.settings_button:hover {
-  margin: 0;
-}
-div.dd_entry_cell:hover div.zoom_button,
-div.dd_entry_cell:hover div.settings_button,
-div.dd_entry_cell:hover div.drag_button,
-div.dd_entry_cell:hover div.edit_button {
-  display: block;
-}
-/* we need !important to override inline css set in labfolder-project.js when showing or hiding buttons for redactor enabled/disabled */
-div.epb_entry.readOnly div.cancel_button,
-div.epb_entry.readOnly div.drag_button,
-div.epb_entry.readOnly div.settings_button,
-div.epb_entry.readOnly div.save_button,
-div.epb_entry.readOnly div.edit_button,
-div.epb_entry.readOnly div.zoom_button,
-div.epb_entry.readOnly button.file_upload_button,
-div.epb_entry.readOnly div.more_options_item_remove_block_element {
-  display: none !important;
-}
-div.disabled_button {
-  display: none !important;
-}
-/*TODO nest better hdrop*/
-.hdrop {
-  height: 15px;
-  display: table;
-  table-layout: fixed;
-  width: 100%;
-  transition: background 0.3s ease;
-}
-.hdrop:only-child {
-  box-sizing: border-box;
-  height: 100px;
-  padding: 40px;
-}
-.hdrop:only-child:before {
-  content: "This entry is empty. You can add a TEXT, a SKETCH, a TABLE or attach a FILE by clicking or dragging the buttons in the toolbar above.";
-  font-size: 13px;
-  background: #ffffff;
-  padding: 2px 4px;
-}
-.hdrop.drop_active:only-child:before {
-  content: "Drag it here.";
-}
-.hdrop.drop_hover:only-child:before {
-  content: "Now drop it.";
-}
-.hdrop:last-child {
-  /* 	border-radius: 0 0 10px 10px; */
-}
-.vdrop {
-  width: 20px;
-  display: table-cell;
-  transition: background 0.3s ease;
-}
-#button_add_entry.drop_active,
-.drop_active {
-  background-color: #aea;
-}
-.file_placeholder.drop_active {
-  background-color: #97d3f3;
-}
-#button_add_entry.drop_hover,
-.drop_hover {
-  background: #69bfee;
-}
-.file_placeholder.drop_hover {
-  background-color: #69bfee;
-}
-.dragBar {
-  cursor: col-resize;
-  display: table-cell;
-  text-align: center;
-  vertical-align: middle;
-  width: 10px;
-}
-.dragBar img {
-  height: 10px;
-  width: 2px;
-}
-.dragBar:hover {
-  background-color: #DDD;
-}
-div.epb_entry.readOnly .dragBar {
-  cursor: default;
-}
-div.epb_entry.readOnly .dragBar img {
-  display: none;
-}
-div.epb_entry.readOnly .dragBar:hover {
-  background-color: initial;
-}
-.hidden_entry {
-  visibility: hidden;
-}
-.button_wrapper_sticky {
-  position: fixed !important;
-  top: 131px !important;
-  right: inherit !important;
-  z-index: 20;
-}
-.dd_entry_cell.ui-state-disabled,
-.dd_entry_cell.ui-widget-content .ui-state-disabled,
-.dd_entry_cell.ui-widget-header .ui-state-disabled {
-  background-image: none !important;
-  opacity: 1 !important;
-}
-#paste_hidden_input {
-  opacity: 0;
-  position: absolute;
-  right: 10000px;
-  top: -10000px;
-}
-/*************
-* action bar *
-**************/
-.action_bar {
-  width: 100%;
-  height: 36px;
-  min-width: 800px;
-  padding-top: 10px;
-  background: white;
-  border-bottom: solid 2px #a1b3c4;
-  -webkit-box-shadow: 0 3px 4px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: 0 3px 4px rgba(55, 72, 88, 0.2);
-  box-shadow: 0 3px 4px rgba(55, 72, 88, 0.2);
-}
-.plus_btn {
-  width: 64px;
-  height: 22px;
-  color: white;
-  background: #38abf7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0b89dd), color-stop(1, #38abf7));
-  background: -ms-linear-gradient(bottom, #0b89dd, #38abf7);
-  background: -moz-linear-gradient(center bottom, #0b89dd 0%, #38abf7 100%);
-  background: -o-linear-gradient(#38abf7, #0b89dd);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#38abf7', endColorstr='#0b89dd', GradientType=0);
-  text-align: left;
-  font-size: 27px;
-  font-family: Arial !important;
-  line-height: 0.6;
-  padding: 2px 9px;
-  position: relative;
-}
-.plus_btn:hover {
-  outline: 0;
-  color: #dcf0fb;
-}
-.plus_btn:active {
-  -webkit-box-shadow: inset 0 3px 2px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: inset 0 3px 2px rgba(55, 72, 88, 0.5);
-  box-shadow: inset 0 3px 2px rgba(55, 72, 88, 0.5);
-}
-.plus_btn:after {
-  content: "Add";
-  font-size: 13px;
-  position: absolute;
-  right: 10px;
-  top: 12px;
-  font-weight: bold;
-  line-height: 0;
-}
-.plus_btn_wrap {
-  width: 200px;
-  float: left;
-  margin-top: -3px;
-}
-.plus_btn_hover {
-  height: 23px;
-  margin: 0 0 0 55px;
-}
-.add_dropdown {
-  display: none;
-  position: absolute;
-  top: 85px;
-  left: 0;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  z-index: 999;
-}
-.add_dropdown .default_button {
-  border: 0;
-  background: none;
-}
-.add_dropdown .default_button:active {
-  background: #4fb9f3;
-  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0);
-  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0);
-  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0);
-}
-.add_dropdown > ul {
-  width: 180px;
-  font-size: 14px;
-  color: white;
-  margin: 0;
-  padding: 12px 0 12px 0;
-  background: #18a2ed;
-}
-.add_dropdown > ul li {
-  list-style-type: none;
-  padding: 8px 10px 8px 50px;
-  cursor: pointer;
-}
-.add_dropdown > ul li:hover {
-  background: #4fb9f3;
-}
-.add_link {
-  padding: 0 0 0 50px !important;
-  height: 32px;
-}
-.add_link a {
-  width: auto;
-  padding: 8px 0 8px 0;
-  color: white;
-  text-decoration: none;
-  display: block;
-}
-.add_link a:hover {
-  text-decoration: none;
-}
-.action_menu_wrap {
-  float: left;
-  margin-top: -1px;
-}
-.filter_wrap > ul > li {
-  position: relative;
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  border-left: solid 1px #bac7d4;
-  border-top: solid 1px #bac7d4;
-  height: 25px;
-}
-.filter_wrap > ul > li:last-child {
-  padding: 6px 3px 0 10px;
-  border-left: solid 1px #bac7d4;
-  border-top: 0;
-}
-.filter_wrap > ul > li:first-child {
-  background: none;
-  border: none;
-  color: #7b95ad;
-  font-size: 12px;
-  padding: 6px 10px 0 0;
-  margin-left: 18px;
-}
-.more_filters {
-  /* 	display: none; */
-}
-.filter_dropdown_wrap {
-  width: 190px;
-  height: auto;
-  position: absolute;
-  left: -1px;
-  top: 25px;
-  z-index: 999;
-  display: none;
-  color: #4b6277;
-}
-.filter_dropdown_wrap .folder_dn-img {
-  margin-top: 2px;
-}
-.filter_dropdown_wrap .folder_up-img {
-  margin-top: 0;
-}
-.filter_dropdown_wrap header {
-  font-size: 11px;
-  color: #d9e1e8;
-  background: #4b6277;
-  padding: 3px 6px 2px 6px;
-  float: left;
-}
-.filter_dropdown_wrap header > p {
-  margin: 0;
-  float: left;
-}
-.filter_dropdown_wrap header > span {
-  float: right;
-  padding: 0px 0 3px 8px;
-  color: white;
-  cursor: pointer;
-}
-.filter_dropdown {
-  overflow-y: auto;
-  overflow-x: hidden;
-  min-width: 190px;
-  max-height: 600px;
-  width: auto;
-  padding-bottom: 20px;
-  float: left;
-  border: solid 1px #bac7d4;
-  background: white;
-  -webkit-box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 8px rgba(55, 72, 88, 0.3);
-}
-.filter_dropdown .list_vertical {
-  padding-top: 10px;
-}
-.filter_dropdown ul {
-  padding-left: 20px;
-}
-.filter_dropdown > ul {
-  margin: 0;
-  padding: 0;
-  width: 230px;
-}
-.filter_dropdown li {
-  list-style-type: none;
-}
-.filter_dropdown nav {
-  display: block;
-  height: 30px;
-  padding-top: 10px;
-}
-.filter_dropdown nav button {
-  float: left;
-  margin-right: 20px;
-}
-.filterOverlay.active {
-  opacity: 0.5;
-}
-.filter_project_dropdown > ul {
-  margin: 0;
-  padding: 0;
-  width: 270px;
-}
-.invalid_tag {
-  font-size: 12px;
-  color: #e66873;
-}
-.project_filter {
-  min-width: 255px !important;
-  padding: 0 6px 10px 4px;
-}
-.project_filter .tree_button {
-  display: none !important;
-}
-.project_filter .updateTS {
-  display: none !important;
-}
-.project_filter .treeline,
-.project_filter .treeline_children_empty {
-  font-size: 12px;
-}
-.root_folder {
-  padding: 4px 0 4px 2px !important;
-  width: calc(100% - 29px);
-}
-.not_possible_project {
-  display: none;
-}
-.not_possible_author {
-  display: none;
-}
-.folder_label {
-  padding: 4px 0 4px 2px !important;
-  width: calc(100% - 29px);
-}
-.root_folder_wrap {
-  overflow: auto;
-  width: 100%;
-}
-.filter_date_header {
-  width: 190px;
-}
-.dropdown_padding {
-  padding: 10px;
-}
-.author_filter {
-  min-width: 255px !important;
-  padding: 0 6px 0 4px;
-}
-.tags_input {
-  margin-top: 10px;
-  border: solid 1px #bac7d4;
-  cursor: text;
-  padding: 2px;
-  min-height: 50px;
-  width: 100%;
-  overflow: auto;
-}
-.tags_input > span {
-  font-size: 11px;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-  height: 18px;
-  margin: 2px;
-  cursor: pointer;
-  display: inline-block;
-}
-.tags_input > span.selected_token {
-  border: 1px solid #4bb1d7;
-}
-.tags_input > span.invalid {
-  border: 1px solid #E66873;
-  color: #E66873;
-}
-.token_input {
-  border: none;
-  outline: none;
-  resize: none;
-  white-space: pre;
-  font-size: 11px;
-  line-height: 11px;
-  vertical-align: top;
-  font-family: arial, sans-serif;
-  padding: 5px 0 0 2px;
-  margin: 0px;
-  width: auto;
-  overflow: auto;
-}
-.token_input_width {
-  position: absolute;
-  height: 11px;
-  display: inline-block;
-  padding: 0px 10px;
-  visibility: hidden;
-}
-.tag_name {
-  display: inline-block;
-  margin-right: 5px;
-  max-width: 250px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-.delete_tag {
-  color: #9baec0;
-  cursor: pointer;
-  display: inline-block;
-  padding: 1px 3px 1px 0px;
-  vertical-align: top;
-}
-.delete_tag:after {
-  content: "\00d7";
-}
-.tag_data_wrap {
-  margin-top: 10px;
-}
-.tag_data_wrap > ul {
-  margin: 0;
-  padding: 0;
-}
-.tag_data_wrap > ul li {
-  list-style-type: none;
-}
-.tag_index {
-  padding-right: 5px;
-  text-align: center;
-  font-size: 10px;
-  font-weight: bold;
-  border-right: solid 1px #bac7d4;
-  float: left;
-}
-.tag_index > ul {
-  margin: 0;
-  padding: 0;
-}
-.tag_index > ul li {
-  list-style-type: none;
-}
-.tag_index li {
-  width: 15px;
-  padding: 3px 0 3px 0;
-  margin-bottom: 1px;
-  display: block;
-  cursor: pointer;
-}
-.tag_index li:hover {
-  background: #ecf0f3;
-}
-.existing_tag {
-  cursor: pointer;
-}
-.existing_tag.disabled {
-  color: white;
-  background: #7b95ad;
-  border: 1px solid #7b95ad;
-}
-li.index_selected {
-  background: #d9e1e8;
-}
-li.index_selected:hover {
-  background: #d9e1e8;
-}
-.all_tags_head {
-  font-size: 12px;
-  margin: 10px 0 5px 0;
-}
-.all_tags {
-  font-size: 12px;
-  margin: 40px 0 5px 0;
-}
-.tag_register {
-  overflow: auto;
-  max-height: 300px;
-  width: 100%;
-  float: left;
-  margin-left: 10px;
-  font-size: 11px;
-}
-.tag_register ul {
-  margin: 0;
-  padding: 0;
-}
-.tag_register ul li {
-  list-style-type: none;
-}
-.tag_register > ul > li {
-  margin-bottom: 15px;
-}
-.tag {
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-  display: inline-block;
-}
-.my_tags li {
-  margin-bottom: 5px;
-}
-.my_tags span {
-  display: inline-block;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-}
-.my_tags .selected_tag {
-  background: #38abf7;
-  background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #0b89dd), color-stop(1, #38abf7));
-  background: -ms-linear-gradient(bottom, #0b89dd, #38abf7);
-  background: -moz-linear-gradient(center bottom, #0b89dd 0%, #38abf7 100%);
-  background: -o-linear-gradient(#38abf7, #0b89dd);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#38abf7', endColorstr='#0b89dd', GradientType=0);
-  color: #ffffff;
-}
-.my_tags .selected_tag.disabled.selected_tag {
-  background: #f3f5f7;
-  border: 1px solid #E66873;
-  color: #E66873;
-}
-.group_tags li {
-  margin-bottom: 7px;
-}
-.group_tags span {
-  display: inline-block;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-}
-.managed_tags li {
-  margin-bottom: 7px;
-}
-.managed_tags span {
-  display: inline-block;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-}
-.custom_selectbox {
-  min-width: 100px;
-}
-.filter_date_input {
-  background: white;
-  border: solid 1px #bac7d4;
-  width: 120px;
-  height: 26px;
-  padding: 2px;
-  color: #4b6277;
-}
-.datepicker_wrap {
-  margin-top: 20px;
-}
-.datepicker_wrap > div:first-child {
-  margin-bottom: 15px;
-}
-.input_label_wrap label.hidden {
-  display: none;
-}
-.filter_date_icon {
-  display: block;
-  position: absolute;
-  right: 24px;
-  top: 20px;
-  font-size: 20px;
-  cursor: pointer;
-}
-.empty_filter_message {
-  font-size: 12px;
-  margin: 0 0 10px 10px;
-}
-/*******
-* entry *
-********/
-#epb_container {
-  position: relative;
-  width: 100%;
-}
-.epb_entry {
-  width: 100%;
-  margin: 19px 0 15px 0;
-  display: inline-block;
-}
-.readOnly .entry_toolbar_btns {
-  display: none;
-}
-.entry_loading {
-  background: rgba(255, 255, 255, 0.7);
-  position: fixed;
-  top: 85px;
-  bottom: 0;
-  left: 0;
-  z-index: 99;
-  right: 0;
-}
-.entry_loading span {
-  padding: 25px;
-  background: #fff;
-  opacity: 1;
-  border-radius: 10px;
-  border: 1px solid #9baec0;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  color: #5e7b97;
-  font-size: 24px;
-  top: 300px;
-  width: 250px;
-  margin-left: -125px;
-  left: 50%;
-  text-align: center;
-  position: absolute;
-}
-.entry_container {
-  min-width: 726px;
-  margin-right: 45px;
-}
-.entry_header {
-  width: 100%;
-  height: 33px;
-  font-size: 12px;
-  background: #cdd7e0;
-}
-.entry_author {
-  color: #374858;
-  float: left;
-}
-.entry_author > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_author > ul li {
-  list-style-type: none;
-}
-.entry_author figure {
-  background: #ecf0f3;
-  border: solid 1px #7b95ad;
-  margin: 2px;
-  width: 29px;
-  height: 29px;
-  float: left;
-  position: relative;
-}
-.entry_author figure img {
-  width: 27px;
-  height: 27px;
-  position: absolute;
-  top: 0;
-  left: 0;
-}
-.entry_author figure > span {
-  margin-left: 4px;
-}
-.author_name {
-  float: left;
-  padding: 2px;
-  line-height: 1.3;
-  width: 196px;
-}
-.author_firstname,
-.author_lastname {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  display: block;
-  overflow: hidden;
-  padding: 0;
-  margin-left: 0;
-}
-.entry_title_wrap {
-  float: left;
-  position: relative;
-  padding: 2px 4px 3px 4px;
-  line-height: 1.3;
-  border-left: 1px solid #ffffff;
-}
-.entry_name_menu {
-  float: left;
-  height: 30px;
-  overflow: hidden;
-}
-.entry_name_menu > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_name_menu > ul li {
-  list-style-type: none;
-}
-.entry_name_menu p {
-  margin: 0;
-  display: inline-block;
-}
-.entry_name_menu li {
-  max-width: 800px;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-}
-.entry_name_menu li:first-child {
-  float: left;
-  color: #4f677e;
-  margin-right: 10px;
-  font-size: 11px;
-  line-height: 1.4;
-}
-.entry_name_menu li:last-child {
-  float: left;
-}
-.entry_menu_list {
-  float: left;
-  width: 164px;
-  height: 30px;
-  overflow: hidden;
-}
-.entry_menu_list > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_menu_list > ul li {
-  list-style-type: none;
-}
-.entry_menu_list p {
-  margin: 0;
-  display: inline-block;
-}
-.entry_menu_list li {
-  width: 100%;
-  display: block;
-  clear: both;
-}
-.entry_menu_list li span:first-child {
-  min-width: 45px;
-  max-width: 92px;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  overflow: hidden;
-  float: left;
-  margin-right: 10px;
-  color: #4f677e;
-  font-size: 11px;
-}
-.entry_menu_list li span:last-child {
-  float: left;
-  color: #374858;
-}
-.entry_menus {
-  height: 100%;
-  float: right;
-  position: relative;
-}
-.entry_menus > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_menus > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-.entry_menus > ul {
-  height: 100%;
-}
-.entry_menus > ul > li {
-  width: 200px;
-  border-right: solid 1px white;
-  padding: 2px 4px 3px 4px;
-  height: 33px;
-  line-height: 1.3;
-  background: #cdd7e0;
-  position: relative;
-}
-.entry_menus > ul > li:first-child {
-  border-left: solid 1px white;
-}
-.entry_menus > ul > li:last-child {
-  border-right: none;
-  width: 90px;
-}
-.entry_menu_more {
-  min-height: 33px;
-  height: auto !important;
-  overflow: visible;
-  border-bottom: solid 1px #ffffff;
-  border-left: solid 1px #ffffff;
-  -webkit-box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  -moz-box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  box-shadow: 0 1px 2px rgba(55, 72, 88, 0.5);
-  z-index: 10;
-}
-.entry_menu_more .entry_menu_options span:last-child {
-  position: absolute;
-  bottom: 6px;
-}
-.show_list_more {
-  height: auto;
-}
-.readOnly .drop_edit_menu {
-  display: none;
-}
-.entry_menu_less {
-  /* 	overflow: hidden; */
-}
-.entry_menu_show {
-  overflow: visible;
-}
-.entry_menu_edit .entry_dropdown {
-  display: block;
-}
-.entry_menu_options {
-  float: right;
-  margin-left: 10px;
-  padding-left: 4px;
-  height: 100%;
-  width: 15px;
-}
-.entry_menu_options > span {
-  display: block;
-  margin-right: 0;
-  cursor: pointer;
-}
-.entry_menu_options .arrow_menu_dn-img {
-  height: 10px !important;
-  margin-top: 7px;
-}
-.entry_options {
-  padding-top: 5px;
-  float: right;
-}
-.entry_options > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_options > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-.entry_options > ul > li {
-  margin-left: 6px;
-}
-.entry_options > span {
-  cursor: pointer;
-}
-.epb_comments_count {
-  color: #ffffff;
-  width: 17px;
-  display: block;
-  text-align: center;
-  margin-top: 1px;
-  font-size: 9px;
-  height: 12px;
-  line-height: 12px;
-}
-@-moz-document url-prefix() {
-  .epb_comments_count {
-    line-height: 11px;
-  }
-}
-.entry_toolbar {
-  height: 25px;
-  margin-left: 31px;
-  position: relative;
-  padding: 5px;
-  background: #cdd7e0;
-  border-top: solid 1px white;
-  -webkit-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 2px 2px rgba(55, 72, 88, 0.3);
-}
-.entry_toolbar > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_toolbar > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-.entry_toolbar > ul > li {
-  margin-right: 12px;
-  cursor: pointer;
-}
-.entry_toolbar > ul > li:first-child {
-  margin-left: 6px;
-}
-.entry_toolbar_btns {
-  /*display: none;*/
-}
-.entry_content {
-  min-height: 300px;
-  background: #f9fafb;
-  border: solid 1px #cad4de;
-}
-.entry_footer {
-  margin-left: 30px;
-  height: 25px;
-  background: #cad4de;
-}
-.tag {
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-}
-.entry_tags {
-  float: left;
-  height: 100%;
-  overflow: hidden;
-  max-width: 138px;
-}
-.entry_tags > span {
-  display: inline-block;
-  padding: 1px 3px;
-  background: #f3f5f7;
-  border-radius: 3px;
-  border: solid 1px #cad4de;
-  float: left;
-  line-height: 1;
-  padding: 0px 3px;
-  border: solid 1px #aabbca;
-  margin-right: 2px;
-}
-.entry_dropdown {
-  width: 101%;
-  min-width: 260px;
-  height: auto;
-  padding: 10px;
-  background: #cdd7e0;
-  border-left: solid 1px white;
-  border-right: solid 1px white;
-  border-bottom: solid 1px white;
-  position: absolute;
-  top: 0;
-  right: -1px;
-  z-index: 14;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  display: none;
-}
-.entry_dropdown > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_dropdown > ul li {
-  list-style-type: none;
-}
-.entry_dropdown input {
-  border: none;
-  height: 28px;
-  font-size: 12px;
-  padding-left: 6px;
-  width: 100%;
-  color: #4b6277;
-}
-.entry_dropdown label {
-  font-size: 11px;
-  display: block;
-  margin-bottom: 4px;
-}
-.entry_dropdown > nav {
-  width: 100%;
-  height: 18px;
-}
-.entry_name {
-  right: auto !important;
-  left: -1px !important;
-}
-.entry_name select {
-  width: 60%;
-}
-.entry_name > ul > li {
-  margin: 4px 0 12px 0;
-}
-.entry_name > ul > li:first-child {
-  margin-top: -8px;
-}
-.project_tree {
-  width: 100%;
-  height: 140px;
-  overflow: auto;
-  background: white;
-}
-.close_entry_menu {
-  height: 18px;
-  width: 100%;
-  margin-top: -5px;
-}
-.close_entry_menu span {
-  float: right;
-}
-.save_entry_menu {
-  height: 20px;
-  float: right;
-  margin-top: 10px;
-}
-.save_entry_menu .grey_link {
-  display: block;
-  float: left;
-  padding: 4px 20px 0 0;
-}
-.select_entry_menu {
-  width: 100%;
-  height: 25px;
-  float: left;
-  margin-top: 20px;
-}
-.select_entry_menu span,
-.select_entry_menu button {
-  float: left;
-  margin-right: 15px;
-}
-.select_entry_menu .blue_link {
-  color: #3b97ed;
-}
-.entry_tag_index li:hover {
-  background: #d9e1e8;
-}
-.entry_tag_index li.index_selected {
-  background: #e6ebef;
-}
-.entry_tag_index li.index_selected:hover {
-  background: #e6ebef;
-}
-.entry_tags_input {
-  margin: 0;
-  background: white;
-  border: none;
-}
-.entry_dates {
-  width: 100%;
-}
-.entry_dates > li {
-  display: block;
-  width: 100%;
-  clear: both;
-  overflow: auto;
-  margin-bottom: 15px;
-}
-.entry_dates > li > span {
-  margin: 5px 0 0 6px;
-  cursor: pointer;
-}
-.entry_dates > li > span:active {
-  margin: 6px 0 0 6px;
-}
-.entry_dates input {
-  height: 25px;
-  background: #e9edf1;
-}
-.entry_dates input:focus {
-  background: white;
-}
-.entry_dates > li:last-child {
-  margin-bottom: 5px;
-}
-.entry_dates > li:last-child input {
-  background: white;
-}
-.entry_dates > li:first-child {
-  margin-bottom: 0;
-}
-.drag_handle {
-  background: #d9e1e8;
-  width: 9px;
-  height: 25px;
-  padding: 5px 3px;
-  float: left;
-  cursor: move;
-}
-.drag_handle span {
-  width: 3px;
-  height: 3px;
-  display: block;
-  background: #bac7d4;
-  margin: 1px 0 2px 0;
-}
-.date_key {
-  width: 120px;
-  float: left;
-  margin-right: 10px;
-  position: relative;
-}
-.date_key:after {
-  content: ":";
-  position: absolute;
-  left: 123px;
-  top: 4px;
-  font-size: 12px;
-  font-weight: bold;
-}
-.date_value {
-  width: 80px;
-  float: left;
-  position: relative;
-}
-.entry_settings {
-  width: 150px;
-  background: white;
-  line-height: 1.0;
-  position: absolute !important;
-  top: 24px;
-  right: -13px;
-  z-index: 30;
-  display: none;
-  margin-right: 0 !important;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.8);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.8);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.8);
-}
-.entry_settings > ul {
-  margin: 0;
-  padding: 0;
-}
-.entry_settings > ul li {
-  list-style-type: none;
-}
-.entry_settings .trash_dark-img {
-  right: 4px;
-}
-.entry_settings ul {
-  padding: 10px 0 10px 0;
-}
-.entry_settings li {
-  font-size: 12px;
-  padding: 8px 10px;
-  display: block;
-  cursor: pointer;
-}
-.entry_settings li:hover {
-  background: #e0e6eb;
-}
-.entry_settings_arrow {
-  position: relative;
-  background: #f9fafb;
-}
-.entry_settings_arrow:after {
-  top: -11px;
-  right: 19px;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(136, 183, 213, 0);
-  border-bottom-color: #f9fafb;
-  border-width: 7px;
-  margin-left: -3px;
-}
-.epb_content_wrap {
-  display: table;
-  min-width: 696px;
-  margin-left: 30px;
-  margin-right: 45px;
-  min-height: 100px;
-  background: #f3f5f7;
-  border: solid 1px #aabbca;
-}
-.handsontable th {
-  background: #d9e1e8;
-  font-size: 12px;
-  color: #4b6277;
-}
-.handsontable th,
-.handsontable td {
-  border-right: 1px solid #cad4de;
-  border-bottom: 1px solid #cad4de;
-}
-.handsontable tr:first-child th,
-.handsontable tr:first-child td {
-  border-top: 1px solid #cad4de;
-}
-.handsontable th:first-child,
-.handsontable td:first-child,
-.handsontable .htNoFrame + th,
-.handsontable .htNoFrame + td {
-  border-left: 1px solid #cad4de;
-}
-div.dd_entry_cell {
-  border: 1px solid #d9e1e8;
-  -webkit-transition: border 0.2s ease;
-  -moz-transition: border 0.2s ease;
-  -o-transition: border 0.2s ease;
-  transition: border 0.2s ease;
-}
-div.dd_entry_cell:hover {
-  border: 1px solid #3babe9;
-}
-div.dd_entry_cell:hover .button_wrapper {
-  display: block;
-}
-#button_add_entry.drop_active,
-.drop_active {
-  background-color: #d8f1ff;
-}
-#button_add_entry.drop_hover,
-.drop_hover {
-  background: #69bfee;
-}
-.settings_button span {
-  margin-top: 10px;
-  display: block;
-}
-.edit_button span {
-  margin: 5px 0 0 12px;
-}
-.drag_button span {
-  margin: 3px 0 0 10px;
-}
-.drag_button:active {
-  -webkit-box-shadow: inset 0 0 0 rgba(55, 72, 88, 0) !important;
-  -moz-box-shadow: inset 0 0 0 rgba(55, 72, 88, 0) !important;
-  box-shadow: inset 0 0 0 rgba(55, 72, 88, 0) !important;
-}
-.cancel_button span {
-  margin: 5px 0 0 12px;
-}
-.save_button span {
-  margin: 2px 0 0 10px;
-}
-.button_wrapper {
-  position: absolute;
-  right: -1px;
-  top: -1px;
-  display: none;
-  border: solid 1px #cad4de;
-  z-index: 8;
-  -webkit-box-shadow: -2px 1px 1px rgba(55, 72, 88, 0.1) !important;
-  -moz-box-shadow: -2px 1px 1px rgba(55, 72, 88, 0.1) !important;
-  box-shadow: -2px 1px 1px rgba(55, 72, 88, 0.1) !important;
-}
-.button_wrapper .more_options_panel {
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4) !important;
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4) !important;
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4) !important;
-  border: 0;
-}
-.button_wrapper .more_options_item {
-  min-width: 140px;
-}
-.more_options_panel.in_block {
-  right: -1px;
-  top: 36px;
-  padding: 10px 0 10px 0;
-  background-color: #e6ebef;
-}
-.more_options_item_remove_block_element span {
-  float: left;
-}
-.more_options_item {
-  padding: 6px;
-}
-.more_options_item:hover {
-  background: #f9fafb;
-}
-/*********
-* tables *
-**********/
-.htContextMenu table.htCore {
-  outline: 1px solid #d9e1e8;
-  line-height: 1.0;
-  -webkit-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4);
-  -moz-box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4);
-  box-shadow: 0 2px 4px rgba(55, 72, 88, 0.4);
-}
-.htContextMenu table tbody tr td {
-  font-size: 12px;
-  color: #4b6277;
-  background: #e9edf1;
-}
-.htContextMenu table tbody tr td:hover {
-  background: #f9fafb;
-}
-.htContextMenu table tbody tr td.current {
-  background: #f9fafb;
-}
-.htContextMenu table tbody tr td.htSeparator {
-  border-top: 1px solid #cad4de;
-}
-/****************
-* media queries *
-****************/
-@media (max-height: 750px) {
-  .filter_dropdown {
-    max-height: 460px;
-  }
-}
-@media (max-width: 1750px) {
-  .entry_name_menu li {
-    max-width: 400px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-  }
-}
-@media (max-width: 1380px) {
-  .entry_name_menu li {
-    max-width: 190px;
-  }
-  .entry_menus > ul > li {
-    width: 174px;
-  }
-  .entry_menu_list {
-    width: 138px;
-  }
-}
-@media (max-width: 1100px) {
-  .author_name {
-    width: auto;
-    margin-right: 20px;
-  }
-  .author_firstname,
-  .author_lastname {
-    width: 100px;
-    white-space: nowrap;
-    text-overflow: ellipsis;
-    overflow: hidden;
-  }
-}
-@media (max-width: 970px) {
-  .page_title {
-    margin-top: 2px;
-    font-size: 12px;
-  }
-  .plus_btn_wrap {
-    width: 130px;
-  }
-  .author_firstname,
-  .author_lastname {
-    width: 66px;
-  }
-  .entry_menus > ul > li {
-    width: 120px;
-  }
-  .entry_menu_list {
-    width: 84px;
-  }
-  .entry_menu_list li span:first-child {
-    display: block;
-    float: none;
-  }
-  .entry_tags {
-    width: 84px;
-  }
-  .entry_tags > span {
-    max-width: 84px;
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-  }
-}
-@media (max-width: 870px) {
-  .entry_name_menu li {
-    max-width: 90px;
-  }
-}
-
diff --git a/unittests/example_labfolder_data/static/css/pixel_icon.css b/unittests/example_labfolder_data/static/css/pixel_icon.css
deleted file mode 100644
index 50aed1d7..00000000
--- a/unittests/example_labfolder_data/static/css/pixel_icon.css
+++ /dev/null
@@ -1,570 +0,0 @@
-/**************
-*  basic.css  *
-**************/
-/**********
-* colors  *
-***********/
-/**********
-* helper  *
-***********/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-/*********
-* icons	*
-**********/
-.icon_source {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-}
-.logo-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -6px -10px;
-  width: 130px;
-  height: 30px;
-  margin: 16px 0 0 22px;
-}
-.author_only-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -140px -3px;
-  width: 15px;
-  height: 15px;
-}
-.add_text-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -161px -3px;
-  width: 22px;
-  height: 15px;
-}
-.add_text-img:hover {
-  background-position: -161px -31px;
-}
-.add_text-img:active {
-  margin-top: 1px;
-}
-.add_sketch-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -190px -3px;
-  width: 22px;
-  height: 15px;
-}
-.add_sketch-img:hover {
-  background-position: -190px -31px;
-}
-.add_sketch-img:active {
-  margin-top: 1px;
-}
-.add_table-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -218px -3px;
-  width: 23px;
-  height: 15px;
-}
-.add_table-img:hover {
-  background-position: -218px -31px;
-}
-.add_table-img:active {
-  margin-top: 1px;
-}
-.add_upload-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -942px -3px;
-  width: 18px;
-  height: 15px;
-}
-.add_upload-img:hover {
-  background-position: -942px -31px;
-}
-.add_upload-img:active {
-  margin-top: 1px;
-}
-.add_import-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -246px -3px;
-  width: 23px;
-  height: 15px;
-}
-.add_import-img:hover {
-  background-position: -246px -31px;
-}
-.add_import-img:active {
-  margin-top: 1px;
-}
-.wheel-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -282px -3px;
-  width: 15px;
-  height: 15px;
-}
-.wheel-img:hover {
-  background-position: -282px -31px;
-}
-.arrow_down-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -303px -3px;
-  width: 15px;
-  height: 15px;
-  cursor: pointer;
-}
-.arrow_down-img:hover {
-  background-position: -303px -31px;
-}
-.arrow_up-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -327px -3px;
-  width: 15px;
-  height: 15px;
-  cursor: pointer;
-}
-.arrow_up-img:hover {
-  background-position: -327px -31px;
-}
-.comment-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -348px -3px;
-  width: 19px;
-  height: 19px;
-}
-.comment-img:hover {
-  background-position: -348px -31px;
-}
-.todo-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1085px -4px;
-  width: 14px;
-  height: 13px;
-}
-.project-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -375px -3px;
-  width: 16px;
-  height: 16px;
-  margin-top: 6px !important;
-}
-/* .project-img:hover{ */
-/* 	background-position: -375px -31px;  */
-/* }	 */
-.manage-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -400px -2px;
-  width: 20px;
-  height: 20px;
-}
-.manage_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1050px -35px;
-  width: 10px;
-  height: 10px;
-  margin-top: 2px;
-}
-.desk-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -428px -3px;
-  width: 16px;
-  height: 16px;
-  margin-top: 6px !important;
-}
-.desk_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1067px -35px;
-  width: 10px;
-  height: 10px;
-  margin-top: 3px;
-}
-.template_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -796px -3px;
-  width: 10px;
-  height: 16px;
-}
-.bell-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -454px -1px;
-  width: 22px;
-  height: 22px;
-}
-.bell-img:hover {
-  background-position: -454px -29px;
-}
-.search-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -488px -1px;
-  width: 26px;
-  height: 23px;
-}
-.search-img:hover {
-  background-position: -488px -29px;
-}
-.avatar-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -522px 1px;
-  width: 16px;
-  height: 22px;
-}
-.avatar_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -837px -37px;
-  width: 8px;
-  height: 10px;
-  margin-top: 4px;
-}
-.group-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -853px -35px;
-  width: 20px;
-  height: 13px;
-  margin-top: 3px;
-}
-.arrow_down_s-img {
-  position: relative;
-  background: transparent;
-}
-.arrow_down_s-img:after {
-  top: 100%;
-  left: 50%;
-  border: solid transparent;
-  content: " ";
-  height: 0;
-  width: 0;
-  position: absolute;
-  pointer-events: none;
-  border-color: rgba(213, 213, 213, 0);
-  border-top-color: #374858;
-  border-width: 4px;
-  margin-left: -4px;
-}
-.arrow_down_s-img:hover {
-  background-position: -691px -39px;
-}
-.close_x-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -895px -8px;
-  width: 10px;
-  height: 9px;
-}
-.feedback-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -912px -2px;
-  width: 10px;
-  height: 61px;
-}
-.invite-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -925px -2px;
-  width: 10px;
-  height: 52px;
-}
-.pending-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1011px -9px;
-  width: 17px;
-  height: 10px;
-}
-.single_tag_img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -970px -5px;
-  width: 12px;
-  height: 14px;
-}
-.root_tag_img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -986px -4px;
-  width: 19px;
-  height: 15px;
-}
-.menu_arrow-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -853px -7px;
-  width: 14px;
-  height: 11px;
-}
-.folder_up-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -738px -3px;
-  width: 24px;
-  height: 15px;
-}
-.folder_dn-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -764px -5px;
-  width: 24px;
-  height: 13px;
-}
-.project_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -814px -5px;
-  width: 12px;
-  height: 14px;
-}
-.notebook_s-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -1035px -34px;
-  width: 10px;
-  height: 12px;
-  margin-top: 2px;
-}
-.edit-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -659px -7px;
-  width: 11px;
-  height: 10px;
-}
-.trash_dark-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -631px -5px;
-  width: 10px;
-  height: 13px;
-}
-.trash-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -646px -4px;
-  width: 10px;
-  height: 13px;
-}
-.trash-img:hover {
-  background-position: -631px -4px;
-}
-.edit_light-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -674px -7px;
-  width: 11px;
-  height: 10px;
-}
-.edit_light-img:hover {
-  background-position: -659px -7px;
-}
-.edit_light-img:active {
-  margin-top: 1px;
-  margin-bottom: -1px;
-}
-.arrow_menu_dn-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -729px -11px;
-  width: 9px;
-  height: 5px;
-}
-.arrow_menu_dn-img:hover {
-  background-position: -729px -39px;
-}
-.arrow_menu_up-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -716px -11px;
-  width: 9px;
-  height: 5px;
-}
-.arrow_menu_up-img:hover {
-  background-position: -716px -39px;
-}
-.close_box-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  float: right;
-  margin: 0;
-  background-position: -546px -5px;
-  width: 17px;
-  height: 15px;
-  cursor: pointer;
-}
-.close_box-img:hover {
-  background-position: -546px -33px;
-}
-.close_box-img:active {
-  -webkit-box-shadow: 0 0 5px #ffffff;
-  -moz-box-shadow: 0 0 5px #ffffff;
-  box-shadow: 0 0 5px #ffffff;
-  background-position: -546px -5px;
-}
-.save-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  margin: 0;
-  background-position: -585px -5px;
-  width: 15px;
-  height: 15px;
-  cursor: pointer;
-}
-.drag-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  margin: 0;
-  background-position: -608px -5px;
-  width: 15px;
-  height: 15px;
-  cursor: pointer;
-}
-.close_dark_x-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -569px -8px;
-  width: 10px;
-  height: 9px;
-}
-.edit_dark-img {
-  background-image: url("../img/labfolder_icons.png");
-  background-repeat: no-repeat;
-  margin-right: 5px;
-  float: left;
-  background-position: -659px -7px;
-  width: 11px;
-  height: 10px;
-}
-
diff --git a/unittests/example_labfolder_data/static/css/redactor.css b/unittests/example_labfolder_data/static/css/redactor.css
deleted file mode 100644
index fa4e0dd5..00000000
--- a/unittests/example_labfolder_data/static/css/redactor.css
+++ /dev/null
@@ -1,1112 +0,0 @@
-/*
-	Icon font
-*/
-@font-face {
-  font-family: 'RedactorFont';
-  src: url('../font/redactor-font.eot');
-}
-@font-face {
-  font-family: 'RedactorFont';
-  src: url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'), url(data:application/font-woff;charset=utf-8;base64,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) format('woff');
-  font-weight: normal;
-  font-style: normal;
-}
-/* =Selection
------------------------------------------------------------------------------*/
-.redactor_box ::selection {
-  background: #ffff9e;
-}
-.redactor_box ::-moz-selection {
-  background: #ffff9e;
-}
-.redactor_box img::selection {
-  background: transparent;
-}
-.redactor_box img::-moz-selection {
-  background: transparent;
-}
-/*
-	BOX
-*/
-.redactor_box {
-  position: relative;
-  overflow: visible;
-  background: #fff;
-  z-index: 1 !important; /*Labfolder fix*/
-}
-.redactor_box iframe {
-  display: block;
-  margin: 0;
-  padding: 0;
-  border: 1px solid #eee;
-}
-.redactor_box textarea {
-  position: relative;
-  display: block;
-  overflow: auto;
-  margin: 0;
-  padding: 0;
-  width: 100%;
-  outline: none;
-  border: none;
-  background-color: #222;
-  box-shadow: none;
-  color: #ccc;
-  font-size: 13px;
-  font-family: Menlo, Monaco, monospace, sans-serif;
-  resize: none;
-}
-.redactor_box textarea:focus {
-  outline: none;
-}
-.redactor_box,
-.redactor_box textarea {
-  z-index: auto !important;
-}
-.redactor_box_fullscreen {
-  z-index: 99 !important;
-}
-#redactor_modal_overlay,
-#redactor_modal,
-.redactor_dropdown {
-  z-index: 100 !important;
-}
-/*
-	AIR
-
-*/
-body .redactor_air {
-  position: absolute;
-  z-index: 502;
-}
-/*
-	FULLSCREEN
-*/
-body .redactor_box_fullscreen {
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-}
-/*
-	LINK TOOLTIP
-*/
-.redactor-link-tooltip {
-  position: absolute;
-  z-index: 49999;
-  padding: 10px;
-  line-height: 1;
-  display: inline-block;
-  background-color: #000;
-  color: #555 !important;
-}
-.redactor-link-tooltip,
-.redactor-link-tooltip a {
-  font-size: 12px;
-  font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif;
-}
-.redactor-link-tooltip a {
-  color: #ccc;
-  margin: 0 5px;
-  text-decoration: none;
-}
-.redactor-link-tooltip a:hover {
-  color: #fff;
-}
-/*
-	IMAGE BOX
-*/
-#redactor-image-box img {
-  width: 100%;
-}
-.redactor_editor {
-  position: relative;
-  overflow: auto;
-  margin: 0 !important;
-  padding: 10px 20px;
-  padding-bottom: 5px;
-  outline: none;
-  background: none;
-  background: #fff;
-  box-shadow: none !important;
-  white-space: normal;
-  border: 1px solid #eee;
-  vertical-align: baseline !important;
-  /*labfolder fix, vertical align*/
-}
-.redactor_editor:focus {
-  outline: none;
-}
-.redactor_editor div,
-.redactor_editor p,
-/*removed because pre wrap causes double line jump in lists*/
-/*.redactor_editor ul,
-.redactor_editor ol,*/
-.redactor_editor table,
-.redactor_editor dl,
-.redactor_editor blockquote,
-.redactor_editor pre,
-.redactor_editor h1,
-.redactor_editor h2,
-.redactor_editor h3,
-.redactor_editor h4,
-.redactor_editor h5,
-.redactor_editor h6 {
-  overflow-wrap: break-word; /*labfolder fix*/
-  word-wrap: break-word; /*labfolder fix*/
-  font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif;
-}
-.redactor_editor code,
-.redactor_editor pre {
-  font-family: Menlo, Monaco, monospace, sans-serif;
-}
-.redactor_editor div,
-.redactor_editor p,
-.redactor_editor ul,
-.redactor_editor ol,
-.redactor_editor table,
-.redactor_editor dl,
-.redactor_editor blockquote,
-.redactor_editor pre {
-  font-size: 14px;
-  line-height: 1.6em;
-}
-.redactor_editor p {
-/*   min-height: 22px; labfolder fix   */
-}
-.redactor_editor a {
-/*  labfolder fix, removed !important on both */
-  color: #15c;
-  text-decoration: underline;
-}
-.redactor_editor .redactor_placeholder {
-  color: #999 !important;
-  display: block !important;
-}
-/*
-	TYPOGRAPHY
-*/
-.redactor_editor object,
-.redactor_editor embed,
-.redactor_editor video,
-.redactor_editor img {
-  max-width: 100%;
-  width: auto;
-}
-.redactor_editor video,
-.redactor_editor img {
-  height: auto;
-}
-.redactor_editor div,
-.redactor_editor p,
-.redactor_editor ul,
-.redactor_editor ol,
-.redactor_editor table,
-.redactor_editor dl,
-.redactor_editor blockquote,
-.redactor_editor pre {
-  margin: 0;
-  margin-bottom: 10px !important;
-  border: none;
-  background: none !important;
-  box-shadow: none !important;
-}
-.redactor_editor iframe,
-.redactor_editor object,
-.redactor_editor hr {
-  margin-bottom: 15px !important;
-}
-.redactor_editor blockquote {
-  margin-left: 1.5em !important;
-  padding-left: 0 !important;
-  color: #777;
-  font-style: italic !important;
-}
-.redactor_editor ul,
-.redactor_editor ol {
-  padding-left: 2em !important;
-}
-.redactor_editor ul ul,
-.redactor_editor ol ol,
-.redactor_editor ul ol,
-.redactor_editor ol ul {
-  margin: 2px !important;
-  padding: 0 !important;
-  padding-left: 2em !important;
-  border: none;
-}
-.redactor_editor dl dt {
-  font-weight: bold;
-}
-.redactor_editor dd {
-  margin-left: 1em;
-}
-.redactor_editor table {
-  border-collapse: collapse;
-  font-size: 1em !important;
-}
-.redactor_editor table td {
-  padding: 5px !important;
-  border: 1px solid #ddd;
-  vertical-align: top;
-}
-.redactor_editor table thead td {
-  border-bottom: 2px solid #000 !important;
-  font-weight: bold !important;
-}
-.redactor_editor code {
-  background-color: #d8d7d7 !important;
-}
-.redactor_editor pre {
-  overflow: auto;
-  padding: 1em !important;
-  border: 1px solid #ddd !important;
-  border-radius: 3px !important;
-  background: #f8f8f8 !important;
-  white-space: pre;
-  font-size: 90% !important;
-}
-.redactor_editor hr {
-  display: block;
-  height: 1px;
-  border: 0;
-  border-top: 1px solid #ccc;
-}
-/*
-	HEADERS
-*/
-.redactor_editor h1,
-.redactor_editor h2,
-.redactor_editor h3,
-.redactor_editor h4,
-.redactor_editor h5,
-.redactor_editor h6 {
-  margin-top: 0 !important;
-  padding: 0 !important;
-  background: none;
-  color: #000;
-  font-weight: bold;
-}
-.redactor_editor h1 {
-  font-size: 36px !important;
-  line-height: 1.111em !important;
-  margin-bottom: .15em !important;
-}
-.redactor_editor h2 {
-  font-size: 30px !important;
-  line-height: 1.111em !important;
-  margin-bottom: .25em !important;
-}
-.redactor_editor h3 {
-  font-size: 24px !important;
-  line-height: 1.333em !important;
-  margin-bottom: .2em !important;
-}
-.redactor_editor h4 {
-  font-size: 18px !important;
-  line-height: 1.5em !important;
-  margin-bottom: .2em !important;
-}
-.redactor_editor h5 {
-  font-size: 1em !important;
-  line-height: 1.6em !important;
-  margin-bottom: .25em !important;
-}
-.redactor_editor h6 {
-  font-size: .8em !important;
-  line-height: 1.6em !important;
-  text-transform: uppercase;
-  margin-bottom: .3em !important;
-}
-/*
-	TOOLBAR
-*/
-.redactor_toolbar {
-  position: relative;
-  top: 0;
-  left: 0;
-  margin: 0 !important;
-  padding: 0; /*"labfolder hack, was !important*/
-  list-style: none !important;
-  font-size: 14px !important;
-  font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif;
-  line-height: 1 !important;
-  background: #fff;
-  border: none;
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
-  z-index: 3;
-}
-.redactor_toolbar:after {
-  content: "";
-  display: table;
-  clear: both;
-}
-.redactor_toolbar.redactor-toolbar-overflow {
-  overflow-y: auto;
-  height: 29px;
-  white-space: nowrap;
-}
-.redactor_toolbar.redactor-toolbar-external {
-  z-index: 999;
-  box-shadow: none;
-  border: 1px solid rgba(0, 0, 0, 0.1);
-}
-body .redactor_air .redactor_toolbar {
-  padding-right: 2px !important;
-}
-.redactor_toolbar li {
-  vertical-align: top;
-  display: inline-block;
-  margin: 0 !important;
-  padding: 0 !important;
-  outline: none;
-  list-style: none !important;
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-.redactor_toolbar li a {
-  display: block;
-  color: #333;
-  text-align: center;
-  /*labfolder   padding: 9px 10px; */
-  padding: 10px 10px;
-  outline: none;
-  border: none;
-  text-decoration: none;
-  cursor: pointer;
-  zoom: 1;
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-.redactor_toolbar li a:hover {
-  outline: none;
-  background-color: #1f78d8;
-  color: #fff;
-}
-.redactor_toolbar li a:hover i:before {
-  color: #fff;
-}
-.redactor_toolbar li a:active,
-.redactor_toolbar li a.redactor_act {
-  outline: none;
-  background-color: #ccc;
-  color: #444;
-}
-.redactor_toolbar li a.redactor-btn-image {
-  width: 14px;
-  height: 14px;
-  background-position: center center;
-  background-repeat: no-repeat;
-}
-.redactor_button_disabled {
-  filter: alpha(opacity=30);
-  -moz-opacity: 0.3;
-  opacity: 0.3;
-}
-.redactor_button_disabled:hover {
-  outline: none;
-  background-color: transparent !important;
-  cursor: default;
-}
-.redactor_toolbar li a.fa-redactor-btn {
-  display: inline-block;
-  padding: 9px 10px 8px 10px;
-  line-height: 1;
-}
-.redactor_toolbar.redactor-toolbar-typewriter {
-  box-shadow: none;
-  background: rgba(240, 240, 240, 0.9);
-}
-.redactor_toolbar.redactor-toolbar-typewriter li a:hover {
-  outline: none;
-  background-color: #1f78d8;
-  color: #fff;
-}
-.redactor_toolbar.redactor-toolbar-typewriter li a:active,
-.redactor_toolbar.redactor-toolbar-typewriter li a.redactor_act {
-  outline: none;
-  background-color: #ccc;
-  color: #444;
-}
-.re-icon {
-  font-family: 'RedactorFont';
-  speak: none;
-  font-style: normal;
-  font-weight: normal;
-  font-variant: normal;
-  text-transform: none;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-.re-icon i:before {
-  position: relative;
-  font-size: 14px;
-}
-.re-video:before {
-  content: "\e600";
-}
-.re-unorderedlist:before {
-  content: "\e601";
-}
-.re-undo:before {
-  content: "\e602";
-}
-.re-underline:before {
-  content: "\e603";
-}
-.re-textdirection:before {
-  content: "\e604";
-}
-.re-fontcolor:before {
-  content: "\e605";
-}
-.re-table:before {
-  content: "\e606";
-}
-.re-redo:before {
-  content: "\e607";
-}
-.re-quote:before {
-  content: "\e608";
-}
-.re-outdent:before {
-  content: "\e609";
-}
-.re-orderedlist:before {
-  content: "\e60a";
-}
-.re-link:before {
-  content: "\e60b";
-}
-.re-horizontalrule:before {
-  content: "\e60c";
-}
-.re-italic:before {
-  content: "\e60d";
-}
-.re-indent:before {
-  content: "\e60e";
-}
-.re-image:before {
-  content: "\e60f";
-}
-.re-fullscreen:before {
-  content: "\e610";
-}
-.re-normalscreen:before {
-  content: "\e611";
-}
-.re-formatting:before {
-  content: "\e612";
-}
-.re-fontsize:before {
-  content: "\e613";
-}
-.re-fontfamily:before {
-  content: "\e614";
-}
-.re-deleted:before {
-  content: "\e615";
-}
-.re-html:before {
-  content: "\e616";
-}
-.re-clips:before {
-  content: "\e617";
-}
-.re-bold:before {
-  content: "\e618";
-}
-.re-backcolor:before {
-  content: "\e619";
-}
-.re-file:before {
-  content: "\e61a";
-}
-.re-alignright:before {
-  content: "\e61b";
-}
-.re-alignment:before,
-.re-alignleft:before {
-  content: "\e61c";
-}
-.re-alignjustify:before {
-  content: "\e61d";
-}
-.re-aligncenter:before {
-  content: "\e61e";
-}
-.re-gallery:before {
-  content: "\e61f";
-}
-/*
-	Toolbar classes
-*/
-.redactor_format_blockquote {
-  padding-left: 10px;
-  color: #666 !important;
-  font-style: italic;
-}
-.redactor_format_pre {
-  font-family: monospace, sans-serif;
-}
-.redactor_format_h1,
-.redactor_format_h2,
-.redactor_format_h3,
-.redactor_format_h4,
-.redactor_format_h5 {
-  font-weight: bold;
-}
-.redactor_format_h1 {
-  font-size: 30px;
-  line-height: 36px;
-}
-.redactor_format_h2 {
-  font-size: 24px;
-  line-height: 36px;
-}
-.redactor_format_h3 {
-  font-size: 20px;
-  line-height: 30px;
-}
-.redactor_format_h4 {
-  font-size: 16px;
-  line-height: 26px;
-}
-.redactor_format_h5 {
-  font-size: 14px;
-  line-height: 23px;
-}
-.redactor-toolbar-typewriter .redactor_dropdown .redactor_format_h1,
-.redactor-toolbar-typewriter .redactor_dropdown .redactor_format_h2,
-.redactor-toolbar-typewriter .redactor_dropdown .redactor_format_h3,
-.redactor-toolbar-typewriter .redactor_dropdown .redactor_format_h4,
-.redactor-toolbar-typewriter .redactor_dropdown .redactor_format_h5 {
-  font-size: 1em;
-  line-height: 1.6em;
-  text-transform: uppercase;
-}
-.redactor-toolbar-typewriter .redactor_dropdown .redactor_format_h2 {
-  font-size: .85em;
-}
-/*
-	Typewriter
-*/
-.redactor_editor.redactor-editor-typewriter {
-  background: #f5f5f5 !important;
-  padding: 25px 50px !important;
-}
-.redactor_editor.redactor-editor-typewriter div,
-.redactor_editor.redactor-editor-typewriter p,
-.redactor_editor.redactor-editor-typewriter ul,
-.redactor_editor.redactor-editor-typewriter ol,
-.redactor_editor.redactor-editor-typewriter table,
-.redactor_editor.redactor-editor-typewriter dl,
-.redactor_editor.redactor-editor-typewriter blockquote,
-.redactor_editor.redactor-editor-typewriter pre,
-.redactor_editor.redactor-editor-typewriter h1,
-.redactor_editor.redactor-editor-typewriter h2,
-.redactor_editor.redactor-editor-typewriter h3,
-.redactor_editor.redactor-editor-typewriter h4,
-.redactor_editor.redactor-editor-typewriter h5,
-.redactor_editor.redactor-editor-typewriter h6 {
-  font-family: 'Courier New', 'Lucida Console', Consolas, Monaco, monospace, sans-serif;
-  font-size: 18px !important;
-  line-height: 1.5em !important;
-  margin-bottom: 1.5em !important;
-}
-.redactor_editor.redactor-editor-typewriter h2 {
-  font-size: 14px !important;
-}
-.redactor_editor.redactor-editor-typewriter h1,
-.redactor_editor.redactor-editor-typewriter h2,
-.redactor_editor.redactor-editor-typewriter h3,
-.redactor_editor.redactor-editor-typewriter h4,
-.redactor_editor.redactor-editor-typewriter h5,
-.redactor_editor.redactor-editor-typewriter h6 {
-  text-transform: uppercase;
-}
-.redactor_editor.redactor-editor-typewriter a {
-  color: #000 !important;
-  text-decoration: underline !important;
-}
-/*
-	WYM
-*/
-.redactor_editor.redactor_editor_wym {
-  padding: 10px 7px 0 7px !important;
-  background: #f6f6f6 !important;
-}
-.redactor_editor.redactor_editor_wym div,
-.redactor_editor.redactor_editor_wym p,
-.redactor_editor.redactor_editor_wym ul,
-.redactor_editor.redactor_editor_wym ol,
-.redactor_editor.redactor_editor_wym table,
-.redactor_editor.redactor_editor_wym dl,
-.redactor_editor.redactor_editor_wym pre,
-.redactor_editor.redactor_editor_wym h1,
-.redactor_editor.redactor_editor_wym h2,
-.redactor_editor.redactor_editor_wym h3,
-.redactor_editor.redactor_editor_wym h4,
-.redactor_editor.redactor_editor_wym h5,
-.redactor_editor.redactor_editor_wym h6,
-.redactor_editor.redactor_editor_wym blockquote {
-  margin-top: 0;
-  margin-bottom: 5px !important;
-  padding: 10px !important;
-  border: 1px solid #e4e4e4 !important;
-  background-color: #fff !important;
-  z-index: 0;
-}
-.redactor_editor.redactor_editor_wym blockquote:before {
-  content: '';
-}
-.redactor_editor.redactor_editor_wym img {
-  position: relative;
-  z-index: 1;
-}
-.redactor_editor.redactor_editor_wym div {
-  border: 1px dotted #aaa !important;
-}
-.redactor_editor.redactor_editor_wym pre {
-  border: 2px dashed #e4e4e4 !important;
-  background-color: #f8f8f8 !important;
-}
-.redactor_editor.redactor_editor_wym ul,
-.redactor_editor.redactor_editor_wym ol {
-  padding-left: 2em !important;
-}
-.redactor_editor.redactor_editor_wym ul li ul,
-.redactor_editor.redactor_editor_wym ol li ul,
-.redactor_editor.redactor_editor_wym ul li ol,
-.redactor_editor.redactor_editor_wym ol li ol {
-  border: none !important;
-}
-/*
-	DROPDOWN
-*/
-.redactor_dropdown {
-  position: absolute;
-  top: 28px;
-  left: 0;
-  padding: 10px;
-  width: 200px;
-  background-color: #fff;
-  box-shadow: 0 1px 5px #bbb;
-  font-size: 13px;
-  font-family: Helvetica, Arial, Verdana, Tahoma, sans-serif;
-  line-height: 21px;
-}
-.redactor-toolbar-typewriter .redactor_dropdown {
-  font-family: 'Courier New', 'Lucida Console', Consolas, Monaco, monospace, sans-serif;
-  background-color: #f5f5f5;
-}
-.redactor_separator_drop {
-  padding: 0 !important;
-  border-top: 1px solid #ddd;
-  font-size: 0;
-  line-height: 0;
-}
-.redactor_dropdown a {
-  display: block;
-  padding: 3px 5px;
-  color: #000;
-  text-decoration: none;
-}
-.redactor_dropdown a:hover {
-  background-color: #dde4ef;
-  color: #444 !important;
-  text-decoration: none;
-}
-/*
-	MODAL
-*/
-#redactor_modal_overlay {
-  position: fixed;
-  top: 0;
-  left: 0;
-  margin: auto;
-  width: 100%;
-  height: 100%;
-  background-color: #000 !important;
-  filter: alpha(opacity=30);
-  -moz-opacity: 0.3;
-  opacity: 0.3;
-}
-#redactor_modal {
-  position: fixed;
-  top: 50%;
-  left: 50%;
-  padding: 0;
-  background: #fff;
-  color: #000;
-  font-size: 12px !important;
-  font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif;
-  box-shadow: 0 1px 10px rgba(0, 0, 0, 0.5);
-}
-#redactor_modal header {
-  padding: 20px 30px 5px 30px;
-  font-size: 16px;
-}
-#redactor_modal section {
-  padding: 20px 30px;
-}
-#redactor_modal label {
-  display: block !important;
-  float: none !important;
-  margin: 10px 0 3px 0 !important;
-  padding: 0 !important;
-  font-size: 12px !important;
-}
-#redactor_modal footer:after {
-  content: "";
-  display: table;
-  clear: both;
-}
-#redactor_modal footer div {
-  float: left;
-}
-#redactor_modal input[type="radio"],
-#redactor_modal input[type="checkbox"] {
-  position: relative;
-  top: -1px;
-}
-#redactor_modal input[type="text"],
-#redactor_modal input[type="password"],
-#redactor_modal input[type="email"],
-#redactor_modal textarea {
-  position: relative;
-  z-index: 2;
-  margin: 0;
-  padding: 1px 2px;
-  height: 23px;
-  border: 1px solid #ccc;
-  border-radius: 1px;
-  background-color: white;
-  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2) inset;
-  color: #333;
-  font-size: 13px;
-  font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif;
-  line-height: 1;
-  -moz-transition: border 0.3s ease-in;
-  transition: border 0.3s ease-in;
-}
-#redactor_modal textarea {
-  display: block;
-  margin-top: 4px;
-  line-height: 1.4em;
-}
-#redactor_modal input:focus,
-#redactor_modal textarea:focus {
-  outline: none;
-  border-color: #5ca9e4;
-  box-shadow: 0 0 0 2px rgba(70, 161, 231, 0.3), 0 1px 2px rgba(0, 0, 0, 0.2) inset;
-}
-#redactor_modal_close {
-  position: absolute;
-  top: 5px;
-  right: 3px;
-  width: 20px;
-  height: 20px;
-  color: #999;
-  font-size: 26px;
-  cursor: pointer;
-}
-#redactor_modal_close:hover {
-  color: #000;
-}
-.redactor_input {
-  width: 99%;
-  font-size: 14px;
-}
-.redactor_modal_box {
-  overflow: auto;
-  margin-bottom: 10px;
-  height: 350px;
-}
-#redactor_image_box {
-  overflow: auto;
-  margin-bottom: 10px;
-  height: 270px;
-}
-#redactor_image_box_select {
-  display: block;
-  margin-bottom: 15px !important;
-  width: 200px;
-}
-#redactor_image_box img {
-  margin-right: 10px;
-  margin-bottom: 10px;
-  max-width: 100px;
-  cursor: pointer;
-}
-#redactor_tabs {
-  margin-bottom: 18px;
-}
-#redactor_tabs a {
-  display: inline-block;
-  margin-right: 2px;
-  padding: 4px 14px;
-  border: 1px solid #d2d2d2;
-  border-radius: 3px;
-  background: #fff;
-  color: #000;
-  text-decoration: none;
-  line-height: 1;
-}
-#redactor_tabs a:hover,
-#redactor_tabs a.redactor_tabs_act {
-  border-color: #eee;
-  color: #999 !important;
-  text-decoration: none !important;
-}
-.redactor_modal_btn_hidden {
-  display: none;
-}
-#redactor_modal footer button {
-  position: relative;
-  width: 100%;
-  padding: 10px 16px;
-  margin: 0;
-  outline: none;
-  border: none;
-  background-color: #ddd;
-  color: #000;
-  text-align: center;
-  text-decoration: none;
-  font-weight: normal;
-  font-size: 12px;
-  font-family: Arial, Helvetica, Verdana, Tahoma, sans-serif;
-  line-height: 1;
-  cursor: pointer;
-}
-#redactor_modal footer button:hover {
-  color: #777;
-  background: none;
-  background: #bbb;
-  text-decoration: none;
-}
-#redactor_modal footer button.redactor_modal_delete_btn {
-  background: none;
-  color: #fff;
-  background-color: #b52525;
-}
-#redactor_modal footer button.redactor_modal_delete_btn:hover {
-  color: rgba(255, 255, 255, 0.6);
-  background-color: #881b1b;
-}
-#redactor_modal footer button.redactor_modal_action_btn {
-  background: none;
-  color: #fff;
-  background-color: #2461b5;
-}
-#redactor_modal footer button.redactor_modal_action_btn:hover {
-  color: rgba(255, 255, 255, 0.6);
-  background-color: #1a4580;
-}
-/* Drag and Drop Area */
-.redactor_droparea {
-  position: relative;
-  margin: auto;
-  margin-bottom: 5px;
-  width: 100%;
-}
-.redactor_droparea .redactor_dropareabox {
-  position: relative;
-  z-index: 1;
-  padding: 60px 0;
-  width: 99%;
-  border: 1px dashed #ddd;
-  background: #fff;
-  text-align: center;
-}
-.redactor_droparea .redactor_dropareabox,
-.redactor_dropalternative {
-  color: #555;
-  font-size: 12px;
-}
-.redactor_dropalternative {
-  margin: 4px 0 2px 0;
-}
-.redactor_dropareabox.hover {
-  border-color: #aaa;
-  background: #efe3b8;
-}
-.redactor_dropareabox.error {
-  border-color: #dcc3c3;
-  background: #f7e5e5;
-}
-.redactor_dropareabox.drop {
-  border-color: #e0e5d6;
-  background: #f4f4ee;
-}
-/* =ProgressBar
------------------------------------------------------------------------------*/
-#redactor-progress {
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-  z-index: 1000000;
-  height: 10px;
-}
-#redactor-progress span {
-  display: block;
-  width: 100%;
-  height: 100%;
-  background-color: #3d58a8;
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent);
-  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent);
-  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent);
-  -webkit-animation: progress-bar-stripes 2s linear infinite;
-  -o-animation: progress-bar-stripes 2s linear infinite;
-  animation: progress-bar-stripes 2s linear infinite;
-  background-size: 40px 40px;
-}
-@-webkit-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-@-o-keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-@keyframes progress-bar-stripes {
-  from {
-    background-position: 40px 0;
-  }
-  to {
-    background-position: 0 0;
-  }
-}
-
-/* CUSTOM labfolder*/
-
-.re-orderedlist,
-.re-mendeley,
-.re-alignjustify,
-.re-lf-fontfamily,
-.re-link,
-.re-deleted,
-.re-backcolor,
-.re-lf-fontsize,
-.re-redo {
-	border-right: 1px solid #d2d2d2 !important;
-}
-
-a.re-lf-fontsize {
-  font-family: "Arial";
-  width: 35px !important;
-}
-
-.re-lf-fontfamily {
-  font-size: 14px;
-  overflow: hidden;
-  padding: 11px 9px 9px !important;
-  text-align: left !important;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  width: 75px !important;
-}
-
-.redactor_arial_font {
-  font-family: 'Arial';
-}
-
-.redactor_arial_font:before {
-  content: "Arial";
-}
-
-.redactor_times_font {
-  font-family: 'Times new roman';
-}
-
-.redactor_times_font:before {
-  content: "Times New Roman";
-}
-
-.redactor_dropdown_box_specialChars a{
-  display: inline-block;
-  height: 13px;
-  line-height: 13px;
-  margin: 1px;
-  text-align: center;
-  width: 13px;
-  word-break: break-all;
-}
-
-a.char_section {
-  background: #DDD;
-  border: 1px solid #FFF;
-  color: #000;
-  display: block;
-  font-weight: bold;
-  height: 22px;
-  line-height: 13px;
-  margin: 0;
-  text-align: left;
-  width: 190px;
-}
-
-/*a.char_section:hover {
-  color: #FFF !important;
-  background-color: #374858 !important;
-}*/
-
-.redactor_editor div.redactor_placeholder_container,
-.redactor_editor div.redactor_placeholder_container:hover{
-  border: 1px solid #AAA;
-  border-radius: 5px;
-  color: #374858;
-  display: inline-block;
-  margin: 0 !important;
-  padding: 2px 5px;
-  text-decoration: none;
-  background: linear-gradient(to bottom, #f1f1f1 0%,#e2e2e2 100%) !important;
-  user-select: none;
-}
-
-.redactor_editor div.redactor_placeholder_input{
-  background: #FFF !important;
-  border: 1px solid #DDD;
-  box-shadow: inset 0 0 2px #000;
-  color: #374858;
-  display: block;
-  min-width: 50px;
-  padding: 1px 5px;
-  font-size: 15px;
-  border-radius: 3px;
-  line-height: 15px;
-  margin: 0px 5px !important;
-  text-align: center;
-  text-decoration: none;
-}
-
-.redactor_editor div.not_edited{
-  color: #888;
-}
-
-.redactor_editor .default_textfield p{
-  line-height: 1em;
-  color: #374858;
-}
-
-.redactor_toolbar li a.redactor_shortcut {
-  border-color: #b5b5b5;
-  background-color: #ddd;
-}
-
-.tab:before {
-  content: "\0009";
-}
diff --git a/unittests/example_labfolder_data/static/css/tree.css b/unittests/example_labfolder_data/static/css/tree.css
deleted file mode 100644
index 0256223a..00000000
--- a/unittests/example_labfolder_data/static/css/tree.css
+++ /dev/null
@@ -1,454 +0,0 @@
-/**************
-*  basic.css  *
-**************/
-/********************
-*  Media variables  *
-********************/
-/**********
-* colors  *
-***********/
-/***********
-* helpers  *
-************/
-.list_vertical > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_vertical > ul li {
-  list-style-type: none;
-}
-.list_horizontal > ul {
-  margin: 0;
-  padding: 0;
-}
-.list_horizontal > ul > li {
-  list-style-type: none;
-  float: left;
-  position: relative;
-}
-/*************
-* functions  *
-**************/
-/******
-* css *
-******/
-body {
-  color: #374858;
-}
-.clearfix:after {
-  content: " ";
-  visibility: hidden;
-  display: block;
-  height: 0;
-  clear: both;
-}
-.treeInPopup .treeline {
-  background-repeat: no-repeat;
-  color: #374858;
-  cursor: pointer;
-  border: 1px solid transparent;
-  display: block;
-  font-size: 14px;
-  height: 21px;
-  line-height: 22px;
-  outline: none;
-  padding-left: 5px;
-  text-decoration: none;
-}
-/* .treeline:hover{ */
-/* 	background-position: 0 0; */
-/* 	border: 1px solid #69bfee; */
-/* 	text-decoration: none; */
-/* } */
-.treeline:hover .icon-arrow_down,
-.treeline:hover .icon-arrow_right,
-.treeline:hover .icon-folder,
-.treeline:hover .icon-notebook,
-.treeline:hover .icon-template,
-.treeline:hover .name,
-.treeline:hover .updateTS {
-  /* 	color: #69bfee; */
-}
-.treeline.active {
-  background-color: #ededed;
-}
-.treeInPopup .treeline.active {
-  background-color: transparent;
-}
-.treeline.is_hidden_item > * {
-  opacity: 0.4;
-}
-.treeline img {
-  vertical-align: top;
-}
-.treeline .icon-arrow_right {
-  font-size: 33px;
-  margin-right: -10px;
-  margin-left: -3px;
-  vertical-align: -4px;
-}
-.treeInPopup .icon-arrow_right {
-  font-size: 23px;
-  margin-right: -6px;
-  line-height: 14px;
-  margin-left: -3px;
-}
-.treeline {
-  position: relative;
-}
-.treeline span {
-  float: left;
-  margin-right: 5px;
-}
-.treeline .icon-template {
-  float: left;
-}
-.treeInPopup .name {
-  font-size: 12px;
-  overflow: hidden;
-}
-.treeline .updateTS {
-  font-size: 15px;
-  float: right;
-  margin-right: 15px;
-}
-.treeline .tree_button {
-  float: right;
-  margin-top: 0;
-  margin-right: 10px;
-  position: absolute;
-  right: 0;
-  top: 1px;
-  opacity: 0;
-  transition: opacity 0.3s;
-  display: block;
-}
-.treeline:hover .tree_button {
-  opacity: 1;
-}
-.treeline_children .tree_button {
-  right: 116px;
-}
-.droppable_folder {
-  background-color: #e4eef7 !important;
-}
-.hover_droppable_folder {
-  background-color: #d0e1f1 !important;
-}
-.treeline:hover .tree_button {
-  display: inline;
-}
-.treeline.active .tree_button {
-  display: inline;
-}
-.treeline_children {
-  display: none;
-  margin-left: 15px;
-}
-.treeInPopup .treeline_children {
-  margin-left: 20px;
-}
-.treeline_children_empty {
-  font-size: 15px;
-  font-style: italic;
-  padding: 10px 0 10px 30px;
-}
-.treeInPopup .treeline_children_empty {
-  font-size: 12px;
-  font-style: italic;
-  padding: 0 0 0 25px;
-}
-.treeInPopupContainer {
-  display: none;
-  background: white;
-  box-sizing: border-box;
-  max-height: 150px;
-  margin-top: 10px;
-  overflow-y: auto;
-  -webkit-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-  -moz-box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-  box-shadow: inset 0 2px 1px rgba(55, 72, 88, 0.2);
-}
-.treeInPopupContainer img {
-  display: block;
-  margin: auto;
-}
-.treeInPopup {
-  overflow-y: auto;
-  height: 148px;
-  padding-top: 10px;
-  margin-top: 2px;
-}
-.treeInPopup .treeline.selected {
-  background-color: #e6ebef;
-}
-.tree_my_eln_projects,
-.tree_my_eln_templates {
-  max-width: 900px;
-}
-.tree_my_eln_projects .folder_dn-img,
-.tree_my_eln_templates .folder_dn-img,
-.tree_my_eln_projects .project_s-img,
-.tree_my_eln_templates .project_s-img {
-  margin-top: 2px;
-}
-.treeline {
-  color: #4b6277;
-  background-repeat: no-repeat;
-  cursor: pointer;
-  border: 1px solid transparent;
-  display: block;
-  font-size: 14px;
-  height: 26px;
-  line-height: 20px;
-  outline: none;
-  padding: 2px 8px 2px 4px;
-  text-decoration: none;
-  transition: background 0.1s ease;
-}
-.treeline:hover {
-  background: #e0e6eb;
-  text-decoration: none;
-}
-.treeline .updateTS {
-  font-size: 13px;
-  float: right;
-  margin-right: 15px;
-}
-.treeline .tree_button {
-  float: right;
-  margin: 0 10px;
-}
-.treeline .tree_button button {
-  padding: 3px;
-  background: transparent;
-  cursor: pointer;
-}
-.treeline .name {
-  white-space: nowrap;
-  text-overflow: ellipsis;
-  display: block;
-  overflow: hidden;
-  padding: 0;
-  margin-left: 0;
-  line-height: 1.5;
-  float: left;
-}
-.treeline .icon-template {
-  margin-top: 3px;
-}
-.settings_panel {
-  position: absolute;
-  right: 10px;
-  background: #fdfdfd;
-  border: solid 1px #bac7d4;
-  top: 23px;
-  right: -58px;
-  display: none;
-  z-index: 10;
-  -webkit-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  -moz-box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  box-shadow: 0 4px 10px rgba(55, 72, 88, 0.3);
-  border: 1px solid #bac7d4;
-}
-.show_settings .settings_panel {
-  display: block;
-}
-.settings_panel > ul {
-  margin: 0;
-  padding: 0;
-}
-.settings_panel > ul li {
-  list-style-type: none;
-}
-.settings_panel .more_options_item {
-  min-width: 140px;
-  font-size: 12px;
-  padding-left: 5px;
-  cursor: pointer;
-}
-.settings_panel .menu_arrow-img {
-  position: absolute;
-  top: -11px;
-  left: 60px;
-}
-.settings_panel > ul > li {
-  padding: 2px 7px 2px 6px;
-  display: block;
-  text-align: left;
-  cursor: pointer;
-  line-height: 20px;
-  position: relative;
-}
-.settings_panel > ul > li:hover {
-  background: #ecf0f3;
-}
-.settings_panel > ul > li > span {
-  right: 0;
-  top: 3px;
-  position: absolute;
-}
-.settings_panel > ul li:first-child {
-  margin-top: 8px;
-}
-.group_more_options {
-  width: 200px;
-}
-.treeline .name {
-  overflow: hidden;
-  margin-left: 5px;
-  max-width: 38%;
-}
-.treeline .details {
-  color: #39A0E4;
-  font-size: 13px;
-  float: right;
-  margin-right: 40px;
-}
-@media only screen and (max-width: 1024px) {
-  .treeline .more_options {
-    opacity: 1;
-    right: 0;
-  }
-  .treeline .box-last-update {
-    margin-left: 20px;
-  }
-  .treeline .box-last-update label {
-    display: none;
-  }
-  .treeline .updateTS {
-    display: none;
-  }
-  .treeline .name {
-    max-width: 30%;
-  }
-  .treeline .box-owner label {
-    display: none;
-  }
-}
-/* Projects list tree */
-.projects-list .headers,
-.templates-list .headers {
-  padding: 2px 8px 2px 4px;
-  max-width: 900px;
-  text-align: right;
-}
-.projects-list .headers div,
-.templates-list .headers div {
-  text-align: center;
-  display: inline-block;
-}
-.projects-list .headers .owner,
-.templates-list .headers .owner {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  width: 160px;
-  text-align: center;
-  display: inline-block;
-  margin: 0;
-  padding: 0 20px;
-}
-.projects-list .headers .update,
-.templates-list .headers .update {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  width: 150px;
-  text-align: center;
-  display: inline-block;
-  margin: 0;
-  padding: 0 20px;
-}
-.projects-list .headers .created,
-.templates-list .headers .created {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  width: 150px;
-  text-align: center;
-  display: inline-block;
-  margin: 0;
-  padding: 0 20px;
-}
-.projects-list .details,
-.templates-list .details {
-  margin: 0;
-}
-.projects-list .box-owner,
-.templates-list .box-owner {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  width: 160px;
-  text-align: center;
-  display: inline-block;
-  margin: 0;
-  padding: 0 20px;
-}
-.projects-list .box-owner label,
-.templates-list .box-owner label {
-  display: none;
-}
-.projects-list .box-last-update,
-.templates-list .box-last-update {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  width: 150px;
-  text-align: center;
-  display: inline-block;
-  margin: 0;
-  padding: 0 20px;
-}
-.projects-list .box-last-update label,
-.templates-list .box-last-update label {
-  display: none;
-}
-.projects-list .updateTS,
-.templates-list .updateTS {
-  white-space: nowrap;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  width: 150px;
-  text-align: center;
-  display: inline-block;
-  margin: 0;
-  padding: 0 20px;
-}
-.projects-list .tree_button,
-.templates-list .tree_button {
-  right: -6px;
-}
-.projects-list .treeline_children .tree_button,
-.templates-list .treeline_children .tree_button {
-  right: 132px;
-}
-@media only screen and (max-width: 1024px) {
-  .projects-list .headers .created,
-  .templates-list .headers .created {
-    display: none;
-  }
-  .projects-list .box-owner,
-  .templates-list .box-owner {
-    margin-right: 0;
-  }
-  .projects-list .updateTS,
-  .templates-list .updateTS {
-    display: none;
-  }
-  .projects-list .tree_button,
-  .templates-list .tree_button {
-    right: -10px !important;
-  }
-  .projects-list .treeline,
-  .templates-list .treeline,
-  .projects-list .headers,
-  .templates-list .headers {
-    padding-right: 25px;
-  }
-  .projects-list .name,
-  .templates-list .name {
-    max-width: 22%;
-  }
-}
diff --git a/unittests/example_labfolder_data/static/font/icons11.eot b/unittests/example_labfolder_data/static/font/icons11.eot
deleted file mode 100644
index 770bd07fd2bc41d7243ae8510907ae361dc6149f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 37880
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

diff --git a/unittests/example_labfolder_data/static/font/icons11.svg b/unittests/example_labfolder_data/static/font/icons11.svg
deleted file mode 100644
index e0ca1099..00000000
--- a/unittests/example_labfolder_data/static/font/icons11.svg
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
-<svg xmlns="http://www.w3.org/2000/svg">
-<metadata>Generated by IcoMoon</metadata>
-<defs>
-<font id="icomoon" horiz-adv-x="512">
-<font-face units-per-em="512" ascent="480" descent="-32" />
-<missing-glyph horiz-adv-x="512" />
-<glyph unicode="&#x20;" d="" horiz-adv-x="256" />
-<glyph unicode="&#xe600;" d="M354.080 402.768c-77.872 77.824-204.080 77.824-281.952 0-77.792-77.904-77.792-204.080 0-281.936 67.136-67.216 170.24-76.272 247.28-27.568l104.784-104.784 62.176 62.176-104.72 104.8c48.672 77.024 39.584 180.128-27.568 247.312zM213.136 124.272c-75.92 0.048-137.504 61.616-137.488 137.504 0 75.968 61.536 137.504 137.456 137.472 75.968 0.080 137.568-61.504 137.504-137.504 0-75.92-61.52-137.424-137.456-137.472zM117.392 238.32v46.912h191.424v-46.912h-191.424z" horiz-adv-x="496" />
-<glyph unicode="&#xe601;" d="M354.080 402.768c-77.872 77.824-204.080 77.824-281.952 0-77.792-77.904-77.792-204.080 0-281.904 67.136-67.232 170.24-76.272 247.28-27.568l104.784-104.8 62.176 62.176-104.72 104.8c48.688 77.008 39.6 180.128-27.568 247.296zM213.136 124.288c-75.904 0.032-137.504 61.616-137.488 137.488 0 75.968 61.536 137.504 137.456 137.472 75.968 0.080 137.552-61.504 137.504-137.504-0.016-75.888-61.536-137.408-137.456-137.456zM117.392 238.32v46.912h72.272v72.256h46.912v-72.256h72.24v-46.912h-72.24v-72.272h-46.912v72.272h-72.272z" horiz-adv-x="496" />
-<glyph unicode="&#xe602;" d="M360.192 411.104c2.352-8.736 4.064-17.456 5.216-26.192 0.624-8.736 1.168-18.032 0.624-27.904 0 0-25.056 74.192-81.472 81.456-7.584 2.304-15.168 2.304-22.64 0.56-7.648-1.728-14.592-6.96-21.024-14.56l16.912-7.536-48.336-14.544-19.776 45.968 16.88-8.144c10.448 11.072 22.128 20.944 35.472 29.072 12.816 8.736 26.784 11.648 42.496 10.48 21.552-1.744 37.84-8.72 48.944-19.808 11.6-11.6 20.288-27.872 26.688-48.832v0zM360.192 351.184c32.016 0 57.632-26.192 57.632-58.176 0-31.44-25.616-57.616-57.632-57.616-31.952 0-57.6 26.176-57.6 57.616 0 31.984 25.648 58.176 57.6 58.176v0zM297.328 221.44h125.744c26.704 0 48.288-21.568 48.288-48.32v-146.032h-24.416v120.976h-26.224v-120.976h-119.824v120.976h-26.208v-120.976h-25.632v146.032c0 26.752 21.552 48.32 48.272 48.32v0zM111.152 447.776c32.048 0 57.648-25.6 57.648-57.632 0-32-25.6-57.6-57.648-57.6-31.984 0-57.632 25.6-57.632 57.6 0 32.032 25.648 57.632 57.632 57.632v0zM48.32 318.592h125.696c26.816 0 48.864-22.112 48.864-48.88v-146.048h-25.008v121.632h-26.176v-121.632h-119.904v121.632h-26.16v-121.632h-25.632v146.048c0 26.784 21.552 48.88 48.32 48.88zM66 49.824c-0.976 8.992-1.344 17.888-1.12 26.72 0.848 8.688 1.68 17.968 3.808 27.664 0 0 13.152-77.232 67.76-93.232 7.072-3.504 14.528-4.64 22.304-4.144 7.76 0.56 15.472 4.64 22.928 11.12l-15.456 10.128 49.952 6.8 12.384-48.512-15.408 10.72c-12.080-9.312-25.12-17.264-39.616-23.2-14.016-6.608-28.272-7.312-43.584-3.744-21.008 5.104-36 14.56-45.168 27.232-9.696 13.312-15.792 30.768-18.8 52.448v0z" horiz-adv-x="464" />
-<glyph unicode="&#xe603;" d="M218.928 480c75.712 0 136.448-60.64 136.448-135.776 0-75.072-60.736-136.416-136.448-136.416-75.088 0-135.808 61.344-135.808 136.416 0 75.12 60.72 135.776 135.808 135.776v0zM107.424 218.448c-58.864 0-107.424-48.576-107.424-107.424v-143.024h444.128v143.024c0 58.848-47.904 107.424-107.456 107.424h-28.032c-25.344-19.168-56.816-30.8-91.008-30.8-34.24 0-65.728 11.632-90.352 30.8h-19.856z" />
-<glyph unicode="&#xe604;" d="M198.336 291.984l-89.296 44.896 61.44 123.12c9.904 19.856 37.952 25.952 62.64 13.616v0c24.736-12.336 36.72-38.4 26.8-58.24l-61.584-123.408zM178.336 224.224l20.864-10.432 88.864 178.048-20.896 10.416-88.848-178.032zM0 2.048c5.248 6.096 12.944 14.64 21.744 24.24l-15.888 7.936c-1.984-10.832-3.968-21.68-5.856-32.176zM94.544 104.224l91.264 183.696-69.040 34.464-91.728-183.792c0 0-0.016-0.208-0.016-0.256l69.136-34.496c0.256 0.224 0.384 0.384 0.384 0.384zM23.28 129.056c-2.928-15.92-9.216-49.824-15.776-85.584l20.608-10.304c21.6 23.552 47.472 50.944 59.584 63.712l-64.416 32.176zM115.28 16.352c2.176 12.656 1.504 25.216 0.576 37.92 10.288 1.28 16.48 8.144 23.824 14.592 17.44 15.168-0.080 64.032-24.016 45.216-9.984-7.856-10.928-38-10.736-50.192-8-0.512-9.52 3.44-17.904-0.784 2.224-7.648 11.664-9.968 18.496-9.568 1.008-12.032 1.632-23.424-0.448-35.424-1.296-7.536-2.512-32.56-10.272-38.368-16.496-4.768-20.672 7.552-34.656 6.016 3.184-9.568 14.432-18.224 24.832-18.224 26.752 0 26.752 28.208 30.304 48.8zM115.28 64.672c-0.064 6.688 1.472 42.016 10.48 42.016 22.912 0 6.608-39.328-10.48-42.016zM133.2-21.712c1.2 3.072-0.016 7.392-5.552 9.568h-1.616l-2.528-2.992c-2.688-7.136 1.36-9.296 2.672-9.808l7.024 3.216zM231.408 33.36c-15.424-0.352-32.704 15.584-41.488 27.168 66.064 26.432-1.248 110-35.216 62.304 34.48 9.072 85.072-30.912 25.216-58.144 0.192 17.248-0.032 39.424-0.048 40.688l-10.368-0.112c0.464-30.336-10.352-80.848-0.048-98.976 6.704 16.24 10.16 32.928 10.336 50.048 21.68-16.944 31.376-32.096 61.136-33.376l0.512 10.336c-3.552 0.192-6.88 0.112-10.032 0.064-10.24-0.24 3.152 0.048 0 0zM254.672 36.016l-1.888 7.344-1.824-2.816 1.472 2.912c-0.96 0.48-5.712 3.28-5.728 3.296l-5.232-8.944c4.544-2.656 7.392-4.32 9.536-4.32 1.456 0 2.576 0.768 3.68 2.528zM275.424 143.104l-10.272-1.408c4.544-33.552 5.376-59.856-0.928-93.968-0.672-3.616-1.328-7.168-1.952-10.688l10.208-1.776c6.688 38.128 8.080 69.84 2.944 107.84zM306.752 120.576c17.952 22-4.272 46.8-25.104 51.6-22.256 5.168-28.464-5.808-29.248-7.424l-6.896-16.736 9.584-3.952 6.624 16.16c0.032 0.064 3.52 5.12 17.616 1.856 34.192-7.888 22.24-33.376 1.84-48 67.984-8.208 22.96-48.24-8.656-71.12l6.080-8.4c16.48 11.92 89.92 73.68 28.176 86.016zM357.776 115.088c32.512-38.336 37.136 13.168 46.016 30.544 0.192-0.304 16.48-22 21.44-20.608 4.656 7.232 6.608 14.864 5.84 22.928 11.36-45.888 62.112 21.504 29.2 31.424-24.016 7.296-40.512-14.944-39.552-35.184-12.688 19.104-19.424 12.368-29.808 0.832-2.352 1.872-5.008 2.592-7.968 2.16 15.6-59.6-12.496-7.68-32.48-12.512-5.168-1.2-17.712-45.68-18.96-50.72l10.032-2.608c3.664 11.696 10.64 22.88 16.24 33.744zM431.52 156.96c-0.784 9.264 18.752 14.608 25.76 12.48 5.728-1.728-1.856-45.072-18.528-9.2l-7.232-3.28zM434.816 54.752c26.016 0 65.104 126.64 83.024 150.016-0.912-6.352-1.504-16.016 0.288-22.592l10.016 2.704c-2.384 8.672 4.848 31.024-10.336 31.152-15.664-0.704-12.48-34.32-23.552-41.2 9.36 68.176-60.432-7.216-14.544-11.68-7.488-8.896-16.56-15.584-20.144-24.688v0c-0.592-6.704-61.52-83.712-24.752-83.712v0zM460.4 115.216c0.128-19.024-8.608-39.424-25.072-49.76-11.296 11.232 16.496 43.376 25.072 49.76 0.016-2.976-1.52-1.136 0 0zM476.816 174.224c-0.8 9.568-3.232 11.808 2.576 17.92 5.168-5.488 6.512-11.824 4.016-19.008-2.192 0.208-4.368 0.576-6.512 1.088-0.048 0-0.064 0-0.080 0zM548.928 201.248c7.232-7.632-16.864-18.544-11.968-18.304 5.856 0.288 23.472 12.080 25.296 16.624 2.912 7.264-3.344 13.648-9.12 11.424-21.584-8.336-7.232 20.624-6.176 22.16-6.352-9.296-19.392-12.048-14.224-28.384z" />
-<glyph unicode="&#xe605;" d="M257.952 353.008c-82-14.352-146.592-62.288-195.424-136.128l-68.112 51.056 43.296-183.776 193.968 63.2-79.296 26.416c43.152 66.72 76.432 86.064 138.448 103.28 32.976 9.152 80.768 4.576 127.888-20.736 39.472-21.28 58.704-50.64 83.392-112.16 6.080 4.56 12.128 4.56 16.848 2-6.080 52.448-26.416 104.736-69.872 149.632-43.936 45.376-117.008 70.208-191.152 57.232z" />
-<glyph unicode="&#xe606;" d="M0.24-36.752l-0.24 516.752 257.44-257.424z" />
-<glyph unicode="&#xe607;" d="M443.376 480l-443.376-256 443.376-256z" />
-<glyph unicode="&#xe608;" d="M0 478.816l516.752 0.24-257.424-257.44z" />
-<glyph unicode="&#xe609;" d="M256 424.576c110.592 0 200.592-89.984 200.592-200.56 0-110.608-90.016-200.592-200.592-200.592-110.608 0-200.56 90-200.56 200.592 0 110.592 89.952 200.56 200.56 200.56zM256 480c-141.376 0-256-114.608-256-255.984 0-141.408 114.624-256.016 256-256.016 141.392 0 256 114.608 256 256.016 0 141.376-114.608 255.984-256 255.984v0zM97.664 224.016h158.352v158.336c-87.456 0-158.352-70.896-158.352-158.336z" />
-<glyph unicode="&#xe60a;" d="M466.112 482.208l5.696-120.752-14.416 0.016c-2.8 21.248-6.576 36.448-11.392 45.536-7.84 14.672-18.272 25.52-31.312 32.464s-30.176 10.432-51.44 10.432h-72.528v-393.36c0-31.632 3.424-51.36 10.256-59.216 9.616-10.64 24.416-15.952 44.416-15.952h17.84v-14.016h-218.288v14.016h18.224c21.776 0 37.216 6.608 46.32 19.76 5.568 8.096 8.368 26.576 8.368 55.408v393.36h-61.888c-24.048 0-41.12-1.776-51.264-5.328-13.136-4.768-24.416-14.048-33.792-27.696-9.376-13.648-14.912-32.144-16.688-55.44h-14.416l6.080 120.752h420.24z" />
-<glyph unicode="&#xe60b;" d="M45.664 436.128v-83.616l83.632 83.616h-83.632zM45.664 265.488v-253.616h308.48v424.256h-205.984v-104.304l-102.816 0.544 0.32-66.896zM0-32v512h399.856v-512h-399.856zM306.416 319.552v-38.592h-110.048v38.592h110.048zM327.376 340.528h-151.968v-80.512h151.968v80.512zM99.28 264.512v59.008l-14.96-13.008v14.432l14.96 12.992h13.504v-73.424h-13.504zM306.416 211.152v-38.576h-110.048v38.576h110.048zM327.376 232.128h-151.968v-80.512h151.968v80.512zM79.792 156.112v12.064l27.424 31.872c1.376 1.584 2.352 3.024 2.944 4.336 0.592 1.296 0.88 2.816 0.88 4.528 0 2.752-0.752 4.976-2.272 6.656-1.504 1.68-3.712 2.528-6.592 2.528-1.088 0-2.176-0.144-3.248-0.464-1.072-0.304-2.032-0.816-2.88-1.552-0.864-0.72-1.552-1.68-2.064-2.896-0.512-1.2-0.768-2.688-0.768-4.48h-13.408c0 3.376 0.592 6.384 1.744 9.024 1.168 2.64 2.752 4.896 4.736 6.752 2 1.856 4.352 3.264 7.072 4.24 2.704 0.96 5.648 1.44 8.816 1.44 3.232 0 6.224-0.496 8.992-1.488 2.768-1.008 5.136-2.416 7.104-4.224 1.968-1.824 3.52-4.064 4.624-6.704 1.12-2.656 1.664-5.616 1.664-8.928 0-1.792-0.176-3.392-0.528-4.784-0.336-1.408-0.848-2.768-1.488-4.064-0.656-1.312-1.472-2.608-2.48-3.872-0.992-1.28-2.112-2.624-3.344-4.080l-20.528-23.824h28.352v-12.064h-44.752zM306.416 93.296v-38.576h-110.048v38.576h110.048zM327.376 114.256h-151.968v-80.512h151.968v80.512zM124.784 59.488c0-3.632-0.624-6.832-1.856-9.584-1.248-2.752-2.912-5.056-5.056-6.864-2.128-1.84-4.608-3.184-7.44-4.080-2.832-0.896-5.84-1.344-8.992-1.344-2.96 0-5.84 0.416-8.672 1.232-2.816 0.832-5.312 2.128-7.472 3.872-2.176 1.76-3.904 3.984-5.216 6.704-1.312 2.736-2 6-2.064 9.856h13.408c0.064-1.664 0.368-3.088 0.928-4.288 0.56-1.184 1.264-2.208 2.16-2.992 0.896-0.784 1.952-1.376 3.152-1.744 1.2-0.384 2.464-0.576 3.776-0.576 2.88 0 5.248 0.88 7.12 2.624 1.856 1.76 2.784 4.288 2.784 7.584 0 3.088-0.896 5.536-2.688 7.376-1.792 1.808-4.336 2.736-7.632 2.736h-1.952v11.648h1.952c3.312 0 5.664 0.88 7.12 2.624 1.44 1.744 2.16 3.936 2.16 6.544 0 3.088-0.896 5.424-2.688 7.008-1.792 1.584-3.888 2.368-6.288 2.368-2.544 0-4.672-0.784-6.352-2.32-1.696-1.552-2.608-3.728-2.736-6.544h-13.408c0.064 3.312 0.704 6.24 1.904 8.816 1.2 2.576 2.8 4.768 4.8 6.56 2 1.776 4.352 3.168 7.056 4.128 2.72 0.96 5.616 1.44 8.72 1.44 3.232 0 6.224-0.512 8.992-1.552 2.752-1.024 5.136-2.464 7.152-4.32 2-1.872 3.552-4.080 4.672-6.656 1.104-2.576 1.664-5.408 1.664-8.512 0-3.984-0.816-7.168-2.448-9.536-1.632-2.384-3.648-4.208-6.064-5.52 2.608-1.376 4.832-3.392 6.704-6.032 1.856-2.656 2.784-6.208 2.784-10.672z" />
-<glyph unicode="&#xe60c;" d="M718.384 16.192c0-26.624-21.552-48.192-48.176-48.192h-512.352c-26.624 0-48.192 21.568-48.192 48.192v127.808l-109.68 79.984 109.68 80v127.808c0 26.592 21.568 48.192 48.192 48.192h512.336c26.624 0 48.176-21.584 48.176-48.192v-415.632z" horiz-adv-x="720" />
-<glyph unicode="&#xe60d;" d="M664.704 16.16c0-26.608-21.584-48.16-48.192-48.16h-424.976c-26.608 0-48.192 21.568-48.192 48.16v77.2c0 0-1.488 6.128-2.544 8.304-1.072 2.208-5.232 7.376-5.232 7.376l-117.936 91.744c0 0-17.456 13.776-17.632 23.2-0.192 9.728 17.632 24.992 17.632 24.992l117.952 98.832c0 0 4.16 5.536 5.232 7.824 1.008 2.16 2.544 8.272 2.544 8.272v67.888c-0.016 26.64 21.568 48.208 48.176 48.208h424.976c26.624 0 48.192-21.568 48.192-48.208v-415.632z" horiz-adv-x="672" />
-<glyph unicode="&#xe60e;" d="M151.248 321.552v-43.296c0-9.424-6.736-16.944-16.032-19.168l9.056-1.008c0.032-0.464 2.272-24.704 12.384-50.656 6.112 5.024 10.128 12.672 10.128 21.552v93.264l-15.552-0.704zM139.984 451.088h-113.2c-14.688 0-26.784-12.976-26.784-28.512v-193.584c0-15.552 12.096-27.664 26.784-27.664h71.936c0.224 7.248 0.656 14.48 1.456 21.632h-37.936v14.688h40.512c1.344 6.672 2.96 13.584 5.040 20.736h-70.624c-12.080 0-21.584 8.64-21.584 19.872v138.272c0 10.352 9.504 19.888 21.584 19.888h92.48c1.856 0 3.616-0.288 5.328-0.704 6.912-1.68 12.4-6.48 14.848-12.416l16.992-14.192v13.472c0 15.552-12.096 28.512-26.816 28.512zM472.848 60.464v186.208h-118.016c-1.168-5.008-2.48-10.096-4.112-15.328l-35.44 4c-0.016 0.192-0.432 4.592-1.552 11.328h-56.048v-77.104l17.712 0.784v52.416h179.76v-137.056h-123.328l-23.728-24.384 52.288-0.272v-13.36h-60.976v-9.792h129.056v9.792h-57.408v13.296l101.792-0.528zM477.888 27.84h-222.512l-27.6-30.24 275.008-0.688zM239.36 150.544l18.224-14.368c-10.128-7.28-20.192-11.488-30.016-11.28-9.632 0.192-18.848 2.528-27.344 7.664-66.368 26.128-74.064 124.064-74.064 124.064-3.696-11.84-5.888-23.328-7.824-34.144-1.28-10.96-1.856-22.096-1.68-33.44 1.312-27.44 6.912-49.888 17.456-67.6 10.096-16.864 27.76-30.352 53.424-39.088 18.752-6.24 36.624-6.976 54.864-0.304 18.768 5.808 35.984 14.208 52.064 24.464l18.048-15.072-9.936 61.936-63.216-2.832zM272.032 411.024c-18.768 6.224-36.624 6.992-54.88 0.304-18.752-5.808-35.968-14.208-52.064-24.48l-18.032 15.072 9.936-61.936 63.216 2.832-18.224 14.368c10.128 7.28 20.208 11.504 30.016 11.264 9.648-0.192 18.848-2.512 27.344-7.648 66.368-26.144 74.064-124.064 74.064-124.064 3.696 11.84 5.872 23.312 7.808 34.128 1.28 10.96 1.856 22.112 1.696 33.44-1.328 27.456-6.896 49.904-17.456 67.616-10.096 16.864-27.76 30.336-53.424 39.088z" />
-<glyph unicode="&#xe60f;" d="M562.208 267.856c0-117.136-112.592-192.816-281.104-212.112-83.056-56.272-184.16-87.712-251.6-87.712 82.224 60.336 105.248 115.968 94.432 123.952-8.432 4.288-16.56 8.928-24.304 13.872-60.928 38.896-99.632 97.040-99.632 162 0 117.184 125.856 212.144 281.12 212.144s281.088-94.96 281.088-212.144z" horiz-adv-x="560" />
-<glyph unicode="&#xe610;" d="M449.296 234.64c-0.192 6.592-0.448 14-0.448 16.496l0.048 0.544v48.192l-1.12 4.128c-10.336 39.024-40.080 42.048-48.944 42.048-1.36 0-2.784-0.064-4.192-0.176-1.072-0.032-2.192-0.096-3.264-0.192-7.552 17.968-25.696 30-48.016 30-8.64 0-16.752-1.68-23.952-4.672-10.032 10.464-25.008 16.992-41.984 16.992-2.736 0-5.392-0.176-8-0.496v22.032c0 20.288 0 74.176-51.264 74.176l-2.224-0.032h-1.584c-30.88 0-55.072-21.584-55.072-49.12l0.736-121.92c-10.448 7.888-22.256 11.872-35.328 11.872-7.84 0-14.944-1.36-22.736-2.976-14.096-2.96-25.984-12.272-32.544-25.584-6.944-14.048-7.232-30.992-0.88-45.728l40.832-120.128 2.448-3.6 65.68-97.968 15.344-43.248 7.84-22.048 199.584 1.408 6.16 24.784 42.16 170.048 0.176 0.944c2.144 11.552 1.872 34.064 0.56 74.208zM416.4 166.464l-41.92-169.136-150.656-1.040-16.736 47.12-67.952 101.376-39.952 117.504c-5.344 11.088-1.008 24.88 9.52 27.072 6.032 1.28 11.232 2.288 16 2.288 7.456 0 13.936-2.464 21.024-10.384l31.232-68.624c1.040-2.336 3.968-3.456 7.056-3.456 4.432 0 9.248 2.336 9.456 6.848l-1.328 218.56c0 9.008 9.888 16.224 22.176 16.224 1.312 0 2.56 0.048 3.808 0.048 10.48 0 18.384-2.080 18.384-41.28v-145.76c0.080-3.328 4.704-4.848 9.344-4.848 4.656 0 9.328 1.568 9.328 4.448v75.536c0 8.992 9.92 16.24 22.224 16.24 12.288 0 22.208-7.248 22.208-16.24v-68.512c-0.272-5.008 4.944-7.12 10.288-7.12 6.064 0 12.336 2.72 11.152 7.088v56.272c0 8.976 9.92 16.224 22.224 16.224h0.096c12.32 0 18.896-7.248 18.896-16.224v-72.96c-0.384-4.512 3.568-6.48 7.6-6.48 4.512 0 9.152 2.448 8.016 6.464v41.984c0 8.992 6.32 17.456 18.608 17.456 0.816 0.096 1.6 0.144 2.368 0.144 9.248 0 14.352-6.864 17.2-17.584v-42.56c-0.544-5.776 3.072-71.872 0.32-86.608z" />
-<glyph unicode="&#xe611;" d="M400.528 147.184c53.024 83.856 43.12 196.128-30.016 269.264-84.8 84.736-222.176 84.736-306.976 0-84.72-84.816-84.72-222.208 0-306.96 73.072-73.184 185.36-83.056 269.216-30.016l114.096-114.112 67.696 67.712-114.016 114.112zM322.928 157.072c-58.496-58.432-153.312-58.432-211.712 0-58.496 58.496-58.496 153.232 0 211.68 58.4 58.544 153.232 58.544 211.712 0 58.416-58.432 58.416-153.184 0-211.68z" />
-<glyph unicode="&#xe612;" d="M26 442.752h396.4l-11.904 5.328 64.864-72.064-4.112 10.736v-396.384l16.048 16.048h-461.264l16.048-16.048-0.016 468.448-16.048-16.048zM26-25.664h477.312v418.592l-4.112 4.576-69.664 77.344h-419.584v-500.512l16.048 0.016zM100.448 202.528h314.704l-16.048 16.048v-225.76l16.048 16.048h-314.704l16.048-16.048v225.76l-16.048-16.048zM100.448-23.232h330.752v257.856h-346.8v-257.856h16.048zM153.328 272.208h222.656v195.456h-238.704v-195.456h16.048zM153.328 435.568h206.608l-16.048 16.048v-163.36l16.048 16.048h-206.608l16.048-16.048v163.36l-16.048-16.048zM158.176 458.8h112.848v-175.36h-112.848z" />
-<glyph unicode="&#xe613;" d="M488.272 480h-488.272v-428.192l4.208-4.688 71.264-79.12h429.2v512.016h-16.4zM395.68 246.576h-289.12v198.112h289.12v-198.112zM32.816 64.416v382.768h40.928v-233.44h354.768v233.424h43.344v-446.368h-97.44v174.464h-244.16v-174.464h-40.176l-57.248 63.6zM163.072 142.464h74.528v-134.272h-74.528v134.272z" />
-<glyph unicode="&#xe614;" d="M378.736 393.824h28.288v-339.632h-28.288zM322.144 139.088h141.504v-28.32h-141.504zM407.040 54.192h28.32v-28.32h-28.32zM435.344 25.872h56.592v-28.288h-56.592zM350.432 54.192h28.304v-28.32h-28.304zM293.824 25.872h56.608v-28.288h-56.608zM293.824 450.416h56.608v-28.288h-56.608zM435.344 450.416h56.592v-28.288h-56.592zM407.040 422.128h28.32v-28.32h-28.32zM350.432 422.128h28.304v-28.32h-28.304zM1.968 333.024c13.792 2.304 31.84 4.272 54.816 4.272 28.224 0 48.912-6.56 62.032-18.384 12.144-10.496 19.36-26.592 19.36-46.288 0-20.032-5.904-35.776-17.072-47.264-15.104-16.080-39.712-24.288-67.616-24.288-8.528 0-16.416 0.32-22.976 1.968v-88.624h-28.56v218.608zM30.528 226.336c6.24-1.648 14.112-2.304 23.632-2.304 34.464 0 55.472 16.736 55.472 47.264 0 29.216-20.672 43.328-52.192 43.328-12.48 0-22-0.992-26.912-2.304v-86zM170.368 223.712c0 18.704-0.336 34.8-1.312 49.568h25.28l0.992-31.184h1.312c7.216 21.328 24.624 34.8 43.984 34.8 3.28 0 5.584-0.32 8.208-0.992v-27.248c-2.96 0.656-5.904 0.992-9.856 0.992-20.352 0-34.8-15.424-38.736-37.088-0.656-3.936-1.312-8.544-1.312-13.456v-84.688h-28.56v109.296z" />
-<glyph unicode="&#xe615;" d="M0.928 439.424h369.28v-38.16h-369.28zM118.112 480.864h134.912v-28.624h-134.912zM125.504 388.304v-419.568h45.376v419.632c-13.552 0.096-28 0.096-45.376-0.064zM200.304 387.968v-419.232h45.36v418.464c-17.312 0.272-31.744 0.576-45.36 0.768zM17.744 386.144l21.296-374.832c0-23.52 19.040-42.576 42.544-42.576h14.512v419.168c-21.248-0.384-46.576-0.912-78.352-1.76zM275.072 386.736v-418.016h14.48c23.52 0 42.56 19.056 42.56 42.576l21.296 374.832c-31.856 0.144-57.152 0.368-78.336 0.608z" />
-<glyph unicode="&#xe616;" d="M254.128 353.008c81.984-14.352 146.592-62.288 195.44-136.128l68.096 51.072-43.28-183.792-193.968 63.2 79.296 26.416c-43.136 66.72-76.432 86.064-138.448 103.296-32.976 9.152-80.768 4.576-127.872-20.736-39.504-21.28-58.736-50.64-83.424-112.16-6.064 4.56-12.128 4.56-16.848 2 6.080 52.448 26.416 104.736 69.888 149.632 43.904 45.36 116.96 70.176 191.136 57.2z" />
-<glyph unicode="&#xe617;" d="M509.376-29.184h-505.808v505.808h505.808v-505.808zM35.168 2.432h442.592v442.592h-442.592v-442.592z" />
-<glyph unicode="&#xe618;" d="M447.984 480h-383.984c-35.344 0-64-28.656-64-64v-383.984c0-35.36 28.656-64 64-64h383.984c35.344 0 64 28.656 64 64v383.984c0 35.344-28.656 64-64 64zM158.736 12.544h-111.312v47.504h111.312v-47.504zM158.736 100.64h-111.312v47.504h111.312v-47.504zM158.736 188.752h-111.312v47.504h111.312v-47.504zM158.736 276.848h-111.312v47.504h111.312v-47.504zM311.648 12.544h-111.312v47.504h111.312v-47.504zM311.648 100.64h-111.312v47.504h111.312v-47.504zM311.648 188.752h-111.312v47.504h111.312v-47.504zM311.648 276.848h-111.312v47.504h111.312v-47.504zM464.56 12.544h-111.312v47.504h111.312v-47.504zM464.56 100.64h-111.312v47.504h111.312v-47.504zM464.56 188.752h-111.312v47.504h111.312v-47.504zM464.56 276.848h-111.312v47.504h111.312v-47.504z" />
-<glyph unicode="&#xe619;" d="M696.992 479.984c-88.96 0-163.52-85.44-182.4-199.456l16.8-16.8c13.472 111.792 82.48 197.28 165.616 197.28 92.72 0 168.224-106.336 168.224-237.008s-75.52-237.008-168.224-237.008c-78.4 0-144.24 76.096-162.8 178.544l-16.192-16.336c23.456-104.768 94.832-181.184 178.976-181.184 103.168 0 187.136 114.832 187.136 255.984-0.016 141.152-83.984 256-187.136 255.984v0zM768.784 223.984c0-139.648-37.872-237.008-71.792-237.008-34.016 0-71.792 97.376-71.792 237.008 0 139.712 37.776 237.008 71.792 237.008 33.92 0 71.792-97.312 71.792-237.008zM696.992 479.984c-58.976 0-90.784-131.888-90.784-256 0-124.096 31.808-255.984 90.784-255.984 58.928 0 90.8 131.888 90.8 255.984-0.016 124.112-31.888 256-90.8 256zM696.992 479.984c-103.104 0-191.92-61.392-232.432-149.424l14.176-14.192c36.096 84.928 120.336 144.624 218.272 144.624 130.736 0 237.040-106.336 237.040-237.008s-106.32-237.008-237.040-237.008c-92.112 0-171.872 52.912-211.12 129.792l-14.144-14.256c43.296-80.016 128-134.512 225.232-134.512 141.168 0 255.984 114.832 255.984 255.984 0 141.152-114.8 256-255.968 256v0zM940.96 225.84h-371.68l12.448-12.448-6.496-6.544h365.728v18.992zM484.416 353.776h425.136v-18.976h-425.136v18.976zM484.416 97.808h425.136v-18.96h-425.136v18.96zM345.072 429.168v-59.072l39.936 39.968 4.592-4.608v66.448h-389.6v-498.88h389.6v46.656l-4.208-4.272-40.32 39.984v-39.632h-300.576v247.136l-0.32 65.184h99.712v101.088h201.184zM44.496 429.168h81.488l-81.488-81.472v81.472zM285.808 114.208h-114.896v-77.072h148.080v44.192l-33.184 32.88zM298.56 57.184h-107.232v36.976h107.232v-36.976zM294.944 165.52h-103.616v36.976h107.232v-33.312l20.432 20.592v32.816h-148.080v-77.12h104.128l19.024 19.2 0.88 0.848zM280.944 273.888h-89.632v36.96h94.512l20.064 20.048h-134.992v-77.088h130.128l-20.080 20.080zM141.824 66.544c0-4.576-0.8-8.544-2.384-11.888-1.584-3.344-3.728-6.128-6.384-8.304-2.672-2.24-5.744-3.872-9.248-4.992-3.504-1.104-7.184-1.664-11.024-1.664-3.6 0-7.136 0.48-10.608 1.536-3.456 1.008-6.576 2.592-9.312 4.768-2.736 2.176-4.944 5.008-6.624 8.448-1.664 3.488-2.512 7.664-2.512 12.56h20.096c0-3.088 0.848-5.408 2.576-6.928 1.712-1.504 3.824-2.24 6.368-2.24 2.608 0 4.752 0.752 6.432 2.304 1.664 1.584 2.512 3.888 2.512 7.008 0 2.608-0.864 4.8-2.624 6.56-1.776 1.728-3.984 2.624-6.672 2.624h-2.816v17.424h2.816c3.024 0 5.152 0.896 6.432 2.64 1.264 1.728 1.888 3.632 1.888 5.584 0 2.752-0.784 4.864-2.384 6.24s-3.456 2.096-5.584 2.096c-2.112 0-3.984-0.72-5.584-2.16-1.584-1.408-2.384-3.44-2.384-6.064h-20.080c0 4.080 0.736 7.76 2.192 11.024 1.472 3.264 3.472 6.048 6 8.336 2.528 2.272 5.504 4.016 8.88 5.184 3.392 1.2 7.056 1.792 10.976 1.792 4.080 0 7.808-0.624 11.216-1.904 3.392-1.264 6.352-3.040 8.88-5.312 2.528-2.32 4.496-5.040 5.888-8.224 1.376-3.184 2.080-6.64 2.080-10.416 0-2.368-0.272-4.464-0.8-6.336-0.528-1.824-1.216-3.424-2.096-4.784-0.848-1.344-1.808-2.496-2.864-3.424-1.056-0.944-2.176-1.792-3.296-2.528 1.216-0.816 2.432-1.776 3.6-2.864 1.184-1.104 2.256-2.432 3.2-3.952 0.928-1.504 1.728-3.264 2.336-5.264s0.912-4.272 0.912-6.88v0zM85.568 146.448v18.144l27.088 21.184c2.848 2.224 5.056 4.176 6.608 5.936s2.336 3.584 2.336 5.456c0 2.272-0.688 4.096-2.080 5.456-1.392 1.376-3.312 2.032-5.76 2.032-0.896 0-1.824-0.128-2.8-0.368-0.992-0.256-1.872-0.704-2.656-1.36-0.768-0.656-1.392-1.52-1.872-2.544-0.496-1.072-0.736-2.464-0.736-4.192h-20.112c0 4.336 0.768 8.16 2.256 11.408 1.536 3.28 3.568 6.064 6.144 8.336 2.576 2.304 5.568 4.016 9.008 5.152 3.424 1.152 7.024 1.712 10.768 1.712 3.92 0 7.584-0.576 10.976-1.712 3.392-1.136 6.352-2.784 8.88-4.96 2.528-2.16 4.512-4.8 5.936-7.904 1.424-3.104 2.144-6.624 2.144-10.56 0-2.432-0.416-4.736-1.296-6.864-0.848-2.112-2.064-4.176-3.68-6.176-1.6-2-3.488-3.984-5.696-5.936-2.192-1.968-4.64-3.984-7.36-6l-10.544-8.080h29.776v-18.144l-57.328-0.016zM105.44 248.56v51.728l-18.64-16.176v21.456l18.64 16.176h20.080v-73.168l-20.080-0.016zM323.76 289.904l76.896-76.912-77.056-77.664 61.552-61.024 137.824 138.992-137.936 137.92-61.28-61.312z" horiz-adv-x="960" />
-<glyph unicode="&#xe61a;" d="M367.056 26.912l-12.896 12.784v-27.824h-308.48v253.632l-0.336 66.88h102.832l-0.496 103.744h206.48v-16.736l12.512 12.528 33.184-33.2v81.28h-399.856v-512h399.856v91.984l-2.72-2.768-30.080-30.304zM45.664 436.144h83.632l-83.632-83.616v83.616zM301.152 92.288l-20.784 20.592h-104.96v-79.136h151.968v32.528l-20.976 20.8v-32.704h-110.064v37.936h104.8zM175.424 224.080v-79.152h72.608l-4.8 4.768 15.728 15.84h-62.608v37.952h100.224l20.448 20.608h-141.6zM196.352 276.768v37.92h53.168l20.592 20.608h-94.688v-79.136h120.464l-20.624 20.624h-78.912zM115.76 55.040c-2.608 0-4.8 0.768-6.544 2.32-1.76 1.584-2.64 3.936-2.64 7.12h-20.64c0-5.024 0.864-9.312 2.576-12.896 1.728-3.552 4-6.448 6.816-8.656 2.8-2.256 6-3.856 9.536-4.912 3.552-1.072 7.2-1.584 10.88-1.584 3.936 0 7.696 0.56 11.312 1.696 3.6 1.136 6.768 2.832 9.488 5.104 2.736 2.256 4.928 5.104 6.576 8.528 1.616 3.44 2.448 7.52 2.448 12.192 0 2.688-0.32 5.072-0.928 7.104-0.624 2.064-1.424 3.856-2.384 5.408-0.976 1.552-2.064 2.912-3.28 4.048-1.216 1.104-2.448 2.096-3.712 2.944 1.168 0.768 2.304 1.632 3.376 2.576 1.104 0.976 2.064 2.16 2.944 3.536 0.912 1.376 1.616 3.008 2.16 4.896 0.544 1.888 0.816 4.048 0.816 6.48 0 3.856-0.72 7.424-2.144 10.688-1.424 3.28-3.44 6.080-6.048 8.416-2.608 2.368-5.648 4.192-9.12 5.488-3.488 1.328-7.328 1.968-11.488 1.968-4.032 0-7.792-0.624-11.264-1.84-3.488-1.184-6.544-3.008-9.12-5.328-2.608-2.352-4.64-5.216-6.16-8.56-1.504-3.36-2.256-7.152-2.256-11.312h20.624c0 2.688 0.816 4.768 2.448 6.208 1.648 1.472 3.568 2.224 5.744 2.224 2.176 0 4.080-0.736 5.728-2.16 1.632-1.424 2.448-3.568 2.448-6.4 0-2-0.656-3.936-1.952-5.728s-3.504-2.704-6.608-2.704h-2.896v-17.856h2.896c2.768 0 5.040-0.896 6.864-2.704 1.808-1.776 2.688-4.048 2.688-6.72 0-3.2-0.864-5.584-2.576-7.184-1.728-1.616-3.92-2.4-6.608-2.384v0zM146.688 164.592h-30.56l10.8 8.288c2.784 2.096 5.312 4.16 7.568 6.16 2.256 2.016 4.208 4.048 5.84 6.112 1.648 2.048 2.896 4.176 3.792 6.352 0.88 2.192 1.328 4.56 1.328 7.040 0 4.032-0.736 7.632-2.208 10.816-1.488 3.2-3.504 5.904-6.112 8.112-2.608 2.224-5.648 3.92-9.12 5.088-3.488 1.184-7.248 1.776-11.248 1.776-3.872 0-7.536-0.592-11.056-1.776-3.536-1.168-6.608-2.944-9.232-5.312-2.64-2.32-4.752-5.184-6.32-8.512-1.52-3.344-2.304-7.264-2.304-11.696h20.64c0 1.76 0.256 3.184 0.752 4.288 0.496 1.072 1.136 1.968 1.936 2.624 0.816 0.688 1.712 1.136 2.736 1.408 1.008 0.256 1.968 0.368 2.88 0.368 2.512 0 4.48-0.688 5.904-2.096 1.44-1.376 2.144-3.248 2.144-5.584 0-1.936-0.784-3.808-2.384-5.616-1.6-1.824-3.872-3.84-6.8-6.112l-27.792-21.744v-18.64h58.848v18.656zM128.816 250.784v75.072h-20.608l-19.136-16.576v-22.016l19.136 16.592v-53.088h20.608zM659.008 280.704h45.568c22.4 0 40.528 18.16 40.528 40.528v45.632c0 22.384-18.144 40.48-40.528 40.48h-45.568c-22.368 0-40.576-18.128-40.576-40.48v-45.632c0-22.384 18.224-40.528 40.576-40.528zM502.512 316.4c14.224 0 25.776 11.472 25.776 25.776v29.024c0 14.24-11.584 25.824-25.776 25.824h-29.056c-14.272 0-25.76-11.568-25.76-25.824v-20.288l34.528-34.528h20.304zM530.96 173.008v19.184l-19.008-19.184h19.008zM867.376 313.136h30.176c14.816 0 26.864 12.048 26.864 26.848v30.176c0 14.816-12.032 26.832-26.864 26.832h-30.176c-14.832 0-26.8-12.016-26.8-26.832v-30.176c0-14.8 11.968-26.848 26.8-26.848zM930.176 294.608h-95.472c-20.192 0-36.592-17.296-36.592-38.624v-26.656c-10.096 14.128-26.128 23.296-44.224 23.296h-144.288c-16.128 0-30.416-7.456-40.496-19.072v27.808c0 20.48-15.744 37.104-35.216 37.104h-33.744l36.032-36.032h2.4v-2.4l28.704-28.688c-1.936-2.448-3.664-5.024-5.216-7.776l-0.016-0.016-23.488-23.664v-26.848h15.76v-117.424h44.384v140.448h11.984v-140.448h138.576v140.448h11.904v-140.448h48.032c0 0.128 0 2.56 0 30.656v77.984h18.272v92.896h7.968v-92.896h91.664v92.896h7.92v-92.896h31.744c0 0.048 0 1.664 0 20.288v71.472c0 21.328-16.4 38.608-36.608 38.608zM303.808 308.608l78.928-78.944-79.088-79.728 63.152-62.64 141.456 142.64-141.568 141.568-62.88-62.896z" horiz-adv-x="960" />
-<glyph unicode="&#xe61b;" d="M347.344-35.376c32.080 0 61.648 7.504 61.648 42.336v90.912c0 2.544-0.336 4.992-0.64 7.44h47.552c13.264 0 24 10.24 24 22.864v221.152c0 12.656-10.736 22.88-24 22.88h-38.912c-2.304 16-32.416 47.312-32.416 47.312v-47.312h-20.128v84.896c0 12.64-10.256 22.896-22.88 22.896h-203.232c-12.624 0-22.848-10.24-22.848-22.896v-84.896h-22.768l1.584 46.24c0 0-31.664-30.576-31.664-45.856l5.088-0.384h-43.696c-13.28 0-24.016-10.224-24.016-22.88v-221.152c0-12.624 10.752-22.864 24.016-22.864h48.256c-0.656-3.328-0.992-6.288-0.992-8.512v-83.664c0-34.752 18.736-48.496 50.816-48.496h225.248zM364.448 233.152h3.52c15.696 0 28.384-14.32 28.384-31.952v-66.336c-9.088-3.888-20.032-5.872-31.904-6.848v105.152zM133.040 405.392c0 12.608 10.528 22.88 23.568 22.88h166.72c13.008 0 23.6-10.272 23.6-22.88v-33.184h-213.888v33.184zM133.040 233.152h213.888v-105.92c-0.4 0-0.784-0.032-1.2-0.032v67.12c0 15.632-10.256 28.288-22.88 28.288h-165.792c-12.64 0-22.864-12.656-22.864-28.288v-67.12c-0.416 0-0.752 0-1.152 0v105.952zM346.928 105.312v-1.2c0-3.344-0.784-6.528-2.128-9.392 0.544 2.416 0.944 4.944 0.944 7.584v3.008h1.2zM150.416 172.608v10.864h181.008v-10.864h-181.008zM331.44 156.8v-10.864h-181.008v10.864h181.008zM133.040 105.312h1.152v-3.008c0-2.608 0.384-5.072 0.912-7.472-1.296 2.848-2.064 5.968-2.064 9.28v1.2zM111.952 233.152h3.536v-105.2c-6.752 0.816-11.072 2.336-31.92 4.496v68.736c0 17.632 12.672 31.968 28.384 31.968zM58.608 337.136c0 8.128 6.592 14.752 14.736 14.752 8.144 0 14.736-6.608 14.736-14.752 0-8.128-6.592-14.72-14.736-14.72-8.144 0-14.736 6.608-14.736 14.72zM83.568 9.056v96.256h31.92v-82.336c0-12.656 10.224-22.88 22.848-22.88h203.232c12.624 0 22.88 10.224 22.88 22.88v82.336h31.904v-96.256c0-17.632-12.688-31.936-28.384-31.936h-256.016c-15.712 0-28.384 14.304-28.384 31.936z" />
-<glyph unicode="&#xe61c;" d="M512 160v-192h-512v192h64v-128h384v128zM96 64c-64-64-32-32 0 0z" />
-<glyph unicode="&#xe61d;" d="M74.848 218.352l8.848-8.592 171.968 182.432-8.864 8.608zM227.328 419.024l10.688-10.096-171.92-182.432-10.704 10.096zM275.264 373.504l-10.768 10.112-171.44-182.4 10.224-10.112zM334.368 471.376c-16.784 16.176-43.936 15.328-59.648-1.984l-36.912-39.168 67.168-63.216 36.912 39.184c16.224 16.768 15.312 43.92-1.904 60.144l-5.616 5.056zM122.704 173.472l-10.24 9.664 171.68 182.224 10.224-9.648zM6.192 112.192l106.080 49.952-67.664 63.264zM316.176-40.64c-53.936 0-84.256 28.336-95.168 41.152-0.96 1.072-1.952 2.272-2.992 3.584-17.408-9.712-34.592-17.248-49.248-21.072-64.288-16.832-82.16-18.208-125.2 5.76-43.712 24.352-44.128 80.96-44.304 84.144l2.992 27.424 8.096-2.096 1.76-26.544c0.048-0.656 6.24-47.056 40.72-66.224 35.952-20 48.416-20.464 111.104-4 12.64 3.296 27.568 9.776 42.944 18.224-15.728 24.912-31.232 64.24-12.32 107.168 20.352 46.16 49.36 91.392 110.72 76.976 13.264-3.152 22.64-12.144 27.008-26.048 10.144-32.128-9.12-84.128-32.752-110.656-16.576-18.576-40.288-37.648-64.864-53.232 0.272-0.336 0.608-0.688 0.864-1.056 9.824-11.472 38.4-37.792 90.704-34.064 106.336 7.6 162.352 31.36 172.72 44.528l15.024-11.776c-15.936-20.272-79.696-44.176-186.384-51.792-3.92-0.288-7.712-0.416-11.408-0.416zM283.136 187.488c-29.216 0-50.128-20.704-71.104-68.32-15.584-35.344-2.208-68.592 11.296-89.776 23.504 14.736 46.368 32.976 61.968 50.432 21.968 24.688 35.968 69.472 28.8 92.176-2.368 7.456-6.56 11.664-13.2 13.216-6.224 1.504-12.144 2.272-17.76 2.272z" />
-<glyph unicode="&#xe61e;" d="M406.256 480h-311.936c-52.096 0-94.32-42.224-94.32-94.32v-323.344c0-52.096 42.24-94.336 94.32-94.336h311.936c52.096 0 94.32 42.24 94.32 94.336v323.344c0.016 52.096-42.224 94.32-94.32 94.32zM453.44 62.336c0-26-21.136-47.168-47.152-47.168h-311.952c-26.032 0-47.152 21.136-47.152 47.168v323.344c0 26.032 21.168 47.152 47.152 47.152h311.936c26 0 47.152-21.136 47.152-47.152v-323.344zM79.296 369.488h342.016v-17.392h-342.016v17.392zM81.056 314.752h306.88v-17.392h-306.88v17.392zM608.976 325.248h115.632v-17.408h-115.632v17.408zM608.976 270.784h115.632v-17.392h-115.632v17.392zM635.344 196.64h57.824v-17.424h-57.824v17.424zM159.856 205.344h259.712v-17.408h-259.712v17.408zM159.856 150.656h220.816v-17.408h-220.816v17.408zM159.856 95.92h259.712v-17.392h-259.712v17.392zM696.112 480h-58.64c-52.096 0-94.336-42.224-94.336-94.32v-323.344c0-52.096 42.24-94.336 94.336-94.336h58.64c52.096 0 94.32 42.24 94.32 94.336v323.344c0.016 52.096-42.224 94.32-94.32 94.32zM743.296 62.336c0-26-21.168-47.168-47.152-47.168h-58.64c-26 0-47.152 21.136-47.152 47.168v323.344c0 26.032 21.136 47.152 47.152 47.152h58.64c26 0 47.152-21.136 47.152-47.152v-323.344zM608.976 398.64h115.632v-42.4h-115.632v42.4zM86.672 217.616h41.936v-41.936h-41.936v41.936zM86.672 164.704h41.936v-41.936h-41.936v41.936zM86.672 108.192h41.936v-41.936h-41.936v41.936zM635.344 143.728h57.824v-17.424h-57.824v17.424z" horiz-adv-x="784" />
-<glyph unicode="&#xe61f;" d="M613.984 229.888v-205.184h-557.296v205.184h-56.688v-261.888h670.672v261.888zM521.312 239.584l-189.392 240.416-182.576-235.92 125.856-1.552v-83.52h119.408v77.6z" horiz-adv-x="672" />
-<glyph unicode="&#xe620;" d="M419.872-31.888v0c21.248 0 39.824 20.032 40.416 45.744v1.216l1.088 416.208c0 25.92-17.76 48.24-40.256 48.72l2.608-0.16-360.928 0.048c-21.136 0-38.944-19.712-40.464-44.416l-0.016-7.136-16.656 0.064c-3.040 0.016-5.552-1.44-5.552-3.248l-0.112-38.32c0.032-1.808 2.512-3.28 5.552-3.28l16.64-0.048-0.112-45.312-16.416 0.048c-3.040-0.016-5.552-1.488-5.552-3.264l-0.112-38.352c0.016-1.776 2.512-3.264 5.552-3.264l16.416-0.032-0.112-45.296-16.208 0.048c-3.056-0.016-5.568-1.456-5.568-3.264l-0.080-38.32c0-1.792 2.496-3.296 5.536-3.28l16.192-0.032-0.112-45.312-15.968 0.032c-3.056 0.016-5.552-1.44-5.536-3.232l-0.112-38.32c0-1.824 2.496-3.296 5.536-3.264l15.968-0.048-0.112-45.328-15.728 0.032c-3.056-0.016-5.552-1.44-5.536-3.232l-0.112-38.352c0-1.824 2.496-3.264 5.552-3.232l15.712-0.048-0.016-6.8c-0.080-26.32 18-47.792 40.368-47.888zM419.552 15.344l-0.016-0.992c-0.176-3.424-1.36-5.552-2.144-6.544l-353.52 0.896c-0.848 1.072-2.080 3.424-2.064 7.216l0.016 6.784 13.632-0.048c3.072-0.032 5.584 1.488 5.584 3.264l0.080 38.336c0.032 1.792-2.48 3.248-5.552 3.312l-13.632 0.032 0.112 45.28 13.408-0.048c3.056 0 5.568 1.456 5.584 3.296l0.096 38.304c0 1.792-2.496 3.28-5.584 3.296l-13.392 0.032 0.112 45.328 13.184-0.032c3.056-0.032 5.584 1.424 5.6 3.232l0.096 38.336c0 1.792-2.496 3.28-5.584 3.28l-13.184 0.032 0.112 45.312 13.008-0.032c3.056-0.032 5.568 1.44 5.6 3.248l0.064 38.336c0.016 1.76-2.48 3.248-5.552 3.28l-12.992 0.032 0.112 45.312 12.784-0.032c3.072-0.016 5.568 1.44 5.6 3.232l0.064 38.32c0.016 1.808-2.496 3.264-5.552 3.28l-12.928 0.032-0.128 3.952v0.272c0 3.664 1.568 6.176 2.368 7.424h353.568c0.848-1.248 2.112-4.56 2.112-8.352l-1.008-416.224zM364.368 272.4c-0.016-5.456-7.888-9.36-17.408-9.328h-218.048c-9.536 0.016-17.376 4.496-17.344 9.984l0.288 116.48c0.016 5.456 7.84 9.888 17.392 9.872h218.048c9.552-0.064 17.392-5.024 17.36-10.512l-0.272-116.496z" />
-<glyph unicode="&#xe621;" d="M76.704 241.92h174.080c-0.176 11.216-0.032 22.304 0.432 33.104h-174.512v-33.104zM359.92 267.584c-4.096-8.688-7.456-17.328-10.192-25.664h10.192v25.664zM278.4 122.112c8.464 5.232 10.336 9.6 3.472 14.384-9.84 2.304-13.264-1.648-16.432-0.224-2.64 6.752-9.024 7.808-12.688 8.704-5.872 1.456-5.872-4.384-10.96-1.456-7.152 4.112-5.584 10.32-17.728 10.224-12.976 0.096-24.544-16.672-8.64-30.784 9.168-5.808 51.328-5.44 62.976-0.848zM283.2 75.392c-22.992-1.392-23.648 22.096-44.96 15.6-13.408-5.84-21.392-34.352-23.664-58.464 58.368 0 116.72 0 175.088 0-6.976 37.12-23.648 85.76-47.312 89.664-42.224 2.928-38.128-32.288-59.152-46.8zM585.872 360.064l-14.256 119.936-34.72-45.216c-28.24 14.224-57.12 24.688-87.008 29.552-29.632 6.656-55.088-0.544-79.2-18.432-32.912-25.040-66.88-78.256-73.312-113.552-5.376-29.072-8.928-78-4.912-123.136h-246.432v56.736c0 25.376 20.64 46.032 46.032 46.032h162.048c1.104 9.904 2.384 19.328 3.904 27.52 1.072 5.92 2.736 12.128 4.816 18.512h-170.768c-50.848 0-92.064-41.216-92.064-92.064v-205.872c0-50.848 41.216-92.080 92.064-92.080h268.72c50.864 0 92.080 41.232 92.080 92.080v205.872c0 0.72-0.096 1.424-0.112 2.144-0.496 22.096-8.784 42.256-22.224 57.856-3.376 3.92-7.024 7.584-11.008 10.88-4.832-2.608-9.92-5.712-15.664-9.872-7.648-6.656-14.32-13.824-20.288-21.264 10.32-5.952 18.048-15.68 21.328-27.376 1.104-3.968 1.904-8.048 1.904-12.368v-56.736h-106c6.176 39.504 24.352 103.088 78.16 149.12 28.144 20.656 68.192 42.416 118.656 8l-26.144-48.624 114.4 42.352zM159.92 14.048h-67.856c-25.392 0-46.032 20.656-46.032 46.032v118.432h113.888v-164.464zM337.76 178.512h69.072v-118.432c0-25.376-20.64-46.032-46.048-46.032h-170.16v164.464h106.032c0.336-1.856 0.576-3.84 0.976-5.664 0 0-0.016 2.080 0.112 5.664h40.016z" horiz-adv-x="592" />
-<glyph unicode="&#xe622;" d="M750.944-32h-316.464c-33.696 0-60.096 24.288-60.096 55.28v220.368c0 26.064 18.656 47.392 44.624 53.52 3.264 17.040 11.44 46.368 42.752 46.368h109.904c32.352 0 40.272-28 42.976-44.592h136.304c33.696 0 60.096-24.288 60.096-55.312v-220.352c-0.016-30.992-26.4-55.28-60.096-55.28zM434.656 261.824c-13.056 0-23.152-8-23.152-18.176v-220.352c0-10.192 10.096-18.16 22.992-18.16h316.448c12.896 0 22.976 7.968 22.976 18.16v220.352c0 10.192-10.080 18.176-22.976 18.176h-166.176l-3.84 13.44c-1.056 3.76-1.616 7.888-2.16 12.256-2.432 18.896-4.704 18.896-7.088 18.896h-109.92c-0.56 0-0.816-0.064-0.816-0.064-3.056-2.16-5.472-16.032-6.288-20.608-0.64-3.744-1.264-7.312-2.176-10.464l-3.824-13.44h-14zM132.336 344.128c39.408 23.376 94.528 46.672 156.048-4.768l-40.384-60.16 154.848 40.704-3.264 158.512-51.136-54.64c-35.072 22.208-71.472 39.584-109.92 49.76-37.84 12.48-72.032 6.336-105.84-13.952-46.176-28.48-97.392-93.648-110.32-138.928-13.744-47.696-28.016-138.256-20.112-208.416 0.016 0 11.856 149.264 130.080 231.888z" horiz-adv-x="816" />
-<glyph unicode="&#xe623;" d="M589.824 360.064l-14.272 119.936-34.704-45.216c-28.256 14.224-57.12 24.704-87.024 29.568-29.632 6.64-55.072-0.56-79.2-18.448-32.896-25.040-66.88-78.256-73.296-113.552-5.376-29.088-8.944-78-4.928-123.152h-250.368v56.736c0 25.392 20.64 46.032 46.032 46.032h165.984c1.12 9.904 2.384 19.328 3.904 27.536 1.072 5.92 2.752 12.128 4.816 18.496h-174.704c-50.832 0.016-92.064-41.2-92.064-92.048v-205.872c0-50.848 41.232-92.080 92.064-92.080h268.736c50.848 0 92.064 41.232 92.064 92.080v205.872c0 0.24-0.032 0.48-0.032 0.704-0.16 21.328-7.6 40.896-19.904 56.416-3.568 4.512-7.568 8.656-11.904 12.416-4.128-2.368-8.432-5.072-13.2-8.512-8.144-7.104-15.264-14.768-21.536-22.736 10.448-6.976 17.744-18.144 19.808-31.072 0.368-2.368 0.736-4.752 0.736-7.232v-56.752h-102.064c6.192 39.504 24.352 103.088 78.16 149.12 28.144 20.656 68.192 42.416 118.672 8l-26.16-48.624 114.384 42.384zM159.936 14.048h-67.872c-25.392 0-46.032 20.64-46.032 46.032v118.432h113.888v-164.464zM341.712 178.512h65.12v-118.432c0-25.392-20.64-46.032-46.032-46.032h-170.176v164.464h109.952c0.352-1.856 0.592-3.84 0.992-5.664 0 0-0.032 2.080 0.096 5.664h40.048z" horiz-adv-x="592" />
-<glyph unicode="&#xe624;" d="M29.568 75.632c0 46.96 35.52 85.152 79.168 85.152h11.408l-16.736-46.864h39.488l-7.152-32.24 114.208-98.032 115.584 97.984-7.168 32.288h39.472l-16.736 46.864h11.392c43.664 0 79.2-38.208 79.2-85.152v-107.632h29.584v107.632c0 63.328-48.672 114.72-108.784 114.72h-283.76c-60.112-0.016-108.736-51.392-108.736-114.72v-107.632h29.568v107.632zM320.288 160.784h29.44l6.16-17.296h-34.4l11.312-50.848-80.848-68.512 68.336 136.656zM151.536 160.784h29.456l69.36-138.048-0.304-0.24-81.616 70.080 11.312 50.912h-34.4l6.192 17.296zM100.368 81.168h29.568v-113.168h-29.568v113.168zM371.328 81.168h29.568v-113.168h-29.568v113.168zM295.488 480h-89.648c-44.016 0-79.792-35.664-79.792-79.68v-89.68c0-44.016 35.76-79.696 79.792-79.696h89.648c44.064 0 79.696 35.68 79.696 79.696v89.68c0.016 44.016-35.632 79.68-79.696 79.68zM250.672 271.024c-39.376 0-67.792 29.376-69.008 30.64l16.032 15.296c0.256-0.224 23.248-23.76 52.976-23.76 28.4 0 52.96 23.76 53.2 24.016l15.536-15.824c-1.28-1.232-31.392-30.368-68.736-30.368z" horiz-adv-x="496" />
-<glyph unicode="&#xe625;" d="M521.84 316.368l13.728-20.48-109.28-73.056-17.632 17.616zM187.504 63.216l-12.88 20.272 103.504 69.424 17.44-17.456zM140 134.768l-13.664 20.448 89.568 59.904 17.744-17.728zM474.336 387.968l13.696-20.464-123.696-82.72-17.744 17.744zM499.424 350.976l11.216-17.344-116.96-78.192-14.864 14.864zM162.624 100.976l-11.2 17.264 96.704 64.672 14.848-14.848zM495.808 402.224l74.688 49.984c32.048 22.256 76.576 13.504 97.808-19.12l7.28-10.336c22-32.784 13.248-77.28-19.312-98.544l-74.736-50.016-85.728 128.032zM104.88 140.976l86.512-128.224-191.392-41.696zM546.96 279.408l13.104-19.488-102.272-68.592-16.928 16.928zM212.816 26.992l-13.088 19.52 110.608 74.192 16.912-16.944zM505.776 342.848l18.064-27.52-111.44-78.624-26.24 26.256zM181.904 74.112l-23.376 36.848 96.864 64.672 29.136-29.136zM60.096 425.52l54.528 54.512 457.408-457.536-54.528-54.512-457.408 457.536z" horiz-adv-x="688" />
-<glyph unicode="&#xe626;" d="M16.912 481.536l495.056-495.072-18.176-18.176-495.056 495.072z" />
-<glyph unicode="&#xe627;" d="M662.384 159.024c0 51.184-41.68 93.44-93.488 93.44h-24.368c-22.048-16.672-49.44-26.784-79.184-26.784-29.776 0-57.168 10.112-78.592 26.784h-17.28c-33.152 0-62.496-17.792-79.12-44.192h93.040l-0.272-173.696h279.232l0.016 124.448zM466.496 243.2c65.84 0 118.656 53.376 118.656 118.688 0 65.344-52.816 118.096-118.656 118.096-65.312 0-118.144-52.768-118.144-118.096 0-65.312 52.832-118.688 118.144-118.688zM349.136 178.976h-344.576l165.184-108.752 179.392 108.752zM0 142.576v-174.592h353.712v174.592l-184.768-110.976-168.944 110.976z" horiz-adv-x="656" />
-<glyph unicode="&#xe628;" d="M237.072 193.152h163.536l31.6 58.384h-197.776l1.584-56.768c0.32-0.48 0.72-1.088 1.056-1.616zM312.16 79.008h82.544l-0.16 2.4-73.344 40.464 10.56 19.2h-60.352c16.48-25.024 33.2-50.432 39.744-60.496 0.336-0.512 0.688-1.056 0.992-1.568zM176.272 480v-152.544l67.504 0.4-3.744-24.224h194.608v-47.584l36.080 66.64v157.312h-294.464zM434.656 362.032h-223.248v52.096h223.248v-52.096zM205.536 185.152l-2.272 81.36 4.672 30.416-110.848-0.656 0.304-109.792c0 0-82.912-131.552-90.384-145.28-7.472-13.728-24.464-72.096 51.968-72.992 76.432-0.928 191.104 0.928 191.104 0.928s42.256-2.96 51.568 26.208c9.296 29.152-1.872 46.384-16.24 68.512-14.384 22.128-79.856 121.312-79.856 121.312zM45.36 52.928l75.872 126.752v94.336h60.16l0.464-95.888 76.592-125.2h-213.088zM362.912 133.952l110.336-60.864 7.76 14.080-110.352 60.832zM478.416 22.352c40.032 8.624 91.888 27.408 107.584 67.712 24.384 62.736-49.744 123.056-67.616 136.448l59.408 109.728-49.568 28.128-99.904-184.544 10.624-6.016-12.976-23.664 26.96-15.52 13.088 23.824 11.888-6.736 20.816 38.496c21.648-17.504 60.48-56.672 49.328-85.36-11.888-30.608-80.576-46.224-121.056-48.88l2.144-33.136h-62.672v-38.464h251.072v37.696h-106.352l-32.752 0.32z" />
-<glyph unicode="&#xe629;" d="M256 424.784c110.432 0 200.784-90.352 200.784-200.784s-90.352-200.784-200.784-200.784c-110.432 0-200.784 90.352-200.784 200.784s90.352 200.784 200.784 200.784zM256 480c-142.224 0-256-113.776-256-256s113.776-256 256-256c140.544 0 256 113.776 256 256s-115.456 256-256 256v0zM209.152 101.856c6.688 1.68 11.712 3.344 13.392 5.024 3.344 3.344 5.024 10.032 5.024 18.4v113.776c0 8.368-1.68 13.392-3.344 16.736-3.344 3.344-8.368 5.024-15.056 6.688v10.032h75.296v-147.248c0-8.368 1.68-13.392 3.344-16.736 3.344-1.68 6.688-5.024 15.056-5.024v-10.032h-92.032v8.368zM235.92 352.832c6.688 6.688 13.392 8.368 21.744 8.368s15.056-3.344 21.744-8.368c5.024-6.688 6.688-13.392 6.688-21.744 0-8.368-3.344-15.056-8.368-21.744-6.688-6.688-13.392-8.368-21.744-8.368-8.368 0-15.056 3.344-21.744 8.368-6.688 6.688-8.368 13.392-8.368 21.744 0 8.368 3.344 15.056 10.032 21.744z" />
-<glyph unicode="&#xe62a;" d="M613.984 229.888v-205.184h-557.296v205.184h-56.688v-261.888h670.672v261.888zM521.312 399.44l-189.392-240.432-182.576 235.92 125.856 1.552v83.52h119.408v-77.6z" horiz-adv-x="672" />
-<glyph unicode="&#xe62b;" d="M462.528 431.136c0 26-17.92 48.368-40.624 48.864l-0.176-0.864-358.736 0.864c-21.2 0-39.056-19.824-40.592-44.592l-0.016-7.184-16.704 0.048c-3.040 0.016-5.568-1.44-5.568-3.248l-0.128-38.448c0.048-1.808 2.528-3.296 5.584-3.28l16.688-0.048-0.112-45.44-16.464 0.048c-3.056-0.016-5.568-1.504-5.568-3.28l-0.128-38.464c0.016-1.792 2.528-3.264 5.584-3.28l16.448-0.048-0.112-45.44-16.256 0.048c-3.056-0.016-5.584-1.472-5.584-3.28l-0.080-38.432c0-1.792 2.512-3.312 5.568-3.296l16.24-0.032-0.112-45.456-16.016 0.032c-3.056 0.016-5.568-1.44-5.552-3.232l-0.128-38.432c0-1.824 2.512-3.312 5.568-3.28l16-0.048-0.112-45.456-15.792 0.032c-3.056-0.016-5.568-1.456-5.552-3.248l-0.128-38.48c0-1.824 2.512-3.28 5.584-3.248l15.744-0.048-0.016-6.816c-0.080-26.384 18.032-47.936 40.48-48.032l0.672-0.032 358.32-0.88c21.84 0 40.112 20.96 40.72 46.752l0.080 0.176-0.080 1.040 1.024 417.456zM420.816 13.952l-0.016-1.008c0-0.048-0.016-0.080-0.016-0.128l0.048 14.88-0.224-16.416c-0.4-2.464-1.312-4.080-1.968-4.896l-354.576 0.896c-0.848 1.072-2.080 3.44-2.080 7.232l0.016 6.8 13.68-0.048c3.088-0.032 5.6 1.488 5.6 3.264l0.080 38.448c0.048 1.792-2.496 3.248-5.568 3.312l-13.68 0.032 0.112 45.424 13.456-0.048c3.056 0 5.584 1.44 5.6 3.296l0.080 38.416c0 1.792-2.496 3.296-5.6 3.312l-13.44 0.032 0.112 45.456 13.232-0.032c3.072-0.048 5.6 1.424 5.616 3.232l0.080 38.448c0 1.808-2.496 3.312-5.6 3.312l-13.216 0.032 0.112 45.44 13.040-0.032c3.072-0.032 5.584 1.44 5.616 3.248l0.048 38.464c0.016 1.776-2.464 3.248-5.568 3.28l-13.040 0.032 0.112 45.456 12.832-0.032c3.072-0.016 5.6 1.456 5.616 3.264l0.064 38.432c0.016 1.808-2.512 3.28-5.568 3.28l-12.832 0.032 0.016 3.952v0.288c0.096 3.68 1.312 5.952 2.112 6.976h354.624c0.864-1.088 2.112-4.336 2.112-8.128l-1.008-417.216zM72.864-34.016l-10.4 0.608h-0.384zM347.984 260.88c9.568-0.032 17.44 3.888 17.456 9.36l0.288 116.832c0.032 5.504-7.824 9.968-17.424 10.048l-218.688 0.496c-9.6 0.016-17.424-4.432-17.456-9.904l-0.288-116.832c-0.016-5.488 7.84-9.984 17.392-10.016h218.688zM239.312 221.664c-11.104 0-20.144-9.008-20.144-20.112v-22.656c0-11.12 9.040-20.128 20.144-20.128h22.64c11.136 0 20.128 9.008 20.128 20.128v22.656c0 11.104-8.992 20.112-20.128 20.112h-22.64zM147.184 216.544c-7.072 0-12.8-5.76-12.8-12.832v-14.416c0-7.088 5.712-12.8 12.8-12.8h14.432c7.056 0 12.8 5.712 12.8 12.8v14.416c0 7.072-5.744 12.832-12.8 12.832h-14.432zM342.784 216.544c-7.376 0-13.328-5.968-13.328-13.328v-14.992c0-7.328 5.952-13.328 13.328-13.328h14.976c7.36 0 13.328 5.984 13.328 13.328v14.992c0 7.36-5.968 13.328-13.328 13.328h-14.976zM373.968 165.696h-47.408c-10.032 0-18.144-8.592-18.144-19.168v-13.328c-5.008 7.056-12.976 11.632-21.968 11.632h-71.648c-7.984 0-15.12-3.6-20.128-9.312v13.648c0 10.176-7.808 18.432-17.472 18.432h-45.6c-9.648 0-17.472-8.256-17.472-18.432v-43.872h14.032v44.4h3.792v-44.4h43.792v44.4h3.792v-44.4h7.84v-58.304h22.032v69.728h5.952v-69.728h68.8v69.728h5.92v-69.728h23.84c0 0.064 0 1.28 0 15.216v38.736h9.056v46.128h3.968v-46.128h45.52v46.128h3.936v-46.128h15.744c0 0 0 0.816 0 10.064v35.504c0 10.576-8.144 19.168-18.176 19.168z" />
-<glyph unicode="&#xe62c;" d="M541.616 412.512h-230.224c-5.008 17.504-0.896 67.488-41.024 67.488h-166.256c-35.68 0-36-49.984-41.008-67.488h-0.256c-35.248 0-62.848-24.384-62.848-55.568v-333.376c0-31.152 27.6-55.568 62.848-55.568h478.768c35.216 0 62.848 24.416 62.848 55.568v333.376c-0.016 31.184-27.616 55.568-62.848 55.568zM410.912 288.88c0 10.48 8.48 18.976 18.976 18.976h21.312c10.464 0 18.992-8.496 18.992-18.976v-21.328c0-10.464-8.512-18.976-18.992-18.976h-21.328c-10.496 0-18.976 8.528-18.976 18.976v21.328zM253.84 286.544c0 15.824 12.88 28.64 28.704 28.64h32.24c15.84 0 28.672-12.816 28.672-28.64v-32.272c0-15.824-12.816-28.672-28.672-28.672h-32.24c-15.824 0-28.704 12.848-28.704 28.672v32.272zM133.12 289.6c0 10.080 8.144 18.256 18.224 18.256h20.544c10.048 0 18.24-8.176 18.24-18.256v-20.528c0-10.096-8.176-18.208-18.24-18.208h-20.544c-10.080 0-18.224 8.128-18.224 18.208v20.528zM500.16 157.616c0-13.168 0-14.304 0-14.304l-22.432-0.048v65.68h-5.584v-65.68h-64.832v65.68h-5.648v-65.68h-12.912v-55.136c0-19.84 0-21.584 0-21.68h-33.952v99.312h-8.432v-99.312h-97.968v99.312h-8.48v-99.312h-31.376v83.024h-11.152v63.232h-5.392v-63.232h-62.352v63.232h-5.392v-63.232h-20v62.464c0 14.48 11.136 26.24 24.88 26.24h64.928c13.76 0 24.896-11.76 24.896-26.24v-19.552c7.136 8.176 17.28 13.376 28.672 13.376h102c12.848 0 24.16-6.624 31.28-16.704v19.12c0 15.056 11.6 27.296 25.856 27.296h67.504c14.288 0 25.872-12.24 25.872-27.296l0.016-50.56z" horiz-adv-x="608" />
-<glyph unicode="&#xe62d;" d="M277.984 225.616h32.224c15.856 0 28.656 12.848 28.656 28.656v32.256c0 15.808-12.816 28.64-28.656 28.64h-32.224c-15.808 0-28.688-12.832-28.688-28.64v-32.256c0-15.808 12.88-28.656 28.688-28.656zM146.8 250.864h20.544c10.064 0 18.256 8.128 18.256 18.208v20.528c0 10.064-8.176 18.256-18.256 18.256h-20.544c-10.080 0-18.224-8.192-18.224-18.256v-20.528c0-10.080 8.128-18.208 18.224-18.208zM425.328 248.56h21.328c10.48 0 18.992 8.528 18.992 18.992v21.328c0 10.48-8.512 18.992-18.992 18.992h-21.328c-10.48 0-18.976-8.512-18.976-18.992v-21.328c0-10.464 8.496-18.992 18.976-18.992zM469.744 235.472h-67.504c-14.272 0-25.856-12.24-25.856-27.296v-18.896c-7.12 10.016-18.48 16.48-31.264 16.48h-102.032c-11.328 0-21.52-5.072-28.656-13.2v19.376c0 14.464-11.104 26.24-24.896 26.24h-64.928c-13.728 0-24.864-11.776-24.864-26.24v-62.464h20v63.216h5.36v-63.216h62.352v63.216h5.408v-63.216h11.152v-83.040h31.376v99.312h8.464v-99.312h97.984v99.312h8.416v-99.312h33.952c0 0.112 0 1.824 0 21.68v55.136h12.912v65.664h5.648v-65.68h64.832v65.68h5.6v-65.68h22.432c0 0 0 1.184 0 14.336v50.56c-0.016 15.088-11.616 27.328-25.888 27.344v0zM513.376-32h-431.44c-45.952 0-81.936 33.104-81.936 75.376v300.432c0 35.552 25.456 64.624 60.864 72.976 4.448 23.232 15.568 63.216 58.272 63.216h149.84c44.128 0 54.896-38.176 58.592-60.8h185.808c45.952 0 81.952-33.12 81.952-75.392v-300.432c0-42.272-36-75.376-81.952-75.376zM82.192 368.576c-17.808 0-31.584-10.88-31.584-24.784v-300.432c0-13.888 13.744-24.752 31.328-24.752h431.44c17.584 0 31.328 10.864 31.328 24.752v300.432c0 13.904-13.744 24.784-31.328 24.784h-226.544l-5.248 18.336c-1.456 5.12-2.192 10.736-2.944 16.704-3.312 25.76-6.384 25.76-9.664 25.76h-149.84c-0.784 0-1.104-0.096-1.104-0.096-4.192-2.928-7.488-21.84-8.56-28.064-0.896-5.12-1.744-9.984-2.96-14.288l-5.232-18.336-19.088-0.016z" horiz-adv-x="592" />
-<glyph unicode="&#xe62e;" d="M366.784 295.552h66.4c32.624 0 59.008 26.416 59.008 58.992v66.448c0 32.576-26.384 59.008-59.008 59.008h-66.4c-32.608 0-59.088-26.416-59.088-59.008v-66.448c0-32.576 26.48-58.992 59.088-58.992zM96.56 347.504h42.32c20.72 0 37.568 16.72 37.568 37.52v42.304c0 20.752-16.832 37.6-37.568 37.6h-42.32c-20.768 0-37.552-16.832-37.552-37.6v-42.304c0-20.784 16.768-37.52 37.552-37.52zM670.272 342.8h43.936c21.584 0 39.136 17.504 39.136 39.088v43.984c0 21.536-17.552 39.056-39.136 39.056h-43.936c-21.584 0-39.024-17.504-39.024-39.056v-43.968c0-21.568 17.44-39.088 39.024-39.088v-0.016zM761.76 315.12h-139.040c-29.392 0-52.848-24.544-52.848-55.552v-38.912c-16.048 20.624-38.496 34.272-64.864 34.272h-210.112c-23.328 0-44.080-10.768-58.128-27.472v39.888c0 29.872-23.824 53.824-52.192 53.824h-133.744c-28.32 0-50.832-23.952-50.832-53.808v-128.784h40.144v130.416h12.032v-130.416h128.416v130.416h10.032v-130.416h24.064v-170.56h64.208v204.688h18.048v-204.688h200.672v204.688h18.048v-204.688h70.24c0 0 0 3.408 0 44.32v114.224h26.080v134.432h12.032v-134.432h132.416v134.432h12.048v-134.432h46.176c0 0 0 1.792 0 28.896v104.176c0 31.008-23.504 55.552-52.928 55.552v-0.048z" horiz-adv-x="816" />
-<glyph unicode="&#xe62f;" d="M278.24 265.888h-59.664c-0.56-14.928 2.496-30.48 8.064-46.080h133.184v-205.728h-313.744v205.728h40.912c-6.352 14.656-10.528 30.080-12.48 46.080h-74.512v-297.888h405.904v297.888h-127.664zM263.040 290.752l61.088 105.856-87.728 83.408 2.176-57.088c-30.896-7.12-59.872-17.504-86.048-32.896-27.12-13.824-42.16-35.664-49.296-64.896-9.344-40.352-3.936-76.88 13.696-108.208 18.496-33.088 49.088-65.808 91.392-99.216 17.744-13.376 35.952-25.744 54.496-36.992 18.96-10.128 39.088-20.976 61.312-30.32 0 0-148.368 122.816-129.664 231.312-0.56 15.936 4.144 29.36 12.608 41.184 8.576 11.696 24.416 18.64 44.992 22.096l10.96-54.224z" />
-<glyph unicode="&#xe630;" d="M541.616-31.984h-478.768c-35.248 0-62.848 24.416-62.848 55.568v333.376c0 31.184 27.6 55.6 62.848 55.6h0.272c4.992 17.472 5.328 67.44 41.008 67.44h166.256c40.128 0 36.016-49.984 41.024-67.472h230.208c35.216 0 62.832-24.416 62.832-55.6v-333.376c-0.016-31.136-27.616-55.552-62.832-55.536v0 0z" horiz-adv-x="608" />
-<glyph unicode="&#xe631;" d="M513.376-31.984h-431.44c-45.936 0-81.936 33.104-81.936 75.36v300.416c0 35.552 25.456 64.624 60.864 72.992 4.448 23.232 15.584 63.216 58.272 63.216h149.824c44.128 0 54.896-38.176 58.592-60.8h185.808c45.952 0 81.952-33.12 81.952-75.392v-300.448c0.016-42.256-35.984-75.36-81.936-75.344v0zM82.192 368.592c-17.824 0-31.584-10.88-31.584-24.784v-300.432c0-13.872 13.744-24.752 31.328-24.752h431.44c17.568 0 31.312 10.88 31.312 24.752v300.432c0 13.904-13.744 24.784-31.312 24.784h-226.528l-5.248 18.352c-1.456 5.12-2.192 10.736-2.944 16.672-3.312 25.76-6.384 25.76-9.664 25.76h-149.84c-0.784 0-1.104-0.096-1.104-0.096-4.176-2.944-7.472-21.856-8.56-28.080-0.896-5.12-1.728-9.984-2.96-14.288l-5.232-18.336-19.104 0.016z" horiz-adv-x="592" />
-<glyph unicode="&#xe632;" d="M451.712 380.288l-71.44 71.424c-15.552 15.552-46.288 28.288-68.288 28.288h-240c-22 0-40-18-40-40v-432c0-22 18-40 40-40h368c22 0 40 18 40 40v304c0 22-12.736 52.736-28.288 68.288zM429.088 357.664c1.568-1.568 3.12-3.488 4.64-5.664h-81.728v81.728c2.176-1.52 4.096-3.072 5.664-4.64l71.44-71.424zM448 8c0-4.336-3.664-8-8-8h-368c-4.336 0-8 3.664-8 8v432c0 4.336 3.664 8 8 8h240c2.416 0 5.12-0.304 8-0.848v-127.152h127.152c0.544-2.88 0.848-5.584 0.848-8v-304z" />
-<glyph unicode="&#xe633;" d="M488.896 202.48c-1.376 31.92-6.24 63.984-14.592 96.224-8.864 35.952-21.36 70.032-36.384 101.632-22.928 47.296-45.168 70.784-67.856 69.488-18.272-1.072-29.504-16.64-34.288-47.984-54.544-77.392-155.44-131.136-239.952-167.36-28.736-14.912-42.288-37.28-40.976-67.776 2.848-52.464 18.448-77.968 46.896-76.48 0.848 0.336 2.304 0.384 4.016 1.056 2.32 0.416 3.152 0.704 3.776 0.448 25.52 1.392 45.2-23.072 58.384-73.104 9.952-41.424 20.32-73.856 70.544-71.424 10.992 0.8 15.568 2.992 15.952 7.104-0.72 3.184-73.328 157.36-40.848 158.48 59.184 3.44 158.128 1.84 209.792-29.088 14.576-8.656 24.672-13.184 28.416-12.72 16.56 0.416 27.808 16.080 33.248 45.648 3.52 19.040 4.928 41.232 3.856 65.872zM258.304 148.384c-23.536-0.144-35.728-0.384-37.2-0.432-17.536 2.144-31.648 12.016-41.392 29.936-7.888 14.16-12.432 31.104-13.552 50.848-1.008 23.216 11.76 43.84 39.168 62.16 22.624 15.536 45.456 31.632 68.656 46.896 25.376 18.528 45.216 37.376 59.456 58.080l-2.4-38.8c1.392-39.792 8.944-80.16 22.112-122.304 13.872-45.36 31.472-82.4 53.104-112.016-42.672 17.648-92.128 26.256-147.968 25.616zM78.096 112.992c-18.656 14.016-28.88 35.68-30.432 65.568-1.072 24.704 3.36 42.592 13.312 55.248-28.928-16.944-43.376-25.424-44.24-25.776-12.032-10.976-17.488-26.336-16.64-46.64 0.896-20.304 9.392-34.768 26.224-41.584 10.096-4.528 27.648-6.656 51.776-6.8v0zM647.184 328.832c-4.944 39.888-19.2 73.28-42.384 99.328-23.28 27.504-54.848 44.48-93.488 51.84 32.464-11.68 59.168-37.84 80.976-78.224 17.12-33.296 28.32-70.336 33.568-111.088 5.36-43.712 1.808-83.392-9.936-120.816 27.744 50.896 38 103.968 31.264 158.976v0zM596.944 313.536c-3.712 31.568-14.72 57.824-33.648 79.12-18.688 21.888-43.728 35.92-74.72 41.28 25.68-9.376 47.536-30.544 64.592-62.336 13.648-26.736 23.056-56.608 27.072-89.008 4.4-34.688 1.424-66.832-8.096-96 22.384 40.512 30.528 82.432 24.8 126.944v0zM552.496 298.592c-3.088 24.848-12.16 45.984-27.136 63.376-15.008 17.36-34.976 28.4-59.888 33.184 20.672-7.824 38-24.8 51.328-50.736 11.952-20.96 19.040-44.784 21.904-70.288 3.856-28.048 1.472-53.984-6.256-77.6 17.504 32.736 24.768 66.464 20.032 102.064z" />
-<glyph unicode="&#xe634;" d="M821.568 351.44c-96.128 86.112-216.864 128.56-359.92 128.56-141.968 0-262.688-42.448-359.92-128.56-39.136-35.76-73.808-78.24-101.728-127.456 27.936-50.288 62.608-92.752 101.728-127.424 97.232-86.064 217.952-128.56 359.92-128.56 143.056 0 263.792 42.496 359.92 128.56 40.272 34.672 73.776 77.152 101.728 127.424-27.952 49.216-61.456 91.696-101.728 127.456zM770.16 118.944c-82.736-70.496-185.536-105.088-308.512-105.088-121.872 0-224.704 34.592-308.512 105.088-33.536 29.024-62.608 63.632-87.216 105.040 24.608 40.24 53.664 76.048 87.216 105.088 83.824 70.448 186.64 105.12 308.512 105.12 122.976 0 225.776-34.656 308.512-105.12 34.672-29.040 63.696-64.848 87.168-105.088-23.472-41.408-52.496-76.016-87.168-105.040zM461.648 307.856c-45.808 0-83.84-37.984-83.84-83.872 0-45.808 38.016-83.84 83.84-83.84s83.824 38.048 83.824 83.84c0 45.888-38 83.872-83.824 83.872zM461.648 418.48c-107.296 0-195.6-87.136-195.6-194.496 0-107.296 88.304-195.584 195.6-195.584s195.6 88.304 195.6 195.584c0 107.344-88.272 194.496-195.6 194.496zM461.648 108.864c-63.712 0-115.12 51.408-115.12 115.12 0 63.696 51.408 115.152 115.12 115.152 63.68 0 115.12-51.456 115.12-115.152 0.016-63.712-51.44-115.12-115.12-115.12z" horiz-adv-x="928" />
-<glyph unicode="&#xe635;" d="M130.736 285.056h-126.016c-2.816 0-4.72-1.616-4.72-4.032v-8.448c0-2.416 1.888-4.080 4.72-4.080h13.12v-248.784c0-27.376 22.288-49.92 49.696-49.92 27.36 0 49.648 22.528 49.648 49.92v54.32l-12.736 13.296v-3.52h-73.872v182.128h73.872v-15.568l6.256-6.544 6.48-6.752v31.424h13.568c2.4 0 4.272 1.664 4.272 4.080v8.432c0 2.432-1.872 4.048-4.272 4.048zM126.608 313.536l8.288 1.632c2.384 0.464 3.968 2.848 3.44 5.616l-2.464 12.64 243.792 47.68c26.864 5.264 44.656 31.712 39.408 58.576-5.248 26.864-31.696 44.656-58.56 39.392l-243.808-47.68-2.544 13.072c-0.464 2.352-2.832 3.952-5.216 3.472l-8.288-1.616c-2.368-0.464-3.952-2.832-3.488-5.184l24.176-123.68c0.544-2.752 2.912-4.368 5.28-3.92zM364.224 467.136c6.256 0.496 12.896-0.048 17.76-1.68 5.984-2 10.736-6.592 10.736-6.592l-245.92-109.776-11.52-2.272-14.064 71.904 243.024 48.416zM215.68 4.848l-14.512-14.528-22.4 22.416c2.272-25.6 23.728-45.984 49.856-45.984 27.632 0 50.32 22.72 50.32 50.336v51.056l-63.264-63.296zM250.128 202.368h-58l-0.48 63.792h73.984v-48.288l13.296 13.28v37.008h13.328c2.96 0 4.928 1.984 4.928 4.432v8.416c0 2.432-1.968 4.448-4.928 4.448h-127.28c-2.464 0-4.432-2-4.432-4.448v-8.416c0-2.448 1.968-4.432 4.432-4.432h13.328v-91.968l22.832-22.816 48.992 48.992zM326.896 285.44c-2.464 0-4.432-2-4.432-4.448v-6.304l10.752 10.752h-6.32zM427.536 202.368h-14.368l-72.944-72.96v-112.352c0-27.616 22.672-50.336 50.288-50.336 27.648 0 50.32 22.72 50.32 50.336v212.976l-13.296-13.28v-14.384zM201.136 124.352l-104.976 104.976-52.496-52.464 157.488-157.504 313.52 313.568-52.496 52.464z" />
-<glyph unicode="&#xe636;" d="M213.456 299.792c-2.576 0-4.624-2.080-4.624-4.608v-8.736c0-2.56 2.048-4.592 4.624-4.592h13.84v-86.688l45.008 45.008h-30.656l-0.512 39.616h70.784l20.016 20.016h-118.48zM279.504-31.152c28.672 0 52.24 23.6 52.24 52.272v93.408l-103.456-103.472c4.736-23.936 25.952-42.208 51.216-42.208zM18.8 72.544v-48.496c0-27.072 22.272-49.344 49.376-49.344 13.312 0 25.408 5.424 34.336 14.128l-83.712 83.712zM31.92 207.392v60.32h72.448v-95.632l13.152-13.152v110.752h13.152c2.368 0 4.384 2.016 4.384 4.4v8.352c0 2.4-2 4.384-4.384 4.384h-124.592c-2.784 0-4.8-1.984-4.8-4.384v-8.352c0-2.4 2.016-4.4 4.8-4.4h12.736v-75.392l11.36 11.36 1.76 1.744zM126.592 314.56l8.192 1.6c2.352 0.464 3.936 2.816 3.408 5.552l-2.448 12.496 241.040 47.152c26.576 5.2 44.16 31.344 38.96 57.904-5.184 26.56-31.328 44.16-57.904 38.96l-241.072-47.136-2.528 12.912c-0.448 2.32-2.8 3.904-5.152 3.456l-8.208-1.6c-2.336-0.464-3.904-2.816-3.44-5.152l23.904-122.272c0.544-2.736 2.88-4.32 5.216-3.872zM361.536 466.448c6.208 0.48 12.752-0.064 17.568-1.664 5.904-1.968 10.592-6.512 10.592-6.512l-243.152-108.56-11.392-2.224-13.888 71.088 240.272 47.872zM154.288 81.504l-103.808 103.792-51.904-51.856 155.712-155.744 310 310.080-51.888 51.856z" />
-<glyph unicode="&#xe637;" d="M29.568 102.784v173.424h69.792v-63.072l4.896 4.88 7.76 7.776v52.32h12.672c2.272 0 4.224 1.952 4.224 4.24v8.048c0 2.32-1.952 4.224-4.224 4.224h-120.064c-2.672 0-4.624-1.92-4.624-4.224v-8.048c0-2.32 1.952-4.24 4.624-4.24h12.272v-236.672c0-26.080 21.456-47.552 47.584-47.552 26.048 0 47.552 21.472 47.552 47.552v23.84l-37.504 37.504h-44.96zM120.8 321.36l7.888 1.552c2.272 0.448 3.792 2.72 3.264 5.36l-2.336 12.048 232.288 45.424c25.6 5.024 42.544 30.192 37.552 55.824-5.008 25.616-30.208 42.56-55.792 37.568l-232.336-45.456-2.416 12.448c-0.432 2.224-2.688 3.76-4.944 3.312l-7.904-1.552c-2.256-0.448-3.76-2.688-3.312-4.912l23.056-117.856c0.512-2.608 2.752-4.176 5.024-3.728l-0.032-0.032zM347.168 467.712c5.984 0.464 12.288-0.048 16.944-1.6 5.68-1.888 10.208-6.288 10.208-6.288l-234.32-104.576-10.976-2.176-13.392 68.496 231.536 46.144zM235.904 86.352l-118.32 118.304-59.152-59.104 177.504-177.552 353.408 353.488-59.136 59.12-294.304-294.256z" horiz-adv-x="592" />
-<glyph unicode="&#xe638;" d="M512 480v-192l-69.136 69.136-106-106-53.744 53.744 106 106-69.136 69.136zM122.864 410.864l106-106-53.744-53.744-106 106-69.136-69.136v192h192zM442.864 90.864l69.136 69.136v-192h-192l69.136 69.136-106 106 53.744 53.744zM228.864 143.136l-106-106 69.136-69.136h-192v192l69.136-69.136 106 106z" />
-<glyph unicode="&#xe639;" d="M449.184 11.872h-407.104v296l351.936 0.176 64.416 43.632h-458.432v-383.68h491.28v208.16l-42.096-28.656v-135.632zM227.344 204.512c16.016 9.92 19.536 18.176 6.576 27.28-18.672 4.368-25.136-3.072-31.136-0.416-5.008 12.816-17.104 14.8-24.064 16.528-11.104 2.736-11.104-8.336-20.72-2.784-13.568 7.792-10.592 19.552-33.632 19.392-24.592 0.16-46.464-31.6-16.352-58.32 17.392-11.024 97.28-10.352 119.328-1.68v0zM412.912 124.928l-142.928-28.912c0 0-21.984-4-30.512 8.080-2.672 3.76-3.168 8.048-2.784 12.176-0.096-0.064-0.176-0.144-0.256-0.224-43.52-2.624-44.8 41.84-85.136 29.568-25.408-11.088-40.512-65.104-44.832-110.784 110.56 0 221.12 0 331.68 0-5.44 28.832-14 61.264-25.232 90.096v0zM365.952 239.44l253.888 169.776-9.968 14.944-253.888-169.792 9.968-14.928zM756.688 449.52l-5.312 7.536c-15.488 23.792-47.984 30.192-71.328 13.952l-54.496-36.464 62.56-93.408 54.496 36.48c23.76 15.536 30.16 47.984 14.080 71.904v0zM409.568 175.040l9.552-14.208 253.28 169.904-9.568 14.224-253.264-169.92zM263.84 120.016l139.616 30.4-63.104 93.52-76.512-123.92zM632.816 391.216l-0.544-0.368-4.080 6.304-253.872-169.76 8.144-12.608 1.136 0.768 8.32-13.072-0.672-0.448 9.408-14.784 253.872 169.728-9.2 13.712 0.656 0.464-13.168 20.064z" horiz-adv-x="768" />
-<glyph unicode="&#xe63a;" d="M0-32.272l139.104 72.448-93.808 80.864zM426.976 458.72l-7.792 6.48c-23.28 20.72-59.52 18.128-79.568-5.808l-47.216-54.336 93.184-80.896 47.216 54.352c20.688 23.28 18.096 59.504-5.824 80.208zM293.696 376.608l-14.896 12.944-219.92-252.976 14.864-12.944zM138.448 68l14.208-12.304 219.328 252.944-14.224 12.32zM312.592 361.296l-0.48-0.56-6.128 5.488-219.92-252.96 12.272-10.992 0.976 1.136 12.544-11.44-0.592-0.688 14.256-12.96 219.952 252.96-13.696 11.872 0.56 0.672z" />
-<glyph unicode="&#xe63b;" d="M521.392 224.224l-99.792 99.824v-72.192h-130.864v130.864h72.72l-99.84 99.792-99.824-99.792h72.176v-130.864h-130.848v72.192l-99.792-99.824 99.792-99.84v72.704h130.848v-130.832h-72.176l99.824-99.808 99.84 99.808h-72.72v130.832h130.864v-72.704z" />
-<glyph unicode="&#xe63c;" d="M434.848 321.92c0.064 0.064 0.208 0.16 0.368 0.304l0.208 0.208-0.576-0.512zM0 479.984h107.648c72.96 1.776 98.128-126.624-10.816-129.12h-32.256v-75.312h-64.576v204.432zM64.576 393.92h21.504c32.448 2.192 28.144 42.336 0 43.072h-21.504v-43.072zM182.944 479.984h96.8c124.48-0.96 121.808-205.856 0-204.432h-96.8v204.432zM247.552 436.976v-118.336h10.752c76.368 1.504 75.808 118.704 0 118.336h-10.752zM396.592 479.984h161.456v-43.008h-96.864v-32.24h86.096v-43.104h-86.096v-86.080h-64.592v204.432zM359.792 208.8h-198.656v-77.92h-98.656l197.312-162.944 197.2 162.944h-97.2z" />
-<glyph unicode="&#xe63d;" d="M396.944 292.144l-89.216 44.864 61.376 123.024c9.904 19.84 37.92 25.936 62.592 13.616v0c24.704-12.32 36.688-38.368 26.784-58.192l-61.536-123.296zM376.944 224.432l20.848-10.416 88.784 177.888-20.864 10.4-88.768-177.872zM198.768 2.448c5.248 6.096 12.944 14.64 21.728 24.224l-15.888 7.92c-1.968-10.816-3.968-21.664-5.84-32.144zM293.232 104.544l91.184 183.536-68.992 34.432-91.648-183.648c0 0-0.016-0.208-0.032-0.256l69.072-34.464c0.256 0.224 0.384 0.384 0.384 0.384zM222.032 129.36c-2.928-15.888-9.2-49.776-15.76-85.504l20.592-10.304c21.584 23.536 47.424 50.896 59.536 63.664l-64.368 32.144zM313.952 16.752c2.176 12.656 1.504 25.184 0.576 37.888 10.272 1.28 16.464 8.144 23.792 14.576 17.424 15.152-0.080 63.968-24 45.184-9.984-7.84-10.928-37.968-10.736-50.16-8-0.512-9.504 3.44-17.888-0.784 2.224-7.648 11.664-9.952 18.48-9.552 1.008-12.016 1.632-23.392-0.448-35.392-1.296-7.52-2.512-32.528-10.272-38.336-16.496-4.768-20.656 7.552-34.624 6.016 3.184-9.568 14.416-18.208 24.816-18.208 26.736 0 26.736 28.192 30.288 48.768zM313.936 65.024c-0.064 6.688 1.472 41.968 10.48 41.968 22.896 0 6.608-39.296-10.48-41.968zM331.856-21.28c1.2 3.072-0.016 7.376-5.536 9.568h-1.616l-2.528-2.992c-2.672-7.12 1.36-9.28 2.656-9.792l7.024 3.216zM429.968 33.744c-15.408-0.352-32.672 15.584-41.44 27.136 66 26.416-1.264 109.904-35.184 62.256 34.448 9.056 85.008-30.88 25.184-58.096 0.208 17.232-0.032 39.376-0.048 40.656l-10.352-0.112c0.464-30.32-10.336-80.784-0.048-98.896 6.704 16.224 10.144 32.896 10.32 50.016 21.664-16.928 31.36-32.080 61.088-33.344l0.512 10.336c-3.552 0.192-6.88 0.112-10.016 0.048-10.224-0.24 3.136 0.064 0 0zM453.232 36.4l-1.904 7.344-1.824-2.816 1.456 2.912c-0.96 0.48-5.696 3.264-5.712 3.296l-5.232-8.944c4.528-2.656 7.376-4.32 9.52-4.32 1.456 0 2.576 0.752 3.68 2.512zM473.952 143.392l-10.272-1.408c4.528-33.536 5.376-59.808-0.928-93.888-0.672-3.616-1.328-7.168-1.952-10.688l10.208-1.776c6.688 38.096 8.064 69.776 2.944 107.744zM505.264 120.896c17.952 21.968-4.272 46.752-25.088 51.568-22.24 5.152-28.432-5.808-29.232-7.424l-6.896-16.736 9.568-3.936 6.624 16.144c0.032 0.064 3.52 5.12 17.6 1.856 34.176-7.888 22.224-33.36 1.84-47.952 67.936-8.208 22.944-48.192-8.64-71.056l6.064-8.4c16.464 11.904 89.84 73.616 28.144 85.936zM556.24 115.408c32.48-38.304 37.104 13.152 45.984 30.528 0.192-0.304 16.464-21.984 21.424-20.592 4.656 7.232 6.592 14.864 5.824 22.912 11.344-45.856 62.064 21.488 29.184 31.392-23.984 7.296-40.48-14.928-39.52-35.152-12.672 19.088-19.408 12.368-29.776 0.832-2.352 1.856-5.008 2.592-7.968 2.16 15.584-59.552-12.48-7.664-32.464-12.496-5.168-1.216-17.696-45.648-18.944-50.672l10.016-2.608c3.664 11.68 10.64 22.864 16.224 33.712zM629.92 157.232c-0.784 9.264 18.736 14.592 25.744 12.48 5.728-1.728-1.856-45.040-18.512-9.2l-7.232-3.28zM633.216 55.12c25.984 0 65.040 126.528 82.96 149.888-0.912-6.352-1.504-16 0.288-22.576l10 2.704c-2.384 8.656 4.832 30.992-10.336 31.136-15.648-0.704-12.464-34.288-23.536-41.152 9.344 68.112-60.384-7.2-14.528-11.664-7.472-8.88-16.544-15.584-20.128-24.656v0c-0.592-6.704-61.472-83.648-24.72-83.648v0zM658.768 115.536c0.128-19.008-8.608-39.392-25.056-49.712-11.28 11.216 16.48 43.344 25.056 49.712 0.016-2.976-1.52-1.136 0 0zM675.168 174.496c-0.8 9.568-3.232 11.808 2.576 17.904 5.168-5.488 6.512-11.808 4-19.008-2.192 0.224-4.368 0.576-6.512 1.088-0.048 0-0.064 0-0.080 0zM747.216 201.488c7.232-7.616-16.848-18.528-11.968-18.288 5.856 0.288 23.456 12.064 25.28 16.608 2.896 7.264-3.36 13.632-9.104 11.408-21.568-8.336-7.216 20.608-6.176 22.128-6.336-9.296-19.36-12.032-14.208-28.352zM257.888 415.392c9.84 19.68-2.064 45.552-26.608 57.808v0c-24.496 12.24-52.304 6.16-62.128-13.52l-60.96-122.16 88.592-44.576 61.104 122.448zM176.928 225.728l20.704-10.352 88.16 176.656-20.72 10.336-88.144-176.64zM0 5.328c5.216 6.016 12.848 14.528 21.568 24.048l-15.76 7.872c-1.968-10.736-3.952-21.536-5.808-31.92zM93.808 106.688l90.544 182.272-68.496 34.176-91.008-182.352c0 0-0.016-0.208-0.032-0.256l68.592-34.224c0.24 0.224 0.384 0.384 0.384 0.384zM23.104 131.328c-2.912-15.792-9.152-49.408-15.648-84.896l20.448-10.208c21.424 23.344 47.088 50.544 59.104 63.216l-63.904 31.888z" />
-<glyph unicode="&#xe63e;" d="M113.76-32l-113.76 112.848 142.432 143.648-142.208 142.208 113.296 113.296 255.072-255.040-254.832-256.96zM397.664-32l-113.76 112.848 142.448 143.648-142.192 142.208 113.296 113.296 255.056-255.040-254.848-256.96z" horiz-adv-x="656" />
-<glyph unicode="&#xe63f;" d="M92.128 144.336c15.632 1.184 26.624 3.44 32.992 6.688 10.64 5.664 18.112 16.4 22.4 32.208l77.12 278.496c-40.48 0-67.232-3.056-80.272-9.152-13.040-6.112-28.208-24.608-45.536-55.536l-9.264 1.808 21.888 81.152h281.328l-23.184-86.048-9.28 1.296 1.296 18.288c0 16.144-3.664 28.208-10.992 36.208-7.312 7.984-21.808 11.984-43.488 11.984h-29.44l-73.92-262.528c-1.712-5.664-3.008-10.736-3.856-15.184-1.536-6.704-2.32-12.032-2.32-15.968 0-10.32 3.168-16.704 9.536-19.2 6.336-2.48 18.784-3.984 37.344-4.496v-8.496h-152.352v8.48zM0 82.88v26.032h301.616v-26.032h-301.616zM561.216 208.544l-49.12 49.104-95.712-95.76-95.76 95.76-49.088-49.104 95.76-95.728-95.76-95.712 49.088-49.104 95.76 95.712 95.712-95.712 49.12 49.104-95.744 95.712z" horiz-adv-x="560" />
-<glyph unicode="&#xe640;" d="M373.92 462.080c20.944-18.128 23.216-49.856 5.088-70.224l-41.344-47.616-81.616 70.848 41.344 47.584c17.584 20.96 49.312 23.232 69.696 5.088l6.832-5.68zM244.176 401.488l-192.608-221.536 12.992-11.328 192.64 221.552-13.024 11.312zM75.36 159.568l10.736-9.648 192.64 221.52-10.768 9.648-192.608-221.52zM97.456 140.32l12.464-11.344 192.608 221.504-13.056 11.328-192.016-221.488zM121.248 119.904l192.048 221.536 12.448-10.784-192.048-221.52-12.448 10.768zM121.808 95.552l-121.808-63.44 39.664 134.256 82.144-70.816zM291.024 361.472l-17.28 15.28-192.224-220.832 22.576-20.624zM543.52 208.544l-49.12 49.088-95.712-95.744-95.76 95.744-49.088-49.088 95.76-95.728-95.76-95.728 49.088-49.088 95.76 95.712 95.712-95.712 49.12 49.088-95.744 95.728z" horiz-adv-x="544" />
-<glyph unicode="&#xe641;" d="M416.576 413.36c0 24.896-16.912 45.52-38.368 45.984l-0.16-0.032-22.544 0.064 0.032 15.184c0.016 2.944-1.376 5.344-3.056 5.36l-36.272 0.080c-1.712 0.016-3.104-2.4-3.104-5.328l-0.048-15.2-32.784 0.080 0.032 15.008c0.016 2.944-1.376 5.344-3.056 5.36l-36.32 0.080c-1.712 0.016-3.104-2.4-3.104-5.328l-0.032-15.008-48.032 0.112 0.048 14.784c0.016 2.944-1.376 5.344-3.056 5.36l-36.288 0.080c-1.712 0.016-3.104-2.4-3.104-5.328l-0.032-14.8-38.128 0.096 0.032 14.592c0 2.944-1.376 5.344-3.072 5.36l-36.288 0.080c-1.712 0.016-3.104-2.4-3.104-5.328l-0.032-14.592-27.36 0.064c-20.016 0-36.864-18.976-38.336-42.688l-1.024-402.656c-0.080-25.248 17.056-45.872 38.224-45.968l0.288-0.032 338.656-0.832c20.64 0 37.888 20.064 38.448 44.736l0.096 0.176-0.080 1.008 0.96 399.456zM218.656 375.024h17.088l23.2-48.688 23.072 48.688h17.088v-90.032h-17.344v52.48l-16.96-34.128h-11.728l-17.072 34.128v-52.464h-17.344v90.016zM117.488 375.024h17.088l23.2-48.688 23.072 48.688h17.088v-90.032h-17.344v52.48l-16.976-34.128h-11.68l-17.12 34.128v-52.464h-17.328v90.016zM377.2 14.16l-0.016-0.976c-0.176-3.264-1.28-5.312-2.016-6.272l-334.8 0.864c-0.8 1.024-1.968 3.296-1.952 6.928l0.512 218.32h338.8l-0.528-218.864z" horiz-adv-x="416" />
-<glyph unicode="&#xe642;" d="M694.976 446.432h-224.944c-21.824 0-40.288-18.464-40.288-40.288v-132.624c0-21.824 18.464-40.288 40.288-40.288h224.944c21.824 0 40.288 18.464 40.288 40.288v132.624c0 21.824-18.464 40.288-40.288 40.288zM318.944 179.52h-224.944c-21.824 0-40.288-18.464-40.288-40.288v-132.624c0-21.824 18.464-40.288 40.288-40.288h224.944c21.824 0 40.288 18.464 40.288 40.288v132.624c0 21.824-18.464 40.288-40.288 40.288zM694.976 179.52h-224.944c-21.824 0-40.288-18.464-40.288-40.288v-132.624c0-21.824 18.464-40.288 40.288-40.288h224.944c21.824 0 40.288 18.464 40.288 40.288v132.624c0 21.824-18.464 40.288-40.288 40.288zM0 480h342.448v-45.328h-342.448v45.328zM0 387.664h342.448v-45.328h-342.448v45.328zM0 295.344h342.448v-45.328h-342.448v45.328z" horiz-adv-x="736" />
-<glyph unicode="&#xe643;" d="M512.576 393.12l-86.912 86.88-169.36-169.424-169.456 169.424-86.848-86.88 169.44-169.376-169.44-169.36 86.848-86.88 169.456 169.376 169.36-169.376 86.912 86.88-169.408 169.36z" />
-<glyph unicode="&#xe644;" d="M96.064 147.744h28.448c-1.136 5.376-2.32 11.072-3.52 17.008h-24.928v-17.008zM97.984 103.696h35.872l-3.6 17.008h-32.272v-17.008zM97.984 76.624h239.072v-17.008h-239.072v17.008zM156.704 144.032c19.040 15.872 6.64 9.904 24.208 19.68 0 0-15.088 137.536 125.84 209.024 22.88 8.48 73.52 21.040 136.112-3.824l-37.44-34.384 139.072 11.152 10.976 129.936-36.928-35.808c-37.024 16.768-76.24 29.376-118.384 36.272-41.184 8.816-80.224 2.48-120.24-15.392-54.736-24.832-91.056-57.248-110.272-94.608-20.016-39.232-28.336-86.848-26.464-143.6 1.632-23.328 8.832-56.192 13.552-78.432v0zM633.488 389.392h-54.48l-3.888-46.080h58.368c25.408 0 46.096-20.672 46.096-46.080v-140c0-25.408-20.672-46.080-46.096-46.080h-231.024c-25.408 0-46.080 20.672-46.080 46.080v140c0 0.88 0.256 1.696 0.272 2.56 0.56 32.048 22.848 52.656 22.848 52.656-3.632 0.256-7.264 0.368-10.88 0.368-18.336 0.016-33.2-3.184-44.080-6.56-8.976-14.224-14.24-30.976-14.24-49.024v-4.88h-57.328c-12.608-15.312-21.456-31.088-27.664-46.096h84.992v-81.504h-98.64l1.872-17.008h97.248c0 0.016 0 0.016 0 0.032 0.976-9.536 3.424-18.64 7.072-27.072h-141.232c-0.112-0.096-0.176-0.144-0.272-0.24l-20.096-16.768h171.28c10.384-14.528 24.864-25.856 41.776-32.384-0.032 0.016-0.080 0.016-0.112 0.032v-11.168c0-25.408-20.672-46.080-46.080-46.080h-231.008c-25.408 0-46.080 20.672-46.080 46.080v140.016c0 25.392 20.672 46.064 46.080 46.064h20.176c0.288 16.16 1.504 31.456 3.52 46.096h-23.68c-50.896 0-92.16-41.264-92.16-92.16v-140.016c0-50.912 41.264-92.16 92.16-92.16h231.040c50.896 0 92.16 41.248 92.16 92.16v4.896h218.192c50.896 0 92.16 41.28 92.16 92.16v140c0 50.896-41.264 92.16-92.16 92.16l-0.064-0.016zM322.256 111.936c0.032-0.064 0.080-0.112 0.112-0.16-0.032 0.064-0.080 0.112-0.112 0.16zM377.12 68.656c0 0 0.016 0 0 0 0.016 0 0 0 0 0zM385.168 66.736c0.592-0.128 1.2-0.176 1.808-0.288-0.592 0.096-1.216 0.16-1.808 0.288zM393.6 65.504c2.944-0.304 5.888-0.448 8.896-0.448-3.008 0-5.952 0.144-8.896 0.448zM406.432 261.792h242.896v-17.008h-242.896v17.008zM408.352 217.744h239.072v-17.024h-239.072v17.024zM408.352 173.712h239.072v-17.024h-239.072v17.024z" horiz-adv-x="720" />
-<glyph unicode="&#xe645;" d="M512.016 249.36c0 6.496-5.36 11.792-11.808 11.792h-21.584c-6.528 0-13.376 5.056-15.2 11.264l-29.376 68.624c-3.136 5.6-2.096 13.952 2.464 18.576l14.608 14.576c4.608 4.592 4.608 12.128 0 16.672l-35.12 35.168c-4.576 4.624-12.048 4.624-16.768 0l-15.792-15.872c-4.624-4.592-13.104-5.872-18.8-2.864l-59.728 23.856c-6.224 1.76-11.36 8.56-11.36 15.008v22.16c0 6.448-5.296 11.712-11.728 11.712h-49.856c-6.448 0-11.76-5.264-11.76-11.712v-22.16c0-6.448-5.104-13.312-11.248-15.232l-69.248-29.6c-5.536-3.264-13.808-2.176-18.448 2.4l-15.536 15.536c-4.56 4.56-12.032 4.56-16.656 0l-35.184-35.2c-4.656-4.592-4.656-12.096 0-16.672l16.864-16.992c4.672-4.56 5.92-12.928 2.944-18.72l-23.552-59.152c-1.728-6.304-8.496-11.36-14.992-11.36h-23.504c-6.432 0.016-11.712-5.28-11.712-11.776v-49.76c0-6.512 5.296-11.856 11.728-11.856h23.504c6.496 0 13.28-5.024 15.2-11.232l28.864-68.112c3.328-5.6 2.208-13.888-2.288-18.528l-16.192-16.064c-4.608-4.592-4.608-12.032 0-16.688l35.216-35.184c4.64-4.56 12.144-4.56 16.608 0l17.296 17.2c4.624 4.608 12.912 5.856 18.672 2.736l60.4-24.080c6.144-1.792 11.248-8.56 11.248-15.008v-23.040c0-6.448 5.312-11.76 11.76-11.76h49.856c6.416 0 11.728 5.312 11.728 11.76v23.040c0 6.448 5.088 13.216 11.344 15.136l67.52 28.64c5.6 3.2 13.84 2.064 18.512-2.496l15.232-15.264c4.576-4.56 12.048-4.56 16.672 0l35.216 35.216c4.608 4.56 4.608 12.096 0 16.672l-16.256 16.176c-4.48 4.624-5.76 12.976-2.736 18.736l24.464 60.88c1.728 6.24 8.576 11.264 15.104 11.328h21.584c6.448 0 11.808 5.296 11.808 11.792l-0.048 49.744zM256.048 140.272c-46.304 0-83.728 37.52-83.728 83.728 0 46.272 37.44 83.696 83.728 83.696 46.176 0 83.696-37.44 83.696-83.696 0-46.192-37.536-83.728-83.696-83.728zM976.88 224.016l-173.248-201.168-173.216 201.168z" horiz-adv-x="976" />
-<glyph unicode="&#xe646;" d="M512.048 249.36c0 6.48-5.36 11.776-11.792 11.776h-21.584c-6.528 0-13.36 5.056-15.184 11.28l-29.376 68.592c-3.136 5.616-2.096 13.984 2.48 18.592l14.608 14.576c4.592 4.592 4.592 12.096 0 16.688l-35.152 35.184c-4.576 4.608-12.048 4.608-16.784 0l-15.792-15.872c-4.624-4.608-13.104-5.872-18.816-2.848l-59.728 23.808c-6.24 1.792-11.36 8.56-11.36 15.024v22.16c0 6.48-5.296 11.728-11.712 11.728h-49.84c-6.448 0-11.76-5.264-11.76-11.728v-22.144c0-6.464-5.12-13.296-11.248-15.232l-69.248-29.616c-5.568-3.264-13.84-2.192-18.464 2.384l-15.536 15.552c-4.576 4.576-12.032 4.576-16.656 0l-35.2-35.2c-4.656-4.592-4.656-12.096 0-16.688l16.88-16.976c4.656-4.56 5.952-12.928 2.928-18.72l-23.52-59.152c-1.744-6.304-8.512-11.344-15.008-11.344h-23.488c-6.432 0-11.728-5.296-11.728-11.776v-49.792c0-6.496 5.28-11.84 11.728-11.84h23.488c6.496 0 13.28-5.024 15.2-11.232l28.88-68.080c3.312-5.616 2.208-13.92-2.304-18.528l-16.208-16.096c-4.592-4.608-4.592-12.016 0-16.688l35.216-35.184c4.608-4.576 12.096-4.576 16.608 0l17.296 17.216c4.608 4.576 12.896 5.856 18.672 2.752l60.4-24.096c6.144-1.792 11.248-8.56 11.248-15.008v-23.040c0-6.48 5.296-11.776 11.76-11.776h49.84c6.4 0 11.712 5.296 11.712 11.776v23.040c0 6.448 5.072 13.232 11.36 15.136l67.52 28.64c5.6 3.152 13.84 2.032 18.512-2.496l15.216-15.296c4.576-4.576 12.048-4.576 16.672 0l35.2 35.232c4.592 4.56 4.592 12.064 0 16.656l-16.256 16.176c-4.48 4.608-5.744 12.976-2.736 18.72l24.464 60.88c1.744 6.256 8.576 11.28 15.104 11.328h21.584c6.4 0 11.792 5.296 11.792 11.792v49.792l0.080-0.016zM256.080 140.288c-46.32 0-83.728 37.504-83.728 83.728 0 46.24 37.408 83.68 83.728 83.68 46.176 0 83.712-37.44 83.712-83.68 0-46.224-37.536-83.728-83.712-83.728z" />
-<glyph unicode="&#xe647;" d="M29.952 113.424v295.056h89.184c-43.952-4.544-75.856-18.224-75.856-34.4h215.648c0 16.176-31.92 29.84-75.856 34.384h89.184v-295.056h-55.12v-29.952h62.272c12.592 0 22.816 10.224 22.816 22.816v309.344c0 12.608-10.224 22.8-22.816 22.8h-97.968v14.544c0 14.944-12.112 27.040-27.024 27.040-14.944 0-27.056-12.096-27.056-27.040v-14.544h-104.544c-12.608 0-22.816-10.208-22.816-22.8v-309.328c0-12.592 10.208-22.816 22.816-22.816h61.888v29.952h-54.752zM154.416 466.608c7.664 0 13.856-6.208 13.856-13.856 0-7.664-6.208-13.872-13.856-13.872s-13.872 6.192-13.872 13.856c0 7.648 6.208 13.872 13.872 13.872zM178.144 194.752h-54.48v-140.704l-57.408-0.736 83.28-85.312 86.416 87.392-57.808 1.344z" horiz-adv-x="304" />
-<glyph unicode="&#xe648;" d="M256.576-29.904c-137.728 0-249.808 112.064-249.808 249.808 0 137.728 112.064 249.808 249.808 249.808 137.728 0 249.808-112.064 249.808-249.808 0-137.744-112.064-249.808-249.808-249.808zM256.576 461.888c-133.424 0-242-108.56-242-242s108.56-242 242-242c133.44 0 242 108.544 242 242 0 133.44-108.544 242-242 242zM61.056 255.456l86.016 86.736 109.504-108.576 108.416 108.4 86.368-86.384-194.432-194.432z" />
-<glyph unicode="&#xe649;" d="M256.576-28.368c-139.456 0-252.896 113.456-252.896 252.896s113.456 252.896 252.896 252.896 252.896-113.456 252.896-252.896-113.456-252.896-252.896-252.896zM256.576 445.84c-122.016 0-221.28-99.264-221.28-221.28s99.264-221.28 221.28-221.28 221.28 99.264 221.28 221.28-99.248 221.28-221.28 221.28z" />
-<glyph unicode="&#xe64a;" d="M62.256 351.472l36.704-36.72v5.008h180.592l72 72h-324.592v-75.568l7.008 7.008zM378.72 40h-141.296l-50.656-50.704-50.688 50.704h-37.12v37.12l-2.736 2.752-69.264 69.248v-181.12h423.76v285.344l-72-72zM186.736 170.384l-124.48 124.528-62.256-62.256 186.752-186.784 371.872 371.952-62.256 62.176z" horiz-adv-x="560" />
-<glyph unicode="&#xe64b;" d="M585.392 480l-365.136-365.12-146.832 146.8-73.424-73.36 220.288-220.32 438.528 438.624-73.424 73.376z" horiz-adv-x="656" />
-<glyph unicode="&#xe64c;" d="M435.44 455.104l-10.912-12.592c-6.976-8.032-11.12-11.984-14.384-14.768-0.624-1.040-1.584-2.64-3.056-5.152l-7.36-12.4c84.672-22.4 147.376-99.44 147.376-191.040 0-109.040-88.752-197.76-197.84-197.76-46.48 0-89.2 16.24-123.008 43.168v0l-10.736-32.176-39.472 5.168c45.104-43.040 106.096-69.552 173.2-69.552 138.528 0 251.232 112.672 251.232 251.136 0 108.256-68.816 200.72-165.040 235.968v0zM374.96 228.432v172.992h-53.376v-200.96h5.744l101.952-100.928 37.568 37.952-91.888 90.944zM172 454.912c-38.96-19.184-73.376-56.288-100.544-112.72-19.584-41.28-27.312-81.792-19.536-124.832 5.808-44.032 2.752-36.112 18.8-75.056l-70.72-49.376 193.488-25.36 59.6 178.832-98.304-53.376c-0.88 2.432-1.568 4.72-2.336 7.056-19.68 60.736-0.624 89.488 8.432 112.24 77.776 145.136 218.528 126.4 218.528 126.4 10.528 18.080 4.048 5.312 20.912 24.768-22.624 5.392-56.192 13.616-80.080 15.824-58.208 3.168-107.36-4.448-148.24-24.4z" horiz-adv-x="608" />
-<glyph unicode="&#xe64d;" d="M185.408 373.104c-0.816 13.872-3.648 27.648-8.48 41.36-6.816 19.696-10.272 33.264-10.272 40.736 0 10.448 2.48 18.368 7.376 23.824 4.912 5.44 11.056 8.128 18.288 8.128 6.208 0 11.664-2.704 16.304-8.128 4.608-5.456 6.976-13.216 6.976-23.184 0-9.088-2.704-21.712-7.984-37.92-5.424-16.16-8.672-31.136-9.856-44.8 11.088 7.056 21.008 15.568 29.888 25.632 13.696 15.904 23.808 25.776 30.512 29.584 6.576 3.84 13.328 5.696 20.224 5.696 6.544 0 12.16-2.256 16.688-6.768 4.528-4.512 6.848-9.872 6.848-16.128 0-7.44-3.328-14.096-10.016-19.872-6.592-5.872-23.264-11.696-49.776-17.568-15.488-3.392-28.304-7.312-38.608-11.728 10.448-5.424 23.264-9.568 38.368-12.384 24.304-4.384 40.256-9.92 47.792-16.56 7.536-6.672 11.312-13.92 11.312-21.744 0-6.048-2.288-11.264-6.8-15.712s-9.776-6.656-15.776-6.656c-6.048 0-12.784 2.128-20.080 6.384-7.376 4.16-17.296 13.648-29.744 28.352-8.224 9.808-18.528 19.088-30.816 27.712 0.432-11.488 2.768-23.952 6.976-37.424 7.216-23.744 10.88-39.936 10.88-48.576 0-7.984-2.432-14.864-7.264-20.336-4.832-5.568-9.952-8.32-15.392-8.32-7.456 0-14.208 2.912-20.224 8.736-4.224 4.256-6.336 10.944-6.336 20.208 0 9.648 2.352 21.264 6.992 34.896 4.608 13.536 7.488 22.896 8.704 28.064 1.216 5.12 2.352 12.688 3.36 22.72-11.92-7.824-22.256-16.56-31.104-26.24-14.736-16.48-25.712-26.96-33.184-31.392-5.248-3.168-10.688-4.832-16.304-4.832-6.848 0-12.672 2.352-17.504 6.944-4.832 4.672-7.232 9.776-7.232 15.392 0 5.040 2.016 10.272 6.192 15.824 4.096 5.52 10.256 10.096 18.544 13.776 5.392 2.336 17.808 5.584 37.136 9.6 12.48 2.608 24.592 6.432 36.496 11.488-10.928 5.392-23.888 9.648-38.976 12.672-24.688 5.2-39.984 9.952-45.84 14.16-9.040 6.64-13.568 14.704-13.568 24.128 0 5.456 2.304 10.448 6.736 14.944 4.56 4.512 9.84 6.816 15.872 6.816 6.656 0 13.696-2.144 21.12-6.352 7.44-4.256 16.72-12.736 27.744-25.536 11.104-12.72 22.368-22.592 33.84-29.648zM245.6 268.288l-0.8 1.296 0.128-0.8-0.64 0.496 0.752-1.328 29.088-229.92 53.072 61.664 78.944-136.72 22.976 13.312-78.896 136.688 79.888 15.152z" />
-<glyph unicode="&#xe64e;" d="M471.664 207.552l-431.344 232.080 232.368-431.248z" />
-<glyph unicode="&#xe64f;" d="M489.024 160.384l-100.72-101.552-128.224 127.152-126.96-126.944-101.12 101.136 227.664 227.68z" />
-<glyph unicode="&#xe650;" d="M220.144 54.976l-58.896 58.416 73.728 74.352-73.616 73.616 58.64 58.64 132.032-132.016z" />
-<glyph unicode="&#xe651;" d="M32 286.304l100.72 101.552 128.224-127.152 126.96 126.944 101.12-101.136-227.664-227.68z" />
-<glyph unicode="&#xe652;" d="M30.64 447.184l95.424-177.088 28.912 28.944 298.992-298.864 27.216 27.28-298.944 298.848 25.536 25.568z" />
-<glyph unicode="&#xe653;" d="M616.496 480h-424.96c-26.608 0-48.192-21.584-48.192-48.224v-67.872c0 0-1.536-6.112-2.544-8.288-1.072-2.288-5.232-7.824-5.232-7.824l-117.92-98.832c0 0-17.808-15.264-17.632-24.992 0.176-9.44 17.632-23.2 17.632-23.2l117.952-91.744c0 0 4.144-5.184 5.232-7.36 1.056-2.176 2.528-8.32 2.528-8.32v-77.184c0-26.624 21.568-48.176 48.192-48.176h424.96c26.624 0 48.208 21.552 48.208 48.176v415.6c-0.016 26.64-21.584 48.224-48.208 48.224zM358.336 396.72h76.272v-98.96l-20.080-158.736h-36.592l-19.6 158.736v98.96zM437.2 28.736h-80.912v79.376h80.912v-79.376z" horiz-adv-x="672" />
-<glyph unicode="&#xe654;" d="M442.992 79.28c-80.816 6.896-81.824 88.080-88 168.4-4.448 57.84-36.848 93.728-71.296 119.84-4.096 1.056-9.696 1.936-16.128 2.656 11.44 11.664 18.528 27.6 18.528 45.2 0 35.696-28.944 64.624-64.608 64.624s-64.624-28.928-64.624-64.608c0-17.872 7.248-34.048 18.992-45.744-6.768-0.944-12.512-2.144-16.576-3.648-40.016-25.472-68.896-67.472-72.816-125.92-5.024-74.672-8.416-155.568-86.48-159.28 0-20.224 0-40.448 0-60.672 23.792 0 92.512 0 169.392 0 0-28.784 23.328-52.128 52.112-52.128s52.112 23.344 52.112 52.128c76.88 0 145.6 0 169.392 0-0.016 19.712-0.016 39.424-0.016 59.152zM221.504 439.616c13.36 0 24.224-10.88 24.224-24.224s-10.864-24.224-24.224-24.224-24.224 10.88-24.224 24.224 10.864 24.224 24.224 24.224z" horiz-adv-x="448" />
-<glyph unicode="&#xe655;" d="M875.84 410.288c0 26.048-17.936 47.632-40.656 48.112l-0.176-0.032-23.936 0.064 0.048 15.904c0.016 3.088-1.456 5.616-3.248 5.632l-38.496 0.048c-1.808 0.016-3.264-2.496-3.264-5.584l-0.048-15.904-34.8 0.080 0.048 15.696c0.016 3.088-1.472 5.616-3.248 5.632l-38.496 0.064c-1.808 0.016-3.296-2.496-3.296-5.584l-0.032-15.696-50.928 0.112 0.032 15.472c0.016 3.088-1.44 5.616-3.232 5.632l-38.496 0.048c-1.808 0.016-3.296-2.496-3.296-5.584l-0.032-15.472-40.448 0.096 0.048 15.248c0 3.088-1.472 5.616-3.264 5.632l-38.48 0.064c-1.808 0.016-3.296-2.496-3.312-5.584l-0.048-15.248-28.992 0.064c-21.216 0-39.12-19.856-40.64-44.672l-0.288-106.816h122.080v-86.176h277.696l-0.56-199.776v-1.024c-0.192-3.424-1.36-5.552-2.16-6.56l-355.056 0.896c-0.864 1.088-2.080 3.456-2.080 7.248l0.304 123.376h-40.72l-0.32-123.264c-0.080-26.448 18.064-48.912 40.528-49.024h359.488c21.872 0 41.2 21.008 41.792 46.832v389.968zM643.968 275.952h-18.416v54.896l-17.984-35.712h-12.448l-18.128 35.712v-54.896h-18.384v94.208h18.128l24.592-50.928 24.48 50.928h18.144v-94.208zM751.248 275.952h-18.384v54.896l-17.984-35.712h-12.448l-18.144 35.712v-54.896h-18.368v94.208h18.128l24.592-50.928 24.48 50.928h18.128v-94.208zM628.944 193.072v-47.024c-3.44 3.824-7.168 6.512-11.184 8.032s-8.672 2.288-13.936 2.288c-5.024 0-9.728-0.832-14.144-2.48-4.448-1.664-8.080-3.936-10.992-6.848-2.496-2.512-4.496-5.488-5.952-8.912-1.44-3.44-2.496-7.088-3.152-10.928-0.672-3.824-1.072-7.76-1.184-11.792-0.128-4.032-0.208-7.984-0.208-11.792 0-3.84 0.064-7.808 0.208-11.92 0.112-4.096 0.512-8.064 1.184-11.904 0.64-3.84 1.712-7.44 3.152-10.816 1.456-3.376 3.44-6.384 5.952-9.040 2.912-2.912 6.608-5.2 11.088-6.832 4.48-1.664 9.216-2.496 14.24-2.496 5.536 0 10.272 0.848 14.24 2.496 3.968 1.648 7.728 4.464 11.296 8.432l-0.016-9.712h25.408v141.296h-26zM628.352 91.744c-0.384-3.648-1.2-6.784-2.464-9.424-1.232-2.656-3.024-4.736-5.312-6.256-2.304-1.52-5.328-2.288-9.136-2.288-3.792 0-6.816 0.768-9.12 2.288-2.288 1.52-4.016 3.6-5.2 6.256-1.168 2.624-1.952 5.776-2.352 9.424s-0.592 7.584-0.592 11.808c0 4.224 0.208 8.112 0.592 11.696s1.168 6.688 2.352 9.344c1.168 2.624 2.912 4.704 5.2 6.24 2.304 1.52 5.328 2.288 9.12 2.288 3.808 0 6.832-0.768 9.136-2.288 2.288-1.52 4.048-3.616 5.312-6.24 1.232-2.64 2.048-5.76 2.464-9.344s0.592-7.472 0.592-11.696c0-4.224-0.192-8.176-0.592-11.808zM740.272 146.032c-3.424 3.824-7.168 6.512-11.168 8.032-4.016 1.52-8.672 2.288-13.936 2.288-5.024 0-9.728-0.832-14.16-2.48s-8.064-3.936-10.96-6.848c-2.496-2.512-4.496-5.488-5.952-8.912-1.456-3.44-2.496-7.088-3.168-10.928-0.656-3.824-1.072-7.76-1.184-11.792s-0.192-7.984-0.192-11.792c0-3.84 0.048-7.808 0.192-11.92s0.528-8.064 1.184-11.904 1.712-7.44 3.168-10.816c1.456-3.376 3.44-6.384 5.952-9.040 2.912-2.912 6.608-5.2 11.072-6.832 4.496-1.664 9.232-2.496 14.256-2.496 5.536 0 10.272 0.848 14.24 2.496 3.952 1.648 7.712 4.464 11.296 8.432l-0.016-9.712h25.408v141.296h-26v-47.072zM739.696 91.744c-0.384-3.648-1.2-6.784-2.48-9.424-1.232-2.656-3.024-4.736-5.312-6.256s-5.328-2.288-9.12-2.288-6.832 0.768-9.12 2.288-4.016 3.6-5.2 6.256c-1.168 2.624-1.968 5.776-2.352 9.424-0.384 3.648-0.592 7.584-0.592 11.808 0 4.224 0.208 8.112 0.592 11.696 0.368 3.584 1.168 6.688 2.352 9.344 1.168 2.624 2.912 4.704 5.2 6.24s5.328 2.288 9.12 2.288 6.832-0.768 9.12-2.288 4.048-3.616 5.312-6.24c1.248-2.64 2.064-5.76 2.48-9.344 0.368-3.584 0.576-7.472 0.576-11.696 0-4.224-0.208-8.176-0.576-11.808zM525.456 274.48h-203.408v203.408h-118.656v-203.408h-203.408v-101.696h203.408v-204.736l118.656-0.032v204.784h203.408z" horiz-adv-x="880" />
-<glyph unicode="&#xe656;" d="M782.928 206.864h-24.528c-22.144-16.768-49.712-26.944-79.632-26.944-29.952 0-57.488 10.176-79.040 26.944h-17.376c-2.576 0-5.152-0.176-7.712-0.368v-69.68h-83.024c-2.064-7.664-3.248-15.648-3.248-23.92v-125.168h388.608v125.168c-0.016 51.488-41.888 93.968-94.016 93.968zM679.92 435.728c-65.696 0-118.816-53.056-118.816-118.784 0-10.464 1.488-20.56 4-30.24 2.304-8.736 5.456-17.104 9.568-24.96 19.824-38.064 59.472-64.208 105.296-64.208 66.256 0 119.376 53.696 119.376 119.36 0 65.712-53.12 118.784-119.376 118.784l-0.032 0.032zM527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256z" horiz-adv-x="880" />
-<glyph unicode="&#xe657;" d="M635.824 98.592c-0.096-0.048-0.4-0.304-0.64-0.464l-0.928-0.928 1.568 1.408zM795.152 413.056c0.144 0.112 0.432 0.336 0.832 0.608l0.432 0.4-1.264-1.008zM843.472 291.248h-280.272v-44.576h280.272v44.576zM411.92 109.856h431.552v-44.576h-431.552v44.576zM411.92 381.92h431.552v-44.592h-431.552v44.592zM843.472 200.528h-280.272v-44.656h280.272v44.656zM411.92 472.608h431.552v-44.592h-431.552v44.592zM411.92 19.168h431.552v-44.64h-431.552v44.64zM308.288 480h-104.512v-203.776h-203.776v-104.448h203.776v-203.76l104.512-0.016v203.792h203.744v104.48h-203.744z" horiz-adv-x="848" />
-<glyph unicode="&#xe658;" d="M772.448 458.704h-296.784c-61.728 0-111.744-50.032-111.744-111.76v-41.856h55.872v41.856c0 30.8 25.072 55.872 55.872 55.872h296.784c30.832 0 55.872-25.072 55.872-55.872v-220.496c0-30.784-25.072-55.872-55.872-55.872h-296.784c-30.832 0-55.872 25.104-55.872 55.872v20.768h-55.872v-20.768c0-61.728 50-111.76 111.744-111.76h296.784c61.712 0 111.744 50.032 111.744 111.76v220.496c0 61.712-50.048 111.76-111.744 111.76zM586.8 250.784h37.248v-229.952h-37.248v229.952zM558.992 278.064h296.784v-37.248h-296.784v37.248zM527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256zM654.384 219.968c12.096 0.080 10.528-6.080 17.648-10.176 5.040-2.928 5.040 2.912 10.896 1.456 3.664-0.896 9.984-1.936 12.608-8.688 3.168-1.408 6.576 2.512 16.352 0.224 6.832-4.784 4.976-9.12-3.44-14.336-11.584-4.56-53.552-4.912-62.688 0.864-15.792 14.032-4.288 30.72 8.608 30.64v0zM772.112 188.56c23.552-3.904 40.112-52.272 47.104-89.216-58.080 0-116.144 0-174.224 0 2.288 23.984 10.224 52.352 23.552 58.176 21.2 6.464 21.856-16.896 44.736-15.504 20.912 14.432 16.848 49.456 58.848 46.544v0z" horiz-adv-x="880" />
-<glyph unicode="&#xe659;" d="M458.368 462.368v-154.656h48.368l-0.096 26.8h79.6v81.12h249.28v-371.984h-328.544v81.2h-48.624v-127.92h425.856v465.424h-425.84zM506.992 355.952v59.696h59.696l-59.696-59.696zM643.216 56.832h137.328v71.504h-137.328v-71.504zM662.128 109.712h99.488v-34.304h-99.488v34.304zM643.216 157.312h137.328v71.536h-137.328v-71.536zM662.128 210.224h99.488v-34.272h-99.488v34.272zM643.216 257.792h137.328v71.52h-137.328v-71.52zM662.128 310.704h99.488v-34.272h-99.488v34.272zM615.392 90.528c-0.576 1.856-1.28 3.472-2.16 4.896-0.88 1.392-1.856 2.608-2.976 3.632-1.088 1.040-2.208 1.904-3.344 2.672 1.056 0.688 2.064 1.44 3.056 2.336 0.992 0.864 1.872 1.92 2.656 3.2 0.8 1.248 1.44 2.72 1.92 4.416 0.496 1.712 0.736 3.664 0.736 5.872 0 3.488-0.624 6.72-1.904 9.648-1.296 2.96-3.136 5.504-5.456 7.632-2.336 2.096-5.088 3.76-8.224 4.912-3.168 1.168-6.624 1.776-10.4 1.776-3.648 0-7.024-0.56-10.176-1.664-3.168-1.088-5.904-2.704-8.256-4.816-2.352-2.128-4.192-4.72-5.552-7.744-1.36-3.040-2.048-6.448-2.048-10.224h18.64c0 2.432 0.736 4.288 2.224 5.632 1.472 1.312 3.2 1.968 5.168 1.968 1.968 0 3.696-0.64 5.184-1.92 1.472-1.28 2.192-3.216 2.192-5.792 0-1.824-0.592-3.552-1.776-5.184-1.168-1.632-3.184-2.432-5.968-2.432h-2.624v-16.16h2.624c2.48 0 4.576-0.816 6.192-2.432 1.616-1.648 2.448-3.664 2.448-6.080 0-2.88-0.784-5.024-2.352-6.48-1.552-1.408-3.536-2.144-5.968-2.144-2.352 0-4.304 0.688-5.92 2.096-1.584 1.392-2.384 3.536-2.384 6.416h-18.656c0-4.544 0.8-8.432 2.336-11.664 1.552-3.216 3.584-5.856 6.144-7.824 2.512-2.016 5.408-3.488 8.624-4.448 3.216-0.96 6.496-1.424 9.824-1.424 3.568 0 6.976 0.512 10.24 1.552 3.248 1.056 6.128 2.576 8.576 4.608 2.48 2.048 4.448 4.608 5.92 7.728s2.208 6.768 2.208 11.008c0 2.432-0.288 4.576-0.848 6.416l0.032 0.032zM589.872 175.056h27.376v-16.816h-27.376v16.816zM590.208 212.24c2.272 0 4.032-0.64 5.344-1.888 1.28-1.264 1.92-2.928 1.92-5.056 0-1.76-0.736-3.44-2.16-5.056-1.312-1.456-3.168-3.136-5.424-4.928v-20.048l9.552 7.312c2.48 1.872 4.768 3.76 6.816 5.552 2.032 1.824 3.808 3.68 5.28 5.52 1.504 1.872 2.608 3.776 3.408 5.76s1.184 4.096 1.184 6.368c0 3.664-0.688 6.912-1.984 9.792-1.328 2.864-3.168 5.328-5.504 7.36-2.368 1.984-5.104 3.536-8.24 4.592-3.168 1.072-6.56 1.584-10.176 1.584-0.112 0-0.24-0.016-0.336-0.016v-16.816c0.096-0.016 0.224 0.016 0.336 0.016v-0.016zM601.104 320.816h-18.64l-11.296-9.84h18.704v-58.048h11.232v67.872zM527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256z" horiz-adv-x="880" />
-<glyph unicode="&#xe65a;" d="M625.040 449.632c-119.568 0-219.472-55.792-244.768-140.288h186.944v-169.52l-136.176 0.016c9.648-8.864 20.288-17.104 31.904-24.496 6.912-4.432 14.16-8.56 21.68-12.416 9.664-7.136-10.912-56.848-84.352-110.752 60.256 0 150.576 28.096 224.768 78.384 150.576 17.248 251.152 84.832 251.152 189.504 0.016 104.704-112.432 189.552-251.136 189.552zM527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256z" horiz-adv-x="880" />
-<glyph unicode="&#xe65b;" d="M405.008 480v-181.168h45.52l0.16 33.568h102.512l-0.464 103.728h206.448v-424.256h-308.496v137.328h-45.664v-181.2h399.84v511.984h-399.856zM450.672 352.496v83.664h83.616l-83.616-83.664zM308.288 480h-104.496v-203.776h-203.792v-104.432h203.776v-203.76l104.496-0.016v203.776h203.728v104.464h-203.712v203.728z" horiz-adv-x="800" />
-<glyph unicode="&#xe65c;" d="M843.664 438.928h-342.64c-22.368 0-40.528-18.128-40.528-40.544v-57.088c0 0-1.28-5.136-2.128-6.96-0.912-1.904-4.416-6.576-4.416-6.576l-32.528-27.264h141.12v-153.696h-134.112l25.52-19.84c0 0 3.488-4.336 4.416-6.192 0.88-1.824 2.128-6.976 2.128-6.976v-64.912c0-22.368 18.144-40.496 40.528-40.496h342.656c22.384 0 40.528 18.112 40.528 40.496v349.52c-0.016 22.4-18.144 40.544-40.544 40.544zM527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256z" horiz-adv-x="880" />
-<glyph unicode="&#xe65d;" d="M884.096 142.032c-9.696 44.736-29.648 132.288-37.472 137.36l-282.256 183.84c-10.512 6.832-24.624 3.84-31.472-6.656l-89.408-137.392h131.792v-151.072l139.648-90.96c2.656-1.696 31.984 3.28 31.984 3.28l12.080 2.512c-0.416-0.336 60.96 14.48 87.616 21.552 8.64 2.304 16.624 4.432 23.2 6.176 12.128 3.344 17.68 15.84 14.288 31.344zM833.664 156.384c-5.536-19.008-25.424-29.952-44.448-24.448-19.008 5.536-29.952 25.424-24.432 44.448s25.424 29.952 44.448 24.432c19.008-5.52 29.936-25.408 24.432-44.416zM802.336 143.904c4.752-8.688 10.704-29.12 10.704-58.592s-5.952-49.936-10.704-58.608c-4.752 8.688-10.688 29.136-10.688 58.608s5.92 49.904 10.688 58.592zM802.336 164.304c-15.296 0-27.712-35.376-27.712-78.992s12.416-79.008 27.712-79.008 27.728 35.376 27.728 79.008c0 43.632-12.432 78.992-27.728 78.992v0zM527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256z" horiz-adv-x="880" />
-<glyph unicode="&#xe65e;" d="M830.656 300.272v0zM372.752 434.896v-128.224h52.144v73.888h407.12v-304.992h-407.104v70.32h-52.176v-124.688h511.44v413.696l-511.44 0.016zM566.272 309.52c17.504 0.128 15.248-8.8 25.536-14.72 7.312-4.224 7.312 4.208 15.744 2.128 5.296-1.312 14.48-2.832 18.272-12.544 4.56-2.048 9.488 3.632 23.68 0.304 9.84-6.912 7.168-13.168-5.008-20.72-16.768-6.608-77.456-7.12-90.672 1.264-22.896 20.288-6.24 44.448 12.448 44.288v0zM736.512 264.096c34.080-5.616 58.048-75.6 68.096-129.056-84 0-167.984 0-251.968 0 3.264 34.688 14.752 75.728 34.048 84.16 30.656 9.328 31.632-24.448 64.688-22.448 30.272 20.88 24.384 71.552 85.136 67.328v0zM638.048 161.712c-0.048-0.032-0.24-0.176-0.352-0.272l-0.528-0.528 0.88 0.8zM652.576 125.376c0 0-0.016-0.016-0.032-0.032-0.32-0.32-0.512-0.496-0.512-0.496l0.544 0.528zM527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256z" horiz-adv-x="880" />
-<glyph unicode="&#xe65f;" d="M788.224 404.528h-152.496c-3.056 18.56-11.872 49.904-48.096 49.904h-122.96c-35.056 0-44.192-32.816-47.824-51.888-29.056-6.848-49.936-30.72-49.936-59.888v-39.52h41.536v39.52c0 11.408 11.296 20.336 25.92 20.336h15.664l4.32 15.040c0.992 3.504 1.712 7.504 2.432 11.696 0.912 5.104 3.6 20.64 7.040 23.056 0 0 0.256 0.064 0.912 0.064h122.96c2.688 0 5.232 0 7.936-21.152 0.64-4.88 1.248-9.488 2.432-13.696l4.304-15.040h185.904c14.416 0 25.696-8.944 25.696-20.336v-246.544c0-11.392-11.296-20.32-25.696-20.32h-354.144c-14.416 0-25.728 8.912-25.728 20.32v49.904h-41.536v-49.888c0-34.672 29.536-61.84 67.248-61.84h354.080c37.696 0 67.264 27.168 67.264 61.84v246.544c0 34.704-29.552 61.888-67.248 61.888v0zM308.272 480h-104.496v-203.776h-203.792v-104.464h203.792v-203.744l104.496-0.032v203.776h203.728v104.496h-203.728z" horiz-adv-x="848" />
-<glyph unicode="&#xe660;" d="M527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256zM842.448 409.616c-66.592 66.608-143.696 40.64-176.608 10.464-26.32-24.112-82.352-76.256-121.472-110.288h17.328v-48.352c34.048 43.952 96.368 99.504 123.824 124.224 6.928 6.24 75.632 59.824 135.088 0.336 59.424-59.392 5.344-116.752-0.912-123.088 0.016 0.016-179.584-184.384-218.432-216.304-31.456-25.856-96.848-58.128-166.672 11.968-25.344 25.424-33.456 46.976-34.624 81.024h-30.944c3.152-51.056 21.712-86.272 41.728-104.608 86.256-78.992 170.496-46.208 208.224-9.92 56.928 54.736 223.44 218.816 223.44 218.816 29.44 29.44 67.344 98.4 0 165.744zM530.864 309.792l83.584 75.952-25.12 29.44-112.752-105.392h25.664zM463.216 139.584h-33.024c3.792-17.024 10.8-39.024 23.776-51.536 41.936-40.416 105.824-46.8 140.864-14.176 48.416 45.072 170.016 169.344 170.016 169.344l-23.568 23.328c0 0-143.072-149.344-168.656-168.768-21.056-15.968-62.064-13.568-92.688 12.784-7.52 6.464-13.328 12-16.72 29.024z" horiz-adv-x="880" />
-<glyph unicode="&#xe661;" d="M772.448 458.704h-296.784c-61.728 0-111.744-50.032-111.744-111.76v-41.856h55.872v41.856c0 30.8 25.072 55.872 55.872 55.872h296.784c30.832 0 55.872-25.072 55.872-55.872v-220.496c0-30.784-25.072-55.872-55.872-55.872h-296.784c-30.832 0-55.872 25.104-55.872 55.872v20.768h-55.872v-20.768c0-61.728 50-111.76 111.744-111.76h296.784c61.712 0 111.744 50.032 111.744 111.76v220.496c0 61.712-50.048 111.76-111.744 111.76zM586.8 250.784h37.248v-229.952h-37.248v229.952zM558.992 278.064h296.784v-37.248h-296.784v37.248zM527.648 275.744h-204.256v204.256h-119.152v-204.256h-204.256v-102.128h204.256v-205.6l119.152-0.032v205.632h204.256z" horiz-adv-x="880" />
-<glyph unicode="&#xe662;" d="M835.2 432c0 25.6-17.6 48-40 48v0h-356.8c-20.8 0-38.4-19.2-40-44.8v-120h40v116.8c0 3.2 1.6 6.4 1.6 6.4l353.6-1.6c1.6-1.6 1.6-3.2 1.6-8l-1.6-416v-1.6c0-3.2-1.6-4.8-1.6-6.4l-352 1.6c-1.6 1.6-1.6 3.2-1.6 8v115.2h-40v-115.2c0-25.6 17.6-48 40-48v0l355.2 1.6c22.4 0 40 20.8 40 46.4v0 1.6l1.6 416zM793.6-11.2v20.8c0 0 0 0 0 0v-20.8zM721.6 396.8h-217.6c-9.6 0-17.6-4.8-17.6-9.6v-72h62.4v-54.4h172.8c9.6 0 17.6 4.8 17.6 9.6v116.8c0 6.4-8 9.6-17.6 9.6zM380.8 384h70.4c3.2 0 4.8 1.6 4.8 3.2v38.4c0 1.6-3.2 3.2-4.8 3.2h-70.4c-3.2 0-4.8-1.6-4.8-3.2v-38.4c-1.6-1.6 1.6-3.2 4.8-3.2zM456 334.4c0 1.6-3.2 3.2-4.8 3.2h-70.4c-3.2 0-4.8-1.6-4.8-3.2v-19.2h81.6l-1.6 19.2zM374.4 116.8c0-1.6 3.2-3.2 4.8-3.2h70.4c3.2 0 4.8 1.6 4.8 3.2v16h-81.6l1.6-16zM451.2 68.8h-70.4c-3.2 0-4.8-1.6-4.8-3.2v-38.4c0-1.6 3.2-3.2 4.8-3.2h70.4c3.2 0 4.8 1.6 4.8 3.2v38.4c0 1.6-1.6 3.2-4.8 3.2zM307.2 478.4h-104v-203.2h-203.2v-102.4h203.2v-203.2h104v203.2h201.6v102.4h-201.6z" horiz-adv-x="835" />
-<glyph unicode="&#xe663;" d="M609.6 308.8l-67.2 33.6 57.6 116.8c9.6 19.2 32 25.6 51.2 17.6v0c19.2-9.6 25.6-32 17.6-51.2l-59.2-116.8zM604.702 237.709l-15.741 7.873 84.45 168.863 15.741-7.873-84.45-168.863zM430.4 30.4c4.8 6.4 11.2 14.4 19.2 24l-12.8 6.4c-3.2-11.2-4.8-20.8-6.4-30.4zM512 129.6l86.4 174.4-52.8 25.6-86.4-174.4c0 0 0 0 0 0l52.8-25.6c0 0 0 0 0 0zM457.6 147.2c-3.2-14.4-11.2-46.4-19.2-78.4l16-8c19.2 22.4 41.6 49.6 52.8 62.4l-49.6 24zM27.2-9.6h492.8v-16h-492.8v16zM49.6 136c17.6-20.8 28.8-44.8 43.2-67.2 11.2-17.6 20.8-40 41.6-46.4 8-1.6 35.2 11.2 17.6 14.4-8 1.6-11.2 11.2-16 17.6-8 11.2-16 22.4-22.4 33.6-11.2 19.2-22.4 38.4-36.8 56-6.4 11.2-33.6 1.6-27.2-8v0zM54.4 38.4c32 33.6 70.4 60.8 92.8 102.4 6.4 12.8-22.4 9.6-27.2 1.6-20.8-38.4-57.6-65.6-88-97.6-12.8-14.4 16-14.4 22.4-6.4v0zM220.8 38.4c41.6 22.4 88 54.4 110.4 96 24 44.8-32 54.4-59.2 28.8-25.6-24-24-67.2-3.2-92.8 28.8-33.6 64 14.4 73.6 38.4 3.2 9.6-9.6 12.8-16 9.6-30.4-11.2-59.2-36.8-48-72 12.8-36.8 60.8-11.2 80 3.2 4.8 3.2 8 9.6 1.6 12.8-3.2 1.6-6.4 3.2-11.2 3.2-9.6 1.6-30.4-12.8-14.4-19.2 24-8 48-9.6 73.6-8 16 1.6 24 20.8 3.2 19.2-20.8-1.6-40 0-59.2 6.4-4.8-6.4-9.6-12.8-14.4-19.2 0 0 0 0 0 0 0 4.8 1.6 9.6 1.6 12.8-40-30.4-43.2 28.8-8 41.6-4.8 3.2-11.2 6.4-16 9.6-6.4-17.6-17.6-40-28.8-12.8-6.4 16-6.4 40 4.8 54.4 12.8-1.6 17.6-6.4 11.2-16-3.2-6.4-6.4-11.2-11.2-16-8-9.6-17.6-17.6-25.6-25.6-17.6-16-38.4-30.4-59.2-41.6-16-6.4 0-19.2 14.4-12.8v0z" horiz-adv-x="688" />
-<glyph unicode="&#xe664;" d="M438.4 308.8l-67.2 33.6 57.6 116.8c9.6 19.2 32 25.6 51.2 17.6v0c19.2-9.6 25.6-32 17.6-51.2l-59.2-116.8zM432.956 237.804l-15.745 7.865 84.375 168.9 15.745-7.865-84.375-168.9zM257.6 30.4c4.8 6.4 11.2 14.4 19.2 24l-12.8 6.4c-1.6-11.2-3.2-20.8-6.4-30.4zM340.8 129.6l86.4 174.4-52.8 25.6-86.4-172.8c0 0 0 0 0 0l52.8-27.2c0 0 0 0 0 0zM286.4 147.2c-3.2-14.4-11.2-46.4-19.2-78.4l16-8c19.2 22.4 41.6 49.6 52.8 62.4l-49.6 24zM27.2-9.6h246.4v-16h-246.4v16zM49.6 38.4c41.6 22.4 88 54.4 110.4 96 24 44.8-32 54.4-59.2 28.8-25.6-24-24-67.2-3.2-92.8 28.8-33.6 64 14.4 73.6 38.4 3.2 9.6-9.6 12.8-16 9.6-30.4-11.2-59.2-36.8-48-72 12.8-36.8 60.8-11.2 80 3.2 4.8 3.2 8 9.6 1.6 12.8-3.2 1.6-6.4 3.2-11.2 3.2-9.6 1.6-30.4-12.8-14.4-19.2 24-8 48-9.6 73.6-8 16 1.6 24 20.8 3.2 19.2-20.8-1.6-40 0-59.2 6.4-4.8-6.4-9.6-12.8-14.4-19.2 0 0 0 0 0 0 0 4.8 1.6 9.6 1.6 12.8-40-30.4-43.2 28.8-8 41.6-4.8 3.2-11.2 6.4-16 9.6-6.4-17.6-17.6-40-28.8-12.8-6.4 16-6.4 40 4.8 54.4 12.8-1.6 17.6-6.4 11.2-16-3.2-6.4-6.4-11.2-11.2-16-8-9.6-17.6-17.6-25.6-25.6-17.6-16-38.4-30.4-59.2-41.6-16-6.4 0-19.2 14.4-12.8v0zM755.2 308.8l-67.2 33.6 57.6 116.8c9.6 19.2 32 25.6 51.2 17.6v0c19.2-9.6 25.6-32 17.6-51.2l-59.2-116.8zM749.559 237.88l-15.749 7.86 84.318 168.938 15.749-7.86-84.318-168.938zM574.4 30.4c4.8 6.4 11.2 14.4 19.2 24l-12.8 6.4c-1.6-11.2-3.2-20.8-6.4-30.4zM657.6 129.6l86.4 174.4-52.8 25.6-86.4-174.4c0 0 0 0 0 0l52.8-25.6c0 0 0 0 0 0zM603.2 147.2c-3.2-14.4-11.2-46.4-19.2-78.4l16-8c19.2 22.4 41.6 49.6 52.8 62.4l-49.6 24zM342.4-9.6h246.4v-16h-246.4v16zM366.4 38.4c41.6 22.4 88 54.4 110.4 96 24 44.8-32 54.4-59.2 28.8-25.6-24-24-67.2-3.2-92.8 28.8-33.6 64 14.4 73.6 38.4 3.2 9.6-9.6 12.8-16 9.6-30.4-11.2-59.2-36.8-48-72 12.8-36.8 60.8-11.2 80 3.2 4.8 3.2 8 9.6 1.6 12.8-3.2 1.6-6.4 3.2-11.2 3.2-9.6 1.6-30.4-12.8-14.4-19.2 24-8 48-9.6 73.6-8 16 1.6 24 20.8 3.2 19.2-20.8-1.6-40 0-59.2 6.4-4.8-6.4-9.6-12.8-14.4-19.2 0 0 0 0 0 0 0 4.8 1.6 9.6 1.6 12.8-40-30.4-43.2 28.8-8 41.6-4.8 3.2-11.2 6.4-16 9.6-6.4-17.6-17.6-40-28.8-12.8-6.4 16-6.4 40 4.8 54.4 12.8-1.6 17.6-6.4 11.2-16-3.2-6.4-6.4-11.2-11.2-16-8-9.6-17.6-17.6-25.6-25.6-17.6-16-38.4-30.4-59.2-41.6-16-6.4 0-19.2 14.4-12.8v0z" horiz-adv-x="834" />
-<glyph unicode="&#xe665;" d="M260.8 342.4c-3.2 1.6-6.4 4.8-9.6 6.4-11.2-9.6-20.8-19.2-28.8-28.8 17.6-1.6 30.4-17.6 30.4-35.2v-246.4c0-19.2-16-35.2-35.2-35.2h-145.6c-19.2 0-35.2 16-35.2 35.2v246.4c0 19.2 16 35.2 35.2 35.2h56c3.2 11.2 8 24 12.8 35.2h-68.8c-40 1.6-72-30.4-72-70.4v-246.4c0-38.4 32-70.4 72-70.4h147.2c40 0 72 32 72 72v244.8c0 11.2-3.2 22.4-8 30.4-6.4 11.2-12.8 20.8-22.4 27.2zM113.6 283.2h60.8v-12.8h-60.8v12.8zM81.6 238.4h128v-12.8h-128v12.8zM81.6 193.6h128v-12.8h-128v12.8zM108.8 56h72v-27.2h-72v27.2zM552 356.8h-64l-9.6-28.8-1.6-6.4h76.8c19.2 0 35.2-16 35.2-35.2v-246.4c0-19.2-16-35.2-35.2-35.2h-147.2c-19.2 0-35.2 16-35.2 35.2v244.8c0 8 3.2 16 8 20.8l-38.4 3.2c-3.2-8-4.8-16-4.8-25.6v-246.4c0-40 32-72 72-72h147.2c40 0 72 32 72 72v248c-3.2 40-35.2 72-75.2 72zM448 283.2h60.8v-12.8h-60.8v12.8zM416 240h128v-12.8h-128v12.8zM416 198.4h128v-12.8h-128v12.8zM416 155.2h128v-12.8h-128v12.8zM416 113.6h128v-12.8h-128v12.8zM443.2 56h72v-27.2h-72v27.2zM379.2 464c-19.2 14.4-40 19.2-64 14.4-32-6.4-75.2-32-92.8-56-17.6-24-44.8-72-56-113.6 0 0 38.4 83.2 123.2 104 27.2 4.8 64 6.4 88-36.8l-35.2-25.6 97.6-9.6 32 91.2-40-20.8c-16 20.8-33.6 38.4-52.8 52.8z" horiz-adv-x="624" />
-<glyph unicode="&#xe666;" d="M204.8 152c0-1.6 0-1.6 0 0 0-1.6 0-1.6 0 0zM92.8 254.4v-19.2h73.6l17.6 19.2zM94.4 345.6h166.4v-17.6h-166.4v17.6zM228.8 299.2h-134.4v-17.6h116.8l3.2 3.2zM137.6 208h-43.2v-17.6h59.2l-16 16zM94.4 161.6v-17.6h105.6l-17.6 17.6zM38.4 84.8v270.4h86.4v86.4l41.6 1.6h132.8v-187.2l38.4-38.4v262.4h-337.6v-432h168l36.8 36.8h-166.4zM38.4 443.2h70.4l-70.4-70.4v70.4zM481.6 206.4l-49.6 49.6-94.4-96-96 96-48-49.6 96-94.4-96-94.4 48-49.6 96 94.4 94.4-94.4 49.6 49.6-94.4 94.4z" horiz-adv-x="482" />
-<glyph unicode="&#xe667;" d="M472 356.8v0 0c-6.4 9.6-9.6 17.6-9.6 30.4 0 14.4 3.2 24 11.2 32 6.4 8 16 11.2 27.2 11.2 12.8 0 22.4-4.8 28.8-12.8s11.2-20.8 9.6-36.8h-54.4c0-6.4 1.6-11.2 4.8-14.4s8-4.8 12.8-4.8c3.2 0 6.4 1.6 8 3.2 1.6 1.6 4.8 4.8 4.8 9.6l22.4-6.4c11.2-3.2 22.4-9.6 32-22.4 1.6 6.4 3.2 14.4 3.2 20.8v35.2c0 43.2-35.2 78.4-78.4 78.4h-416c-43.2 0-78.4-35.2-78.4-78.4v-33.6c0-44.8 35.2-80 78.4-80h368v19.2c0 19.2 11.2 38.4 25.6 49.6zM112 345.6h-19.2v12.8c-3.2-4.8-8-8-12.8-11.2s-9.6-3.2-16-3.2c-4.8 0-11.2 1.6-14.4 3.2-3.2 3.2-4.8 4.8-8 11.2-1.6 4.8-3.2 9.6-3.2 17.6v51.2h22.4v-38.4c0-11.2 0-19.2 1.6-20.8 1.6-3.2 1.6-4.8 4.8-6.4 1.6-1.6 4.8-1.6 8-1.6s6.4 0 9.6 3.2c3.2 3.2 3.2 4.8 4.8 8s1.6 9.6 1.6 22.4v33.6h20.8v-81.6zM204.8 355.2c-6.4-8-14.4-11.2-24-11.2-4.8 0-8 1.6-12.8 3.2-3.2 1.6-8 4.8-11.2 9.6v-41.6h-22.4v112h20.8v-11.2c3.2 4.8 6.4 8 11.2 9.6 4.8 3.2 9.6 3.2 14.4 3.2 9.6 0 17.6-3.2 24-11.2s9.6-17.6 9.6-32c0-11.2-3.2-22.4-9.6-30.4zM307.2 345.6h-20.8v12.8c-3.2-4.8-8-9.6-11.2-11.2-4.8-3.2-9.6-3.2-14.4-3.2-9.6 0-17.6 3.2-24 11.2s-9.6 17.6-9.6 32 3.2 24 9.6 32c6.4 8 14.4 11.2 25.6 11.2 9.6 0 17.6-3.2 24-11.2v40h22.4v-113.6h-1.6zM377.6 345.6c0 1.6-1.6 3.2-1.6 6.4 0 1.6 0 1.6 0 3.2-4.8-3.2-8-6.4-12.8-8s-8-3.2-12.8-3.2c-8 0-14.4 1.6-19.2 6.4-4.8 4.8-8 9.6-8 17.6 0 4.8 1.6 8 3.2 12.8 1.6 3.2 4.8 6.4 9.6 8 3.2 1.6 9.6 3.2 17.6 4.8 9.6 1.6 17.6 3.2 20.8 4.8v3.2c0 4.8-1.6 6.4-3.2 9.6-1.6 1.6-6.4 3.2-11.2 3.2-3.2 0-6.4 0-9.6-1.6-1.6-1.6-3.2-4.8-4.8-8l-19.2 3.2c1.6 8 6.4 14.4 11.2 17.6 4.8 3.2 12.8 6.4 24 6.4 9.6 0 17.6-1.6 22.4-3.2 4.8-1.6 8-4.8 9.6-8s3.2-9.6 3.2-19.2v-25.6c0-8 0-12.8 1.6-16 0-3.2 1.6-6.4 3.2-11.2l-22.4-6.4-1.6 3.2zM428.8 344c-3.2 1.6-4.8 4.8-6.4 6.4-1.6 1.6-3.2 4.8-3.2 8s0 8 0 16v36.8h-9.6v16h9.6v16l22.4 12.8v-28.8h14.4v-17.6h-14.4v-33.6c0-6.4 0-11.2 0-11.2 0-1.6 4.8-9.6 12.8-3.2l1.6-17.6c-4.8-1.6-9.6-4.8-17.6-3.2-4.8 1.6-4.8 0-9.6 3.2zM174.4 412.8c-4.8 0-9.6-1.6-12.8-6.4-3.2-3.2-6.4-9.6-6.4-17.6 0-9.6 1.6-16 4.8-20.8s8-6.4 12.8-6.4 8 1.6 12.8 6.4c4.8 4.8 6.4 9.6 6.4 19.2 0 8-1.6 14.4-4.8 19.2s-8 6.4-12.8 6.4zM267.2 412.8c-4.8 0-9.6-1.6-12.8-6.4s-4.8-9.6-4.8-17.6 1.6-14.4 3.2-19.2c3.2-6.4 8-8 14.4-8 4.8 0 9.6 1.6 12.8 6.4 3.2 4.8 4.8 11.2 4.8 19.2 0 9.6-1.6 16-4.8 20.8-3.2 3.2-8 4.8-12.8 4.8zM348.8 377.6c-3.2-1.6-4.8-4.8-4.8-8s1.6-6.4 3.2-8 4.8-3.2 8-3.2 8 1.6 11.2 3.2 4.8 4.8 4.8 6.4 1.6 4.8 1.6 11.2v6.4c-1.6-1.6-6.4-1.6-12.8-3.2-4.8-1.6-9.6-3.2-11.2-4.8zM513.6 408c-3.2 3.2-6.4 4.8-11.2 4.8s-8-1.6-11.2-4.8c-3.2-3.2-4.8-8-4.8-14.4h32c0 6.4-1.6 11.2-4.8 14.4zM684.8 174.4v0 0 38.4c-8 28.8-28.8 30.4-35.2 30.4-1.6 0-1.6 0-3.2 0h-1.6c-8 12.8-20.8 20.8-36.8 20.8-6.4 0-12.8-1.6-17.6-3.2-8 8-17.6 12.8-30.4 12.8-1.6 0-3.2 0-6.4 0v16c0 14.4 0 52.8-36.8 52.8h-3.2c-22.4 0-40-16-40-35.2v-88c-8 6.4-16 8-25.6 8-6.4 0-11.2-1.6-16-1.6-9.6-1.6-19.2-9.6-24-17.6-4.8-9.6-4.8-22.4 0-33.6l28.8-83.2 3.2-6.4 46.4-70.4 11.2-30.4 6.4-16h142.4l4.8 17.6 30.4 121.6c1.6 8 1.6 24 0 52.8 3.2 8 3.2 12.8 3.2 14.4zM660.8 113.6l-30.4-121.6h-108.8l-12.8 33.6-49.6 73.6-28.8 84.8c-3.2 8 0 17.6 6.4 19.2 4.8 1.6 8 1.6 11.2 1.6 4.8 0 9.6-1.6 14.4-8l22.4-49.6c0-1.6 3.2-3.2 4.8-3.2 3.2 0 6.4 1.6 6.4 4.8l-1.6 156.8c0 6.4 6.4 11.2 16 11.2 1.6 0 1.6 0 3.2 0 8 0 12.8-1.6 12.8-30.4v-104c0-3.2 3.2-3.2 6.4-3.2 3.2 0 6.4 1.6 6.4 3.2v54.4c0 6.4 6.4 11.2 16 11.2s16-4.8 16-11.2v-49.6c0-3.2 3.2-4.8 8-4.8s9.6 1.6 8 4.8v40c0 6.4 6.4 11.2 16 11.2v0c9.6 0 12.8-4.8 12.8-11.2v-51.2c0-3.2 3.2-4.8 4.8-4.8 3.2 0 6.4 1.6 6.4 4.8v30.4c0 6.4 4.8 12.8 12.8 12.8h1.6c6.4 0 9.6-4.8 12.8-12.8v-30.4c6.4-3.2 8-51.2 6.4-62.4z" horiz-adv-x="685" />
-</font></defs></svg>
\ No newline at end of file
diff --git a/unittests/example_labfolder_data/static/font/icons11.ttf b/unittests/example_labfolder_data/static/font/icons11.ttf
deleted file mode 100644
index b956ee714be5bdfde6b4998de03bfc2b085ddeb0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 37716
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

diff --git a/unittests/example_labfolder_data/static/font/icons11.woff b/unittests/example_labfolder_data/static/font/icons11.woff
deleted file mode 100644
index 2f54cb21f8b7434e3ffd4f08f9a41b40e2cf68d7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 26056
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
bg+YNKiJ_7~fx#1Oxi8dmXzm1s6%Gslwk-e|

diff --git a/unittests/example_labfolder_data/static/font/redactor-font.eot b/unittests/example_labfolder_data/static/font/redactor-font.eot
deleted file mode 100644
index be2a55b38dea4c0522f935541adde23cd56b8ed4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 6224
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
E0Pg)8`v3p{

diff --git a/unittests/example_labfolder_data/static/img/favicon2.ico b/unittests/example_labfolder_data/static/img/favicon2.ico
deleted file mode 100644
index e5ae15465d3528a6eaf094b5401d93c3f07469ee..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1150
zcmZQzU}Ruq5D);-3Je)63=Con3=A3!3=9Gc3=9ek5OD?&U}0bo;)Y-l7lhv&$YywR
zAe-yWf$Y#X2eQlG9LP3#b0C`$Dh^VD7em$My*ZHm>CJ)c|8EXtUwLyN+Yl;_S1(BN
z&4FxzHwUs0LG^<4gK#Mc`Z?Yl$X<b@|HqpH*)b&O2l?Ol&4KJKZw_Q%esdsuA2$6k
z^WGfDW`?n$?g!}yVV*Y!vL)Xf$gX&EAbb0p1KHv*bx@k+&4KLbHwUtpyg85^1v3X^
z1`I>hvAsEvUHRrfcK@3L+0t(gWP|j9%vXAIAbatf1KE$?9LRq3=0LUvNIgt1j0TCl
zIgl;?=0NtjHwUs8zB!OR<IRC=&o>9MC%!q5{ou`k?1OI(WZ!*rAX^Qj7N!qGgZNM^
z^yWbJ%r^(Jcf2`}z5C69>^W}^WCugdDS2}sJK)WMY$lLekUnG#5_@wXTjI@u>{D+J
zWbb-&Ap7Z?1KAyK4rGJ;1@Z?NW6=Xjb0EKRzB!N`4|V%&D81*+fo#_|2eNJ69LV;A
z`VVXl)ILz0M7%kWT@4L;P<qgOb0Ayn&4Fz0HwUtPq4E3v&4KJ+Zw_Riesdt(0IC;c
zj>?+@*|**t$UgAqK=#!)2eSQ<<UsN|Zw_QXLrP<yG}?uvM()jl>`QMBWPg2gAbazh
z1KG+*av=Sn^z{}^{}iNr2J*Z8n*-TBZw_RKy*ZH0il!fwwm@<D2WrN{HwUtv(bRzK
zLBXIfMp6Sxn}u%<WOu$fknIGEzvll849rNl`7r~-!GjD89~>DNelS9@I0M50Mh1ok
TMh1rFMh1rF1_*upAOiyc@m>AT

diff --git a/unittests/example_labfolder_data/static/img/labfolder_icons.png b/unittests/example_labfolder_data/static/img/labfolder_icons.png
deleted file mode 100644
index 7b42b63bf1e5c1056fa9df766e324f93cb93bae9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 17304
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

diff --git a/unittests/example_labfolder_data/static/img/squares.png b/unittests/example_labfolder_data/static/img/squares.png
deleted file mode 100644
index 84b9b012c7b9f50be7fe63243bce8ce7f4c83ae2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 228
zcmeAS@N?(olHy`uVBq!ia0y~yV9)?z4mJh`hMs>rav2yH7>k44ofy`glX=O&z`&N|
z?e4<x9|RZdT|SwCfq}EYBeIx*fm;}a85w5Hkzin8U@!6Xb!ET9A;Y1g`hTOfGXn!d
zil>WXNW|f{*AH?YFyLWv%q`$%{2m{>YsVCUR*MJ6@7+G}S#Xj^kUwMEq}5_iefKUl
z>vw2mV&xL~q02m@w_JV0r~74lFG}8W(2Wy2mFl<vBB>Fuz#(5KUud?=f&>4HnR%}%
WhcbQI9>u`Gz~JfX=d#Wzp$P!%V@aR@

diff --git a/unittests/example_labfolder_data/static/js/jquery-1.8.2.min.js b/unittests/example_labfolder_data/static/js/jquery-1.8.2.min.js
deleted file mode 100644
index f65cf1dc..00000000
--- a/unittests/example_labfolder_data/static/js/jquery-1.8.2.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v1.8.2 jquery.com | jquery.org/license */
-(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call(" ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window);
\ No newline at end of file
diff --git a/unittests/example_labfolder_data/static/js/jquery-ui.js b/unittests/example_labfolder_data/static/js/jquery-ui.js
deleted file mode 100644
index 9a7ea59f..00000000
--- a/unittests/example_labfolder_data/static/js/jquery-ui.js
+++ /dev/null
@@ -1,14912 +0,0 @@
-/*! jQuery UI - v1.9.2 - 2012-11-23
-* http://jqueryui.com
-* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.sortable.js, jquery.ui.effect.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.position.js, jquery.ui.progressbar.js, jquery.ui.slider.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
-* Copyright 2012 jQuery Foundation and other contributors; Licensed MIT */
-
-(function( $, undefined ) {
-
-var uuid = 0,
-	runiqueId = /^ui-id-\d+$/;
-
-// prevent duplicate loading
-// this is only a problem because we proxy existing functions
-// and we don't want to double proxy them
-$.ui = $.ui || {};
-if ( $.ui.version ) {
-	return;
-}
-
-$.extend( $.ui, {
-	version: "1.9.2",
-
-	keyCode: {
-		BACKSPACE: 8,
-		COMMA: 188,
-		DELETE: 46,
-		DOWN: 40,
-		END: 35,
-		ENTER: 13,
-		ESCAPE: 27,
-		HOME: 36,
-		LEFT: 37,
-		NUMPAD_ADD: 107,
-		NUMPAD_DECIMAL: 110,
-		NUMPAD_DIVIDE: 111,
-		NUMPAD_ENTER: 108,
-		NUMPAD_MULTIPLY: 106,
-		NUMPAD_SUBTRACT: 109,
-		PAGE_DOWN: 34,
-		PAGE_UP: 33,
-		PERIOD: 190,
-		RIGHT: 39,
-		SPACE: 32,
-		TAB: 9,
-		UP: 38
-	}
-});
-
-// plugins
-$.fn.extend({
-	_focus: $.fn.focus,
-	focus: function( delay, fn ) {
-		return typeof delay === "number" ?
-			this.each(function() {
-				var elem = this;
-				setTimeout(function() {
-					$( elem ).focus();
-					if ( fn ) {
-						fn.call( elem );
-					}
-				}, delay );
-			}) :
-			this._focus.apply( this, arguments );
-	},
-
-	scrollParent: function() {
-		var scrollParent;
-		if (($.ui.ie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
-			scrollParent = this.parents().filter(function() {
-				return (/(relative|absolute|fixed)/).test($.css(this,'position')) && (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
-			}).eq(0);
-		} else {
-			scrollParent = this.parents().filter(function() {
-				return (/(auto|scroll)/).test($.css(this,'overflow')+$.css(this,'overflow-y')+$.css(this,'overflow-x'));
-			}).eq(0);
-		}
-
-		return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
-	},
-
-	zIndex: function( zIndex ) {
-		if ( zIndex !== undefined ) {
-			return this.css( "zIndex", zIndex );
-		}
-
-		if ( this.length ) {
-			var elem = $( this[ 0 ] ), position, value;
-			while ( elem.length && elem[ 0 ] !== document ) {
-				// Ignore z-index if position is set to a value where z-index is ignored by the browser
-				// This makes behavior of this function consistent across browsers
-				// WebKit always returns auto if the element is positioned
-				position = elem.css( "position" );
-				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
-					// IE returns 0 when zIndex is not specified
-					// other browsers return a string
-					// we ignore the case of nested elements with an explicit value of 0
-					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
-					value = parseInt( elem.css( "zIndex" ), 31 );
-					if ( !isNaN( value ) && value !== 0 ) {
-						return value;
-					}
-				}
-				elem = elem.parent();
-			}
-		}
-
-		return 0;
-	},
-
-	uniqueId: function() {
-		return this.each(function() {
-			if ( !this.id ) {
-				this.id = "ui-id-" + (++uuid);
-			}
-		});
-	},
-
-	removeUniqueId: function() {
-		return this.each(function() {
-			if ( runiqueId.test( this.id ) ) {
-				$( this ).removeAttr( "id" );
-			}
-		});
-	}
-});
-
-// selectors
-function focusable( element, isTabIndexNotNaN ) {
-	var map, mapName, img,
-		nodeName = element.nodeName.toLowerCase();
-	if ( "area" === nodeName ) {
-		map = element.parentNode;
-		mapName = map.name;
-		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
-			return false;
-		}
-		img = $( "img[usemap=#" + mapName + "]" )[0];
-		return !!img && visible( img );
-	}
-	return ( /input|select|textarea|button|object/.test( nodeName ) ?
-		!element.disabled :
-		"a" === nodeName ?
-			element.href || isTabIndexNotNaN :
-			isTabIndexNotNaN) &&
-		// the element and all of its ancestors must be visible
-		visible( element );
-}
-
-function visible( element ) {
-	return $.expr.filters.visible( element ) &&
-		!$( element ).parents().andSelf().filter(function() {
-			return $.css( this, "visibility" ) === "hidden";
-		}).length;
-}
-
-$.extend( $.expr[ ":" ], {
-	data: $.expr.createPseudo ?
-		$.expr.createPseudo(function( dataName ) {
-			return function( elem ) {
-				return !!$.data( elem, dataName );
-			};
-		}) :
-		// support: jQuery <1.8
-		function( elem, i, match ) {
-			return !!$.data( elem, match[ 3 ] );
-		},
-
-	focusable: function( element ) {
-		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
-	},
-
-	tabbable: function( element ) {
-		var tabIndex = $.attr( element, "tabindex" ),
-			isTabIndexNaN = isNaN( tabIndex );
-		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
-	}
-});
-
-// support
-$(function() {
-	var body = document.body,
-		div = body.appendChild( div = document.createElement( "div" ) );
-
-	// access offsetHeight before setting the style to prevent a layout bug
-	// in IE 9 which causes the element to continue to take up space even
-	// after it is removed from the DOM (#8026)
-	div.offsetHeight;
-
-	$.extend( div.style, {
-		minHeight: "100px",
-		height: "auto",
-		padding: 0,
-		borderWidth: 0
-	});
-
-	$.support.minHeight = div.offsetHeight === 100;
-	$.support.selectstart = "onselectstart" in div;
-
-	// set display to none to avoid a layout bug in IE
-	// http://dev.jquery.com/ticket/4014
-	body.removeChild( div ).style.display = "none";
-});
-
-// support: jQuery <1.8
-if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
-	$.each( [ "Width", "Height" ], function( i, name ) {
-		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
-			type = name.toLowerCase(),
-			orig = {
-				innerWidth: $.fn.innerWidth,
-				innerHeight: $.fn.innerHeight,
-				outerWidth: $.fn.outerWidth,
-				outerHeight: $.fn.outerHeight
-			};
-
-		function reduce( elem, size, border, margin ) {
-			$.each( side, function() {
-				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
-				if ( border ) {
-					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
-				}
-				if ( margin ) {
-					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
-				}
-			});
-			return size;
-		}
-
-		$.fn[ "inner" + name ] = function( size ) {
-			if ( size === undefined ) {
-				return orig[ "inner" + name ].call( this );
-			}
-
-			return this.each(function() {
-				$( this ).css( type, reduce( this, size ) + "px" );
-			});
-		};
-
-		$.fn[ "outer" + name] = function( size, margin ) {
-			if ( typeof size !== "number" ) {
-				return orig[ "outer" + name ].call( this, size );
-			}
-
-			return this.each(function() {
-				$( this).css( type, reduce( this, size, true, margin ) + "px" );
-			});
-		};
-	});
-}
-
-// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
-if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
-	$.fn.removeData = (function( removeData ) {
-		return function( key ) {
-			if ( arguments.length ) {
-				return removeData.call( this, $.camelCase( key ) );
-			} else {
-				return removeData.call( this );
-			}
-		};
-	})( $.fn.removeData );
-}
-
-
-
-
-
-// deprecated
-
-(function() {
-	var uaMatch = /msie ([\w.]+)/.exec( navigator.userAgent.toLowerCase() ) || [];
-	$.ui.ie = uaMatch.length ? true : false;
-	$.ui.ie6 = parseFloat( uaMatch[ 1 ], 10 ) === 6;
-})();
-
-$.fn.extend({
-	disableSelection: function() {
-		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
-			".ui-disableSelection", function( event ) {
-				event.preventDefault();
-			});
-	},
-
-	enableSelection: function() {
-		return this.unbind( ".ui-disableSelection" );
-	}
-});
-
-$.extend( $.ui, {
-	// $.ui.plugin is deprecated.  Use the proxy pattern instead.
-	plugin: {
-		add: function( module, option, set ) {
-			var i,
-				proto = $.ui[ module ].prototype;
-			for ( i in set ) {
-				proto.plugins[ i ] = proto.plugins[ i ] || [];
-				proto.plugins[ i ].push( [ option, set[ i ] ] );
-			}
-		},
-		call: function( instance, name, args ) {
-			var i,
-				set = instance.plugins[ name ];
-			if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {
-				return;
-			}
-
-			for ( i = 0; i < set.length; i++ ) {
-				if ( instance.options[ set[ i ][ 0 ] ] ) {
-					set[ i ][ 1 ].apply( instance.element, args );
-				}
-			}
-		}
-	},
-
-	contains: $.contains,
-
-	// only used by resizable
-	hasScroll: function( el, a ) {
-
-		//If overflow is hidden, the element might have extra content, but the user wants to hide it
-		if ( $( el ).css( "overflow" ) === "hidden") {
-			return false;
-		}
-
-		var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
-			has = false;
-
-		if ( el[ scroll ] > 0 ) {
-			return true;
-		}
-
-		// TODO: determine which cases actually cause this to happen
-		// if the element doesn't have the scroll set, see if it's possible to
-		// set the scroll
-		el[ scroll ] = 1;
-		has = ( el[ scroll ] > 0 );
-		el[ scroll ] = 0;
-		return has;
-	},
-
-	// these are odd functions, fix the API or move into individual plugins
-	isOverAxis: function( x, reference, size ) {
-		//Determines when x coordinate is over "b" element axis
-		return ( x > reference ) && ( x < ( reference + size ) );
-	},
-	isOver: function( y, x, top, left, height, width ) {
-		//Determines when x, y coordinates is over "b" element
-		return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width );
-	}
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-var uuid = 0,
-	slice = Array.prototype.slice,
-	_cleanData = $.cleanData;
-$.cleanData = function( elems ) {
-	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-		try {
-			$( elem ).triggerHandler( "remove" );
-		// http://bugs.jquery.com/ticket/8235
-		} catch( e ) {}
-	}
-	_cleanData( elems );
-};
-
-$.widget = function( name, base, prototype ) {
-	var fullName, existingConstructor, constructor, basePrototype,
-		namespace = name.split( "." )[ 0 ];
-
-	name = name.split( "." )[ 1 ];
-	fullName = namespace + "-" + name;
-
-	if ( !prototype ) {
-		prototype = base;
-		base = $.Widget;
-	}
-
-	// create selector for plugin
-	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
-		return !!$.data( elem, fullName );
-	};
-
-	$[ namespace ] = $[ namespace ] || {};
-	existingConstructor = $[ namespace ][ name ];
-	constructor = $[ namespace ][ name ] = function( options, element ) {
-		// allow instantiation without "new" keyword
-		if ( !this._createWidget ) {
-			return new constructor( options, element );
-		}
-
-		// allow instantiation without initializing for simple inheritance
-		// must use "new" keyword (the code above always passes args)
-		if ( arguments.length ) {
-			this._createWidget( options, element );
-		}
-	};
-	// extend with the existing constructor to carry over any static properties
-	$.extend( constructor, existingConstructor, {
-		version: prototype.version,
-		// copy the object used to create the prototype in case we need to
-		// redefine the widget later
-		_proto: $.extend( {}, prototype ),
-		// track widgets that inherit from this widget in case this widget is
-		// redefined after a widget inherits from it
-		_childConstructors: []
-	});
-
-	basePrototype = new base();
-	// we need to make the options hash a property directly on the new instance
-	// otherwise we'll modify the options hash on the prototype that we're
-	// inheriting from
-	basePrototype.options = $.widget.extend( {}, basePrototype.options );
-	$.each( prototype, function( prop, value ) {
-		if ( $.isFunction( value ) ) {
-			prototype[ prop ] = (function() {
-				var _super = function() {
-						return base.prototype[ prop ].apply( this, arguments );
-					},
-					_superApply = function( args ) {
-						return base.prototype[ prop ].apply( this, args );
-					};
-				return function() {
-					var __super = this._super,
-						__superApply = this._superApply,
-						returnValue;
-
-					this._super = _super;
-					this._superApply = _superApply;
-
-					returnValue = value.apply( this, arguments );
-
-					this._super = __super;
-					this._superApply = __superApply;
-
-					return returnValue;
-				};
-			})();
-		}
-	});
-	constructor.prototype = $.widget.extend( basePrototype, {
-		// TODO: remove support for widgetEventPrefix
-		// always use the name + a colon as the prefix, e.g., draggable:start
-		// don't prefix for widgets that aren't DOM-based
-		widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
-	}, prototype, {
-		constructor: constructor,
-		namespace: namespace,
-		widgetName: name,
-		// TODO remove widgetBaseClass, see #8155
-		widgetBaseClass: fullName,
-		widgetFullName: fullName
-	});
-
-	// If this widget is being redefined then we need to find all widgets that
-	// are inheriting from it and redefine all of them so that they inherit from
-	// the new version of this widget. We're essentially trying to replace one
-	// level in the prototype chain.
-	if ( existingConstructor ) {
-		$.each( existingConstructor._childConstructors, function( i, child ) {
-			var childPrototype = child.prototype;
-
-			// redefine the child widget using the same prototype that was
-			// originally used, but inherit from the new version of the base
-			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
-		});
-		// remove the list of existing child constructors from the old constructor
-		// so the old child constructors can be garbage collected
-		delete existingConstructor._childConstructors;
-	} else {
-		base._childConstructors.push( constructor );
-	}
-
-	$.widget.bridge( name, constructor );
-};
-
-$.widget.extend = function( target ) {
-	var input = slice.call( arguments, 1 ),
-		inputIndex = 0,
-		inputLength = input.length,
-		key,
-		value;
-	for ( ; inputIndex < inputLength; inputIndex++ ) {
-		for ( key in input[ inputIndex ] ) {
-			value = input[ inputIndex ][ key ];
-			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
-				// Clone objects
-				if ( $.isPlainObject( value ) ) {
-					target[ key ] = $.isPlainObject( target[ key ] ) ?
-						$.widget.extend( {}, target[ key ], value ) :
-						// Don't extend strings, arrays, etc. with objects
-						$.widget.extend( {}, value );
-				// Copy everything else by reference
-				} else {
-					target[ key ] = value;
-				}
-			}
-		}
-	}
-	return target;
-};
-
-$.widget.bridge = function( name, object ) {
-	var fullName = object.prototype.widgetFullName || name;
-	$.fn[ name ] = function( options ) {
-		var isMethodCall = typeof options === "string",
-			args = slice.call( arguments, 1 ),
-			returnValue = this;
-
-		// allow multiple hashes to be passed on init
-		options = !isMethodCall && args.length ?
-			$.widget.extend.apply( null, [ options ].concat(args) ) :
-			options;
-
-		if ( isMethodCall ) {
-			this.each(function() {
-				var methodValue,
-					instance = $.data( this, fullName );
-				if ( !instance ) {
-					return $.error( "cannot call methods on " + name + " prior to initialization; " +
-						"attempted to call method '" + options + "'" );
-				}
-				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
-					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
-				}
-				methodValue = instance[ options ].apply( instance, args );
-				if ( methodValue !== instance && methodValue !== undefined ) {
-					returnValue = methodValue && methodValue.jquery ?
-						returnValue.pushStack( methodValue.get() ) :
-						methodValue;
-					return false;
-				}
-			});
-		} else {
-			this.each(function() {
-				var instance = $.data( this, fullName );
-				if ( instance ) {
-					instance.option( options || {} )._init();
-				} else {
-					$.data( this, fullName, new object( options, this ) );
-				}
-			});
-		}
-
-		return returnValue;
-	};
-};
-
-$.Widget = function( /* options, element */ ) {};
-$.Widget._childConstructors = [];
-
-$.Widget.prototype = {
-	widgetName: "widget",
-	widgetEventPrefix: "",
-	defaultElement: "<div>",
-	options: {
-		disabled: false,
-
-		// callbacks
-		create: null
-	},
-	_createWidget: function( options, element ) {
-		element = $( element || this.defaultElement || this )[ 0 ];
-		this.element = $( element );
-		this.uuid = uuid++;
-		this.eventNamespace = "." + this.widgetName + this.uuid;
-		this.options = $.widget.extend( {},
-			this.options,
-			this._getCreateOptions(),
-			options );
-
-		this.bindings = $();
-		this.hoverable = $();
-		this.focusable = $();
-
-		if ( element !== this ) {
-			// 1.9 BC for #7810
-			// TODO remove dual storage
-			$.data( element, this.widgetName, this );
-			$.data( element, this.widgetFullName, this );
-			this._on( true, this.element, {
-				remove: function( event ) {
-					if ( event.target === element ) {
-						this.destroy();
-					}
-				}
-			});
-			this.document = $( element.style ?
-				// element within the document
-				element.ownerDocument :
-				// element is window or document
-				element.document || element );
-			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
-		}
-
-		this._create();
-		this._trigger( "create", null, this._getCreateEventData() );
-		this._init();
-	},
-	_getCreateOptions: $.noop,
-	_getCreateEventData: $.noop,
-	_create: $.noop,
-	_init: $.noop,
-
-	destroy: function() {
-		this._destroy();
-		// we can probably remove the unbind calls in 2.0
-		// all event bindings should go through this._on()
-		this.element
-			.unbind( this.eventNamespace )
-			// 1.9 BC for #7810
-			// TODO remove dual storage
-			.removeData( this.widgetName )
-			.removeData( this.widgetFullName )
-			// support: jquery <1.6.3
-			// http://bugs.jquery.com/ticket/9413
-			.removeData( $.camelCase( this.widgetFullName ) );
-		this.widget()
-			.unbind( this.eventNamespace )
-			.removeAttr( "aria-disabled" )
-			.removeClass(
-				this.widgetFullName + "-disabled " +
-				"ui-state-disabled" );
-
-		// clean up events and states
-		this.bindings.unbind( this.eventNamespace );
-		this.hoverable.removeClass( "ui-state-hover" );
-		this.focusable.removeClass( "ui-state-focus" );
-	},
-	_destroy: $.noop,
-
-	widget: function() {
-		return this.element;
-	},
-
-	option: function( key, value ) {
-		var options = key,
-			parts,
-			curOption,
-			i;
-
-		if ( arguments.length === 0 ) {
-			// don't return a reference to the internal hash
-			return $.widget.extend( {}, this.options );
-		}
-
-		if ( typeof key === "string" ) {
-			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
-			options = {};
-			parts = key.split( "." );
-			key = parts.shift();
-			if ( parts.length ) {
-				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
-				for ( i = 0; i < parts.length - 1; i++ ) {
-					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
-					curOption = curOption[ parts[ i ] ];
-				}
-				key = parts.pop();
-				if ( value === undefined ) {
-					return curOption[ key ] === undefined ? null : curOption[ key ];
-				}
-				curOption[ key ] = value;
-			} else {
-				if ( value === undefined ) {
-					return this.options[ key ] === undefined ? null : this.options[ key ];
-				}
-				options[ key ] = value;
-			}
-		}
-
-		this._setOptions( options );
-
-		return this;
-	},
-	_setOptions: function( options ) {
-		var key;
-
-		for ( key in options ) {
-			this._setOption( key, options[ key ] );
-		}
-
-		return this;
-	},
-	_setOption: function( key, value ) {
-		this.options[ key ] = value;
-
-		if ( key === "disabled" ) {
-			this.widget()
-				.toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
-				.attr( "aria-disabled", value );
-			this.hoverable.removeClass( "ui-state-hover" );
-			this.focusable.removeClass( "ui-state-focus" );
-		}
-
-		return this;
-	},
-
-	enable: function() {
-		return this._setOption( "disabled", false );
-	},
-	disable: function() {
-		return this._setOption( "disabled", true );
-	},
-
-	_on: function( suppressDisabledCheck, element, handlers ) {
-		var delegateElement,
-			instance = this;
-
-		// no suppressDisabledCheck flag, shuffle arguments
-		if ( typeof suppressDisabledCheck !== "boolean" ) {
-			handlers = element;
-			element = suppressDisabledCheck;
-			suppressDisabledCheck = false;
-		}
-
-		// no element argument, shuffle and use this.element
-		if ( !handlers ) {
-			handlers = element;
-			element = this.element;
-			delegateElement = this.widget();
-		} else {
-			// accept selectors, DOM elements
-			element = delegateElement = $( element );
-			this.bindings = this.bindings.add( element );
-		}
-
-		$.each( handlers, function( event, handler ) {
-			function handlerProxy() {
-				// allow widgets to customize the disabled handling
-				// - disabled as an array instead of boolean
-				// - disabled class as method for disabling individual parts
-				if ( !suppressDisabledCheck &&
-						( instance.options.disabled === true ||
-							$( this ).hasClass( "ui-state-disabled" ) ) ) {
-					return;
-				}
-				return ( typeof handler === "string" ? instance[ handler ] : handler )
-					.apply( instance, arguments );
-			}
-
-			// copy the guid so direct unbinding works
-			if ( typeof handler !== "string" ) {
-				handlerProxy.guid = handler.guid =
-					handler.guid || handlerProxy.guid || $.guid++;
-			}
-
-			var match = event.match( /^(\w+)\s*(.*)$/ ),
-				eventName = match[1] + instance.eventNamespace,
-				selector = match[2];
-			if ( selector ) {
-				delegateElement.delegate( selector, eventName, handlerProxy );
-			} else {
-				element.bind( eventName, handlerProxy );
-			}
-		});
-	},
-
-	_off: function( element, eventName ) {
-		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
-		element.unbind( eventName ).undelegate( eventName );
-	},
-
-	_delay: function( handler, delay ) {
-		function handlerProxy() {
-			return ( typeof handler === "string" ? instance[ handler ] : handler )
-				.apply( instance, arguments );
-		}
-		var instance = this;
-		return setTimeout( handlerProxy, delay || 0 );
-	},
-
-	_hoverable: function( element ) {
-		this.hoverable = this.hoverable.add( element );
-		this._on( element, {
-			mouseenter: function( event ) {
-				$( event.currentTarget ).addClass( "ui-state-hover" );
-			},
-			mouseleave: function( event ) {
-				$( event.currentTarget ).removeClass( "ui-state-hover" );
-			}
-		});
-	},
-
-	_focusable: function( element ) {
-		this.focusable = this.focusable.add( element );
-		this._on( element, {
-			focusin: function( event ) {
-				$( event.currentTarget ).addClass( "ui-state-focus" );
-			},
-			focusout: function( event ) {
-				$( event.currentTarget ).removeClass( "ui-state-focus" );
-			}
-		});
-	},
-
-	_trigger: function( type, event, data ) {
-		var prop, orig,
-			callback = this.options[ type ];
-
-		data = data || {};
-		event = $.Event( event );
-		event.type = ( type === this.widgetEventPrefix ?
-			type :
-			this.widgetEventPrefix + type ).toLowerCase();
-		// the original event may come from any element
-		// so we need to reset the target on the new event
-		event.target = this.element[ 0 ];
-
-		// copy original event properties over to the new event
-		orig = event.originalEvent;
-		if ( orig ) {
-			for ( prop in orig ) {
-				if ( !( prop in event ) ) {
-					event[ prop ] = orig[ prop ];
-				}
-			}
-		}
-
-		this.element.trigger( event, data );
-		return !( $.isFunction( callback ) &&
-			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
-			event.isDefaultPrevented() );
-	}
-};
-
-$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
-	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
-		if ( typeof options === "string" ) {
-			options = { effect: options };
-		}
-		var hasOptions,
-			effectName = !options ?
-				method :
-				options === true || typeof options === "number" ?
-					defaultEffect :
-					options.effect || defaultEffect;
-		options = options || {};
-		if ( typeof options === "number" ) {
-			options = { duration: options };
-		}
-		hasOptions = !$.isEmptyObject( options );
-		options.complete = callback;
-		if ( options.delay ) {
-			element.delay( options.delay );
-		}
-		if ( hasOptions && $.effects && ( $.effects.effect[ effectName ] || $.uiBackCompat !== false && $.effects[ effectName ] ) ) {
-			element[ method ]( options );
-		} else if ( effectName !== method && element[ effectName ] ) {
-			element[ effectName ]( options.duration, options.easing, callback );
-		} else {
-			element.queue(function( next ) {
-				$( this )[ method ]();
-				if ( callback ) {
-					callback.call( element[ 0 ] );
-				}
-				next();
-			});
-		}
-	};
-});
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
-	$.Widget.prototype._getCreateOptions = function() {
-		return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ];
-	};
-}
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-var mouseHandled = false;
-$( document ).mouseup( function( e ) {
-	mouseHandled = false;
-});
-
-$.widget("ui.mouse", {
-	version: "1.9.2",
-	options: {
-		cancel: 'input,textarea,button,select,option',
-		distance: 1,
-		delay: 0
-	},
-	_mouseInit: function() {
-		var that = this;
-
-		this.element
-			.bind('mousedown.'+this.widgetName, function(event) {
-				return that._mouseDown(event);
-			})
-			.bind('click.'+this.widgetName, function(event) {
-				if (true === $.data(event.target, that.widgetName + '.preventClickEvent')) {
-					$.removeData(event.target, that.widgetName + '.preventClickEvent');
-					event.stopImmediatePropagation();
-					return false;
-				}
-			});
-
-		this.started = false;
-	},
-
-	// TODO: make sure destroying one instance of mouse doesn't mess with
-	// other instances of mouse
-	_mouseDestroy: function() {
-		this.element.unbind('.'+this.widgetName);
-		if ( this._mouseMoveDelegate ) {
-			$(document)
-				.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
-				.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-		}
-	},
-
-	_mouseDown: function(event) {
-		// don't let more than one widget handle mouseStart
-		if( mouseHandled ) { return; }
-
-		// we may have missed mouseup (out of window)
-		(this._mouseStarted && this._mouseUp(event));
-
-		this._mouseDownEvent = event;
-
-		var that = this,
-			btnIsLeft = (event.which === 1),
-			// event.target.nodeName works around a bug in IE 8 with
-			// disabled inputs (#7620)
-			elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
-		if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
-			return true;
-		}
-
-		this.mouseDelayMet = !this.options.delay;
-		if (!this.mouseDelayMet) {
-			this._mouseDelayTimer = setTimeout(function() {
-				that.mouseDelayMet = true;
-			}, this.options.delay);
-		}
-
-		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
-			this._mouseStarted = (this._mouseStart(event) !== false);
-			if (!this._mouseStarted) {
-				event.preventDefault();
-				return true;
-			}
-		}
-
-		// Click event may never have fired (Gecko & Opera)
-		if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) {
-			$.removeData(event.target, this.widgetName + '.preventClickEvent');
-		}
-
-		// these delegates are required to keep context
-		this._mouseMoveDelegate = function(event) {
-			return that._mouseMove(event);
-		};
-		this._mouseUpDelegate = function(event) {
-			return that._mouseUp(event);
-		};
-		$(document)
-			.bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
-			.bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-
-		event.preventDefault();
-
-		mouseHandled = true;
-		return true;
-	},
-
-	_mouseMove: function(event) {
-		// IE mouseup check - mouseup happened when mouse was out of window
-		if ($.ui.ie && !(document.documentMode >= 9) && !event.button) {
-			return this._mouseUp(event);
-		}
-
-		if (this._mouseStarted) {
-			this._mouseDrag(event);
-			return event.preventDefault();
-		}
-
-		if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
-			this._mouseStarted =
-				(this._mouseStart(this._mouseDownEvent, event) !== false);
-			(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
-		}
-
-		return !this._mouseStarted;
-	},
-
-	_mouseUp: function(event) {
-		$(document)
-			.unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
-			.unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
-
-		if (this._mouseStarted) {
-			this._mouseStarted = false;
-
-			if (event.target === this._mouseDownEvent.target) {
-				$.data(event.target, this.widgetName + '.preventClickEvent', true);
-			}
-
-			this._mouseStop(event);
-		}
-
-		return false;
-	},
-
-	_mouseDistanceMet: function(event) {
-		return (Math.max(
-				Math.abs(this._mouseDownEvent.pageX - event.pageX),
-				Math.abs(this._mouseDownEvent.pageY - event.pageY)
-			) >= this.options.distance
-		);
-	},
-
-	_mouseDelayMet: function(event) {
-		return this.mouseDelayMet;
-	},
-
-	// These are placeholder methods, to be overriden by extending plugin
-	_mouseStart: function(event) {},
-	_mouseDrag: function(event) {},
-	_mouseStop: function(event) {},
-	_mouseCapture: function(event) { return true; }
-});
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.widget("ui.draggable", $.ui.mouse, {
-	version: "1.9.2",
-	widgetEventPrefix: "drag",
-	options: {
-		addClasses: true,
-		appendTo: "parent",
-		axis: false,
-		connectToSortable: false,
-		containment: false,
-		cursor: "auto",
-		cursorAt: false,
-		grid: false,
-		handle: false,
-		helper: "original",
-		iframeFix: false,
-		opacity: false,
-		refreshPositions: false,
-		revert: false,
-		revertDuration: 500,
-		scope: "default",
-		scroll: true,
-		scrollSensitivity: 20,
-		scrollSpeed: 20,
-		snap: false,
-		snapMode: "both",
-		snapTolerance: 20,
-		stack: false,
-		zIndex: false
-	},
-	_create: function() {
-
-		if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
-			this.element[0].style.position = 'relative';
-
-		(this.options.addClasses && this.element.addClass("ui-draggable"));
-		(this.options.disabled && this.element.addClass("ui-draggable-disabled"));
-
-		this._mouseInit();
-
-	},
-
-	_destroy: function() {
-		this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" );
-		this._mouseDestroy();
-	},
-
-	_mouseCapture: function(event) {
-
-		var o = this.options;
-
-		// among others, prevent a drag on a resizable-handle
-		if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
-			return false;
-
-		//Quit if we're not on a valid handle
-		this.handle = this._getHandle(event);
-		if (!this.handle)
-			return false;
-
-		$(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
-			$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>')
-			.css({
-				width: this.offsetWidth+"px", height: this.offsetHeight+"px",
-				position: "absolute", opacity: "0.001", zIndex: 1000
-			})
-			.css($(this).offset())
-			.appendTo("body");
-		});
-
-		return true;
-
-	},
-
-	_mouseStart: function(event) {
-
-		var o = this.options;
-
-		//Create and append the visible helper
-		this.helper = this._createHelper(event);
-
-		this.helper.addClass("ui-draggable-dragging");
-
-		//Cache the helper size
-		this._cacheHelperProportions();
-
-		//If ddmanager is used for droppables, set the global draggable
-		if($.ui.ddmanager)
-			$.ui.ddmanager.current = this;
-
-		/*
-		 * - Position generation -
-		 * This block generates everything position related - it's the core of draggables.
-		 */
-
-		//Cache the margins of the original element
-		this._cacheMargins();
-
-		//Store the helper's css position
-		this.cssPosition = this.helper.css("position");
-		this.scrollParent = this.helper.scrollParent();
-
-		//The element's absolute position on the page minus margins
-		this.offset = this.positionAbs = this.element.offset();
-		this.offset = {
-			top: this.offset.top - this.margins.top,
-			left: this.offset.left - this.margins.left
-		};
-
-		$.extend(this.offset, {
-			click: { //Where the click happened, relative to the element
-				left: event.pageX - this.offset.left,
-				top: event.pageY - this.offset.top
-			},
-			parent: this._getParentOffset(),
-			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
-		});
-
-		//Generate the original position
-		this.originalPosition = this.position = this._generatePosition(event);
-		this.originalPageX = event.pageX;
-		this.originalPageY = event.pageY;
-
-		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
-		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
-
-		//Set a containment if given in the options
-		if(o.containment)
-			this._setContainment();
-
-		//Trigger event + callbacks
-		if(this._trigger("start", event) === false) {
-			this._clear();
-			return false;
-		}
-
-		//Recache the helper size
-		this._cacheHelperProportions();
-
-		//Prepare the droppable offsets
-		if ($.ui.ddmanager && !o.dropBehaviour)
-			$.ui.ddmanager.prepareOffsets(this, event);
-
-
-		this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-
-		//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)
-		if ( $.ui.ddmanager ) $.ui.ddmanager.dragStart(this, event);
-
-		return true;
-	},
-
-	_mouseDrag: function(event, noPropagation) {
-
-		//Compute the helpers position
-		this.position = this._generatePosition(event);
-		this.positionAbs = this._convertPositionTo("absolute");
-
-		//Call plugins and callbacks and use the resulting position if something is returned
-		if (!noPropagation) {
-			var ui = this._uiHash();
-			if(this._trigger('drag', event, ui) === false) {
-				this._mouseUp({});
-				return false;
-			}
-			this.position = ui.position;
-		}
-
-		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
-		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
-		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
-
-		return false;
-	},
-
-	_mouseStop: function(event) {
-
-		//If we are using droppables, inform the manager about the drop
-		var dropped = false;
-		if ($.ui.ddmanager && !this.options.dropBehaviour)
-			dropped = $.ui.ddmanager.drop(this, event);
-
-		//if a drop comes from outside (a sortable)
-		if(this.dropped) {
-			dropped = this.dropped;
-			this.dropped = false;
-		}
-
-		//if the original element is no longer in the DOM don't bother to continue (see #8269)
-		var element = this.element[0], elementInDom = false;
-		while ( element && (element = element.parentNode) ) {
-			if (element == document ) {
-				elementInDom = true;
-			}
-		}
-		if ( !elementInDom && this.options.helper === "original" )
-			return false;
-
-		if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
-			var that = this;
-			$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
-				if(that._trigger("stop", event) !== false) {
-					that._clear();
-				}
-			});
-		} else {
-			if(this._trigger("stop", event) !== false) {
-				this._clear();
-			}
-		}
-
-		return false;
-	},
-
-	_mouseUp: function(event) {
-		//Remove frame helpers
-		$("div.ui-draggable-iframeFix").each(function() {
-			this.parentNode.removeChild(this);
-		});
-
-		//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)
-		if( $.ui.ddmanager ) $.ui.ddmanager.dragStop(this, event);
-
-		return $.ui.mouse.prototype._mouseUp.call(this, event);
-	},
-
-	cancel: function() {
-
-		if(this.helper.is(".ui-draggable-dragging")) {
-			this._mouseUp({});
-		} else {
-			this._clear();
-		}
-
-		return this;
-
-	},
-
-	_getHandle: function(event) {
-
-		var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
-		$(this.options.handle, this.element)
-			.find("*")
-			.andSelf()
-			.each(function() {
-				if(this == event.target) handle = true;
-			});
-
-		return handle;
-
-	},
-
-	_createHelper: function(event) {
-
-		var o = this.options;
-		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone().removeAttr('id') : this.element);
-
-		if(!helper.parents('body').length)
-			helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
-
-		if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
-			helper.css("position", "absolute");
-
-		return helper;
-
-	},
-
-	_adjustOffsetFromHelper: function(obj) {
-		if (typeof obj == 'string') {
-			obj = obj.split(' ');
-		}
-		if ($.isArray(obj)) {
-			obj = {left: +obj[0], top: +obj[1] || 0};
-		}
-		if ('left' in obj) {
-			this.offset.click.left = obj.left + this.margins.left;
-		}
-		if ('right' in obj) {
-			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-		}
-		if ('top' in obj) {
-			this.offset.click.top = obj.top + this.margins.top;
-		}
-		if ('bottom' in obj) {
-			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
-		}
-	},
-
-	_getParentOffset: function() {
-
-		//Get the offsetParent and cache its position
-		this.offsetParent = this.helper.offsetParent();
-		var po = this.offsetParent.offset();
-
-		// This is a special case where we need to modify a offset calculated on start, since the following happened:
-		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
-		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
-		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
-			po.left += this.scrollParent.scrollLeft();
-			po.top += this.scrollParent.scrollTop();
-		}
-
-		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
-		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
-			po = { top: 0, left: 0 };
-
-		return {
-			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
-			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
-		};
-
-	},
-
-	_getRelativeOffset: function() {
-
-		if(this.cssPosition == "relative") {
-			var p = this.element.position();
-			return {
-				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
-				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
-			};
-		} else {
-			return { top: 0, left: 0 };
-		}
-
-	},
-
-	_cacheMargins: function() {
-		this.margins = {
-			left: (parseInt(this.element.css("marginLeft"),10) || 0),
-			top: (parseInt(this.element.css("marginTop"),10) || 0),
-			right: (parseInt(this.element.css("marginRight"),10) || 0),
-			bottom: (parseInt(this.element.css("marginBottom"),10) || 0)
-		};
-	},
-
-	_cacheHelperProportions: function() {
-		this.helperProportions = {
-			width: this.helper.outerWidth(),
-			height: this.helper.outerHeight()
-		};
-	},
-
-	_setContainment: function() {
-
-		var o = this.options;
-		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
-		if(o.containment == 'document' || o.containment == 'window') this.containment = [
-			o.containment == 'document' ? 0 : $(window).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
-			o.containment == 'document' ? 0 : $(window).scrollTop() - this.offset.relative.top - this.offset.parent.top,
-			(o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
-			(o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
-		];
-
-		if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
-			var c = $(o.containment);
-			var ce = c[0]; if(!ce) return;
-			var co = c.offset();
-			var over = ($(ce).css("overflow") != 'hidden');
-
-			this.containment = [
-				(parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0),
-				(parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0),
-				(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right,
-				(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top  - this.margins.bottom
-			];
-			this.relative_container = c;
-
-		} else if(o.containment.constructor == Array) {
-			this.containment = o.containment;
-		}
-
-	},
-
-	_convertPositionTo: function(d, pos) {
-
-		if(!pos) pos = this.position;
-		var mod = d == "absolute" ? 1 : -1;
-		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
-		return {
-			top: (
-				pos.top																	// The absolute mouse position
-				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
-				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
-				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
-			),
-			left: (
-				pos.left																// The absolute mouse position
-				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
-				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
-				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
-			)
-		};
-
-	},
-
-	_generatePosition: function(event) {
-
-		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-		var pageX = event.pageX;
-		var pageY = event.pageY;
-
-		/*
-		 * - Position constraining -
-		 * Constrain the position to a mix of grid, containment.
-		 */
-
-		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-			var containment;
-			if(this.containment) {
-			if (this.relative_container){
-				var co = this.relative_container.offset();
-				containment = [ this.containment[0] + co.left,
-					this.containment[1] + co.top,
-					this.containment[2] + co.left,
-					this.containment[3] + co.top ];
-			}
-			else {
-				containment = this.containment;
-			}
-
-				if(event.pageX - this.offset.click.left < containment[0]) pageX = containment[0] + this.offset.click.left;
-				if(event.pageY - this.offset.click.top < containment[1]) pageY = containment[1] + this.offset.click.top;
-				if(event.pageX - this.offset.click.left > containment[2]) pageX = containment[2] + this.offset.click.left;
-				if(event.pageY - this.offset.click.top > containment[3]) pageY = containment[3] + this.offset.click.top;
-			}
-
-			if(o.grid) {
-				//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)
-				var top = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;
-				pageY = containment ? (!(top - this.offset.click.top < containment[1] || top - this.offset.click.top > containment[3]) ? top : (!(top - this.offset.click.top < containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
-				var left = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;
-				pageX = containment ? (!(left - this.offset.click.left < containment[0] || left - this.offset.click.left > containment[2]) ? left : (!(left - this.offset.click.left < containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
-			}
-
-		}
-
-		return {
-			top: (
-				pageY																// The absolute mouse position
-				- this.offset.click.top													// Click offset (relative to the element)
-				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
-				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
-				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
-			),
-			left: (
-				pageX																// The absolute mouse position
-				- this.offset.click.left												// Click offset (relative to the element)
-				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
-				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
-				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
-			)
-		};
-
-	},
-
-	_clear: function() {
-		this.helper.removeClass("ui-draggable-dragging");
-		if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
-		//if($.ui.ddmanager) $.ui.ddmanager.current = null;
-		this.helper = null;
-		this.cancelHelperRemoval = false;
-	},
-
-	// From now on bulk stuff - mainly helpers
-
-	_trigger: function(type, event, ui) {
-		ui = ui || this._uiHash();
-		$.ui.plugin.call(this, type, [event, ui]);
-		if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
-		return $.Widget.prototype._trigger.call(this, type, event, ui);
-	},
-
-	plugins: {},
-
-	_uiHash: function(event) {
-		return {
-			helper: this.helper,
-			position: this.position,
-			originalPosition: this.originalPosition,
-			offset: this.positionAbs
-		};
-	}
-
-});
-
-$.ui.plugin.add("draggable", "connectToSortable", {
-	start: function(event, ui) {
-
-		var inst = $(this).data("draggable"), o = inst.options,
-			uiSortable = $.extend({}, ui, { item: inst.element });
-		inst.sortables = [];
-		$(o.connectToSortable).each(function() {
-			var sortable = $.data(this, 'sortable');
-			if (sortable && !sortable.options.disabled) {
-				inst.sortables.push({
-					instance: sortable,
-					shouldRevert: sortable.options.revert
-				});
-				sortable.refreshPositions();	// Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page).
-				sortable._trigger("activate", event, uiSortable);
-			}
-		});
-
-	},
-	stop: function(event, ui) {
-
-		//If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
-		var inst = $(this).data("draggable"),
-			uiSortable = $.extend({}, ui, { item: inst.element });
-
-		$.each(inst.sortables, function() {
-			if(this.instance.isOver) {
-
-				this.instance.isOver = 0;
-
-				inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
-				this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
-
-				//The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
-				if(this.shouldRevert) this.instance.options.revert = true;
-
-				//Trigger the stop of the sortable
-				this.instance._mouseStop(event);
-
-				this.instance.options.helper = this.instance.options._helper;
-
-				//If the helper has been the original item, restore properties in the sortable
-				if(inst.options.helper == 'original')
-					this.instance.currentItem.css({ top: 'auto', left: 'auto' });
-
-			} else {
-				this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
-				this.instance._trigger("deactivate", event, uiSortable);
-			}
-
-		});
-
-	},
-	drag: function(event, ui) {
-
-		var inst = $(this).data("draggable"), that = this;
-
-		var checkPos = function(o) {
-			var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
-			var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
-			var itemHeight = o.height, itemWidth = o.width;
-			var itemTop = o.top, itemLeft = o.left;
-
-			return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
-		};
-
-		$.each(inst.sortables, function(i) {
-
-			var innermostIntersecting = false;
-			var thisSortable = this;
-			//Copy over some variables to allow calling the sortable's native _intersectsWith
-			this.instance.positionAbs = inst.positionAbs;
-			this.instance.helperProportions = inst.helperProportions;
-			this.instance.offset.click = inst.offset.click;
-
-			if(this.instance._intersectsWith(this.instance.containerCache)) {
-				innermostIntersecting = true;
-				$.each(inst.sortables, function () {
-					this.instance.positionAbs = inst.positionAbs;
-					this.instance.helperProportions = inst.helperProportions;
-					this.instance.offset.click = inst.offset.click;
-					if  (this != thisSortable
-						&& this.instance._intersectsWith(this.instance.containerCache)
-						&& $.ui.contains(thisSortable.instance.element[0], this.instance.element[0]))
-						innermostIntersecting = false;
-						return innermostIntersecting;
-				});
-			}
-
-
-			if(innermostIntersecting) {
-				//If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
-				if(!this.instance.isOver) {
-
-					this.instance.isOver = 1;
-					//Now we fake the start of dragging for the sortable instance,
-					//by cloning the list group item, appending it to the sortable and using it as inst.currentItem
-					//We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
-					this.instance.currentItem = $(that).clone().removeAttr('id').appendTo(this.instance.element).data("sortable-item", true);
-					this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
-					this.instance.options.helper = function() { return ui.helper[0]; };
-
-					event.target = this.instance.currentItem[0];
-					this.instance._mouseCapture(event, true);
-					this.instance._mouseStart(event, true, true);
-
-					//Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
-					this.instance.offset.click.top = inst.offset.click.top;
-					this.instance.offset.click.left = inst.offset.click.left;
-					this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
-					this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
-
-					inst._trigger("toSortable", event);
-					inst.dropped = this.instance.element; //draggable revert needs that
-					//hack so receive/update callbacks work (mostly)
-					inst.currentItem = inst.element;
-					this.instance.fromOutside = inst;
-
-				}
-
-				//Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
-				if(this.instance.currentItem) this.instance._mouseDrag(event);
-
-			} else {
-
-				//If it doesn't intersect with the sortable, and it intersected before,
-				//we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
-				if(this.instance.isOver) {
-
-					this.instance.isOver = 0;
-					this.instance.cancelHelperRemoval = true;
-
-					//Prevent reverting on this forced stop
-					this.instance.options.revert = false;
-
-					// The out event needs to be triggered independently
-					this.instance._trigger('out', event, this.instance._uiHash(this.instance));
-
-					this.instance._mouseStop(event, true);
-					this.instance.options.helper = this.instance.options._helper;
-
-					//Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
-					this.instance.currentItem.remove();
-					if(this.instance.placeholder) this.instance.placeholder.remove();
-
-					inst._trigger("fromSortable", event);
-					inst.dropped = false; //draggable revert needs that
-				}
-
-			};
-
-		});
-
-	}
-});
-
-$.ui.plugin.add("draggable", "cursor", {
-	start: function(event, ui) {
-		var t = $('body'), o = $(this).data('draggable').options;
-		if (t.css("cursor")) o._cursor = t.css("cursor");
-		t.css("cursor", o.cursor);
-	},
-	stop: function(event, ui) {
-		var o = $(this).data('draggable').options;
-		if (o._cursor) $('body').css("cursor", o._cursor);
-	}
-});
-
-$.ui.plugin.add("draggable", "opacity", {
-	start: function(event, ui) {
-		var t = $(ui.helper), o = $(this).data('draggable').options;
-		if(t.css("opacity")) o._opacity = t.css("opacity");
-		t.css('opacity', o.opacity);
-	},
-	stop: function(event, ui) {
-		var o = $(this).data('draggable').options;
-		if(o._opacity) $(ui.helper).css('opacity', o._opacity);
-	}
-});
-
-$.ui.plugin.add("draggable", "scroll", {
-	start: function(event, ui) {
-		var i = $(this).data("draggable");
-		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
-	},
-	drag: function(event, ui) {
-
-		var i = $(this).data("draggable"), o = i.options, scrolled = false;
-
-		if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
-
-			if(!o.axis || o.axis != 'x') {
-				if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
-					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
-				else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
-					i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
-			}
-
-			if(!o.axis || o.axis != 'y') {
-				if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
-					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
-				else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
-					i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
-			}
-
-		} else {
-
-			if(!o.axis || o.axis != 'x') {
-				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
-					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
-				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
-					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
-			}
-
-			if(!o.axis || o.axis != 'y') {
-				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
-					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
-				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
-					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
-			}
-
-		}
-
-		if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
-			$.ui.ddmanager.prepareOffsets(i, event);
-
-	}
-});
-
-$.ui.plugin.add("draggable", "snap", {
-	start: function(event, ui) {
-
-		var i = $(this).data("draggable"), o = i.options;
-		i.snapElements = [];
-
-		$(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
-			var $t = $(this); var $o = $t.offset();
-			if(this != i.element[0]) i.snapElements.push({
-				item: this,
-				width: $t.outerWidth(), height: $t.outerHeight(),
-				top: $o.top, left: $o.left
-			});
-		});
-
-	},
-	drag: function(event, ui) {
-
-		var inst = $(this).data("draggable"), o = inst.options;
-		var d = o.snapTolerance;
-
-		var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
-			y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
-
-		for (var i = inst.snapElements.length - 1; i >= 0; i--){
-
-			var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
-				t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
-
-			//Yes, I know, this is insane ;)
-			if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
-				if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
-				inst.snapElements[i].snapping = false;
-				continue;
-			}
-
-			if(o.snapMode != 'inner') {
-				var ts = Math.abs(t - y2) <= d;
-				var bs = Math.abs(b - y1) <= d;
-				var ls = Math.abs(l - x2) <= d;
-				var rs = Math.abs(r - x1) <= d;
-				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
-				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
-				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
-				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
-			}
-
-			var first = (ts || bs || ls || rs);
-
-			if(o.snapMode != 'outer') {
-				var ts = Math.abs(t - y1) <= d;
-				var bs = Math.abs(b - y2) <= d;
-				var ls = Math.abs(l - x1) <= d;
-				var rs = Math.abs(r - x2) <= d;
-				if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
-				if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
-				if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
-				if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
-			}
-
-			if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
-				(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
-			inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
-
-		};
-
-	}
-});
-
-$.ui.plugin.add("draggable", "stack", {
-	start: function(event, ui) {
-
-		var o = $(this).data("draggable").options;
-
-		var group = $.makeArray($(o.stack)).sort(function(a,b) {
-			return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0);
-		});
-		if (!group.length) { return; }
-
-		var min = parseInt(group[0].style.zIndex) || 0;
-		$(group).each(function(i) {
-			this.style.zIndex = min + i;
-		});
-
-		this[0].style.zIndex = min + group.length;
-
-	}
-});
-
-$.ui.plugin.add("draggable", "zIndex", {
-	start: function(event, ui) {
-		var t = $(ui.helper), o = $(this).data("draggable").options;
-		if(t.css("zIndex")) o._zIndex = t.css("zIndex");
-		t.css('zIndex', o.zIndex);
-	},
-	stop: function(event, ui) {
-		var o = $(this).data("draggable").options;
-		if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
-	}
-});
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.widget("ui.droppable", {
-	version: "1.9.2",
-	widgetEventPrefix: "drop",
-	options: {
-		accept: '*',
-		activeClass: false,
-		addClasses: true,
-		greedy: false,
-		hoverClass: false,
-		scope: 'default',
-		tolerance: 'intersect'
-	},
-	_create: function() {
-
-		var o = this.options, accept = o.accept;
-		this.isover = 0; this.isout = 1;
-
-		this.accept = $.isFunction(accept) ? accept : function(d) {
-			return d.is(accept);
-		};
-
-		//Store the droppable's proportions
-		this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight };
-
-		// Add the reference and positions to the manager
-		$.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || [];
-		$.ui.ddmanager.droppables[o.scope].push(this);
-
-		(o.addClasses && this.element.addClass("ui-droppable"));
-
-	},
-
-	_destroy: function() {
-		var drop = $.ui.ddmanager.droppables[this.options.scope];
-		for ( var i = 0; i < drop.length; i++ )
-			if ( drop[i] == this )
-				drop.splice(i, 1);
-
-		this.element.removeClass("ui-droppable ui-droppable-disabled");
-	},
-
-	_setOption: function(key, value) {
-
-		if(key == 'accept') {
-			this.accept = $.isFunction(value) ? value : function(d) {
-				return d.is(value);
-			};
-		}
-		$.Widget.prototype._setOption.apply(this, arguments);
-	},
-
-	_activate: function(event) {
-		var draggable = $.ui.ddmanager.current;
-		if(this.options.activeClass) this.element.addClass(this.options.activeClass);
-		(draggable && this._trigger('activate', event, this.ui(draggable)));
-	},
-
-	_deactivate: function(event) {
-		var draggable = $.ui.ddmanager.current;
-		if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
-		(draggable && this._trigger('deactivate', event, this.ui(draggable)));
-	},
-
-	_over: function(event) {
-
-		var draggable = $.ui.ddmanager.current;
-		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
-
-		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-			if(this.options.hoverClass) this.element.addClass(this.options.hoverClass);
-			this._trigger('over', event, this.ui(draggable));
-		}
-
-	},
-
-	_out: function(event) {
-
-		var draggable = $.ui.ddmanager.current;
-		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element
-
-		if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
-			this._trigger('out', event, this.ui(draggable));
-		}
-
-	},
-
-	_drop: function(event,custom) {
-
-		var draggable = custom || $.ui.ddmanager.current;
-		if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element
-
-		var childrenIntersection = false;
-		this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() {
-			var inst = $.data(this, 'droppable');
-			if(
-				inst.options.greedy
-				&& !inst.options.disabled
-				&& inst.options.scope == draggable.options.scope
-				&& inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element))
-				&& $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance)
-			) { childrenIntersection = true; return false; }
-		});
-		if(childrenIntersection) return false;
-
-		if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-			if(this.options.activeClass) this.element.removeClass(this.options.activeClass);
-			if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass);
-			this._trigger('drop', event, this.ui(draggable));
-			return this.element;
-		}
-
-		return false;
-
-	},
-
-	ui: function(c) {
-		return {
-			draggable: (c.currentItem || c.element),
-			helper: c.helper,
-			position: c.position,
-			offset: c.positionAbs
-		};
-	}
-
-});
-
-$.ui.intersect = function(draggable, droppable, toleranceMode) {
-
-	if (!droppable.offset) return false;
-
-	var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width,
-		y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height;
-	var l = droppable.offset.left, r = l + droppable.proportions.width,
-		t = droppable.offset.top, b = t + droppable.proportions.height;
-
-	switch (toleranceMode) {
-		case 'fit':
-			return (l <= x1 && x2 <= r
-				&& t <= y1 && y2 <= b);
-			break;
-		case 'intersect':
-			return (l < x1 + (draggable.helperProportions.width / 2) // Right Half
-				&& x2 - (draggable.helperProportions.width / 2) < r // Left Half
-				&& t < y1 + (draggable.helperProportions.height / 2) // Bottom Half
-				&& y2 - (draggable.helperProportions.height / 2) < b ); // Top Half
-			break;
-		case 'pointer':
-			var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left),
-				draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top),
-				isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width);
-			return isOver;
-			break;
-		case 'touch':
-			return (
-					(y1 >= t && y1 <= b) ||	// Top edge touching
-					(y2 >= t && y2 <= b) ||	// Bottom edge touching
-					(y1 < t && y2 > b)		// Surrounded vertically
-				) && (
-					(x1 >= l && x1 <= r) ||	// Left edge touching
-					(x2 >= l && x2 <= r) ||	// Right edge touching
-					(x1 < l && x2 > r)		// Surrounded horizontally
-				);
-			break;
-		default:
-			return false;
-			break;
-		}
-
-};
-
-/*
-	This manager tracks offsets of draggables and droppables
-*/
-$.ui.ddmanager = {
-	current: null,
-	droppables: { 'default': [] },
-	prepareOffsets: function(t, event) {
-
-		var m = $.ui.ddmanager.droppables[t.options.scope] || [];
-		var type = event ? event.type : null; // workaround for #2317
-		var list = (t.currentItem || t.element).find(":data(droppable)").andSelf();
-
-		droppablesLoop: for (var i = 0; i < m.length; i++) {
-
-			if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue;	//No disabled and non-accepted
-			for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item
-			m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; 									//If the element is not visible, continue
-
-			if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables
-
-			m[i].offset = m[i].element.offset();
-			m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight };
-
-		}
-
-	},
-	drop: function(draggable, event) {
-
-		var dropped = false;
-		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
-
-			if(!this.options) return;
-			if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance))
-				dropped = this._drop.call(this, event) || dropped;
-
-			if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) {
-				this.isout = 1; this.isover = 0;
-				this._deactivate.call(this, event);
-			}
-
-		});
-		return dropped;
-
-	},
-	dragStart: function( draggable, event ) {
-		//Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)
-		draggable.element.parentsUntil( "body" ).bind( "scroll.droppable", function() {
-			if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
-		});
-	},
-	drag: function(draggable, event) {
-
-		//If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.
-		if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event);
-
-		//Run through all droppables and check their positions based on specific tolerance options
-		$.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() {
-
-			if(this.options.disabled || this.greedyChild || !this.visible) return;
-			var intersects = $.ui.intersect(draggable, this, this.options.tolerance);
-
-			var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null);
-			if(!c) return;
-
-			var parentInstance;
-			if (this.options.greedy) {
-				// find droppable parents with same scope
-				var scope = this.options.scope;
-				var parent = this.element.parents(':data(droppable)').filter(function () {
-					return $.data(this, 'droppable').options.scope === scope;
-				});
-
-				if (parent.length) {
-					parentInstance = $.data(parent[0], 'droppable');
-					parentInstance.greedyChild = (c == 'isover' ? 1 : 0);
-				}
-			}
-
-			// we just moved into a greedy child
-			if (parentInstance && c == 'isover') {
-				parentInstance['isover'] = 0;
-				parentInstance['isout'] = 1;
-				parentInstance._out.call(parentInstance, event);
-			}
-
-			this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0;
-			this[c == "isover" ? "_over" : "_out"].call(this, event);
-
-			// we just moved out of a greedy child
-			if (parentInstance && c == 'isout') {
-				parentInstance['isout'] = 0;
-				parentInstance['isover'] = 1;
-				parentInstance._over.call(parentInstance, event);
-			}
-		});
-
-	},
-	dragStop: function( draggable, event ) {
-		draggable.element.parentsUntil( "body" ).unbind( "scroll.droppable" );
-		//Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)
-		if( !draggable.options.refreshPositions ) $.ui.ddmanager.prepareOffsets( draggable, event );
-	}
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.widget("ui.resizable", $.ui.mouse, {
-	version: "1.9.2",
-	widgetEventPrefix: "resize",
-	options: {
-		alsoResize: false,
-		animate: false,
-		animateDuration: "slow",
-		animateEasing: "swing",
-		aspectRatio: false,
-		autoHide: false,
-		containment: false,
-		ghost: false,
-		grid: false,
-		handles: "e,s,se",
-		helper: false,
-		maxHeight: null,
-		maxWidth: null,
-		minHeight: 10,
-		minWidth: 10,
-		zIndex: 1000
-	},
-	_create: function() {
-
-		var that = this, o = this.options;
-		this.element.addClass("ui-resizable");
-
-		$.extend(this, {
-			_aspectRatio: !!(o.aspectRatio),
-			aspectRatio: o.aspectRatio,
-			originalElement: this.element,
-			_proportionallyResizeElements: [],
-			_helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
-		});
-
-		//Wrap the element if it cannot hold child nodes
-		if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
-
-			//Create a wrapper element and set the wrapper to the new current internal element
-			this.element.wrap(
-				$('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({
-					position: this.element.css('position'),
-					width: this.element.outerWidth(),
-					height: this.element.outerHeight(),
-					top: this.element.css('top'),
-					left: this.element.css('left')
-				})
-			);
-
-			//Overwrite the original this.element
-			this.element = this.element.parent().data(
-				"resizable", this.element.data('resizable')
-			);
-
-			this.elementIsWrapper = true;
-
-			//Move margins to the wrapper
-			this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
-			this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
-
-			//Prevent Safari textarea resize
-			this.originalResizeStyle = this.originalElement.css('resize');
-			this.originalElement.css('resize', 'none');
-
-			//Push the actual element to our proportionallyResize internal array
-			this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
-
-			// avoid IE jump (hard set the margin)
-			this.originalElement.css({ margin: this.originalElement.css('margin') });
-
-			// fix handlers offset
-			this._proportionallyResize();
-
-		}
-
-		this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
-		if(this.handles.constructor == String) {
-
-			if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
-			var n = this.handles.split(","); this.handles = {};
-
-			for(var i = 0; i < n.length; i++) {
-
-				var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
-				var axis = $('<div class="ui-resizable-handle ' + hname + '"></div>');
-
-				// Apply zIndex to all handles - see #7960
-				axis.css({ zIndex: o.zIndex });
-
-				//TODO : What's going on here?
-				if ('se' == handle) {
-					axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
-				};
-
-				//Insert into internal handles object and append to element
-				this.handles[handle] = '.ui-resizable-'+handle;
-				this.element.append(axis);
-			}
-
-		}
-
-		this._renderAxis = function(target) {
-
-			target = target || this.element;
-
-			for(var i in this.handles) {
-
-				if(this.handles[i].constructor == String)
-					this.handles[i] = $(this.handles[i], this.element).show();
-
-				//Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
-				if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
-
-					var axis = $(this.handles[i], this.element), padWrapper = 0;
-
-					//Checking the correct pad and border
-					padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
-
-					//The padding type i have to apply...
-					var padPos = [ 'padding',
-						/ne|nw|n/.test(i) ? 'Top' :
-						/se|sw|s/.test(i) ? 'Bottom' :
-						/^e$/.test(i) ? 'Right' : 'Left' ].join("");
-
-					target.css(padPos, padWrapper);
-
-					this._proportionallyResize();
-
-				}
-
-				//TODO: What's that good for? There's not anything to be executed left
-				if(!$(this.handles[i]).length)
-					continue;
-
-			}
-		};
-
-		//TODO: make renderAxis a prototype function
-		this._renderAxis(this.element);
-
-		this._handles = $('.ui-resizable-handle', this.element)
-			.disableSelection();
-
-		//Matching axis name
-		this._handles.mouseover(function() {
-			if (!that.resizing) {
-				if (this.className)
-					var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
-				//Axis, default = se
-				that.axis = axis && axis[1] ? axis[1] : 'se';
-			}
-		});
-
-		//If we want to auto hide the elements
-		if (o.autoHide) {
-			this._handles.hide();
-			$(this.element)
-				.addClass("ui-resizable-autohide")
-				.mouseenter(function() {
-					if (o.disabled) return;
-					$(this).removeClass("ui-resizable-autohide");
-					that._handles.show();
-				})
-				.mouseleave(function(){
-					if (o.disabled) return;
-					if (!that.resizing) {
-						$(this).addClass("ui-resizable-autohide");
-						that._handles.hide();
-					}
-				});
-		}
-
-		//Initialize the mouse interaction
-		this._mouseInit();
-
-	},
-
-	_destroy: function() {
-
-		this._mouseDestroy();
-
-		var _destroy = function(exp) {
-			$(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
-				.removeData("resizable").removeData("ui-resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
-		};
-
-		//TODO: Unwrap at same DOM position
-		if (this.elementIsWrapper) {
-			_destroy(this.element);
-			var wrapper = this.element;
-			this.originalElement.css({
-				position: wrapper.css('position'),
-				width: wrapper.outerWidth(),
-				height: wrapper.outerHeight(),
-				top: wrapper.css('top'),
-				left: wrapper.css('left')
-			}).insertAfter( wrapper );
-			wrapper.remove();
-		}
-
-		this.originalElement.css('resize', this.originalResizeStyle);
-		_destroy(this.originalElement);
-
-		return this;
-	},
-
-	_mouseCapture: function(event) {
-		var handle = false;
-		for (var i in this.handles) {
-			if ($(this.handles[i])[0] == event.target) {
-				handle = true;
-			}
-		}
-
-		return !this.options.disabled && handle;
-	},
-
-	_mouseStart: function(event) {
-
-		var o = this.options, iniPos = this.element.position(), el = this.element;
-
-		this.resizing = true;
-		this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
-
-		// bugfix for http://dev.jquery.com/ticket/1749
-		if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
-			el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
-		}
-
-		this._renderProxy();
-
-		var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
-
-		if (o.containment) {
-			curleft += $(o.containment).scrollLeft() || 0;
-			curtop += $(o.containment).scrollTop() || 0;
-		}
-
-		//Store needed variables
-		this.offset = this.helper.offset();
-		this.position = { left: curleft, top: curtop };
-		this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
-		this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
-		this.originalPosition = { left: curleft, top: curtop };
-		this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
-		this.originalMousePosition = { left: event.pageX, top: event.pageY };
-
-		//Aspect Ratio
-		this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
-
-		var cursor = $('.ui-resizable-' + this.axis).css('cursor');
-		$('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
-
-		el.addClass("ui-resizable-resizing");
-		this._propagate("start", event);
-		return true;
-	},
-
-	_mouseDrag: function(event) {
-
-		//Increase performance, avoid regex
-		var el = this.helper, o = this.options, props = {},
-			that = this, smp = this.originalMousePosition, a = this.axis;
-
-		var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
-		var trigger = this._change[a];
-		if (!trigger) return false;
-
-		// Calculate the attrs that will be change
-		var data = trigger.apply(this, [event, dx, dy]);
-
-		// Put this in the mouseDrag handler since the user can start pressing shift while resizing
-		this._updateVirtualBoundaries(event.shiftKey);
-		if (this._aspectRatio || event.shiftKey)
-			data = this._updateRatio(data, event);
-
-		data = this._respectSize(data, event);
-
-		// plugins callbacks need to be called first
-		this._propagate("resize", event);
-
-		el.css({
-			top: this.position.top + "px", left: this.position.left + "px",
-			width: this.size.width + "px", height: this.size.height + "px"
-		});
-
-		if (!this._helper && this._proportionallyResizeElements.length)
-			this._proportionallyResize();
-
-		this._updateCache(data);
-
-		// calling the user callback at the end
-		this._trigger('resize', event, this.ui());
-
-		return false;
-	},
-
-	_mouseStop: function(event) {
-
-		this.resizing = false;
-		var o = this.options, that = this;
-
-		if(this._helper) {
-			var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-				soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
-				soffsetw = ista ? 0 : that.sizeDiff.width;
-
-			var s = { width: (that.helper.width()  - soffsetw), height: (that.helper.height() - soffseth) },
-				left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
-				top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
-
-			if (!o.animate)
-				this.element.css($.extend(s, { top: top, left: left }));
-
-			that.helper.height(that.size.height);
-			that.helper.width(that.size.width);
-
-			if (this._helper && !o.animate) this._proportionallyResize();
-		}
-
-		$('body').css('cursor', 'auto');
-
-		this.element.removeClass("ui-resizable-resizing");
-
-		this._propagate("stop", event);
-
-		if (this._helper) this.helper.remove();
-		return false;
-
-	},
-
-	_updateVirtualBoundaries: function(forceAspectRatio) {
-		var o = this.options, pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b;
-
-		b = {
-			minWidth: isNumber(o.minWidth) ? o.minWidth : 0,
-			maxWidth: isNumber(o.maxWidth) ? o.maxWidth : Infinity,
-			minHeight: isNumber(o.minHeight) ? o.minHeight : 0,
-			maxHeight: isNumber(o.maxHeight) ? o.maxHeight : Infinity
-		};
-
-		if(this._aspectRatio || forceAspectRatio) {
-			// We want to create an enclosing box whose aspect ration is the requested one
-			// First, compute the "projected" size for each dimension based on the aspect ratio and other dimension
-			pMinWidth = b.minHeight * this.aspectRatio;
-			pMinHeight = b.minWidth / this.aspectRatio;
-			pMaxWidth = b.maxHeight * this.aspectRatio;
-			pMaxHeight = b.maxWidth / this.aspectRatio;
-
-			if(pMinWidth > b.minWidth) b.minWidth = pMinWidth;
-			if(pMinHeight > b.minHeight) b.minHeight = pMinHeight;
-			if(pMaxWidth < b.maxWidth) b.maxWidth = pMaxWidth;
-			if(pMaxHeight < b.maxHeight) b.maxHeight = pMaxHeight;
-		}
-		this._vBoundaries = b;
-	},
-
-	_updateCache: function(data) {
-		var o = this.options;
-		this.offset = this.helper.offset();
-		if (isNumber(data.left)) this.position.left = data.left;
-		if (isNumber(data.top)) this.position.top = data.top;
-		if (isNumber(data.height)) this.size.height = data.height;
-		if (isNumber(data.width)) this.size.width = data.width;
-	},
-
-	_updateRatio: function(data, event) {
-
-		var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
-
-		if (isNumber(data.height)) data.width = (data.height * this.aspectRatio);
-		else if (isNumber(data.width)) data.height = (data.width / this.aspectRatio);
-
-		if (a == 'sw') {
-			data.left = cpos.left + (csize.width - data.width);
-			data.top = null;
-		}
-		if (a == 'nw') {
-			data.top = cpos.top + (csize.height - data.height);
-			data.left = cpos.left + (csize.width - data.width);
-		}
-
-		return data;
-	},
-
-	_respectSize: function(data, event) {
-
-		var el = this.helper, o = this._vBoundaries, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
-				ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
-					isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
-
-		if (isminw) data.width = o.minWidth;
-		if (isminh) data.height = o.minHeight;
-		if (ismaxw) data.width = o.maxWidth;
-		if (ismaxh) data.height = o.maxHeight;
-
-		var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
-		var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
-
-		if (isminw && cw) data.left = dw - o.minWidth;
-		if (ismaxw && cw) data.left = dw - o.maxWidth;
-		if (isminh && ch)	data.top = dh - o.minHeight;
-		if (ismaxh && ch)	data.top = dh - o.maxHeight;
-
-		// fixing jump error on top/left - bug #2330
-		var isNotwh = !data.width && !data.height;
-		if (isNotwh && !data.left && data.top) data.top = null;
-		else if (isNotwh && !data.top && data.left) data.left = null;
-
-		return data;
-	},
-
-	_proportionallyResize: function() {
-
-		var o = this.options;
-		if (!this._proportionallyResizeElements.length) return;
-		var element = this.helper || this.element;
-
-		for (var i=0; i < this._proportionallyResizeElements.length; i++) {
-
-			var prel = this._proportionallyResizeElements[i];
-
-			if (!this.borderDif) {
-				var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
-					p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
-
-				this.borderDif = $.map(b, function(v, i) {
-					var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
-					return border + padding;
-				});
-			}
-
-			prel.css({
-				height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
-				width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
-			});
-
-		};
-
-	},
-
-	_renderProxy: function() {
-
-		var el = this.element, o = this.options;
-		this.elementOffset = el.offset();
-
-		if(this._helper) {
-
-			this.helper = this.helper || $('<div style="overflow:hidden;"></div>');
-
-			// fix ie6 offset TODO: This seems broken
-			var ie6offset = ($.ui.ie6 ? 1 : 0),
-			pxyoffset = ( $.ui.ie6 ? 2 : -1 );
-
-			this.helper.addClass(this._helper).css({
-				width: this.element.outerWidth() + pxyoffset,
-				height: this.element.outerHeight() + pxyoffset,
-				position: 'absolute',
-				left: this.elementOffset.left - ie6offset +'px',
-				top: this.elementOffset.top - ie6offset +'px',
-				zIndex: ++o.zIndex //TODO: Don't modify option
-			});
-
-			this.helper
-				.appendTo("body")
-				.disableSelection();
-
-		} else {
-			this.helper = this.element;
-		}
-
-	},
-
-	_change: {
-		e: function(event, dx, dy) {
-			return { width: this.originalSize.width + dx };
-		},
-		w: function(event, dx, dy) {
-			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
-			return { left: sp.left + dx, width: cs.width - dx };
-		},
-		n: function(event, dx, dy) {
-			var o = this.options, cs = this.originalSize, sp = this.originalPosition;
-			return { top: sp.top + dy, height: cs.height - dy };
-		},
-		s: function(event, dx, dy) {
-			return { height: this.originalSize.height + dy };
-		},
-		se: function(event, dx, dy) {
-			return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
-		},
-		sw: function(event, dx, dy) {
-			return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
-		},
-		ne: function(event, dx, dy) {
-			return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
-		},
-		nw: function(event, dx, dy) {
-			return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
-		}
-	},
-
-	_propagate: function(n, event) {
-		$.ui.plugin.call(this, n, [event, this.ui()]);
-		(n != "resize" && this._trigger(n, event, this.ui()));
-	},
-
-	plugins: {},
-
-	ui: function() {
-		return {
-			originalElement: this.originalElement,
-			element: this.element,
-			helper: this.helper,
-			position: this.position,
-			size: this.size,
-			originalSize: this.originalSize,
-			originalPosition: this.originalPosition
-		};
-	}
-
-});
-
-/*
- * Resizable Extensions
- */
-
-$.ui.plugin.add("resizable", "alsoResize", {
-
-	start: function (event, ui) {
-		var that = $(this).data("resizable"), o = that.options;
-
-		var _store = function (exp) {
-			$(exp).each(function() {
-				var el = $(this);
-				el.data("resizable-alsoresize", {
-					width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
-					left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10)
-				});
-			});
-		};
-
-		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
-			if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
-			else { $.each(o.alsoResize, function (exp) { _store(exp); }); }
-		}else{
-			_store(o.alsoResize);
-		}
-	},
-
-	resize: function (event, ui) {
-		var that = $(this).data("resizable"), o = that.options, os = that.originalSize, op = that.originalPosition;
-
-		var delta = {
-			height: (that.size.height - os.height) || 0, width: (that.size.width - os.width) || 0,
-			top: (that.position.top - op.top) || 0, left: (that.position.left - op.left) || 0
-		},
-
-		_alsoResize = function (exp, c) {
-			$(exp).each(function() {
-				var el = $(this), start = $(this).data("resizable-alsoresize"), style = {},
-					css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left'];
-
-				$.each(css, function (i, prop) {
-					var sum = (start[prop]||0) + (delta[prop]||0);
-					if (sum && sum >= 0)
-						style[prop] = sum || null;
-				});
-
-				el.css(style);
-			});
-		};
-
-		if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
-			$.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); });
-		}else{
-			_alsoResize(o.alsoResize);
-		}
-	},
-
-	stop: function (event, ui) {
-		$(this).removeData("resizable-alsoresize");
-	}
-});
-
-$.ui.plugin.add("resizable", "animate", {
-
-	stop: function(event, ui) {
-		var that = $(this).data("resizable"), o = that.options;
-
-		var pr = that._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
-					soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : that.sizeDiff.height,
-						soffsetw = ista ? 0 : that.sizeDiff.width;
-
-		var style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
-					left = (parseInt(that.element.css('left'), 10) + (that.position.left - that.originalPosition.left)) || null,
-						top = (parseInt(that.element.css('top'), 10) + (that.position.top - that.originalPosition.top)) || null;
-
-		that.element.animate(
-			$.extend(style, top && left ? { top: top, left: left } : {}), {
-				duration: o.animateDuration,
-				easing: o.animateEasing,
-				step: function() {
-
-					var data = {
-						width: parseInt(that.element.css('width'), 10),
-						height: parseInt(that.element.css('height'), 10),
-						top: parseInt(that.element.css('top'), 10),
-						left: parseInt(that.element.css('left'), 10)
-					};
-
-					if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
-
-					// propagating resize, and updating values for each animation step
-					that._updateCache(data);
-					that._propagate("resize", event);
-
-				}
-			}
-		);
-	}
-
-});
-
-$.ui.plugin.add("resizable", "containment", {
-
-	start: function(event, ui) {
-		var that = $(this).data("resizable"), o = that.options, el = that.element;
-		var oc = o.containment,	ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
-		if (!ce) return;
-
-		that.containerElement = $(ce);
-
-		if (/document/.test(oc) || oc == document) {
-			that.containerOffset = { left: 0, top: 0 };
-			that.containerPosition = { left: 0, top: 0 };
-
-			that.parentData = {
-				element: $(document), left: 0, top: 0,
-				width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
-			};
-		}
-
-		// i'm a node, so compute top, left, right, bottom
-		else {
-			var element = $(ce), p = [];
-			$([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
-
-			that.containerOffset = element.offset();
-			that.containerPosition = element.position();
-			that.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
-
-			var co = that.containerOffset, ch = that.containerSize.height,	cw = that.containerSize.width,
-						width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
-
-			that.parentData = {
-				element: ce, left: co.left, top: co.top, width: width, height: height
-			};
-		}
-	},
-
-	resize: function(event, ui) {
-		var that = $(this).data("resizable"), o = that.options,
-				ps = that.containerSize, co = that.containerOffset, cs = that.size, cp = that.position,
-				pRatio = that._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = that.containerElement;
-
-		if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
-
-		if (cp.left < (that._helper ? co.left : 0)) {
-			that.size.width = that.size.width + (that._helper ? (that.position.left - co.left) : (that.position.left - cop.left));
-			if (pRatio) that.size.height = that.size.width / that.aspectRatio;
-			that.position.left = o.helper ? co.left : 0;
-		}
-
-		if (cp.top < (that._helper ? co.top : 0)) {
-			that.size.height = that.size.height + (that._helper ? (that.position.top - co.top) : that.position.top);
-			if (pRatio) that.size.width = that.size.height * that.aspectRatio;
-			that.position.top = that._helper ? co.top : 0;
-		}
-
-		that.offset.left = that.parentData.left+that.position.left;
-		that.offset.top = that.parentData.top+that.position.top;
-
-		var woset = Math.abs( (that._helper ? that.offset.left - cop.left : (that.offset.left - cop.left)) + that.sizeDiff.width ),
-					hoset = Math.abs( (that._helper ? that.offset.top - cop.top : (that.offset.top - co.top)) + that.sizeDiff.height );
-
-		var isParent = that.containerElement.get(0) == that.element.parent().get(0),
-			isOffsetRelative = /relative|absolute/.test(that.containerElement.css('position'));
-
-		if(isParent && isOffsetRelative) woset -= that.parentData.left;
-
-		if (woset + that.size.width >= that.parentData.width) {
-			that.size.width = that.parentData.width - woset;
-			if (pRatio) that.size.height = that.size.width / that.aspectRatio;
-		}
-
-		if (hoset + that.size.height >= that.parentData.height) {
-			that.size.height = that.parentData.height - hoset;
-			if (pRatio) that.size.width = that.size.height * that.aspectRatio;
-		}
-	},
-
-	stop: function(event, ui){
-		var that = $(this).data("resizable"), o = that.options, cp = that.position,
-				co = that.containerOffset, cop = that.containerPosition, ce = that.containerElement;
-
-		var helper = $(that.helper), ho = helper.offset(), w = helper.outerWidth() - that.sizeDiff.width, h = helper.outerHeight() - that.sizeDiff.height;
-
-		if (that._helper && !o.animate && (/relative/).test(ce.css('position')))
-			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
-
-		if (that._helper && !o.animate && (/static/).test(ce.css('position')))
-			$(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
-
-	}
-});
-
-$.ui.plugin.add("resizable", "ghost", {
-
-	start: function(event, ui) {
-
-		var that = $(this).data("resizable"), o = that.options, cs = that.size;
-
-		that.ghost = that.originalElement.clone();
-		that.ghost
-			.css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
-			.addClass('ui-resizable-ghost')
-			.addClass(typeof o.ghost == 'string' ? o.ghost : '');
-
-		that.ghost.appendTo(that.helper);
-
-	},
-
-	resize: function(event, ui){
-		var that = $(this).data("resizable"), o = that.options;
-		if (that.ghost) that.ghost.css({ position: 'relative', height: that.size.height, width: that.size.width });
-	},
-
-	stop: function(event, ui){
-		var that = $(this).data("resizable"), o = that.options;
-		if (that.ghost && that.helper) that.helper.get(0).removeChild(that.ghost.get(0));
-	}
-
-});
-
-$.ui.plugin.add("resizable", "grid", {
-
-	resize: function(event, ui) {
-		var that = $(this).data("resizable"), o = that.options, cs = that.size, os = that.originalSize, op = that.originalPosition, a = that.axis, ratio = o._aspectRatio || event.shiftKey;
-		o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
-		var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
-
-		if (/^(se|s|e)$/.test(a)) {
-			that.size.width = os.width + ox;
-			that.size.height = os.height + oy;
-		}
-		else if (/^(ne)$/.test(a)) {
-			that.size.width = os.width + ox;
-			that.size.height = os.height + oy;
-			that.position.top = op.top - oy;
-		}
-		else if (/^(sw)$/.test(a)) {
-			that.size.width = os.width + ox;
-			that.size.height = os.height + oy;
-			that.position.left = op.left - ox;
-		}
-		else {
-			that.size.width = os.width + ox;
-			that.size.height = os.height + oy;
-			that.position.top = op.top - oy;
-			that.position.left = op.left - ox;
-		}
-	}
-
-});
-
-var num = function(v) {
-	return parseInt(v, 10) || 0;
-};
-
-var isNumber = function(value) {
-	return !isNaN(parseInt(value, 10));
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.widget("ui.selectable", $.ui.mouse, {
-	version: "1.9.2",
-	options: {
-		appendTo: 'body',
-		autoRefresh: true,
-		distance: 0,
-		filter: '*',
-		tolerance: 'touch'
-	},
-	_create: function() {
-		var that = this;
-
-		this.element.addClass("ui-selectable");
-
-		this.dragged = false;
-
-		// cache selectee children based on filter
-		var selectees;
-		this.refresh = function() {
-			selectees = $(that.options.filter, that.element[0]);
-			selectees.addClass("ui-selectee");
-			selectees.each(function() {
-				var $this = $(this);
-				var pos = $this.offset();
-				$.data(this, "selectable-item", {
-					element: this,
-					$element: $this,
-					left: pos.left,
-					top: pos.top,
-					right: pos.left + $this.outerWidth(),
-					bottom: pos.top + $this.outerHeight(),
-					startselected: false,
-					selected: $this.hasClass('ui-selected'),
-					selecting: $this.hasClass('ui-selecting'),
-					unselecting: $this.hasClass('ui-unselecting')
-				});
-			});
-		};
-		this.refresh();
-
-		this.selectees = selectees.addClass("ui-selectee");
-
-		this._mouseInit();
-
-		this.helper = $("<div class='ui-selectable-helper'></div>");
-	},
-
-	_destroy: function() {
-		this.selectees
-			.removeClass("ui-selectee")
-			.removeData("selectable-item");
-		this.element
-			.removeClass("ui-selectable ui-selectable-disabled");
-		this._mouseDestroy();
-	},
-
-	_mouseStart: function(event) {
-		var that = this;
-
-		this.opos = [event.pageX, event.pageY];
-
-		if (this.options.disabled)
-			return;
-
-		var options = this.options;
-
-		this.selectees = $(options.filter, this.element[0]);
-
-		this._trigger("start", event);
-
-		$(options.appendTo).append(this.helper);
-		// position helper (lasso)
-		this.helper.css({
-			"left": event.clientX,
-			"top": event.clientY,
-			"width": 0,
-			"height": 0
-		});
-
-		if (options.autoRefresh) {
-			this.refresh();
-		}
-
-		this.selectees.filter('.ui-selected').each(function() {
-			var selectee = $.data(this, "selectable-item");
-			selectee.startselected = true;
-			if (!event.metaKey && !event.ctrlKey) {
-				selectee.$element.removeClass('ui-selected');
-				selectee.selected = false;
-				selectee.$element.addClass('ui-unselecting');
-				selectee.unselecting = true;
-				// selectable UNSELECTING callback
-				that._trigger("unselecting", event, {
-					unselecting: selectee.element
-				});
-			}
-		});
-
-		$(event.target).parents().andSelf().each(function() {
-			var selectee = $.data(this, "selectable-item");
-			if (selectee) {
-				var doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass('ui-selected');
-				selectee.$element
-					.removeClass(doSelect ? "ui-unselecting" : "ui-selected")
-					.addClass(doSelect ? "ui-selecting" : "ui-unselecting");
-				selectee.unselecting = !doSelect;
-				selectee.selecting = doSelect;
-				selectee.selected = doSelect;
-				// selectable (UN)SELECTING callback
-				if (doSelect) {
-					that._trigger("selecting", event, {
-						selecting: selectee.element
-					});
-				} else {
-					that._trigger("unselecting", event, {
-						unselecting: selectee.element
-					});
-				}
-				return false;
-			}
-		});
-
-	},
-
-	_mouseDrag: function(event) {
-		var that = this;
-		this.dragged = true;
-
-		if (this.options.disabled)
-			return;
-
-		var options = this.options;
-
-		var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY;
-		if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; }
-		if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; }
-		this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1});
-
-		this.selectees.each(function() {
-			var selectee = $.data(this, "selectable-item");
-			//prevent helper from being selected if appendTo: selectable
-			if (!selectee || selectee.element == that.element[0])
-				return;
-			var hit = false;
-			if (options.tolerance == 'touch') {
-				hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );
-			} else if (options.tolerance == 'fit') {
-				hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);
-			}
-
-			if (hit) {
-				// SELECT
-				if (selectee.selected) {
-					selectee.$element.removeClass('ui-selected');
-					selectee.selected = false;
-				}
-				if (selectee.unselecting) {
-					selectee.$element.removeClass('ui-unselecting');
-					selectee.unselecting = false;
-				}
-				if (!selectee.selecting) {
-					selectee.$element.addClass('ui-selecting');
-					selectee.selecting = true;
-					// selectable SELECTING callback
-					that._trigger("selecting", event, {
-						selecting: selectee.element
-					});
-				}
-			} else {
-				// UNSELECT
-				if (selectee.selecting) {
-					if ((event.metaKey || event.ctrlKey) && selectee.startselected) {
-						selectee.$element.removeClass('ui-selecting');
-						selectee.selecting = false;
-						selectee.$element.addClass('ui-selected');
-						selectee.selected = true;
-					} else {
-						selectee.$element.removeClass('ui-selecting');
-						selectee.selecting = false;
-						if (selectee.startselected) {
-							selectee.$element.addClass('ui-unselecting');
-							selectee.unselecting = true;
-						}
-						// selectable UNSELECTING callback
-						that._trigger("unselecting", event, {
-							unselecting: selectee.element
-						});
-					}
-				}
-				if (selectee.selected) {
-					if (!event.metaKey && !event.ctrlKey && !selectee.startselected) {
-						selectee.$element.removeClass('ui-selected');
-						selectee.selected = false;
-
-						selectee.$element.addClass('ui-unselecting');
-						selectee.unselecting = true;
-						// selectable UNSELECTING callback
-						that._trigger("unselecting", event, {
-							unselecting: selectee.element
-						});
-					}
-				}
-			}
-		});
-
-		return false;
-	},
-
-	_mouseStop: function(event) {
-		var that = this;
-
-		this.dragged = false;
-
-		var options = this.options;
-
-		$('.ui-unselecting', this.element[0]).each(function() {
-			var selectee = $.data(this, "selectable-item");
-			selectee.$element.removeClass('ui-unselecting');
-			selectee.unselecting = false;
-			selectee.startselected = false;
-			that._trigger("unselected", event, {
-				unselected: selectee.element
-			});
-		});
-		$('.ui-selecting', this.element[0]).each(function() {
-			var selectee = $.data(this, "selectable-item");
-			selectee.$element.removeClass('ui-selecting').addClass('ui-selected');
-			selectee.selecting = false;
-			selectee.selected = true;
-			selectee.startselected = true;
-			that._trigger("selected", event, {
-				selected: selectee.element
-			});
-		});
-		this._trigger("stop", event);
-
-		this.helper.remove();
-
-		return false;
-	}
-
-});
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.widget("ui.sortable", $.ui.mouse, {
-	version: "1.9.2",
-	widgetEventPrefix: "sort",
-	ready: false,
-	options: {
-		appendTo: "parent",
-		axis: false,
-		connectWith: false,
-		containment: false,
-		cursor: 'auto',
-		cursorAt: false,
-		dropOnEmpty: true,
-		forcePlaceholderSize: false,
-		forceHelperSize: false,
-		grid: false,
-		handle: false,
-		helper: "original",
-		items: '> *',
-		opacity: false,
-		placeholder: false,
-		revert: false,
-		scroll: true,
-		scrollSensitivity: 20,
-		scrollSpeed: 20,
-		scope: "default",
-		tolerance: "intersect",
-		zIndex: 1000
-	},
-	_create: function() {
-
-		var o = this.options;
-		this.containerCache = {};
-		this.element.addClass("ui-sortable");
-
-		//Get the items
-		this.refresh();
-
-		//Let's determine if the items are being displayed horizontally
-		this.floating = this.items.length ? o.axis === 'x' || (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false;
-
-		//Let's determine the parent's offset
-		this.offset = this.element.offset();
-
-		//Initialize mouse events for interaction
-		this._mouseInit();
-
-		//We're ready to go
-		this.ready = true
-
-	},
-
-	_destroy: function() {
-		this.element
-			.removeClass("ui-sortable ui-sortable-disabled");
-		this._mouseDestroy();
-
-		for ( var i = this.items.length - 1; i >= 0; i-- )
-			this.items[i].item.removeData(this.widgetName + "-item");
-
-		return this;
-	},
-
-	_setOption: function(key, value){
-		if ( key === "disabled" ) {
-			this.options[ key ] = value;
-
-			this.widget().toggleClass( "ui-sortable-disabled", !!value );
-		} else {
-			// Don't call widget base _setOption for disable as it adds ui-state-disabled class
-			$.Widget.prototype._setOption.apply(this, arguments);
-		}
-	},
-
-	_mouseCapture: function(event, overrideHandle) {
-		var that = this;
-
-		if (this.reverting) {
-			return false;
-		}
-
-		if(this.options.disabled || this.options.type == 'static') return false;
-
-		//We have to refresh the items data once first
-		this._refreshItems(event);
-
-		//Find out if the clicked node (or one of its parents) is a actual item in this.items
-		var currentItem = null, nodes = $(event.target).parents().each(function() {
-			if($.data(this, that.widgetName + '-item') == that) {
-				currentItem = $(this);
-				return false;
-			}
-		});
-		if($.data(event.target, that.widgetName + '-item') == that) currentItem = $(event.target);
-
-		if(!currentItem) return false;
-		if(this.options.handle && !overrideHandle) {
-			var validHandle = false;
-
-			$(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; });
-			if(!validHandle) return false;
-		}
-
-		this.currentItem = currentItem;
-		this._removeCurrentsFromItems();
-		return true;
-
-	},
-
-	_mouseStart: function(event, overrideHandle, noActivation) {
-
-		var o = this.options;
-		this.currentContainer = this;
-
-		//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture
-		this.refreshPositions();
-
-		//Create and append the visible helper
-		this.helper = this._createHelper(event);
-
-		//Cache the helper size
-		this._cacheHelperProportions();
-
-		/*
-		 * - Position generation -
-		 * This block generates everything position related - it's the core of draggables.
-		 */
-
-		//Cache the margins of the original element
-		this._cacheMargins();
-
-		//Get the next scrolling parent
-		this.scrollParent = this.helper.scrollParent();
-
-		//The element's absolute position on the page minus margins
-		this.offset = this.currentItem.offset();
-		this.offset = {
-			top: this.offset.top - this.margins.top,
-			left: this.offset.left - this.margins.left
-		};
-
-		$.extend(this.offset, {
-			click: { //Where the click happened, relative to the element
-				left: event.pageX - this.offset.left,
-				top: event.pageY - this.offset.top
-			},
-			parent: this._getParentOffset(),
-			relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
-		});
-
-		// Only after we got the offset, we can change the helper's position to absolute
-		// TODO: Still need to figure out a way to make relative sorting possible
-		this.helper.css("position", "absolute");
-		this.cssPosition = this.helper.css("position");
-
-		//Generate the original position
-		this.originalPosition = this._generatePosition(event);
-		this.originalPageX = event.pageX;
-		this.originalPageY = event.pageY;
-
-		//Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
-		(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));
-
-		//Cache the former DOM position
-		this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };
-
-		//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way
-		if(this.helper[0] != this.currentItem[0]) {
-			this.currentItem.hide();
-		}
-
-		//Create the placeholder
-		this._createPlaceholder();
-
-		//Set a containment if given in the options
-		if(o.containment)
-			this._setContainment();
-
-		if(o.cursor) { // cursor option
-			if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor");
-			$('body').css("cursor", o.cursor);
-		}
-
-		if(o.opacity) { // opacity option
-			if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity");
-			this.helper.css("opacity", o.opacity);
-		}
-
-		if(o.zIndex) { // zIndex option
-			if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex");
-			this.helper.css("zIndex", o.zIndex);
-		}
-
-		//Prepare scrolling
-		if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML')
-			this.overflowOffset = this.scrollParent.offset();
-
-		//Call callbacks
-		this._trigger("start", event, this._uiHash());
-
-		//Recache the helper size
-		if(!this._preserveHelperProportions)
-			this._cacheHelperProportions();
-
-
-		//Post 'activate' events to possible containers
-		if(!noActivation) {
-			 for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, this._uiHash(this)); }
-		}
-
-		//Prepare possible droppables
-		if($.ui.ddmanager)
-			$.ui.ddmanager.current = this;
-
-		if ($.ui.ddmanager && !o.dropBehaviour)
-			$.ui.ddmanager.prepareOffsets(this, event);
-
-		this.dragging = true;
-
-		this.helper.addClass("ui-sortable-helper");
-		this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position
-		return true;
-
-	},
-
-	_mouseDrag: function(event) {
-
-		//Compute the helpers position
-		this.position = this._generatePosition(event);
-		this.positionAbs = this._convertPositionTo("absolute");
-
-		if (!this.lastPositionAbs) {
-			this.lastPositionAbs = this.positionAbs;
-		}
-
-		//Do scrolling
-		if(this.options.scroll) {
-			var o = this.options, scrolled = false;
-			if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') {
-
-				if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
-					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;
-				else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity)
-					this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;
-
-				if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
-					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;
-				else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity)
-					this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;
-
-			} else {
-
-				if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
-					scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
-				else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
-					scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
-
-				if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
-					scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
-				else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
-					scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
-
-			}
-
-			if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
-				$.ui.ddmanager.prepareOffsets(this, event);
-		}
-
-		//Regenerate the absolute position used for position checks
-		this.positionAbs = this._convertPositionTo("absolute");
-
-		//Set the helper position
-		if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
-		if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
-
-		//Rearrange
-		for (var i = this.items.length - 1; i >= 0; i--) {
-
-			//Cache variables and intersection, continue if no intersection
-			var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item);
-			if (!intersection) continue;
-
-			// Only put the placeholder inside the current Container, skip all
-			// items form other containers. This works because when moving
-			// an item from one container to another the
-			// currentContainer is switched before the placeholder is moved.
-			//
-			// Without this moving items in "sub-sortables" can cause the placeholder to jitter
-			// beetween the outer and inner container.
-			if (item.instance !== this.currentContainer) continue;
-
-			if (itemElement != this.currentItem[0] //cannot intersect with itself
-				&&	this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before
-				&&	!$.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked
-				&& (this.options.type == 'semi-dynamic' ? !$.contains(this.element[0], itemElement) : true)
-				//&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container
-			) {
-
-				this.direction = intersection == 1 ? "down" : "up";
-
-				if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) {
-					this._rearrange(event, item);
-				} else {
-					break;
-				}
-
-				this._trigger("change", event, this._uiHash());
-				break;
-			}
-		}
-
-		//Post events to containers
-		this._contactContainers(event);
-
-		//Interconnect with droppables
-		if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
-
-		//Call callbacks
-		this._trigger('sort', event, this._uiHash());
-
-		this.lastPositionAbs = this.positionAbs;
-		return false;
-
-	},
-
-	_mouseStop: function(event, noPropagation) {
-
-		if(!event) return;
-
-		//If we are using droppables, inform the manager about the drop
-		if ($.ui.ddmanager && !this.options.dropBehaviour)
-			$.ui.ddmanager.drop(this, event);
-
-		if(this.options.revert) {
-			var that = this;
-			var cur = this.placeholder.offset();
-
-			this.reverting = true;
-
-			$(this.helper).animate({
-				left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft),
-				top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop)
-			}, parseInt(this.options.revert, 10) || 500, function() {
-				that._clear(event);
-			});
-		} else {
-			this._clear(event, noPropagation);
-		}
-
-		return false;
-
-	},
-
-	cancel: function() {
-
-		if(this.dragging) {
-
-			this._mouseUp({ target: null });
-
-			if(this.options.helper == "original")
-				this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
-			else
-				this.currentItem.show();
-
-			//Post deactivating events to containers
-			for (var i = this.containers.length - 1; i >= 0; i--){
-				this.containers[i]._trigger("deactivate", null, this._uiHash(this));
-				if(this.containers[i].containerCache.over) {
-					this.containers[i]._trigger("out", null, this._uiHash(this));
-					this.containers[i].containerCache.over = 0;
-				}
-			}
-
-		}
-
-		if (this.placeholder) {
-			//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
-			if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-			if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove();
-
-			$.extend(this, {
-				helper: null,
-				dragging: false,
-				reverting: false,
-				_noFinalSort: null
-			});
-
-			if(this.domPosition.prev) {
-				$(this.domPosition.prev).after(this.currentItem);
-			} else {
-				$(this.domPosition.parent).prepend(this.currentItem);
-			}
-		}
-
-		return this;
-
-	},
-
-	serialize: function(o) {
-
-		var items = this._getItemsAsjQuery(o && o.connected);
-		var str = []; o = o || {};
-
-		$(items).each(function() {
-			var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/));
-			if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2]));
-		});
-
-		if(!str.length && o.key) {
-			str.push(o.key + '=');
-		}
-
-		return str.join('&');
-
-	},
-
-	toArray: function(o) {
-
-		var items = this._getItemsAsjQuery(o && o.connected);
-		var ret = []; o = o || {};
-
-		items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); });
-		return ret;
-
-	},
-
-	/* Be careful with the following core functions */
-	_intersectsWith: function(item) {
-
-		var x1 = this.positionAbs.left,
-			x2 = x1 + this.helperProportions.width,
-			y1 = this.positionAbs.top,
-			y2 = y1 + this.helperProportions.height;
-
-		var l = item.left,
-			r = l + item.width,
-			t = item.top,
-			b = t + item.height;
-
-		var dyClick = this.offset.click.top,
-			dxClick = this.offset.click.left;
-
-		var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;
-
-		if(	   this.options.tolerance == "pointer"
-			|| this.options.forcePointerForContainers
-			|| (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height'])
-		) {
-			return isOverElement;
-		} else {
-
-			return (l < x1 + (this.helperProportions.width / 2) // Right Half
-				&& x2 - (this.helperProportions.width / 2) < r // Left Half
-				&& t < y1 + (this.helperProportions.height / 2) // Bottom Half
-				&& y2 - (this.helperProportions.height / 2) < b ); // Top Half
-
-		}
-	},
-
-	_intersectsWithPointer: function(item) {
-
-		var isOverElementHeight = (this.options.axis === 'x') || $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),
-			isOverElementWidth = (this.options.axis === 'y') || $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),
-			isOverElement = isOverElementHeight && isOverElementWidth,
-			verticalDirection = this._getDragVerticalDirection(),
-			horizontalDirection = this._getDragHorizontalDirection();
-
-		if (!isOverElement)
-			return false;
-
-		return this.floating ?
-			( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 )
-			: ( verticalDirection && (verticalDirection == "down" ? 2 : 1) );
-
-	},
-
-	_intersectsWithSides: function(item) {
-
-		var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),
-			isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),
-			verticalDirection = this._getDragVerticalDirection(),
-			horizontalDirection = this._getDragHorizontalDirection();
-
-		if (this.floating && horizontalDirection) {
-			return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf));
-		} else {
-			return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf));
-		}
-
-	},
-
-	_getDragVerticalDirection: function() {
-		var delta = this.positionAbs.top - this.lastPositionAbs.top;
-		return delta != 0 && (delta > 0 ? "down" : "up");
-	},
-
-	_getDragHorizontalDirection: function() {
-		var delta = this.positionAbs.left - this.lastPositionAbs.left;
-		return delta != 0 && (delta > 0 ? "right" : "left");
-	},
-
-	refresh: function(event) {
-		this._refreshItems(event);
-		this.refreshPositions();
-		return this;
-	},
-
-	_connectWith: function() {
-		var options = this.options;
-		return options.connectWith.constructor == String
-			? [options.connectWith]
-			: options.connectWith;
-	},
-
-	_getItemsAsjQuery: function(connected) {
-
-		var items = [];
-		var queries = [];
-		var connectWith = this._connectWith();
-
-		if(connectWith && connected) {
-			for (var i = connectWith.length - 1; i >= 0; i--){
-				var cur = $(connectWith[i]);
-				for (var j = cur.length - 1; j >= 0; j--){
-					var inst = $.data(cur[j], this.widgetName);
-					if(inst && inst != this && !inst.options.disabled) {
-						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]);
-					}
-				};
-			};
-		}
-
-		queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]);
-
-		for (var i = queries.length - 1; i >= 0; i--){
-			queries[i][0].each(function() {
-				items.push(this);
-			});
-		};
-
-		return $(items);
-
-	},
-
-	_removeCurrentsFromItems: function() {
-
-		var list = this.currentItem.find(":data(" + this.widgetName + "-item)");
-
-		this.items = $.grep(this.items, function (item) {
-			for (var j=0; j < list.length; j++) {
-				if(list[j] == item.item[0])
-					return false;
-			};
-			return true;
-		});
-
-	},
-
-	_refreshItems: function(event) {
-
-		this.items = [];
-		this.containers = [this];
-		var items = this.items;
-		var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]];
-		var connectWith = this._connectWith();
-
-		if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down
-			for (var i = connectWith.length - 1; i >= 0; i--){
-				var cur = $(connectWith[i]);
-				for (var j = cur.length - 1; j >= 0; j--){
-					var inst = $.data(cur[j], this.widgetName);
-					if(inst && inst != this && !inst.options.disabled) {
-						queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);
-						this.containers.push(inst);
-					}
-				};
-			};
-		}
-
-		for (var i = queries.length - 1; i >= 0; i--) {
-			var targetData = queries[i][1];
-			var _queries = queries[i][0];
-
-			for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) {
-				var item = $(_queries[j]);
-
-				item.data(this.widgetName + '-item', targetData); // Data for target checking (mouse manager)
-
-				items.push({
-					item: item,
-					instance: targetData,
-					width: 0, height: 0,
-					left: 0, top: 0
-				});
-			};
-		};
-
-	},
-
-	refreshPositions: function(fast) {
-
-		//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change
-		if(this.offsetParent && this.helper) {
-			this.offset.parent = this._getParentOffset();
-		}
-
-		for (var i = this.items.length - 1; i >= 0; i--){
-			var item = this.items[i];
-
-			//We ignore calculating positions of all connected containers when we're not over them
-			if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0])
-				continue;
-
-			var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;
-
-			if (!fast) {
-				item.width = t.outerWidth();
-				item.height = t.outerHeight();
-			}
-
-			var p = t.offset();
-			item.left = p.left;
-			item.top = p.top;
-		};
-
-		if(this.options.custom && this.options.custom.refreshContainers) {
-			this.options.custom.refreshContainers.call(this);
-		} else {
-			for (var i = this.containers.length - 1; i >= 0; i--){
-				var p = this.containers[i].element.offset();
-				this.containers[i].containerCache.left = p.left;
-				this.containers[i].containerCache.top = p.top;
-				this.containers[i].containerCache.width	= this.containers[i].element.outerWidth();
-				this.containers[i].containerCache.height = this.containers[i].element.outerHeight();
-			};
-		}
-
-		return this;
-	},
-
-	_createPlaceholder: function(that) {
-		that = that || this;
-		var o = that.options;
-
-		if(!o.placeholder || o.placeholder.constructor == String) {
-			var className = o.placeholder;
-			o.placeholder = {
-				element: function() {
-
-					var el = $(document.createElement(that.currentItem[0].nodeName))
-						.addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")
-						.removeClass("ui-sortable-helper")[0];
-
-					if(!className)
-						el.style.visibility = "hidden";
-
-					return el;
-				},
-				update: function(container, p) {
-
-					// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that
-					// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified
-					if(className && !o.forcePlaceholderSize) return;
-
-					//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item
-					if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css('paddingTop')||0, 10) - parseInt(that.currentItem.css('paddingBottom')||0, 10)); };
-					if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css('paddingLeft')||0, 10) - parseInt(that.currentItem.css('paddingRight')||0, 10)); };
-				}
-			};
-		}
-
-		//Create the placeholder
-		that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));
-
-		//Append it after the actual current item
-		that.currentItem.after(that.placeholder);
-
-		//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)
-		o.placeholder.update(that, that.placeholder);
-
-	},
-
-	_contactContainers: function(event) {
-
-		// get innermost container that intersects with item
-		var innermostContainer = null, innermostIndex = null;
-
-
-		for (var i = this.containers.length - 1; i >= 0; i--){
-
-			// never consider a container that's located within the item itself
-			if($.contains(this.currentItem[0], this.containers[i].element[0]))
-				continue;
-
-			if(this._intersectsWith(this.containers[i].containerCache)) {
-
-				// if we've already found a container and it's more "inner" than this, then continue
-				if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0]))
-					continue;
-
-				innermostContainer = this.containers[i];
-				innermostIndex = i;
-
-			} else {
-				// container doesn't intersect. trigger "out" event if necessary
-				if(this.containers[i].containerCache.over) {
-					this.containers[i]._trigger("out", event, this._uiHash(this));
-					this.containers[i].containerCache.over = 0;
-				}
-			}
-
-		}
-
-		// if no intersecting containers found, return
-		if(!innermostContainer) return;
-
-		// move the item into the container if it's not there already
-		if(this.containers.length === 1) {
-			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
-			this.containers[innermostIndex].containerCache.over = 1;
-		} else {
-
-			//When entering a new container, we will find the item with the least distance and append our item near it
-			var dist = 10000; var itemWithLeastDistance = null;
-			var posProperty = this.containers[innermostIndex].floating ? 'left' : 'top';
-			var sizeProperty = this.containers[innermostIndex].floating ? 'width' : 'height';
-			var base = this.positionAbs[posProperty] + this.offset.click[posProperty];
-			for (var j = this.items.length - 1; j >= 0; j--) {
-				if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue;
-				if(this.items[j].item[0] == this.currentItem[0]) continue;
-				var cur = this.items[j].item.offset()[posProperty];
-				var nearBottom = false;
-				if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){
-					nearBottom = true;
-					cur += this.items[j][sizeProperty];
-				}
-
-				if(Math.abs(cur - base) < dist) {
-					dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];
-					this.direction = nearBottom ? "up": "down";
-				}
-			}
-
-			if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled
-				return;
-
-			this.currentContainer = this.containers[innermostIndex];
-			itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);
-			this._trigger("change", event, this._uiHash());
-			this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));
-
-			//Update the placeholder
-			this.options.placeholder.update(this.currentContainer, this.placeholder);
-
-			this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));
-			this.containers[innermostIndex].containerCache.over = 1;
-		}
-
-
-	},
-
-	_createHelper: function(event) {
-
-		var o = this.options;
-		var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem);
-
-		if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already
-			$(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);
-
-		if(helper[0] == this.currentItem[0])
-			this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };
-
-		if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width());
-		if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height());
-
-		return helper;
-
-	},
-
-	_adjustOffsetFromHelper: function(obj) {
-		if (typeof obj == 'string') {
-			obj = obj.split(' ');
-		}
-		if ($.isArray(obj)) {
-			obj = {left: +obj[0], top: +obj[1] || 0};
-		}
-		if ('left' in obj) {
-			this.offset.click.left = obj.left + this.margins.left;
-		}
-		if ('right' in obj) {
-			this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
-		}
-		if ('top' in obj) {
-			this.offset.click.top = obj.top + this.margins.top;
-		}
-		if ('bottom' in obj) {
-			this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
-		}
-	},
-
-	_getParentOffset: function() {
-
-
-		//Get the offsetParent and cache its position
-		this.offsetParent = this.helper.offsetParent();
-		var po = this.offsetParent.offset();
-
-		// This is a special case where we need to modify a offset calculated on start, since the following happened:
-		// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
-		// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
-		//    the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
-		if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) {
-			po.left += this.scrollParent.scrollLeft();
-			po.top += this.scrollParent.scrollTop();
-		}
-
-		if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
-		|| (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.ui.ie)) //Ugly IE fix
-			po = { top: 0, left: 0 };
-
-		return {
-			top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
-			left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
-		};
-
-	},
-
-	_getRelativeOffset: function() {
-
-		if(this.cssPosition == "relative") {
-			var p = this.currentItem.position();
-			return {
-				top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
-				left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
-			};
-		} else {
-			return { top: 0, left: 0 };
-		}
-
-	},
-
-	_cacheMargins: function() {
-		this.margins = {
-			left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),
-			top: (parseInt(this.currentItem.css("marginTop"),10) || 0)
-		};
-	},
-
-	_cacheHelperProportions: function() {
-		this.helperProportions = {
-			width: this.helper.outerWidth(),
-			height: this.helper.outerHeight()
-		};
-	},
-
-	_setContainment: function() {
-
-		var o = this.options;
-		if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
-		if(o.containment == 'document' || o.containment == 'window') this.containment = [
-			0 - this.offset.relative.left - this.offset.parent.left,
-			0 - this.offset.relative.top - this.offset.parent.top,
-			$(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
-			($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
-		];
-
-		if(!(/^(document|window|parent)$/).test(o.containment)) {
-			var ce = $(o.containment)[0];
-			var co = $(o.containment).offset();
-			var over = ($(ce).css("overflow") != 'hidden');
-
-			this.containment = [
-				co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
-				co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
-				co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
-				co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
-			];
-		}
-
-	},
-
-	_convertPositionTo: function(d, pos) {
-
-		if(!pos) pos = this.position;
-		var mod = d == "absolute" ? 1 : -1;
-		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
-		return {
-			top: (
-				pos.top																	// The absolute mouse position
-				+ this.offset.relative.top * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
-				+ this.offset.parent.top * mod											// The offsetParent's offset without borders (offset + border)
-				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
-			),
-			left: (
-				pos.left																// The absolute mouse position
-				+ this.offset.relative.left * mod										// Only for relative positioned nodes: Relative offset from element to offset parent
-				+ this.offset.parent.left * mod											// The offsetParent's offset without borders (offset + border)
-				- ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
-			)
-		};
-
-	},
-
-	_generatePosition: function(event) {
-
-		var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
-
-		// This is another very weird special case that only happens for relative elements:
-		// 1. If the css position is relative
-		// 2. and the scroll parent is the document or similar to the offset parent
-		// we have to refresh the relative offset during the scroll so there are no jumps
-		if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
-			this.offset.relative = this._getRelativeOffset();
-		}
-
-		var pageX = event.pageX;
-		var pageY = event.pageY;
-
-		/*
-		 * - Position constraining -
-		 * Constrain the position to a mix of grid, containment.
-		 */
-
-		if(this.originalPosition) { //If we are not dragging yet, we won't check for options
-
-			if(this.containment) {
-				if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
-				if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
-				if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
-				if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
-			}
-
-			if(o.grid) {
-				var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
-				pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
-
-				var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
-				pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
-			}
-
-		}
-
-		return {
-			top: (
-				pageY																// The absolute mouse position
-				- this.offset.click.top													// Click offset (relative to the element)
-				- this.offset.relative.top												// Only for relative positioned nodes: Relative offset from element to offset parent
-				- this.offset.parent.top												// The offsetParent's offset without borders (offset + border)
-				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
-			),
-			left: (
-				pageX																// The absolute mouse position
-				- this.offset.click.left												// Click offset (relative to the element)
-				- this.offset.relative.left												// Only for relative positioned nodes: Relative offset from element to offset parent
-				- this.offset.parent.left												// The offsetParent's offset without borders (offset + border)
-				+ ( ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
-			)
-		};
-
-	},
-
-	_rearrange: function(event, i, a, hardRefresh) {
-
-		a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling));
-
-		//Various things done here to improve the performance:
-		// 1. we create a setTimeout, that calls refreshPositions
-		// 2. on the instance, we have a counter variable, that get's higher after every append
-		// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same
-		// 4. this lets only the last addition to the timeout stack through
-		this.counter = this.counter ? ++this.counter : 1;
-		var counter = this.counter;
-
-		this._delay(function() {
-			if(counter == this.counter) this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove
-		});
-
-	},
-
-	_clear: function(event, noPropagation) {
-
-		this.reverting = false;
-		// We delay all events that have to be triggered to after the point where the placeholder has been removed and
-		// everything else normalized again
-		var delayedTriggers = [];
-
-		// We first have to update the dom position of the actual currentItem
-		// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)
-		if(!this._noFinalSort && this.currentItem.parent().length) this.placeholder.before(this.currentItem);
-		this._noFinalSort = null;
-
-		if(this.helper[0] == this.currentItem[0]) {
-			for(var i in this._storedCSS) {
-				if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = '';
-			}
-			this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");
-		} else {
-			this.currentItem.show();
-		}
-
-		if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });
-		if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed
-
-		// Check if the items Container has Changed and trigger appropriate
-		// events.
-		if (this !== this.currentContainer) {
-			if(!noPropagation) {
-				delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });
-				delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); };  }).call(this, this.currentContainer));
-				delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this));  }; }).call(this, this.currentContainer));
-			}
-		}
-
-
-		//Post events to containers
-		for (var i = this.containers.length - 1; i >= 0; i--){
-			if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
-			if(this.containers[i].containerCache.over) {
-				delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); };  }).call(this, this.containers[i]));
-				this.containers[i].containerCache.over = 0;
-			}
-		}
-
-		//Do what was originally in plugins
-		if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor
-		if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity
-		if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index
-
-		this.dragging = false;
-		if(this.cancelHelperRemoval) {
-			if(!noPropagation) {
-				this._trigger("beforeStop", event, this._uiHash());
-				for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
-				this._trigger("stop", event, this._uiHash());
-			}
-
-			this.fromOutside = false;
-			return false;
-		}
-
-		if(!noPropagation) this._trigger("beforeStop", event, this._uiHash());
-
-		//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!
-		this.placeholder[0].parentNode.removeChild(this.placeholder[0]);
-
-		if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null;
-
-		if(!noPropagation) {
-			for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events
-			this._trigger("stop", event, this._uiHash());
-		}
-
-		this.fromOutside = false;
-		return true;
-
-	},
-
-	_trigger: function() {
-		if ($.Widget.prototype._trigger.apply(this, arguments) === false) {
-			this.cancel();
-		}
-	},
-
-	_uiHash: function(_inst) {
-		var inst = _inst || this;
-		return {
-			helper: inst.helper,
-			placeholder: inst.placeholder || $([]),
-			position: inst.position,
-			originalPosition: inst.originalPosition,
-			offset: inst.positionAbs,
-			item: inst.currentItem,
-			sender: _inst ? _inst.element : null
-		};
-	}
-
-});
-
-})(jQuery);
-
-;(jQuery.effects || (function($, undefined) {
-
-var backCompat = $.uiBackCompat !== false,
-	// prefix used for storing data on .data()
-	dataSpace = "ui-effects-";
-
-$.effects = {
-	effect: {}
-};
-
-/*!
- * jQuery Color Animations v2.0.0
- * http://jquery.com/
- *
- * Copyright 2012 jQuery Foundation and other contributors
- * Released under the MIT license.
- * http://jquery.org/license
- *
- * Date: Mon Aug 13 13:41:02 2012 -0500
- */
-(function( jQuery, undefined ) {
-
-	var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor".split(" "),
-
-	// plusequals test for += 100 -= 100
-	rplusequals = /^([\-+])=\s*(\d+\.?\d*)/,
-	// a set of RE's that can match strings and generate color tuples.
-	stringParsers = [{
-			re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
-			parse: function( execResult ) {
-				return [
-					execResult[ 1 ],
-					execResult[ 2 ],
-					execResult[ 3 ],
-					execResult[ 4 ]
-				];
-			}
-		}, {
-			re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
-			parse: function( execResult ) {
-				return [
-					execResult[ 1 ] * 2.55,
-					execResult[ 2 ] * 2.55,
-					execResult[ 3 ] * 2.55,
-					execResult[ 4 ]
-				];
-			}
-		}, {
-			// this regex ignores A-F because it's compared against an already lowercased string
-			re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,
-			parse: function( execResult ) {
-				return [
-					parseInt( execResult[ 1 ], 16 ),
-					parseInt( execResult[ 2 ], 16 ),
-					parseInt( execResult[ 3 ], 16 )
-				];
-			}
-		}, {
-			// this regex ignores A-F because it's compared against an already lowercased string
-			re: /#([a-f0-9])([a-f0-9])([a-f0-9])/,
-			parse: function( execResult ) {
-				return [
-					parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),
-					parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),
-					parseInt( execResult[ 3 ] + execResult[ 3 ], 16 )
-				];
-			}
-		}, {
-			re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
-			space: "hsla",
-			parse: function( execResult ) {
-				return [
-					execResult[ 1 ],
-					execResult[ 2 ] / 100,
-					execResult[ 3 ] / 100,
-					execResult[ 4 ]
-				];
-			}
-		}],
-
-	// jQuery.Color( )
-	color = jQuery.Color = function( color, green, blue, alpha ) {
-		return new jQuery.Color.fn.parse( color, green, blue, alpha );
-	},
-	spaces = {
-		rgba: {
-			props: {
-				red: {
-					idx: 0,
-					type: "byte"
-				},
-				green: {
-					idx: 1,
-					type: "byte"
-				},
-				blue: {
-					idx: 2,
-					type: "byte"
-				}
-			}
-		},
-
-		hsla: {
-			props: {
-				hue: {
-					idx: 0,
-					type: "degrees"
-				},
-				saturation: {
-					idx: 1,
-					type: "percent"
-				},
-				lightness: {
-					idx: 2,
-					type: "percent"
-				}
-			}
-		}
-	},
-	propTypes = {
-		"byte": {
-			floor: true,
-			max: 255
-		},
-		"percent": {
-			max: 1
-		},
-		"degrees": {
-			mod: 360,
-			floor: true
-		}
-	},
-	support = color.support = {},
-
-	// element for support tests
-	supportElem = jQuery( "<p>" )[ 0 ],
-
-	// colors = jQuery.Color.names
-	colors,
-
-	// local aliases of functions called often
-	each = jQuery.each;
-
-// determine rgba support immediately
-supportElem.style.cssText = "background-color:rgba(1,1,1,.5)";
-support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1;
-
-// define cache name and alpha properties
-// for rgba and hsla spaces
-each( spaces, function( spaceName, space ) {
-	space.cache = "_" + spaceName;
-	space.props.alpha = {
-		idx: 3,
-		type: "percent",
-		def: 1
-	};
-});
-
-function clamp( value, prop, allowEmpty ) {
-	var type = propTypes[ prop.type ] || {};
-
-	if ( value == null ) {
-		return (allowEmpty || !prop.def) ? null : prop.def;
-	}
-
-	// ~~ is an short way of doing floor for positive numbers
-	value = type.floor ? ~~value : parseFloat( value );
-
-	// IE will pass in empty strings as value for alpha,
-	// which will hit this case
-	if ( isNaN( value ) ) {
-		return prop.def;
-	}
-
-	if ( type.mod ) {
-		// we add mod before modding to make sure that negatives values
-		// get converted properly: -10 -> 350
-		return (value + type.mod) % type.mod;
-	}
-
-	// for now all property types without mod have min and max
-	return 0 > value ? 0 : type.max < value ? type.max : value;
-}
-
-function stringParse( string ) {
-	var inst = color(),
-		rgba = inst._rgba = [];
-
-	string = string.toLowerCase();
-
-	each( stringParsers, function( i, parser ) {
-		var parsed,
-			match = parser.re.exec( string ),
-			values = match && parser.parse( match ),
-			spaceName = parser.space || "rgba";
-
-		if ( values ) {
-			parsed = inst[ spaceName ]( values );
-
-			// if this was an rgba parse the assignment might happen twice
-			// oh well....
-			inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];
-			rgba = inst._rgba = parsed._rgba;
-
-			// exit each( stringParsers ) here because we matched
-			return false;
-		}
-	});
-
-	// Found a stringParser that handled it
-	if ( rgba.length ) {
-
-		// if this came from a parsed string, force "transparent" when alpha is 0
-		// chrome, (and maybe others) return "transparent" as rgba(0,0,0,0)
-		if ( rgba.join() === "0,0,0,0" ) {
-			jQuery.extend( rgba, colors.transparent );
-		}
-		return inst;
-	}
-
-	// named colors
-	return colors[ string ];
-}
-
-color.fn = jQuery.extend( color.prototype, {
-	parse: function( red, green, blue, alpha ) {
-		if ( red === undefined ) {
-			this._rgba = [ null, null, null, null ];
-			return this;
-		}
-		if ( red.jquery || red.nodeType ) {
-			red = jQuery( red ).css( green );
-			green = undefined;
-		}
-
-		var inst = this,
-			type = jQuery.type( red ),
-			rgba = this._rgba = [];
-
-		// more than 1 argument specified - assume ( red, green, blue, alpha )
-		if ( green !== undefined ) {
-			red = [ red, green, blue, alpha ];
-			type = "array";
-		}
-
-		if ( type === "string" ) {
-			return this.parse( stringParse( red ) || colors._default );
-		}
-
-		if ( type === "array" ) {
-			each( spaces.rgba.props, function( key, prop ) {
-				rgba[ prop.idx ] = clamp( red[ prop.idx ], prop );
-			});
-			return this;
-		}
-
-		if ( type === "object" ) {
-			if ( red instanceof color ) {
-				each( spaces, function( spaceName, space ) {
-					if ( red[ space.cache ] ) {
-						inst[ space.cache ] = red[ space.cache ].slice();
-					}
-				});
-			} else {
-				each( spaces, function( spaceName, space ) {
-					var cache = space.cache;
-					each( space.props, function( key, prop ) {
-
-						// if the cache doesn't exist, and we know how to convert
-						if ( !inst[ cache ] && space.to ) {
-
-							// if the value was null, we don't need to copy it
-							// if the key was alpha, we don't need to copy it either
-							if ( key === "alpha" || red[ key ] == null ) {
-								return;
-							}
-							inst[ cache ] = space.to( inst._rgba );
-						}
-
-						// this is the only case where we allow nulls for ALL properties.
-						// call clamp with alwaysAllowEmpty
-						inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );
-					});
-
-					// everything defined but alpha?
-					if ( inst[ cache ] && $.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {
-						// use the default of 1
-						inst[ cache ][ 3 ] = 1;
-						if ( space.from ) {
-							inst._rgba = space.from( inst[ cache ] );
-						}
-					}
-				});
-			}
-			return this;
-		}
-	},
-	is: function( compare ) {
-		var is = color( compare ),
-			same = true,
-			inst = this;
-
-		each( spaces, function( _, space ) {
-			var localCache,
-				isCache = is[ space.cache ];
-			if (isCache) {
-				localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];
-				each( space.props, function( _, prop ) {
-					if ( isCache[ prop.idx ] != null ) {
-						same = ( isCache[ prop.idx ] === localCache[ prop.idx ] );
-						return same;
-					}
-				});
-			}
-			return same;
-		});
-		return same;
-	},
-	_space: function() {
-		var used = [],
-			inst = this;
-		each( spaces, function( spaceName, space ) {
-			if ( inst[ space.cache ] ) {
-				used.push( spaceName );
-			}
-		});
-		return used.pop();
-	},
-	transition: function( other, distance ) {
-		var end = color( other ),
-			spaceName = end._space(),
-			space = spaces[ spaceName ],
-			startColor = this.alpha() === 0 ? color( "transparent" ) : this,
-			start = startColor[ space.cache ] || space.to( startColor._rgba ),
-			result = start.slice();
-
-		end = end[ space.cache ];
-		each( space.props, function( key, prop ) {
-			var index = prop.idx,
-				startValue = start[ index ],
-				endValue = end[ index ],
-				type = propTypes[ prop.type ] || {};
-
-			// if null, don't override start value
-			if ( endValue === null ) {
-				return;
-			}
-			// if null - use end
-			if ( startValue === null ) {
-				result[ index ] = endValue;
-			} else {
-				if ( type.mod ) {
-					if ( endValue - startValue > type.mod / 2 ) {
-						startValue += type.mod;
-					} else if ( startValue - endValue > type.mod / 2 ) {
-						startValue -= type.mod;
-					}
-				}
-				result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );
-			}
-		});
-		return this[ spaceName ]( result );
-	},
-	blend: function( opaque ) {
-		// if we are already opaque - return ourself
-		if ( this._rgba[ 3 ] === 1 ) {
-			return this;
-		}
-
-		var rgb = this._rgba.slice(),
-			a = rgb.pop(),
-			blend = color( opaque )._rgba;
-
-		return color( jQuery.map( rgb, function( v, i ) {
-			return ( 1 - a ) * blend[ i ] + a * v;
-		}));
-	},
-	toRgbaString: function() {
-		var prefix = "rgba(",
-			rgba = jQuery.map( this._rgba, function( v, i ) {
-				return v == null ? ( i > 2 ? 1 : 0 ) : v;
-			});
-
-		if ( rgba[ 3 ] === 1 ) {
-			rgba.pop();
-			prefix = "rgb(";
-		}
-
-		return prefix + rgba.join() + ")";
-	},
-	toHslaString: function() {
-		var prefix = "hsla(",
-			hsla = jQuery.map( this.hsla(), function( v, i ) {
-				if ( v == null ) {
-					v = i > 2 ? 1 : 0;
-				}
-
-				// catch 1 and 2
-				if ( i && i < 3 ) {
-					v = Math.round( v * 100 ) + "%";
-				}
-				return v;
-			});
-
-		if ( hsla[ 3 ] === 1 ) {
-			hsla.pop();
-			prefix = "hsl(";
-		}
-		return prefix + hsla.join() + ")";
-	},
-	toHexString: function( includeAlpha ) {
-		var rgba = this._rgba.slice(),
-			alpha = rgba.pop();
-
-		if ( includeAlpha ) {
-			rgba.push( ~~( alpha * 255 ) );
-		}
-
-		return "#" + jQuery.map( rgba, function( v ) {
-
-			// default to 0 when nulls exist
-			v = ( v || 0 ).toString( 16 );
-			return v.length === 1 ? "0" + v : v;
-		}).join("");
-	},
-	toString: function() {
-		return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString();
-	}
-});
-color.fn.parse.prototype = color.fn;
-
-// hsla conversions adapted from:
-// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021
-
-function hue2rgb( p, q, h ) {
-	h = ( h + 1 ) % 1;
-	if ( h * 6 < 1 ) {
-		return p + (q - p) * h * 6;
-	}
-	if ( h * 2 < 1) {
-		return q;
-	}
-	if ( h * 3 < 2 ) {
-		return p + (q - p) * ((2/3) - h) * 6;
-	}
-	return p;
-}
-
-spaces.hsla.to = function ( rgba ) {
-	if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {
-		return [ null, null, null, rgba[ 3 ] ];
-	}
-	var r = rgba[ 0 ] / 255,
-		g = rgba[ 1 ] / 255,
-		b = rgba[ 2 ] / 255,
-		a = rgba[ 3 ],
-		max = Math.max( r, g, b ),
-		min = Math.min( r, g, b ),
-		diff = max - min,
-		add = max + min,
-		l = add * 0.5,
-		h, s;
-
-	if ( min === max ) {
-		h = 0;
-	} else if ( r === max ) {
-		h = ( 60 * ( g - b ) / diff ) + 360;
-	} else if ( g === max ) {
-		h = ( 60 * ( b - r ) / diff ) + 120;
-	} else {
-		h = ( 60 * ( r - g ) / diff ) + 240;
-	}
-
-	if ( l === 0 || l === 1 ) {
-		s = l;
-	} else if ( l <= 0.5 ) {
-		s = diff / add;
-	} else {
-		s = diff / ( 2 - add );
-	}
-	return [ Math.round(h) % 360, s, l, a == null ? 1 : a ];
-};
-
-spaces.hsla.from = function ( hsla ) {
-	if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {
-		return [ null, null, null, hsla[ 3 ] ];
-	}
-	var h = hsla[ 0 ] / 360,
-		s = hsla[ 1 ],
-		l = hsla[ 2 ],
-		a = hsla[ 3 ],
-		q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,
-		p = 2 * l - q;
-
-	return [
-		Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),
-		Math.round( hue2rgb( p, q, h ) * 255 ),
-		Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),
-		a
-	];
-};
-
-
-each( spaces, function( spaceName, space ) {
-	var props = space.props,
-		cache = space.cache,
-		to = space.to,
-		from = space.from;
-
-	// makes rgba() and hsla()
-	color.fn[ spaceName ] = function( value ) {
-
-		// generate a cache for this space if it doesn't exist
-		if ( to && !this[ cache ] ) {
-			this[ cache ] = to( this._rgba );
-		}
-		if ( value === undefined ) {
-			return this[ cache ].slice();
-		}
-
-		var ret,
-			type = jQuery.type( value ),
-			arr = ( type === "array" || type === "object" ) ? value : arguments,
-			local = this[ cache ].slice();
-
-		each( props, function( key, prop ) {
-			var val = arr[ type === "object" ? key : prop.idx ];
-			if ( val == null ) {
-				val = local[ prop.idx ];
-			}
-			local[ prop.idx ] = clamp( val, prop );
-		});
-
-		if ( from ) {
-			ret = color( from( local ) );
-			ret[ cache ] = local;
-			return ret;
-		} else {
-			return color( local );
-		}
-	};
-
-	// makes red() green() blue() alpha() hue() saturation() lightness()
-	each( props, function( key, prop ) {
-		// alpha is included in more than one space
-		if ( color.fn[ key ] ) {
-			return;
-		}
-		color.fn[ key ] = function( value ) {
-			var vtype = jQuery.type( value ),
-				fn = ( key === "alpha" ? ( this._hsla ? "hsla" : "rgba" ) : spaceName ),
-				local = this[ fn ](),
-				cur = local[ prop.idx ],
-				match;
-
-			if ( vtype === "undefined" ) {
-				return cur;
-			}
-
-			if ( vtype === "function" ) {
-				value = value.call( this, cur );
-				vtype = jQuery.type( value );
-			}
-			if ( value == null && prop.empty ) {
-				return this;
-			}
-			if ( vtype === "string" ) {
-				match = rplusequals.exec( value );
-				if ( match ) {
-					value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 );
-				}
-			}
-			local[ prop.idx ] = value;
-			return this[ fn ]( local );
-		};
-	});
-});
-
-// add .fx.step functions
-each( stepHooks, function( i, hook ) {
-	jQuery.cssHooks[ hook ] = {
-		set: function( elem, value ) {
-			var parsed, curElem,
-				backgroundColor = "";
-
-			if ( jQuery.type( value ) !== "string" || ( parsed = stringParse( value ) ) ) {
-				value = color( parsed || value );
-				if ( !support.rgba && value._rgba[ 3 ] !== 1 ) {
-					curElem = hook === "backgroundColor" ? elem.parentNode : elem;
-					while (
-						(backgroundColor === "" || backgroundColor === "transparent") &&
-						curElem && curElem.style
-					) {
-						try {
-							backgroundColor = jQuery.css( curElem, "backgroundColor" );
-							curElem = curElem.parentNode;
-						} catch ( e ) {
-						}
-					}
-
-					value = value.blend( backgroundColor && backgroundColor !== "transparent" ?
-						backgroundColor :
-						"_default" );
-				}
-
-				value = value.toRgbaString();
-			}
-			try {
-				elem.style[ hook ] = value;
-			} catch( error ) {
-				// wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit'
-			}
-		}
-	};
-	jQuery.fx.step[ hook ] = function( fx ) {
-		if ( !fx.colorInit ) {
-			fx.start = color( fx.elem, hook );
-			fx.end = color( fx.end );
-			fx.colorInit = true;
-		}
-		jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );
-	};
-});
-
-jQuery.cssHooks.borderColor = {
-	expand: function( value ) {
-		var expanded = {};
-
-		each( [ "Top", "Right", "Bottom", "Left" ], function( i, part ) {
-			expanded[ "border" + part + "Color" ] = value;
-		});
-		return expanded;
-	}
-};
-
-// Basic color names only.
-// Usage of any of the other color names requires adding yourself or including
-// jquery.color.svg-names.js.
-colors = jQuery.Color.names = {
-	// 4.1. Basic color keywords
-	aqua: "#00ffff",
-	black: "#000000",
-	blue: "#0000ff",
-	fuchsia: "#ff00ff",
-	gray: "#808080",
-	green: "#008000",
-	lime: "#00ff00",
-	maroon: "#800000",
-	navy: "#000080",
-	olive: "#808000",
-	purple: "#800080",
-	red: "#ff0000",
-	silver: "#c0c0c0",
-	teal: "#008080",
-	white: "#ffffff",
-	yellow: "#ffff00",
-
-	// 4.2.3. "transparent" color keyword
-	transparent: [ null, null, null, 0 ],
-
-	_default: "#ffffff"
-};
-
-})( jQuery );
-
-
-
-/******************************************************************************/
-/****************************** CLASS ANIMATIONS ******************************/
-/******************************************************************************/
-(function() {
-
-var classAnimationActions = [ "add", "remove", "toggle" ],
-	shorthandStyles = {
-		border: 1,
-		borderBottom: 1,
-		borderColor: 1,
-		borderLeft: 1,
-		borderRight: 1,
-		borderTop: 1,
-		borderWidth: 1,
-		margin: 1,
-		padding: 1
-	};
-
-$.each([ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], function( _, prop ) {
-	$.fx.step[ prop ] = function( fx ) {
-		if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {
-			jQuery.style( fx.elem, prop, fx.end );
-			fx.setAttr = true;
-		}
-	};
-});
-
-function getElementStyles() {
-	var style = this.ownerDocument.defaultView ?
-			this.ownerDocument.defaultView.getComputedStyle( this, null ) :
-			this.currentStyle,
-		newStyle = {},
-		key,
-		len;
-
-	// webkit enumerates style porperties
-	if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {
-		len = style.length;
-		while ( len-- ) {
-			key = style[ len ];
-			if ( typeof style[ key ] === "string" ) {
-				newStyle[ $.camelCase( key ) ] = style[ key ];
-			}
-		}
-	} else {
-		for ( key in style ) {
-			if ( typeof style[ key ] === "string" ) {
-				newStyle[ key ] = style[ key ];
-			}
-		}
-	}
-
-	return newStyle;
-}
-
-
-function styleDifference( oldStyle, newStyle ) {
-	var diff = {},
-		name, value;
-
-	for ( name in newStyle ) {
-		value = newStyle[ name ];
-		if ( oldStyle[ name ] !== value ) {
-			if ( !shorthandStyles[ name ] ) {
-				if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {
-					diff[ name ] = value;
-				}
-			}
-		}
-	}
-
-	return diff;
-}
-
-$.effects.animateClass = function( value, duration, easing, callback ) {
-	var o = $.speed( duration, easing, callback );
-
-	return this.queue( function() {
-		var animated = $( this ),
-			baseClass = animated.attr( "class" ) || "",
-			applyClassChange,
-			allAnimations = o.children ? animated.find( "*" ).andSelf() : animated;
-
-		// map the animated objects to store the original styles.
-		allAnimations = allAnimations.map(function() {
-			var el = $( this );
-			return {
-				el: el,
-				start: getElementStyles.call( this )
-			};
-		});
-
-		// apply class change
-		applyClassChange = function() {
-			$.each( classAnimationActions, function(i, action) {
-				if ( value[ action ] ) {
-					animated[ action + "Class" ]( value[ action ] );
-				}
-			});
-		};
-		applyClassChange();
-
-		// map all animated objects again - calculate new styles and diff
-		allAnimations = allAnimations.map(function() {
-			this.end = getElementStyles.call( this.el[ 0 ] );
-			this.diff = styleDifference( this.start, this.end );
-			return this;
-		});
-
-		// apply original class
-		animated.attr( "class", baseClass );
-
-		// map all animated objects again - this time collecting a promise
-		allAnimations = allAnimations.map(function() {
-			var styleInfo = this,
-				dfd = $.Deferred(),
-				opts = jQuery.extend({}, o, {
-					queue: false,
-					complete: function() {
-						dfd.resolve( styleInfo );
-					}
-				});
-
-			this.el.animate( this.diff, opts );
-			return dfd.promise();
-		});
-
-		// once all animations have completed:
-		$.when.apply( $, allAnimations.get() ).done(function() {
-
-			// set the final class
-			applyClassChange();
-
-			// for each animated element,
-			// clear all css properties that were animated
-			$.each( arguments, function() {
-				var el = this.el;
-				$.each( this.diff, function(key) {
-					el.css( key, '' );
-				});
-			});
-
-			// this is guarnteed to be there if you use jQuery.speed()
-			// it also handles dequeuing the next anim...
-			o.complete.call( animated[ 0 ] );
-		});
-	});
-};
-
-$.fn.extend({
-	_addClass: $.fn.addClass,
-	addClass: function( classNames, speed, easing, callback ) {
-		return speed ?
-			$.effects.animateClass.call( this,
-				{ add: classNames }, speed, easing, callback ) :
-			this._addClass( classNames );
-	},
-
-	_removeClass: $.fn.removeClass,
-	removeClass: function( classNames, speed, easing, callback ) {
-		return speed ?
-			$.effects.animateClass.call( this,
-				{ remove: classNames }, speed, easing, callback ) :
-			this._removeClass( classNames );
-	},
-
-	_toggleClass: $.fn.toggleClass,
-	toggleClass: function( classNames, force, speed, easing, callback ) {
-		if ( typeof force === "boolean" || force === undefined ) {
-			if ( !speed ) {
-				// without speed parameter
-				return this._toggleClass( classNames, force );
-			} else {
-				return $.effects.animateClass.call( this,
-					(force ? { add: classNames } : { remove: classNames }),
-					speed, easing, callback );
-			}
-		} else {
-			// without force parameter
-			return $.effects.animateClass.call( this,
-				{ toggle: classNames }, force, speed, easing );
-		}
-	},
-
-	switchClass: function( remove, add, speed, easing, callback) {
-		return $.effects.animateClass.call( this, {
-			add: add,
-			remove: remove
-		}, speed, easing, callback );
-	}
-});
-
-})();
-
-/******************************************************************************/
-/*********************************** EFFECTS **********************************/
-/******************************************************************************/
-
-(function() {
-
-$.extend( $.effects, {
-	version: "1.9.2",
-
-	// Saves a set of properties in a data storage
-	save: function( element, set ) {
-		for( var i=0; i < set.length; i++ ) {
-			if ( set[ i ] !== null ) {
-				element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );
-			}
-		}
-	},
-
-	// Restores a set of previously saved properties from a data storage
-	restore: function( element, set ) {
-		var val, i;
-		for( i=0; i < set.length; i++ ) {
-			if ( set[ i ] !== null ) {
-				val = element.data( dataSpace + set[ i ] );
-				// support: jQuery 1.6.2
-				// http://bugs.jquery.com/ticket/9917
-				// jQuery 1.6.2 incorrectly returns undefined for any falsy value.
-				// We can't differentiate between "" and 0 here, so we just assume
-				// empty string since it's likely to be a more common value...
-				if ( val === undefined ) {
-					val = "";
-				}
-				element.css( set[ i ], val );
-			}
-		}
-	},
-
-	setMode: function( el, mode ) {
-		if (mode === "toggle") {
-			mode = el.is( ":hidden" ) ? "show" : "hide";
-		}
-		return mode;
-	},
-
-	// Translates a [top,left] array into a baseline value
-	// this should be a little more flexible in the future to handle a string & hash
-	getBaseline: function( origin, original ) {
-		var y, x;
-		switch ( origin[ 0 ] ) {
-			case "top": y = 0; break;
-			case "middle": y = 0.5; break;
-			case "bottom": y = 1; break;
-			default: y = origin[ 0 ] / original.height;
-		}
-		switch ( origin[ 1 ] ) {
-			case "left": x = 0; break;
-			case "center": x = 0.5; break;
-			case "right": x = 1; break;
-			default: x = origin[ 1 ] / original.width;
-		}
-		return {
-			x: x,
-			y: y
-		};
-	},
-
-	// Wraps the element around a wrapper that copies position properties
-	createWrapper: function( element ) {
-
-		// if the element is already wrapped, return it
-		if ( element.parent().is( ".ui-effects-wrapper" )) {
-			return element.parent();
-		}
-
-		// wrap the element
-		var props = {
-				width: element.outerWidth(true),
-				height: element.outerHeight(true),
-				"float": element.css( "float" )
-			},
-			wrapper = $( "<div></div>" )
-				.addClass( "ui-effects-wrapper" )
-				.css({
-					fontSize: "100%",
-					background: "transparent",
-					border: "none",
-					margin: 0,
-					padding: 0
-				}),
-			// Store the size in case width/height are defined in % - Fixes #5245
-			size = {
-				width: element.width(),
-				height: element.height()
-			},
-			active = document.activeElement;
-
-		// support: Firefox
-		// Firefox incorrectly exposes anonymous content
-		// https://bugzilla.mozilla.org/show_bug.cgi?id=561664
-		try {
-			active.id;
-		} catch( e ) {
-			active = document.body;
-		}
-
-		element.wrap( wrapper );
-
-		// Fixes #7595 - Elements lose focus when wrapped.
-		if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-			$( active ).focus();
-		}
-
-		wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element
-
-		// transfer positioning properties to the wrapper
-		if ( element.css( "position" ) === "static" ) {
-			wrapper.css({ position: "relative" });
-			element.css({ position: "relative" });
-		} else {
-			$.extend( props, {
-				position: element.css( "position" ),
-				zIndex: element.css( "z-index" )
-			});
-			$.each([ "top", "left", "bottom", "right" ], function(i, pos) {
-				props[ pos ] = element.css( pos );
-				if ( isNaN( parseInt( props[ pos ], 10 ) ) ) {
-					props[ pos ] = "auto";
-				}
-			});
-			element.css({
-				position: "relative",
-				top: 0,
-				left: 0,
-				right: "auto",
-				bottom: "auto"
-			});
-		}
-		element.css(size);
-
-		return wrapper.css( props ).show();
-	},
-
-	removeWrapper: function( element ) {
-		var active = document.activeElement;
-
-		if ( element.parent().is( ".ui-effects-wrapper" ) ) {
-			element.parent().replaceWith( element );
-
-			// Fixes #7595 - Elements lose focus when wrapped.
-			if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {
-				$( active ).focus();
-			}
-		}
-
-
-		return element;
-	},
-
-	setTransition: function( element, list, factor, value ) {
-		value = value || {};
-		$.each( list, function( i, x ) {
-			var unit = element.cssUnit( x );
-			if ( unit[ 0 ] > 0 ) {
-				value[ x ] = unit[ 0 ] * factor + unit[ 1 ];
-			}
-		});
-		return value;
-	}
-});
-
-// return an effect options object for the given parameters:
-function _normalizeArguments( effect, options, speed, callback ) {
-
-	// allow passing all options as the first parameter
-	if ( $.isPlainObject( effect ) ) {
-		options = effect;
-		effect = effect.effect;
-	}
-
-	// convert to an object
-	effect = { effect: effect };
-
-	// catch (effect, null, ...)
-	if ( options == null ) {
-		options = {};
-	}
-
-	// catch (effect, callback)
-	if ( $.isFunction( options ) ) {
-		callback = options;
-		speed = null;
-		options = {};
-	}
-
-	// catch (effect, speed, ?)
-	if ( typeof options === "number" || $.fx.speeds[ options ] ) {
-		callback = speed;
-		speed = options;
-		options = {};
-	}
-
-	// catch (effect, options, callback)
-	if ( $.isFunction( speed ) ) {
-		callback = speed;
-		speed = null;
-	}
-
-	// add options to effect
-	if ( options ) {
-		$.extend( effect, options );
-	}
-
-	speed = speed || options.duration;
-	effect.duration = $.fx.off ? 0 :
-		typeof speed === "number" ? speed :
-		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
-		$.fx.speeds._default;
-
-	effect.complete = callback || options.complete;
-
-	return effect;
-}
-
-function standardSpeed( speed ) {
-	// valid standard speeds
-	if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) {
-		return true;
-	}
-
-	// invalid strings - treat as "normal" speed
-	if ( typeof speed === "string" && !$.effects.effect[ speed ] ) {
-		// TODO: remove in 2.0 (#7115)
-		if ( backCompat && $.effects[ speed ] ) {
-			return false;
-		}
-		return true;
-	}
-
-	return false;
-}
-
-$.fn.extend({
-	effect: function( /* effect, options, speed, callback */ ) {
-		var args = _normalizeArguments.apply( this, arguments ),
-			mode = args.mode,
-			queue = args.queue,
-			effectMethod = $.effects.effect[ args.effect ],
-
-			// DEPRECATED: remove in 2.0 (#7115)
-			oldEffectMethod = !effectMethod && backCompat && $.effects[ args.effect ];
-
-		if ( $.fx.off || !( effectMethod || oldEffectMethod ) ) {
-			// delegate to the original method (e.g., .show()) if possible
-			if ( mode ) {
-				return this[ mode ]( args.duration, args.complete );
-			} else {
-				return this.each( function() {
-					if ( args.complete ) {
-						args.complete.call( this );
-					}
-				});
-			}
-		}
-
-		function run( next ) {
-			var elem = $( this ),
-				complete = args.complete,
-				mode = args.mode;
-
-			function done() {
-				if ( $.isFunction( complete ) ) {
-					complete.call( elem[0] );
-				}
-				if ( $.isFunction( next ) ) {
-					next();
-				}
-			}
-
-			// if the element is hiddden and mode is hide,
-			// or element is visible and mode is show
-			if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) {
-				done();
-			} else {
-				effectMethod.call( elem[0], args, done );
-			}
-		}
-
-		// TODO: remove this check in 2.0, effectMethod will always be true
-		if ( effectMethod ) {
-			return queue === false ? this.each( run ) : this.queue( queue || "fx", run );
-		} else {
-			// DEPRECATED: remove in 2.0 (#7115)
-			return oldEffectMethod.call(this, {
-				options: args,
-				duration: args.duration,
-				callback: args.complete,
-				mode: args.mode
-			});
-		}
-	},
-
-	_show: $.fn.show,
-	show: function( speed ) {
-		if ( standardSpeed( speed ) ) {
-			return this._show.apply( this, arguments );
-		} else {
-			var args = _normalizeArguments.apply( this, arguments );
-			args.mode = "show";
-			return this.effect.call( this, args );
-		}
-	},
-
-	_hide: $.fn.hide,
-	hide: function( speed ) {
-		if ( standardSpeed( speed ) ) {
-			return this._hide.apply( this, arguments );
-		} else {
-			var args = _normalizeArguments.apply( this, arguments );
-			args.mode = "hide";
-			return this.effect.call( this, args );
-		}
-	},
-
-	// jQuery core overloads toggle and creates _toggle
-	__toggle: $.fn.toggle,
-	toggle: function( speed ) {
-		if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) {
-			return this.__toggle.apply( this, arguments );
-		} else {
-			var args = _normalizeArguments.apply( this, arguments );
-			args.mode = "toggle";
-			return this.effect.call( this, args );
-		}
-	},
-
-	// helper functions
-	cssUnit: function(key) {
-		var style = this.css( key ),
-			val = [];
-
-		$.each( [ "em", "px", "%", "pt" ], function( i, unit ) {
-			if ( style.indexOf( unit ) > 0 ) {
-				val = [ parseFloat( style ), unit ];
-			}
-		});
-		return val;
-	}
-});
-
-})();
-
-/******************************************************************************/
-/*********************************** EASING ***********************************/
-/******************************************************************************/
-
-(function() {
-
-// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)
-
-var baseEasings = {};
-
-$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) {
-	baseEasings[ name ] = function( p ) {
-		return Math.pow( p, i + 2 );
-	};
-});
-
-$.extend( baseEasings, {
-	Sine: function ( p ) {
-		return 1 - Math.cos( p * Math.PI / 2 );
-	},
-	Circ: function ( p ) {
-		return 1 - Math.sqrt( 1 - p * p );
-	},
-	Elastic: function( p ) {
-		return p === 0 || p === 1 ? p :
-			-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );
-	},
-	Back: function( p ) {
-		return p * p * ( 3 * p - 2 );
-	},
-	Bounce: function ( p ) {
-		var pow2,
-			bounce = 4;
-
-		while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}
-		return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );
-	}
-});
-
-$.each( baseEasings, function( name, easeIn ) {
-	$.easing[ "easeIn" + name ] = easeIn;
-	$.easing[ "easeOut" + name ] = function( p ) {
-		return 1 - easeIn( 1 - p );
-	};
-	$.easing[ "easeInOut" + name ] = function( p ) {
-		return p < 0.5 ?
-			easeIn( p * 2 ) / 2 :
-			1 - easeIn( p * -2 + 2 ) / 2;
-	};
-});
-
-})();
-
-})(jQuery));
-
-(function( $, undefined ) {
-
-var uid = 0,
-	hideProps = {},
-	showProps = {};
-
-hideProps.height = hideProps.paddingTop = hideProps.paddingBottom =
-	hideProps.borderTopWidth = hideProps.borderBottomWidth = "hide";
-showProps.height = showProps.paddingTop = showProps.paddingBottom =
-	showProps.borderTopWidth = showProps.borderBottomWidth = "show";
-
-$.widget( "ui.accordion", {
-	version: "1.9.2",
-	options: {
-		active: 0,
-		animate: {},
-		collapsible: false,
-		event: "click",
-		header: "> li > :first-child,> :not(li):even",
-		heightStyle: "auto",
-		icons: {
-			activeHeader: "ui-icon-triangle-1-s",
-			header: "ui-icon-triangle-1-e"
-		},
-
-		// callbacks
-		activate: null,
-		beforeActivate: null
-	},
-
-	_create: function() {
-		var accordionId = this.accordionId = "ui-accordion-" +
-				(this.element.attr( "id" ) || ++uid),
-			options = this.options;
-
-		this.prevShow = this.prevHide = $();
-		this.element.addClass( "ui-accordion ui-widget ui-helper-reset" );
-
-		this.headers = this.element.find( options.header )
-			.addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" );
-		this._hoverable( this.headers );
-		this._focusable( this.headers );
-
-		this.headers.next()
-			.addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" )
-			.hide();
-
-		// don't allow collapsible: false and active: false / null
-		if ( !options.collapsible && (options.active === false || options.active == null) ) {
-			options.active = 0;
-		}
-		// handle negative values
-		if ( options.active < 0 ) {
-			options.active += this.headers.length;
-		}
-		this.active = this._findActive( options.active )
-			.addClass( "ui-accordion-header-active ui-state-active" )
-			.toggleClass( "ui-corner-all ui-corner-top" );
-		this.active.next()
-			.addClass( "ui-accordion-content-active" )
-			.show();
-
-		this._createIcons();
-		this.refresh();
-
-		// ARIA
-		this.element.attr( "role", "tablist" );
-
-		this.headers
-			.attr( "role", "tab" )
-			.each(function( i ) {
-				var header = $( this ),
-					headerId = header.attr( "id" ),
-					panel = header.next(),
-					panelId = panel.attr( "id" );
-				if ( !headerId ) {
-					headerId = accordionId + "-header-" + i;
-					header.attr( "id", headerId );
-				}
-				if ( !panelId ) {
-					panelId = accordionId + "-panel-" + i;
-					panel.attr( "id", panelId );
-				}
-				header.attr( "aria-controls", panelId );
-				panel.attr( "aria-labelledby", headerId );
-			})
-			.next()
-				.attr( "role", "tabpanel" );
-
-		this.headers
-			.not( this.active )
-			.attr({
-				"aria-selected": "false",
-				tabIndex: -1
-			})
-			.next()
-				.attr({
-					"aria-expanded": "false",
-					"aria-hidden": "true"
-				})
-				.hide();
-
-		// make sure at least one header is in the tab order
-		if ( !this.active.length ) {
-			this.headers.eq( 0 ).attr( "tabIndex", 0 );
-		} else {
-			this.active.attr({
-				"aria-selected": "true",
-				tabIndex: 0
-			})
-			.next()
-				.attr({
-					"aria-expanded": "true",
-					"aria-hidden": "false"
-				});
-		}
-
-		this._on( this.headers, { keydown: "_keydown" });
-		this._on( this.headers.next(), { keydown: "_panelKeyDown" });
-		this._setupEvents( options.event );
-	},
-
-	_getCreateEventData: function() {
-		return {
-			header: this.active,
-			content: !this.active.length ? $() : this.active.next()
-		};
-	},
-
-	_createIcons: function() {
-		var icons = this.options.icons;
-		if ( icons ) {
-			$( "<span>" )
-				.addClass( "ui-accordion-header-icon ui-icon " + icons.header )
-				.prependTo( this.headers );
-			this.active.children( ".ui-accordion-header-icon" )
-				.removeClass( icons.header )
-				.addClass( icons.activeHeader );
-			this.headers.addClass( "ui-accordion-icons" );
-		}
-	},
-
-	_destroyIcons: function() {
-		this.headers
-			.removeClass( "ui-accordion-icons" )
-			.children( ".ui-accordion-header-icon" )
-				.remove();
-	},
-
-	_destroy: function() {
-		var contents;
-
-		// clean up main element
-		this.element
-			.removeClass( "ui-accordion ui-widget ui-helper-reset" )
-			.removeAttr( "role" );
-
-		// clean up headers
-		this.headers
-			.removeClass( "ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top" )
-			.removeAttr( "role" )
-			.removeAttr( "aria-selected" )
-			.removeAttr( "aria-controls" )
-			.removeAttr( "tabIndex" )
-			.each(function() {
-				if ( /^ui-accordion/.test( this.id ) ) {
-					this.removeAttribute( "id" );
-				}
-			});
-		this._destroyIcons();
-
-		// clean up content panels
-		contents = this.headers.next()
-			.css( "display", "" )
-			.removeAttr( "role" )
-			.removeAttr( "aria-expanded" )
-			.removeAttr( "aria-hidden" )
-			.removeAttr( "aria-labelledby" )
-			.removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled" )
-			.each(function() {
-				if ( /^ui-accordion/.test( this.id ) ) {
-					this.removeAttribute( "id" );
-				}
-			});
-		if ( this.options.heightStyle !== "content" ) {
-			contents.css( "height", "" );
-		}
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "active" ) {
-			// _activate() will handle invalid values and update this.options
-			this._activate( value );
-			return;
-		}
-
-		if ( key === "event" ) {
-			if ( this.options.event ) {
-				this._off( this.headers, this.options.event );
-			}
-			this._setupEvents( value );
-		}
-
-		this._super( key, value );
-
-		// setting collapsible: false while collapsed; open first panel
-		if ( key === "collapsible" && !value && this.options.active === false ) {
-			this._activate( 0 );
-		}
-
-		if ( key === "icons" ) {
-			this._destroyIcons();
-			if ( value ) {
-				this._createIcons();
-			}
-		}
-
-		// #5332 - opacity doesn't cascade to positioned elements in IE
-		// so we need to add the disabled class to the headers and panels
-		if ( key === "disabled" ) {
-			this.headers.add( this.headers.next() )
-				.toggleClass( "ui-state-disabled", !!value );
-		}
-	},
-
-	_keydown: function( event ) {
-		if ( event.altKey || event.ctrlKey ) {
-			return;
-		}
-
-		var keyCode = $.ui.keyCode,
-			length = this.headers.length,
-			currentIndex = this.headers.index( event.target ),
-			toFocus = false;
-
-		switch ( event.keyCode ) {
-			case keyCode.RIGHT:
-			case keyCode.DOWN:
-				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
-				break;
-			case keyCode.LEFT:
-			case keyCode.UP:
-				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
-				break;
-			case keyCode.SPACE:
-			case keyCode.ENTER:
-				this._eventHandler( event );
-				break;
-			case keyCode.HOME:
-				toFocus = this.headers[ 0 ];
-				break;
-			case keyCode.END:
-				toFocus = this.headers[ length - 1 ];
-				break;
-		}
-
-		if ( toFocus ) {
-			$( event.target ).attr( "tabIndex", -1 );
-			$( toFocus ).attr( "tabIndex", 0 );
-			toFocus.focus();
-			event.preventDefault();
-		}
-	},
-
-	_panelKeyDown : function( event ) {
-		if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {
-			$( event.currentTarget ).prev().focus();
-		}
-	},
-
-	refresh: function() {
-		var maxHeight, overflow,
-			heightStyle = this.options.heightStyle,
-			parent = this.element.parent();
-
-
-		if ( heightStyle === "fill" ) {
-			// IE 6 treats height like minHeight, so we need to turn off overflow
-			// in order to get a reliable height
-			// we use the minHeight support test because we assume that only
-			// browsers that don't support minHeight will treat height as minHeight
-			if ( !$.support.minHeight ) {
-				overflow = parent.css( "overflow" );
-				parent.css( "overflow", "hidden");
-			}
-			maxHeight = parent.height();
-			this.element.siblings( ":visible" ).each(function() {
-				var elem = $( this ),
-					position = elem.css( "position" );
-
-				if ( position === "absolute" || position === "fixed" ) {
-					return;
-				}
-				maxHeight -= elem.outerHeight( true );
-			});
-			if ( overflow ) {
-				parent.css( "overflow", overflow );
-			}
-
-			this.headers.each(function() {
-				maxHeight -= $( this ).outerHeight( true );
-			});
-
-			this.headers.next()
-				.each(function() {
-					$( this ).height( Math.max( 0, maxHeight -
-						$( this ).innerHeight() + $( this ).height() ) );
-				})
-				.css( "overflow", "auto" );
-		} else if ( heightStyle === "auto" ) {
-			maxHeight = 0;
-			this.headers.next()
-				.each(function() {
-					maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() );
-				})
-				.height( maxHeight );
-		}
-	},
-
-	_activate: function( index ) {
-		var active = this._findActive( index )[ 0 ];
-
-		// trying to activate the already active panel
-		if ( active === this.active[ 0 ] ) {
-			return;
-		}
-
-		// trying to collapse, simulate a click on the currently active header
-		active = active || this.active[ 0 ];
-
-		this._eventHandler({
-			target: active,
-			currentTarget: active,
-			preventDefault: $.noop
-		});
-	},
-
-	_findActive: function( selector ) {
-		return typeof selector === "number" ? this.headers.eq( selector ) : $();
-	},
-
-	_setupEvents: function( event ) {
-		var events = {};
-		if ( !event ) {
-			return;
-		}
-		$.each( event.split(" "), function( index, eventName ) {
-			events[ eventName ] = "_eventHandler";
-		});
-		this._on( this.headers, events );
-	},
-
-	_eventHandler: function( event ) {
-		var options = this.options,
-			active = this.active,
-			clicked = $( event.currentTarget ),
-			clickedIsActive = clicked[ 0 ] === active[ 0 ],
-			collapsing = clickedIsActive && options.collapsible,
-			toShow = collapsing ? $() : clicked.next(),
-			toHide = active.next(),
-			eventData = {
-				oldHeader: active,
-				oldPanel: toHide,
-				newHeader: collapsing ? $() : clicked,
-				newPanel: toShow
-			};
-
-		event.preventDefault();
-
-		if (
-				// click on active header, but not collapsible
-				( clickedIsActive && !options.collapsible ) ||
-				// allow canceling activation
-				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
-			return;
-		}
-
-		options.active = collapsing ? false : this.headers.index( clicked );
-
-		// when the call to ._toggle() comes after the class changes
-		// it causes a very odd bug in IE 8 (see #6720)
-		this.active = clickedIsActive ? $() : clicked;
-		this._toggle( eventData );
-
-		// switch classes
-		// corner classes on the previously active header stay after the animation
-		active.removeClass( "ui-accordion-header-active ui-state-active" );
-		if ( options.icons ) {
-			active.children( ".ui-accordion-header-icon" )
-				.removeClass( options.icons.activeHeader )
-				.addClass( options.icons.header );
-		}
-
-		if ( !clickedIsActive ) {
-			clicked
-				.removeClass( "ui-corner-all" )
-				.addClass( "ui-accordion-header-active ui-state-active ui-corner-top" );
-			if ( options.icons ) {
-				clicked.children( ".ui-accordion-header-icon" )
-					.removeClass( options.icons.header )
-					.addClass( options.icons.activeHeader );
-			}
-
-			clicked
-				.next()
-				.addClass( "ui-accordion-content-active" );
-		}
-	},
-
-	_toggle: function( data ) {
-		var toShow = data.newPanel,
-			toHide = this.prevShow.length ? this.prevShow : data.oldPanel;
-
-		// handle activating a panel during the animation for another activation
-		this.prevShow.add( this.prevHide ).stop( true, true );
-		this.prevShow = toShow;
-		this.prevHide = toHide;
-
-		if ( this.options.animate ) {
-			this._animate( toShow, toHide, data );
-		} else {
-			toHide.hide();
-			toShow.show();
-			this._toggleComplete( data );
-		}
-
-		toHide.attr({
-			"aria-expanded": "false",
-			"aria-hidden": "true"
-		});
-		toHide.prev().attr( "aria-selected", "false" );
-		// if we're switching panels, remove the old header from the tab order
-		// if we're opening from collapsed state, remove the previous header from the tab order
-		// if we're collapsing, then keep the collapsing header in the tab order
-		if ( toShow.length && toHide.length ) {
-			toHide.prev().attr( "tabIndex", -1 );
-		} else if ( toShow.length ) {
-			this.headers.filter(function() {
-				return $( this ).attr( "tabIndex" ) === 0;
-			})
-			.attr( "tabIndex", -1 );
-		}
-
-		toShow
-			.attr({
-				"aria-expanded": "true",
-				"aria-hidden": "false"
-			})
-			.prev()
-				.attr({
-					"aria-selected": "true",
-					tabIndex: 0
-				});
-	},
-
-	_animate: function( toShow, toHide, data ) {
-		var total, easing, duration,
-			that = this,
-			adjust = 0,
-			down = toShow.length &&
-				( !toHide.length || ( toShow.index() < toHide.index() ) ),
-			animate = this.options.animate || {},
-			options = down && animate.down || animate,
-			complete = function() {
-				that._toggleComplete( data );
-			};
-
-		if ( typeof options === "number" ) {
-			duration = options;
-		}
-		if ( typeof options === "string" ) {
-			easing = options;
-		}
-		// fall back from options to animation in case of partial down settings
-		easing = easing || options.easing || animate.easing;
-		duration = duration || options.duration || animate.duration;
-
-		if ( !toHide.length ) {
-			return toShow.animate( showProps, duration, easing, complete );
-		}
-		if ( !toShow.length ) {
-			return toHide.animate( hideProps, duration, easing, complete );
-		}
-
-		total = toShow.show().outerHeight();
-		toHide.animate( hideProps, {
-			duration: duration,
-			easing: easing,
-			step: function( now, fx ) {
-				fx.now = Math.round( now );
-			}
-		});
-		toShow
-			.hide()
-			.animate( showProps, {
-				duration: duration,
-				easing: easing,
-				complete: complete,
-				step: function( now, fx ) {
-					fx.now = Math.round( now );
-					if ( fx.prop !== "height" ) {
-						adjust += fx.now;
-					} else if ( that.options.heightStyle !== "content" ) {
-						fx.now = Math.round( total - toHide.outerHeight() - adjust );
-						adjust = 0;
-					}
-				}
-			});
-	},
-
-	_toggleComplete: function( data ) {
-		var toHide = data.oldPanel;
-
-		toHide
-			.removeClass( "ui-accordion-content-active" )
-			.prev()
-				.removeClass( "ui-corner-top" )
-				.addClass( "ui-corner-all" );
-
-		// Work around for rendering bug in IE (#5421)
-		if ( toHide.length ) {
-			toHide.parent()[0].className = toHide.parent()[0].className;
-		}
-
-		this._trigger( "activate", null, data );
-	}
-});
-
-
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
-	// navigation options
-	(function( $, prototype ) {
-		$.extend( prototype.options, {
-			navigation: false,
-			navigationFilter: function() {
-				return this.href.toLowerCase() === location.href.toLowerCase();
-			}
-		});
-
-		var _create = prototype._create;
-		prototype._create = function() {
-			if ( this.options.navigation ) {
-				var that = this,
-					headers = this.element.find( this.options.header ),
-					content = headers.next(),
-					current = headers.add( content )
-						.find( "a" )
-						.filter( this.options.navigationFilter )
-						[ 0 ];
-				if ( current ) {
-					headers.add( content ).each( function( index ) {
-						if ( $.contains( this, current ) ) {
-							that.options.active = Math.floor( index / 2 );
-							return false;
-						}
-					});
-				}
-			}
-			_create.call( this );
-		};
-	}( jQuery, jQuery.ui.accordion.prototype ) );
-
-	// height options
-	(function( $, prototype ) {
-		$.extend( prototype.options, {
-			heightStyle: null, // remove default so we fall back to old values
-			autoHeight: true, // use heightStyle: "auto"
-			clearStyle: false, // use heightStyle: "content"
-			fillSpace: false // use heightStyle: "fill"
-		});
-
-		var _create = prototype._create,
-			_setOption = prototype._setOption;
-
-		$.extend( prototype, {
-			_create: function() {
-				this.options.heightStyle = this.options.heightStyle ||
-					this._mergeHeightStyle();
-
-				_create.call( this );
-			},
-
-			_setOption: function( key ) {
-				if ( key === "autoHeight" || key === "clearStyle" || key === "fillSpace" ) {
-					this.options.heightStyle = this._mergeHeightStyle();
-				}
-				_setOption.apply( this, arguments );
-			},
-
-			_mergeHeightStyle: function() {
-				var options = this.options;
-
-				if ( options.fillSpace ) {
-					return "fill";
-				}
-
-				if ( options.clearStyle ) {
-					return "content";
-				}
-
-				if ( options.autoHeight ) {
-					return "auto";
-				}
-			}
-		});
-	}( jQuery, jQuery.ui.accordion.prototype ) );
-
-	// icon options
-	(function( $, prototype ) {
-		$.extend( prototype.options.icons, {
-			activeHeader: null, // remove default so we fall back to old values
-			headerSelected: "ui-icon-triangle-1-s"
-		});
-
-		var _createIcons = prototype._createIcons;
-		prototype._createIcons = function() {
-			if ( this.options.icons ) {
-				this.options.icons.activeHeader = this.options.icons.activeHeader ||
-					this.options.icons.headerSelected;
-			}
-			_createIcons.call( this );
-		};
-	}( jQuery, jQuery.ui.accordion.prototype ) );
-
-	// expanded active option, activate method
-	(function( $, prototype ) {
-		prototype.activate = prototype._activate;
-
-		var _findActive = prototype._findActive;
-		prototype._findActive = function( index ) {
-			if ( index === -1 ) {
-				index = false;
-			}
-			if ( index && typeof index !== "number" ) {
-				index = this.headers.index( this.headers.filter( index ) );
-				if ( index === -1 ) {
-					index = false;
-				}
-			}
-			return _findActive.call( this, index );
-		};
-	}( jQuery, jQuery.ui.accordion.prototype ) );
-
-	// resize method
-	jQuery.ui.accordion.prototype.resize = jQuery.ui.accordion.prototype.refresh;
-
-	// change events
-	(function( $, prototype ) {
-		$.extend( prototype.options, {
-			change: null,
-			changestart: null
-		});
-
-		var _trigger = prototype._trigger;
-		prototype._trigger = function( type, event, data ) {
-			var ret = _trigger.apply( this, arguments );
-			if ( !ret ) {
-				return false;
-			}
-
-			if ( type === "beforeActivate" ) {
-				ret = _trigger.call( this, "changestart", event, {
-					oldHeader: data.oldHeader,
-					oldContent: data.oldPanel,
-					newHeader: data.newHeader,
-					newContent: data.newPanel
-				});
-			} else if ( type === "activate" ) {
-				ret = _trigger.call( this, "change", event, {
-					oldHeader: data.oldHeader,
-					oldContent: data.oldPanel,
-					newHeader: data.newHeader,
-					newContent: data.newPanel
-				});
-			}
-			return ret;
-		};
-	}( jQuery, jQuery.ui.accordion.prototype ) );
-
-	// animated option
-	// NOTE: this only provides support for "slide", "bounceslide", and easings
-	// not the full $.ui.accordion.animations API
-	(function( $, prototype ) {
-		$.extend( prototype.options, {
-			animate: null,
-			animated: "slide"
-		});
-
-		var _create = prototype._create;
-		prototype._create = function() {
-			var options = this.options;
-			if ( options.animate === null ) {
-				if ( !options.animated ) {
-					options.animate = false;
-				} else if ( options.animated === "slide" ) {
-					options.animate = 300;
-				} else if ( options.animated === "bounceslide" ) {
-					options.animate = {
-						duration: 200,
-						down: {
-							easing: "easeOutBounce",
-							duration: 1000
-						}
-					};
-				} else {
-					options.animate = options.animated;
-				}
-			}
-
-			_create.call( this );
-		};
-	}( jQuery, jQuery.ui.accordion.prototype ) );
-}
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-// used to prevent race conditions with remote data sources
-var requestIndex = 0;
-
-$.widget( "ui.autocomplete", {
-	version: "1.9.2",
-	defaultElement: "<input>",
-	options: {
-		appendTo: "body",
-		autoFocus: false,
-		delay: 300,
-		minLength: 1,
-		position: {
-			my: "left top",
-			at: "left bottom",
-			collision: "none"
-		},
-		source: null,
-
-		// callbacks
-		change: null,
-		close: null,
-		focus: null,
-		open: null,
-		response: null,
-		search: null,
-		select: null
-	},
-
-	pending: 0,
-
-	_create: function() {
-		// Some browsers only repeat keydown events, not keypress events,
-		// so we use the suppressKeyPress flag to determine if we've already
-		// handled the keydown event. #7269
-		// Unfortunately the code for & in keypress is the same as the up arrow,
-		// so we use the suppressKeyPressRepeat flag to avoid handling keypress
-		// events when we know the keydown event was used to modify the
-		// search term. #7799
-		var suppressKeyPress, suppressKeyPressRepeat, suppressInput;
-
-		this.isMultiLine = this._isMultiLine();
-		this.valueMethod = this.element[ this.element.is( "input,textarea" ) ? "val" : "text" ];
-		this.isNewMenu = true;
-
-		this.element
-			.addClass( "ui-autocomplete-input" )
-			.attr( "autocomplete", "off" );
-
-		this._on( this.element, {
-			keydown: function( event ) {
-				if ( this.element.prop( "readOnly" ) ) {
-					suppressKeyPress = true;
-					suppressInput = true;
-					suppressKeyPressRepeat = true;
-					return;
-				}
-
-				suppressKeyPress = false;
-				suppressInput = false;
-				suppressKeyPressRepeat = false;
-				var keyCode = $.ui.keyCode;
-				switch( event.keyCode ) {
-				case keyCode.PAGE_UP:
-					suppressKeyPress = true;
-					this._move( "previousPage", event );
-					break;
-				case keyCode.PAGE_DOWN:
-					suppressKeyPress = true;
-					this._move( "nextPage", event );
-					break;
-				case keyCode.UP:
-					suppressKeyPress = true;
-					this._keyEvent( "previous", event );
-					break;
-				case keyCode.DOWN:
-					suppressKeyPress = true;
-					this._keyEvent( "next", event );
-					break;
-				case keyCode.ENTER:
-				case keyCode.NUMPAD_ENTER:
-					// when menu is open and has focus
-					if ( this.menu.active ) {
-						// #6055 - Opera still allows the keypress to occur
-						// which causes forms to submit
-						suppressKeyPress = true;
-						event.preventDefault();
-						this.menu.select( event );
-					}
-					break;
-				case keyCode.TAB:
-					if ( this.menu.active ) {
-						this.menu.select( event );
-					}
-					break;
-				case keyCode.ESCAPE:
-					if ( this.menu.element.is( ":visible" ) ) {
-						this._value( this.term );
-						this.close( event );
-						// Different browsers have different default behavior for escape
-						// Single press can mean undo or clear
-						// Double press in IE means clear the whole form
-						event.preventDefault();
-					}
-					break;
-				default:
-					suppressKeyPressRepeat = true;
-					// search timeout should be triggered before the input value is changed
-					this._searchTimeout( event );
-					break;
-				}
-			},
-			keypress: function( event ) {
-				if ( suppressKeyPress ) {
-					suppressKeyPress = false;
-					event.preventDefault();
-					return;
-				}
-				if ( suppressKeyPressRepeat ) {
-					return;
-				}
-
-				// replicate some key handlers to allow them to repeat in Firefox and Opera
-				var keyCode = $.ui.keyCode;
-				switch( event.keyCode ) {
-				case keyCode.PAGE_UP:
-					this._move( "previousPage", event );
-					break;
-				case keyCode.PAGE_DOWN:
-					this._move( "nextPage", event );
-					break;
-				case keyCode.UP:
-					this._keyEvent( "previous", event );
-					break;
-				case keyCode.DOWN:
-					this._keyEvent( "next", event );
-					break;
-				}
-			},
-			input: function( event ) {
-				if ( suppressInput ) {
-					suppressInput = false;
-					event.preventDefault();
-					return;
-				}
-				this._searchTimeout( event );
-			},
-			focus: function() {
-				this.selectedItem = null;
-				this.previous = this._value();
-			},
-			blur: function( event ) {
-				if ( this.cancelBlur ) {
-					delete this.cancelBlur;
-					return;
-				}
-
-				clearTimeout( this.searching );
-				this.close( event );
-				this._change( event );
-			}
-		});
-
-		this._initSource();
-		this.menu = $( "<ul>" )
-			.addClass( "ui-autocomplete" )
-			.appendTo( this.document.find( this.options.appendTo || "body" )[ 0 ] )
-			.menu({
-				// custom key handling for now
-				input: $(),
-				// disable ARIA support, the live region takes care of that
-				role: null
-			})
-			.zIndex( this.element.zIndex() + 1 )
-			.hide()
-			.data( "menu" );
-
-		this._on( this.menu.element, {
-			mousedown: function( event ) {
-				// prevent moving focus out of the text field
-				event.preventDefault();
-
-				// IE doesn't prevent moving focus even with event.preventDefault()
-				// so we set a flag to know when we should ignore the blur event
-				this.cancelBlur = true;
-				this._delay(function() {
-					delete this.cancelBlur;
-				});
-
-				// clicking on the scrollbar causes focus to shift to the body
-				// but we can't detect a mouseup or a click immediately afterward
-				// so we have to track the next mousedown and close the menu if
-				// the user clicks somewhere outside of the autocomplete
-				var menuElement = this.menu.element[ 0 ];
-				if ( !$( event.target ).closest( ".ui-menu-item" ).length ) {
-					this._delay(function() {
-						var that = this;
-						this.document.one( "mousedown", function( event ) {
-							if ( event.target !== that.element[ 0 ] &&
-									event.target !== menuElement &&
-									!$.contains( menuElement, event.target ) ) {
-								that.close();
-							}
-						});
-					});
-				}
-			},
-			menufocus: function( event, ui ) {
-				// #7024 - Prevent accidental activation of menu items in Firefox
-				if ( this.isNewMenu ) {
-					this.isNewMenu = false;
-					if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {
-						this.menu.blur();
-
-						this.document.one( "mousemove", function() {
-							$( event.target ).trigger( event.originalEvent );
-						});
-
-						return;
-					}
-				}
-
-				// back compat for _renderItem using item.autocomplete, via #7810
-				// TODO remove the fallback, see #8156
-				var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" );
-				if ( false !== this._trigger( "focus", event, { item: item } ) ) {
-					// use value to match what will end up in the input, if it was a key event
-					if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {
-						this._value( item.value );
-					}
-				} else {
-					// Normally the input is populated with the item's value as the
-					// menu is navigated, causing screen readers to notice a change and
-					// announce the item. Since the focus event was canceled, this doesn't
-					// happen, so we update the live region so that screen readers can
-					// still notice the change and announce it.
-					this.liveRegion.text( item.value );
-				}
-			},
-			menuselect: function( event, ui ) {
-				// back compat for _renderItem using item.autocomplete, via #7810
-				// TODO remove the fallback, see #8156
-				var item = ui.item.data( "ui-autocomplete-item" ) || ui.item.data( "item.autocomplete" ),
-					previous = this.previous;
-
-				// only trigger when focus was lost (click on menu)
-				if ( this.element[0] !== this.document[0].activeElement ) {
-					this.element.focus();
-					this.previous = previous;
-					// #6109 - IE triggers two focus events and the second
-					// is asynchronous, so we need to reset the previous
-					// term synchronously and asynchronously :-(
-					this._delay(function() {
-						this.previous = previous;
-						this.selectedItem = item;
-					});
-				}
-
-				if ( false !== this._trigger( "select", event, { item: item } ) ) {
-					this._value( item.value );
-				}
-				// reset the term after the select event
-				// this allows custom select handling to work properly
-				this.term = this._value();
-
-				this.close( event );
-				this.selectedItem = item;
-			}
-		});
-
-		this.liveRegion = $( "<span>", {
-				role: "status",
-				"aria-live": "polite"
-			})
-			.addClass( "ui-helper-hidden-accessible" )
-			.insertAfter( this.element );
-
-		if ( $.fn.bgiframe ) {
-			this.menu.element.bgiframe();
-		}
-
-		// turning off autocomplete prevents the browser from remembering the
-		// value when navigating through history, so we re-enable autocomplete
-		// if the page is unloaded before the widget is destroyed. #7790
-		this._on( this.window, {
-			beforeunload: function() {
-				this.element.removeAttr( "autocomplete" );
-			}
-		});
-	},
-
-	_destroy: function() {
-		clearTimeout( this.searching );
-		this.element
-			.removeClass( "ui-autocomplete-input" )
-			.removeAttr( "autocomplete" );
-		this.menu.element.remove();
-		this.liveRegion.remove();
-	},
-
-	_setOption: function( key, value ) {
-		this._super( key, value );
-		if ( key === "source" ) {
-			this._initSource();
-		}
-		if ( key === "appendTo" ) {
-			this.menu.element.appendTo( this.document.find( value || "body" )[0] );
-		}
-		if ( key === "disabled" && value && this.xhr ) {
-			this.xhr.abort();
-		}
-	},
-
-	_isMultiLine: function() {
-		// Textareas are always multi-line
-		if ( this.element.is( "textarea" ) ) {
-			return true;
-		}
-		// Inputs are always single-line, even if inside a contentEditable element
-		// IE also treats inputs as contentEditable
-		if ( this.element.is( "input" ) ) {
-			return false;
-		}
-		// All other element types are determined by whether or not they're contentEditable
-		return this.element.prop( "isContentEditable" );
-	},
-
-	_initSource: function() {
-		var array, url,
-			that = this;
-		if ( $.isArray(this.options.source) ) {
-			array = this.options.source;
-			this.source = function( request, response ) {
-				response( $.ui.autocomplete.filter( array, request.term ) );
-			};
-		} else if ( typeof this.options.source === "string" ) {
-			url = this.options.source;
-			this.source = function( request, response ) {
-				if ( that.xhr ) {
-					that.xhr.abort();
-				}
-				that.xhr = $.ajax({
-					url: url,
-					data: request,
-					dataType: "json",
-					success: function( data ) {
-						response( data );
-					},
-					error: function() {
-						response( [] );
-					}
-				});
-			};
-		} else {
-			this.source = this.options.source;
-		}
-	},
-
-	_searchTimeout: function( event ) {
-		clearTimeout( this.searching );
-		this.searching = this._delay(function() {
-			// only search if the value has changed
-			if ( this.term !== this._value() ) {
-				this.selectedItem = null;
-				this.search( null, event );
-			}
-		}, this.options.delay );
-	},
-
-	search: function( value, event ) {
-		value = value != null ? value : this._value();
-
-		// always save the actual value, not the one passed as an argument
-		this.term = this._value();
-
-		if ( value.length < this.options.minLength ) {
-			return this.close( event );
-		}
-
-		if ( this._trigger( "search", event ) === false ) {
-			return;
-		}
-
-		return this._search( value );
-	},
-
-	_search: function( value ) {
-		this.pending++;
-		this.element.addClass( "ui-autocomplete-loading" );
-		this.cancelSearch = false;
-
-		this.source( { term: value }, this._response() );
-	},
-
-	_response: function() {
-		var that = this,
-			index = ++requestIndex;
-
-		return function( content ) {
-			if ( index === requestIndex ) {
-				that.__response( content );
-			}
-
-			that.pending--;
-			if ( !that.pending ) {
-				that.element.removeClass( "ui-autocomplete-loading" );
-			}
-		};
-	},
-
-	__response: function( content ) {
-		if ( content ) {
-			content = this._normalize( content );
-		}
-		this._trigger( "response", null, { content: content } );
-		if ( !this.options.disabled && content && content.length && !this.cancelSearch ) {
-			this._suggest( content );
-			this._trigger( "open" );
-		} else {
-			// use ._close() instead of .close() so we don't cancel future searches
-			this._close();
-		}
-	},
-
-	close: function( event ) {
-		this.cancelSearch = true;
-		this._close( event );
-	},
-
-	_close: function( event ) {
-		if ( this.menu.element.is( ":visible" ) ) {
-			this.menu.element.hide();
-			this.menu.blur();
-			this.isNewMenu = true;
-			this._trigger( "close", event );
-		}
-	},
-
-	_change: function( event ) {
-		if ( this.previous !== this._value() ) {
-			this._trigger( "change", event, { item: this.selectedItem } );
-		}
-	},
-
-	_normalize: function( items ) {
-		// assume all items have the right format when the first item is complete
-		if ( items.length && items[0].label && items[0].value ) {
-			return items;
-		}
-		return $.map( items, function( item ) {
-			if ( typeof item === "string" ) {
-				return {
-					label: item,
-					value: item
-				};
-			}
-			return $.extend({
-				label: item.label || item.value,
-				value: item.value || item.label
-			}, item );
-		});
-	},
-
-	_suggest: function( items ) {
-		var ul = this.menu.element
-			.empty()
-			.zIndex( this.element.zIndex() + 1 );
-		this._renderMenu( ul, items );
-		this.menu.refresh();
-
-		// size and position menu
-		ul.show();
-		this._resizeMenu();
-		ul.position( $.extend({
-			of: this.element
-		}, this.options.position ));
-
-		if ( this.options.autoFocus ) {
-			this.menu.next();
-		}
-	},
-
-	_resizeMenu: function() {
-		var ul = this.menu.element;
-		ul.outerWidth( Math.max(
-			// Firefox wraps long text (possibly a rounding bug)
-			// so we add 1px to avoid the wrapping (#7513)
-			ul.width( "" ).outerWidth() + 1,
-			this.element.outerWidth()
-		) );
-	},
-
-	_renderMenu: function( ul, items ) {
-		var that = this;
-		$.each( items, function( index, item ) {
-			that._renderItemData( ul, item );
-		});
-	},
-
-	_renderItemData: function( ul, item ) {
-		return this._renderItem( ul, item ).data( "ui-autocomplete-item", item );
-	},
-
-	_renderItem: function( ul, item ) {
-		return $( "<li>" )
-			.append( $( "<a>" ).text( item.label ) )
-			.appendTo( ul );
-	},
-
-	_move: function( direction, event ) {
-		if ( !this.menu.element.is( ":visible" ) ) {
-			this.search( null, event );
-			return;
-		}
-		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
-				this.menu.isLastItem() && /^next/.test( direction ) ) {
-			this._value( this.term );
-			this.menu.blur();
-			return;
-		}
-		this.menu[ direction ]( event );
-	},
-
-	widget: function() {
-		return this.menu.element;
-	},
-
-	_value: function() {
-		return this.valueMethod.apply( this.element, arguments );
-	},
-
-	_keyEvent: function( keyEvent, event ) {
-		if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) {
-			this._move( keyEvent, event );
-
-			// prevents moving cursor to beginning/end of the text field in some browsers
-			event.preventDefault();
-		}
-	}
-});
-
-$.extend( $.ui.autocomplete, {
-	escapeRegex: function( value ) {
-		return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
-	},
-	filter: function(array, term) {
-		var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
-		return $.grep( array, function(value) {
-			return matcher.test( value.label || value.value || value );
-		});
-	}
-});
-
-
-// live region extension, adding a `messages` option
-// NOTE: This is an experimental API. We are still investigating
-// a full solution for string manipulation and internationalization.
-$.widget( "ui.autocomplete", $.ui.autocomplete, {
-	options: {
-		messages: {
-			noResults: "No search results.",
-			results: function( amount ) {
-				return amount + ( amount > 1 ? " results are" : " result is" ) +
-					" available, use up and down arrow keys to navigate.";
-			}
-		}
-	},
-
-	__response: function( content ) {
-		var message;
-		this._superApply( arguments );
-		if ( this.options.disabled || this.cancelSearch ) {
-			return;
-		}
-		if ( content && content.length ) {
-			message = this.options.messages.results( content.length );
-		} else {
-			message = this.options.messages.noResults;
-		}
-		this.liveRegion.text( message );
-	}
-});
-
-
-}( jQuery ));
-
-(function( $, undefined ) {
-
-var lastActive, startXPos, startYPos, clickDragged,
-	baseClasses = "ui-button ui-widget ui-state-default ui-corner-all",
-	stateClasses = "ui-state-hover ui-state-active ",
-	typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",
-	formResetHandler = function() {
-		var buttons = $( this ).find( ":ui-button" );
-		setTimeout(function() {
-			buttons.button( "refresh" );
-		}, 1 );
-	},
-	radioGroup = function( radio ) {
-		var name = radio.name,
-			form = radio.form,
-			radios = $( [] );
-		if ( name ) {
-			if ( form ) {
-				radios = $( form ).find( "[name='" + name + "']" );
-			} else {
-				radios = $( "[name='" + name + "']", radio.ownerDocument )
-					.filter(function() {
-						return !this.form;
-					});
-			}
-		}
-		return radios;
-	};
-
-$.widget( "ui.button", {
-	version: "1.9.2",
-	defaultElement: "<button>",
-	options: {
-		disabled: null,
-		text: true,
-		label: null,
-		icons: {
-			primary: null,
-			secondary: null
-		}
-	},
-	_create: function() {
-		this.element.closest( "form" )
-			.unbind( "reset" + this.eventNamespace )
-			.bind( "reset" + this.eventNamespace, formResetHandler );
-
-		if ( typeof this.options.disabled !== "boolean" ) {
-			this.options.disabled = !!this.element.prop( "disabled" );
-		} else {
-			this.element.prop( "disabled", this.options.disabled );
-		}
-
-		this._determineButtonType();
-		this.hasTitle = !!this.buttonElement.attr( "title" );
-
-		var that = this,
-			options = this.options,
-			toggleButton = this.type === "checkbox" || this.type === "radio",
-			activeClass = !toggleButton ? "ui-state-active" : "",
-			focusClass = "ui-state-focus";
-
-		if ( options.label === null ) {
-			options.label = (this.type === "input" ? this.buttonElement.val() : this.buttonElement.html());
-		}
-
-		this._hoverable( this.buttonElement );
-
-		this.buttonElement
-			.addClass( baseClasses )
-			.attr( "role", "button" )
-			.bind( "mouseenter" + this.eventNamespace, function() {
-				if ( options.disabled ) {
-					return;
-				}
-				if ( this === lastActive ) {
-					$( this ).addClass( "ui-state-active" );
-				}
-			})
-			.bind( "mouseleave" + this.eventNamespace, function() {
-				if ( options.disabled ) {
-					return;
-				}
-				$( this ).removeClass( activeClass );
-			})
-			.bind( "click" + this.eventNamespace, function( event ) {
-				if ( options.disabled ) {
-					event.preventDefault();
-					event.stopImmediatePropagation();
-				}
-			});
-
-		this.element
-			.bind( "focus" + this.eventNamespace, function() {
-				// no need to check disabled, focus won't be triggered anyway
-				that.buttonElement.addClass( focusClass );
-			})
-			.bind( "blur" + this.eventNamespace, function() {
-				that.buttonElement.removeClass( focusClass );
-			});
-
-		if ( toggleButton ) {
-			this.element.bind( "change" + this.eventNamespace, function() {
-				if ( clickDragged ) {
-					return;
-				}
-				that.refresh();
-			});
-			// if mouse moves between mousedown and mouseup (drag) set clickDragged flag
-			// prevents issue where button state changes but checkbox/radio checked state
-			// does not in Firefox (see ticket #6970)
-			this.buttonElement
-				.bind( "mousedown" + this.eventNamespace, function( event ) {
-					if ( options.disabled ) {
-						return;
-					}
-					clickDragged = false;
-					startXPos = event.pageX;
-					startYPos = event.pageY;
-				})
-				.bind( "mouseup" + this.eventNamespace, function( event ) {
-					if ( options.disabled ) {
-						return;
-					}
-					if ( startXPos !== event.pageX || startYPos !== event.pageY ) {
-						clickDragged = true;
-					}
-			});
-		}
-
-		if ( this.type === "checkbox" ) {
-			this.buttonElement.bind( "click" + this.eventNamespace, function() {
-				if ( options.disabled || clickDragged ) {
-					return false;
-				}
-				$( this ).toggleClass( "ui-state-active" );
-				that.buttonElement.attr( "aria-pressed", that.element[0].checked );
-			});
-		} else if ( this.type === "radio" ) {
-			this.buttonElement.bind( "click" + this.eventNamespace, function() {
-				if ( options.disabled || clickDragged ) {
-					return false;
-				}
-				$( this ).addClass( "ui-state-active" );
-				that.buttonElement.attr( "aria-pressed", "true" );
-
-				var radio = that.element[ 0 ];
-				radioGroup( radio )
-					.not( radio )
-					.map(function() {
-						return $( this ).button( "widget" )[ 0 ];
-					})
-					.removeClass( "ui-state-active" )
-					.attr( "aria-pressed", "false" );
-			});
-		} else {
-			this.buttonElement
-				.bind( "mousedown" + this.eventNamespace, function() {
-					if ( options.disabled ) {
-						return false;
-					}
-					$( this ).addClass( "ui-state-active" );
-					lastActive = this;
-					that.document.one( "mouseup", function() {
-						lastActive = null;
-					});
-				})
-				.bind( "mouseup" + this.eventNamespace, function() {
-					if ( options.disabled ) {
-						return false;
-					}
-					$( this ).removeClass( "ui-state-active" );
-				})
-				.bind( "keydown" + this.eventNamespace, function(event) {
-					if ( options.disabled ) {
-						return false;
-					}
-					if ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {
-						$( this ).addClass( "ui-state-active" );
-					}
-				})
-				.bind( "keyup" + this.eventNamespace, function() {
-					$( this ).removeClass( "ui-state-active" );
-				});
-
-			if ( this.buttonElement.is("a") ) {
-				this.buttonElement.keyup(function(event) {
-					if ( event.keyCode === $.ui.keyCode.SPACE ) {
-						// TODO pass through original event correctly (just as 2nd argument doesn't work)
-						$( this ).click();
-					}
-				});
-			}
-		}
-
-		// TODO: pull out $.Widget's handling for the disabled option into
-		// $.Widget.prototype._setOptionDisabled so it's easy to proxy and can
-		// be overridden by individual plugins
-		this._setOption( "disabled", options.disabled );
-		this._resetButton();
-	},
-
-	_determineButtonType: function() {
-		var ancestor, labelSelector, checked;
-
-		if ( this.element.is("[type=checkbox]") ) {
-			this.type = "checkbox";
-		} else if ( this.element.is("[type=radio]") ) {
-			this.type = "radio";
-		} else if ( this.element.is("input") ) {
-			this.type = "input";
-		} else {
-			this.type = "button";
-		}
-
-		if ( this.type === "checkbox" || this.type === "radio" ) {
-			// we don't search against the document in case the element
-			// is disconnected from the DOM
-			ancestor = this.element.parents().last();
-			labelSelector = "label[for='" + this.element.attr("id") + "']";
-			this.buttonElement = ancestor.find( labelSelector );
-			if ( !this.buttonElement.length ) {
-				ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();
-				this.buttonElement = ancestor.filter( labelSelector );
-				if ( !this.buttonElement.length ) {
-					this.buttonElement = ancestor.find( labelSelector );
-				}
-			}
-			this.element.addClass( "ui-helper-hidden-accessible" );
-
-			checked = this.element.is( ":checked" );
-			if ( checked ) {
-				this.buttonElement.addClass( "ui-state-active" );
-			}
-			this.buttonElement.prop( "aria-pressed", checked );
-		} else {
-			this.buttonElement = this.element;
-		}
-	},
-
-	widget: function() {
-		return this.buttonElement;
-	},
-
-	_destroy: function() {
-		this.element
-			.removeClass( "ui-helper-hidden-accessible" );
-		this.buttonElement
-			.removeClass( baseClasses + " " + stateClasses + " " + typeClasses )
-			.removeAttr( "role" )
-			.removeAttr( "aria-pressed" )
-			.html( this.buttonElement.find(".ui-button-text").html() );
-
-		if ( !this.hasTitle ) {
-			this.buttonElement.removeAttr( "title" );
-		}
-	},
-
-	_setOption: function( key, value ) {
-		this._super( key, value );
-		if ( key === "disabled" ) {
-			if ( value ) {
-				this.element.prop( "disabled", true );
-			} else {
-				this.element.prop( "disabled", false );
-			}
-			return;
-		}
-		this._resetButton();
-	},
-
-	refresh: function() {
-		//See #8237 & #8828
-		var isDisabled = this.element.is( "input, button" ) ? this.element.is( ":disabled" ) : this.element.hasClass( "ui-button-disabled" );
-
-		if ( isDisabled !== this.options.disabled ) {
-			this._setOption( "disabled", isDisabled );
-		}
-		if ( this.type === "radio" ) {
-			radioGroup( this.element[0] ).each(function() {
-				if ( $( this ).is( ":checked" ) ) {
-					$( this ).button( "widget" )
-						.addClass( "ui-state-active" )
-						.attr( "aria-pressed", "true" );
-				} else {
-					$( this ).button( "widget" )
-						.removeClass( "ui-state-active" )
-						.attr( "aria-pressed", "false" );
-				}
-			});
-		} else if ( this.type === "checkbox" ) {
-			if ( this.element.is( ":checked" ) ) {
-				this.buttonElement
-					.addClass( "ui-state-active" )
-					.attr( "aria-pressed", "true" );
-			} else {
-				this.buttonElement
-					.removeClass( "ui-state-active" )
-					.attr( "aria-pressed", "false" );
-			}
-		}
-	},
-
-	_resetButton: function() {
-		if ( this.type === "input" ) {
-			if ( this.options.label ) {
-				this.element.val( this.options.label );
-			}
-			return;
-		}
-		var buttonElement = this.buttonElement.removeClass( typeClasses ),
-			buttonText = $( "<span></span>", this.document[0] )
-				.addClass( "ui-button-text" )
-				.html( this.options.label )
-				.appendTo( buttonElement.empty() )
-				.text(),
-			icons = this.options.icons,
-			multipleIcons = icons.primary && icons.secondary,
-			buttonClasses = [];
-
-		if ( icons.primary || icons.secondary ) {
-			if ( this.options.text ) {
-				buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) );
-			}
-
-			if ( icons.primary ) {
-				buttonElement.prepend( "<span class='ui-button-icon-primary ui-icon " + icons.primary + "'></span>" );
-			}
-
-			if ( icons.secondary ) {
-				buttonElement.append( "<span class='ui-button-icon-secondary ui-icon " + icons.secondary + "'></span>" );
-			}
-
-			if ( !this.options.text ) {
-				buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" );
-
-				if ( !this.hasTitle ) {
-					buttonElement.attr( "title", $.trim( buttonText ) );
-				}
-			}
-		} else {
-			buttonClasses.push( "ui-button-text-only" );
-		}
-		buttonElement.addClass( buttonClasses.join( " " ) );
-	}
-});
-
-$.widget( "ui.buttonset", {
-	version: "1.9.2",
-	options: {
-		items: "button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"
-	},
-
-	_create: function() {
-		this.element.addClass( "ui-buttonset" );
-	},
-
-	_init: function() {
-		this.refresh();
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "disabled" ) {
-			this.buttons.button( "option", key, value );
-		}
-
-		this._super( key, value );
-	},
-
-	refresh: function() {
-		var rtl = this.element.css( "direction" ) === "rtl";
-
-		this.buttons = this.element.find( this.options.items )
-			.filter( ":ui-button" )
-				.button( "refresh" )
-			.end()
-			.not( ":ui-button" )
-				.button()
-			.end()
-			.map(function() {
-				return $( this ).button( "widget" )[ 0 ];
-			})
-				.removeClass( "ui-corner-all ui-corner-left ui-corner-right" )
-				.filter( ":first" )
-					.addClass( rtl ? "ui-corner-right" : "ui-corner-left" )
-				.end()
-				.filter( ":last" )
-					.addClass( rtl ? "ui-corner-left" : "ui-corner-right" )
-				.end()
-			.end();
-	},
-
-	_destroy: function() {
-		this.element.removeClass( "ui-buttonset" );
-		this.buttons
-			.map(function() {
-				return $( this ).button( "widget" )[ 0 ];
-			})
-				.removeClass( "ui-corner-left ui-corner-right" )
-			.end()
-			.button( "destroy" );
-	}
-});
-
-}( jQuery ) );
-
-(function( $, undefined ) {
-
-$.extend($.ui, { datepicker: { version: "1.9.2" } });
-
-var PROP_NAME = 'datepicker';
-var dpuuid = new Date().getTime();
-var instActive;
-
-/* Date picker manager.
-   Use the singleton instance of this class, $.datepicker, to interact with the date picker.
-   Settings for (groups of) date pickers are maintained in an instance object,
-   allowing multiple different settings on the same page. */
-
-function Datepicker() {
-	this.debug = false; // Change this to true to start debugging
-	this._curInst = null; // The current instance in use
-	this._keyEvent = false; // If the last event was a key event
-	this._disabledInputs = []; // List of date picker inputs that have been disabled
-	this._datepickerShowing = false; // True if the popup picker is showing , false if not
-	this._inDialog = false; // True if showing within a "dialog", false if not
-	this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division
-	this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class
-	this._appendClass = 'ui-datepicker-append'; // The name of the append marker class
-	this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class
-	this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class
-	this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class
-	this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class
-	this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class
-	this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class
-	this.regional = []; // Available regional settings, indexed by language code
-	this.regional[''] = { // Default regional settings
-		closeText: 'Done', // Display text for close link
-		prevText: 'Prev', // Display text for previous month link
-		nextText: 'Next', // Display text for next month link
-		currentText: 'Today', // Display text for current month link
-		monthNames: ['January','February','March','April','May','June',
-			'July','August','September','October','November','December'], // Names of months for drop-down and formatting
-		monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting
-		dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting
-		dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting
-		dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday
-		weekHeader: 'Wk', // Column header for week of the year
-		dateFormat: 'mm/dd/yy', // See format options on parseDate
-		firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...
-		isRTL: false, // True if right-to-left language, false if left-to-right
-		showMonthAfterYear: false, // True if the year select precedes month, false for month then year
-		yearSuffix: '' // Additional text to append to the year in the month headers
-	};
-	this._defaults = { // Global defaults for all the date picker instances
-		showOn: 'focus', // 'focus' for popup on focus,
-			// 'button' for trigger button, or 'both' for either
-		showAnim: 'fadeIn', // Name of jQuery animation for popup
-		showOptions: {}, // Options for enhanced animations
-		defaultDate: null, // Used when field is blank: actual date,
-			// +/-number for offset from today, null for today
-		appendText: '', // Display text following the input box, e.g. showing the format
-		buttonText: '...', // Text for trigger button
-		buttonImage: '', // URL for trigger button image
-		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
-		hideIfNoPrevNext: false, // True to hide next/previous month links
-			// if not applicable, false to just disable them
-		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
-		gotoCurrent: false, // True if today link goes back to current selection instead
-		changeMonth: false, // True if month can be selected directly, false if only prev/next
-		changeYear: false, // True if year can be selected directly, false if only prev/next
-		yearRange: 'c-10:c+10', // Range of years to display in drop-down,
-			// either relative to today's year (-nn:+nn), relative to currently displayed year
-			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
-		showOtherMonths: false, // True to show dates in other months, false to leave blank
-		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
-		showWeek: false, // True to show week of the year, false to not show it
-		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
-			// takes a Date and returns the number of the week for it
-		shortYearCutoff: '+10', // Short year values < this are in the current century,
-			// > this are in the previous century,
-			// string value starting with '+' for current year + value
-		minDate: null, // The earliest selectable date, or null for no limit
-		maxDate: null, // The latest selectable date, or null for no limit
-		duration: 'fast', // Duration of display/closure
-		beforeShowDay: null, // Function that takes a date and returns an array with
-			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '',
-			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
-		beforeShow: null, // Function that takes an input field and
-			// returns a set of custom settings for the date picker
-		onSelect: null, // Define a callback function when a date is selected
-		onChangeMonthYear: null, // Define a callback function when the month or year is changed
-		onClose: null, // Define a callback function when the datepicker is closed
-		numberOfMonths: 1, // Number of months to show at a time
-		showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)
-		stepMonths: 1, // Number of months to step back/forward
-		stepBigMonths: 12, // Number of months to step back/forward for the big links
-		altField: '', // Selector for an alternate field to store selected dates into
-		altFormat: '', // The date format to use for the alternate field
-		constrainInput: true, // The input is constrained by the current date format
-		showButtonPanel: false, // True to show button panel, false to not show it
-		autoSize: false, // True to size the input for the date format, false to leave as is
-		disabled: false // The initial disabled state
-	};
-	$.extend(this._defaults, this.regional['']);
-	this.dpDiv = bindHover($('<div id="' + this._mainDivId + '" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'));
-}
-
-$.extend(Datepicker.prototype, {
-	/* Class name added to elements to indicate already configured with a date picker. */
-	markerClassName: 'hasDatepicker',
-
-	//Keep track of the maximum number of rows displayed (see #7043)
-	maxRows: 4,
-
-	/* Debug logging (if enabled). */
-	log: function () {
-		if (this.debug)
-			console.log.apply('', arguments);
-	},
-
-	// TODO rename to "widget" when switching to widget factory
-	_widgetDatepicker: function() {
-		return this.dpDiv;
-	},
-
-	/* Override the default settings for all instances of the date picker.
-	   @param  settings  object - the new settings to use as defaults (anonymous object)
-	   @return the manager object */
-	setDefaults: function(settings) {
-		extendRemove(this._defaults, settings || {});
-		return this;
-	},
-
-	/* Attach the date picker to a jQuery selection.
-	   @param  target    element - the target input field or division or span
-	   @param  settings  object - the new settings to use for this date picker instance (anonymous) */
-	_attachDatepicker: function(target, settings) {
-		// check for settings on the control itself - in namespace 'date:'
-		var inlineSettings = null;
-		for (var attrName in this._defaults) {
-			var attrValue = target.getAttribute('date:' + attrName);
-			if (attrValue) {
-				inlineSettings = inlineSettings || {};
-				try {
-					inlineSettings[attrName] = eval(attrValue);
-				} catch (err) {
-					inlineSettings[attrName] = attrValue;
-				}
-			}
-		}
-		var nodeName = target.nodeName.toLowerCase();
-		var inline = (nodeName == 'div' || nodeName == 'span');
-		if (!target.id) {
-			this.uuid += 1;
-			target.id = 'dp' + this.uuid;
-		}
-		var inst = this._newInst($(target), inline);
-		inst.settings = $.extend({}, settings || {}, inlineSettings || {});
-		if (nodeName == 'input') {
-			this._connectDatepicker(target, inst);
-		} else if (inline) {
-			this._inlineDatepicker(target, inst);
-		}
-	},
-
-	/* Create a new instance object. */
-	_newInst: function(target, inline) {
-		var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars
-		return {id: id, input: target, // associated target
-			selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection
-			drawMonth: 0, drawYear: 0, // month being drawn
-			inline: inline, // is datepicker inline or not
-			dpDiv: (!inline ? this.dpDiv : // presentation div
-			bindHover($('<div class="' + this._inlineClass + ' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')))};
-	},
-
-	/* Attach the date picker to an input field. */
-	_connectDatepicker: function(target, inst) {
-		var input = $(target);
-		inst.append = $([]);
-		inst.trigger = $([]);
-		if (input.hasClass(this.markerClassName))
-			return;
-		this._attachments(input, inst);
-		input.addClass(this.markerClassName).keydown(this._doKeyDown).
-			keypress(this._doKeyPress).keyup(this._doKeyUp).
-			bind("setData.datepicker", function(event, key, value) {
-				inst.settings[key] = value;
-			}).bind("getData.datepicker", function(event, key) {
-				return this._get(inst, key);
-			});
-		this._autoSize(inst);
-		$.data(target, PROP_NAME, inst);
-		//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)
-		if( inst.settings.disabled ) {
-			this._disableDatepicker( target );
-		}
-	},
-
-	/* Make attachments based on settings. */
-	_attachments: function(input, inst) {
-		var appendText = this._get(inst, 'appendText');
-		var isRTL = this._get(inst, 'isRTL');
-		if (inst.append)
-			inst.append.remove();
-		if (appendText) {
-			inst.append = $('<span class="' + this._appendClass + '">' + appendText + '</span>');
-			input[isRTL ? 'before' : 'after'](inst.append);
-		}
-		input.unbind('focus', this._showDatepicker);
-		if (inst.trigger)
-			inst.trigger.remove();
-		var showOn = this._get(inst, 'showOn');
-		if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field
-			input.focus(this._showDatepicker);
-		if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked
-			var buttonText = this._get(inst, 'buttonText');
-			var buttonImage = this._get(inst, 'buttonImage');
-			inst.trigger = $(this._get(inst, 'buttonImageOnly') ?
-				$('<img/>').addClass(this._triggerClass).
-					attr({ src: buttonImage, alt: buttonText, title: buttonText }) :
-				$('<button type="button"></button>').addClass(this._triggerClass).
-					html(buttonImage == '' ? buttonText : $('<img/>').attr(
-					{ src:buttonImage, alt:buttonText, title:buttonText })));
-			input[isRTL ? 'before' : 'after'](inst.trigger);
-			inst.trigger.click(function() {
-				if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0])
-					$.datepicker._hideDatepicker();
-				else if ($.datepicker._datepickerShowing && $.datepicker._lastInput != input[0]) {
-					$.datepicker._hideDatepicker();
-					$.datepicker._showDatepicker(input[0]);
-				} else
-					$.datepicker._showDatepicker(input[0]);
-				return false;
-			});
-		}
-	},
-
-	/* Apply the maximum length for the date format. */
-	_autoSize: function(inst) {
-		if (this._get(inst, 'autoSize') && !inst.inline) {
-			var date = new Date(2009, 12 - 1, 20); // Ensure double digits
-			var dateFormat = this._get(inst, 'dateFormat');
-			if (dateFormat.match(/[DM]/)) {
-				var findMax = function(names) {
-					var max = 0;
-					var maxI = 0;
-					for (var i = 0; i < names.length; i++) {
-						if (names[i].length > max) {
-							max = names[i].length;
-							maxI = i;
-						}
-					}
-					return maxI;
-				};
-				date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?
-					'monthNames' : 'monthNamesShort'))));
-				date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?
-					'dayNames' : 'dayNamesShort'))) + 20 - date.getDay());
-			}
-			inst.input.attr('size', this._formatDate(inst, date).length);
-		}
-	},
-
-	/* Attach an inline date picker to a div. */
-	_inlineDatepicker: function(target, inst) {
-		var divSpan = $(target);
-		if (divSpan.hasClass(this.markerClassName))
-			return;
-		divSpan.addClass(this.markerClassName).append(inst.dpDiv).
-			bind("setData.datepicker", function(event, key, value){
-				inst.settings[key] = value;
-			}).bind("getData.datepicker", function(event, key){
-				return this._get(inst, key);
-			});
-		$.data(target, PROP_NAME, inst);
-		this._setDate(inst, this._getDefaultDate(inst), true);
-		this._updateDatepicker(inst);
-		this._updateAlternate(inst);
-		//If disabled option is true, disable the datepicker before showing it (see ticket #5665)
-		if( inst.settings.disabled ) {
-			this._disableDatepicker( target );
-		}
-		// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements
-		// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height
-		inst.dpDiv.css( "display", "block" );
-	},
-
-	/* Pop-up the date picker in a "dialog" box.
-	   @param  input     element - ignored
-	   @param  date      string or Date - the initial date to display
-	   @param  onSelect  function - the function to call when a date is selected
-	   @param  settings  object - update the dialog date picker instance's settings (anonymous object)
-	   @param  pos       int[2] - coordinates for the dialog's position within the screen or
-	                     event - with x/y coordinates or
-	                     leave empty for default (screen centre)
-	   @return the manager object */
-	_dialogDatepicker: function(input, date, onSelect, settings, pos) {
-		var inst = this._dialogInst; // internal instance
-		if (!inst) {
-			this.uuid += 1;
-			var id = 'dp' + this.uuid;
-			this._dialogInput = $('<input type="text" id="' + id +
-				'" style="position: absolute; top: -100px; width: 0px;"/>');
-			this._dialogInput.keydown(this._doKeyDown);
-			$('body').append(this._dialogInput);
-			inst = this._dialogInst = this._newInst(this._dialogInput, false);
-			inst.settings = {};
-			$.data(this._dialogInput[0], PROP_NAME, inst);
-		}
-		extendRemove(inst.settings, settings || {});
-		date = (date && date.constructor == Date ? this._formatDate(inst, date) : date);
-		this._dialogInput.val(date);
-
-		this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);
-		if (!this._pos) {
-			var browserWidth = document.documentElement.clientWidth;
-			var browserHeight = document.documentElement.clientHeight;
-			var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
-			var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
-			this._pos = // should use actual width/height below
-				[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];
-		}
-
-		// move input on screen for focus, but hidden behind dialog
-		this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px');
-		inst.settings.onSelect = onSelect;
-		this._inDialog = true;
-		this.dpDiv.addClass(this._dialogClass);
-		this._showDatepicker(this._dialogInput[0]);
-		if ($.blockUI)
-			$.blockUI(this.dpDiv);
-		$.data(this._dialogInput[0], PROP_NAME, inst);
-		return this;
-	},
-
-	/* Detach a datepicker from its control.
-	   @param  target    element - the target input field or division or span */
-	_destroyDatepicker: function(target) {
-		var $target = $(target);
-		var inst = $.data(target, PROP_NAME);
-		if (!$target.hasClass(this.markerClassName)) {
-			return;
-		}
-		var nodeName = target.nodeName.toLowerCase();
-		$.removeData(target, PROP_NAME);
-		if (nodeName == 'input') {
-			inst.append.remove();
-			inst.trigger.remove();
-			$target.removeClass(this.markerClassName).
-				unbind('focus', this._showDatepicker).
-				unbind('keydown', this._doKeyDown).
-				unbind('keypress', this._doKeyPress).
-				unbind('keyup', this._doKeyUp);
-		} else if (nodeName == 'div' || nodeName == 'span')
-			$target.removeClass(this.markerClassName).empty();
-	},
-
-	/* Enable the date picker to a jQuery selection.
-	   @param  target    element - the target input field or division or span */
-	_enableDatepicker: function(target) {
-		var $target = $(target);
-		var inst = $.data(target, PROP_NAME);
-		if (!$target.hasClass(this.markerClassName)) {
-			return;
-		}
-		var nodeName = target.nodeName.toLowerCase();
-		if (nodeName == 'input') {
-			target.disabled = false;
-			inst.trigger.filter('button').
-				each(function() { this.disabled = false; }).end().
-				filter('img').css({opacity: '1.0', cursor: ''});
-		}
-		else if (nodeName == 'div' || nodeName == 'span') {
-			var inline = $target.children('.' + this._inlineClass);
-			inline.children().removeClass('ui-state-disabled');
-			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
-				prop("disabled", false);
-		}
-		this._disabledInputs = $.map(this._disabledInputs,
-			function(value) { return (value == target ? null : value); }); // delete entry
-	},
-
-	/* Disable the date picker to a jQuery selection.
-	   @param  target    element - the target input field or division or span */
-	_disableDatepicker: function(target) {
-		var $target = $(target);
-		var inst = $.data(target, PROP_NAME);
-		if (!$target.hasClass(this.markerClassName)) {
-			return;
-		}
-		var nodeName = target.nodeName.toLowerCase();
-		if (nodeName == 'input') {
-			target.disabled = true;
-			inst.trigger.filter('button').
-				each(function() { this.disabled = true; }).end().
-				filter('img').css({opacity: '0.5', cursor: 'default'});
-		}
-		else if (nodeName == 'div' || nodeName == 'span') {
-			var inline = $target.children('.' + this._inlineClass);
-			inline.children().addClass('ui-state-disabled');
-			inline.find("select.ui-datepicker-month, select.ui-datepicker-year").
-				prop("disabled", true);
-		}
-		this._disabledInputs = $.map(this._disabledInputs,
-			function(value) { return (value == target ? null : value); }); // delete entry
-		this._disabledInputs[this._disabledInputs.length] = target;
-	},
-
-	/* Is the first field in a jQuery collection disabled as a datepicker?
-	   @param  target    element - the target input field or division or span
-	   @return boolean - true if disabled, false if enabled */
-	_isDisabledDatepicker: function(target) {
-		if (!target) {
-			return false;
-		}
-		for (var i = 0; i < this._disabledInputs.length; i++) {
-			if (this._disabledInputs[i] == target)
-				return true;
-		}
-		return false;
-	},
-
-	/* Retrieve the instance data for the target control.
-	   @param  target  element - the target input field or division or span
-	   @return  object - the associated instance data
-	   @throws  error if a jQuery problem getting data */
-	_getInst: function(target) {
-		try {
-			return $.data(target, PROP_NAME);
-		}
-		catch (err) {
-			throw 'Missing instance data for this datepicker';
-		}
-	},
-
-	/* Update or retrieve the settings for a date picker attached to an input field or division.
-	   @param  target  element - the target input field or division or span
-	   @param  name    object - the new settings to update or
-	                   string - the name of the setting to change or retrieve,
-	                   when retrieving also 'all' for all instance settings or
-	                   'defaults' for all global defaults
-	   @param  value   any - the new value for the setting
-	                   (omit if above is an object or to retrieve a value) */
-	_optionDatepicker: function(target, name, value) {
-		var inst = this._getInst(target);
-		if (arguments.length == 2 && typeof name == 'string') {
-			return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) :
-				(inst ? (name == 'all' ? $.extend({}, inst.settings) :
-				this._get(inst, name)) : null));
-		}
-		var settings = name || {};
-		if (typeof name == 'string') {
-			settings = {};
-			settings[name] = value;
-		}
-		if (inst) {
-			if (this._curInst == inst) {
-				this._hideDatepicker();
-			}
-			var date = this._getDateDatepicker(target, true);
-			var minDate = this._getMinMaxDate(inst, 'min');
-			var maxDate = this._getMinMaxDate(inst, 'max');
-			extendRemove(inst.settings, settings);
-			// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided
-			if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined)
-				inst.settings.minDate = this._formatDate(inst, minDate);
-			if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined)
-				inst.settings.maxDate = this._formatDate(inst, maxDate);
-			this._attachments($(target), inst);
-			this._autoSize(inst);
-			this._setDate(inst, date);
-			this._updateAlternate(inst);
-			this._updateDatepicker(inst);
-		}
-	},
-
-	// change method deprecated
-	_changeDatepicker: function(target, name, value) {
-		this._optionDatepicker(target, name, value);
-	},
-
-	/* Redraw the date picker attached to an input field or division.
-	   @param  target  element - the target input field or division or span */
-	_refreshDatepicker: function(target) {
-		var inst = this._getInst(target);
-		if (inst) {
-			this._updateDatepicker(inst);
-		}
-	},
-
-	/* Set the dates for a jQuery selection.
-	   @param  target   element - the target input field or division or span
-	   @param  date     Date - the new date */
-	_setDateDatepicker: function(target, date) {
-		var inst = this._getInst(target);
-		if (inst) {
-			this._setDate(inst, date);
-			this._updateDatepicker(inst);
-			this._updateAlternate(inst);
-		}
-	},
-
-	/* Get the date(s) for the first entry in a jQuery selection.
-	   @param  target     element - the target input field or division or span
-	   @param  noDefault  boolean - true if no default date is to be used
-	   @return Date - the current date */
-	_getDateDatepicker: function(target, noDefault) {
-		var inst = this._getInst(target);
-		if (inst && !inst.inline)
-			this._setDateFromField(inst, noDefault);
-		return (inst ? this._getDate(inst) : null);
-	},
-
-	/* Handle keystrokes. */
-	_doKeyDown: function(event) {
-		var inst = $.datepicker._getInst(event.target);
-		var handled = true;
-		var isRTL = inst.dpDiv.is('.ui-datepicker-rtl');
-		inst._keyEvent = true;
-		if ($.datepicker._datepickerShowing)
-			switch (event.keyCode) {
-				case 9: $.datepicker._hideDatepicker();
-						handled = false;
-						break; // hide on tab out
-				case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' +
-									$.datepicker._currentClass + ')', inst.dpDiv);
-						if (sel[0])
-							$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);
-							var onSelect = $.datepicker._get(inst, 'onSelect');
-							if (onSelect) {
-								var dateStr = $.datepicker._formatDate(inst);
-
-								// trigger custom callback
-								onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);
-							}
-						else
-							$.datepicker._hideDatepicker();
-						return false; // don't submit the form
-						break; // select the value on enter
-				case 27: $.datepicker._hideDatepicker();
-						break; // hide on escape
-				case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
-							-$.datepicker._get(inst, 'stepBigMonths') :
-							-$.datepicker._get(inst, 'stepMonths')), 'M');
-						break; // previous month/year on page up/+ ctrl
-				case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?
-							+$.datepicker._get(inst, 'stepBigMonths') :
-							+$.datepicker._get(inst, 'stepMonths')), 'M');
-						break; // next month/year on page down/+ ctrl
-				case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target);
-						handled = event.ctrlKey || event.metaKey;
-						break; // clear on ctrl or command +end
-				case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target);
-						handled = event.ctrlKey || event.metaKey;
-						break; // current on ctrl or command +home
-				case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D');
-						handled = event.ctrlKey || event.metaKey;
-						// -1 day on ctrl or command +left
-						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
-									-$.datepicker._get(inst, 'stepBigMonths') :
-									-$.datepicker._get(inst, 'stepMonths')), 'M');
-						// next month/year on alt +left on Mac
-						break;
-				case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D');
-						handled = event.ctrlKey || event.metaKey;
-						break; // -1 week on ctrl or command +up
-				case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D');
-						handled = event.ctrlKey || event.metaKey;
-						// +1 day on ctrl or command +right
-						if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ?
-									+$.datepicker._get(inst, 'stepBigMonths') :
-									+$.datepicker._get(inst, 'stepMonths')), 'M');
-						// next month/year on alt +right
-						break;
-				case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D');
-						handled = event.ctrlKey || event.metaKey;
-						break; // +1 week on ctrl or command +down
-				default: handled = false;
-			}
-		else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home
-			$.datepicker._showDatepicker(this);
-		else {
-			handled = false;
-		}
-		if (handled) {
-			event.preventDefault();
-			event.stopPropagation();
-		}
-	},
-
-	/* Filter entered characters - based on date format. */
-	_doKeyPress: function(event) {
-		var inst = $.datepicker._getInst(event.target);
-		if ($.datepicker._get(inst, 'constrainInput')) {
-			var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
-			var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode);
-			return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
-		}
-	},
-
-	/* Synchronise manual entry and field/alternate field. */
-	_doKeyUp: function(event) {
-		var inst = $.datepicker._getInst(event.target);
-		if (inst.input.val() != inst.lastVal) {
-			try {
-				var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
-					(inst.input ? inst.input.val() : null),
-					$.datepicker._getFormatConfig(inst));
-				if (date) { // only if valid
-					$.datepicker._setDateFromField(inst);
-					$.datepicker._updateAlternate(inst);
-					$.datepicker._updateDatepicker(inst);
-				}
-			}
-			catch (err) {
-				$.datepicker.log(err);
-			}
-		}
-		return true;
-	},
-
-	/* Pop-up the date picker for a given input field.
-	   If false returned from beforeShow event handler do not show.
-	   @param  input  element - the input field attached to the date picker or
-	                  event - if triggered by focus */
-	_showDatepicker: function(input) {
-		input = input.target || input;
-		if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger
-			input = $('input', input.parentNode)[0];
-		if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here
-			return;
-		var inst = $.datepicker._getInst(input);
-		if ($.datepicker._curInst && $.datepicker._curInst != inst) {
-			$.datepicker._curInst.dpDiv.stop(true, true);
-			if ( inst && $.datepicker._datepickerShowing ) {
-				$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );
-			}
-		}
-		var beforeShow = $.datepicker._get(inst, 'beforeShow');
-		var beforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};
-		if(beforeShowSettings === false){
-			//false
-			return;
-		}
-		extendRemove(inst.settings, beforeShowSettings);
-		inst.lastVal = null;
-		$.datepicker._lastInput = input;
-		$.datepicker._setDateFromField(inst);
-		if ($.datepicker._inDialog) // hide cursor
-			input.value = '';
-		if (!$.datepicker._pos) { // position below input
-			$.datepicker._pos = $.datepicker._findPos(input);
-			$.datepicker._pos[1] += input.offsetHeight; // add the height
-		}
-		var isFixed = false;
-		$(input).parents().each(function() {
-			isFixed |= $(this).css('position') == 'fixed';
-			return !isFixed;
-		});
-		var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};
-		$.datepicker._pos = null;
-		//to avoid flashes on Firefox
-		inst.dpDiv.empty();
-		// determine sizing offscreen
-		inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'});
-		$.datepicker._updateDatepicker(inst);
-		// fix width for dynamic number of date pickers
-		// and adjust position before showing
-		offset = $.datepicker._checkOffset(inst, offset, isFixed);
-		inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?
-			'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none',
-			left: offset.left + 'px', top: offset.top + 'px'});
-		if (!inst.inline) {
-			var showAnim = $.datepicker._get(inst, 'showAnim');
-			var duration = $.datepicker._get(inst, 'duration');
-			var postProcess = function() {
-				var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
-				if( !! cover.length ){
-					var borders = $.datepicker._getBorders(inst.dpDiv);
-					cover.css({left: -borders[0], top: -borders[1],
-						width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()});
-				}
-			};
-			inst.dpDiv.zIndex($(input).zIndex()+1);
-			$.datepicker._datepickerShowing = true;
-
-			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
-			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
-				inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
-			else
-				inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess);
-			if (!showAnim || !duration)
-				postProcess();
-			if (inst.input.is(':visible') && !inst.input.is(':disabled'))
-				inst.input.focus();
-			$.datepicker._curInst = inst;
-		}
-	},
-
-	/* Generate the date picker content. */
-	_updateDatepicker: function(inst) {
-		this.maxRows = 4; //Reset the max number of rows being displayed (see #7043)
-		var borders = $.datepicker._getBorders(inst.dpDiv);
-		instActive = inst; // for delegate hover events
-		inst.dpDiv.empty().append(this._generateHTML(inst));
-		this._attachHandlers(inst);
-		var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only
-		if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6
-			cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()})
-		}
-		inst.dpDiv.find('.' + this._dayOverClass + ' a').mouseover();
-		var numMonths = this._getNumberOfMonths(inst);
-		var cols = numMonths[1];
-		var width = 17;
-		inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width('');
-		if (cols > 1)
-			inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em');
-		inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') +
-			'Class']('ui-datepicker-multi');
-		inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') +
-			'Class']('ui-datepicker-rtl');
-		if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input &&
-				// #6694 - don't focus the input if it's already focused
-				// this breaks the change event in IE
-				inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement)
-			inst.input.focus();
-		// deffered render of the years select (to avoid flashes on Firefox)
-		if( inst.yearshtml ){
-			var origyearshtml = inst.yearshtml;
-			setTimeout(function(){
-				//assure that inst.yearshtml didn't change.
-				if( origyearshtml === inst.yearshtml && inst.yearshtml ){
-					inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml);
-				}
-				origyearshtml = inst.yearshtml = null;
-			}, 0);
-		}
-	},
-
-	/* Retrieve the size of left and top borders for an element.
-	   @param  elem  (jQuery object) the element of interest
-	   @return  (number[2]) the left and top borders */
-	_getBorders: function(elem) {
-		var convert = function(value) {
-			return {thin: 1, medium: 2, thick: 3}[value] || value;
-		};
-		return [parseFloat(convert(elem.css('border-left-width'))),
-			parseFloat(convert(elem.css('border-top-width')))];
-	},
-
-	/* Check positioning to remain on screen. */
-	_checkOffset: function(inst, offset, isFixed) {
-		var dpWidth = inst.dpDiv.outerWidth();
-		var dpHeight = inst.dpDiv.outerHeight();
-		var inputWidth = inst.input ? inst.input.outerWidth() : 0;
-		var inputHeight = inst.input ? inst.input.outerHeight() : 0;
-		var viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft());
-		var viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
-
-		offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0);
-		offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0;
-		offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;
-
-		// now check if datepicker is showing outside window viewport - move to a better place if so.
-		offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
-			Math.abs(offset.left + dpWidth - viewWidth) : 0);
-		offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
-			Math.abs(dpHeight + inputHeight) : 0);
-
-		return offset;
-	},
-
-	/* Find an object's position on the screen. */
-	_findPos: function(obj) {
-		var inst = this._getInst(obj);
-		var isRTL = this._get(inst, 'isRTL');
-		while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) {
-			obj = obj[isRTL ? 'previousSibling' : 'nextSibling'];
-		}
-		var position = $(obj).offset();
-		return [position.left, position.top];
-	},
-
-	/* Hide the date picker from view.
-	   @param  input  element - the input field attached to the date picker */
-	_hideDatepicker: function(input) {
-		var inst = this._curInst;
-		if (!inst || (input && inst != $.data(input, PROP_NAME)))
-			return;
-		if (this._datepickerShowing) {
-			var showAnim = this._get(inst, 'showAnim');
-			var duration = this._get(inst, 'duration');
-			var postProcess = function() {
-				$.datepicker._tidyDialog(inst);
-			};
-
-			// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed
-			if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) )
-				inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess);
-			else
-				inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' :
-					(showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess);
-			if (!showAnim)
-				postProcess();
-			this._datepickerShowing = false;
-			var onClose = this._get(inst, 'onClose');
-			if (onClose)
-				onClose.apply((inst.input ? inst.input[0] : null),
-					[(inst.input ? inst.input.val() : ''), inst]);
-			this._lastInput = null;
-			if (this._inDialog) {
-				this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' });
-				if ($.blockUI) {
-					$.unblockUI();
-					$('body').append(this.dpDiv);
-				}
-			}
-			this._inDialog = false;
-		}
-	},
-
-	/* Tidy up after a dialog display. */
-	_tidyDialog: function(inst) {
-		inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar');
-	},
-
-	/* Close date picker if clicked elsewhere. */
-	_checkExternalClick: function(event) {
-		if (!$.datepicker._curInst)
-			return;
-
-		var $target = $(event.target),
-			inst = $.datepicker._getInst($target[0]);
-
-		if ( ( ( $target[0].id != $.datepicker._mainDivId &&
-				$target.parents('#' + $.datepicker._mainDivId).length == 0 &&
-				!$target.hasClass($.datepicker.markerClassName) &&
-				!$target.closest("." + $.datepicker._triggerClass).length &&
-				$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||
-			( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst != inst ) )
-			$.datepicker._hideDatepicker();
-	},
-
-	/* Adjust one of the date sub-fields. */
-	_adjustDate: function(id, offset, period) {
-		var target = $(id);
-		var inst = this._getInst(target[0]);
-		if (this._isDisabledDatepicker(target[0])) {
-			return;
-		}
-		this._adjustInstDate(inst, offset +
-			(period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning
-			period);
-		this._updateDatepicker(inst);
-	},
-
-	/* Action for current link. */
-	_gotoToday: function(id) {
-		var target = $(id);
-		var inst = this._getInst(target[0]);
-		if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
-			inst.selectedDay = inst.currentDay;
-			inst.drawMonth = inst.selectedMonth = inst.currentMonth;
-			inst.drawYear = inst.selectedYear = inst.currentYear;
-		}
-		else {
-			var date = new Date();
-			inst.selectedDay = date.getDate();
-			inst.drawMonth = inst.selectedMonth = date.getMonth();
-			inst.drawYear = inst.selectedYear = date.getFullYear();
-		}
-		this._notifyChange(inst);
-		this._adjustDate(target);
-	},
-
-	/* Action for selecting a new month/year. */
-	_selectMonthYear: function(id, select, period) {
-		var target = $(id);
-		var inst = this._getInst(target[0]);
-		inst['selected' + (period == 'M' ? 'Month' : 'Year')] =
-		inst['draw' + (period == 'M' ? 'Month' : 'Year')] =
-			parseInt(select.options[select.selectedIndex].value,10);
-		this._notifyChange(inst);
-		this._adjustDate(target);
-	},
-
-	/* Action for selecting a day. */
-	_selectDay: function(id, month, year, td) {
-		var target = $(id);
-		if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {
-			return;
-		}
-		var inst = this._getInst(target[0]);
-		inst.selectedDay = inst.currentDay = $('a', td).html();
-		inst.selectedMonth = inst.currentMonth = month;
-		inst.selectedYear = inst.currentYear = year;
-		this._selectDate(id, this._formatDate(inst,
-			inst.currentDay, inst.currentMonth, inst.currentYear));
-	},
-
-	/* Erase the input field and hide the date picker. */
-	_clearDate: function(id) {
-		var target = $(id);
-		var inst = this._getInst(target[0]);
-		this._selectDate(target, '');
-	},
-
-	/* Update the input field with the selected date. */
-	_selectDate: function(id, dateStr) {
-		var target = $(id);
-		var inst = this._getInst(target[0]);
-		dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
-		if (inst.input)
-			inst.input.val(dateStr);
-		this._updateAlternate(inst);
-		var onSelect = this._get(inst, 'onSelect');
-		if (onSelect)
-			onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);  // trigger custom callback
-		else if (inst.input)
-			inst.input.trigger('change'); // fire the change event
-		if (inst.inline)
-			this._updateDatepicker(inst);
-		else {
-			this._hideDatepicker();
-			this._lastInput = inst.input[0];
-			if (typeof(inst.input[0]) != 'object')
-				inst.input.focus(); // restore focus
-			this._lastInput = null;
-		}
-	},
-
-	/* Update any alternate field to synchronise with the main field. */
-	_updateAlternate: function(inst) {
-		var altField = this._get(inst, 'altField');
-		if (altField) { // update alternate field too
-			var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat');
-			var date = this._getDate(inst);
-			var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));
-			$(altField).each(function() { $(this).val(dateStr); });
-		}
-	},
-
-	/* Set as beforeShowDay function to prevent selection of weekends.
-	   @param  date  Date - the date to customise
-	   @return [boolean, string] - is this date selectable?, what is its CSS class? */
-	noWeekends: function(date) {
-		var day = date.getDay();
-		return [(day > 0 && day < 6), ''];
-	},
-
-	/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
-	   @param  date  Date - the date to get the week for
-	   @return  number - the number of the week within the year that contains this date */
-	iso8601Week: function(date) {
-		var checkDate = new Date(date.getTime());
-		// Find Thursday of this week starting on Monday
-		checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
-		var time = checkDate.getTime();
-		checkDate.setMonth(0); // Compare with Jan 1
-		checkDate.setDate(1);
-		return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
-	},
-
-	/* Parse a string value into a date object.
-	   See formatDate below for the possible formats.
-
-	   @param  format    string - the expected format of the date
-	   @param  value     string - the date in the above format
-	   @param  settings  Object - attributes include:
-	                     shortYearCutoff  number - the cutoff year for determining the century (optional)
-	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
-	                     dayNames         string[7] - names of the days from Sunday (optional)
-	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
-	                     monthNames       string[12] - names of the months (optional)
-	   @return  Date - the extracted date value or null if value is blank */
-	parseDate: function (format, value, settings) {
-		if (format == null || value == null)
-			throw 'Invalid arguments';
-		value = (typeof value == 'object' ? value.toString() : value + '');
-		if (value == '')
-			return null;
-		var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
-		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
-				new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
-		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
-		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
-		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
-		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
-		var year = -1;
-		var month = -1;
-		var day = -1;
-		var doy = -1;
-		var literal = false;
-		// Check whether a format character is doubled
-		var lookAhead = function(match) {
-			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
-			if (matches)
-				iFormat++;
-			return matches;
-		};
-		// Extract a number from the string value
-		var getNumber = function(match) {
-			var isDoubled = lookAhead(match);
-			var size = (match == '@' ? 14 : (match == '!' ? 20 :
-				(match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2))));
-			var digits = new RegExp('^\\d{1,' + size + '}');
-			var num = value.substring(iValue).match(digits);
-			if (!num)
-				throw 'Missing number at position ' + iValue;
-			iValue += num[0].length;
-			return parseInt(num[0], 10);
-		};
-		// Extract a name from the string value and convert to an index
-		var getName = function(match, shortNames, longNames) {
-			var names = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {
-				return [ [k, v] ];
-			}).sort(function (a, b) {
-				return -(a[1].length - b[1].length);
-			});
-			var index = -1;
-			$.each(names, function (i, pair) {
-				var name = pair[1];
-				if (value.substr(iValue, name.length).toLowerCase() == name.toLowerCase()) {
-					index = pair[0];
-					iValue += name.length;
-					return false;
-				}
-			});
-			if (index != -1)
-				return index + 1;
-			else
-				throw 'Unknown name at position ' + iValue;
-		};
-		// Confirm that a literal character matches the string value
-		var checkLiteral = function() {
-			if (value.charAt(iValue) != format.charAt(iFormat))
-				throw 'Unexpected literal at position ' + iValue;
-			iValue++;
-		};
-		var iValue = 0;
-		for (var iFormat = 0; iFormat < format.length; iFormat++) {
-			if (literal)
-				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
-					literal = false;
-				else
-					checkLiteral();
-			else
-				switch (format.charAt(iFormat)) {
-					case 'd':
-						day = getNumber('d');
-						break;
-					case 'D':
-						getName('D', dayNamesShort, dayNames);
-						break;
-					case 'o':
-						doy = getNumber('o');
-						break;
-					case 'm':
-						month = getNumber('m');
-						break;
-					case 'M':
-						month = getName('M', monthNamesShort, monthNames);
-						break;
-					case 'y':
-						year = getNumber('y');
-						break;
-					case '@':
-						var date = new Date(getNumber('@'));
-						year = date.getFullYear();
-						month = date.getMonth() + 1;
-						day = date.getDate();
-						break;
-					case '!':
-						var date = new Date((getNumber('!') - this._ticksTo1970) / 10000);
-						year = date.getFullYear();
-						month = date.getMonth() + 1;
-						day = date.getDate();
-						break;
-					case "'":
-						if (lookAhead("'"))
-							checkLiteral();
-						else
-							literal = true;
-						break;
-					default:
-						checkLiteral();
-				}
-		}
-		if (iValue < value.length){
-			var extra = value.substr(iValue);
-			if (!/^\s+/.test(extra)) {
-				throw "Extra/unparsed characters found in date: " + extra;
-			}
-		}
-		if (year == -1)
-			year = new Date().getFullYear();
-		else if (year < 100)
-			year += new Date().getFullYear() - new Date().getFullYear() % 100 +
-				(year <= shortYearCutoff ? 0 : -100);
-		if (doy > -1) {
-			month = 1;
-			day = doy;
-			do {
-				var dim = this._getDaysInMonth(year, month - 1);
-				if (day <= dim)
-					break;
-				month++;
-				day -= dim;
-			} while (true);
-		}
-		var date = this._daylightSavingAdjust(new Date(year, month - 1, day));
-		if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
-			throw 'Invalid date'; // E.g. 31/02/00
-		return date;
-	},
-
-	/* Standard date formats. */
-	ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601)
-	COOKIE: 'D, dd M yy',
-	ISO_8601: 'yy-mm-dd',
-	RFC_822: 'D, d M y',
-	RFC_850: 'DD, dd-M-y',
-	RFC_1036: 'D, d M y',
-	RFC_1123: 'D, d M yy',
-	RFC_2822: 'D, d M yy',
-	RSS: 'D, d M y', // RFC 822
-	TICKS: '!',
-	TIMESTAMP: '@',
-	W3C: 'yy-mm-dd', // ISO 8601
-
-	_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +
-		Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),
-
-	/* Format a date object into a string value.
-	   The format can be combinations of the following:
-	   d  - day of month (no leading zero)
-	   dd - day of month (two digit)
-	   o  - day of year (no leading zeros)
-	   oo - day of year (three digit)
-	   D  - day name short
-	   DD - day name long
-	   m  - month of year (no leading zero)
-	   mm - month of year (two digit)
-	   M  - month name short
-	   MM - month name long
-	   y  - year (two digit)
-	   yy - year (four digit)
-	   @ - Unix timestamp (ms since 01/01/1970)
-	   ! - Windows ticks (100ns since 01/01/0001)
-	   '...' - literal text
-	   '' - single quote
-
-	   @param  format    string - the desired format of the date
-	   @param  date      Date - the date value to format
-	   @param  settings  Object - attributes include:
-	                     dayNamesShort    string[7] - abbreviated names of the days from Sunday (optional)
-	                     dayNames         string[7] - names of the days from Sunday (optional)
-	                     monthNamesShort  string[12] - abbreviated names of the months (optional)
-	                     monthNames       string[12] - names of the months (optional)
-	   @return  string - the date in the above format */
-	formatDate: function (format, date, settings) {
-		if (!date)
-			return '';
-		var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
-		var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
-		var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
-		var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
-		// Check whether a format character is doubled
-		var lookAhead = function(match) {
-			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
-			if (matches)
-				iFormat++;
-			return matches;
-		};
-		// Format a number, with leading zero if necessary
-		var formatNumber = function(match, value, len) {
-			var num = '' + value;
-			if (lookAhead(match))
-				while (num.length < len)
-					num = '0' + num;
-			return num;
-		};
-		// Format a name, short or long as requested
-		var formatName = function(match, value, shortNames, longNames) {
-			return (lookAhead(match) ? longNames[value] : shortNames[value]);
-		};
-		var output = '';
-		var literal = false;
-		if (date)
-			for (var iFormat = 0; iFormat < format.length; iFormat++) {
-				if (literal)
-					if (format.charAt(iFormat) == "'" && !lookAhead("'"))
-						literal = false;
-					else
-						output += format.charAt(iFormat);
-				else
-					switch (format.charAt(iFormat)) {
-						case 'd':
-							output += formatNumber('d', date.getDate(), 2);
-							break;
-						case 'D':
-							output += formatName('D', date.getDay(), dayNamesShort, dayNames);
-							break;
-						case 'o':
-							output += formatNumber('o',
-								Math.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);
-							break;
-						case 'm':
-							output += formatNumber('m', date.getMonth() + 1, 2);
-							break;
-						case 'M':
-							output += formatName('M', date.getMonth(), monthNamesShort, monthNames);
-							break;
-						case 'y':
-							output += (lookAhead('y') ? date.getFullYear() :
-								(date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);
-							break;
-						case '@':
-							output += date.getTime();
-							break;
-						case '!':
-							output += date.getTime() * 10000 + this._ticksTo1970;
-							break;
-						case "'":
-							if (lookAhead("'"))
-								output += "'";
-							else
-								literal = true;
-							break;
-						default:
-							output += format.charAt(iFormat);
-					}
-			}
-		return output;
-	},
-
-	/* Extract all possible characters from the date format. */
-	_possibleChars: function (format) {
-		var chars = '';
-		var literal = false;
-		// Check whether a format character is doubled
-		var lookAhead = function(match) {
-			var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
-			if (matches)
-				iFormat++;
-			return matches;
-		};
-		for (var iFormat = 0; iFormat < format.length; iFormat++)
-			if (literal)
-				if (format.charAt(iFormat) == "'" && !lookAhead("'"))
-					literal = false;
-				else
-					chars += format.charAt(iFormat);
-			else
-				switch (format.charAt(iFormat)) {
-					case 'd': case 'm': case 'y': case '@':
-						chars += '0123456789';
-						break;
-					case 'D': case 'M':
-						return null; // Accept anything
-					case "'":
-						if (lookAhead("'"))
-							chars += "'";
-						else
-							literal = true;
-						break;
-					default:
-						chars += format.charAt(iFormat);
-				}
-		return chars;
-	},
-
-	/* Get a setting value, defaulting if necessary. */
-	_get: function(inst, name) {
-		return inst.settings[name] !== undefined ?
-			inst.settings[name] : this._defaults[name];
-	},
-
-	/* Parse existing date and initialise date picker. */
-	_setDateFromField: function(inst, noDefault) {
-		if (inst.input.val() == inst.lastVal) {
-			return;
-		}
-		var dateFormat = this._get(inst, 'dateFormat');
-		var dates = inst.lastVal = inst.input ? inst.input.val() : null;
-		var date, defaultDate;
-		date = defaultDate = this._getDefaultDate(inst);
-		var settings = this._getFormatConfig(inst);
-		try {
-			date = this.parseDate(dateFormat, dates, settings) || defaultDate;
-		} catch (event) {
-			this.log(event);
-			dates = (noDefault ? '' : dates);
-		}
-		inst.selectedDay = date.getDate();
-		inst.drawMonth = inst.selectedMonth = date.getMonth();
-		inst.drawYear = inst.selectedYear = date.getFullYear();
-		inst.currentDay = (dates ? date.getDate() : 0);
-		inst.currentMonth = (dates ? date.getMonth() : 0);
-		inst.currentYear = (dates ? date.getFullYear() : 0);
-		this._adjustInstDate(inst);
-	},
-
-	/* Retrieve the default date shown on opening. */
-	_getDefaultDate: function(inst) {
-		return this._restrictMinMax(inst,
-			this._determineDate(inst, this._get(inst, 'defaultDate'), new Date()));
-	},
-
-	/* A date may be specified as an exact value or a relative one. */
-	_determineDate: function(inst, date, defaultDate) {
-		var offsetNumeric = function(offset) {
-			var date = new Date();
-			date.setDate(date.getDate() + offset);
-			return date;
-		};
-		var offsetString = function(offset) {
-			try {
-				return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'),
-					offset, $.datepicker._getFormatConfig(inst));
-			}
-			catch (e) {
-				// Ignore
-			}
-			var date = (offset.toLowerCase().match(/^c/) ?
-				$.datepicker._getDate(inst) : null) || new Date();
-			var year = date.getFullYear();
-			var month = date.getMonth();
-			var day = date.getDate();
-			var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
-			var matches = pattern.exec(offset);
-			while (matches) {
-				switch (matches[2] || 'd') {
-					case 'd' : case 'D' :
-						day += parseInt(matches[1],10); break;
-					case 'w' : case 'W' :
-						day += parseInt(matches[1],10) * 7; break;
-					case 'm' : case 'M' :
-						month += parseInt(matches[1],10);
-						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
-						break;
-					case 'y': case 'Y' :
-						year += parseInt(matches[1],10);
-						day = Math.min(day, $.datepicker._getDaysInMonth(year, month));
-						break;
-				}
-				matches = pattern.exec(offset);
-			}
-			return new Date(year, month, day);
-		};
-		var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) :
-			(typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));
-		newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate);
-		if (newDate) {
-			newDate.setHours(0);
-			newDate.setMinutes(0);
-			newDate.setSeconds(0);
-			newDate.setMilliseconds(0);
-		}
-		return this._daylightSavingAdjust(newDate);
-	},
-
-	/* Handle switch to/from daylight saving.
-	   Hours may be non-zero on daylight saving cut-over:
-	   > 12 when midnight changeover, but then cannot generate
-	   midnight datetime, so jump to 1AM, otherwise reset.
-	   @param  date  (Date) the date to check
-	   @return  (Date) the corrected date */
-	_daylightSavingAdjust: function(date) {
-		if (!date) return null;
-		date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);
-		return date;
-	},
-
-	/* Set the date(s) directly. */
-	_setDate: function(inst, date, noChange) {
-		var clear = !date;
-		var origMonth = inst.selectedMonth;
-		var origYear = inst.selectedYear;
-		var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));
-		inst.selectedDay = inst.currentDay = newDate.getDate();
-		inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();
-		inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();
-		if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange)
-			this._notifyChange(inst);
-		this._adjustInstDate(inst);
-		if (inst.input) {
-			inst.input.val(clear ? '' : this._formatDate(inst));
-		}
-	},
-
-	/* Retrieve the date(s) directly. */
-	_getDate: function(inst) {
-		var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null :
-			this._daylightSavingAdjust(new Date(
-			inst.currentYear, inst.currentMonth, inst.currentDay)));
-			return startDate;
-	},
-
-	/* Attach the onxxx handlers.  These are declared statically so
-	 * they work with static code transformers like Caja.
-	 */
-	_attachHandlers: function(inst) {
-		var stepMonths = this._get(inst, 'stepMonths');
-		var id = '#' + inst.id.replace( /\\\\/g, "\\" );
-		inst.dpDiv.find('[data-handler]').map(function () {
-			var handler = {
-				prev: function () {
-					window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, -stepMonths, 'M');
-				},
-				next: function () {
-					window['DP_jQuery_' + dpuuid].datepicker._adjustDate(id, +stepMonths, 'M');
-				},
-				hide: function () {
-					window['DP_jQuery_' + dpuuid].datepicker._hideDatepicker();
-				},
-				today: function () {
-					window['DP_jQuery_' + dpuuid].datepicker._gotoToday(id);
-				},
-				selectDay: function () {
-					window['DP_jQuery_' + dpuuid].datepicker._selectDay(id, +this.getAttribute('data-month'), +this.getAttribute('data-year'), this);
-					return false;
-				},
-				selectMonth: function () {
-					window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'M');
-					return false;
-				},
-				selectYear: function () {
-					window['DP_jQuery_' + dpuuid].datepicker._selectMonthYear(id, this, 'Y');
-					return false;
-				}
-			};
-			$(this).bind(this.getAttribute('data-event'), handler[this.getAttribute('data-handler')]);
-		});
-	},
-
-	/* Generate the HTML for the current state of the date picker. */
-	_generateHTML: function(inst) {
-		var today = new Date();
-		today = this._daylightSavingAdjust(
-			new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time
-		var isRTL = this._get(inst, 'isRTL');
-		var showButtonPanel = this._get(inst, 'showButtonPanel');
-		var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
-		var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
-		var numMonths = this._getNumberOfMonths(inst);
-		var showCurrentAtPos = this._get(inst, 'showCurrentAtPos');
-		var stepMonths = this._get(inst, 'stepMonths');
-		var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
-		var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :
-			new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
-		var minDate = this._getMinMaxDate(inst, 'min');
-		var maxDate = this._getMinMaxDate(inst, 'max');
-		var drawMonth = inst.drawMonth - showCurrentAtPos;
-		var drawYear = inst.drawYear;
-		if (drawMonth < 0) {
-			drawMonth += 12;
-			drawYear--;
-		}
-		if (maxDate) {
-			var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),
-				maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));
-			maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
-			while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {
-				drawMonth--;
-				if (drawMonth < 0) {
-					drawMonth = 11;
-					drawYear--;
-				}
-			}
-		}
-		inst.drawMonth = drawMonth;
-		inst.drawYear = drawYear;
-		var prevText = this._get(inst, 'prevText');
-		prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,
-			this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),
-			this._getFormatConfig(inst)));
-		var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?
-			'<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click"' +
-			' title="' + prevText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>' :
-			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+ prevText +'"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'e' : 'w') + '">' + prevText + '</span></a>'));
-		var nextText = this._get(inst, 'nextText');
-		nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,
-			this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),
-			this._getFormatConfig(inst)));
-		var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?
-			'<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click"' +
-			' title="' + nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>' :
-			(hideIfNoPrevNext ? '' : '<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+ nextText + '"><span class="ui-icon ui-icon-circle-triangle-' + ( isRTL ? 'w' : 'e') + '">' + nextText + '</span></a>'));
-		var currentText = this._get(inst, 'currentText');
-		var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today);
-		currentText = (!navigationAsDateFormat ? currentText :
-			this.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));
-		var controls = (!inst.inline ? '<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">' +
-			this._get(inst, 'closeText') + '</button>' : '');
-		var buttonPanel = (showButtonPanel) ? '<div class="ui-datepicker-buttonpane ui-widget-content">' + (isRTL ? controls : '') +
-			(this._isInRange(inst, gotoDate) ? '<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click"' +
-			'>' + currentText + '</button>' : '') + (isRTL ? '' : controls) + '</div>' : '';
-		var firstDay = parseInt(this._get(inst, 'firstDay'),10);
-		firstDay = (isNaN(firstDay) ? 0 : firstDay);
-		var showWeek = this._get(inst, 'showWeek');
-		var dayNames = this._get(inst, 'dayNames');
-		var dayNamesShort = this._get(inst, 'dayNamesShort');
-		var dayNamesMin = this._get(inst, 'dayNamesMin');
-		var monthNames = this._get(inst, 'monthNames');
-		var monthNamesShort = this._get(inst, 'monthNamesShort');
-		var beforeShowDay = this._get(inst, 'beforeShowDay');
-		var showOtherMonths = this._get(inst, 'showOtherMonths');
-		var selectOtherMonths = this._get(inst, 'selectOtherMonths');
-		var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
-		var defaultDate = this._getDefaultDate(inst);
-		var html = '';
-		for (var row = 0; row < numMonths[0]; row++) {
-			var group = '';
-			this.maxRows = 4;
-			for (var col = 0; col < numMonths[1]; col++) {
-				var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));
-				var cornerClass = ' ui-corner-all';
-				var calender = '';
-				if (isMultiMonth) {
-					calender += '<div class="ui-datepicker-group';
-					if (numMonths[1] > 1)
-						switch (col) {
-							case 0: calender += ' ui-datepicker-group-first';
-								cornerClass = ' ui-corner-' + (isRTL ? 'right' : 'left'); break;
-							case numMonths[1]-1: calender += ' ui-datepicker-group-last';
-								cornerClass = ' ui-corner-' + (isRTL ? 'left' : 'right'); break;
-							default: calender += ' ui-datepicker-group-middle'; cornerClass = ''; break;
-						}
-					calender += '">';
-				}
-				calender += '<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix' + cornerClass + '">' +
-					(/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') +
-					(/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') +
-					this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,
-					row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers
-					'</div><table class="ui-datepicker-calendar"><thead>' +
-					'<tr>';
-				var thead = (showWeek ? '<th class="ui-datepicker-week-col">' + this._get(inst, 'weekHeader') + '</th>' : '');
-				for (var dow = 0; dow < 7; dow++) { // days of the week
-					var day = (dow + firstDay) % 7;
-					thead += '<th' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' +
-						'<span title="' + dayNames[day] + '">' + dayNamesMin[day] + '</span></th>';
-				}
-				calender += thead + '</tr></thead><tbody>';
-				var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
-				if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
-					inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
-				var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
-				var curRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate
-				var numRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)
-				this.maxRows = numRows;
-				var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));
-				for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows
-					calender += '<tr>';
-					var tbody = (!showWeek ? '' : '<td class="ui-datepicker-week-col">' +
-						this._get(inst, 'calculateWeek')(printDate) + '</td>');
-					for (var dow = 0; dow < 7; dow++) { // create date picker days
-						var daySettings = (beforeShowDay ?
-							beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']);
-						var otherMonth = (printDate.getMonth() != drawMonth);
-						var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||
-							(minDate && printDate < minDate) || (maxDate && printDate > maxDate);
-						tbody += '<td class="' +
-							((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end' : '') + // highlight weekends
-							(otherMonth ? ' ui-datepicker-other-month' : '') + // highlight days from other months
-							((printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth && inst._keyEvent) || // user pressed key
-							(defaultDate.getTime() == printDate.getTime() && defaultDate.getTime() == selectedDate.getTime()) ?
-							// or defaultDate is current printedDate and defaultDate is selectedDate
-							' ' + this._dayOverClass : '') + // highlight selected day
-							(unselectable ? ' ' + this._unselectableClass + ' ui-state-disabled': '') +  // highlight unselectable days
-							(otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] + // highlight custom dates
-							(printDate.getTime() == currentDate.getTime() ? ' ' + this._currentClass : '') + // highlight selected day
-							(printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' + // highlight today (if different)
-							((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') + // cell title
-							(unselectable ? '' : ' data-handler="selectDay" data-event="click" data-month="' + printDate.getMonth() + '" data-year="' + printDate.getFullYear() + '"') + '>' + // actions
-							(otherMonth && !showOtherMonths ? '&#xa0;' : // display for other months
-							(unselectable ? '<span class="ui-state-default">' + printDate.getDate() + '</span>' : '<a class="ui-state-default' +
-							(printDate.getTime() == today.getTime() ? ' ui-state-highlight' : '') +
-							(printDate.getTime() == currentDate.getTime() ? ' ui-state-active' : '') + // highlight selected day
-							(otherMonth ? ' ui-priority-secondary' : '') + // distinguish dates from other months
-							'" href="#">' + printDate.getDate() + '</a>')) + '</td>'; // display selectable date
-						printDate.setDate(printDate.getDate() + 1);
-						printDate = this._daylightSavingAdjust(printDate);
-					}
-					calender += tbody + '</tr>';
-				}
-				drawMonth++;
-				if (drawMonth > 11) {
-					drawMonth = 0;
-					drawYear++;
-				}
-				calender += '</tbody></table>' + (isMultiMonth ? '</div>' +
-							((numMonths[0] > 0 && col == numMonths[1]-1) ? '<div class="ui-datepicker-row-break"></div>' : '') : '');
-				group += calender;
-			}
-			html += group;
-		}
-		html += buttonPanel + ($.ui.ie6 && !inst.inline ?
-			'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>' : '');
-		inst._keyEvent = false;
-		return html;
-	},
-
-	/* Generate the month and year header. */
-	_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,
-			secondary, monthNames, monthNamesShort) {
-		var changeMonth = this._get(inst, 'changeMonth');
-		var changeYear = this._get(inst, 'changeYear');
-		var showMonthAfterYear = this._get(inst, 'showMonthAfterYear');
-		var html = '<div class="ui-datepicker-title">';
-		var monthHtml = '';
-		// month selection
-		if (secondary || !changeMonth)
-			monthHtml += '<span class="ui-datepicker-month">' + monthNames[drawMonth] + '</span>';
-		else {
-			var inMinYear = (minDate && minDate.getFullYear() == drawYear);
-			var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
-			monthHtml += '<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';
-			for (var month = 0; month < 12; month++) {
-				if ((!inMinYear || month >= minDate.getMonth()) &&
-						(!inMaxYear || month <= maxDate.getMonth()))
-					monthHtml += '<option value="' + month + '"' +
-						(month == drawMonth ? ' selected="selected"' : '') +
-						'>' + monthNamesShort[month] + '</option>';
-			}
-			monthHtml += '</select>';
-		}
-		if (!showMonthAfterYear)
-			html += monthHtml + (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '');
-		// year selection
-		if ( !inst.yearshtml ) {
-			inst.yearshtml = '';
-			if (secondary || !changeYear)
-				html += '<span class="ui-datepicker-year">' + drawYear + '</span>';
-			else {
-				// determine range of years to display
-				var years = this._get(inst, 'yearRange').split(':');
-				var thisYear = new Date().getFullYear();
-				var determineYear = function(value) {
-					var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) :
-						(value.match(/[+-].*/) ? thisYear + parseInt(value, 10) :
-						parseInt(value, 10)));
-					return (isNaN(year) ? thisYear : year);
-				};
-				var year = determineYear(years[0]);
-				var endYear = Math.max(year, determineYear(years[1] || ''));
-				year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
-				endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
-				inst.yearshtml += '<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';
-				for (; year <= endYear; year++) {
-					inst.yearshtml += '<option value="' + year + '"' +
-						(year == drawYear ? ' selected="selected"' : '') +
-						'>' + year + '</option>';
-				}
-				inst.yearshtml += '</select>';
-
-				html += inst.yearshtml;
-				inst.yearshtml = null;
-			}
-		}
-		html += this._get(inst, 'yearSuffix');
-		if (showMonthAfterYear)
-			html += (secondary || !(changeMonth && changeYear) ? '&#xa0;' : '') + monthHtml;
-		html += '</div>'; // Close datepicker_header
-		return html;
-	},
-
-	/* Adjust one of the date sub-fields. */
-	_adjustInstDate: function(inst, offset, period) {
-		var year = inst.drawYear + (period == 'Y' ? offset : 0);
-		var month = inst.drawMonth + (period == 'M' ? offset : 0);
-		var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
-			(period == 'D' ? offset : 0);
-		var date = this._restrictMinMax(inst,
-			this._daylightSavingAdjust(new Date(year, month, day)));
-		inst.selectedDay = date.getDate();
-		inst.drawMonth = inst.selectedMonth = date.getMonth();
-		inst.drawYear = inst.selectedYear = date.getFullYear();
-		if (period == 'M' || period == 'Y')
-			this._notifyChange(inst);
-	},
-
-	/* Ensure a date is within any min/max bounds. */
-	_restrictMinMax: function(inst, date) {
-		var minDate = this._getMinMaxDate(inst, 'min');
-		var maxDate = this._getMinMaxDate(inst, 'max');
-		var newDate = (minDate && date < minDate ? minDate : date);
-		newDate = (maxDate && newDate > maxDate ? maxDate : newDate);
-		return newDate;
-	},
-
-	/* Notify change of month/year. */
-	_notifyChange: function(inst) {
-		var onChange = this._get(inst, 'onChangeMonthYear');
-		if (onChange)
-			onChange.apply((inst.input ? inst.input[0] : null),
-				[inst.selectedYear, inst.selectedMonth + 1, inst]);
-	},
-
-	/* Determine the number of months to show. */
-	_getNumberOfMonths: function(inst) {
-		var numMonths = this._get(inst, 'numberOfMonths');
-		return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths));
-	},
-
-	/* Determine the current maximum date - ensure no time components are set. */
-	_getMinMaxDate: function(inst, minMax) {
-		return this._determineDate(inst, this._get(inst, minMax + 'Date'), null);
-	},
-
-	/* Find the number of days in a given month. */
-	_getDaysInMonth: function(year, month) {
-		return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();
-	},
-
-	/* Find the day of the week of the first of a month. */
-	_getFirstDayOfMonth: function(year, month) {
-		return new Date(year, month, 1).getDay();
-	},
-
-	/* Determines if we should allow a "next/prev" month display change. */
-	_canAdjustMonth: function(inst, offset, curYear, curMonth) {
-		var numMonths = this._getNumberOfMonths(inst);
-		var date = this._daylightSavingAdjust(new Date(curYear,
-			curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));
-		if (offset < 0)
-			date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
-		return this._isInRange(inst, date);
-	},
-
-	/* Is the given date in the accepted range? */
-	_isInRange: function(inst, date) {
-		var minDate = this._getMinMaxDate(inst, 'min');
-		var maxDate = this._getMinMaxDate(inst, 'max');
-		return ((!minDate || date.getTime() >= minDate.getTime()) &&
-			(!maxDate || date.getTime() <= maxDate.getTime()));
-	},
-
-	/* Provide the configuration settings for formatting/parsing. */
-	_getFormatConfig: function(inst) {
-		var shortYearCutoff = this._get(inst, 'shortYearCutoff');
-		shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff :
-			new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
-		return {shortYearCutoff: shortYearCutoff,
-			dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'),
-			monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')};
-	},
-
-	/* Format the given date for display. */
-	_formatDate: function(inst, day, month, year) {
-		if (!day) {
-			inst.currentDay = inst.selectedDay;
-			inst.currentMonth = inst.selectedMonth;
-			inst.currentYear = inst.selectedYear;
-		}
-		var date = (day ? (typeof day == 'object' ? day :
-			this._daylightSavingAdjust(new Date(year, month, day))) :
-			this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));
-		return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
-	}
-});
-
-/*
- * Bind hover events for datepicker elements.
- * Done via delegate so the binding only occurs once in the lifetime of the parent div.
- * Global instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.
- */
-function bindHover(dpDiv) {
-	var selector = 'button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a';
-	return dpDiv.delegate(selector, 'mouseout', function() {
-			$(this).removeClass('ui-state-hover');
-			if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover');
-			if (this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover');
-		})
-		.delegate(selector, 'mouseover', function(){
-			if (!$.datepicker._isDisabledDatepicker( instActive.inline ? dpDiv.parent()[0] : instActive.input[0])) {
-				$(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover');
-				$(this).addClass('ui-state-hover');
-				if (this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover');
-				if (this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover');
-			}
-		});
-}
-
-/* jQuery extend now ignores nulls! */
-function extendRemove(target, props) {
-	$.extend(target, props);
-	for (var name in props)
-		if (props[name] == null || props[name] == undefined)
-			target[name] = props[name];
-	return target;
-};
-
-/* Invoke the datepicker functionality.
-   @param  options  string - a command, optionally followed by additional parameters or
-	                Object - settings for attaching new datepicker functionality
-   @return  jQuery object */
-$.fn.datepicker = function(options){
-
-	/* Verify an empty collection wasn't passed - Fixes #6976 */
-	if ( !this.length ) {
-		return this;
-	}
-
-	/* Initialise the date picker. */
-	if (!$.datepicker.initialized) {
-		$(document).mousedown($.datepicker._checkExternalClick).
-			find(document.body).append($.datepicker.dpDiv);
-		$.datepicker.initialized = true;
-	}
-
-	var otherArgs = Array.prototype.slice.call(arguments, 1);
-	if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget'))
-		return $.datepicker['_' + options + 'Datepicker'].
-			apply($.datepicker, [this[0]].concat(otherArgs));
-	if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string')
-		return $.datepicker['_' + options + 'Datepicker'].
-			apply($.datepicker, [this[0]].concat(otherArgs));
-	return this.each(function() {
-		typeof options == 'string' ?
-			$.datepicker['_' + options + 'Datepicker'].
-				apply($.datepicker, [this].concat(otherArgs)) :
-			$.datepicker._attachDatepicker(this, options);
-	});
-};
-
-$.datepicker = new Datepicker(); // singleton instance
-$.datepicker.initialized = false;
-$.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.9.2";
-
-// Workaround for #4055
-// Add another global to avoid noConflict issues with inline event handlers
-window['DP_jQuery_' + dpuuid] = $;
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-var uiDialogClasses = "ui-dialog ui-widget ui-widget-content ui-corner-all ",
-	sizeRelatedOptions = {
-		buttons: true,
-		height: true,
-		maxHeight: true,
-		maxWidth: true,
-		minHeight: true,
-		minWidth: true,
-		width: true
-	},
-	resizableRelatedOptions = {
-		maxHeight: true,
-		maxWidth: true,
-		minHeight: true,
-		minWidth: true
-	};
-
-$.widget("ui.dialog", {
-	version: "1.9.2",
-	options: {
-		autoOpen: true,
-		buttons: {},
-		closeOnEscape: true,
-		closeText: "close",
-		dialogClass: "",
-		draggable: true,
-		hide: null,
-		height: "auto",
-		maxHeight: false,
-		maxWidth: false,
-		minHeight: 150,
-		minWidth: 150,
-		modal: false,
-		position: {
-			my: "center",
-			at: "center",
-			of: window,
-			collision: "fit",
-			// ensure that the titlebar is never outside the document
-			using: function( pos ) {
-				var topOffset = $( this ).css( pos ).offset().top;
-				if ( topOffset < 0 ) {
-					$( this ).css( "top", pos.top - topOffset );
-				}
-			}
-		},
-		resizable: true,
-		show: null,
-		stack: true,
-		title: "",
-		width: 300,
-		zIndex: 1000
-	},
-
-	_create: function() {
-		this.originalTitle = this.element.attr( "title" );
-		// #5742 - .attr() might return a DOMElement
-		if ( typeof this.originalTitle !== "string" ) {
-			this.originalTitle = "";
-		}
-		this.oldPosition = {
-			parent: this.element.parent(),
-			index: this.element.parent().children().index( this.element )
-		};
-		this.options.title = this.options.title || this.originalTitle;
-		var that = this,
-			options = this.options,
-
-			title = options.title || "&#160;",
-			uiDialog,
-			uiDialogTitlebar,
-			uiDialogTitlebarClose,
-			uiDialogTitle,
-			uiDialogButtonPane;
-
-			uiDialog = ( this.uiDialog = $( "<div>" ) )
-				.addClass( uiDialogClasses + options.dialogClass )
-				.css({
-					display: "none",
-					outline: 0, // TODO: move to stylesheet
-					zIndex: options.zIndex
-				})
-				// setting tabIndex makes the div focusable
-				.attr( "tabIndex", -1)
-				.keydown(function( event ) {
-					if ( options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-							event.keyCode === $.ui.keyCode.ESCAPE ) {
-						that.close( event );
-						event.preventDefault();
-					}
-				})
-				.mousedown(function( event ) {
-					that.moveToTop( false, event );
-				})
-				.appendTo( "body" );
-
-			this.element
-				.show()
-				.removeAttr( "title" )
-				.addClass( "ui-dialog-content ui-widget-content" )
-				.appendTo( uiDialog );
-
-			uiDialogTitlebar = ( this.uiDialogTitlebar = $( "<div>" ) )
-				.addClass( "ui-dialog-titlebar  ui-widget-header  " +
-					"ui-corner-all  ui-helper-clearfix" )
-				.bind( "mousedown", function() {
-					// Dialog isn't getting focus when dragging (#8063)
-					uiDialog.focus();
-				})
-				.prependTo( uiDialog );
-
-			uiDialogTitlebarClose = $( "<a href='#'></a>" )
-				.addClass( "ui-dialog-titlebar-close  ui-corner-all" )
-				.attr( "role", "button" )
-				.click(function( event ) {
-					event.preventDefault();
-					that.close( event );
-				})
-				.appendTo( uiDialogTitlebar );
-
-			( this.uiDialogTitlebarCloseText = $( "<span>" ) )
-				.addClass( "ui-icon ui-icon-closethick" )
-				.text( options.closeText )
-				.appendTo( uiDialogTitlebarClose );
-
-			uiDialogTitle = $( "<span>" )
-				.uniqueId()
-				.addClass( "ui-dialog-title" )
-				.html( title )
-				.prependTo( uiDialogTitlebar );
-
-			uiDialogButtonPane = ( this.uiDialogButtonPane = $( "<div>" ) )
-				.addClass( "ui-dialog-buttonpane ui-widget-content ui-helper-clearfix" );
-
-			( this.uiButtonSet = $( "<div>" ) )
-				.addClass( "ui-dialog-buttonset" )
-				.appendTo( uiDialogButtonPane );
-
-		uiDialog.attr({
-			role: "dialog",
-			"aria-labelledby": uiDialogTitle.attr( "id" )
-		});
-
-		uiDialogTitlebar.find( "*" ).add( uiDialogTitlebar ).disableSelection();
-		this._hoverable( uiDialogTitlebarClose );
-		this._focusable( uiDialogTitlebarClose );
-
-		if ( options.draggable && $.fn.draggable ) {
-			this._makeDraggable();
-		}
-		if ( options.resizable && $.fn.resizable ) {
-			this._makeResizable();
-		}
-
-		this._createButtons( options.buttons );
-		this._isOpen = false;
-
-		if ( $.fn.bgiframe ) {
-			uiDialog.bgiframe();
-		}
-
-		// prevent tabbing out of modal dialogs
-		this._on( uiDialog, { keydown: function( event ) {
-			if ( !options.modal || event.keyCode !== $.ui.keyCode.TAB ) {
-				return;
-			}
-
-			var tabbables = $( ":tabbable", uiDialog ),
-				first = tabbables.filter( ":first" ),
-				last  = tabbables.filter( ":last" );
-
-			if ( event.target === last[0] && !event.shiftKey ) {
-				first.focus( 1 );
-				return false;
-			} else if ( event.target === first[0] && event.shiftKey ) {
-				last.focus( 1 );
-				return false;
-			}
-		}});
-	},
-
-	_init: function() {
-		if ( this.options.autoOpen ) {
-			this.open();
-		}
-	},
-
-	_destroy: function() {
-		var next,
-			oldPosition = this.oldPosition;
-
-		if ( this.overlay ) {
-			this.overlay.destroy();
-		}
-		this.uiDialog.hide();
-		this.element
-			.removeClass( "ui-dialog-content ui-widget-content" )
-			.hide()
-			.appendTo( "body" );
-		this.uiDialog.remove();
-
-		if ( this.originalTitle ) {
-			this.element.attr( "title", this.originalTitle );
-		}
-
-		next = oldPosition.parent.children().eq( oldPosition.index );
-		// Don't try to place the dialog next to itself (#8613)
-		if ( next.length && next[ 0 ] !== this.element[ 0 ] ) {
-			next.before( this.element );
-		} else {
-			oldPosition.parent.append( this.element );
-		}
-	},
-
-	widget: function() {
-		return this.uiDialog;
-	},
-
-	close: function( event ) {
-		var that = this,
-			maxZ, thisZ;
-
-		if ( !this._isOpen ) {
-			return;
-		}
-
-		if ( false === this._trigger( "beforeClose", event ) ) {
-			return;
-		}
-
-		this._isOpen = false;
-
-		if ( this.overlay ) {
-			this.overlay.destroy();
-		}
-
-		if ( this.options.hide ) {
-			this._hide( this.uiDialog, this.options.hide, function() {
-				that._trigger( "close", event );
-			});
-		} else {
-			this.uiDialog.hide();
-			this._trigger( "close", event );
-		}
-
-		$.ui.dialog.overlay.resize();
-
-		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-		if ( this.options.modal ) {
-			maxZ = 0;
-			$( ".ui-dialog" ).each(function() {
-				if ( this !== that.uiDialog[0] ) {
-					thisZ = $( this ).css( "z-index" );
-					if ( !isNaN( thisZ ) ) {
-						maxZ = Math.max( maxZ, thisZ );
-					}
-				}
-			});
-			$.ui.dialog.maxZ = maxZ;
-		}
-
-		return this;
-	},
-
-	isOpen: function() {
-		return this._isOpen;
-	},
-
-	// the force parameter allows us to move modal dialogs to their correct
-	// position on open
-	moveToTop: function( force, event ) {
-		var options = this.options,
-			saveScroll;
-
-		if ( ( options.modal && !force ) ||
-				( !options.stack && !options.modal ) ) {
-			return this._trigger( "focus", event );
-		}
-
-		if ( options.zIndex > $.ui.dialog.maxZ ) {
-			$.ui.dialog.maxZ = options.zIndex;
-		}
-		if ( this.overlay ) {
-			$.ui.dialog.maxZ += 1;
-			$.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ;
-			this.overlay.$el.css( "z-index", $.ui.dialog.overlay.maxZ );
-		}
-
-		// Save and then restore scroll
-		// Opera 9.5+ resets when parent z-index is changed.
-		// http://bugs.jqueryui.com/ticket/3193
-		saveScroll = {
-			scrollTop: this.element.scrollTop(),
-			scrollLeft: this.element.scrollLeft()
-		};
-		$.ui.dialog.maxZ += 1;
-		this.uiDialog.css( "z-index", $.ui.dialog.maxZ );
-		this.element.attr( saveScroll );
-		this._trigger( "focus", event );
-
-		return this;
-	},
-
-	open: function() {
-		if ( this._isOpen ) {
-			return;
-		}
-
-		var hasFocus,
-			options = this.options,
-			uiDialog = this.uiDialog;
-
-		this._size();
-		this._position( options.position );
-		uiDialog.show( options.show );
-		this.overlay = options.modal ? new $.ui.dialog.overlay( this ) : null;
-		this.moveToTop( true );
-
-		// set focus to the first tabbable element in the content area or the first button
-		// if there are no tabbable elements, set focus on the dialog itself
-		hasFocus = this.element.find( ":tabbable" );
-		if ( !hasFocus.length ) {
-			hasFocus = this.uiDialogButtonPane.find( ":tabbable" );
-			if ( !hasFocus.length ) {
-				hasFocus = uiDialog;
-			}
-		}
-		hasFocus.eq( 0 ).focus();
-
-		this._isOpen = true;
-		this._trigger( "open" );
-
-		return this;
-	},
-
-	_createButtons: function( buttons ) {
-		var that = this,
-			hasButtons = false;
-
-		// if we already have a button pane, remove it
-		this.uiDialogButtonPane.remove();
-		this.uiButtonSet.empty();
-
-		if ( typeof buttons === "object" && buttons !== null ) {
-			$.each( buttons, function() {
-				return !(hasButtons = true);
-			});
-		}
-		if ( hasButtons ) {
-			$.each( buttons, function( name, props ) {
-				var button, click;
-				props = $.isFunction( props ) ?
-					{ click: props, text: name } :
-					props;
-				// Default to a non-submitting button
-				props = $.extend( { type: "button" }, props );
-				// Change the context for the click callback to be the main element
-				click = props.click;
-				props.click = function() {
-					click.apply( that.element[0], arguments );
-				};
-				button = $( "<button></button>", props )
-					.appendTo( that.uiButtonSet );
-				if ( $.fn.button ) {
-					button.button();
-				}
-			});
-			this.uiDialog.addClass( "ui-dialog-buttons" );
-			this.uiDialogButtonPane.appendTo( this.uiDialog );
-		} else {
-			this.uiDialog.removeClass( "ui-dialog-buttons" );
-		}
-	},
-
-	_makeDraggable: function() {
-		var that = this,
-			options = this.options;
-
-		function filteredUi( ui ) {
-			return {
-				position: ui.position,
-				offset: ui.offset
-			};
-		}
-
-		this.uiDialog.draggable({
-			cancel: ".ui-dialog-content, .ui-dialog-titlebar-close",
-			handle: ".ui-dialog-titlebar",
-			containment: "document",
-			start: function( event, ui ) {
-				$( this )
-					.addClass( "ui-dialog-dragging" );
-				that._trigger( "dragStart", event, filteredUi( ui ) );
-			},
-			drag: function( event, ui ) {
-				that._trigger( "drag", event, filteredUi( ui ) );
-			},
-			stop: function( event, ui ) {
-				options.position = [
-					ui.position.left - that.document.scrollLeft(),
-					ui.position.top - that.document.scrollTop()
-				];
-				$( this )
-					.removeClass( "ui-dialog-dragging" );
-				that._trigger( "dragStop", event, filteredUi( ui ) );
-				$.ui.dialog.overlay.resize();
-			}
-		});
-	},
-
-	_makeResizable: function( handles ) {
-		handles = (handles === undefined ? this.options.resizable : handles);
-		var that = this,
-			options = this.options,
-			// .ui-resizable has position: relative defined in the stylesheet
-			// but dialogs have to use absolute or fixed positioning
-			position = this.uiDialog.css( "position" ),
-			resizeHandles = typeof handles === 'string' ?
-				handles	:
-				"n,e,s,w,se,sw,ne,nw";
-
-		function filteredUi( ui ) {
-			return {
-				originalPosition: ui.originalPosition,
-				originalSize: ui.originalSize,
-				position: ui.position,
-				size: ui.size
-			};
-		}
-
-		this.uiDialog.resizable({
-			cancel: ".ui-dialog-content",
-			containment: "document",
-			alsoResize: this.element,
-			maxWidth: options.maxWidth,
-			maxHeight: options.maxHeight,
-			minWidth: options.minWidth,
-			minHeight: this._minHeight(),
-			handles: resizeHandles,
-			start: function( event, ui ) {
-				$( this ).addClass( "ui-dialog-resizing" );
-				that._trigger( "resizeStart", event, filteredUi( ui ) );
-			},
-			resize: function( event, ui ) {
-				that._trigger( "resize", event, filteredUi( ui ) );
-			},
-			stop: function( event, ui ) {
-				$( this ).removeClass( "ui-dialog-resizing" );
-				options.height = $( this ).height();
-				options.width = $( this ).width();
-				that._trigger( "resizeStop", event, filteredUi( ui ) );
-				$.ui.dialog.overlay.resize();
-			}
-		})
-		.css( "position", position )
-		.find( ".ui-resizable-se" )
-			.addClass( "ui-icon ui-icon-grip-diagonal-se" );
-	},
-
-	_minHeight: function() {
-		var options = this.options;
-
-		if ( options.height === "auto" ) {
-			return options.minHeight;
-		} else {
-			return Math.min( options.minHeight, options.height );
-		}
-	},
-
-	_position: function( position ) {
-		var myAt = [],
-			offset = [ 0, 0 ],
-			isVisible;
-
-		if ( position ) {
-			// deep extending converts arrays to objects in jQuery <= 1.3.2 :-(
-	//		if (typeof position == 'string' || $.isArray(position)) {
-	//			myAt = $.isArray(position) ? position : position.split(' ');
-
-			if ( typeof position === "string" || (typeof position === "object" && "0" in position ) ) {
-				myAt = position.split ? position.split( " " ) : [ position[ 0 ], position[ 1 ] ];
-				if ( myAt.length === 1 ) {
-					myAt[ 1 ] = myAt[ 0 ];
-				}
-
-				$.each( [ "left", "top" ], function( i, offsetPosition ) {
-					if ( +myAt[ i ] === myAt[ i ] ) {
-						offset[ i ] = myAt[ i ];
-						myAt[ i ] = offsetPosition;
-					}
-				});
-
-				position = {
-					my: myAt[0] + (offset[0] < 0 ? offset[0] : "+" + offset[0]) + " " +
-						myAt[1] + (offset[1] < 0 ? offset[1] : "+" + offset[1]),
-					at: myAt.join( " " )
-				};
-			}
-
-			position = $.extend( {}, $.ui.dialog.prototype.options.position, position );
-		} else {
-			position = $.ui.dialog.prototype.options.position;
-		}
-
-		// need to show the dialog to get the actual offset in the position plugin
-		isVisible = this.uiDialog.is( ":visible" );
-		if ( !isVisible ) {
-			this.uiDialog.show();
-		}
-		this.uiDialog.position( position );
-		if ( !isVisible ) {
-			this.uiDialog.hide();
-		}
-	},
-
-	_setOptions: function( options ) {
-		var that = this,
-			resizableOptions = {},
-			resize = false;
-
-		$.each( options, function( key, value ) {
-			that._setOption( key, value );
-
-			if ( key in sizeRelatedOptions ) {
-				resize = true;
-			}
-			if ( key in resizableRelatedOptions ) {
-				resizableOptions[ key ] = value;
-			}
-		});
-
-		if ( resize ) {
-			this._size();
-		}
-		if ( this.uiDialog.is( ":data(resizable)" ) ) {
-			this.uiDialog.resizable( "option", resizableOptions );
-		}
-	},
-
-	_setOption: function( key, value ) {
-		var isDraggable, isResizable,
-			uiDialog = this.uiDialog;
-
-		switch ( key ) {
-			case "buttons":
-				this._createButtons( value );
-				break;
-			case "closeText":
-				// ensure that we always pass a string
-				this.uiDialogTitlebarCloseText.text( "" + value );
-				break;
-			case "dialogClass":
-				uiDialog
-					.removeClass( this.options.dialogClass )
-					.addClass( uiDialogClasses + value );
-				break;
-			case "disabled":
-				if ( value ) {
-					uiDialog.addClass( "ui-dialog-disabled" );
-				} else {
-					uiDialog.removeClass( "ui-dialog-disabled" );
-				}
-				break;
-			case "draggable":
-				isDraggable = uiDialog.is( ":data(draggable)" );
-				if ( isDraggable && !value ) {
-					uiDialog.draggable( "destroy" );
-				}
-
-				if ( !isDraggable && value ) {
-					this._makeDraggable();
-				}
-				break;
-			case "position":
-				this._position( value );
-				break;
-			case "resizable":
-				// currently resizable, becoming non-resizable
-				isResizable = uiDialog.is( ":data(resizable)" );
-				if ( isResizable && !value ) {
-					uiDialog.resizable( "destroy" );
-				}
-
-				// currently resizable, changing handles
-				if ( isResizable && typeof value === "string" ) {
-					uiDialog.resizable( "option", "handles", value );
-				}
-
-				// currently non-resizable, becoming resizable
-				if ( !isResizable && value !== false ) {
-					this._makeResizable( value );
-				}
-				break;
-			case "title":
-				// convert whatever was passed in o a string, for html() to not throw up
-				$( ".ui-dialog-title", this.uiDialogTitlebar )
-					.html( "" + ( value || "&#160;" ) );
-				break;
-		}
-
-		this._super( key, value );
-	},
-
-	_size: function() {
-		/* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content
-		 * divs will both have width and height set, so we need to reset them
-		 */
-		var nonContentHeight, minContentHeight, autoHeight,
-			options = this.options,
-			isVisible = this.uiDialog.is( ":visible" );
-
-		// reset content sizing
-		this.element.show().css({
-			width: "auto",
-			minHeight: 0,
-			height: 0
-		});
-
-		if ( options.minWidth > options.width ) {
-			options.width = options.minWidth;
-		}
-
-		// reset wrapper sizing
-		// determine the height of all the non-content elements
-		nonContentHeight = this.uiDialog.css({
-				height: "auto",
-				width: options.width
-			})
-			.outerHeight();
-		minContentHeight = Math.max( 0, options.minHeight - nonContentHeight );
-
-		if ( options.height === "auto" ) {
-			// only needed for IE6 support
-			if ( $.support.minHeight ) {
-				this.element.css({
-					minHeight: minContentHeight,
-					height: "auto"
-				});
-			} else {
-				this.uiDialog.show();
-				autoHeight = this.element.css( "height", "auto" ).height();
-				if ( !isVisible ) {
-					this.uiDialog.hide();
-				}
-				this.element.height( Math.max( autoHeight, minContentHeight ) );
-			}
-		} else {
-			this.element.height( Math.max( options.height - nonContentHeight, 0 ) );
-		}
-
-		if (this.uiDialog.is( ":data(resizable)" ) ) {
-			this.uiDialog.resizable( "option", "minHeight", this._minHeight() );
-		}
-	}
-});
-
-$.extend($.ui.dialog, {
-	uuid: 0,
-	maxZ: 0,
-
-	getTitleId: function($el) {
-		var id = $el.attr( "id" );
-		if ( !id ) {
-			this.uuid += 1;
-			id = this.uuid;
-		}
-		return "ui-dialog-title-" + id;
-	},
-
-	overlay: function( dialog ) {
-		this.$el = $.ui.dialog.overlay.create( dialog );
-	}
-});
-
-$.extend( $.ui.dialog.overlay, {
-	instances: [],
-	// reuse old instances due to IE memory leak with alpha transparency (see #5185)
-	oldInstances: [],
-	maxZ: 0,
-	events: $.map(
-		"focus,mousedown,mouseup,keydown,keypress,click".split( "," ),
-		function( event ) {
-			return event + ".dialog-overlay";
-		}
-	).join( " " ),
-	create: function( dialog ) {
-		if ( this.instances.length === 0 ) {
-			// prevent use of anchors and inputs
-			// we use a setTimeout in case the overlay is created from an
-			// event that we're going to be cancelling (see #2804)
-			setTimeout(function() {
-				// handle $(el).dialog().dialog('close') (see #4065)
-				if ( $.ui.dialog.overlay.instances.length ) {
-					$( document ).bind( $.ui.dialog.overlay.events, function( event ) {
-						// stop events if the z-index of the target is < the z-index of the overlay
-						// we cannot return true when we don't want to cancel the event (#3523)
-						if ( $( event.target ).zIndex() < $.ui.dialog.overlay.maxZ ) {
-							return false;
-						}
-					});
-				}
-			}, 1 );
-
-			// handle window resize
-			$( window ).bind( "resize.dialog-overlay", $.ui.dialog.overlay.resize );
-		}
-
-		var $el = ( this.oldInstances.pop() || $( "<div>" ).addClass( "ui-widget-overlay" ) );
-
-		// allow closing by pressing the escape key
-		$( document ).bind( "keydown.dialog-overlay", function( event ) {
-			var instances = $.ui.dialog.overlay.instances;
-			// only react to the event if we're the top overlay
-			if ( instances.length !== 0 && instances[ instances.length - 1 ] === $el &&
-				dialog.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-				event.keyCode === $.ui.keyCode.ESCAPE ) {
-
-				dialog.close( event );
-				event.preventDefault();
-			}
-		});
-
-		$el.appendTo( document.body ).css({
-			width: this.width(),
-			height: this.height()
-		});
-
-		if ( $.fn.bgiframe ) {
-			$el.bgiframe();
-		}
-
-		this.instances.push( $el );
-		return $el;
-	},
-
-	destroy: function( $el ) {
-		var indexOf = $.inArray( $el, this.instances ),
-			maxZ = 0;
-
-		if ( indexOf !== -1 ) {
-			this.oldInstances.push( this.instances.splice( indexOf, 1 )[ 0 ] );
-		}
-
-		if ( this.instances.length === 0 ) {
-			$( [ document, window ] ).unbind( ".dialog-overlay" );
-		}
-
-		$el.height( 0 ).width( 0 ).remove();
-
-		// adjust the maxZ to allow other modal dialogs to continue to work (see #4309)
-		$.each( this.instances, function() {
-			maxZ = Math.max( maxZ, this.css( "z-index" ) );
-		});
-		this.maxZ = maxZ;
-	},
-
-	height: function() {
-		var scrollHeight,
-			offsetHeight;
-		// handle IE
-		if ( $.ui.ie ) {
-			scrollHeight = Math.max(
-				document.documentElement.scrollHeight,
-				document.body.scrollHeight
-			);
-			offsetHeight = Math.max(
-				document.documentElement.offsetHeight,
-				document.body.offsetHeight
-			);
-
-			if ( scrollHeight < offsetHeight ) {
-				return $( window ).height() + "px";
-			} else {
-				return scrollHeight + "px";
-			}
-		// handle "good" browsers
-		} else {
-			return $( document ).height() + "px";
-		}
-	},
-
-	width: function() {
-		var scrollWidth,
-			offsetWidth;
-		// handle IE
-		if ( $.ui.ie ) {
-			scrollWidth = Math.max(
-				document.documentElement.scrollWidth,
-				document.body.scrollWidth
-			);
-			offsetWidth = Math.max(
-				document.documentElement.offsetWidth,
-				document.body.offsetWidth
-			);
-
-			if ( scrollWidth < offsetWidth ) {
-				return $( window ).width() + "px";
-			} else {
-				return scrollWidth + "px";
-			}
-		// handle "good" browsers
-		} else {
-			return $( document ).width() + "px";
-		}
-	},
-
-	resize: function() {
-		/* If the dialog is draggable and the user drags it past the
-		 * right edge of the window, the document becomes wider so we
-		 * need to stretch the overlay. If the user then drags the
-		 * dialog back to the left, the document will become narrower,
-		 * so we need to shrink the overlay to the appropriate size.
-		 * This is handled by shrinking the overlay before setting it
-		 * to the full document size.
-		 */
-		var $overlays = $( [] );
-		$.each( $.ui.dialog.overlay.instances, function() {
-			$overlays = $overlays.add( this );
-		});
-
-		$overlays.css({
-			width: 0,
-			height: 0
-		}).css({
-			width: $.ui.dialog.overlay.width(),
-			height: $.ui.dialog.overlay.height()
-		});
-	}
-});
-
-$.extend( $.ui.dialog.overlay.prototype, {
-	destroy: function() {
-		$.ui.dialog.overlay.destroy( this.$el );
-	}
-});
-
-}( jQuery ) );
-
-(function( $, undefined ) {
-
-var rvertical = /up|down|vertical/,
-	rpositivemotion = /up|left|vertical|horizontal/;
-
-$.effects.effect.blind = function( o, done ) {
-	// Create element
-	var el = $( this ),
-		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-		mode = $.effects.setMode( el, o.mode || "hide" ),
-		direction = o.direction || "up",
-		vertical = rvertical.test( direction ),
-		ref = vertical ? "height" : "width",
-		ref2 = vertical ? "top" : "left",
-		motion = rpositivemotion.test( direction ),
-		animation = {},
-		show = mode === "show",
-		wrapper, distance, margin;
-
-	// if already wrapped, the wrapper's properties are my property. #6245
-	if ( el.parent().is( ".ui-effects-wrapper" ) ) {
-		$.effects.save( el.parent(), props );
-	} else {
-		$.effects.save( el, props );
-	}
-	el.show();
-	wrapper = $.effects.createWrapper( el ).css({
-		overflow: "hidden"
-	});
-
-	distance = wrapper[ ref ]();
-	margin = parseFloat( wrapper.css( ref2 ) ) || 0;
-
-	animation[ ref ] = show ? distance : 0;
-	if ( !motion ) {
-		el
-			.css( vertical ? "bottom" : "right", 0 )
-			.css( vertical ? "top" : "left", "auto" )
-			.css({ position: "absolute" });
-
-		animation[ ref2 ] = show ? margin : distance + margin;
-	}
-
-	// start at 0 if we are showing
-	if ( show ) {
-		wrapper.css( ref, 0 );
-		if ( ! motion ) {
-			wrapper.css( ref2, margin + distance );
-		}
-	}
-
-	// Animate
-	wrapper.animate( animation, {
-		duration: o.duration,
-		easing: o.easing,
-		queue: false,
-		complete: function() {
-			if ( mode === "hide" ) {
-				el.hide();
-			}
-			$.effects.restore( el, props );
-			$.effects.removeWrapper( el );
-			done();
-		}
-	});
-
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.bounce = function( o, done ) {
-	var el = $( this ),
-		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-
-		// defaults:
-		mode = $.effects.setMode( el, o.mode || "effect" ),
-		hide = mode === "hide",
-		show = mode === "show",
-		direction = o.direction || "up",
-		distance = o.distance,
-		times = o.times || 5,
-
-		// number of internal animations
-		anims = times * 2 + ( show || hide ? 1 : 0 ),
-		speed = o.duration / anims,
-		easing = o.easing,
-
-		// utility:
-		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
-		motion = ( direction === "up" || direction === "left" ),
-		i,
-		upAnim,
-		downAnim,
-
-		// we will need to re-assemble the queue to stack our animations in place
-		queue = el.queue(),
-		queuelen = queue.length;
-
-	// Avoid touching opacity to prevent clearType and PNG issues in IE
-	if ( show || hide ) {
-		props.push( "opacity" );
-	}
-
-	$.effects.save( el, props );
-	el.show();
-	$.effects.createWrapper( el ); // Create Wrapper
-
-	// default distance for the BIGGEST bounce is the outer Distance / 3
-	if ( !distance ) {
-		distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3;
-	}
-
-	if ( show ) {
-		downAnim = { opacity: 1 };
-		downAnim[ ref ] = 0;
-
-		// if we are showing, force opacity 0 and set the initial position
-		// then do the "first" animation
-		el.css( "opacity", 0 )
-			.css( ref, motion ? -distance * 2 : distance * 2 )
-			.animate( downAnim, speed, easing );
-	}
-
-	// start at the smallest distance if we are hiding
-	if ( hide ) {
-		distance = distance / Math.pow( 2, times - 1 );
-	}
-
-	downAnim = {};
-	downAnim[ ref ] = 0;
-	// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here
-	for ( i = 0; i < times; i++ ) {
-		upAnim = {};
-		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
-
-		el.animate( upAnim, speed, easing )
-			.animate( downAnim, speed, easing );
-
-		distance = hide ? distance * 2 : distance / 2;
-	}
-
-	// Last Bounce when Hiding
-	if ( hide ) {
-		upAnim = { opacity: 0 };
-		upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance;
-
-		el.animate( upAnim, speed, easing );
-	}
-
-	el.queue(function() {
-		if ( hide ) {
-			el.hide();
-		}
-		$.effects.restore( el, props );
-		$.effects.removeWrapper( el );
-		done();
-	});
-
-	// inject all the animations we just queued to be first in line (after "inprogress")
-	if ( queuelen > 1) {
-		queue.splice.apply( queue,
-			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
-	}
-	el.dequeue();
-
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.clip = function( o, done ) {
-	// Create element
-	var el = $( this ),
-		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-		mode = $.effects.setMode( el, o.mode || "hide" ),
-		show = mode === "show",
-		direction = o.direction || "vertical",
-		vert = direction === "vertical",
-		size = vert ? "height" : "width",
-		position = vert ? "top" : "left",
-		animation = {},
-		wrapper, animate, distance;
-
-	// Save & Show
-	$.effects.save( el, props );
-	el.show();
-
-	// Create Wrapper
-	wrapper = $.effects.createWrapper( el ).css({
-		overflow: "hidden"
-	});
-	animate = ( el[0].tagName === "IMG" ) ? wrapper : el;
-	distance = animate[ size ]();
-
-	// Shift
-	if ( show ) {
-		animate.css( size, 0 );
-		animate.css( position, distance / 2 );
-	}
-
-	// Create Animation Object:
-	animation[ size ] = show ? distance : 0;
-	animation[ position ] = show ? 0 : distance / 2;
-
-	// Animate
-	animate.animate( animation, {
-		queue: false,
-		duration: o.duration,
-		easing: o.easing,
-		complete: function() {
-			if ( !show ) {
-				el.hide();
-			}
-			$.effects.restore( el, props );
-			$.effects.removeWrapper( el );
-			done();
-		}
-	});
-
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.drop = function( o, done ) {
-
-	var el = $( this ),
-		props = [ "position", "top", "bottom", "left", "right", "opacity", "height", "width" ],
-		mode = $.effects.setMode( el, o.mode || "hide" ),
-		show = mode === "show",
-		direction = o.direction || "left",
-		ref = ( direction === "up" || direction === "down" ) ? "top" : "left",
-		motion = ( direction === "up" || direction === "left" ) ? "pos" : "neg",
-		animation = {
-			opacity: show ? 1 : 0
-		},
-		distance;
-
-	// Adjust
-	$.effects.save( el, props );
-	el.show();
-	$.effects.createWrapper( el );
-
-	distance = o.distance || el[ ref === "top" ? "outerHeight": "outerWidth" ]( true ) / 2;
-
-	if ( show ) {
-		el
-			.css( "opacity", 0 )
-			.css( ref, motion === "pos" ? -distance : distance );
-	}
-
-	// Animation
-	animation[ ref ] = ( show ?
-		( motion === "pos" ? "+=" : "-=" ) :
-		( motion === "pos" ? "-=" : "+=" ) ) +
-		distance;
-
-	// Animate
-	el.animate( animation, {
-		queue: false,
-		duration: o.duration,
-		easing: o.easing,
-		complete: function() {
-			if ( mode === "hide" ) {
-				el.hide();
-			}
-			$.effects.restore( el, props );
-			$.effects.removeWrapper( el );
-			done();
-		}
-	});
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.explode = function( o, done ) {
-
-	var rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,
-		cells = rows,
-		el = $( this ),
-		mode = $.effects.setMode( el, o.mode || "hide" ),
-		show = mode === "show",
-
-		// show and then visibility:hidden the element before calculating offset
-		offset = el.show().css( "visibility", "hidden" ).offset(),
-
-		// width and height of a piece
-		width = Math.ceil( el.outerWidth() / cells ),
-		height = Math.ceil( el.outerHeight() / rows ),
-		pieces = [],
-
-		// loop
-		i, j, left, top, mx, my;
-
-	// children animate complete:
-	function childComplete() {
-		pieces.push( this );
-		if ( pieces.length === rows * cells ) {
-			animComplete();
-		}
-	}
-
-	// clone the element for each row and cell.
-	for( i = 0; i < rows ; i++ ) { // ===>
-		top = offset.top + i * height;
-		my = i - ( rows - 1 ) / 2 ;
-
-		for( j = 0; j < cells ; j++ ) { // |||
-			left = offset.left + j * width;
-			mx = j - ( cells - 1 ) / 2 ;
-
-			// Create a clone of the now hidden main element that will be absolute positioned
-			// within a wrapper div off the -left and -top equal to size of our pieces
-			el
-				.clone()
-				.appendTo( "body" )
-				.wrap( "<div></div>" )
-				.css({
-					position: "absolute",
-					visibility: "visible",
-					left: -j * width,
-					top: -i * height
-				})
-
-			// select the wrapper - make it overflow: hidden and absolute positioned based on
-			// where the original was located +left and +top equal to the size of pieces
-				.parent()
-				.addClass( "ui-effects-explode" )
-				.css({
-					position: "absolute",
-					overflow: "hidden",
-					width: width,
-					height: height,
-					left: left + ( show ? mx * width : 0 ),
-					top: top + ( show ? my * height : 0 ),
-					opacity: show ? 0 : 1
-				}).animate({
-					left: left + ( show ? 0 : mx * width ),
-					top: top + ( show ? 0 : my * height ),
-					opacity: show ? 1 : 0
-				}, o.duration || 500, o.easing, childComplete );
-		}
-	}
-
-	function animComplete() {
-		el.css({
-			visibility: "visible"
-		});
-		$( pieces ).remove();
-		if ( !show ) {
-			el.hide();
-		}
-		done();
-	}
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.fade = function( o, done ) {
-	var el = $( this ),
-		mode = $.effects.setMode( el, o.mode || "toggle" );
-
-	el.animate({
-		opacity: mode
-	}, {
-		queue: false,
-		duration: o.duration,
-		easing: o.easing,
-		complete: done
-	});
-};
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-$.effects.effect.fold = function( o, done ) {
-
-	// Create element
-	var el = $( this ),
-		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-		mode = $.effects.setMode( el, o.mode || "hide" ),
-		show = mode === "show",
-		hide = mode === "hide",
-		size = o.size || 15,
-		percent = /([0-9]+)%/.exec( size ),
-		horizFirst = !!o.horizFirst,
-		widthFirst = show !== horizFirst,
-		ref = widthFirst ? [ "width", "height" ] : [ "height", "width" ],
-		duration = o.duration / 2,
-		wrapper, distance,
-		animation1 = {},
-		animation2 = {};
-
-	$.effects.save( el, props );
-	el.show();
-
-	// Create Wrapper
-	wrapper = $.effects.createWrapper( el ).css({
-		overflow: "hidden"
-	});
-	distance = widthFirst ?
-		[ wrapper.width(), wrapper.height() ] :
-		[ wrapper.height(), wrapper.width() ];
-
-	if ( percent ) {
-		size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];
-	}
-	if ( show ) {
-		wrapper.css( horizFirst ? {
-			height: 0,
-			width: size
-		} : {
-			height: size,
-			width: 0
-		});
-	}
-
-	// Animation
-	animation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;
-	animation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;
-
-	// Animate
-	wrapper
-		.animate( animation1, duration, o.easing )
-		.animate( animation2, duration, o.easing, function() {
-			if ( hide ) {
-				el.hide();
-			}
-			$.effects.restore( el, props );
-			$.effects.removeWrapper( el );
-			done();
-		});
-
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.highlight = function( o, done ) {
-	var elem = $( this ),
-		props = [ "backgroundImage", "backgroundColor", "opacity" ],
-		mode = $.effects.setMode( elem, o.mode || "show" ),
-		animation = {
-			backgroundColor: elem.css( "backgroundColor" )
-		};
-
-	if (mode === "hide") {
-		animation.opacity = 0;
-	}
-
-	$.effects.save( elem, props );
-
-	elem
-		.show()
-		.css({
-			backgroundImage: "none",
-			backgroundColor: o.color || "#ffff99"
-		})
-		.animate( animation, {
-			queue: false,
-			duration: o.duration,
-			easing: o.easing,
-			complete: function() {
-				if ( mode === "hide" ) {
-					elem.hide();
-				}
-				$.effects.restore( elem, props );
-				done();
-			}
-		});
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.pulsate = function( o, done ) {
-	var elem = $( this ),
-		mode = $.effects.setMode( elem, o.mode || "show" ),
-		show = mode === "show",
-		hide = mode === "hide",
-		showhide = ( show || mode === "hide" ),
-
-		// showing or hiding leaves of the "last" animation
-		anims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),
-		duration = o.duration / anims,
-		animateTo = 0,
-		queue = elem.queue(),
-		queuelen = queue.length,
-		i;
-
-	if ( show || !elem.is(":visible")) {
-		elem.css( "opacity", 0 ).show();
-		animateTo = 1;
-	}
-
-	// anims - 1 opacity "toggles"
-	for ( i = 1; i < anims; i++ ) {
-		elem.animate({
-			opacity: animateTo
-		}, duration, o.easing );
-		animateTo = 1 - animateTo;
-	}
-
-	elem.animate({
-		opacity: animateTo
-	}, duration, o.easing);
-
-	elem.queue(function() {
-		if ( hide ) {
-			elem.hide();
-		}
-		done();
-	});
-
-	// We just queued up "anims" animations, we need to put them next in the queue
-	if ( queuelen > 1 ) {
-		queue.splice.apply( queue,
-			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
-	}
-	elem.dequeue();
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.puff = function( o, done ) {
-	var elem = $( this ),
-		mode = $.effects.setMode( elem, o.mode || "hide" ),
-		hide = mode === "hide",
-		percent = parseInt( o.percent, 10 ) || 150,
-		factor = percent / 100,
-		original = {
-			height: elem.height(),
-			width: elem.width(),
-			outerHeight: elem.outerHeight(),
-			outerWidth: elem.outerWidth()
-		};
-
-	$.extend( o, {
-		effect: "scale",
-		queue: false,
-		fade: true,
-		mode: mode,
-		complete: done,
-		percent: hide ? percent : 100,
-		from: hide ?
-			original :
-			{
-				height: original.height * factor,
-				width: original.width * factor,
-				outerHeight: original.outerHeight * factor,
-				outerWidth: original.outerWidth * factor
-			}
-	});
-
-	elem.effect( o );
-};
-
-$.effects.effect.scale = function( o, done ) {
-
-	// Create element
-	var el = $( this ),
-		options = $.extend( true, {}, o ),
-		mode = $.effects.setMode( el, o.mode || "effect" ),
-		percent = parseInt( o.percent, 10 ) ||
-			( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === "hide" ? 0 : 100 ) ),
-		direction = o.direction || "both",
-		origin = o.origin,
-		original = {
-			height: el.height(),
-			width: el.width(),
-			outerHeight: el.outerHeight(),
-			outerWidth: el.outerWidth()
-		},
-		factor = {
-			y: direction !== "horizontal" ? (percent / 100) : 1,
-			x: direction !== "vertical" ? (percent / 100) : 1
-		};
-
-	// We are going to pass this effect to the size effect:
-	options.effect = "size";
-	options.queue = false;
-	options.complete = done;
-
-	// Set default origin and restore for show/hide
-	if ( mode !== "effect" ) {
-		options.origin = origin || ["middle","center"];
-		options.restore = true;
-	}
-
-	options.from = o.from || ( mode === "show" ? {
-		height: 0,
-		width: 0,
-		outerHeight: 0,
-		outerWidth: 0
-	} : original );
-	options.to = {
-		height: original.height * factor.y,
-		width: original.width * factor.x,
-		outerHeight: original.outerHeight * factor.y,
-		outerWidth: original.outerWidth * factor.x
-	};
-
-	// Fade option to support puff
-	if ( options.fade ) {
-		if ( mode === "show" ) {
-			options.from.opacity = 0;
-			options.to.opacity = 1;
-		}
-		if ( mode === "hide" ) {
-			options.from.opacity = 1;
-			options.to.opacity = 0;
-		}
-	}
-
-	// Animate
-	el.effect( options );
-
-};
-
-$.effects.effect.size = function( o, done ) {
-
-	// Create element
-	var original, baseline, factor,
-		el = $( this ),
-		props0 = [ "position", "top", "bottom", "left", "right", "width", "height", "overflow", "opacity" ],
-
-		// Always restore
-		props1 = [ "position", "top", "bottom", "left", "right", "overflow", "opacity" ],
-
-		// Copy for children
-		props2 = [ "width", "height", "overflow" ],
-		cProps = [ "fontSize" ],
-		vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ],
-		hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ],
-
-		// Set options
-		mode = $.effects.setMode( el, o.mode || "effect" ),
-		restore = o.restore || mode !== "effect",
-		scale = o.scale || "both",
-		origin = o.origin || [ "middle", "center" ],
-		position = el.css( "position" ),
-		props = restore ? props0 : props1,
-		zero = {
-			height: 0,
-			width: 0,
-			outerHeight: 0,
-			outerWidth: 0
-		};
-
-	if ( mode === "show" ) {
-		el.show();
-	}
-	original = {
-		height: el.height(),
-		width: el.width(),
-		outerHeight: el.outerHeight(),
-		outerWidth: el.outerWidth()
-	};
-
-	if ( o.mode === "toggle" && mode === "show" ) {
-		el.from = o.to || zero;
-		el.to = o.from || original;
-	} else {
-		el.from = o.from || ( mode === "show" ? zero : original );
-		el.to = o.to || ( mode === "hide" ? zero : original );
-	}
-
-	// Set scaling factor
-	factor = {
-		from: {
-			y: el.from.height / original.height,
-			x: el.from.width / original.width
-		},
-		to: {
-			y: el.to.height / original.height,
-			x: el.to.width / original.width
-		}
-	};
-
-	// Scale the css box
-	if ( scale === "box" || scale === "both" ) {
-
-		// Vertical props scaling
-		if ( factor.from.y !== factor.to.y ) {
-			props = props.concat( vProps );
-			el.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );
-			el.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );
-		}
-
-		// Horizontal props scaling
-		if ( factor.from.x !== factor.to.x ) {
-			props = props.concat( hProps );
-			el.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );
-			el.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );
-		}
-	}
-
-	// Scale the content
-	if ( scale === "content" || scale === "both" ) {
-
-		// Vertical props scaling
-		if ( factor.from.y !== factor.to.y ) {
-			props = props.concat( cProps ).concat( props2 );
-			el.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );
-			el.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );
-		}
-	}
-
-	$.effects.save( el, props );
-	el.show();
-	$.effects.createWrapper( el );
-	el.css( "overflow", "hidden" ).css( el.from );
-
-	// Adjust
-	if (origin) { // Calculate baseline shifts
-		baseline = $.effects.getBaseline( origin, original );
-		el.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;
-		el.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;
-		el.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;
-		el.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;
-	}
-	el.css( el.from ); // set top & left
-
-	// Animate
-	if ( scale === "content" || scale === "both" ) { // Scale the children
-
-		// Add margins/font-size
-		vProps = vProps.concat([ "marginTop", "marginBottom" ]).concat(cProps);
-		hProps = hProps.concat([ "marginLeft", "marginRight" ]);
-		props2 = props0.concat(vProps).concat(hProps);
-
-		el.find( "*[width]" ).each( function(){
-			var child = $( this ),
-				c_original = {
-					height: child.height(),
-					width: child.width(),
-					outerHeight: child.outerHeight(),
-					outerWidth: child.outerWidth()
-				};
-			if (restore) {
-				$.effects.save(child, props2);
-			}
-
-			child.from = {
-				height: c_original.height * factor.from.y,
-				width: c_original.width * factor.from.x,
-				outerHeight: c_original.outerHeight * factor.from.y,
-				outerWidth: c_original.outerWidth * factor.from.x
-			};
-			child.to = {
-				height: c_original.height * factor.to.y,
-				width: c_original.width * factor.to.x,
-				outerHeight: c_original.height * factor.to.y,
-				outerWidth: c_original.width * factor.to.x
-			};
-
-			// Vertical props scaling
-			if ( factor.from.y !== factor.to.y ) {
-				child.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );
-				child.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );
-			}
-
-			// Horizontal props scaling
-			if ( factor.from.x !== factor.to.x ) {
-				child.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );
-				child.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );
-			}
-
-			// Animate children
-			child.css( child.from );
-			child.animate( child.to, o.duration, o.easing, function() {
-
-				// Restore children
-				if ( restore ) {
-					$.effects.restore( child, props2 );
-				}
-			});
-		});
-	}
-
-	// Animate
-	el.animate( el.to, {
-		queue: false,
-		duration: o.duration,
-		easing: o.easing,
-		complete: function() {
-			if ( el.to.opacity === 0 ) {
-				el.css( "opacity", el.from.opacity );
-			}
-			if( mode === "hide" ) {
-				el.hide();
-			}
-			$.effects.restore( el, props );
-			if ( !restore ) {
-
-				// we need to calculate our new positioning based on the scaling
-				if ( position === "static" ) {
-					el.css({
-						position: "relative",
-						top: el.to.top,
-						left: el.to.left
-					});
-				} else {
-					$.each([ "top", "left" ], function( idx, pos ) {
-						el.css( pos, function( _, str ) {
-							var val = parseInt( str, 10 ),
-								toRef = idx ? el.to.left : el.to.top;
-
-							// if original was "auto", recalculate the new value from wrapper
-							if ( str === "auto" ) {
-								return toRef + "px";
-							}
-
-							return val + toRef + "px";
-						});
-					});
-				}
-			}
-
-			$.effects.removeWrapper( el );
-			done();
-		}
-	});
-
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.shake = function( o, done ) {
-
-	var el = $( this ),
-		props = [ "position", "top", "bottom", "left", "right", "height", "width" ],
-		mode = $.effects.setMode( el, o.mode || "effect" ),
-		direction = o.direction || "left",
-		distance = o.distance || 20,
-		times = o.times || 3,
-		anims = times * 2 + 1,
-		speed = Math.round(o.duration/anims),
-		ref = (direction === "up" || direction === "down") ? "top" : "left",
-		positiveMotion = (direction === "up" || direction === "left"),
-		animation = {},
-		animation1 = {},
-		animation2 = {},
-		i,
-
-		// we will need to re-assemble the queue to stack our animations in place
-		queue = el.queue(),
-		queuelen = queue.length;
-
-	$.effects.save( el, props );
-	el.show();
-	$.effects.createWrapper( el );
-
-	// Animation
-	animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance;
-	animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2;
-	animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2;
-
-	// Animate
-	el.animate( animation, speed, o.easing );
-
-	// Shakes
-	for ( i = 1; i < times; i++ ) {
-		el.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );
-	}
-	el
-		.animate( animation1, speed, o.easing )
-		.animate( animation, speed / 2, o.easing )
-		.queue(function() {
-			if ( mode === "hide" ) {
-				el.hide();
-			}
-			$.effects.restore( el, props );
-			$.effects.removeWrapper( el );
-			done();
-		});
-
-	// inject all the animations we just queued to be first in line (after "inprogress")
-	if ( queuelen > 1) {
-		queue.splice.apply( queue,
-			[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );
-	}
-	el.dequeue();
-
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.slide = function( o, done ) {
-
-	// Create element
-	var el = $( this ),
-		props = [ "position", "top", "bottom", "left", "right", "width", "height" ],
-		mode = $.effects.setMode( el, o.mode || "show" ),
-		show = mode === "show",
-		direction = o.direction || "left",
-		ref = (direction === "up" || direction === "down") ? "top" : "left",
-		positiveMotion = (direction === "up" || direction === "left"),
-		distance,
-		animation = {};
-
-	// Adjust
-	$.effects.save( el, props );
-	el.show();
-	distance = o.distance || el[ ref === "top" ? "outerHeight" : "outerWidth" ]( true );
-
-	$.effects.createWrapper( el ).css({
-		overflow: "hidden"
-	});
-
-	if ( show ) {
-		el.css( ref, positiveMotion ? (isNaN(distance) ? "-" + distance : -distance) : distance );
-	}
-
-	// Animation
-	animation[ ref ] = ( show ?
-		( positiveMotion ? "+=" : "-=") :
-		( positiveMotion ? "-=" : "+=")) +
-		distance;
-
-	// Animate
-	el.animate( animation, {
-		queue: false,
-		duration: o.duration,
-		easing: o.easing,
-		complete: function() {
-			if ( mode === "hide" ) {
-				el.hide();
-			}
-			$.effects.restore( el, props );
-			$.effects.removeWrapper( el );
-			done();
-		}
-	});
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-$.effects.effect.transfer = function( o, done ) {
-	var elem = $( this ),
-		target = $( o.to ),
-		targetFixed = target.css( "position" ) === "fixed",
-		body = $("body"),
-		fixTop = targetFixed ? body.scrollTop() : 0,
-		fixLeft = targetFixed ? body.scrollLeft() : 0,
-		endPosition = target.offset(),
-		animation = {
-			top: endPosition.top - fixTop ,
-			left: endPosition.left - fixLeft ,
-			height: target.innerHeight(),
-			width: target.innerWidth()
-		},
-		startPosition = elem.offset(),
-		transfer = $( '<div class="ui-effects-transfer"></div>' )
-			.appendTo( document.body )
-			.addClass( o.className )
-			.css({
-				top: startPosition.top - fixTop ,
-				left: startPosition.left - fixLeft ,
-				height: elem.innerHeight(),
-				width: elem.innerWidth(),
-				position: targetFixed ? "fixed" : "absolute"
-			})
-			.animate( animation, o.duration, o.easing, function() {
-				transfer.remove();
-				done();
-			});
-};
-
-})(jQuery);
-
-(function( $, undefined ) {
-
-var mouseHandled = false;
-
-$.widget( "ui.menu", {
-	version: "1.9.2",
-	defaultElement: "<ul>",
-	delay: 300,
-	options: {
-		icons: {
-			submenu: "ui-icon-carat-1-e"
-		},
-		menus: "ul",
-		position: {
-			my: "left top",
-			at: "right top"
-		},
-		role: "menu",
-
-		// callbacks
-		blur: null,
-		focus: null,
-		select: null
-	},
-
-	_create: function() {
-		this.activeMenu = this.element;
-		this.element
-			.uniqueId()
-			.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
-			.toggleClass( "ui-menu-icons", !!this.element.find( ".ui-icon" ).length )
-			.attr({
-				role: this.options.role,
-				tabIndex: 0
-			})
-			// need to catch all clicks on disabled menu
-			// not possible through _on
-			.bind( "click" + this.eventNamespace, $.proxy(function( event ) {
-				if ( this.options.disabled ) {
-					event.preventDefault();
-				}
-			}, this ));
-
-		if ( this.options.disabled ) {
-			this.element
-				.addClass( "ui-state-disabled" )
-				.attr( "aria-disabled", "true" );
-		}
-
-		this._on({
-			// Prevent focus from sticking to links inside menu after clicking
-			// them (focus should always stay on UL during navigation).
-			"mousedown .ui-menu-item > a": function( event ) {
-				event.preventDefault();
-			},
-			"click .ui-state-disabled > a": function( event ) {
-				event.preventDefault();
-			},
-			"click .ui-menu-item:has(a)": function( event ) {
-				var target = $( event.target ).closest( ".ui-menu-item" );
-				if ( !mouseHandled && target.not( ".ui-state-disabled" ).length ) {
-					mouseHandled = true;
-
-					this.select( event );
-					// Open submenu on click
-					if ( target.has( ".ui-menu" ).length ) {
-						this.expand( event );
-					} else if ( !this.element.is( ":focus" ) ) {
-						// Redirect focus to the menu
-						this.element.trigger( "focus", [ true ] );
-
-						// If the active item is on the top level, let it stay active.
-						// Otherwise, blur the active item since it is no longer visible.
-						if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) {
-							clearTimeout( this.timer );
-						}
-					}
-				}
-			},
-			"mouseenter .ui-menu-item": function( event ) {
-				var target = $( event.currentTarget );
-				// Remove ui-state-active class from siblings of the newly focused menu item
-				// to avoid a jump caused by adjacent elements both having a class with a border
-				target.siblings().children( ".ui-state-active" ).removeClass( "ui-state-active" );
-				this.focus( event, target );
-			},
-			mouseleave: "collapseAll",
-			"mouseleave .ui-menu": "collapseAll",
-			focus: function( event, keepActiveItem ) {
-				// If there's already an active item, keep it active
-				// If not, activate the first item
-				var item = this.active || this.element.children( ".ui-menu-item" ).eq( 0 );
-
-				if ( !keepActiveItem ) {
-					this.focus( event, item );
-				}
-			},
-			blur: function( event ) {
-				this._delay(function() {
-					if ( !$.contains( this.element[0], this.document[0].activeElement ) ) {
-						this.collapseAll( event );
-					}
-				});
-			},
-			keydown: "_keydown"
-		});
-
-		this.refresh();
-
-		// Clicks outside of a menu collapse any open menus
-		this._on( this.document, {
-			click: function( event ) {
-				if ( !$( event.target ).closest( ".ui-menu" ).length ) {
-					this.collapseAll( event );
-				}
-
-				// Reset the mouseHandled flag
-				mouseHandled = false;
-			}
-		});
-	},
-
-	_destroy: function() {
-		// Destroy (sub)menus
-		this.element
-			.removeAttr( "aria-activedescendant" )
-			.find( ".ui-menu" ).andSelf()
-				.removeClass( "ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons" )
-				.removeAttr( "role" )
-				.removeAttr( "tabIndex" )
-				.removeAttr( "aria-labelledby" )
-				.removeAttr( "aria-expanded" )
-				.removeAttr( "aria-hidden" )
-				.removeAttr( "aria-disabled" )
-				.removeUniqueId()
-				.show();
-
-		// Destroy menu items
-		this.element.find( ".ui-menu-item" )
-			.removeClass( "ui-menu-item" )
-			.removeAttr( "role" )
-			.removeAttr( "aria-disabled" )
-			.children( "a" )
-				.removeUniqueId()
-				.removeClass( "ui-corner-all ui-state-hover" )
-				.removeAttr( "tabIndex" )
-				.removeAttr( "role" )
-				.removeAttr( "aria-haspopup" )
-				.children().each( function() {
-					var elem = $( this );
-					if ( elem.data( "ui-menu-submenu-carat" ) ) {
-						elem.remove();
-					}
-				});
-
-		// Destroy menu dividers
-		this.element.find( ".ui-menu-divider" ).removeClass( "ui-menu-divider ui-widget-content" );
-	},
-
-	_keydown: function( event ) {
-		var match, prev, character, skip, regex,
-			preventDefault = true;
-
-		function escape( value ) {
-			return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
-		}
-
-		switch ( event.keyCode ) {
-		case $.ui.keyCode.PAGE_UP:
-			this.previousPage( event );
-			break;
-		case $.ui.keyCode.PAGE_DOWN:
-			this.nextPage( event );
-			break;
-		case $.ui.keyCode.HOME:
-			this._move( "first", "first", event );
-			break;
-		case $.ui.keyCode.END:
-			this._move( "last", "last", event );
-			break;
-		case $.ui.keyCode.UP:
-			this.previous( event );
-			break;
-		case $.ui.keyCode.DOWN:
-			this.next( event );
-			break;
-		case $.ui.keyCode.LEFT:
-			this.collapse( event );
-			break;
-		case $.ui.keyCode.RIGHT:
-			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
-				this.expand( event );
-			}
-			break;
-		case $.ui.keyCode.ENTER:
-		case $.ui.keyCode.SPACE:
-			this._activate( event );
-			break;
-		case $.ui.keyCode.ESCAPE:
-			this.collapse( event );
-			break;
-		default:
-			preventDefault = false;
-			prev = this.previousFilter || "";
-			character = String.fromCharCode( event.keyCode );
-			skip = false;
-
-			clearTimeout( this.filterTimer );
-
-			if ( character === prev ) {
-				skip = true;
-			} else {
-				character = prev + character;
-			}
-
-			regex = new RegExp( "^" + escape( character ), "i" );
-			match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
-				return regex.test( $( this ).children( "a" ).text() );
-			});
-			match = skip && match.index( this.active.next() ) !== -1 ?
-				this.active.nextAll( ".ui-menu-item" ) :
-				match;
-
-			// If no matches on the current filter, reset to the last character pressed
-			// to move down the menu to the first item that starts with that character
-			if ( !match.length ) {
-				character = String.fromCharCode( event.keyCode );
-				regex = new RegExp( "^" + escape( character ), "i" );
-				match = this.activeMenu.children( ".ui-menu-item" ).filter(function() {
-					return regex.test( $( this ).children( "a" ).text() );
-				});
-			}
-
-			if ( match.length ) {
-				this.focus( event, match );
-				if ( match.length > 1 ) {
-					this.previousFilter = character;
-					this.filterTimer = this._delay(function() {
-						delete this.previousFilter;
-					}, 1000 );
-				} else {
-					delete this.previousFilter;
-				}
-			} else {
-				delete this.previousFilter;
-			}
-		}
-
-		if ( preventDefault ) {
-			event.preventDefault();
-		}
-	},
-
-	_activate: function( event ) {
-		if ( !this.active.is( ".ui-state-disabled" ) ) {
-			if ( this.active.children( "a[aria-haspopup='true']" ).length ) {
-				this.expand( event );
-			} else {
-				this.select( event );
-			}
-		}
-	},
-
-	refresh: function() {
-		var menus,
-			icon = this.options.icons.submenu,
-			submenus = this.element.find( this.options.menus );
-
-		// Initialize nested menus
-		submenus.filter( ":not(.ui-menu)" )
-			.addClass( "ui-menu ui-widget ui-widget-content ui-corner-all" )
-			.hide()
-			.attr({
-				role: this.options.role,
-				"aria-hidden": "true",
-				"aria-expanded": "false"
-			})
-			.each(function() {
-				var menu = $( this ),
-					item = menu.prev( "a" ),
-					submenuCarat = $( "<span>" )
-						.addClass( "ui-menu-icon ui-icon " + icon )
-						.data( "ui-menu-submenu-carat", true );
-
-				item
-					.attr( "aria-haspopup", "true" )
-					.prepend( submenuCarat );
-				menu.attr( "aria-labelledby", item.attr( "id" ) );
-			});
-
-		menus = submenus.add( this.element );
-
-		// Don't refresh list items that are already adapted
-		menus.children( ":not(.ui-menu-item):has(a)" )
-			.addClass( "ui-menu-item" )
-			.attr( "role", "presentation" )
-			.children( "a" )
-				.uniqueId()
-				.addClass( "ui-corner-all" )
-				.attr({
-					tabIndex: -1,
-					role: this._itemRole()
-				});
-
-		// Initialize unlinked menu-items containing spaces and/or dashes only as dividers
-		menus.children( ":not(.ui-menu-item)" ).each(function() {
-			var item = $( this );
-			// hyphen, em dash, en dash
-			if ( !/[^\-—–\s]/.test( item.text() ) ) {
-				item.addClass( "ui-widget-content ui-menu-divider" );
-			}
-		});
-
-		// Add aria-disabled attribute to any disabled menu item
-		menus.children( ".ui-state-disabled" ).attr( "aria-disabled", "true" );
-
-		// If the active item has been removed, blur the menu
-		if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
-			this.blur();
-		}
-	},
-
-	_itemRole: function() {
-		return {
-			menu: "menuitem",
-			listbox: "option"
-		}[ this.options.role ];
-	},
-
-	focus: function( event, item ) {
-		var nested, focused;
-		this.blur( event, event && event.type === "focus" );
-
-		this._scrollIntoView( item );
-
-		this.active = item.first();
-		focused = this.active.children( "a" ).addClass( "ui-state-focus" );
-		// Only update aria-activedescendant if there's a role
-		// otherwise we assume focus is managed elsewhere
-		if ( this.options.role ) {
-			this.element.attr( "aria-activedescendant", focused.attr( "id" ) );
-		}
-
-		// Highlight active parent menu item, if any
-		this.active
-			.parent()
-			.closest( ".ui-menu-item" )
-			.children( "a:first" )
-			.addClass( "ui-state-active" );
-
-		if ( event && event.type === "keydown" ) {
-			this._close();
-		} else {
-			this.timer = this._delay(function() {
-				this._close();
-			}, this.delay );
-		}
-
-		nested = item.children( ".ui-menu" );
-		if ( nested.length && ( /^mouse/.test( event.type ) ) ) {
-			this._startOpening(nested);
-		}
-		this.activeMenu = item.parent();
-
-		this._trigger( "focus", event, { item: item } );
-	},
-
-	_scrollIntoView: function( item ) {
-		var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;
-		if ( this._hasScroll() ) {
-			borderTop = parseFloat( $.css( this.activeMenu[0], "borderTopWidth" ) ) || 0;
-			paddingTop = parseFloat( $.css( this.activeMenu[0], "paddingTop" ) ) || 0;
-			offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;
-			scroll = this.activeMenu.scrollTop();
-			elementHeight = this.activeMenu.height();
-			itemHeight = item.height();
-
-			if ( offset < 0 ) {
-				this.activeMenu.scrollTop( scroll + offset );
-			} else if ( offset + itemHeight > elementHeight ) {
-				this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );
-			}
-		}
-	},
-
-	blur: function( event, fromFocus ) {
-		if ( !fromFocus ) {
-			clearTimeout( this.timer );
-		}
-
-		if ( !this.active ) {
-			return;
-		}
-
-		this.active.children( "a" ).removeClass( "ui-state-focus" );
-		this.active = null;
-
-		this._trigger( "blur", event, { item: this.active } );
-	},
-
-	_startOpening: function( submenu ) {
-		clearTimeout( this.timer );
-
-		// Don't open if already open fixes a Firefox bug that caused a .5 pixel
-		// shift in the submenu position when mousing over the carat icon
-		if ( submenu.attr( "aria-hidden" ) !== "true" ) {
-			return;
-		}
-
-		this.timer = this._delay(function() {
-			this._close();
-			this._open( submenu );
-		}, this.delay );
-	},
-
-	_open: function( submenu ) {
-		var position = $.extend({
-			of: this.active
-		}, this.options.position );
-
-		clearTimeout( this.timer );
-		this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) )
-			.hide()
-			.attr( "aria-hidden", "true" );
-
-		submenu
-			.show()
-			.removeAttr( "aria-hidden" )
-			.attr( "aria-expanded", "true" )
-			.position( position );
-	},
-
-	collapseAll: function( event, all ) {
-		clearTimeout( this.timer );
-		this.timer = this._delay(function() {
-			// If we were passed an event, look for the submenu that contains the event
-			var currentMenu = all ? this.element :
-				$( event && event.target ).closest( this.element.find( ".ui-menu" ) );
-
-			// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway
-			if ( !currentMenu.length ) {
-				currentMenu = this.element;
-			}
-
-			this._close( currentMenu );
-
-			this.blur( event );
-			this.activeMenu = currentMenu;
-		}, this.delay );
-	},
-
-	// With no arguments, closes the currently active menu - if nothing is active
-	// it closes all menus.  If passed an argument, it will search for menus BELOW
-	_close: function( startMenu ) {
-		if ( !startMenu ) {
-			startMenu = this.active ? this.active.parent() : this.element;
-		}
-
-		startMenu
-			.find( ".ui-menu" )
-				.hide()
-				.attr( "aria-hidden", "true" )
-				.attr( "aria-expanded", "false" )
-			.end()
-			.find( "a.ui-state-active" )
-				.removeClass( "ui-state-active" );
-	},
-
-	collapse: function( event ) {
-		var newItem = this.active &&
-			this.active.parent().closest( ".ui-menu-item", this.element );
-		if ( newItem && newItem.length ) {
-			this._close();
-			this.focus( event, newItem );
-		}
-	},
-
-	expand: function( event ) {
-		var newItem = this.active &&
-			this.active
-				.children( ".ui-menu " )
-				.children( ".ui-menu-item" )
-				.first();
-
-		if ( newItem && newItem.length ) {
-			this._open( newItem.parent() );
-
-			// Delay so Firefox will not hide activedescendant change in expanding submenu from AT
-			this._delay(function() {
-				this.focus( event, newItem );
-			});
-		}
-	},
-
-	next: function( event ) {
-		this._move( "next", "first", event );
-	},
-
-	previous: function( event ) {
-		this._move( "prev", "last", event );
-	},
-
-	isFirstItem: function() {
-		return this.active && !this.active.prevAll( ".ui-menu-item" ).length;
-	},
-
-	isLastItem: function() {
-		return this.active && !this.active.nextAll( ".ui-menu-item" ).length;
-	},
-
-	_move: function( direction, filter, event ) {
-		var next;
-		if ( this.active ) {
-			if ( direction === "first" || direction === "last" ) {
-				next = this.active
-					[ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" )
-					.eq( -1 );
-			} else {
-				next = this.active
-					[ direction + "All" ]( ".ui-menu-item" )
-					.eq( 0 );
-			}
-		}
-		if ( !next || !next.length || !this.active ) {
-			next = this.activeMenu.children( ".ui-menu-item" )[ filter ]();
-		}
-
-		this.focus( event, next );
-	},
-
-	nextPage: function( event ) {
-		var item, base, height;
-
-		if ( !this.active ) {
-			this.next( event );
-			return;
-		}
-		if ( this.isLastItem() ) {
-			return;
-		}
-		if ( this._hasScroll() ) {
-			base = this.active.offset().top;
-			height = this.element.height();
-			this.active.nextAll( ".ui-menu-item" ).each(function() {
-				item = $( this );
-				return item.offset().top - base - height < 0;
-			});
-
-			this.focus( event, item );
-		} else {
-			this.focus( event, this.activeMenu.children( ".ui-menu-item" )
-				[ !this.active ? "first" : "last" ]() );
-		}
-	},
-
-	previousPage: function( event ) {
-		var item, base, height;
-		if ( !this.active ) {
-			this.next( event );
-			return;
-		}
-		if ( this.isFirstItem() ) {
-			return;
-		}
-		if ( this._hasScroll() ) {
-			base = this.active.offset().top;
-			height = this.element.height();
-			this.active.prevAll( ".ui-menu-item" ).each(function() {
-				item = $( this );
-				return item.offset().top - base + height > 0;
-			});
-
-			this.focus( event, item );
-		} else {
-			this.focus( event, this.activeMenu.children( ".ui-menu-item" ).first() );
-		}
-	},
-
-	_hasScroll: function() {
-		return this.element.outerHeight() < this.element.prop( "scrollHeight" );
-	},
-
-	select: function( event ) {
-		// TODO: It should never be possible to not have an active item at this
-		// point, but the tests don't trigger mouseenter before click.
-		this.active = this.active || $( event.target ).closest( ".ui-menu-item" );
-		var ui = { item: this.active };
-		if ( !this.active.has( ".ui-menu" ).length ) {
-			this.collapseAll( event, true );
-		}
-		this._trigger( "select", event, ui );
-	}
-});
-
-}( jQuery ));
-
-(function( $, undefined ) {
-
-$.ui = $.ui || {};
-
-var cachedScrollbarWidth,
-	max = Math.max,
-	abs = Math.abs,
-	round = Math.round,
-	rhorizontal = /left|center|right/,
-	rvertical = /top|center|bottom/,
-	roffset = /[\+\-]\d+%?/,
-	rposition = /^\w+/,
-	rpercent = /%$/,
-	_position = $.fn.position;
-
-function getOffsets( offsets, width, height ) {
-	return [
-		parseInt( offsets[ 0 ], 10 ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
-		parseInt( offsets[ 1 ], 10 ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
-	];
-}
-function parseCss( element, property ) {
-	return parseInt( $.css( element, property ), 10 ) || 0;
-}
-
-$.position = {
-	scrollbarWidth: function() {
-		if ( cachedScrollbarWidth !== undefined ) {
-			return cachedScrollbarWidth;
-		}
-		var w1, w2,
-			div = $( "<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>" ),
-			innerDiv = div.children()[0];
-
-		$( "body" ).append( div );
-		w1 = innerDiv.offsetWidth;
-		div.css( "overflow", "scroll" );
-
-		w2 = innerDiv.offsetWidth;
-
-		if ( w1 === w2 ) {
-			w2 = div[0].clientWidth;
-		}
-
-		div.remove();
-
-		return (cachedScrollbarWidth = w1 - w2);
-	},
-	getScrollInfo: function( within ) {
-		var overflowX = within.isWindow ? "" : within.element.css( "overflow-x" ),
-			overflowY = within.isWindow ? "" : within.element.css( "overflow-y" ),
-			hasOverflowX = overflowX === "scroll" ||
-				( overflowX === "auto" && within.width < within.element[0].scrollWidth ),
-			hasOverflowY = overflowY === "scroll" ||
-				( overflowY === "auto" && within.height < within.element[0].scrollHeight );
-		return {
-			width: hasOverflowX ? $.position.scrollbarWidth() : 0,
-			height: hasOverflowY ? $.position.scrollbarWidth() : 0
-		};
-	},
-	getWithinInfo: function( element ) {
-		var withinElement = $( element || window ),
-			isWindow = $.isWindow( withinElement[0] );
-		return {
-			element: withinElement,
-			isWindow: isWindow,
-			offset: withinElement.offset() || { left: 0, top: 0 },
-			scrollLeft: withinElement.scrollLeft(),
-			scrollTop: withinElement.scrollTop(),
-			width: isWindow ? withinElement.width() : withinElement.outerWidth(),
-			height: isWindow ? withinElement.height() : withinElement.outerHeight()
-		};
-	}
-};
-
-$.fn.position = function( options ) {
-	if ( !options || !options.of ) {
-		return _position.apply( this, arguments );
-	}
-
-	// make a copy, we don't want to modify arguments
-	options = $.extend( {}, options );
-
-	var atOffset, targetWidth, targetHeight, targetOffset, basePosition,
-		target = $( options.of ),
-		within = $.position.getWithinInfo( options.within ),
-		scrollInfo = $.position.getScrollInfo( within ),
-		targetElem = target[0],
-		collision = ( options.collision || "flip" ).split( " " ),
-		offsets = {};
-
-	if ( targetElem.nodeType === 9 ) {
-		targetWidth = target.width();
-		targetHeight = target.height();
-		targetOffset = { top: 0, left: 0 };
-	} else if ( $.isWindow( targetElem ) ) {
-		targetWidth = target.width();
-		targetHeight = target.height();
-		targetOffset = { top: target.scrollTop(), left: target.scrollLeft() };
-	} else if ( targetElem.preventDefault ) {
-		// force left top to allow flipping
-		options.at = "left top";
-		targetWidth = targetHeight = 0;
-		targetOffset = { top: targetElem.pageY, left: targetElem.pageX };
-	} else {
-		targetWidth = target.outerWidth();
-		targetHeight = target.outerHeight();
-		targetOffset = target.offset();
-	}
-	// clone to reuse original targetOffset later
-	basePosition = $.extend( {}, targetOffset );
-
-	// force my and at to have valid horizontal and vertical positions
-	// if a value is missing or invalid, it will be converted to center
-	$.each( [ "my", "at" ], function() {
-		var pos = ( options[ this ] || "" ).split( " " ),
-			horizontalOffset,
-			verticalOffset;
-
-		if ( pos.length === 1) {
-			pos = rhorizontal.test( pos[ 0 ] ) ?
-				pos.concat( [ "center" ] ) :
-				rvertical.test( pos[ 0 ] ) ?
-					[ "center" ].concat( pos ) :
-					[ "center", "center" ];
-		}
-		pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
-		pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
-
-		// calculate offsets
-		horizontalOffset = roffset.exec( pos[ 0 ] );
-		verticalOffset = roffset.exec( pos[ 1 ] );
-		offsets[ this ] = [
-			horizontalOffset ? horizontalOffset[ 0 ] : 0,
-			verticalOffset ? verticalOffset[ 0 ] : 0
-		];
-
-		// reduce to just the positions without the offsets
-		options[ this ] = [
-			rposition.exec( pos[ 0 ] )[ 0 ],
-			rposition.exec( pos[ 1 ] )[ 0 ]
-		];
-	});
-
-	// normalize collision option
-	if ( collision.length === 1 ) {
-		collision[ 1 ] = collision[ 0 ];
-	}
-
-	if ( options.at[ 0 ] === "right" ) {
-		basePosition.left += targetWidth;
-	} else if ( options.at[ 0 ] === "center" ) {
-		basePosition.left += targetWidth / 2;
-	}
-
-	if ( options.at[ 1 ] === "bottom" ) {
-		basePosition.top += targetHeight;
-	} else if ( options.at[ 1 ] === "center" ) {
-		basePosition.top += targetHeight / 2;
-	}
-
-	atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
-	basePosition.left += atOffset[ 0 ];
-	basePosition.top += atOffset[ 1 ];
-
-	return this.each(function() {
-		var collisionPosition, using,
-			elem = $( this ),
-			elemWidth = elem.outerWidth(),
-			elemHeight = elem.outerHeight(),
-			marginLeft = parseCss( this, "marginLeft" ),
-			marginTop = parseCss( this, "marginTop" ),
-			collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width,
-			collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height,
-			position = $.extend( {}, basePosition ),
-			myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
-
-		if ( options.my[ 0 ] === "right" ) {
-			position.left -= elemWidth;
-		} else if ( options.my[ 0 ] === "center" ) {
-			position.left -= elemWidth / 2;
-		}
-
-		if ( options.my[ 1 ] === "bottom" ) {
-			position.top -= elemHeight;
-		} else if ( options.my[ 1 ] === "center" ) {
-			position.top -= elemHeight / 2;
-		}
-
-		position.left += myOffset[ 0 ];
-		position.top += myOffset[ 1 ];
-
-		// if the browser doesn't support fractions, then round for consistent results
-		if ( !$.support.offsetFractions ) {
-			position.left = round( position.left );
-			position.top = round( position.top );
-		}
-
-		collisionPosition = {
-			marginLeft: marginLeft,
-			marginTop: marginTop
-		};
-
-		$.each( [ "left", "top" ], function( i, dir ) {
-			if ( $.ui.position[ collision[ i ] ] ) {
-				$.ui.position[ collision[ i ] ][ dir ]( position, {
-					targetWidth: targetWidth,
-					targetHeight: targetHeight,
-					elemWidth: elemWidth,
-					elemHeight: elemHeight,
-					collisionPosition: collisionPosition,
-					collisionWidth: collisionWidth,
-					collisionHeight: collisionHeight,
-					offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
-					my: options.my,
-					at: options.at,
-					within: within,
-					elem : elem
-				});
-			}
-		});
-
-		if ( $.fn.bgiframe ) {
-			elem.bgiframe();
-		}
-
-		if ( options.using ) {
-			// adds feedback as second argument to using callback, if present
-			using = function( props ) {
-				var left = targetOffset.left - position.left,
-					right = left + targetWidth - elemWidth,
-					top = targetOffset.top - position.top,
-					bottom = top + targetHeight - elemHeight,
-					feedback = {
-						target: {
-							element: target,
-							left: targetOffset.left,
-							top: targetOffset.top,
-							width: targetWidth,
-							height: targetHeight
-						},
-						element: {
-							element: elem,
-							left: position.left,
-							top: position.top,
-							width: elemWidth,
-							height: elemHeight
-						},
-						horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
-						vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
-					};
-				if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
-					feedback.horizontal = "center";
-				}
-				if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
-					feedback.vertical = "middle";
-				}
-				if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
-					feedback.important = "horizontal";
-				} else {
-					feedback.important = "vertical";
-				}
-				options.using.call( this, props, feedback );
-			};
-		}
-
-		elem.offset( $.extend( position, { using: using } ) );
-	});
-};
-
-$.ui.position = {
-	fit: {
-		left: function( position, data ) {
-			var within = data.within,
-				withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
-				outerWidth = within.width,
-				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
-				overLeft = withinOffset - collisionPosLeft,
-				overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
-				newOverRight;
-
-			// element is wider than within
-			if ( data.collisionWidth > outerWidth ) {
-				// element is initially over the left side of within
-				if ( overLeft > 0 && overRight <= 0 ) {
-					newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;
-					position.left += overLeft - newOverRight;
-				// element is initially over right side of within
-				} else if ( overRight > 0 && overLeft <= 0 ) {
-					position.left = withinOffset;
-				// element is initially over both left and right sides of within
-				} else {
-					if ( overLeft > overRight ) {
-						position.left = withinOffset + outerWidth - data.collisionWidth;
-					} else {
-						position.left = withinOffset;
-					}
-				}
-			// too far left -> align with left edge
-			} else if ( overLeft > 0 ) {
-				position.left += overLeft;
-			// too far right -> align with right edge
-			} else if ( overRight > 0 ) {
-				position.left -= overRight;
-			// adjust based on position and margin
-			} else {
-				position.left = max( position.left - collisionPosLeft, position.left );
-			}
-		},
-		top: function( position, data ) {
-			var within = data.within,
-				withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
-				outerHeight = data.within.height,
-				collisionPosTop = position.top - data.collisionPosition.marginTop,
-				overTop = withinOffset - collisionPosTop,
-				overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
-				newOverBottom;
-
-			// element is taller than within
-			if ( data.collisionHeight > outerHeight ) {
-				// element is initially over the top of within
-				if ( overTop > 0 && overBottom <= 0 ) {
-					newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;
-					position.top += overTop - newOverBottom;
-				// element is initially over bottom of within
-				} else if ( overBottom > 0 && overTop <= 0 ) {
-					position.top = withinOffset;
-				// element is initially over both top and bottom of within
-				} else {
-					if ( overTop > overBottom ) {
-						position.top = withinOffset + outerHeight - data.collisionHeight;
-					} else {
-						position.top = withinOffset;
-					}
-				}
-			// too far up -> align with top
-			} else if ( overTop > 0 ) {
-				position.top += overTop;
-			// too far down -> align with bottom edge
-			} else if ( overBottom > 0 ) {
-				position.top -= overBottom;
-			// adjust based on position and margin
-			} else {
-				position.top = max( position.top - collisionPosTop, position.top );
-			}
-		}
-	},
-	flip: {
-		left: function( position, data ) {
-			var within = data.within,
-				withinOffset = within.offset.left + within.scrollLeft,
-				outerWidth = within.width,
-				offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
-				collisionPosLeft = position.left - data.collisionPosition.marginLeft,
-				overLeft = collisionPosLeft - offsetLeft,
-				overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
-				myOffset = data.my[ 0 ] === "left" ?
-					-data.elemWidth :
-					data.my[ 0 ] === "right" ?
-						data.elemWidth :
-						0,
-				atOffset = data.at[ 0 ] === "left" ?
-					data.targetWidth :
-					data.at[ 0 ] === "right" ?
-						-data.targetWidth :
-						0,
-				offset = -2 * data.offset[ 0 ],
-				newOverRight,
-				newOverLeft;
-
-			if ( overLeft < 0 ) {
-				newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;
-				if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
-					position.left += myOffset + atOffset + offset;
-				}
-			}
-			else if ( overRight > 0 ) {
-				newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;
-				if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
-					position.left += myOffset + atOffset + offset;
-				}
-			}
-		},
-		top: function( position, data ) {
-			var within = data.within,
-				withinOffset = within.offset.top + within.scrollTop,
-				outerHeight = within.height,
-				offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
-				collisionPosTop = position.top - data.collisionPosition.marginTop,
-				overTop = collisionPosTop - offsetTop,
-				overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
-				top = data.my[ 1 ] === "top",
-				myOffset = top ?
-					-data.elemHeight :
-					data.my[ 1 ] === "bottom" ?
-						data.elemHeight :
-						0,
-				atOffset = data.at[ 1 ] === "top" ?
-					data.targetHeight :
-					data.at[ 1 ] === "bottom" ?
-						-data.targetHeight :
-						0,
-				offset = -2 * data.offset[ 1 ],
-				newOverTop,
-				newOverBottom;
-			if ( overTop < 0 ) {
-				newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;
-				if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) {
-					position.top += myOffset + atOffset + offset;
-				}
-			}
-			else if ( overBottom > 0 ) {
-				newOverTop = position.top -  data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;
-				if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) {
-					position.top += myOffset + atOffset + offset;
-				}
-			}
-		}
-	},
-	flipfit: {
-		left: function() {
-			$.ui.position.flip.left.apply( this, arguments );
-			$.ui.position.fit.left.apply( this, arguments );
-		},
-		top: function() {
-			$.ui.position.flip.top.apply( this, arguments );
-			$.ui.position.fit.top.apply( this, arguments );
-		}
-	}
-};
-
-// fraction support test
-(function () {
-	var testElement, testElementParent, testElementStyle, offsetLeft, i,
-		body = document.getElementsByTagName( "body" )[ 0 ],
-		div = document.createElement( "div" );
-
-	//Create a "fake body" for testing based on method used in jQuery.support
-	testElement = document.createElement( body ? "div" : "body" );
-	testElementStyle = {
-		visibility: "hidden",
-		width: 0,
-		height: 0,
-		border: 0,
-		margin: 0,
-		background: "none"
-	};
-	if ( body ) {
-		$.extend( testElementStyle, {
-			position: "absolute",
-			left: "-1000px",
-			top: "-1000px"
-		});
-	}
-	for ( i in testElementStyle ) {
-		testElement.style[ i ] = testElementStyle[ i ];
-	}
-	testElement.appendChild( div );
-	testElementParent = body || document.documentElement;
-	testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
-	div.style.cssText = "position: absolute; left: 10.7432222px;";
-
-	offsetLeft = $( div ).offset().left;
-	$.support.offsetFractions = offsetLeft > 10 && offsetLeft < 11;
-
-	testElement.innerHTML = "";
-	testElementParent.removeChild( testElement );
-})();
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
-	// offset option
-	(function( $ ) {
-		var _position = $.fn.position;
-		$.fn.position = function( options ) {
-			if ( !options || !options.offset ) {
-				return _position.call( this, options );
-			}
-			var offset = options.offset.split( " " ),
-				at = options.at.split( " " );
-			if ( offset.length === 1 ) {
-				offset[ 1 ] = offset[ 0 ];
-			}
-			if ( /^\d/.test( offset[ 0 ] ) ) {
-				offset[ 0 ] = "+" + offset[ 0 ];
-			}
-			if ( /^\d/.test( offset[ 1 ] ) ) {
-				offset[ 1 ] = "+" + offset[ 1 ];
-			}
-			if ( at.length === 1 ) {
-				if ( /left|center|right/.test( at[ 0 ] ) ) {
-					at[ 1 ] = "center";
-				} else {
-					at[ 1 ] = at[ 0 ];
-					at[ 0 ] = "center";
-				}
-			}
-			return _position.call( this, $.extend( options, {
-				at: at[ 0 ] + offset[ 0 ] + " " + at[ 1 ] + offset[ 1 ],
-				offset: undefined
-			} ) );
-		};
-	}( jQuery ) );
-}
-
-}( jQuery ) );
-
-(function( $, undefined ) {
-
-$.widget( "ui.progressbar", {
-	version: "1.9.2",
-	options: {
-		value: 0,
-		max: 100
-	},
-
-	min: 0,
-
-	_create: function() {
-		this.element
-			.addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
-			.attr({
-				role: "progressbar",
-				"aria-valuemin": this.min,
-				"aria-valuemax": this.options.max,
-				"aria-valuenow": this._value()
-			});
-
-		this.valueDiv = $( "<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>" )
-			.appendTo( this.element );
-
-		this.oldValue = this._value();
-		this._refreshValue();
-	},
-
-	_destroy: function() {
-		this.element
-			.removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" )
-			.removeAttr( "role" )
-			.removeAttr( "aria-valuemin" )
-			.removeAttr( "aria-valuemax" )
-			.removeAttr( "aria-valuenow" );
-
-		this.valueDiv.remove();
-	},
-
-	value: function( newValue ) {
-		if ( newValue === undefined ) {
-			return this._value();
-		}
-
-		this._setOption( "value", newValue );
-		return this;
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "value" ) {
-			this.options.value = value;
-			this._refreshValue();
-			if ( this._value() === this.options.max ) {
-				this._trigger( "complete" );
-			}
-		}
-
-		this._super( key, value );
-	},
-
-	_value: function() {
-		var val = this.options.value;
-		// normalize invalid value
-		if ( typeof val !== "number" ) {
-			val = 0;
-		}
-		return Math.min( this.options.max, Math.max( this.min, val ) );
-	},
-
-	_percentage: function() {
-		return 100 * this._value() / this.options.max;
-	},
-
-	_refreshValue: function() {
-		var value = this.value(),
-			percentage = this._percentage();
-
-		if ( this.oldValue !== value ) {
-			this.oldValue = value;
-			this._trigger( "change" );
-		}
-
-		this.valueDiv
-			.toggle( value > this.min )
-			.toggleClass( "ui-corner-right", value === this.options.max )
-			.width( percentage.toFixed(0) + "%" );
-		this.element.attr( "aria-valuenow", value );
-	}
-});
-
-})( jQuery );
-
-(function( $, undefined ) {
-
-// number of pages in a slider
-// (how many times can you page up/down to go through the whole range)
-var numPages = 5;
-
-$.widget( "ui.slider", $.ui.mouse, {
-	version: "1.9.2",
-	widgetEventPrefix: "slide",
-
-	options: {
-		animate: false,
-		distance: 0,
-		max: 100,
-		min: 0,
-		orientation: "horizontal",
-		range: false,
-		step: 1,
-		value: 0,
-		values: null
-	},
-
-	_create: function() {
-		var i, handleCount,
-			o = this.options,
-			existingHandles = this.element.find( ".ui-slider-handle" ).addClass( "ui-state-default ui-corner-all" ),
-			handle = "<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",
-			handles = [];
-
-		this._keySliding = false;
-		this._mouseSliding = false;
-		this._animateOff = true;
-		this._handleIndex = null;
-		this._detectOrientation();
-		this._mouseInit();
-
-		this.element
-			.addClass( "ui-slider" +
-				" ui-slider-" + this.orientation +
-				" ui-widget" +
-				" ui-widget-content" +
-				" ui-corner-all" +
-				( o.disabled ? " ui-slider-disabled ui-disabled" : "" ) );
-
-		this.range = $([]);
-
-		if ( o.range ) {
-			if ( o.range === true ) {
-				if ( !o.values ) {
-					o.values = [ this._valueMin(), this._valueMin() ];
-				}
-				if ( o.values.length && o.values.length !== 2 ) {
-					o.values = [ o.values[0], o.values[0] ];
-				}
-			}
-
-			this.range = $( "<div></div>" )
-				.appendTo( this.element )
-				.addClass( "ui-slider-range" +
-				// note: this isn't the most fittingly semantic framework class for this element,
-				// but worked best visually with a variety of themes
-				" ui-widget-header" +
-				( ( o.range === "min" || o.range === "max" ) ? " ui-slider-range-" + o.range : "" ) );
-		}
-
-		handleCount = ( o.values && o.values.length ) || 1;
-
-		for ( i = existingHandles.length; i < handleCount; i++ ) {
-			handles.push( handle );
-		}
-
-		this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) );
-
-		this.handle = this.handles.eq( 0 );
-
-		this.handles.add( this.range ).filter( "a" )
-			.click(function( event ) {
-				event.preventDefault();
-			})
-			.mouseenter(function() {
-				if ( !o.disabled ) {
-					$( this ).addClass( "ui-state-hover" );
-				}
-			})
-			.mouseleave(function() {
-				$( this ).removeClass( "ui-state-hover" );
-			})
-			.focus(function() {
-				if ( !o.disabled ) {
-					$( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" );
-					$( this ).addClass( "ui-state-focus" );
-				} else {
-					$( this ).blur();
-				}
-			})
-			.blur(function() {
-				$( this ).removeClass( "ui-state-focus" );
-			});
-
-		this.handles.each(function( i ) {
-			$( this ).data( "ui-slider-handle-index", i );
-		});
-
-		this._on( this.handles, {
-			keydown: function( event ) {
-				var allowed, curVal, newVal, step,
-					index = $( event.target ).data( "ui-slider-handle-index" );
-
-				switch ( event.keyCode ) {
-					case $.ui.keyCode.HOME:
-					case $.ui.keyCode.END:
-					case $.ui.keyCode.PAGE_UP:
-					case $.ui.keyCode.PAGE_DOWN:
-					case $.ui.keyCode.UP:
-					case $.ui.keyCode.RIGHT:
-					case $.ui.keyCode.DOWN:
-					case $.ui.keyCode.LEFT:
-						event.preventDefault();
-						if ( !this._keySliding ) {
-							this._keySliding = true;
-							$( event.target ).addClass( "ui-state-active" );
-							allowed = this._start( event, index );
-							if ( allowed === false ) {
-								return;
-							}
-						}
-						break;
-				}
-
-				step = this.options.step;
-				if ( this.options.values && this.options.values.length ) {
-					curVal = newVal = this.values( index );
-				} else {
-					curVal = newVal = this.value();
-				}
-
-				switch ( event.keyCode ) {
-					case $.ui.keyCode.HOME:
-						newVal = this._valueMin();
-						break;
-					case $.ui.keyCode.END:
-						newVal = this._valueMax();
-						break;
-					case $.ui.keyCode.PAGE_UP:
-						newVal = this._trimAlignValue( curVal + ( (this._valueMax() - this._valueMin()) / numPages ) );
-						break;
-					case $.ui.keyCode.PAGE_DOWN:
-						newVal = this._trimAlignValue( curVal - ( (this._valueMax() - this._valueMin()) / numPages ) );
-						break;
-					case $.ui.keyCode.UP:
-					case $.ui.keyCode.RIGHT:
-						if ( curVal === this._valueMax() ) {
-							return;
-						}
-						newVal = this._trimAlignValue( curVal + step );
-						break;
-					case $.ui.keyCode.DOWN:
-					case $.ui.keyCode.LEFT:
-						if ( curVal === this._valueMin() ) {
-							return;
-						}
-						newVal = this._trimAlignValue( curVal - step );
-						break;
-				}
-
-				this._slide( event, index, newVal );
-			},
-			keyup: function( event ) {
-				var index = $( event.target ).data( "ui-slider-handle-index" );
-
-				if ( this._keySliding ) {
-					this._keySliding = false;
-					this._stop( event, index );
-					this._change( event, index );
-					$( event.target ).removeClass( "ui-state-active" );
-				}
-			}
-		});
-
-		this._refreshValue();
-
-		this._animateOff = false;
-	},
-
-	_destroy: function() {
-		this.handles.remove();
-		this.range.remove();
-
-		this.element
-			.removeClass( "ui-slider" +
-				" ui-slider-horizontal" +
-				" ui-slider-vertical" +
-				" ui-slider-disabled" +
-				" ui-widget" +
-				" ui-widget-content" +
-				" ui-corner-all" );
-
-		this._mouseDestroy();
-	},
-
-	_mouseCapture: function( event ) {
-		var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,
-			that = this,
-			o = this.options;
-
-		if ( o.disabled ) {
-			return false;
-		}
-
-		this.elementSize = {
-			width: this.element.outerWidth(),
-			height: this.element.outerHeight()
-		};
-		this.elementOffset = this.element.offset();
-
-		position = { x: event.pageX, y: event.pageY };
-		normValue = this._normValueFromMouse( position );
-		distance = this._valueMax() - this._valueMin() + 1;
-		this.handles.each(function( i ) {
-			var thisDistance = Math.abs( normValue - that.values(i) );
-			if ( distance > thisDistance ) {
-				distance = thisDistance;
-				closestHandle = $( this );
-				index = i;
-			}
-		});
-
-		// workaround for bug #3736 (if both handles of a range are at 0,
-		// the first is always used as the one with least distance,
-		// and moving it is obviously prevented by preventing negative ranges)
-		if( o.range === true && this.values(1) === o.min ) {
-			index += 1;
-			closestHandle = $( this.handles[index] );
-		}
-
-		allowed = this._start( event, index );
-		if ( allowed === false ) {
-			return false;
-		}
-		this._mouseSliding = true;
-
-		this._handleIndex = index;
-
-		closestHandle
-			.addClass( "ui-state-active" )
-			.focus();
-
-		offset = closestHandle.offset();
-		mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" );
-		this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {
-			left: event.pageX - offset.left - ( closestHandle.width() / 2 ),
-			top: event.pageY - offset.top -
-				( closestHandle.height() / 2 ) -
-				( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) -
-				( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) +
-				( parseInt( closestHandle.css("marginTop"), 10 ) || 0)
-		};
-
-		if ( !this.handles.hasClass( "ui-state-hover" ) ) {
-			this._slide( event, index, normValue );
-		}
-		this._animateOff = true;
-		return true;
-	},
-
-	_mouseStart: function() {
-		return true;
-	},
-
-	_mouseDrag: function( event ) {
-		var position = { x: event.pageX, y: event.pageY },
-			normValue = this._normValueFromMouse( position );
-
-		this._slide( event, this._handleIndex, normValue );
-
-		return false;
-	},
-
-	_mouseStop: function( event ) {
-		this.handles.removeClass( "ui-state-active" );
-		this._mouseSliding = false;
-
-		this._stop( event, this._handleIndex );
-		this._change( event, this._handleIndex );
-
-		this._handleIndex = null;
-		this._clickOffset = null;
-		this._animateOff = false;
-
-		return false;
-	},
-
-	_detectOrientation: function() {
-		this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal";
-	},
-
-	_normValueFromMouse: function( position ) {
-		var pixelTotal,
-			pixelMouse,
-			percentMouse,
-			valueTotal,
-			valueMouse;
-
-		if ( this.orientation === "horizontal" ) {
-			pixelTotal = this.elementSize.width;
-			pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );
-		} else {
-			pixelTotal = this.elementSize.height;
-			pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );
-		}
-
-		percentMouse = ( pixelMouse / pixelTotal );
-		if ( percentMouse > 1 ) {
-			percentMouse = 1;
-		}
-		if ( percentMouse < 0 ) {
-			percentMouse = 0;
-		}
-		if ( this.orientation === "vertical" ) {
-			percentMouse = 1 - percentMouse;
-		}
-
-		valueTotal = this._valueMax() - this._valueMin();
-		valueMouse = this._valueMin() + percentMouse * valueTotal;
-
-		return this._trimAlignValue( valueMouse );
-	},
-
-	_start: function( event, index ) {
-		var uiHash = {
-			handle: this.handles[ index ],
-			value: this.value()
-		};
-		if ( this.options.values && this.options.values.length ) {
-			uiHash.value = this.values( index );
-			uiHash.values = this.values();
-		}
-		return this._trigger( "start", event, uiHash );
-	},
-
-	_slide: function( event, index, newVal ) {
-		var otherVal,
-			newValues,
-			allowed;
-
-		if ( this.options.values && this.options.values.length ) {
-			otherVal = this.values( index ? 0 : 1 );
-
-			if ( ( this.options.values.length === 2 && this.options.range === true ) &&
-					( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )
-				) {
-				newVal = otherVal;
-			}
-
-			if ( newVal !== this.values( index ) ) {
-				newValues = this.values();
-				newValues[ index ] = newVal;
-				// A slide can be canceled by returning false from the slide callback
-				allowed = this._trigger( "slide", event, {
-					handle: this.handles[ index ],
-					value: newVal,
-					values: newValues
-				} );
-				otherVal = this.values( index ? 0 : 1 );
-				if ( allowed !== false ) {
-					this.values( index, newVal, true );
-				}
-			}
-		} else {
-			if ( newVal !== this.value() ) {
-				// A slide can be canceled by returning false from the slide callback
-				allowed = this._trigger( "slide", event, {
-					handle: this.handles[ index ],
-					value: newVal
-				} );
-				if ( allowed !== false ) {
-					this.value( newVal );
-				}
-			}
-		}
-	},
-
-	_stop: function( event, index ) {
-		var uiHash = {
-			handle: this.handles[ index ],
-			value: this.value()
-		};
-		if ( this.options.values && this.options.values.length ) {
-			uiHash.value = this.values( index );
-			uiHash.values = this.values();
-		}
-
-		this._trigger( "stop", event, uiHash );
-	},
-
-	_change: function( event, index ) {
-		if ( !this._keySliding && !this._mouseSliding ) {
-			var uiHash = {
-				handle: this.handles[ index ],
-				value: this.value()
-			};
-			if ( this.options.values && this.options.values.length ) {
-				uiHash.value = this.values( index );
-				uiHash.values = this.values();
-			}
-
-			this._trigger( "change", event, uiHash );
-		}
-	},
-
-	value: function( newValue ) {
-		if ( arguments.length ) {
-			this.options.value = this._trimAlignValue( newValue );
-			this._refreshValue();
-			this._change( null, 0 );
-			return;
-		}
-
-		return this._value();
-	},
-
-	values: function( index, newValue ) {
-		var vals,
-			newValues,
-			i;
-
-		if ( arguments.length > 1 ) {
-			this.options.values[ index ] = this._trimAlignValue( newValue );
-			this._refreshValue();
-			this._change( null, index );
-			return;
-		}
-
-		if ( arguments.length ) {
-			if ( $.isArray( arguments[ 0 ] ) ) {
-				vals = this.options.values;
-				newValues = arguments[ 0 ];
-				for ( i = 0; i < vals.length; i += 1 ) {
-					vals[ i ] = this._trimAlignValue( newValues[ i ] );
-					this._change( null, i );
-				}
-				this._refreshValue();
-			} else {
-				if ( this.options.values && this.options.values.length ) {
-					return this._values( index );
-				} else {
-					return this.value();
-				}
-			}
-		} else {
-			return this._values();
-		}
-	},
-
-	_setOption: function( key, value ) {
-		var i,
-			valsLength = 0;
-
-		if ( $.isArray( this.options.values ) ) {
-			valsLength = this.options.values.length;
-		}
-
-		$.Widget.prototype._setOption.apply( this, arguments );
-
-		switch ( key ) {
-			case "disabled":
-				if ( value ) {
-					this.handles.filter( ".ui-state-focus" ).blur();
-					this.handles.removeClass( "ui-state-hover" );
-					this.handles.prop( "disabled", true );
-					this.element.addClass( "ui-disabled" );
-				} else {
-					this.handles.prop( "disabled", false );
-					this.element.removeClass( "ui-disabled" );
-				}
-				break;
-			case "orientation":
-				this._detectOrientation();
-				this.element
-					.removeClass( "ui-slider-horizontal ui-slider-vertical" )
-					.addClass( "ui-slider-" + this.orientation );
-				this._refreshValue();
-				break;
-			case "value":
-				this._animateOff = true;
-				this._refreshValue();
-				this._change( null, 0 );
-				this._animateOff = false;
-				break;
-			case "values":
-				this._animateOff = true;
-				this._refreshValue();
-				for ( i = 0; i < valsLength; i += 1 ) {
-					this._change( null, i );
-				}
-				this._animateOff = false;
-				break;
-			case "min":
-			case "max":
-				this._animateOff = true;
-				this._refreshValue();
-				this._animateOff = false;
-				break;
-		}
-	},
-
-	//internal value getter
-	// _value() returns value trimmed by min and max, aligned by step
-	_value: function() {
-		var val = this.options.value;
-		val = this._trimAlignValue( val );
-
-		return val;
-	},
-
-	//internal values getter
-	// _values() returns array of values trimmed by min and max, aligned by step
-	// _values( index ) returns single value trimmed by min and max, aligned by step
-	_values: function( index ) {
-		var val,
-			vals,
-			i;
-
-		if ( arguments.length ) {
-			val = this.options.values[ index ];
-			val = this._trimAlignValue( val );
-
-			return val;
-		} else {
-			// .slice() creates a copy of the array
-			// this copy gets trimmed by min and max and then returned
-			vals = this.options.values.slice();
-			for ( i = 0; i < vals.length; i+= 1) {
-				vals[ i ] = this._trimAlignValue( vals[ i ] );
-			}
-
-			return vals;
-		}
-	},
-
-	// returns the step-aligned value that val is closest to, between (inclusive) min and max
-	_trimAlignValue: function( val ) {
-		if ( val <= this._valueMin() ) {
-			return this._valueMin();
-		}
-		if ( val >= this._valueMax() ) {
-			return this._valueMax();
-		}
-		var step = ( this.options.step > 0 ) ? this.options.step : 1,
-			valModStep = (val - this._valueMin()) % step,
-			alignValue = val - valModStep;
-
-		if ( Math.abs(valModStep) * 2 >= step ) {
-			alignValue += ( valModStep > 0 ) ? step : ( -step );
-		}
-
-		// Since JavaScript has problems with large floats, round
-		// the final value to 5 digits after the decimal point (see #4124)
-		return parseFloat( alignValue.toFixed(5) );
-	},
-
-	_valueMin: function() {
-		return this.options.min;
-	},
-
-	_valueMax: function() {
-		return this.options.max;
-	},
-
-	_refreshValue: function() {
-		var lastValPercent, valPercent, value, valueMin, valueMax,
-			oRange = this.options.range,
-			o = this.options,
-			that = this,
-			animate = ( !this._animateOff ) ? o.animate : false,
-			_set = {};
-
-		if ( this.options.values && this.options.values.length ) {
-			this.handles.each(function( i ) {
-				valPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;
-				_set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
-				$( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-				if ( that.options.range === true ) {
-					if ( that.orientation === "horizontal" ) {
-						if ( i === 0 ) {
-							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
-						}
-						if ( i === 1 ) {
-							that.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
-						}
-					} else {
-						if ( i === 0 ) {
-							that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
-						}
-						if ( i === 1 ) {
-							that.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
-						}
-					}
-				}
-				lastValPercent = valPercent;
-			});
-		} else {
-			value = this.value();
-			valueMin = this._valueMin();
-			valueMax = this._valueMax();
-			valPercent = ( valueMax !== valueMin ) ?
-					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
-					0;
-			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
-			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
-
-			if ( oRange === "min" && this.orientation === "horizontal" ) {
-				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
-			}
-			if ( oRange === "max" && this.orientation === "horizontal" ) {
-				this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
-			}
-			if ( oRange === "min" && this.orientation === "vertical" ) {
-				this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
-			}
-			if ( oRange === "max" && this.orientation === "vertical" ) {
-				this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
-			}
-		}
-	}
-
-});
-
-}(jQuery));
-
-(function( $ ) {
-
-function modifier( fn ) {
-	return function() {
-		var previous = this.element.val();
-		fn.apply( this, arguments );
-		this._refresh();
-		if ( previous !== this.element.val() ) {
-			this._trigger( "change" );
-		}
-	};
-}
-
-$.widget( "ui.spinner", {
-	version: "1.9.2",
-	defaultElement: "<input>",
-	widgetEventPrefix: "spin",
-	options: {
-		culture: null,
-		icons: {
-			down: "ui-icon-triangle-1-s",
-			up: "ui-icon-triangle-1-n"
-		},
-		incremental: true,
-		max: null,
-		min: null,
-		numberFormat: null,
-		page: 10,
-		step: 1,
-
-		change: null,
-		spin: null,
-		start: null,
-		stop: null
-	},
-
-	_create: function() {
-		// handle string values that need to be parsed
-		this._setOption( "max", this.options.max );
-		this._setOption( "min", this.options.min );
-		this._setOption( "step", this.options.step );
-
-		// format the value, but don't constrain
-		this._value( this.element.val(), true );
-
-		this._draw();
-		this._on( this._events );
-		this._refresh();
-
-		// turning off autocomplete prevents the browser from remembering the
-		// value when navigating through history, so we re-enable autocomplete
-		// if the page is unloaded before the widget is destroyed. #7790
-		this._on( this.window, {
-			beforeunload: function() {
-				this.element.removeAttr( "autocomplete" );
-			}
-		});
-	},
-
-	_getCreateOptions: function() {
-		var options = {},
-			element = this.element;
-
-		$.each( [ "min", "max", "step" ], function( i, option ) {
-			var value = element.attr( option );
-			if ( value !== undefined && value.length ) {
-				options[ option ] = value;
-			}
-		});
-
-		return options;
-	},
-
-	_events: {
-		keydown: function( event ) {
-			if ( this._start( event ) && this._keydown( event ) ) {
-				event.preventDefault();
-			}
-		},
-		keyup: "_stop",
-		focus: function() {
-			this.previous = this.element.val();
-		},
-		blur: function( event ) {
-			if ( this.cancelBlur ) {
-				delete this.cancelBlur;
-				return;
-			}
-
-			this._refresh();
-			if ( this.previous !== this.element.val() ) {
-				this._trigger( "change", event );
-			}
-		},
-		mousewheel: function( event, delta ) {
-			if ( !delta ) {
-				return;
-			}
-			if ( !this.spinning && !this._start( event ) ) {
-				return false;
-			}
-
-			this._spin( (delta > 0 ? 1 : -1) * this.options.step, event );
-			clearTimeout( this.mousewheelTimer );
-			this.mousewheelTimer = this._delay(function() {
-				if ( this.spinning ) {
-					this._stop( event );
-				}
-			}, 100 );
-			event.preventDefault();
-		},
-		"mousedown .ui-spinner-button": function( event ) {
-			var previous;
-
-			// We never want the buttons to have focus; whenever the user is
-			// interacting with the spinner, the focus should be on the input.
-			// If the input is focused then this.previous is properly set from
-			// when the input first received focus. If the input is not focused
-			// then we need to set this.previous based on the value before spinning.
-			previous = this.element[0] === this.document[0].activeElement ?
-				this.previous : this.element.val();
-			function checkFocus() {
-				var isActive = this.element[0] === this.document[0].activeElement;
-				if ( !isActive ) {
-					this.element.focus();
-					this.previous = previous;
-					// support: IE
-					// IE sets focus asynchronously, so we need to check if focus
-					// moved off of the input because the user clicked on the button.
-					this._delay(function() {
-						this.previous = previous;
-					});
-				}
-			}
-
-			// ensure focus is on (or stays on) the text field
-			event.preventDefault();
-			checkFocus.call( this );
-
-			// support: IE
-			// IE doesn't prevent moving focus even with event.preventDefault()
-			// so we set a flag to know when we should ignore the blur event
-			// and check (again) if focus moved off of the input.
-			this.cancelBlur = true;
-			this._delay(function() {
-				delete this.cancelBlur;
-				checkFocus.call( this );
-			});
-
-			if ( this._start( event ) === false ) {
-				return;
-			}
-
-			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
-		},
-		"mouseup .ui-spinner-button": "_stop",
-		"mouseenter .ui-spinner-button": function( event ) {
-			// button will add ui-state-active if mouse was down while mouseleave and kept down
-			if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) {
-				return;
-			}
-
-			if ( this._start( event ) === false ) {
-				return false;
-			}
-			this._repeat( null, $( event.currentTarget ).hasClass( "ui-spinner-up" ) ? 1 : -1, event );
-		},
-		// TODO: do we really want to consider this a stop?
-		// shouldn't we just stop the repeater and wait until mouseup before
-		// we trigger the stop event?
-		"mouseleave .ui-spinner-button": "_stop"
-	},
-
-	_draw: function() {
-		var uiSpinner = this.uiSpinner = this.element
-			.addClass( "ui-spinner-input" )
-			.attr( "autocomplete", "off" )
-			.wrap( this._uiSpinnerHtml() )
-			.parent()
-				// add buttons
-				.append( this._buttonHtml() );
-
-		this.element.attr( "role", "spinbutton" );
-
-		// button bindings
-		this.buttons = uiSpinner.find( ".ui-spinner-button" )
-			.attr( "tabIndex", -1 )
-			.button()
-			.removeClass( "ui-corner-all" );
-
-		// IE 6 doesn't understand height: 50% for the buttons
-		// unless the wrapper has an explicit height
-		if ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&
-				uiSpinner.height() > 0 ) {
-			uiSpinner.height( uiSpinner.height() );
-		}
-
-		// disable spinner if element was already disabled
-		if ( this.options.disabled ) {
-			this.disable();
-		}
-	},
-
-	_keydown: function( event ) {
-		var options = this.options,
-			keyCode = $.ui.keyCode;
-
-		switch ( event.keyCode ) {
-		case keyCode.UP:
-			this._repeat( null, 1, event );
-			return true;
-		case keyCode.DOWN:
-			this._repeat( null, -1, event );
-			return true;
-		case keyCode.PAGE_UP:
-			this._repeat( null, options.page, event );
-			return true;
-		case keyCode.PAGE_DOWN:
-			this._repeat( null, -options.page, event );
-			return true;
-		}
-
-		return false;
-	},
-
-	_uiSpinnerHtml: function() {
-		return "<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>";
-	},
-
-	_buttonHtml: function() {
-		return "" +
-			"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>" +
-				"<span class='ui-icon " + this.options.icons.up + "'>&#9650;</span>" +
-			"</a>" +
-			"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>" +
-				"<span class='ui-icon " + this.options.icons.down + "'>&#9660;</span>" +
-			"</a>";
-	},
-
-	_start: function( event ) {
-		if ( !this.spinning && this._trigger( "start", event ) === false ) {
-			return false;
-		}
-
-		if ( !this.counter ) {
-			this.counter = 1;
-		}
-		this.spinning = true;
-		return true;
-	},
-
-	_repeat: function( i, steps, event ) {
-		i = i || 500;
-
-		clearTimeout( this.timer );
-		this.timer = this._delay(function() {
-			this._repeat( 40, steps, event );
-		}, i );
-
-		this._spin( steps * this.options.step, event );
-	},
-
-	_spin: function( step, event ) {
-		var value = this.value() || 0;
-
-		if ( !this.counter ) {
-			this.counter = 1;
-		}
-
-		value = this._adjustValue( value + step * this._increment( this.counter ) );
-
-		if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false) {
-			this._value( value );
-			this.counter++;
-		}
-	},
-
-	_increment: function( i ) {
-		var incremental = this.options.incremental;
-
-		if ( incremental ) {
-			return $.isFunction( incremental ) ?
-				incremental( i ) :
-				Math.floor( i*i*i/50000 - i*i/500 + 17*i/200 + 1 );
-		}
-
-		return 1;
-	},
-
-	_precision: function() {
-		var precision = this._precisionOf( this.options.step );
-		if ( this.options.min !== null ) {
-			precision = Math.max( precision, this._precisionOf( this.options.min ) );
-		}
-		return precision;
-	},
-
-	_precisionOf: function( num ) {
-		var str = num.toString(),
-			decimal = str.indexOf( "." );
-		return decimal === -1 ? 0 : str.length - decimal - 1;
-	},
-
-	_adjustValue: function( value ) {
-		var base, aboveMin,
-			options = this.options;
-
-		// make sure we're at a valid step
-		// - find out where we are relative to the base (min or 0)
-		base = options.min !== null ? options.min : 0;
-		aboveMin = value - base;
-		// - round to the nearest step
-		aboveMin = Math.round(aboveMin / options.step) * options.step;
-		// - rounding is based on 0, so adjust back to our base
-		value = base + aboveMin;
-
-		// fix precision from bad JS floating point math
-		value = parseFloat( value.toFixed( this._precision() ) );
-
-		// clamp the value
-		if ( options.max !== null && value > options.max) {
-			return options.max;
-		}
-		if ( options.min !== null && value < options.min ) {
-			return options.min;
-		}
-
-		return value;
-	},
-
-	_stop: function( event ) {
-		if ( !this.spinning ) {
-			return;
-		}
-
-		clearTimeout( this.timer );
-		clearTimeout( this.mousewheelTimer );
-		this.counter = 0;
-		this.spinning = false;
-		this._trigger( "stop", event );
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "culture" || key === "numberFormat" ) {
-			var prevValue = this._parse( this.element.val() );
-			this.options[ key ] = value;
-			this.element.val( this._format( prevValue ) );
-			return;
-		}
-
-		if ( key === "max" || key === "min" || key === "step" ) {
-			if ( typeof value === "string" ) {
-				value = this._parse( value );
-			}
-		}
-
-		this._super( key, value );
-
-		if ( key === "disabled" ) {
-			if ( value ) {
-				this.element.prop( "disabled", true );
-				this.buttons.button( "disable" );
-			} else {
-				this.element.prop( "disabled", false );
-				this.buttons.button( "enable" );
-			}
-		}
-	},
-
-	_setOptions: modifier(function( options ) {
-		this._super( options );
-		this._value( this.element.val() );
-	}),
-
-	_parse: function( val ) {
-		if ( typeof val === "string" && val !== "" ) {
-			val = window.Globalize && this.options.numberFormat ?
-				Globalize.parseFloat( val, 10, this.options.culture ) : +val;
-		}
-		return val === "" || isNaN( val ) ? null : val;
-	},
-
-	_format: function( value ) {
-		if ( value === "" ) {
-			return "";
-		}
-		return window.Globalize && this.options.numberFormat ?
-			Globalize.format( value, this.options.numberFormat, this.options.culture ) :
-			value;
-	},
-
-	_refresh: function() {
-		this.element.attr({
-			"aria-valuemin": this.options.min,
-			"aria-valuemax": this.options.max,
-			// TODO: what should we do with values that can't be parsed?
-			"aria-valuenow": this._parse( this.element.val() )
-		});
-	},
-
-	// update the value without triggering change
-	_value: function( value, allowAny ) {
-		var parsed;
-		if ( value !== "" ) {
-			parsed = this._parse( value );
-			if ( parsed !== null ) {
-				if ( !allowAny ) {
-					parsed = this._adjustValue( parsed );
-				}
-				value = this._format( parsed );
-			}
-		}
-		this.element.val( value );
-		this._refresh();
-	},
-
-	_destroy: function() {
-		this.element
-			.removeClass( "ui-spinner-input" )
-			.prop( "disabled", false )
-			.removeAttr( "autocomplete" )
-			.removeAttr( "role" )
-			.removeAttr( "aria-valuemin" )
-			.removeAttr( "aria-valuemax" )
-			.removeAttr( "aria-valuenow" );
-		this.uiSpinner.replaceWith( this.element );
-	},
-
-	stepUp: modifier(function( steps ) {
-		this._stepUp( steps );
-	}),
-	_stepUp: function( steps ) {
-		this._spin( (steps || 1) * this.options.step );
-	},
-
-	stepDown: modifier(function( steps ) {
-		this._stepDown( steps );
-	}),
-	_stepDown: function( steps ) {
-		this._spin( (steps || 1) * -this.options.step );
-	},
-
-	pageUp: modifier(function( pages ) {
-		this._stepUp( (pages || 1) * this.options.page );
-	}),
-
-	pageDown: modifier(function( pages ) {
-		this._stepDown( (pages || 1) * this.options.page );
-	}),
-
-	value: function( newVal ) {
-		if ( !arguments.length ) {
-			return this._parse( this.element.val() );
-		}
-		modifier( this._value ).call( this, newVal );
-	},
-
-	widget: function() {
-		return this.uiSpinner;
-	}
-});
-
-}( jQuery ) );
-
-(function( $, undefined ) {
-
-var tabId = 0,
-	rhash = /#.*$/;
-
-function getNextTabId() {
-	return ++tabId;
-}
-
-function isLocal( anchor ) {
-	return anchor.hash.length > 1 &&
-		anchor.href.replace( rhash, "" ) ===
-			location.href.replace( rhash, "" )
-				// support: Safari 5.1
-				// Safari 5.1 doesn't encode spaces in window.location
-				// but it does encode spaces from anchors (#8777)
-				.replace( /\s/g, "%20" );
-}
-
-$.widget( "ui.tabs", {
-	version: "1.9.2",
-	delay: 300,
-	options: {
-		active: null,
-		collapsible: false,
-		event: "click",
-		heightStyle: "content",
-		hide: null,
-		show: null,
-
-		// callbacks
-		activate: null,
-		beforeActivate: null,
-		beforeLoad: null,
-		load: null
-	},
-
-	_create: function() {
-		var that = this,
-			options = this.options,
-			active = options.active,
-			locationHash = location.hash.substring( 1 );
-
-		this.running = false;
-
-		this.element
-			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
-			.toggleClass( "ui-tabs-collapsible", options.collapsible )
-			// Prevent users from focusing disabled tabs via click
-			.delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
-				if ( $( this ).is( ".ui-state-disabled" ) ) {
-					event.preventDefault();
-				}
-			})
-			// support: IE <9
-			// Preventing the default action in mousedown doesn't prevent IE
-			// from focusing the element, so if the anchor gets focused, blur.
-			// We don't have to worry about focusing the previously focused
-			// element since clicking on a non-focusable element should focus
-			// the body anyway.
-			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
-				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
-					this.blur();
-				}
-			});
-
-		this._processTabs();
-
-		if ( active === null ) {
-			// check the fragment identifier in the URL
-			if ( locationHash ) {
-				this.tabs.each(function( i, tab ) {
-					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
-						active = i;
-						return false;
-					}
-				});
-			}
-
-			// check for a tab marked active via a class
-			if ( active === null ) {
-				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
-			}
-
-			// no active tab, set to false
-			if ( active === null || active === -1 ) {
-				active = this.tabs.length ? 0 : false;
-			}
-		}
-
-		// handle numbers: negative, out of range
-		if ( active !== false ) {
-			active = this.tabs.index( this.tabs.eq( active ) );
-			if ( active === -1 ) {
-				active = options.collapsible ? false : 0;
-			}
-		}
-		options.active = active;
-
-		// don't allow collapsible: false and active: false
-		if ( !options.collapsible && options.active === false && this.anchors.length ) {
-			options.active = 0;
-		}
-
-		// Take disabling tabs via class attribute from HTML
-		// into account and update option properly.
-		if ( $.isArray( options.disabled ) ) {
-			options.disabled = $.unique( options.disabled.concat(
-				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
-					return that.tabs.index( li );
-				})
-			) ).sort();
-		}
-
-		// check for length avoids error when initializing empty list
-		if ( this.options.active !== false && this.anchors.length ) {
-			this.active = this._findActive( this.options.active );
-		} else {
-			this.active = $();
-		}
-
-		this._refresh();
-
-		if ( this.active.length ) {
-			this.load( options.active );
-		}
-	},
-
-	_getCreateEventData: function() {
-		return {
-			tab: this.active,
-			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
-		};
-	},
-
-	_tabKeydown: function( event ) {
-		var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
-			selectedIndex = this.tabs.index( focusedTab ),
-			goingForward = true;
-
-		if ( this._handlePageNav( event ) ) {
-			return;
-		}
-
-		switch ( event.keyCode ) {
-			case $.ui.keyCode.RIGHT:
-			case $.ui.keyCode.DOWN:
-				selectedIndex++;
-				break;
-			case $.ui.keyCode.UP:
-			case $.ui.keyCode.LEFT:
-				goingForward = false;
-				selectedIndex--;
-				break;
-			case $.ui.keyCode.END:
-				selectedIndex = this.anchors.length - 1;
-				break;
-			case $.ui.keyCode.HOME:
-				selectedIndex = 0;
-				break;
-			case $.ui.keyCode.SPACE:
-				// Activate only, no collapsing
-				event.preventDefault();
-				clearTimeout( this.activating );
-				this._activate( selectedIndex );
-				return;
-			case $.ui.keyCode.ENTER:
-				// Toggle (cancel delayed activation, allow collapsing)
-				event.preventDefault();
-				clearTimeout( this.activating );
-				// Determine if we should collapse or activate
-				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
-				return;
-			default:
-				return;
-		}
-
-		// Focus the appropriate tab, based on which key was pressed
-		event.preventDefault();
-		clearTimeout( this.activating );
-		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
-
-		// Navigating with control key will prevent automatic activation
-		if ( !event.ctrlKey ) {
-			// Update aria-selected immediately so that AT think the tab is already selected.
-			// Otherwise AT may confuse the user by stating that they need to activate the tab,
-			// but the tab will already be activated by the time the announcement finishes.
-			focusedTab.attr( "aria-selected", "false" );
-			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
-
-			this.activating = this._delay(function() {
-				this.option( "active", selectedIndex );
-			}, this.delay );
-		}
-	},
-
-	_panelKeydown: function( event ) {
-		if ( this._handlePageNav( event ) ) {
-			return;
-		}
-
-		// Ctrl+up moves focus to the current tab
-		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
-			event.preventDefault();
-			this.active.focus();
-		}
-	},
-
-	// Alt+page up/down moves focus to the previous/next tab (and activates)
-	_handlePageNav: function( event ) {
-		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
-			this._activate( this._focusNextTab( this.options.active - 1, false ) );
-			return true;
-		}
-		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
-			this._activate( this._focusNextTab( this.options.active + 1, true ) );
-			return true;
-		}
-	},
-
-	_findNextTab: function( index, goingForward ) {
-		var lastTabIndex = this.tabs.length - 1;
-
-		function constrain() {
-			if ( index > lastTabIndex ) {
-				index = 0;
-			}
-			if ( index < 0 ) {
-				index = lastTabIndex;
-			}
-			return index;
-		}
-
-		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
-			index = goingForward ? index + 1 : index - 1;
-		}
-
-		return index;
-	},
-
-	_focusNextTab: function( index, goingForward ) {
-		index = this._findNextTab( index, goingForward );
-		this.tabs.eq( index ).focus();
-		return index;
-	},
-
-	_setOption: function( key, value ) {
-		if ( key === "active" ) {
-			// _activate() will handle invalid values and update this.options
-			this._activate( value );
-			return;
-		}
-
-		if ( key === "disabled" ) {
-			// don't use the widget factory's disabled handling
-			this._setupDisabled( value );
-			return;
-		}
-
-		this._super( key, value);
-
-		if ( key === "collapsible" ) {
-			this.element.toggleClass( "ui-tabs-collapsible", value );
-			// Setting collapsible: false while collapsed; open first panel
-			if ( !value && this.options.active === false ) {
-				this._activate( 0 );
-			}
-		}
-
-		if ( key === "event" ) {
-			this._setupEvents( value );
-		}
-
-		if ( key === "heightStyle" ) {
-			this._setupHeightStyle( value );
-		}
-	},
-
-	_tabId: function( tab ) {
-		return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
-	},
-
-	_sanitizeSelector: function( hash ) {
-		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
-	},
-
-	refresh: function() {
-		var options = this.options,
-			lis = this.tablist.children( ":has(a[href])" );
-
-		// get disabled tabs from class attribute from HTML
-		// this will get converted to a boolean if needed in _refresh()
-		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
-			return lis.index( tab );
-		});
-
-		this._processTabs();
-
-		// was collapsed or no tabs
-		if ( options.active === false || !this.anchors.length ) {
-			options.active = false;
-			this.active = $();
-		// was active, but active tab is gone
-		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
-			// all remaining tabs are disabled
-			if ( this.tabs.length === options.disabled.length ) {
-				options.active = false;
-				this.active = $();
-			// activate previous tab
-			} else {
-				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
-			}
-		// was active, active tab still exists
-		} else {
-			// make sure active index is correct
-			options.active = this.tabs.index( this.active );
-		}
-
-		this._refresh();
-	},
-
-	_refresh: function() {
-		this._setupDisabled( this.options.disabled );
-		this._setupEvents( this.options.event );
-		this._setupHeightStyle( this.options.heightStyle );
-
-		this.tabs.not( this.active ).attr({
-			"aria-selected": "false",
-			tabIndex: -1
-		});
-		this.panels.not( this._getPanelForTab( this.active ) )
-			.hide()
-			.attr({
-				"aria-expanded": "false",
-				"aria-hidden": "true"
-			});
-
-		// Make sure one tab is in the tab order
-		if ( !this.active.length ) {
-			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
-		} else {
-			this.active
-				.addClass( "ui-tabs-active ui-state-active" )
-				.attr({
-					"aria-selected": "true",
-					tabIndex: 0
-				});
-			this._getPanelForTab( this.active )
-				.show()
-				.attr({
-					"aria-expanded": "true",
-					"aria-hidden": "false"
-				});
-		}
-	},
-
-	_processTabs: function() {
-		var that = this;
-
-		this.tablist = this._getList()
-			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
-			.attr( "role", "tablist" );
-
-		this.tabs = this.tablist.find( "> li:has(a[href])" )
-			.addClass( "ui-state-default ui-corner-top" )
-			.attr({
-				role: "tab",
-				tabIndex: -1
-			});
-
-		this.anchors = this.tabs.map(function() {
-				return $( "a", this )[ 0 ];
-			})
-			.addClass( "ui-tabs-anchor" )
-			.attr({
-				role: "presentation",
-				tabIndex: -1
-			});
-
-		this.panels = $();
-
-		this.anchors.each(function( i, anchor ) {
-			var selector, panel, panelId,
-				anchorId = $( anchor ).uniqueId().attr( "id" ),
-				tab = $( anchor ).closest( "li" ),
-				originalAriaControls = tab.attr( "aria-controls" );
-
-			// inline tab
-			if ( isLocal( anchor ) ) {
-				selector = anchor.hash;
-				panel = that.element.find( that._sanitizeSelector( selector ) );
-			// remote tab
-			} else {
-				panelId = that._tabId( tab );
-				selector = "#" + panelId;
-				panel = that.element.find( selector );
-				if ( !panel.length ) {
-					panel = that._createPanel( panelId );
-					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
-				}
-				panel.attr( "aria-live", "polite" );
-			}
-
-			if ( panel.length) {
-				that.panels = that.panels.add( panel );
-			}
-			if ( originalAriaControls ) {
-				tab.data( "ui-tabs-aria-controls", originalAriaControls );
-			}
-			tab.attr({
-				"aria-controls": selector.substring( 1 ),
-				"aria-labelledby": anchorId
-			});
-			panel.attr( "aria-labelledby", anchorId );
-		});
-
-		this.panels
-			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
-			.attr( "role", "tabpanel" );
-	},
-
-	// allow overriding how to find the list for rare usage scenarios (#7715)
-	_getList: function() {
-		return this.element.find( "ol,ul" ).eq( 0 );
-	},
-
-	_createPanel: function( id ) {
-		return $( "<div>" )
-			.attr( "id", id )
-			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
-			.data( "ui-tabs-destroy", true );
-	},
-
-	_setupDisabled: function( disabled ) {
-		if ( $.isArray( disabled ) ) {
-			if ( !disabled.length ) {
-				disabled = false;
-			} else if ( disabled.length === this.anchors.length ) {
-				disabled = true;
-			}
-		}
-
-		// disable tabs
-		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
-			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
-				$( li )
-					.addClass( "ui-state-disabled" )
-					.attr( "aria-disabled", "true" );
-			} else {
-				$( li )
-					.removeClass( "ui-state-disabled" )
-					.removeAttr( "aria-disabled" );
-			}
-		}
-
-		this.options.disabled = disabled;
-	},
-
-	_setupEvents: function( event ) {
-		var events = {
-			click: function( event ) {
-				event.preventDefault();
-			}
-		};
-		if ( event ) {
-			$.each( event.split(" "), function( index, eventName ) {
-				events[ eventName ] = "_eventHandler";
-			});
-		}
-
-		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
-		this._on( this.anchors, events );
-		this._on( this.tabs, { keydown: "_tabKeydown" } );
-		this._on( this.panels, { keydown: "_panelKeydown" } );
-
-		this._focusable( this.tabs );
-		this._hoverable( this.tabs );
-	},
-
-	_setupHeightStyle: function( heightStyle ) {
-		var maxHeight, overflow,
-			parent = this.element.parent();
-
-		if ( heightStyle === "fill" ) {
-			// IE 6 treats height like minHeight, so we need to turn off overflow
-			// in order to get a reliable height
-			// we use the minHeight support test because we assume that only
-			// browsers that don't support minHeight will treat height as minHeight
-			if ( !$.support.minHeight ) {
-				overflow = parent.css( "overflow" );
-				parent.css( "overflow", "hidden");
-			}
-			maxHeight = parent.height();
-			this.element.siblings( ":visible" ).each(function() {
-				var elem = $( this ),
-					position = elem.css( "position" );
-
-				if ( position === "absolute" || position === "fixed" ) {
-					return;
-				}
-				maxHeight -= elem.outerHeight( true );
-			});
-			if ( overflow ) {
-				parent.css( "overflow", overflow );
-			}
-
-			this.element.children().not( this.panels ).each(function() {
-				maxHeight -= $( this ).outerHeight( true );
-			});
-
-			this.panels.each(function() {
-				$( this ).height( Math.max( 0, maxHeight -
-					$( this ).innerHeight() + $( this ).height() ) );
-			})
-			.css( "overflow", "auto" );
-		} else if ( heightStyle === "auto" ) {
-			maxHeight = 0;
-			this.panels.each(function() {
-				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
-			}).height( maxHeight );
-		}
-	},
-
-	_eventHandler: function( event ) {
-		var options = this.options,
-			active = this.active,
-			anchor = $( event.currentTarget ),
-			tab = anchor.closest( "li" ),
-			clickedIsActive = tab[ 0 ] === active[ 0 ],
-			collapsing = clickedIsActive && options.collapsible,
-			toShow = collapsing ? $() : this._getPanelForTab( tab ),
-			toHide = !active.length ? $() : this._getPanelForTab( active ),
-			eventData = {
-				oldTab: active,
-				oldPanel: toHide,
-				newTab: collapsing ? $() : tab,
-				newPanel: toShow
-			};
-
-		event.preventDefault();
-
-		if ( tab.hasClass( "ui-state-disabled" ) ||
-				// tab is already loading
-				tab.hasClass( "ui-tabs-loading" ) ||
-				// can't switch durning an animation
-				this.running ||
-				// click on active header, but not collapsible
-				( clickedIsActive && !options.collapsible ) ||
-				// allow canceling activation
-				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
-			return;
-		}
-
-		options.active = collapsing ? false : this.tabs.index( tab );
-
-		this.active = clickedIsActive ? $() : tab;
-		if ( this.xhr ) {
-			this.xhr.abort();
-		}
-
-		if ( !toHide.length && !toShow.length ) {
-			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
-		}
-
-		if ( toShow.length ) {
-			this.load( this.tabs.index( tab ), event );
-		}
-		this._toggle( event, eventData );
-	},
-
-	// handles show/hide for selecting tabs
-	_toggle: function( event, eventData ) {
-		var that = this,
-			toShow = eventData.newPanel,
-			toHide = eventData.oldPanel;
-
-		this.running = true;
-
-		function complete() {
-			that.running = false;
-			that._trigger( "activate", event, eventData );
-		}
-
-		function show() {
-			eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
-
-			if ( toShow.length && that.options.show ) {
-				that._show( toShow, that.options.show, complete );
-			} else {
-				toShow.show();
-				complete();
-			}
-		}
-
-		// start out by hiding, then showing, then completing
-		if ( toHide.length && this.options.hide ) {
-			this._hide( toHide, this.options.hide, function() {
-				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
-				show();
-			});
-		} else {
-			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
-			toHide.hide();
-			show();
-		}
-
-		toHide.attr({
-			"aria-expanded": "false",
-			"aria-hidden": "true"
-		});
-		eventData.oldTab.attr( "aria-selected", "false" );
-		// If we're switching tabs, remove the old tab from the tab order.
-		// If we're opening from collapsed state, remove the previous tab from the tab order.
-		// If we're collapsing, then keep the collapsing tab in the tab order.
-		if ( toShow.length && toHide.length ) {
-			eventData.oldTab.attr( "tabIndex", -1 );
-		} else if ( toShow.length ) {
-			this.tabs.filter(function() {
-				return $( this ).attr( "tabIndex" ) === 0;
-			})
-			.attr( "tabIndex", -1 );
-		}
-
-		toShow.attr({
-			"aria-expanded": "true",
-			"aria-hidden": "false"
-		});
-		eventData.newTab.attr({
-			"aria-selected": "true",
-			tabIndex: 0
-		});
-	},
-
-	_activate: function( index ) {
-		var anchor,
-			active = this._findActive( index );
-
-		// trying to activate the already active panel
-		if ( active[ 0 ] === this.active[ 0 ] ) {
-			return;
-		}
-
-		// trying to collapse, simulate a click on the current active header
-		if ( !active.length ) {
-			active = this.active;
-		}
-
-		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
-		this._eventHandler({
-			target: anchor,
-			currentTarget: anchor,
-			preventDefault: $.noop
-		});
-	},
-
-	_findActive: function( index ) {
-		return index === false ? $() : this.tabs.eq( index );
-	},
-
-	_getIndex: function( index ) {
-		// meta-function to give users option to provide a href string instead of a numerical index.
-		if ( typeof index === "string" ) {
-			index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
-		}
-
-		return index;
-	},
-
-	_destroy: function() {
-		if ( this.xhr ) {
-			this.xhr.abort();
-		}
-
-		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
-
-		this.tablist
-			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
-			.removeAttr( "role" );
-
-		this.anchors
-			.removeClass( "ui-tabs-anchor" )
-			.removeAttr( "role" )
-			.removeAttr( "tabIndex" )
-			.removeData( "href.tabs" )
-			.removeData( "load.tabs" )
-			.removeUniqueId();
-
-		this.tabs.add( this.panels ).each(function() {
-			if ( $.data( this, "ui-tabs-destroy" ) ) {
-				$( this ).remove();
-			} else {
-				$( this )
-					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
-						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
-					.removeAttr( "tabIndex" )
-					.removeAttr( "aria-live" )
-					.removeAttr( "aria-busy" )
-					.removeAttr( "aria-selected" )
-					.removeAttr( "aria-labelledby" )
-					.removeAttr( "aria-hidden" )
-					.removeAttr( "aria-expanded" )
-					.removeAttr( "role" );
-			}
-		});
-
-		this.tabs.each(function() {
-			var li = $( this ),
-				prev = li.data( "ui-tabs-aria-controls" );
-			if ( prev ) {
-				li.attr( "aria-controls", prev );
-			} else {
-				li.removeAttr( "aria-controls" );
-			}
-		});
-
-		this.panels.show();
-
-		if ( this.options.heightStyle !== "content" ) {
-			this.panels.css( "height", "" );
-		}
-	},
-
-	enable: function( index ) {
-		var disabled = this.options.disabled;
-		if ( disabled === false ) {
-			return;
-		}
-
-		if ( index === undefined ) {
-			disabled = false;
-		} else {
-			index = this._getIndex( index );
-			if ( $.isArray( disabled ) ) {
-				disabled = $.map( disabled, function( num ) {
-					return num !== index ? num : null;
-				});
-			} else {
-				disabled = $.map( this.tabs, function( li, num ) {
-					return num !== index ? num : null;
-				});
-			}
-		}
-		this._setupDisabled( disabled );
-	},
-
-	disable: function( index ) {
-		var disabled = this.options.disabled;
-		if ( disabled === true ) {
-			return;
-		}
-
-		if ( index === undefined ) {
-			disabled = true;
-		} else {
-			index = this._getIndex( index );
-			if ( $.inArray( index, disabled ) !== -1 ) {
-				return;
-			}
-			if ( $.isArray( disabled ) ) {
-				disabled = $.merge( [ index ], disabled ).sort();
-			} else {
-				disabled = [ index ];
-			}
-		}
-		this._setupDisabled( disabled );
-	},
-
-	load: function( index, event ) {
-		index = this._getIndex( index );
-		var that = this,
-			tab = this.tabs.eq( index ),
-			anchor = tab.find( ".ui-tabs-anchor" ),
-			panel = this._getPanelForTab( tab ),
-			eventData = {
-				tab: tab,
-				panel: panel
-			};
-
-		// not remote
-		if ( isLocal( anchor[ 0 ] ) ) {
-			return;
-		}
-
-		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
-
-		// support: jQuery <1.8
-		// jQuery <1.8 returns false if the request is canceled in beforeSend,
-		// but as of 1.8, $.ajax() always returns a jqXHR object.
-		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
-			tab.addClass( "ui-tabs-loading" );
-			panel.attr( "aria-busy", "true" );
-
-			this.xhr
-				.success(function( response ) {
-					// support: jQuery <1.8
-					// http://bugs.jquery.com/ticket/11778
-					setTimeout(function() {
-						panel.html( response );
-						that._trigger( "load", event, eventData );
-					}, 1 );
-				})
-				.complete(function( jqXHR, status ) {
-					// support: jQuery <1.8
-					// http://bugs.jquery.com/ticket/11778
-					setTimeout(function() {
-						if ( status === "abort" ) {
-							that.panels.stop( false, true );
-						}
-
-						tab.removeClass( "ui-tabs-loading" );
-						panel.removeAttr( "aria-busy" );
-
-						if ( jqXHR === that.xhr ) {
-							delete that.xhr;
-						}
-					}, 1 );
-				});
-		}
-	},
-
-	// TODO: Remove this function in 1.10 when ajaxOptions is removed
-	_ajaxSettings: function( anchor, event, eventData ) {
-		var that = this;
-		return {
-			url: anchor.attr( "href" ),
-			beforeSend: function( jqXHR, settings ) {
-				return that._trigger( "beforeLoad", event,
-					$.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
-			}
-		};
-	},
-
-	_getPanelForTab: function( tab ) {
-		var id = $( tab ).attr( "aria-controls" );
-		return this.element.find( this._sanitizeSelector( "#" + id ) );
-	}
-});
-
-// DEPRECATED
-if ( $.uiBackCompat !== false ) {
-
-	// helper method for a lot of the back compat extensions
-	$.ui.tabs.prototype._ui = function( tab, panel ) {
-		return {
-			tab: tab,
-			panel: panel,
-			index: this.anchors.index( tab )
-		};
-	};
-
-	// url method
-	$.widget( "ui.tabs", $.ui.tabs, {
-		url: function( index, url ) {
-			this.anchors.eq( index ).attr( "href", url );
-		}
-	});
-
-	// TODO: Remove _ajaxSettings() method when removing this extension
-	// ajaxOptions and cache options
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			ajaxOptions: null,
-			cache: false
-		},
-
-		_create: function() {
-			this._super();
-
-			var that = this;
-
-			this._on({ tabsbeforeload: function( event, ui ) {
-				// tab is already cached
-				if ( $.data( ui.tab[ 0 ], "cache.tabs" ) ) {
-					event.preventDefault();
-					return;
-				}
-
-				ui.jqXHR.success(function() {
-					if ( that.options.cache ) {
-						$.data( ui.tab[ 0 ], "cache.tabs", true );
-					}
-				});
-			}});
-		},
-
-		_ajaxSettings: function( anchor, event, ui ) {
-			var ajaxOptions = this.options.ajaxOptions;
-			return $.extend( {}, ajaxOptions, {
-				error: function( xhr, status ) {
-					try {
-						// Passing index avoid a race condition when this method is
-						// called after the user has selected another tab.
-						// Pass the anchor that initiated this request allows
-						// loadError to manipulate the tab content panel via $(a.hash)
-						ajaxOptions.error(
-							xhr, status, ui.tab.closest( "li" ).index(), ui.tab[ 0 ] );
-					}
-					catch ( error ) {}
-				}
-			}, this._superApply( arguments ) );
-		},
-
-		_setOption: function( key, value ) {
-			// reset cache if switching from cached to not cached
-			if ( key === "cache" && value === false ) {
-				this.anchors.removeData( "cache.tabs" );
-			}
-			this._super( key, value );
-		},
-
-		_destroy: function() {
-			this.anchors.removeData( "cache.tabs" );
-			this._super();
-		},
-
-		url: function( index ){
-			this.anchors.eq( index ).removeData( "cache.tabs" );
-			this._superApply( arguments );
-		}
-	});
-
-	// abort method
-	$.widget( "ui.tabs", $.ui.tabs, {
-		abort: function() {
-			if ( this.xhr ) {
-				this.xhr.abort();
-			}
-		}
-	});
-
-	// spinner
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			spinner: "<em>Loading&#8230;</em>"
-		},
-		_create: function() {
-			this._super();
-			this._on({
-				tabsbeforeload: function( event, ui ) {
-					// Don't react to nested tabs or tabs that don't use a spinner
-					if ( event.target !== this.element[ 0 ] ||
-							!this.options.spinner ) {
-						return;
-					}
-
-					var span = ui.tab.find( "span" ),
-						html = span.html();
-					span.html( this.options.spinner );
-					ui.jqXHR.complete(function() {
-						span.html( html );
-					});
-				}
-			});
-		}
-	});
-
-	// enable/disable events
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			enable: null,
-			disable: null
-		},
-
-		enable: function( index ) {
-			var options = this.options,
-				trigger;
-
-			if ( index && options.disabled === true ||
-					( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) !== -1 ) ) {
-				trigger = true;
-			}
-
-			this._superApply( arguments );
-
-			if ( trigger ) {
-				this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-			}
-		},
-
-		disable: function( index ) {
-			var options = this.options,
-				trigger;
-
-			if ( index && options.disabled === false ||
-					( $.isArray( options.disabled ) && $.inArray( index, options.disabled ) === -1 ) ) {
-				trigger = true;
-			}
-
-			this._superApply( arguments );
-
-			if ( trigger ) {
-				this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-			}
-		}
-	});
-
-	// add/remove methods and events
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			add: null,
-			remove: null,
-			tabTemplate: "<li><a href='#{href}'><span>#{label}</span></a></li>"
-		},
-
-		add: function( url, label, index ) {
-			if ( index === undefined ) {
-				index = this.anchors.length;
-			}
-
-			var doInsertAfter, panel,
-				options = this.options,
-				li = $( options.tabTemplate
-					.replace( /#\{href\}/g, url )
-					.replace( /#\{label\}/g, label ) ),
-				id = !url.indexOf( "#" ) ?
-					url.replace( "#", "" ) :
-					this._tabId( li );
-
-			li.addClass( "ui-state-default ui-corner-top" ).data( "ui-tabs-destroy", true );
-			li.attr( "aria-controls", id );
-
-			doInsertAfter = index >= this.tabs.length;
-
-			// try to find an existing element before creating a new one
-			panel = this.element.find( "#" + id );
-			if ( !panel.length ) {
-				panel = this._createPanel( id );
-				if ( doInsertAfter ) {
-					if ( index > 0 ) {
-						panel.insertAfter( this.panels.eq( -1 ) );
-					} else {
-						panel.appendTo( this.element );
-					}
-				} else {
-					panel.insertBefore( this.panels[ index ] );
-				}
-			}
-			panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ).hide();
-
-			if ( doInsertAfter ) {
-				li.appendTo( this.tablist );
-			} else {
-				li.insertBefore( this.tabs[ index ] );
-			}
-
-			options.disabled = $.map( options.disabled, function( n ) {
-				return n >= index ? ++n : n;
-			});
-
-			this.refresh();
-			if ( this.tabs.length === 1 && options.active === false ) {
-				this.option( "active", 0 );
-			}
-
-			this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) );
-			return this;
-		},
-
-		remove: function( index ) {
-			index = this._getIndex( index );
-			var options = this.options,
-				tab = this.tabs.eq( index ).remove(),
-				panel = this._getPanelForTab( tab ).remove();
-
-			// If selected tab was removed focus tab to the right or
-			// in case the last tab was removed the tab to the left.
-			// We check for more than 2 tabs, because if there are only 2,
-			// then when we remove this tab, there will only be one tab left
-			// so we don't need to detect which tab to activate.
-			if ( tab.hasClass( "ui-tabs-active" ) && this.anchors.length > 2 ) {
-				this._activate( index + ( index + 1 < this.anchors.length ? 1 : -1 ) );
-			}
-
-			options.disabled = $.map(
-				$.grep( options.disabled, function( n ) {
-					return n !== index;
-				}),
-				function( n ) {
-					return n >= index ? --n : n;
-				});
-
-			this.refresh();
-
-			this._trigger( "remove", null, this._ui( tab.find( "a" )[ 0 ], panel[ 0 ] ) );
-			return this;
-		}
-	});
-
-	// length method
-	$.widget( "ui.tabs", $.ui.tabs, {
-		length: function() {
-			return this.anchors.length;
-		}
-	});
-
-	// panel ids (idPrefix option + title attribute)
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			idPrefix: "ui-tabs-"
-		},
-
-		_tabId: function( tab ) {
-			var a = tab.is( "li" ) ? tab.find( "a[href]" ) : tab;
-			a = a[0];
-			return $( a ).closest( "li" ).attr( "aria-controls" ) ||
-				a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF\-]/g, "" ) ||
-				this.options.idPrefix + getNextTabId();
-		}
-	});
-
-	// _createPanel method
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			panelTemplate: "<div></div>"
-		},
-
-		_createPanel: function( id ) {
-			return $( this.options.panelTemplate )
-				.attr( "id", id )
-				.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
-				.data( "ui-tabs-destroy", true );
-		}
-	});
-
-	// selected option
-	$.widget( "ui.tabs", $.ui.tabs, {
-		_create: function() {
-			var options = this.options;
-			if ( options.active === null && options.selected !== undefined ) {
-				options.active = options.selected === -1 ? false : options.selected;
-			}
-			this._super();
-			options.selected = options.active;
-			if ( options.selected === false ) {
-				options.selected = -1;
-			}
-		},
-
-		_setOption: function( key, value ) {
-			if ( key !== "selected" ) {
-				return this._super( key, value );
-			}
-
-			var options = this.options;
-			this._super( "active", value === -1 ? false : value );
-			options.selected = options.active;
-			if ( options.selected === false ) {
-				options.selected = -1;
-			}
-		},
-
-		_eventHandler: function() {
-			this._superApply( arguments );
-			this.options.selected = this.options.active;
-			if ( this.options.selected === false ) {
-				this.options.selected = -1;
-			}
-		}
-	});
-
-	// show and select event
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			show: null,
-			select: null
-		},
-		_create: function() {
-			this._super();
-			if ( this.options.active !== false ) {
-				this._trigger( "show", null, this._ui(
-					this.active.find( ".ui-tabs-anchor" )[ 0 ],
-					this._getPanelForTab( this.active )[ 0 ] ) );
-			}
-		},
-		_trigger: function( type, event, data ) {
-			var tab, panel,
-				ret = this._superApply( arguments );
-
-			if ( !ret ) {
-				return false;
-			}
-
-			if ( type === "beforeActivate" ) {
-				tab = data.newTab.length ? data.newTab : data.oldTab;
-				panel = data.newPanel.length ? data.newPanel : data.oldPanel;
-				ret = this._super( "select", event, {
-					tab: tab.find( ".ui-tabs-anchor" )[ 0],
-					panel: panel[ 0 ],
-					index: tab.closest( "li" ).index()
-				});
-			} else if ( type === "activate" && data.newTab.length ) {
-				ret = this._super( "show", event, {
-					tab: data.newTab.find( ".ui-tabs-anchor" )[ 0 ],
-					panel: data.newPanel[ 0 ],
-					index: data.newTab.closest( "li" ).index()
-				});
-			}
-			return ret;
-		}
-	});
-
-	// select method
-	$.widget( "ui.tabs", $.ui.tabs, {
-		select: function( index ) {
-			index = this._getIndex( index );
-			if ( index === -1 ) {
-				if ( this.options.collapsible && this.options.selected !== -1 ) {
-					index = this.options.selected;
-				} else {
-					return;
-				}
-			}
-			this.anchors.eq( index ).trigger( this.options.event + this.eventNamespace );
-		}
-	});
-
-	// cookie option
-	(function() {
-
-	var listId = 0;
-
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			cookie: null // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true }
-		},
-		_create: function() {
-			var options = this.options,
-				active;
-			if ( options.active == null && options.cookie ) {
-				active = parseInt( this._cookie(), 10 );
-				if ( active === -1 ) {
-					active = false;
-				}
-				options.active = active;
-			}
-			this._super();
-		},
-		_cookie: function( active ) {
-			var cookie = [ this.cookie ||
-				( this.cookie = this.options.cookie.name || "ui-tabs-" + (++listId) ) ];
-			if ( arguments.length ) {
-				cookie.push( active === false ? -1 : active );
-				cookie.push( this.options.cookie );
-			}
-			return $.cookie.apply( null, cookie );
-		},
-		_refresh: function() {
-			this._super();
-			if ( this.options.cookie ) {
-				this._cookie( this.options.active, this.options.cookie );
-			}
-		},
-		_eventHandler: function() {
-			this._superApply( arguments );
-			if ( this.options.cookie ) {
-				this._cookie( this.options.active, this.options.cookie );
-			}
-		},
-		_destroy: function() {
-			this._super();
-			if ( this.options.cookie ) {
-				this._cookie( null, this.options.cookie );
-			}
-		}
-	});
-
-	})();
-
-	// load event
-	$.widget( "ui.tabs", $.ui.tabs, {
-		_trigger: function( type, event, data ) {
-			var _data = $.extend( {}, data );
-			if ( type === "load" ) {
-				_data.panel = _data.panel[ 0 ];
-				_data.tab = _data.tab.find( ".ui-tabs-anchor" )[ 0 ];
-			}
-			return this._super( type, event, _data );
-		}
-	});
-
-	// fx option
-	// The new animation options (show, hide) conflict with the old show callback.
-	// The old fx option wins over show/hide anyway (always favor back-compat).
-	// If a user wants to use the new animation API, they must give up the old API.
-	$.widget( "ui.tabs", $.ui.tabs, {
-		options: {
-			fx: null // e.g. { height: "toggle", opacity: "toggle", duration: 200 }
-		},
-
-		_getFx: function() {
-			var hide, show,
-				fx = this.options.fx;
-
-			if ( fx ) {
-				if ( $.isArray( fx ) ) {
-					hide = fx[ 0 ];
-					show = fx[ 1 ];
-				} else {
-					hide = show = fx;
-				}
-			}
-
-			return fx ? { show: show, hide: hide } : null;
-		},
-
-		_toggle: function( event, eventData ) {
-			var that = this,
-				toShow = eventData.newPanel,
-				toHide = eventData.oldPanel,
-				fx = this._getFx();
-
-			if ( !fx ) {
-				return this._super( event, eventData );
-			}
-
-			that.running = true;
-
-			function complete() {
-				that.running = false;
-				that._trigger( "activate", event, eventData );
-			}
-
-			function show() {
-				eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
-
-				if ( toShow.length && fx.show ) {
-					toShow
-						.animate( fx.show, fx.show.duration, function() {
-							complete();
-						});
-				} else {
-					toShow.show();
-					complete();
-				}
-			}
-
-			// start out by hiding, then showing, then completing
-			if ( toHide.length && fx.hide ) {
-				toHide.animate( fx.hide, fx.hide.duration, function() {
-					eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
-					show();
-				});
-			} else {
-				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
-				toHide.hide();
-				show();
-			}
-		}
-	});
-}
-
-})( jQuery );
-
-(function( $ ) {
-
-var increments = 0;
-
-function addDescribedBy( elem, id ) {
-	var describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ );
-	describedby.push( id );
-	elem
-		.data( "ui-tooltip-id", id )
-		.attr( "aria-describedby", $.trim( describedby.join( " " ) ) );
-}
-
-function removeDescribedBy( elem ) {
-	var id = elem.data( "ui-tooltip-id" ),
-		describedby = (elem.attr( "aria-describedby" ) || "").split( /\s+/ ),
-		index = $.inArray( id, describedby );
-	if ( index !== -1 ) {
-		describedby.splice( index, 1 );
-	}
-
-	elem.removeData( "ui-tooltip-id" );
-	describedby = $.trim( describedby.join( " " ) );
-	if ( describedby ) {
-		elem.attr( "aria-describedby", describedby );
-	} else {
-		elem.removeAttr( "aria-describedby" );
-	}
-}
-
-$.widget( "ui.tooltip", {
-	version: "1.9.2",
-	options: {
-		content: function() {
-			return $( this ).attr( "title" );
-		},
-		hide: true,
-		// Disabled elements have inconsistent behavior across browsers (#8661)
-		items: "[title]:not([disabled])",
-		position: {
-			my: "left top+15",
-			at: "left bottom",
-			collision: "flipfit flip"
-		},
-		show: true,
-		tooltipClass: null,
-		track: false,
-
-		// callbacks
-		close: null,
-		open: null
-	},
-
-	_create: function() {
-		this._on({
-			mouseover: "open",
-			focusin: "open"
-		});
-
-		// IDs of generated tooltips, needed for destroy
-		this.tooltips = {};
-		// IDs of parent tooltips where we removed the title attribute
-		this.parents = {};
-
-		if ( this.options.disabled ) {
-			this._disable();
-		}
-	},
-
-	_setOption: function( key, value ) {
-		var that = this;
-
-		if ( key === "disabled" ) {
-			this[ value ? "_disable" : "_enable" ]();
-			this.options[ key ] = value;
-			// disable element style changes
-			return;
-		}
-
-		this._super( key, value );
-
-		if ( key === "content" ) {
-			$.each( this.tooltips, function( id, element ) {
-				that._updateContent( element );
-			});
-		}
-	},
-
-	_disable: function() {
-		var that = this;
-
-		// close open tooltips
-		$.each( this.tooltips, function( id, element ) {
-			var event = $.Event( "blur" );
-			event.target = event.currentTarget = element[0];
-			that.close( event, true );
-		});
-
-		// remove title attributes to prevent native tooltips
-		this.element.find( this.options.items ).andSelf().each(function() {
-			var element = $( this );
-			if ( element.is( "[title]" ) ) {
-				element
-					.data( "ui-tooltip-title", element.attr( "title" ) )
-					.attr( "title", "" );
-			}
-		});
-	},
-
-	_enable: function() {
-		// restore title attributes
-		this.element.find( this.options.items ).andSelf().each(function() {
-			var element = $( this );
-			if ( element.data( "ui-tooltip-title" ) ) {
-				element.attr( "title", element.data( "ui-tooltip-title" ) );
-			}
-		});
-	},
-
-	open: function( event ) {
-		var that = this,
-			target = $( event ? event.target : this.element )
-				// we need closest here due to mouseover bubbling,
-				// but always pointing at the same event target
-				.closest( this.options.items );
-
-		// No element to show a tooltip for or the tooltip is already open
-		if ( !target.length || target.data( "ui-tooltip-id" ) ) {
-			return;
-		}
-
-		if ( target.attr( "title" ) ) {
-			target.data( "ui-tooltip-title", target.attr( "title" ) );
-		}
-
-		target.data( "ui-tooltip-open", true );
-
-		// kill parent tooltips, custom or native, for hover
-		if ( event && event.type === "mouseover" ) {
-			target.parents().each(function() {
-				var parent = $( this ),
-					blurEvent;
-				if ( parent.data( "ui-tooltip-open" ) ) {
-					blurEvent = $.Event( "blur" );
-					blurEvent.target = blurEvent.currentTarget = this;
-					that.close( blurEvent, true );
-				}
-				if ( parent.attr( "title" ) ) {
-					parent.uniqueId();
-					that.parents[ this.id ] = {
-						element: this,
-						title: parent.attr( "title" )
-					};
-					parent.attr( "title", "" );
-				}
-			});
-		}
-
-		this._updateContent( target, event );
-	},
-
-	_updateContent: function( target, event ) {
-		var content,
-			contentOption = this.options.content,
-			that = this,
-			eventType = event ? event.type : null;
-
-		if ( typeof contentOption === "string" ) {
-			return this._open( event, target, contentOption );
-		}
-
-		content = contentOption.call( target[0], function( response ) {
-			// ignore async response if tooltip was closed already
-			if ( !target.data( "ui-tooltip-open" ) ) {
-				return;
-			}
-			// IE may instantly serve a cached response for ajax requests
-			// delay this call to _open so the other call to _open runs first
-			that._delay(function() {
-				// jQuery creates a special event for focusin when it doesn't
-				// exist natively. To improve performance, the native event
-				// object is reused and the type is changed. Therefore, we can't
-				// rely on the type being correct after the event finished
-				// bubbling, so we set it back to the previous value. (#8740)
-				if ( event ) {
-					event.type = eventType;
-				}
-				this._open( event, target, response );
-			});
-		});
-		if ( content ) {
-			this._open( event, target, content );
-		}
-	},
-
-	_open: function( event, target, content ) {
-		var tooltip, events, delayedShow,
-			positionOption = $.extend( {}, this.options.position );
-
-		if ( !content ) {
-			return;
-		}
-
-		// Content can be updated multiple times. If the tooltip already
-		// exists, then just update the content and bail.
-		tooltip = this._find( target );
-		if ( tooltip.length ) {
-			tooltip.find( ".ui-tooltip-content" ).html( content );
-			return;
-		}
-
-		// if we have a title, clear it to prevent the native tooltip
-		// we have to check first to avoid defining a title if none exists
-		// (we don't want to cause an element to start matching [title])
-		//
-		// We use removeAttr only for key events, to allow IE to export the correct
-		// accessible attributes. For mouse events, set to empty string to avoid
-		// native tooltip showing up (happens only when removing inside mouseover).
-		if ( target.is( "[title]" ) ) {
-			if ( event && event.type === "mouseover" ) {
-				target.attr( "title", "" );
-			} else {
-				target.removeAttr( "title" );
-			}
-		}
-
-		tooltip = this._tooltip( target );
-		addDescribedBy( target, tooltip.attr( "id" ) );
-		tooltip.find( ".ui-tooltip-content" ).html( content );
-
-		function position( event ) {
-			positionOption.of = event;
-			if ( tooltip.is( ":hidden" ) ) {
-				return;
-			}
-			tooltip.position( positionOption );
-		}
-		if ( this.options.track && event && /^mouse/.test( event.type ) ) {
-			this._on( this.document, {
-				mousemove: position
-			});
-			// trigger once to override element-relative positioning
-			position( event );
-		} else {
-			tooltip.position( $.extend({
-				of: target
-			}, this.options.position ) );
-		}
-
-		tooltip.hide();
-
-		this._show( tooltip, this.options.show );
-		// Handle tracking tooltips that are shown with a delay (#8644). As soon
-		// as the tooltip is visible, position the tooltip using the most recent
-		// event.
-		if ( this.options.show && this.options.show.delay ) {
-			delayedShow = setInterval(function() {
-				if ( tooltip.is( ":visible" ) ) {
-					position( positionOption.of );
-					clearInterval( delayedShow );
-				}
-			}, $.fx.interval );
-		}
-
-		this._trigger( "open", event, { tooltip: tooltip } );
-
-		events = {
-			keyup: function( event ) {
-				if ( event.keyCode === $.ui.keyCode.ESCAPE ) {
-					var fakeEvent = $.Event(event);
-					fakeEvent.currentTarget = target[0];
-					this.close( fakeEvent, true );
-				}
-			},
-			remove: function() {
-				this._removeTooltip( tooltip );
-			}
-		};
-		if ( !event || event.type === "mouseover" ) {
-			events.mouseleave = "close";
-		}
-		if ( !event || event.type === "focusin" ) {
-			events.focusout = "close";
-		}
-		this._on( true, target, events );
-	},
-
-	close: function( event ) {
-		var that = this,
-			target = $( event ? event.currentTarget : this.element ),
-			tooltip = this._find( target );
-
-		// disabling closes the tooltip, so we need to track when we're closing
-		// to avoid an infinite loop in case the tooltip becomes disabled on close
-		if ( this.closing ) {
-			return;
-		}
-
-		// only set title if we had one before (see comment in _open())
-		if ( target.data( "ui-tooltip-title" ) ) {
-			target.attr( "title", target.data( "ui-tooltip-title" ) );
-		}
-
-		removeDescribedBy( target );
-
-		tooltip.stop( true );
-		this._hide( tooltip, this.options.hide, function() {
-			that._removeTooltip( $( this ) );
-		});
-
-		target.removeData( "ui-tooltip-open" );
-		this._off( target, "mouseleave focusout keyup" );
-		// Remove 'remove' binding only on delegated targets
-		if ( target[0] !== this.element[0] ) {
-			this._off( target, "remove" );
-		}
-		this._off( this.document, "mousemove" );
-
-		if ( event && event.type === "mouseleave" ) {
-			$.each( this.parents, function( id, parent ) {
-				$( parent.element ).attr( "title", parent.title );
-				delete that.parents[ id ];
-			});
-		}
-
-		this.closing = true;
-		this._trigger( "close", event, { tooltip: tooltip } );
-		this.closing = false;
-	},
-
-	_tooltip: function( element ) {
-		var id = "ui-tooltip-" + increments++,
-			tooltip = $( "<div>" )
-				.attr({
-					id: id,
-					role: "tooltip"
-				})
-				.addClass( "ui-tooltip ui-widget ui-corner-all ui-widget-content " +
-					( this.options.tooltipClass || "" ) );
-		$( "<div>" )
-			.addClass( "ui-tooltip-content" )
-			.appendTo( tooltip );
-		tooltip.appendTo( this.document[0].body );
-		if ( $.fn.bgiframe ) {
-			tooltip.bgiframe();
-		}
-		this.tooltips[ id ] = element;
-		return tooltip;
-	},
-
-	_find: function( target ) {
-		var id = target.data( "ui-tooltip-id" );
-		return id ? $( "#" + id ) : $();
-	},
-
-	_removeTooltip: function( tooltip ) {
-		tooltip.remove();
-		delete this.tooltips[ tooltip.attr( "id" ) ];
-	},
-
-	_destroy: function() {
-		var that = this;
-
-		// close open tooltips
-		$.each( this.tooltips, function( id, element ) {
-			// Delegate to close method to handle common cleanup
-			var event = $.Event( "blur" );
-			event.target = event.currentTarget = element[0];
-			that.close( event, true );
-
-			// Remove immediately; destroying an open tooltip doesn't use the
-			// hide animation
-			$( "#" + id ).remove();
-
-			// Restore the title
-			if ( element.data( "ui-tooltip-title" ) ) {
-				element.attr( "title", element.data( "ui-tooltip-title" ) );
-				element.removeData( "ui-tooltip-title" );
-			}
-		});
-	}
-});
-
-}( jQuery ) );
diff --git a/unittests/example_labfolder_data/static/js/labfolder-global.js b/unittests/example_labfolder_data/static/js/labfolder-global.js
deleted file mode 100644
index 0e69b6a2..00000000
--- a/unittests/example_labfolder_data/static/js/labfolder-global.js
+++ /dev/null
@@ -1,81 +0,0 @@
-$(document).ready(function(){	
-	Global.init();
-});
-
-var Global = {
-
-	init: function(){
-		var globalData 	= $("#global_data");
-
-		// firstLogin
-		this.firstLogin							= (globalData.attr("data-firstlogin") == "true") ? true : false;
-		
-		// currentUser
-		this.userShowHiddenItems				= (globalData.attr("data-user-show-hidden-items") == "true") ? true : false;
-		this.userId								= globalData.attr("data-user-id");
-		this.userProfilePictureHash				= globalData.attr("data-user-profilePictureHash");
-		this.userFirstName						= globalData.attr("data-user-firstName");
-		this.userLastName						= globalData.attr("data-user-lastName");
-		this.userProfileComplete				= (globalData.attr("data-user-profileComplete") == "true") ? true : false;
-		this.orderASC							= (globalData.attr("data-user-orderASC") == "true" ) ? true : false;
-
-		// currentProject
-		this.projectId 							= globalData.attr("data-project-id");
-		this.projectIsTemplate 					= (globalData.attr("data-project-is-template") == "true") ? true : false;
-		this.projectIsHidden 					= (globalData.attr("data-project-is-hidden") == "true") ? true : false;
-
-		// currentGroup
-		this.groupId 							= globalData.attr("data-group-id");
-		this.groupType 							= globalData.attr("data-group-type");
-		this.groupSettingsPreventDeleteProject 	= (globalData.attr("data-group-settings-prevent-delete-project") == "true") ? true : false;
-
-		// currentGroupMemberAdminLevels
-		this.groupMemberAdminLevels 			= [];
-		var groupMemberAdminLevelsStr = globalData.attr("data-group-member-admin-levels");
-		if(groupMemberAdminLevelsStr) {
-			var arr = groupMemberAdminLevelsStr.split(",");
-			for(var i=0; i<arr.length; i++) {
-				var trimmed = $.trim(arr[i]);
-				if(trimmed != "") {
-					this.groupMemberAdminLevels.push(trimmed);
-				}
-			}
-		}
-		
-		this.installedApps 			= [];
-		var installedAppsStr = globalData.attr("data-installed-apps");
-		if(installedAppsStr) {
-			var arr = installedAppsStr.split(",");
-			for(var i=0; i<arr.length; i++) {
-				var trimmed = $.trim(arr[i]);
-				if(trimmed != "") {
-					this.installedApps.push(trimmed);
-				}
-			}
-		}
-		
-		this.buildNumber = globalData.attr("data-build-number");
-
-		this.viewname = $("#data_element").attr("data-viewname");
-
-	},
-	
-	isGroupAdmin: function(subgroupId) {
-		for (var i = 0; i < this.groupMemberAdminLevels.length; i++) {
-			if(this.groupMemberAdminLevels[i] == subgroupId) {
-				return true;
-			}
-		}
-		return false;
-	},
-	
-	isAppInstalled: function(appKey) {
-		for (var i = 0; i < this.installedApps.length; i++) {
-			if(this.installedApps[i] == appKey) {
-				return true;
-			}
-		}
-		return false;
-	}
-	
-}
diff --git a/unittests/example_labfolder_data/static/js/tree.js b/unittests/example_labfolder_data/static/js/tree.js
deleted file mode 100644
index 180c8600..00000000
--- a/unittests/example_labfolder_data/static/js/tree.js
+++ /dev/null
@@ -1,505 +0,0 @@
-function initTreelineButtonsElnProjects(treeId) {
-	initTreelineMoreOptionsDeleteFolder(treeId, "/eln/workspace/{id}/isEmpty", "/eln/workspace/{id}/delete");
-}
-
-function initTreelineButtonsTextTemplates(treeId) {
-		initTreelineMoreOptionsDeleteFolder(treeId, "/eln/workspace/{id}/isEmpty", "/eln/workspace/{id}/delete");
-}
-
-var TreeElement = {
-
-		createNew: function(item, elType, group, callback) {
-
-			var saveCallback = 	function(formData) {
-				var formObj = convertFormArrayToObject(formData);
-				TreeElement.saveNew(item, elType, formObj, callback);
-			};
-
-			var isTemplate = (elType == "TEMPLATE");
-			var itemName = isTemplate ? "template" : "project";
-
-			var options = {
-					templateName: "jsTemplate_workspace_create_project_dialog",
-					treeId: "project_popup",
-					treeUrl: "/eln/workspace/treeInPopup",
-					template: isTemplate,
-					showTreeFoldersOnly: true,
-					treeFolderSelectable: true,
-					treeItemSelectable: false,
-					selectedTreelineCallback: function(formData){
-						saveCallback(formData);
-					}
-			};
-
-			if(item == "item"){
-				openSelectTreelineDialog("Create " + itemName, options);
-
-			}else if(item == "folder"){
-				options.templateName= "jsTemplate_workspace_create_folder_dialog";
-				openSelectTreelineDialog("Create folder", options);
-			}
-		},
-
-		saveNew: function(item, elType, formObj, fCallback){
-
-			var formData = {
-				name: formObj.name,
-				groupId: formObj.selectedTreelineGroupId,
-				parentId: formObj.selectedTreelineObjectId,
-				csrfToken: getCSRFToken(),
-				type: elType
-			};
-
-			var callback;
-
-			var postUrl;
-
-			if(item == "item"){
-
-				postUrl = "/eln/workspace/createProject";
-
-				callback = function(data, textStatus, jqXHR){
-
-					if(data.status == 0) {
-						if (data.dataObj.groupId > 0 && data.dataObj.shareable) {
-							Group.projects.shareEdit(data.dataObj.id, data.dataObj.groupId);
-
-						} else if(fCallback) {
-							fCallback(data);
-
-						} else {
-							Dialog.close();
-							location.reload(true);
-						}
-
-					} else {
-						Dialog.showError(data.errorMessageList);
-					}
-
-				}
-			}
-			else if(item == "folder"){
-
-				postUrl = "/eln/workspace/createFolder";
-
-				callback = function(data, textStatus, jqXHR){
-
-					if(data.status == 0) {
-
-						Dialog.close();
-
-						var itemName = (elType == "TEMPLATE") ? "templates" : "projects";
-
-						var targetFolder = $("#treeline_eln_" + itemName +"_" + formObj.selectedTreelineGroupId + "_" + formObj.selectedTreelineObjectId).next();
-
-						var shareSettings = "";
-						if(data.dataObj.shareable) {
-							shareSettings = "<div class='more_options_item buttonShareSettings'>" +
-											"<span aria-hidden='true' class='icon-conf'></span> Share settings" +
-											"</div>";
-						}
-
-						var newFolder =	$("<a id='treeline_eln_" + itemName + "_" + formObj.selectedTreelineGroupId + "_"
-										+ data.dataObj.id + "' data-groupid='" + formObj.selectedTreelineGroupId + "' "
-										+ "data-objectid='" + data.dataObj.id + "' class='treeline is_folder is_open_folder'>")
-										.append("<span class='updateTS'>"+ data.dataObj.createTS + "</span>")
-										.append("<div class='tree_button more_options in_tree'>"
-					+"<button class='more_options_button_tree'><span aria-hidden='true' class='wheel-img'></span></button>"
-					+"<div class='more_options_panel in_tree' style='display: none;'>"
-
-						+"<span class='menu_arrow-img'></span>"
-						+"<ul>"
-						+"<li class='more_options_item buttonRename'>Rename folder<span class='edit-img'></span></li>"
-						+"<li class='more_options_item treelineButtonDeleteFolder'>Delete folder<span class='trash_dark-img'></span></li>"
-						+"</ul>"
-						+"</div>"
-						+"</div>")
-										.append("<span class='folder_dn-img'></span>")
-										.append("<span class='name'> " + formObj.name + "</span>");
-
-						makeDroppable(newFolder);
-						makeDraggable(newFolder);
-
-						var newChildren = $("<div class='treeline_children'><div class='treeline_children_empty'>empty folder</div></div>");
-						newFolder.after(newChildren).hide();
-
-						targetFolder.append(newFolder).children(".treeline_children_empty").slideUp(300,function(){
-							this.remove();
-						});
-
-						newFolder.eq(0).css("background", "rgb(236, 240, 243)");
-
-						newFolder.show(300, function() {
-							$(newFolder.parents(".treeline_children").siblings(".is_folder")).each(function(){
-								openTreelineFolder($(this));
-							});
-							newFolder.eq(0).css("overflow", "visible");
-							setTimeout(function(){
-									// TODO we should have exactly 1 main element in all pages
-									// in all projects page we have #eln_main_content
-									// in group projects page we have #eln_project_content
-									$("#eln_main_content, #eln_project_content").animate({
-										scrollTop: $(newFolder).offset().top-200
-									}, 500);
-								},500);
-						});
-
-					} else {
-						Dialog.showError(data.errorMessageList);
-					}
-				}
-			}
-
-			$.post(postUrl, formData, function(data, textStatus, jqXHR){
-				callback(data, textStatus, jqXHR);
-			});
-
-		}
-}
-
-
-
-function initTreelineMoreOptionsDeleteFolder(treeId, isEmptyUrl, deleteUrl) {
-	$("body").on("click", ".treelineButtonDeleteFolder", function(){
-		var treeline = $(this).closest("a.treeline");
-		var objectId = treeline.attr("data-objectId");
-
-		var isEmptyUrlReplaced = isEmptyUrl.replace("{id}", objectId);
-		$.get(isEmptyUrlReplaced, {}, function(data, textStatus, jqXHR){
-			if(data.status == 0) {
-				if(data.dataObj == true) {
-
-					var templateData = { treeline_name: treeline.find("span.name").text() };
-					var content = $.jsTemplate("jsTemplate_basic_delete_folder_dialog", templateData);
-
-					var confirmButtonCallback = function() {
-						var deleteUrlReplaced = deleteUrl.replace("{id}", objectId);
-						$.post(deleteUrlReplaced, {csrfToken: getCSRFToken()}, function(data, textStatus, jqXHR){
-							if(data.status == 0) {
-								var parentLine = treeline.parent();
-								treeline.next().andSelf().slideUp(300, function(){
-									this.remove();
-									if(parentLine.children().length == 0){
-										var emptyChildren = $("<div class='treeline_children_empty' style='display:none'>empty folder</div>");
-										parentLine.append(emptyChildren);
-										emptyChildren.slideDown(300);
-									}
-								});
-								Dialog.close();
-							} else {
-								Dialog.showError(data.errorMessageList);
-							}
-						});
-					};
-					Dialog.confirm("Delete folder", content, {text: "Delete", callback: confirmButtonCallback});
-
-				} else {
-					Dialog.alert("Delete folder");
-					Dialog.showError("This folder is not empty. Please delete all of its content first, then you can delete the folder itself");
-				}
-			} else {
-				return ;
-			}
-		});
-
-		$(".more_options_panel").hide();
-		return false;
-	});
-}
-
-
-function selectTreeline(treeId, groupId, objectId) {
-	$("#tree_" + treeId + " input[name=selectedTreelineGroupId]").val(groupId);
-	$("#tree_" + treeId + " input[name=selectedTreelineObjectId]").val(objectId);
-	$("#tree_" + treeId + " .treeline").removeClass("selected");
-	$("#treeline_" + treeId + "_" + groupId + "_" + objectId).addClass("selected");
-}
-
-
-
-function openSelectTreelineDialog(dialogTitle, options) {
-
-	var content = $.jsTemplate(options.templateName, null);
-
-	var confirmButtonCallback = function() {
-		var groupId = $("#tree_" + options.treeId + " input[name=selectedTreelineGroupId]").val();
-		var objectId = $("#tree_" + options.treeId + " input[name=selectedTreelineObjectId]").val();
-
-		if(groupId == "" || objectId == "") {
-			if(dialogTitle == "Use template"){
-
-				Dialog.showError("Please select a template that you would like to use");
-
-			} else if(dialogTitle == "Save as new template"){
-
-				Dialog.showError("Please select a template folder");
-
-			}else if(dialogTitle == "Create a new entry"){
-
-				setTimeout(function(){Dialog.showError("Please select a project");}, 300);
-			}
-
-		} else {
-			var formData = $("#my_popup_content form").serializeArray();
-			options.selectedTreelineCallback(formData);
-		}
-	};
-
-	var loadedCallback = function() {
-		$.get(options.treeUrl,
-				{
-					treeId: options.treeId,
-					template: options.template,
-					showTreeFoldersOnly: options.showTreeFoldersOnly,
-					treeFolderSelectable: options.treeFolderSelectable,
-					treeItemSelectable: options.treeItemSelectable
-				},
-				function(data, textStatus, jqXHR){
-					var selectTree = $(data);
-
-					$("#my_popup_content .spinner").fadeOut(300, function(){
-						$("#my_popup_content .treeInPopupContainer").html(selectTree).slideDown(300, function(){
-							var firstLine = $("#tree_project_popup a").first();
-							selectTreeline(options.treeId, firstLine.attr("data-groupid"), firstLine.attr("data-objectid"));
-							Dialog.center();
-							initTreelineFolders(options.treeId);
-						});
-					});
-				}
-		);
-
-		$("#my_popup_content input:first").focus();
-		$("#my_popup_content form").submit(function(){
-			confirmButtonCallback();
-			return false;
-		});
-
-	};
-
-	Dialog.confirm(dialogTitle, content, {text: dialogTitle, callback: confirmButtonCallback}, {}, {}, loadedCallback);
-}
-
-function moveProject(objectId, groupId, parentId){
-	$.post("/eln/workspace/" + objectId + "/move",
-			{
-				"csrfToken": getCSRFToken(),
-				"parentId": parentId
-			},
-			function(data){
-				if(data.status != 0) {
-					Dialog.showError(data.errorMessageList);
-				}
-			}
-	);
-}
-
-function bindTreeUI(){
-	//Hacky hack to fix jquery bug in 1.8.2 that adds overflow hidden when animating hide and show
-	$('body').on('mouseover', '.treeline, .treeline_children', function(){
-		if($(this).css('overflow') == "hidden" ) $(this).css("overflow", "visible");
-	});
-
-	var droppableScope = $("a.is_folder");
-	makeDroppable(droppableScope);
-
-	var draggableScope = $("a.is_folder, a.is_item").not($("[data-objectid='0']"));
-	makeDraggable(draggableScope);
-}
-
-function makeDroppable(elements){
-
-	elements.droppable({
-		accept: function(el){
-			if(el.hasClass("is_item")){
-				return (el.attr("data-groupid") == $(this).attr("data-groupid"));
-			}
-			else {
-				var notOwnChild = (el.next().find($(this)).length == 0);
-				if(el.hasClass("is_folder") && notOwnChild) return (el.attr("data-groupid") == $(this).attr("data-groupid"));
-			}
-		},
-		activeClass: "droppable_folder",
-		drop: function(event, ui){
-
-			var el = this;
-			var siblings = $(el).next().children("a");
-			var inserted = false;
-			var originSiblings = ui.draggable.siblings("a").length;
-			var parent = ui.draggable.parent();
-
-			for(var i = 0; i < siblings.length; i++){
-
-				if(ui.draggable.hasClass("is_item")){
-					if(siblings.eq(i).hasClass("is_folder")){
-				 		ui.draggable.hide(300,function(){
-				 			siblings.eq(i).before(ui.draggable.show(300));
-				 		});
-				 		inserted = true;
-				 		break;
-					} else if(siblings.eq(i).hasClass("is_item")){
-						if(ui.draggable.find("span.name").text().trim().toLowerCase() < siblings.eq(i).find("span.name").text().trim().toLowerCase()){
-					 		ui.draggable.hide(300,function(){
-					 			siblings.eq(i).before(ui.draggable.show(300));
-					 		});
-					 	inserted = true;
-					 	break;
-						}
-					}
-				} else if(ui.draggable.hasClass("is_folder")){
-					if(siblings.eq(i).hasClass("is_folder")){
-						if(ui.draggable.find("span.name").text().trim().toLowerCase() < siblings.eq(i).find("span.name").text().trim().toLowerCase()){
-					 		ui.draggable.next().andSelf().hide(300,function(){
-					 			siblings.eq(i).before(ui.draggable.next().andSelf());
-								if (ui.draggable.hasClass("is_open_folder")){
-									ui.draggable.next().andSelf().show(300);
-								}
-								else ui.draggable.show(300);
-					 		});
-					 	inserted = true;
-					 	break;
-						}
-					}
-				}
-			}
-
-			if(!inserted){
-				if(ui.draggable.hasClass("is_folder")){
-			 		ui.draggable.next().andSelf().hide(300,function(){
-			 			 $(el).next().append(ui.draggable.next().andSelf());
-			 			 if (ui.draggable.hasClass("is_open_folder")){
-			 				 ui.draggable.next().andSelf().show(300);
-			 			 }
-			 			 else ui.draggable.show(300);
-			 		});
-				}
-				else if(ui.draggable.hasClass("is_item")){
-			 		ui.draggable.hide(300,function(){
-			 			 $(el).next().append(ui.draggable.show(300));
-			 		});
-				}
-			}
-
-			if(originSiblings == 0){
-				parent.append("<div class='treeline_children_empty'>empty folder</div>");
-			}
-
-			$(el).next().children(".treeline_children_empty").hide("fast", function(){
-				$(this).remove();
-			});
-
-			var objectId = ui.draggable.attr("data-objectid");
-			var groupId = ui.draggable.attr("data-groupid");
-			var parentId = $(el).attr("data-objectid");
-
-			moveProject(objectId, groupId, parentId);
-
-		},
-		hoverClass: "hover_droppable_folder"
-	});
-}
-
-function makeDraggable(elements){
-
-	elements.draggable({
-		appendTo: '.eln_scroll-y',
-		cursorAt: { bottom: 15, left: 45 },
-		distance: 25,
-		revert: "invalid",
-		revertDuration: 200,
-		helper: function(){
-			var helper = $(this).clone();
-			helper.addClass("dragging_helper").css({
-				"height": "auto",
-				"line-height": "0",
-				"color": "#69bfee"
-			}).find(".tree_button, span.updateTS").remove();
-			return helper;
-		},
-		drag: function(event, ui){
-			$(this).css("z-index", 20);
-		},
-		stop: function(event, ui){
-
-			$(this).next().andSelf().css({
-				'position': 'relative',
-	            'top': '',
-	            'left': '',
-	            'z-index': ''
-	        });
-
-			$(this).next().css('position', '');
-
-			$(".hover_droppable_folder").removeClass("hover_droppable_folder");
-		}
-	});
-}
-
-function getCookieNameForTree(el) {
-	var treeId = el.parents(".tree_top_level").attr("data-treeid");
-	return "tree_" + treeId + "_open_folders";
-}
-
-function initTreelineFolders(treeId) {
-	var cookieName = "tree_" + treeId + "_open_folders";
-	var curValue = getCookieValue(cookieName);
-	if(curValue) {
-		var arr = curValue.split(",");
-		for(var i=0; i<arr.length; i++) {
-			var treeNode = $("#treeline_" + treeId + "_" + arr[i] + ".is_closed_folder");
-			var treeNodeChildren = treeNode.next(".treeline_children");
-			treeNode.removeClass("is_closed_folder").addClass("is_open_folder");
-			treeNodeChildren.css("display", "block");
-		}
-	}
-
-	$("a.is_closed_folder").children("span.folder_dn-img").removeClass("folder_dn-img").addClass("folder_up-img");
-	$("a.is_open_folder").children("span.folder_up-img").removeClass("folder_up-img").addClass("folder_dn-img");
-}
-
-function openTreelineFolder(treeNode) {
-	var treelineId = treeNode.attr("data-groupId") + "_" + treeNode.attr("data-objectId");
-	var treeNodeChildren = treeNode.next();
-
-	if(treeNode.hasClass("is_closed_folder")){
-		treeNodeChildren.slideDown();
-		treeNode.removeClass("is_closed_folder").addClass("is_open_folder");
-		treeNode.find("span.icon-arrow_right").removeClass("icon-arrow_right").addClass("icon-arrow_down");
-	}
-}
-
-$(document).ready(function() {
-
-	if(Global.viewname == "WORKSPACE_INDEX") {
-		var treeId = "eln_projects";
-		initTreelineFolders(treeId);
-		initTreelineButtonsElnProjects(treeId);
-		bindTreeUI();
-	} else if(Global.viewname == "TEMPLATE_INDEX") {
-		var treeId = "eln_templates";
-		initTreelineFolders(treeId);
-		initTreelineButtonsTextTemplates(treeId);
-		bindTreeUI();
-	}
-
-	$("body").on("click", "a.is_folder", function(event){
-
-		if($(event.target).hasClass("icon-conf_drop") || $(event.target).hasClass("default_button")) {
-			return;
-		}
-
-		var treeNode = $(this);
-		var treeNodeChildren = treeNode.next();
-
-		if(treeNode.hasClass("is_closed_folder")) {
-			treeNodeChildren.slideDown();
-			treeNode.removeClass("is_closed_folder").addClass("is_open_folder");
-			treeNode.find("span.folder_up-img").removeClass("folder_up-img").addClass("folder_dn-img");
-		} else {
-			treeNodeChildren.slideUp();
-			treeNode.removeClass("is_open_folder").addClass("is_closed_folder");
-			treeNode.find("span.folder_dn-img").removeClass("folder_dn-img").addClass("folder_up-img");
-		}
-	});
-
-});
-
diff --git a/unittests/example_labfolder_data/templates.html b/unittests/example_labfolder_data/templates.html
deleted file mode 100644
index 34037cc3..00000000
--- a/unittests/example_labfolder_data/templates.html
+++ /dev/null
@@ -1,135 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-	<meta name="apple-mobile-web-app-capable" content="yes">
-	<meta name="apple-mobile-web-app-status-bar-style"
-		  content="black-translucent">
-	<meta name="viewport" content="width=device-width, initial-scale=1.0">
-	<title>Templates</title>
-	<link rel="shortcut icon" type="image/x-icon"
-		  href="static/img/favicon2.ico" />
-
-	<script
-			src="static/js/jquery-1.8.2.min.js"
-			type="text/javascript"></script>
-
-	<script src="static/js/tree.js"
-			type="text/javascript"></script>
-
-	<!-- This must be the first labfolder JS file included -->
-	<script
-			src="static/js/labfolder-global.js?13fcc6eeb30608bb104f4b234c2fa3fd86699ffe"
-			type="text/javascript"></script>
-
-	<link rel="stylesheet" type="text/css"
-		  href="static/css/eln_layout.css" />
-
-	<link rel="stylesheet" type="text/css"
-		  href="static/css/pixel_icon.css" />
-
-	<link rel="stylesheet" type="text/css"
-		  href="static/css/tree.css" />
-
-	<link rel="stylesheet" type="text/css"
-		  href="static/css/notebook.css" />
-
-</head>
-<body>
-<div class="body_bg"></div>
-<div class="eln_header eln_row">
-	<div class="headerbar_top">
-		<a href="/eln/"><span class="logo-img"></span></a>
-		<header>
-			<span aria-hidden="true" class="manage_s-img"></span> Templates
-		</header>
-		<nav>
-			<div class="nav_top">
-				<ul>
-					<li><a href="projects.html">
-						<button class="header_btn ">
-							<span class="desk-img"></span>
-							<p>Projects</p>
-						</button>
-					</a></li>
-				</ul>
-			</div>
-		</nav>
-	</div>
-
-</div>
-<div class="action_bar clearfix"></div>
-<div id="data_element" data-viewname="WORKSPACE_INDEX"></div>
-<div id="eln_main_content"
-	 class="eln_main_content eln_row eln_scroll-y">
-	<div class="eln_main_content_box templates-list">
-        <div class="headers">
-            <div class="owner">Owner</div>
-            <div class="update">Last Modified</div>
-            <div class="created">Created</div>
-        </div>
-        <div class="tree_my_eln_projects tree_top_level" data-treeid="eln_projects">
-    <a id="treeline_eln_projects_0_0"
-       data-groupid="0"
-       data-objectid="0"
-       data-ownerid="{{ownerId}}"
-       class="treeline is_folder ui-droppable is_closed_folder">
-        <span class="updateTS"></span>
-        <span class="folder_up-img"></span>
-        <span class="name">My private templates</span>
-        <span class="details">
-            <span class="box-owner">
-    <label>Owner:</label>
-    
-    
-</span>
-<span class="box-last-update">
-    <label>Last update:</label>
-    
-</span>
-
-		</span>
-    </a>
-    <div class="treeline_children"style="overflow: hidden; display: none;"><a id="treeline_eln_projects"  data-id="118219"  data-parentId="0"  data-userId="30003"  data-groupId="0"  data-name="template2"  data-folder="false"  data-template="true"  data-createTS="22.10.2019 15:54"  data-hidden="false"  data-shareable="false"  data-owner-profilePictureHash="null"  data-owner-tutorial="1"  data-owner-zoneId="Europe/Berlin"  data-owner-id="30003"  data-owner-firstname="max"  data-owner-lastname="muster"  data-owner-email="max.muster@posteo.de"  data-numberOfBlocks="1"  data-lastEditedTS="22.10.2019 16:45"  data-adminUserIds="[]"  data-adminOrOwner="true"  class="treeline is_item ui-draggable" href="./templates/My private templates_0/118219_template2/index.html">
-    <span class="updateTS">22.10.2019 15:54</span>
-    <span class="project_s-img"></span>
-    <span class="name">template2</span>
-    <span class="details">
-            <span class="box-owner">
-    <label>Owner:</label>
-    max
-    muster
-</span>
-<span class="box-last-update">
-    <label>Last update:</label>
-    22.10.2019 16:45
-</span>
-
-    </span>
-</a>
-<div class="treeline_children"style="overflow: hidden; display: none;"></div>
-<a id="treeline_eln_projects"  data-id="118218"  data-parentId="0"  data-userId="30003"  data-groupId="0"  data-name="test_template"  data-folder="false"  data-template="true"  data-createTS="22.10.2019 15:54"  data-hidden="false"  data-shareable="false"  data-owner-profilePictureHash="null"  data-owner-tutorial="1"  data-owner-zoneId="Europe/Berlin"  data-owner-id="30003"  data-owner-firstname="max"  data-owner-lastname="muster"  data-owner-email="max.muster@posteo.de"  data-numberOfBlocks="1"  data-lastEditedTS="22.10.2019 16:47"  data-adminUserIds="[]"  data-adminOrOwner="true"  class="treeline is_item ui-draggable" href="./templates/My private templates_0/118218_test_template/index.html">
-    <span class="updateTS">22.10.2019 15:54</span>
-    <span class="project_s-img"></span>
-    <span class="name">test_template</span>
-    <span class="details">
-            <span class="box-owner">
-    <label>Owner:</label>
-    max
-    muster
-</span>
-<span class="box-last-update">
-    <label>Last update:</label>
-    22.10.2019 16:47
-</span>
-
-    </span>
-</a>
-<div class="treeline_children"style="overflow: hidden; display: none;"></div>
-</div>
-</div>
-
-    </div>
-</div>
-</body>
-</html>
diff --git a/unittests/example_labfolder_data/templates/My private templates_0/118218_test_template/index.html b/unittests/example_labfolder_data/templates/My private templates_0/118218_test_template/index.html
deleted file mode 100644
index 0fb347c6..00000000
--- a/unittests/example_labfolder_data/templates/My private templates_0/118218_test_template/index.html	
+++ /dev/null
@@ -1,437 +0,0 @@
-<html>
-<head>
-	<style type="text/css">
-		@charset "UTF-8";
-		[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak, .ng-hide:not(.ng-hide-animate) {
-			display: none !important;
-		}
-
-		ng\:form {
-			display: block;
-		}
-	</style>
-
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-	<meta name="apple-mobile-web-app-capable" content="yes">
-	<meta name="apple-mobile-web-app-status-bar-style"
-		  content="black-translucent">
-	<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-
-	<title>Notebook</title>
-
-
-	<link rel="shortcut icon" type="image/x-icon"
-		  href="../../../static/img/favicon2.ico">
-
-	<script src="../../../static/js/jquery-1.8.2.min.js"
-			type="text/javascript"></script>
-	<style type="text/css"></style>
-
-
-	<!-- This must be the first labfolder JS file included -->
-	<script
-			src="../../../static/js/labfolder-global.js?no-build-number"
-			type="text/javascript"></script>
-
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/export-table-element.css">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/jquery-ui.css">
-
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/data-elements.css?no-build-number">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/combined.css?no-build-number">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/export-entry-footer.css">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/redactor.css"/>
-
-	<script type="text/javascript">
-        function getTemplateText(className) {
-            return $("#jsTemplate_jsText").find(".jstext_" + className).text();
-        }
-
-        $(document).ready(function () {
-            // expand tags and custom dates container on hover
-            $(".entry_menu_less").hover(
-                function () {
-                    if (!$(this).children(":first").hasClass("entry_name_menu")) {
-                        $(this).addClass('entry_menu_more');
-                        $(this).children(":first").addClass('show_list_more');
-                        if ($(this).children(":first").hasClass("entry_tags")) {
-                            $(".entry_tags").css("height", "auto");
-                        }
-                    }
-                },
-                function () {
-                    if (!$(this).children(":first").hasClass("entry_name_menu")) {
-                        $(this).removeClass('entry_menu_more');
-                        $(this).children(":first").removeClass('show_list_more');
-                        if ($(this).children(":first").hasClass("entry_tags")) {
-                            $(".entry_tags").css("height", "100%");
-                        }
-                    }
-                }
-            );
-
-            //selects the table sheet according to click
-            $(".sheet_tab").click(function () {
-                if ($(this).hasClass('selected') === false) {
-                    var previous = $(this).siblings(".selected");
-                    var previousElementId = previous.data("elementid");
-                    var previousSheetIndex = previous.data("sheetidx");
-                    previous.removeClass("selected");
-
-                    var targetElementId = $(this).data("elementid");
-                    var targetSheetIndex = $(this).data("sheetidx");
-                    $(this).addClass("selected");
-
-                    $("#table_" + targetElementId + "_" + targetSheetIndex).css("display", "block");
-                    $("#table_" + previousElementId + "_" + previousSheetIndex).css("display", "none");
-                }
-            });
-        });
-	</script>
-
-	<script src="../../../static/js/jquery-ui.js"
-			type="text/javascript"></script>
-</head>
-
-<body>
-<div class="body_bg"></div>
-<div id="global_data"></div>
-<div class="eln_header eln_row">
-	<div class="headerbar_top">
-		<a href="/eln/"><span class="logo-img"></span></a>
-		<header>
-			<span class="notebook_s-img"></span> Notebook
-		</header>
-		<nav>
-			<div class="nav_top">
-				<ul>
-					<li><a href="../../../projects.html">
-						<button class="header_btn ">
-							<span class="desk-img"></span>
-							<p>Projects</p>
-						</button>
-					</a></li>
-					<li><a href="../../../templates.html">
-						<button class="header_btn ">
-							<span class="desk-img"></span>
-							<p>Templates</p>
-						</button>
-					</a></li>
-				</ul>
-			</div>
-		</nav>
-	</div>
-
-
-</div>
-<div class="ng-scope">
-	<div class="action_bar clearfix ng-scope">
-		<div class="plus_btn_wrap">
-			<div class="plus_btn_hover">
-				<div class="add_dropdown more_options_menu" style="display: none;">
-					<ul>
-					</ul>
-				</div>
-			</div>
-		</div>
-		<div class="action_menu_wrap">
-			<div class="filter_wrap list_horizontal"></div>
-		</div>
-	</div>
-	<div id="eln_project_content"
-		 class="eln_project_content eln_row eln_scroll-y ng-scope"  data-id="118218"  data-parentId="0"  data-userId="30003"  data-groupId="0"  data-name="test_template"  data-folder="false"  data-template="true"  data-createTS="22.10.2019 15:54"  data-hidden="false"  data-shareable="false"  data-owner-profilePictureHash="null"  data-owner-tutorial="1"  data-owner-zoneId="Europe/Berlin"  data-owner-id="30003"  data-owner-firstname="max"  data-owner-lastname="muster"  data-owner-email="max.muster@posteo.de"  data-numberOfBlocks="1"  data-lastEditedTS="22.10.2019 16:47"  data-adminUserIds="[]"  data-adminOrOwner="true" >
-		<div id="epb_container"><div data-id="4625193"data-blockId="4624722"data-elnProjectId="118218"data-sourceId="0"data-userAction="2"data-groupId="0"data-hidden="false"data-readOnly="false"data-versionTS="22.10.2019 18:47"data-createTS="22.10.2019 17:54"data-signHash="null"data-signHashDescription=""data-signHashVersion="null"data-signTS="null"data-witnessTS="null"data-title="null"data-blockNumber="1"data-totalBlocksInProject="1"data-projectName="test_template"data-projectReferenceId="null"data-signBiometricsDocId="null"data-witnessBiometricsDocId="null"data-referenced="false">
-	<div class="epb_header_container">
-	<div class="epb_header clearfix" style="display: block;">
-
-		<div class="entry_container">
-			<header class="entry_header">
-				<div class="entry_author">
-					<figure>
-						<span class="avatar-img"></span>
-						<img ng-src="">
-					</figure>
-
-					<div class="author_name">
-						<div class="author_firstname ng-binding">max</div>
-						<div class="author_lastname ng-binding">muster</div>
-					</div>
-				</div>
-				<div class="entry_menu_less entry_title_wrap ng-scope">
-					<div class="entry_name_menu has_tooltip">
-						<ul>
-							<li>
-								<div style="display:none">Entry {{entryNumber}}/{{totalEntries}}:</div>
-								<div>Template:</div>
-							</li>
-							<li>
-								<div style="display:none" class="entry_title ng-binding">{{entryTitle}}</div>
-								<div>test_template</div>
-							</li>
-						</ul>
-					</div>
-					<div class="entry_menu_options">
-					</div>
-					<div class="entry_dropdown entry_name">
-						<div class="close_entry_menu">
-							<span class="cancel_entry_title close_box-img"></span>
-						</div>
-						<ul>
-							<li><label>Entry name</label> <input
-									class="entry_name_input ng-pristine ng-untouched ng-valid"
-									type="text" data-title="" value=""></li>
-							<li><label>located in project</label> <select
-									class="ng-pristine ng-untouched ng-valid">
-								<option
-										value="0">tableproject
-								</option>
-								<option value="1" selected="selected">a project</option>
-							</select></li>
-							<li>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown cancel_entry_title grey_link"
-										  ng-click="cancel()">cancel</span>
-									<button class="save_entry_title btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</li>
-						</ul>
-					</div>
-				</div>
-
-				<div class="entry_menus">
-					<ul>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryDateController">
-							<div class="entry_menu_list has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<ul>
-									<li><span>created:</span> <span class="ng-binding">22.10.2019 17:54</span>
-									</li>
-									<li><span>modified</span> <span class="ng-binding">22.10.2019 18:47</span>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li>
-    <span>todo</span>
-    <span class=\"ng-binding\">24.10.2019</span>
-</li>
-
-								</ul>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown"
-								 ng-mouseenter="activateElement($event)">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<ul class="entry_dates">
-									<li><label>Dates</label></li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="created" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.createTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="modified" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.versionTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li style="overflow: visible;">
-										<div class="date_key">
-
-											<div class="selectize-control single ng-valid"
-												 ng-keyup="updateInput($select.search)"
-												 reset-search-input="false" ng-model="dateKeyInput.selected"
-												 theme="selectize" style="min-width: 120px;">
-												<div class="selectize-input"
-													 ng-class="{'focus': $select.open, 'disabled': $select.disabled, 'selectize-focus' : $select.focus}"
-													 ng-click="$select.activate()">
-													<div
-															ng-hide="$select.searchEnabled &amp;&amp; ($select.open || $select.isEmpty())"
-															class="ui-select-match ng-hide" ng-transclude=""
-															placeholder="Custom date"
-															ng-keydown="inputKeydown($event)">
-														<span class="ng-binding ng-scope"></span>
-													</div>
-													<input type="text" autocomplete="off" tabindex="-1"
-														   class="ui-select-search ui-select-toggle ng-pristine ng-untouched ng-valid"
-														   ng-click="$select.toggle($event)"
-														   placeholder="Custom date" ng-model="$select.search"
-														   ng-hide="!$select.searchEnabled || ($select.selected &amp;&amp; !$select.open)"
-														   ng-disabled="$select.disabled">
-												</div>
-												<div ng-show="$select.open"
-													 class="ui-select-choices selectize-dropdown single ng-scope ng-hide"
-													 repeat="date in availableDates | filter: $select.search">
-													<div
-															class="ui-select-choices-content selectize-dropdown-content">
-														<div class="ui-select-choices-group optgroup">
-															<div ng-show="$select.isGrouped"
-																 class="ui-select-choices-group-label optgroup-header ng-binding ng-hide"></div>
-															<!-- ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">due date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">my date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-														</div>
-													</div>
-												</div>
-												<input ng-disabled="$select.disabled"
-													   class="ui-select-focusser ui-select-offscreen ng-scope"
-													   type="text" aria-haspopup="true" role="button">
-											</div>
-										</div>
-
-										<div class="date_value">
-											<input type="text"
-												   class="entry_datepicker date_input ng-pristine ng-untouched ng-valid"
-												   ng-model="dateValueInput" ng-keydown="inputKeydown($event)">
-										</div>
-									</li>
-								</ul>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-									<button class="btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</div>
-						</li>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryTagsController">
-							<div class="entry_tags has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<label>Create new tags by using commas</label>
-								<div class="token_input token_input_width"></div>
-								<div class="tags_input entry_tags_input" ng-click="focusInput()">
-
-									<!-- ngRepeat: tag in currentTokens -->
-
-									<textarea class="token_input ng-pristine ng-untouched ng-valid"
-											  ng-model="tagInput" ng-keydown="inputKeydown($event)"></textarea>
-								</div>
-
-								<!--											<div class="save_entry_menu">
-												<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-												<button class="btn_on_grey" ng-click='fromViewModel()'>fromViewModel</button>
-											</div> -->
-								<h3 class="all_tags">All tags</h3>
-								<div class="tag_data_wrap">
-									<div class="tag_register">
-										<ul>
-											<li>
-												<ul class="my_tags">
-													<!-- ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">demo</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">Entry</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">example</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-												</ul>
-											</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</li>
-						<li>
-							<div class="entry_options">
-								<ul>
-								</ul>
-							</div>
-						</li>
-					</ul>
-				</div>
-			</header>
-			<div class="entry_toolbar"></div>
-		</div>
-		<div class="clear"></div>
-	</div>
-</div>
-
-	<div class="epb_content_wrap">
-	<div class="epb_content_container">
-		<div class="hdrop ui-droppable"></div>
-		<div class="dd_entry_table">
-			<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content redactor_editor">
-	<p><p>Ein Text-Element.</p></p>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-
-		</div>
-	</div>
-</div>
-
-	
-</div></div>
-		<div id="epb_newer_blocks_panel"></div>
-	</div>
-</div>
-</body>
-</html>
diff --git a/unittests/example_labfolder_data/templates/My private templates_0/118219_template2/index.html b/unittests/example_labfolder_data/templates/My private templates_0/118219_template2/index.html
deleted file mode 100644
index c21b3c1f..00000000
--- a/unittests/example_labfolder_data/templates/My private templates_0/118219_template2/index.html	
+++ /dev/null
@@ -1,653 +0,0 @@
-<html>
-<head>
-	<style type="text/css">
-		@charset "UTF-8";
-		[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak, .ng-hide:not(.ng-hide-animate) {
-			display: none !important;
-		}
-
-		ng\:form {
-			display: block;
-		}
-	</style>
-
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-	<meta name="apple-mobile-web-app-capable" content="yes">
-	<meta name="apple-mobile-web-app-status-bar-style"
-		  content="black-translucent">
-	<meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-
-	<title>Notebook</title>
-
-
-	<link rel="shortcut icon" type="image/x-icon"
-		  href="../../../static/img/favicon2.ico">
-
-	<script src="../../../static/js/jquery-1.8.2.min.js"
-			type="text/javascript"></script>
-	<style type="text/css"></style>
-
-
-	<!-- This must be the first labfolder JS file included -->
-	<script
-			src="../../../static/js/labfolder-global.js?no-build-number"
-			type="text/javascript"></script>
-
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/export-table-element.css">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/jquery-ui.css">
-
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/data-elements.css?no-build-number">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/combined.css?no-build-number">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/export-entry-footer.css">
-	<link rel="stylesheet" type="text/css"
-		  href="../../../static/css/redactor.css"/>
-
-	<script type="text/javascript">
-        function getTemplateText(className) {
-            return $("#jsTemplate_jsText").find(".jstext_" + className).text();
-        }
-
-        $(document).ready(function () {
-            // expand tags and custom dates container on hover
-            $(".entry_menu_less").hover(
-                function () {
-                    if (!$(this).children(":first").hasClass("entry_name_menu")) {
-                        $(this).addClass('entry_menu_more');
-                        $(this).children(":first").addClass('show_list_more');
-                        if ($(this).children(":first").hasClass("entry_tags")) {
-                            $(".entry_tags").css("height", "auto");
-                        }
-                    }
-                },
-                function () {
-                    if (!$(this).children(":first").hasClass("entry_name_menu")) {
-                        $(this).removeClass('entry_menu_more');
-                        $(this).children(":first").removeClass('show_list_more');
-                        if ($(this).children(":first").hasClass("entry_tags")) {
-                            $(".entry_tags").css("height", "100%");
-                        }
-                    }
-                }
-            );
-
-            //selects the table sheet according to click
-            $(".sheet_tab").click(function () {
-                if ($(this).hasClass('selected') === false) {
-                    var previous = $(this).siblings(".selected");
-                    var previousElementId = previous.data("elementid");
-                    var previousSheetIndex = previous.data("sheetidx");
-                    previous.removeClass("selected");
-
-                    var targetElementId = $(this).data("elementid");
-                    var targetSheetIndex = $(this).data("sheetidx");
-                    $(this).addClass("selected");
-
-                    $("#table_" + targetElementId + "_" + targetSheetIndex).css("display", "block");
-                    $("#table_" + previousElementId + "_" + previousSheetIndex).css("display", "none");
-                }
-            });
-        });
-	</script>
-
-	<script src="../../../static/js/jquery-ui.js"
-			type="text/javascript"></script>
-</head>
-
-<body>
-<div class="body_bg"></div>
-<div id="global_data"></div>
-<div class="eln_header eln_row">
-	<div class="headerbar_top">
-		<a href="/eln/"><span class="logo-img"></span></a>
-		<header>
-			<span class="notebook_s-img"></span> Notebook
-		</header>
-		<nav>
-			<div class="nav_top">
-				<ul>
-					<li><a href="../../../projects.html">
-						<button class="header_btn ">
-							<span class="desk-img"></span>
-							<p>Projects</p>
-						</button>
-					</a></li>
-					<li><a href="../../../templates.html">
-						<button class="header_btn ">
-							<span class="desk-img"></span>
-							<p>Templates</p>
-						</button>
-					</a></li>
-				</ul>
-			</div>
-		</nav>
-	</div>
-
-
-</div>
-<div class="ng-scope">
-	<div class="action_bar clearfix ng-scope">
-		<div class="plus_btn_wrap">
-			<div class="plus_btn_hover">
-				<div class="add_dropdown more_options_menu" style="display: none;">
-					<ul>
-					</ul>
-				</div>
-			</div>
-		</div>
-		<div class="action_menu_wrap">
-			<div class="filter_wrap list_horizontal"></div>
-		</div>
-	</div>
-	<div id="eln_project_content"
-		 class="eln_project_content eln_row eln_scroll-y ng-scope"  data-id="118219"  data-parentId="0"  data-userId="30003"  data-groupId="0"  data-name="template2"  data-folder="false"  data-template="true"  data-createTS="22.10.2019 15:54"  data-hidden="false"  data-shareable="false"  data-owner-profilePictureHash="null"  data-owner-tutorial="1"  data-owner-zoneId="Europe/Berlin"  data-owner-id="30003"  data-owner-firstname="max"  data-owner-lastname="muster"  data-owner-email="max.muster@posteo.de"  data-numberOfBlocks="1"  data-lastEditedTS="22.10.2019 16:45"  data-adminUserIds="[]"  data-adminOrOwner="true" >
-		<div id="epb_container"><div data-id="4625184"data-blockId="4624724"data-elnProjectId="118219"data-sourceId="0"data-userAction="34"data-groupId="0"data-hidden="false"data-readOnly="false"data-versionTS="22.10.2019 18:45"data-createTS="22.10.2019 17:54"data-signHash="null"data-signHashDescription=""data-signHashVersion="null"data-signTS="null"data-witnessTS="null"data-title="null"data-blockNumber="1"data-totalBlocksInProject="1"data-projectName="template2"data-projectReferenceId="null"data-signBiometricsDocId="null"data-witnessBiometricsDocId="null"data-referenced="false">
-	<div class="epb_header_container">
-	<div class="epb_header clearfix" style="display: block;">
-
-		<div class="entry_container">
-			<header class="entry_header">
-				<div class="entry_author">
-					<figure>
-						<span class="avatar-img"></span>
-						<img ng-src="">
-					</figure>
-
-					<div class="author_name">
-						<div class="author_firstname ng-binding">max</div>
-						<div class="author_lastname ng-binding">muster</div>
-					</div>
-				</div>
-				<div class="entry_menu_less entry_title_wrap ng-scope">
-					<div class="entry_name_menu has_tooltip">
-						<ul>
-							<li>
-								<div style="display:none">Entry {{entryNumber}}/{{totalEntries}}:</div>
-								<div>Template:</div>
-							</li>
-							<li>
-								<div style="display:none" class="entry_title ng-binding">{{entryTitle}}</div>
-								<div>template2</div>
-							</li>
-						</ul>
-					</div>
-					<div class="entry_menu_options">
-					</div>
-					<div class="entry_dropdown entry_name">
-						<div class="close_entry_menu">
-							<span class="cancel_entry_title close_box-img"></span>
-						</div>
-						<ul>
-							<li><label>Entry name</label> <input
-									class="entry_name_input ng-pristine ng-untouched ng-valid"
-									type="text" data-title="" value=""></li>
-							<li><label>located in project</label> <select
-									class="ng-pristine ng-untouched ng-valid">
-								<option
-										value="0">tableproject
-								</option>
-								<option value="1" selected="selected">a project</option>
-							</select></li>
-							<li>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown cancel_entry_title grey_link"
-										  ng-click="cancel()">cancel</span>
-									<button class="save_entry_title btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</li>
-						</ul>
-					</div>
-				</div>
-
-				<div class="entry_menus">
-					<ul>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryDateController">
-							<div class="entry_menu_list has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<ul>
-									<li><span>created:</span> <span class="ng-binding">22.10.2019 17:54</span>
-									</li>
-									<li><span>modified</span> <span class="ng-binding">22.10.2019 18:45</span>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									
-								</ul>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown"
-								 ng-mouseenter="activateElement($event)">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<ul class="entry_dates">
-									<li><label>Dates</label></li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="created" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.createTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<li>
-										<div class="date_key">
-											<input type="text" value="modified" disabled="">
-										</div>
-										<div class="date_value">
-											<input type="text" ng-value="parseDate(entry.versionTS)"
-												   disabled="" value="18.02.2015">
-										</div>
-									</li>
-									<!-- ngRepeat: date in currentDates | orderBy:predicate -->
-									<li style="overflow: visible;">
-										<div class="date_key">
-
-											<div class="selectize-control single ng-valid"
-												 ng-keyup="updateInput($select.search)"
-												 reset-search-input="false" ng-model="dateKeyInput.selected"
-												 theme="selectize" style="min-width: 120px;">
-												<div class="selectize-input"
-													 ng-class="{'focus': $select.open, 'disabled': $select.disabled, 'selectize-focus' : $select.focus}"
-													 ng-click="$select.activate()">
-													<div
-															ng-hide="$select.searchEnabled &amp;&amp; ($select.open || $select.isEmpty())"
-															class="ui-select-match ng-hide" ng-transclude=""
-															placeholder="Custom date"
-															ng-keydown="inputKeydown($event)">
-														<span class="ng-binding ng-scope"></span>
-													</div>
-													<input type="text" autocomplete="off" tabindex="-1"
-														   class="ui-select-search ui-select-toggle ng-pristine ng-untouched ng-valid"
-														   ng-click="$select.toggle($event)"
-														   placeholder="Custom date" ng-model="$select.search"
-														   ng-hide="!$select.searchEnabled || ($select.selected &amp;&amp; !$select.open)"
-														   ng-disabled="$select.disabled">
-												</div>
-												<div ng-show="$select.open"
-													 class="ui-select-choices selectize-dropdown single ng-scope ng-hide"
-													 repeat="date in availableDates | filter: $select.search">
-													<div
-															class="ui-select-choices-content selectize-dropdown-content">
-														<div class="ui-select-choices-group optgroup">
-															<div ng-show="$select.isGrouped"
-																 class="ui-select-choices-group-label optgroup-header ng-binding ng-hide"></div>
-															<!-- ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">due date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-															<div class="ui-select-choices-row ng-scope"
-																 ng-class="{active: $select.isActive(this), disabled: $select.isDisabled(this)}"
-																 ng-repeat="date in $select.items"
-																 ng-mouseenter="$select.setActiveItem(date)"
-																 ng-click="$select.select(date)">
-																<div class="option ui-select-choices-row-inner"
-																	 data-selectable="" uis-transclude-append="">
-																	<span ng-bind-html="date | highlight: $select.search"
-																		  class="ng-binding ng-scope">my date</span>
-																</div>
-															</div>
-															<!-- end ngRepeat: date in $select.items -->
-														</div>
-													</div>
-												</div>
-												<input ng-disabled="$select.disabled"
-													   class="ui-select-focusser ui-select-offscreen ng-scope"
-													   type="text" aria-haspopup="true" role="button">
-											</div>
-										</div>
-
-										<div class="date_value">
-											<input type="text"
-												   class="entry_datepicker date_input ng-pristine ng-untouched ng-valid"
-												   ng-model="dateValueInput" ng-keydown="inputKeydown($event)">
-										</div>
-									</li>
-								</ul>
-								<div class="save_entry_menu">
-									<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-									<button class="btn_on_grey" ng-click="save()">save</button>
-								</div>
-							</div>
-						</li>
-						<li class="entry_menu_less ng-scope"
-							ng-controller="EntryTagsController">
-							<div class="entry_tags has_tooltip"
-								 ng-class="{true: '', false: 'has_tooltip'}[entry.readOnly]">
-								<i>No tags associated</i>
-							</div>
-							<div class="entry_menu_options">
-							</div>
-							<div class="entry_dropdown">
-								<div class="close_entry_menu">
-									<span class="close_box-img" ng-click="cancel()"></span>
-								</div>
-								<label>Create new tags by using commas</label>
-								<div class="token_input token_input_width"></div>
-								<div class="tags_input entry_tags_input" ng-click="focusInput()">
-
-									<!-- ngRepeat: tag in currentTokens -->
-
-									<textarea class="token_input ng-pristine ng-untouched ng-valid"
-											  ng-model="tagInput" ng-keydown="inputKeydown($event)"></textarea>
-								</div>
-
-								<!--											<div class="save_entry_menu">
-												<span class="cancel_dropdown grey_link" ng-click="cancel()">cancel</span>
-												<button class="btn_on_grey" ng-click='fromViewModel()'>fromViewModel</button>
-											</div> -->
-								<h3 class="all_tags">All tags</h3>
-								<div class="tag_data_wrap">
-									<div class="tag_register">
-										<ul>
-											<li>
-												<ul class="my_tags">
-													<!-- ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">demo</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">Entry</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-													<li
-															ng-repeat="token in filteredValues = (availableTokens | filter:tagInput)"
-															class="ng-scope"><span
-															class="existing_tag ng-binding"
-															ng-class="{disabled: added(token), selected_tag: inputSelected(token)}"
-															ng-click="add(token)">example</span></li>
-													<!-- end ngRepeat: token in filteredValues = (availableTokens | filter:tagInput) -->
-												</ul>
-											</li>
-										</ul>
-									</div>
-								</div>
-							</div>
-						</li>
-						<li>
-							<div class="entry_options">
-								<ul>
-								</ul>
-							</div>
-						</li>
-					</ul>
-				</div>
-			</header>
-			<div class="entry_toolbar"></div>
-		</div>
-		<div class="clear"></div>
-	</div>
-</div>
-
-	<div class="epb_content_wrap">
-	<div class="epb_content_container">
-		<div class="hdrop ui-droppable"></div>
-		<div class="dd_entry_table">
-			<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content redactor_editor">
-	<p><p>Text ist hier</p></p>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" >
-				<div class="button_wrapper"></div>
-				<div class="notebook-element-content data-elements-container data-elements">
-  <html><head></head><body><div class="data-element-wrap data-group-wrap">
-  <svg class="data-element-icon data-group-icon" viewbox="0 0 67 64">
-    <title>icon-vf-group-filled</title>
-    <path d="M32.119 39.613c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M0.952 39.019c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.275c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.138z"></path>
-    <path d="M29.502 36.996c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M49.487 11.063c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M19.39 10.587c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.427-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M46.87 8.565c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M66.498 40.327c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M35.331 39.851c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0 0 0 0 0 0 0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M64 37.71c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595c0 0 0 0 0 0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-  </svg>
-
-  <div class="data-group-content display-mode">
-    <div class="data-element-wrap data-group-header">
-      <div class="data-element-display data-group-display">
-        <span class="element-title">gruppe 1</span>
-      </div>
-    </div>
-
-    <div class="data-group-children">
-      <div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">foo</span>
-    <span class="element-quantity">: Angular Momentum: </span>
-    <span class="element-value ">20€ </span>
-    <span class="element-unit">kg/m<sup>2</sup> s<sup>-1</sup></span>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">bar</span>
-    <span class="element-quantity">: Fugacity: </span>
-    <span class="element-value ">12 </span>
-    <span class="element-unit">Pa</span>
-  </div>
-</div>
-
-    </div>
-  </div>
-</div>
-</body></html><html><head></head><body><div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title empty-value">⎵</span>
-    <span class="element-quantity">: Electric Displacement: </span>
-    <span class="element-value empty-value">⎵ </span>
-    <span class="element-unit">C/m<sup>2</sup></span>
-  </div>
-</div>
-</body></html><html><head></head><body><div class="data-element-wrap descriptive-element-wrap">
-  <svg class="data-element-icon descriptive-element-icon" viewbox="0 0 64 64">
-    <title>icon-dde</title>
-    <path d="M62.080 48.96h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.024-0.832-1.92-1.92-1.92z"></path>
-    <path d="M62.080 24.192h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-    <path d="M37.504 0h-35.584c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h35.584c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-  </svg>
-
-  <div class="data-element-display descriptive-element-display">
-    <span class="element-title">DE name: </span>
-    <span class="element-description ">fdgdfghgfdhgdfhh dfghdfghdfghfgh dfghdfgd</span>
-  </div>
-</div>
-</body></html><html><head></head><body><div class="data-element-wrap data-group-wrap">
-  <svg class="data-element-icon data-group-icon" viewbox="0 0 67 64">
-    <title>icon-vf-group-filled</title>
-    <path d="M32.119 39.613c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M0.952 39.019c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.275c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.138z"></path>
-    <path d="M29.502 36.996c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M49.487 11.063c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M19.39 10.587c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.427-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M46.87 8.565c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M66.498 40.327c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M35.331 39.851c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0 0 0 0 0 0 0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M64 37.71c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595c0 0 0 0 0 0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-  </svg>
-
-  <div class="data-group-content display-mode">
-    <div class="data-element-wrap data-group-header">
-      <div class="data-element-display data-group-display">
-        <span class="element-title">gruppe 2</span>
-      </div>
-    </div>
-
-    <div class="data-group-children">
-      <div class="data-element-wrap data-group-wrap">
-  <svg class="data-element-icon data-group-icon" viewbox="0 0 67 64">
-    <title>icon-vf-group-filled</title>
-    <path d="M32.119 39.613c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M0.952 39.019c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.275c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.138z"></path>
-    <path d="M29.502 36.996c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M49.487 11.063c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M19.39 10.587c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.427-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M46.87 8.565c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595v0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-    <path d="M66.498 40.327c0-0.238-0.119-0.476-0.357-0.595s-0.476-0.119-0.595 0l-12.372 7.138c-0.714 0.357-1.071 1.071-1.071 1.903v14.394c0 0.238 0.119 0.476 0.357 0.595s0.476 0.119 0.595 0l11.896-6.9c0.952-0.595 1.546-1.546 1.546-2.617v-13.918z"></path>
-    <path d="M35.331 39.851c-0.238-0.119-0.476-0.119-0.595 0-0.238 0.119-0.357 0.357-0.357 0.595v0 13.799c0 1.071 0.595 2.141 1.546 2.617l11.896 6.9c0 0 0 0 0 0 0.238 0.119 0.476 0.119 0.595 0 0.238-0.119 0.357-0.357 0.357-0.595v-14.394c0-0.714-0.357-1.428-1.071-1.903l-12.372-7.019z"></path>
-    <path d="M64 37.71c0.238-0.119 0.357-0.357 0.357-0.595s-0.119-0.476-0.357-0.595c0 0 0 0 0 0l-11.896-6.9c-0.952-0.595-2.141-0.595-3.093 0l-11.896 6.9c-0.238 0.119-0.357 0.357-0.357 0.595s0.119 0.476 0.357 0.595l12.372 7.138c0.714 0.357 1.428 0.357 2.141 0l12.372-7.138z"></path>
-  </svg>
-
-  <div class="data-group-content display-mode">
-    <div class="data-element-wrap data-group-header">
-      <div class="data-element-display data-group-display">
-        <span class="element-title">Untergruppe 2.1</span>
-      </div>
-    </div>
-
-    <div class="data-group-children">
-      <div class="data-element-wrap descriptive-element-wrap">
-  <svg class="data-element-icon descriptive-element-icon" viewbox="0 0 64 64">
-    <title>icon-dde</title>
-    <path d="M62.080 48.96h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.024-0.832-1.92-1.92-1.92z"></path>
-    <path d="M62.080 24.192h-60.16c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h60.16c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-    <path d="M37.504 0h-35.584c-1.088 0-1.92 0.832-1.92 1.92v11.2c0 1.088 0.832 1.92 1.92 1.92h35.584c1.088 0 1.92-0.832 1.92-1.92v-11.2c0-1.088-0.832-1.92-1.92-1.92z"></path>
-  </svg>
-
-  <div class="data-element-display descriptive-element-display">
-    <span class="element-title">DE name 2 (desc): </span>
-    <span class="element-description empty-value">⎵</span>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">DE 2.1.1</span>
-    <span class="element-quantity">: Amount of substance: </span>
-    <span class="element-value ">20 </span>
-    <span class="element-unit">mol</span>
-  </div>
-</div>
-
-    </div>
-  </div>
-</div>
-<div class="data-element-wrap single-element-wrap">
-  <svg class="data-element-icon single-element-icon" viewbox="0 0 67 64">
-    <title>icon-vf-filled</title>
-    <path d="M59.413 20.587c0-0.427-0.213-0.853-0.64-1.067-0.32-0.213-0.853-0.213-1.173 0l-22.827 13.227c-1.173 0.747-1.92 2.027-1.92 3.413v26.453c0 0.427 0.213 0.853 0.64 1.067 0.32 0.213 0.853 0.213 1.173 0l21.867-12.8c1.707-1.067 2.88-2.88 2.88-4.907v-25.387z"></path>
-    <path d="M2.027 19.52c-0.32-0.213-0.853-0.213-1.173 0s-0.64 0.64-0.64 1.067v0 25.387c0 2.027 1.067 3.947 2.88 4.907l21.973 12.693c0 0 0 0 0 0 0.32 0.213 0.853 0.213 1.173 0s0.64-0.64 0.64-1.067v-26.347c0-1.387-0.747-2.667-1.92-3.413l-22.933-13.227z"></path>
-    <path d="M54.72 15.787c0.32-0.213 0.64-0.64 0.64-1.067s-0.213-0.853-0.64-1.067c0 0 0 0 0 0l-22.080-12.587c-1.707-1.067-3.947-1.067-5.653 0l-21.973 12.693c-0.32 0.213-0.64 0.64-0.64 1.067s0.213 0.853 0.64 1.067l22.827 13.227c1.173 0.747 2.667 0.747 3.947 0l22.933-13.333z"></path>
-  </svg>
-
-  <div class="data-element-display single-element-display">
-    <span class="element-title ">DE 2.2</span>
-    <span class="element-quantity">: Capacitance: </span>
-    <span class="element-value ">876x876x87 </span>
-    <span class="element-unit">µF</span>
-  </div>
-</div>
-
-    </div>
-  </div>
-</div>
-</body></html>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-<div class="dd_entry_table">
-	<div class="dd_entry_row">
-		<div class="dd_entry_cell ui-draggable dd_text_entry">
-			<div class="dd_entry_cell_wrapper" {{elementMeta1}}>
-				<div class="button_wrapper"></div>
-				<div class="dd_entry_cell_content table-el-container">
-    <div>
-        <div class="table-el-info">
-            Your labfolder table is available for visualization as the following Excel file:
-        </div>
-        <div class="table-el-download">
-            <a href="labfolder_table_4625184_3.xlsx">
-                <svg class="table-el-icon" viewBox="0 0 475.1 402.5">
-                    <title>icon-table</title>
-                    <path d="M461.7,14C452.7,5,442,0.5,429.4,0.5H45.7C33.1,0.5,22.4,5,13.4,14C4.5,22.9,0,33.7,0,46.2v310.6   c0,12.6,4.5,23.3,13.4,32.3c8.9,8.9,19.7,13.4,32.3,13.4h383.7c12.6,0,23.3-4.5,32.3-13.4c8.9-9,13.4-19.7,13.4-32.3V46.2   C475.1,33.7,470.6,22.9,461.7,14z M146.2,356.9c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7c-2.7,0-4.9-0.9-6.6-2.6   c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6   L146.2,356.9L146.2,356.9z M146.2,247.2c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7c-2.7,0-4.9-0.9-6.6-2.6   c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L146.2,247.2L146.2,247.2z M146.2,137.6c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H45.7   c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6H137c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L146.2,137.6L146.2,137.6z M292.4,356.9c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6h-91.4   c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6   c1.7,1.7,2.6,3.9,2.6,6.6L292.4,356.9L292.4,356.9L292.4,356.9z M292.4,247.2c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6   h-91.4c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.9-4.9,2.6-6.6c1.7-1.7,3.9-2.6,6.6-2.6h91.4   c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6L292.4,247.2L292.4,247.2z M292.4,137.6c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6h-91.4c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.9-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6L292.4,137.6L292.4,137.6z M438.5,356.9   c0,2.7-0.9,4.9-2.6,6.6c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V302c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V356.9z M438.5,247.2c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6v-54.8c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V247.2z M438.5,137.6c0,2.7-0.9,4.9-2.6,6.6   c-1.7,1.7-3.9,2.6-6.6,2.6H338c-2.7,0-4.9-0.9-6.6-2.6c-1.7-1.7-2.6-3.9-2.6-6.6V82.8c0-2.7,0.8-4.9,2.6-6.6   c1.7-1.7,3.9-2.6,6.6-2.6h91.4c2.7,0,4.9,0.9,6.6,2.6c1.7,1.7,2.6,3.9,2.6,6.6V137.6z"/>
-                </svg>
-                <div class="table-el-filename">
-                    labfolder_table_4625184_3.xlsx
-                </div>
-            </a>
-        </div>
-    </div>
-</div>
-
-			</div>
-		</div>
-	</div>
-</div>
-
-		</div>
-	</div>
-</div>
-
-	
-</div></div>
-		<div id="epb_newer_blocks_panel"></div>
-	</div>
-</div>
-</body>
-</html>
diff --git a/unittests/example_labfolder_data/templates/My private templates_0/118219_template2/labfolder_table_4625184_3.xlsx b/unittests/example_labfolder_data/templates/My private templates_0/118219_template2/labfolder_table_4625184_3.xlsx
deleted file mode 100644
index 83d3d8119085d311ceb5a54e56c5363351aa1c0d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5564
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

-- 
GitLab


From a4b2148750132a6e0ca580fb18737538685b8f62 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Wed, 27 Nov 2024 14:51:39 +0100
Subject: [PATCH 065/106] DOC: CHANGELOG

---
 CHANGELOG.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index d070d8da..54b755a7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -27,7 +27,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 - Bloxberg code snippets. These were just a proof of concept, untested and never used in production.
 - Labfolder converter. It was broken anyway, not used by anyone we know and there were no automated
-  tests.  For the time being, it lives on in the `f-labfolder-converter` branch.
+  tests.  For the time being, it lives on in the `f-labfolder-converter` branch, [issue 67](https://gitlab.com/linkahead/linkahead-advanced-user-tools/-/issues/67) is
+  there to coordinate resurrections efforts if someone needs it..
 
 ### Fixed ###
 
-- 
GitLab


From ca946c6654d5b63ca3b2fd4cb776a9183d083701 Mon Sep 17 00:00:00 2001
From: Joscha Schmiedt <joscha@schmiedt.dev>
Date: Wed, 27 Nov 2024 22:26:43 +0100
Subject: [PATCH 066/106] Fix UpdateCache default file path on Windows

/tmp does not exist on Windows (issue #136)
---
 src/caosadvancedtools/cache.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/caosadvancedtools/cache.py b/src/caosadvancedtools/cache.py
index 749239fa..46564393 100644
--- a/src/caosadvancedtools/cache.py
+++ b/src/caosadvancedtools/cache.py
@@ -338,7 +338,7 @@ class UpdateCache(AbstractCache):
         return 3
 
     def get_default_file_name(self):
-        return "/tmp/crawler_update_cache.db"
+        return os.path.join(tempfile.gettempdir(), "crawler_update_cache.db")
 
     @staticmethod
     def get_previous_version(cont):
-- 
GitLab


From f54451c885aa1213510a96520612f21be66071a1 Mon Sep 17 00:00:00 2001
From: Joscha Schmiedt <joscha@schmiedt.dev>
Date: Wed, 27 Nov 2024 23:04:15 +0100
Subject: [PATCH 067/106] FIX: Make temporary paths Windows-compatible

---
 unittests/test_caosdbignore.py  |  2 +-
 unittests/test_suppressKnown.py | 11 +++++------
 unittests/test_utils.py         |  6 +++---
 3 files changed, 9 insertions(+), 10 deletions(-)

diff --git a/unittests/test_caosdbignore.py b/unittests/test_caosdbignore.py
index c044a8e8..39839db4 100644
--- a/unittests/test_caosdbignore.py
+++ b/unittests/test_caosdbignore.py
@@ -44,7 +44,7 @@ class Linkaheadignore(unittest.TestCase):
         assert len(files) == 3
         assert os.path.join(BASEDIR, "data", "datatypes.xlsx") in files
         assert os.path.join(BASEDIR, "data", "README.xlsx") in files
-        assert os.path.join(BASEDIR, "data", "Publications/Posters/2019-02-03_something/README.md") in files
+        assert os.path.join(BASEDIR, "data", "Publications", "Posters", "2019-02-03_something", "README.md") in files
 
     def test_regex(self):
         files = [r"/dies/ist/simple", r"/dies/eh(er)/nich?t"]
diff --git a/unittests/test_suppressKnown.py b/unittests/test_suppressKnown.py
index 6f87e842..d148a5a3 100644
--- a/unittests/test_suppressKnown.py
+++ b/unittests/test_suppressKnown.py
@@ -25,7 +25,7 @@
 import logging
 import os
 import unittest
-from tempfile import NamedTemporaryFile
+from tempfile import NamedTemporaryFile, gettempdir
 
 from caosadvancedtools.suppressKnown import SuppressKnown
 
@@ -40,7 +40,7 @@ class Record(object):
 
 class SupTestBasic(unittest.TestCase):
     def setUp(self):
-        self.db_file = "/tmp/test_suppress_msg_db_file.db"
+        self.db_file = os.path.join(gettempdir(), "test_suppress_msg_db_file_basic.db")
         self.basic = SuppressKnown(db_file=self.db_file)
 
     def test_msg(self):
@@ -52,12 +52,12 @@ class SupTestBasic(unittest.TestCase):
         self.basic.filter(r)
 
     def tearDown(self):
-        os.remove(self.db_file)
+        pass
 
 
 class SupTestAdvanced(SupTestBasic):
     def setUp(self):
-        self.db_file = "/tmp/test_suppress_msg_db_file.db"
+        self.db_file = os.path.join(gettempdir(), "test_suppress_msg_db_file_advanced.db")
         self.basic = SuppressKnown(db_file=self.db_file)
 
     def test_logger(self):
@@ -65,13 +65,12 @@ class SupTestAdvanced(SupTestBasic):
         The logging output is directed to a file which is then checked whether
         the output is as expected.
         """
-        logfile = NamedTemporaryFile()
+        logfile = NamedTemporaryFile(delete=False, mode="w")
         logger = logging.getLogger()
         logger.addHandler(logging.FileHandler(logfile.name))
         logger.setLevel(logging.DEBUG)
         sup = SuppressKnown(db_file=self.db_file)
         logger.addFilter(sup)
-
         logger.info("hi", extra={"identifier": "5", 'category': "test"})
         with open(logfile.name) as lf:
             log = lf.read()
diff --git a/unittests/test_utils.py b/unittests/test_utils.py
index 09688f97..c8134e3d 100644
--- a/unittests/test_utils.py
+++ b/unittests/test_utils.py
@@ -23,7 +23,7 @@
 import logging
 import unittest
 from tempfile import NamedTemporaryFile
-
+import os
 import linkahead as db
 from caosadvancedtools.utils import (check_win_path, get_referenced_files,
                                      string_to_person, create_entity_link)
@@ -47,7 +47,7 @@ class BaseMockUpTest(unittest.TestCase):
         connection._delegate_connection.resources.append(
             lambda **kwargs: MockUpResponse(200, {}, self.entities))
 
-        self.logfile = NamedTemporaryFile()
+        self.logfile = NamedTemporaryFile(delete=False)
         logger = logging.getLogger()
         logger.addHandler(logging.FileHandler(self.logfile.name))
         logger.setLevel(logging.DEBUG)
@@ -77,7 +77,7 @@ class ReferencesBaseTest(BaseMockUpTest):
         files = get_referenced_files("test.npy", prefix=None, filename=None,
                                      location=None)
         self.assertEqual(len(files), 1)
-        self.assertEqual(files[0].path, "/some/path/test.npy")
+        self.assertEqual(os.path.join(files[0].path, "some", "path", "test.npy"))
         log = self.get_log()
         assert "FIND file which" in log
         assert "does not allow a search" not in log
-- 
GitLab


From 779b38178ecb3b0cc4ff65188a5f44c37d9d9c9d Mon Sep 17 00:00:00 2001
From: Joscha Schmiedt <joscha@schmiedt.dev>
Date: Wed, 27 Nov 2024 23:04:33 +0100
Subject: [PATCH 068/106] TST: Skip sendmail test on Windows

---
 unittests/test_sss_helper.py | 5 +++--
 unittests/test_utils.py      | 2 +-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/unittests/test_sss_helper.py b/unittests/test_sss_helper.py
index c040f503..e1ce286d 100644
--- a/unittests/test_sss_helper.py
+++ b/unittests/test_sss_helper.py
@@ -2,7 +2,7 @@ import subprocess
 from email import message_from_file, policy
 from os import listdir, remove
 from os.path import abspath, dirname, exists, isfile, join
-
+import platform
 import linkahead as db
 from caosadvancedtools.serverside.helper import (NameCollector, get_data,
                                                  get_file_via_download,
@@ -85,7 +85,8 @@ def test_send_mail():
     assert msg["Subject"] == "the subject"
     assert msg.get_content() == "hello!\n"
 
-
+# skip on windows (has no sendmail)
+@mark.skipif(platform.system() == "Windows")
 def test_send_mail_error():
     with raises(subprocess.CalledProcessError):
         send_mail("me@example.com", "you@example.com", "the subject", "hello!",
diff --git a/unittests/test_utils.py b/unittests/test_utils.py
index c8134e3d..aeae08e4 100644
--- a/unittests/test_utils.py
+++ b/unittests/test_utils.py
@@ -77,7 +77,7 @@ class ReferencesBaseTest(BaseMockUpTest):
         files = get_referenced_files("test.npy", prefix=None, filename=None,
                                      location=None)
         self.assertEqual(len(files), 1)
-        self.assertEqual(os.path.join(files[0].path, "some", "path", "test.npy"))
+        self.assertEqual(files[0].path, "/some/path/test.npy")
         log = self.get_log()
         assert "FIND file which" in log
         assert "does not allow a search" not in log
-- 
GitLab


From a555600ff6852d54f3c82d71a0ee4accd3d04345 Mon Sep 17 00:00:00 2001
From: Joscha Schmiedt <joscha@schmiedt.dev>
Date: Wed, 27 Nov 2024 23:12:15 +0100
Subject: [PATCH 069/106] TST: Make dtype test more robust to default behavior
 changes

---
 unittests/test_table_importer.py | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/unittests/test_table_importer.py b/unittests/test_table_importer.py
index 0abc28bb..fc0d5f0e 100644
--- a/unittests/test_table_importer.py
+++ b/unittests/test_table_importer.py
@@ -196,8 +196,8 @@ class TableImporterTest(unittest.TestCase):
                            [5678, 1, 2.0, 3, 'yes']],
                           columns=['a', 'b', 'c', 'float', 'd'])
         # wrong datatypes before
-        assert df["a"].dtype == int
-        assert df["float"].dtype == int
+        assert df["a"].dtype !=  pd.StringDtype
+        assert df["float"].dtype != float
         # strict = False by default, so this shouldn't raise an error
         importer.check_datatype(df)
         # The types should be correct now.
-- 
GitLab


From 3e772c8eaca620749ac515eb02c5c97c6e49efb7 Mon Sep 17 00:00:00 2001
From: Joscha Schmiedt <joscha@schmiedt.dev>
Date: Wed, 27 Nov 2024 23:20:30 +0100
Subject: [PATCH 070/106] TST: Skip logger test on Windows

        # TODO: this test is problematic on Windows due to the file being locked
        #       by the logger. This is a known issue and should be fixed in the
        #       future.
        #       For now, the test is disabled on Windows.
        #       See https://docs.python.org/3/library/tempfile.html#tempfile.NamedTemporaryFile
---
 unittests/test_suppressKnown.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/unittests/test_suppressKnown.py b/unittests/test_suppressKnown.py
index d148a5a3..c3e65dbe 100644
--- a/unittests/test_suppressKnown.py
+++ b/unittests/test_suppressKnown.py
@@ -60,11 +60,17 @@ class SupTestAdvanced(SupTestBasic):
         self.db_file = os.path.join(gettempdir(), "test_suppress_msg_db_file_advanced.db")
         self.basic = SuppressKnown(db_file=self.db_file)
 
+    @unittest.skipIf(os.name == "nt", "Known issue on Windows, see https://docs.python.org/3/library/tempfile.html#tempfile.NamedTemporaryFile")
     def test_logger(self):
         """
         The logging output is directed to a file which is then checked whether
         the output is as expected.
         """
+        # TODO: this test is problematic on Windows due to the file being locked
+        #       by the logger. This is a known issue and should be fixed in the
+        #       future.
+        #       For now, the test is disabled on Windows.
+        #       See https://docs.python.org/3/library/tempfile.html#tempfile.NamedTemporaryFile
         logfile = NamedTemporaryFile(delete=False, mode="w")
         logger = logging.getLogger()
         logger.addHandler(logging.FileHandler(logfile.name))
-- 
GitLab


From 10c547b82bbcf64239cca79daab45bfd6bfdc11f Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Thu, 28 Nov 2024 13:32:55 +0100
Subject: [PATCH 071/106] DOC: Document pip extras in README_SETUP.md and
 remove outdated dependencies section in favour of referring to setup.py

---
 README_SETUP.md | 45 +++++++++++++++++++--------------------------
 1 file changed, 19 insertions(+), 26 deletions(-)

diff --git a/README_SETUP.md b/README_SETUP.md
index 3a7f0197..0018f044 100644
--- a/README_SETUP.md
+++ b/README_SETUP.md
@@ -1,41 +1,40 @@
 # Getting started
 
 ## Download
-The recommended way is:
+DOCThe recommended way to download is:
 ```
 # Clone the repository:
 git clone 'https://gitlab.com/caosdb/caosdb-advanced-user-tools'
 ```
 
-## Dependencies
-Dependencies will be installed automatically if you use the below described
-procedure.
-- `caosdb>=0.6.0`
-- `openpyxl>=3.0.7`
-- `xlrd>=1.2.0`
-- `pandas>=1.2.0`
-- `numpy>=1.17.3`
+## Installation
+`pip install . --user`
 
-If you want to use the optional h5-crawler the following dependencies will be
-installed additionally:
-- `h5py>=3.3.0`
+To test with tox:  
+`pip install tox --user`  
 
-For testing:
-- `tox`
+#### Additional dependencies
 
+To install dependencies used by optional functionality, the following pip extras 
+keywords are defined:
+- `test` for testing with pytest
+- `doc` for building the documentation
+- `dev` for code formatting
+- `h5` for the h5-crawler
+- `all` to install all optional dependencies
 
-## Installation
-- `pip install . --user`
-- `pip install tox --user`
+These extras can be installed using: `pip install .[KEYWORD] --user`  
 
-Optional h5-crawler:
-- `pip install .[h5-crawler] --user`
+A current list of the dependencies installed with this program as well as those installed with 
+the keywords can be found in `setup.py`s `setup_package()` method, in the `metadata` dictionary
+entries `install_requires` and `extras_require`.
 
 ## Run Unit Tests
 
 - All tests: `tox`
 - One specific test with tox: `tox -- unittests/test_myusecase.py -k expression`
-- Or even using only pytest: `pytest unittests/test_myusecase.py -k expression`
+- Using only pytest: `pytest unittests` or for running only one test 
+  `pytest unittests/test_myusecase.py -k expression`
 
 ## Run Integration Tests Locally
 
@@ -60,12 +59,6 @@ with the Googly style (see link below).
 
 Build documentation in `build/` with `make doc`.
 
-### Requirements ##
-
-- `sphinx`
-- `sphinx-autoapi`
-- `sphinx-rtd-theme`
-- `recommonmark >= 0.6.0`
 
 ### How to contribute ###
 
-- 
GitLab


From 7bba25095ba8b46d0c35a2123b6951a94f6b87bd Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Thu, 28 Nov 2024 13:41:25 +0100
Subject: [PATCH 072/106] MNT: Typo

---
 README_SETUP.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README_SETUP.md b/README_SETUP.md
index 0018f044..46d9f8ec 100644
--- a/README_SETUP.md
+++ b/README_SETUP.md
@@ -1,7 +1,7 @@
 # Getting started
 
 ## Download
-DOCThe recommended way to download is:
+The recommended way to download is:
 ```
 # Clone the repository:
 git clone 'https://gitlab.com/caosdb/caosdb-advanced-user-tools'
-- 
GitLab


From 48e55b6b5b965e3a8e078c55258a1f901be9a04b Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Thu, 28 Nov 2024 19:07:19 +0100
Subject: [PATCH 073/106] DOC: Update pip commands, and remove git link

---
 README_SETUP.md | 17 ++++++-----------
 1 file changed, 6 insertions(+), 11 deletions(-)

diff --git a/README_SETUP.md b/README_SETUP.md
index 46d9f8ec..e52885ff 100644
--- a/README_SETUP.md
+++ b/README_SETUP.md
@@ -1,20 +1,15 @@
 # Getting started
 
-## Download
-The recommended way to download is:
-```
-# Clone the repository:
-git clone 'https://gitlab.com/caosdb/caosdb-advanced-user-tools'
-```
-
 ## Installation
-`pip install . --user`
 
-To test with tox:  
-`pip install tox --user`  
+To install the advancedtools package, you can run:  
+`pip install caosadvancedtools`
 
 #### Additional dependencies
 
+To test using tox, you also need to install tox:  
+`pip install tox`  
+
 To install dependencies used by optional functionality, the following pip extras 
 keywords are defined:
 - `test` for testing with pytest
@@ -23,7 +18,7 @@ keywords are defined:
 - `h5` for the h5-crawler
 - `all` to install all optional dependencies
 
-These extras can be installed using: `pip install .[KEYWORD] --user`  
+These extras can be installed using: `pip install .[KEYWORD]`  
 
 A current list of the dependencies installed with this program as well as those installed with 
 the keywords can be found in `setup.py`s `setup_package()` method, in the `metadata` dictionary
-- 
GitLab


From 8fa476943f9e332e2516d9ccc5bebb76285cb6d0 Mon Sep 17 00:00:00 2001
From: Joscha Schmiedt <joscha@schmiedt.dev>
Date: Mon, 2 Dec 2024 21:09:07 +0100
Subject: [PATCH 074/106] Add reason argument to skipped tests on Windows

---
 unittests/test_sss_helper.py    | 2 +-
 unittests/test_suppressKnown.py | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/unittests/test_sss_helper.py b/unittests/test_sss_helper.py
index e1ce286d..8baab849 100644
--- a/unittests/test_sss_helper.py
+++ b/unittests/test_sss_helper.py
@@ -86,7 +86,7 @@ def test_send_mail():
     assert msg.get_content() == "hello!\n"
 
 # skip on windows (has no sendmail)
-@mark.skipif(platform.system() == "Windows")
+@mark.skipif(platform.system() == "Windows", reason="no sendmail on Windows")
 def test_send_mail_error():
     with raises(subprocess.CalledProcessError):
         send_mail("me@example.com", "you@example.com", "the subject", "hello!",
diff --git a/unittests/test_suppressKnown.py b/unittests/test_suppressKnown.py
index c3e65dbe..80af892d 100644
--- a/unittests/test_suppressKnown.py
+++ b/unittests/test_suppressKnown.py
@@ -60,7 +60,7 @@ class SupTestAdvanced(SupTestBasic):
         self.db_file = os.path.join(gettempdir(), "test_suppress_msg_db_file_advanced.db")
         self.basic = SuppressKnown(db_file=self.db_file)
 
-    @unittest.skipIf(os.name == "nt", "Known issue on Windows, see https://docs.python.org/3/library/tempfile.html#tempfile.NamedTemporaryFile")
+    @unittest.skipIf(os.name == "nt", reason="Known issue on Windows, see https://docs.python.org/3/library/tempfile.html#tempfile.NamedTemporaryFile")
     def test_logger(self):
         """
         The logging output is directed to a file which is then checked whether
-- 
GitLab


From 91d3ec23737d82505385f25fea7f2144022f1a90 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Wed, 4 Dec 2024 16:03:28 +0100
Subject: [PATCH 075/106] ENH, TEST: More strict boolean parsing, more tests.

---
 .../table_json_conversion/convert.py          |   4 +-
 .../data/simple_data_booleans.json            |  47 ++++++++++++++++++
 .../data/simple_data_booleans.xlsx            | Bin 0 -> 9030 bytes
 .../data/simple_data_broken.xlsx              | Bin 9133 -> 9299 bytes
 .../table_json_conversion/test_read_xlsx.py   |  24 ++++++++-
 unittests/table_json_conversion/utils.py      |   3 +-
 6 files changed, 73 insertions(+), 5 deletions(-)
 create mode 100644 unittests/table_json_conversion/data/simple_data_booleans.json
 create mode 100644 unittests/table_json_conversion/data/simple_data_booleans.xlsx

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index f775709a..b416fc29 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -480,9 +480,9 @@ class XLSXConverter:
                 return value
         # booleans might be retrieved as an integer or formula
         if subschema.get('type') == 'boolean':
-            if value == 0 or isinstance(value, str) and 'false' in value.lower():
+            if value == 0 or isinstance(value, str) and '=false()' == value.lower():
                 value = False
-            if value == 1 or isinstance(value, str) and 'true' in value.lower():
+            if value == 1 or isinstance(value, str) and '=true()' == value.lower():
                 value = True
         jsonschema.validate(value, subschema)
 
diff --git a/unittests/table_json_conversion/data/simple_data_booleans.json b/unittests/table_json_conversion/data/simple_data_booleans.json
new file mode 100644
index 00000000..f7d452b3
--- /dev/null
+++ b/unittests/table_json_conversion/data/simple_data_booleans.json
@@ -0,0 +1,47 @@
+{
+  "Training": [
+    {
+      "date": "2023-01-01",
+      "url": "www.indiscale.com",
+      "coach": [
+        {
+          "family_name": "Sky",
+          "given_name": "Max",
+          "Organisation": "ECB"
+        },
+        {
+          "family_name": "Sky",
+          "given_name": "Min",
+          "Organisation": "ECB"
+        }
+      ],
+      "supervisor": {
+        "family_name": "Steve",
+        "given_name": "Stevie",
+              "Organisation": "IMF"
+      },
+      "duration": 1.0,
+      "participants": 1,
+      "subjects": ["Math", "Physics"],
+      "remote": false
+    },
+    {
+      "date": "2023-01-02",
+      "url": "www.indiscale.com",
+      "supervisor": {
+        "family_name": "Steve",
+        "given_name": "Stevie",
+              "Organisation": "IMF"
+      },
+      "duration": 1.0,
+      "participants": 1,
+      "subjects": ["Math", "Physics"],
+      "remote": true
+    }
+  ],
+  "Person": [{
+    "family_name": "Steve",
+    "given_name": "Stevie",
+    "Organisation": "IMF"
+  }]
+}
diff --git a/unittests/table_json_conversion/data/simple_data_booleans.xlsx b/unittests/table_json_conversion/data/simple_data_booleans.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..6a67d7a8d6df76b7d88d0d575c6ed1c30b8f8363
GIT binary patch
literal 9030
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

literal 0
HcmV?d00001

diff --git a/unittests/table_json_conversion/data/simple_data_broken.xlsx b/unittests/table_json_conversion/data/simple_data_broken.xlsx
index a65d464a53459de73e41fd20d807899c44728cda..c75da9faaefcb7610d84e16dd6ff17dcd055b008 100644
GIT binary patch
delta 5889
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

delta 5626
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
F000fQI{yFw

diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index cd5d53dd..a34c046f 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -26,6 +26,7 @@ import os
 import re
 
 from types import SimpleNamespace
+from typing import Optional
 
 import jsonschema
 import pytest
@@ -41,7 +42,7 @@ def rfp(*pathcomponents):
 
 
 def convert_and_compare(xlsx_file: str, schema_file: str, known_good_file: str,
-                        known_good_data: dict = None, strict: bool = False,
+                        known_good_data: Optional[dict] = None, strict: bool = False,
                         validate: bool = True) -> dict:
     """Convert an XLSX file and compare to a known result.
 
@@ -77,6 +78,9 @@ def test_conversions():
                         schema_file=rfp("data/multiple_choice_schema.json"),
                         known_good_file=rfp("data/multiple_choice_data.json"),
                         strict=True)
+    convert_and_compare(xlsx_file=rfp("data/simple_data_booleans.xlsx"),
+                        schema_file=rfp("data/simple_schema.json"),
+                        known_good_file=rfp("data/simple_data_booleans.json"))
 
     with open(rfp("data/simple_data.json"), encoding="utf-8") as myfile:
         expected_datetime = json.load(myfile)
@@ -126,24 +130,40 @@ def test_error_table():
     assert "'There is no entry in the schema" in str(caught.value)
     assert "'Not an enum' is not one of [" in str(caught.value)
     # Correct Locations
+    matches = set()
     for line in str(caught.value).split('\n'):
         if "'Not a num' is not of type 'number'" in line:
             assert "J7" in line
+            matches.add("J7")
         if "'Yes a number?' is not of type 'number'" in line:
             assert "J8" in line
+            matches.add("J8")
         if "1.5 is not of type 'integer'" in line:
             assert "K7" in line
+            matches.add("K7")
         if "1.2345 is not of type 'integer'" in line:
             assert "K8" in line
+            matches.add("K8")
         if "'There is no entry in the schema" in line:
             assert "Column M" in line
+            matches.add("Col M")
         if "'Not an enum' is not one of [" in line:
             assert "G8" in line
+            matches.add("K8")
+        # The next two tests could potentially be removed in the future, once we evaluate formulas.
+        if "'=NOT(FALSE())' is not of type 'boolean'" in line:
+            assert "L9" in line
+            matches.add("L9")
+        if "'=NOT(TRUE())' is not of type 'boolean'" in line:
+            assert "L10" in line
+            matches.add("L10")
+    assert matches == {"J7", "J8", "K7", "K8", "Col M", "K8", "L9", "L10"}
+
     # No additional errors
     assert str(caught.value).count("Malformed metadata: Cannot parse paths in worksheet") == 1
     assert str(caught.value).count("There is no entry in the schema") == 1
     assert str(caught.value).count("is not one of") == 1
-    assert str(caught.value).count("is not of type") == 4
+    assert str(caught.value).count("is not of type") == 6
     # Check correct error message for completely unknown path
     with pytest.raises(jsonschema.ValidationError) as caught:
         convert.to_dict(xlsx=rfp("data/simple_data_broken_paths.xlsx"),
diff --git a/unittests/table_json_conversion/utils.py b/unittests/table_json_conversion/utils.py
index b95715f7..ac76fbea 100644
--- a/unittests/table_json_conversion/utils.py
+++ b/unittests/table_json_conversion/utils.py
@@ -58,7 +58,8 @@ Raise an assertion exception if they are not equal."""
                 "the other.")
         return
     assert isinstance(json1, list) and isinstance(json2, list), f"Is not a list, path: {path}"
-    assert len(json1) == len(json2), f"Lists must have equal length, path: {path}"
+    assert len(json1) == len(json2), (f"Lists must have equal length, path: {path}\n"
+                                      f"{json1}\n ---\n{json2}")
     for idx, (el1, el2) in enumerate(zip(json1, json2)):
         this_path = path + [idx]
         if isinstance(el1, dict):
-- 
GitLab


From 1c3710e205036c0afe93d108a865352ad157616c Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Fri, 6 Dec 2024 16:27:35 +0100
Subject: [PATCH 076/106] STY: autopep8'd

---
 unittests/test_sss_helper.py     | 2 ++
 unittests/test_table_importer.py | 2 +-
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/unittests/test_sss_helper.py b/unittests/test_sss_helper.py
index 8baab849..caaf49d4 100644
--- a/unittests/test_sss_helper.py
+++ b/unittests/test_sss_helper.py
@@ -86,6 +86,8 @@ def test_send_mail():
     assert msg.get_content() == "hello!\n"
 
 # skip on windows (has no sendmail)
+
+
 @mark.skipif(platform.system() == "Windows", reason="no sendmail on Windows")
 def test_send_mail_error():
     with raises(subprocess.CalledProcessError):
diff --git a/unittests/test_table_importer.py b/unittests/test_table_importer.py
index fc0d5f0e..c1336ee5 100644
--- a/unittests/test_table_importer.py
+++ b/unittests/test_table_importer.py
@@ -196,7 +196,7 @@ class TableImporterTest(unittest.TestCase):
                            [5678, 1, 2.0, 3, 'yes']],
                           columns=['a', 'b', 'c', 'float', 'd'])
         # wrong datatypes before
-        assert df["a"].dtype !=  pd.StringDtype
+        assert df["a"].dtype != pd.StringDtype
         assert df["float"].dtype != float
         # strict = False by default, so this shouldn't raise an error
         importer.check_datatype(df)
-- 
GitLab


From 55124063ad05408c515d20428cdf52b2d6022614 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Fri, 13 Dec 2024 11:35:14 +0100
Subject: [PATCH 077/106] MNT: Remove unused imports

---
 src/caosadvancedtools/cfood.py               | 3 +--
 src/caosadvancedtools/crawler.py             | 1 -
 src/caosadvancedtools/models/parser.py       | 3 ---
 src/caosadvancedtools/pandoc_header_tools.py | 3 ---
 src/caosadvancedtools/table_converter.py     | 1 -
 src/caosadvancedtools/utils.py               | 1 -
 6 files changed, 1 insertion(+), 11 deletions(-)

diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index e79f0373..8ae01632 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -46,9 +46,8 @@ from abc import ABCMeta, abstractmethod
 from datetime import datetime
 
 import linkahead as db
-from linkahead.common.models import Entity
 from linkahead.exceptions import (BadQueryError, EmptyUniqueQueryError,
-                                  QueryNotUniqueError, TransactionError)
+                                  QueryNotUniqueError)
 
 from .datamodel_problems import DataModelProblems
 from .guard import global_guard as guard
diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index 7a840624..e5bdd142 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -41,7 +41,6 @@ match. This occurs in basically three steps:
 
 import logging
 import os
-import subprocess
 import traceback
 import uuid
 from datetime import datetime
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index b1e3aa95..a33f37ca 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -36,11 +36,8 @@ Parents can be provided under the 'inherit_from_xxxx' keywords. The value needs
 to be a list with the names. Here, NO NEW entities can be defined.
 """
 import argparse
-import json
-import re
 import sys
 from typing import List, Optional
-from warnings import warn
 
 import jsonref
 import jsonschema
diff --git a/src/caosadvancedtools/pandoc_header_tools.py b/src/caosadvancedtools/pandoc_header_tools.py
index e0e62c8c..bf9b25a9 100644
--- a/src/caosadvancedtools/pandoc_header_tools.py
+++ b/src/caosadvancedtools/pandoc_header_tools.py
@@ -30,10 +30,7 @@
 # D. Hornung 2019-02
 # T. Fitschen 2019-02
 
-import argparse
-import glob
 import os
-import re
 
 import yaml
 
diff --git a/src/caosadvancedtools/table_converter.py b/src/caosadvancedtools/table_converter.py
index 2f0d4cc9..bfbf6296 100644
--- a/src/caosadvancedtools/table_converter.py
+++ b/src/caosadvancedtools/table_converter.py
@@ -25,7 +25,6 @@ import re
 import sys
 
 import linkahead as db
-import numpy as np
 import pandas as pd
 
 
diff --git a/src/caosadvancedtools/utils.py b/src/caosadvancedtools/utils.py
index 9a0342e9..3e1e6992 100644
--- a/src/caosadvancedtools/utils.py
+++ b/src/caosadvancedtools/utils.py
@@ -25,7 +25,6 @@
 
 import logging
 import os
-import pathlib
 
 import linkahead as db
 from linkahead.exceptions import TransactionError
-- 
GitLab


From 57712195b27f78e15094ccb118dfd5e807d1880f Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Fri, 13 Dec 2024 11:38:18 +0100
Subject: [PATCH 078/106] MNT: Move main into method

---
 src/caosadvancedtools/collect_datamodel.py | 6 +++++-
 src/caosadvancedtools/export_related.py    | 6 +++++-
 src/caosadvancedtools/import_from_xml.py   | 6 +++++-
 src/caosadvancedtools/models/parser.py     | 6 +++++-
 src/caosadvancedtools/table_converter.py   | 7 +++++--
 5 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/src/caosadvancedtools/collect_datamodel.py b/src/caosadvancedtools/collect_datamodel.py
index 1c37bab0..f485aec6 100644
--- a/src/caosadvancedtools/collect_datamodel.py
+++ b/src/caosadvancedtools/collect_datamodel.py
@@ -112,7 +112,7 @@ def compare(directory):
             print("{} is missing in the existing properties".format(p))
 
 
-if __name__ == "__main__":
+def main():
     p = get_parser()
     args = p.parse_args()
 
@@ -121,3 +121,7 @@ if __name__ == "__main__":
 
     if args.compare:
         compare(args.compare)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/caosadvancedtools/export_related.py b/src/caosadvancedtools/export_related.py
index 1ac6d2cb..72484a30 100755
--- a/src/caosadvancedtools/export_related.py
+++ b/src/caosadvancedtools/export_related.py
@@ -149,8 +149,12 @@ def defineParser():
     return parser
 
 
-if __name__ == "__main__":
+def main():
     parser = defineParser()
     args = parser.parse_args()
 
     export_related_to(args.id, directory=args.directory)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/caosadvancedtools/import_from_xml.py b/src/caosadvancedtools/import_from_xml.py
index 7bc9f018..23ea79c1 100755
--- a/src/caosadvancedtools/import_from_xml.py
+++ b/src/caosadvancedtools/import_from_xml.py
@@ -122,8 +122,12 @@ def defineParser():
     return parser
 
 
-if __name__ == "__main__":
+def main():
     parser = defineParser()
     args = parser.parse_args()
 
     import_xml(args.file, args.rerun)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index a33f37ca..7b91891f 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -1016,7 +1016,7 @@ class JsonSchemaParser(Parser):
         return returns
 
 
-if __name__ == "__main__":
+def main():
     parser = argparse.ArgumentParser(description=__doc__,
                                      formatter_class=argparse.RawTextHelpFormatter)
     parser.add_argument("data_model",
@@ -1039,3 +1039,7 @@ if __name__ == "__main__":
         print(model)
     if args.sync:
         model.sync_data_model(noquestion=args.noquestion)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/src/caosadvancedtools/table_converter.py b/src/caosadvancedtools/table_converter.py
index bfbf6296..c5fcb969 100644
--- a/src/caosadvancedtools/table_converter.py
+++ b/src/caosadvancedtools/table_converter.py
@@ -98,8 +98,7 @@ def from_table(spreadsheet, recordtype):
     return records
 
 
-if __name__ == "__main__":
-
+def main():
     p = argparse.ArgumentParser()
     p.add_argument("-f", "--filename", help="The excel filename")
     p.add_argument("--auth-token")
@@ -110,3 +109,7 @@ if __name__ == "__main__":
     recordtype = "Experiment"
 
     from_tsv(arg.filename, recordtype)
+
+
+if __name__ == "__main__":
+    main()
\ No newline at end of file
-- 
GitLab


From 36951518ed6f16fc2e76bb1533335a11629b85de Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Fri, 13 Dec 2024 11:52:00 +0100
Subject: [PATCH 079/106] MNT: Specify encodings when opening file

---
 src/caosadvancedtools/collect_datamodel.py   |  8 ++++----
 src/caosadvancedtools/crawler.py             |  2 +-
 src/caosadvancedtools/export_related.py      |  2 +-
 src/caosadvancedtools/import_from_xml.py     |  4 ++--
 src/caosadvancedtools/loadFiles.py           |  4 ++--
 src/caosadvancedtools/models/parser.py       |  4 ++--
 src/caosadvancedtools/pandoc_header_tools.py | 10 +++++-----
 src/caosadvancedtools/table_export.py        |  2 +-
 8 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/src/caosadvancedtools/collect_datamodel.py b/src/caosadvancedtools/collect_datamodel.py
index f485aec6..bb69a03d 100644
--- a/src/caosadvancedtools/collect_datamodel.py
+++ b/src/caosadvancedtools/collect_datamodel.py
@@ -62,9 +62,9 @@ def store(directory, xml=False):
     rts, ps = get_dm()
 
     os.makedirs(directory, exist_ok=True)
-    with open(os.path.join(directory, "recordtypes.txt"), "w") as fi:
+    with open(os.path.join(directory, "recordtypes.txt"), "w", encoding="utf-8") as fi:
         fi.write(",".join([el[1] for el in rts]))
-    with open(os.path.join(directory, "properties.txt"), "w") as fi:
+    with open(os.path.join(directory, "properties.txt"), "w", encoding="utf-8") as fi:
         fi.write(",".join([el[1] for el in ps]))
 
     if xml:
@@ -75,10 +75,10 @@ def store(directory, xml=False):
 
 
 def load_dm(directory):
-    with open(os.path.join(directory, "recordtypes.txt"), "r") as fi:
+    with open(os.path.join(directory, "recordtypes.txt"), "r", encoding="utf-8") as fi:
         text = fi.read()
         rts = [el.strip() for el in text.split(",")]
-    with open(os.path.join(directory, "properties.txt"), "r") as fi:
+    with open(os.path.join(directory, "properties.txt"), "r", encoding="utf-8") as fi:
         text = fi.read()
         ps = [el.strip() for el in text.split(",")]
 
diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index e5bdd142..9b960d57 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -599,7 +599,7 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3]))
         randname = os.path.basename(os.path.abspath(directory))
         filepath = os.path.abspath(os.path.join(directory, filename))
         filename = os.path.join(randname, filename)
-        with open(filepath, "w") as f:
+        with open(filepath, "w", encoding="utf-8") as f:
             f.write(form)
         return filename
 
diff --git a/src/caosadvancedtools/export_related.py b/src/caosadvancedtools/export_related.py
index 72484a30..d25381f9 100755
--- a/src/caosadvancedtools/export_related.py
+++ b/src/caosadvancedtools/export_related.py
@@ -128,7 +128,7 @@ def export(cont, directory="."):
     xml = etree.tounicode(cont.to_xml(
         local_serialization=True), pretty_print=True)
 
-    with open(os.path.join(directory, "linkahead_data.xml"), "w") as fi:
+    with open(os.path.join(directory, "linkahead_data.xml"), "w", encoding="utf-8") as fi:
         fi.write(xml)
 
 
diff --git a/src/caosadvancedtools/import_from_xml.py b/src/caosadvancedtools/import_from_xml.py
index 23ea79c1..4f9bba99 100755
--- a/src/caosadvancedtools/import_from_xml.py
+++ b/src/caosadvancedtools/import_from_xml.py
@@ -39,7 +39,7 @@ from caosadvancedtools.models.data_model import DataModel
 def create_dummy_file(text="Please ask the administrator for this file."):
     tmpfile = NamedTemporaryFile(delete=False)
     tmpfile.close()
-    with open(tmpfile.name, "w") as tm:
+    with open(tmpfile.name, "w", encoding="utf-8") as tm:
         tm.write(text)
 
     return tmpfile.name
@@ -51,7 +51,7 @@ def import_xml(filename, rerun=False, interactive=True):
     rerun: boolean; if true, files are not inserted as paths would conflict.
     """
     cont = db.Container()
-    with open(filename) as fi:
+    with open(filename, encoding="utf-8") as fi:
         cont = cont.from_xml(fi.read())
 
     tmpfile = create_dummy_file()
diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py
index c9258afa..8e3b466f 100755
--- a/src/caosadvancedtools/loadFiles.py
+++ b/src/caosadvancedtools/loadFiles.py
@@ -90,9 +90,9 @@ def combine_ignore_files(caosdbignore: str, localignore: str, dirname=None) -> s
 
     tmp = NamedTemporaryFile(delete=False, mode="w",
                              dir=dirname, prefix=".caosdbignore")
-    with open(caosdbignore, "r") as base:
+    with open(caosdbignore, "r", encoding="utf-8") as base:
         tmp.write(base.read())
-    with open(localignore, "r") as local:
+    with open(localignore, "r", encoding="utf-8") as local:
         tmp.write(local.read())
     tmp.close()
     return tmp.name
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 7b91891f..f6e142db 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -247,7 +247,7 @@ debug : bool, optional
         out : data_model.DataModel
           The created DataModel
         """
-        with open(filename, 'r') as outfile:
+        with open(filename, 'r', encoding="utf-8") as outfile:
             ymlmodel = yaml.load(outfile, Loader=SafeLineLoader)
 
         return self._create_model_from_dict(ymlmodel, existing_model=existing_model)
@@ -731,7 +731,7 @@ class JsonSchemaParser(Parser):
         # @author Florian Spreckelsen
         # @date 2022-02-17
         # @review Timm Fitschen 2023-05-25
-        with open(filename, 'r') as schema_file:
+        with open(filename, 'r', encoding="utf-8") as schema_file:
             model_dict = jsonref.load(schema_file)
 
         return self._create_model_from_dict(model_dict, top_level_recordtype=top_level_recordtype)
diff --git a/src/caosadvancedtools/pandoc_header_tools.py b/src/caosadvancedtools/pandoc_header_tools.py
index bf9b25a9..a6879565 100644
--- a/src/caosadvancedtools/pandoc_header_tools.py
+++ b/src/caosadvancedtools/pandoc_header_tools.py
@@ -103,7 +103,7 @@ it is not at the beginning, it must be preceded by a blank line.
             if not os.path.exists(filename):
                 raise MetadataFileMissing(filename)
 
-    with open(filename) as f:
+    with open(filename, encoding="utf-8") as f:
         textlines = f.readlines()
 
     state = 0
@@ -168,7 +168,7 @@ def save_header(filename, header_data):
     if os.path.isdir(filename):
         filename = os.path.join(filename, "README.md")
 
-    with open(filename) as f:
+    with open(filename, encoding="utf-8") as f:
         textlines = f.readlines()
 
     while textlines[header_data[0]] != "...\n":
@@ -181,7 +181,7 @@ def save_header(filename, header_data):
                                default_flow_style=False,
                                allow_unicode=True))
 
-    with open(filename, "w") as f:
+    with open(filename, "w", encoding="utf-8") as f:
         f.writelines(textlines)
 
 
@@ -199,7 +199,7 @@ def add_header(filename, header_dict=None):
         filename = os.path.join(filename, "README.md")
 
     if os.path.exists(filename):
-        with open(filename) as f:
+        with open(filename, encoding="utf-8") as f:
             textlines = f.readlines()
     else:
         textlines = ""
@@ -211,7 +211,7 @@ def add_header(filename, header_dict=None):
                                           default_flow_style=False,
                                           allow_unicode=True) + "...\n"
 
-    with open(filename, "w") as f:
+    with open(filename, "w", encoding="utf-8") as f:
         f.write(localheader)
         f.writelines(textlines)
 
diff --git a/src/caosadvancedtools/table_export.py b/src/caosadvancedtools/table_export.py
index 00e644e4..9b821394 100644
--- a/src/caosadvancedtools/table_export.py
+++ b/src/caosadvancedtools/table_export.py
@@ -123,7 +123,7 @@ class BaseTableExporter(object):
             self.export_dict = export_dict
         else:
             try:
-                with open(export_dict) as tmp:
+                with open(export_dict, encoding="utf-8") as tmp:
                     self.export_dict = json.load(tmp)
             except BaseException:
                 raise ValueError(
-- 
GitLab


From 40961b1dd1fa61772dee63858f68983dfe09f9d8 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Fri, 13 Dec 2024 12:01:10 +0100
Subject: [PATCH 080/106] MNT: Fix various pylint errors:

- Remove unnecessary pass, init without effect, unused variables
- Update use of deprecated methods
- Fix used exception not matching documentation
- Ignore logging-fstring-interpolation, variant of logging-format-interpolation
---
 pylintrc                                      | 1 +
 src/caosadvancedtools/cache.py                | 6 ------
 src/caosadvancedtools/cfood.py                | 1 -
 src/caosadvancedtools/crawler.py              | 4 ++--
 src/caosadvancedtools/import_from_xml.py      | 2 +-
 src/caosadvancedtools/loadFiles.py            | 2 +-
 src/caosadvancedtools/models/parser.py        | 2 +-
 src/caosadvancedtools/scifolder/withreadme.py | 4 ++--
 src/caosadvancedtools/table_converter.py      | 2 +-
 src/caosadvancedtools/utils.py                | 1 -
 src/caosadvancedtools/webui_formatter.py      | 2 +-
 11 files changed, 10 insertions(+), 17 deletions(-)

diff --git a/pylintrc b/pylintrc
index 1be7cd8d..e95afc90 100644
--- a/pylintrc
+++ b/pylintrc
@@ -19,4 +19,5 @@ init-hook=
 disable=
   fixme,
   logging-format-interpolation,
+  logging-fstring-interpolation,
   logging-not-lazy,
diff --git a/src/caosadvancedtools/cache.py b/src/caosadvancedtools/cache.py
index 46564393..5fc1ec3c 100644
--- a/src/caosadvancedtools/cache.py
+++ b/src/caosadvancedtools/cache.py
@@ -94,7 +94,6 @@ class AbstractCache(ABC):
 
         Increase this variable, when changes to the cache tables are made.
         """
-        pass
 
     @abstractmethod
     def create_cache(self):
@@ -102,14 +101,12 @@ class AbstractCache(ABC):
         Provide an overloaded function here that creates the cache in
         the most recent version.
         """
-        pass
 
     @abstractmethod
     def get_default_file_name(self):
         """
         Supply a default file name for the cache here.
         """
-        pass
 
     def check_cache(self):
         """
@@ -192,9 +189,6 @@ class IdentifiableCache(AbstractCache):
     def get_default_file_name(self):
         return "caosdb_identifiable_cache.db"
 
-    def __init__(self, db_file=None, force_creation=False):
-        super().__init__(db_file, force_creation)
-
     def create_cache(self):
         """
         Create a new SQLITE cache file in self.db_file.
diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index 8ae01632..4647a576 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -208,7 +208,6 @@ class AbstractCFood(object, metaclass=ABCMeta):
 
         To be overwritten by subclasses
         """
-        pass
 
     def attach(self, item):
         self.attached_items.append(item)
diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index 9b960d57..dfc5351c 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -487,8 +487,8 @@ ____________________\n""".format(i+1, len(pending_changes)) + str(el[3]))
             logger.error(err_msg)
             logger.error('Crawler finished with Datamodel Errors')
         elif errors_occured:
-            msg = "There were fatal errors during execution, please "
-            "contact the system administrator!"
+            msg = ("There were fatal errors during execution, please contact "
+                   "the system administrator!")
 
             if self.debug_file:
                 msg += "\nPlease provide the following path:\n{}".format(
diff --git a/src/caosadvancedtools/import_from_xml.py b/src/caosadvancedtools/import_from_xml.py
index 4f9bba99..540091b0 100755
--- a/src/caosadvancedtools/import_from_xml.py
+++ b/src/caosadvancedtools/import_from_xml.py
@@ -94,7 +94,7 @@ def import_xml(filename, rerun=False, interactive=True):
 
     if not rerun:
         for _, el in enumerate(files.values()):
-            r = el.insert(unique=False)
+            el.insert(unique=False)
     else:
         for _, el in enumerate(files.values()):
             el.id = None
diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py
index 8e3b466f..56d50e4d 100755
--- a/src/caosadvancedtools/loadFiles.py
+++ b/src/caosadvancedtools/loadFiles.py
@@ -122,7 +122,7 @@ def compile_file_list(caosdbignore: str, localpath: str) -> list[str]:
     current_ignore = caosdbignore
     non_ignored_files = []
     ignore_files: list[tuple[str, str]] = []
-    for root, dirs, files in os.walk(localpath):
+    for root, _, files in os.walk(localpath):
         # remove local ignore files that do no longer apply to the current subtree (branch switch)
         while len(ignore_files) > 0 and not root.startswith(ignore_files[-1][0]):
             os.remove(ignore_files[-1][1])
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index f6e142db..1cd1fe6e 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -633,7 +633,7 @@ debug : bool, optional
 
         """
 
-        for key, value in self.model.items():
+        for _, value in self.model.items():
 
             if isinstance(value, db.Property):
                 dtype = value.datatype
diff --git a/src/caosadvancedtools/scifolder/withreadme.py b/src/caosadvancedtools/scifolder/withreadme.py
index 94280b80..faab94cb 100644
--- a/src/caosadvancedtools/scifolder/withreadme.py
+++ b/src/caosadvancedtools/scifolder/withreadme.py
@@ -156,8 +156,8 @@ class WithREADME(object):
                          for f in sublist]
 
             if len(flat_list) == 0:
-                LOGGER.warn("ATTENTION: the field {} does not reference any "
-                            "known files".format(field.key))
+                LOGGER.warning(f"ATTENTION: the field {field.key} does not"
+                               " reference any known files")
 
             self.attached_filenames.extend(flat_list)  # pylint: disable=no-member
 
diff --git a/src/caosadvancedtools/table_converter.py b/src/caosadvancedtools/table_converter.py
index c5fcb969..16f27476 100644
--- a/src/caosadvancedtools/table_converter.py
+++ b/src/caosadvancedtools/table_converter.py
@@ -73,7 +73,7 @@ def from_table(spreadsheet, recordtype):
     """ parses a pandas DataFrame to a list of records """
     records = db.Container()
 
-    for idx, row in spreadsheet.iterrows():
+    for _, row in spreadsheet.iterrows():
         rec = db.Record()
         rec.add_parent(name=recordtype)
 
diff --git a/src/caosadvancedtools/utils.py b/src/caosadvancedtools/utils.py
index 3e1e6992..0d73f962 100644
--- a/src/caosadvancedtools/utils.py
+++ b/src/caosadvancedtools/utils.py
@@ -235,7 +235,6 @@ def find_records_that_reference_ids(referenced_ids, rt="", step_size=50):
             record_ids.update([exp.id for exp in exps])
         except Exception as e:
             print(e)
-            pass
 
         index += step_size
 
diff --git a/src/caosadvancedtools/webui_formatter.py b/src/caosadvancedtools/webui_formatter.py
index c3c5381d..43ebbe06 100644
--- a/src/caosadvancedtools/webui_formatter.py
+++ b/src/caosadvancedtools/webui_formatter.py
@@ -92,4 +92,4 @@ class WebUI_Formatter(logging.Formatter):
             return wrap_bootstrap_alert("<b>CRITICAL ERROR:</b> " + text,
                                         kind="danger")
         else:
-            raise Exception("unknown level")
+            raise RuntimeError("unknown level")
-- 
GitLab


From 433160cf8143d4ef0dccdc0c88ff060bb514dfcd Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Fri, 13 Dec 2024 15:39:36 +0100
Subject: [PATCH 081/106] MNT: Replace dict default values with None and update
 in method body

---
 src/caosadvancedtools/crawler.py        |  4 +++-
 src/caosadvancedtools/models/parser.py  | 10 ++++++++--
 src/caosadvancedtools/table_importer.py |  5 +++--
 3 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index dfc5351c..7b5251af 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -66,7 +66,7 @@ def separated(text):
     return "-"*60 + "\n" + text
 
 
-def apply_list_of_updates(to_be_updated, update_flags={},
+def apply_list_of_updates(to_be_updated, update_flags=None,
                           update_cache=None, run_id=None):
     """Updates the `to_be_updated` Container, i.e., pushes the changes to LinkAhead
     after removing possible duplicates. If a chace is provided, uauthorized
@@ -86,6 +86,8 @@ def apply_list_of_updates(to_be_updated, update_flags={},
         Id with which the pending updates are cached. Only meaningful if
         `update_cache` is provided. Default is None.
     """
+    if update_flags is None:
+        update_flags = {}
 
     if len(to_be_updated) == 0:
         return
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 1cd1fe6e..b97e507e 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -162,7 +162,7 @@ debug : bool, optional
 def parse_model_from_json_schema(
         filename: str,
         top_level_recordtype: bool = True,
-        types_for_missing_array_items: dict = {},
+        types_for_missing_array_items: dict = None,
         ignore_unspecified_array_items: bool = False,
         existing_model: Optional[dict] = None
 ):
@@ -204,6 +204,9 @@ def parse_model_from_json_schema(
     about the limitations of the current implementation.
 
     """
+    if types_for_missing_array_items is None:
+        types_for_missing_array_items = {}
+
     if existing_model is not None:
         raise NotImplementedError("Adding to an existing model is not implemented yet.")
 
@@ -706,8 +709,11 @@ class JsonSchemaParser(Parser):
     # @date 2022-02-17
     # @review Timm Fitschen 2023-05-25
 
-    def __init__(self, types_for_missing_array_items={}, ignore_unspecified_array_items=False):
+    def __init__(self, types_for_missing_array_items=None,
+                 ignore_unspecified_array_items=False):
         super().__init__()
+        if types_for_missing_array_items is None:
+            types_for_missing_array_items = {}
         self.types_for_missing_array_items = types_for_missing_array_items
         self.ignore_unspecified_array_items = ignore_unspecified_array_items
 
diff --git a/src/caosadvancedtools/table_importer.py b/src/caosadvancedtools/table_importer.py
index cd1b206f..b3977b39 100755
--- a/src/caosadvancedtools/table_importer.py
+++ b/src/caosadvancedtools/table_importer.py
@@ -110,8 +110,7 @@ def date_converter(val, fmt="%Y-%m-%d"):
         return datetime_converter(val, fmt=fmt).date()
 
 
-def incomplete_date_converter(val, fmts={"%Y-%m-%d": "%Y-%m-%d",
-                                         "%Y-%m": "%Y-%m", "%Y": "%Y"}):
+def incomplete_date_converter(val, fmts=None):
     """ if the value is already a datetime, it is returned otherwise it
     converts it using format string
 
@@ -124,6 +123,8 @@ def incomplete_date_converter(val, fmts={"%Y-%m-%d": "%Y-%m-%d",
         keys are the formats into which the input value is tried to be
         converted, values are the possible input formats.
     """
+    if fmts is None:
+        fmts = {"%Y-%m-%d": "%Y-%m-%d", "%Y-%m": "%Y-%m", "%Y": "%Y"}
 
     for to, fro in fmts.items():
         try:
-- 
GitLab


From 80031cfd69d6670a8adf6e720764e7be94aaa50a Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Fri, 13 Dec 2024 15:41:52 +0100
Subject: [PATCH 082/106] MNT: Move attribute definitions into init

---
 src/caosadvancedtools/crawler.py       | 1 +
 src/caosadvancedtools/example_cfood.py | 4 ++++
 2 files changed, 5 insertions(+)

diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index 7b5251af..639eb741 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -170,6 +170,7 @@ class Crawler(object):
         self.abort_on_exception = abort_on_exception
         self.update_cache = UpdateCache()
         self.filterKnown = SuppressKnown()
+        self.run_id = None
         advancedtoolslogger = logging.getLogger("caosadvancedtools")
 
         # TODO this seems to be a bad idea. What if the handler was not added
diff --git a/src/caosadvancedtools/example_cfood.py b/src/caosadvancedtools/example_cfood.py
index 45984998..43a558fd 100644
--- a/src/caosadvancedtools/example_cfood.py
+++ b/src/caosadvancedtools/example_cfood.py
@@ -31,6 +31,10 @@ class ExampleCFood(AbstractFileCFood):
         return (r".*/(?P<species>[^/]+)/"
                 r"(?P<date>\d{4}-\d{2}-\d{2})/README.md")
 
+    def __init__(self, crawled_path, *args, **kwargs):
+        super().__init__(crawled_path, *args, **kwargs)
+        self.experiment = None
+
     def create_identifiables(self):
         self.experiment = db.Record()
         self.experiment.add_parent(name="Experiment")
-- 
GitLab


From 6028bbb4e61113c2f06dc8ee2e14e83714b90fb2 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Fri, 13 Dec 2024 15:42:38 +0100
Subject: [PATCH 083/106] MNT: Fix various pylint warnings

---
 src/caosadvancedtools/crawler.py | 2 +-
 src/caosadvancedtools/utils.py   | 5 ++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index 639eb741..4214fd9e 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -357,7 +357,7 @@ class Crawler(object):
                 except BaseException:
                     pass
                 logger.debug("Failed during execution of {}!".format(
-                    Cfood.__name__))
+                    cfood.__name__))
                 logger.debug(traceback.format_exc())
                 logger.debug(e)
                 remove_cfoods.append(cfood)
diff --git a/src/caosadvancedtools/utils.py b/src/caosadvancedtools/utils.py
index 0d73f962..43ecb3f2 100644
--- a/src/caosadvancedtools/utils.py
+++ b/src/caosadvancedtools/utils.py
@@ -32,9 +32,8 @@ from linkahead.exceptions import TransactionError
 logger = logging.getLogger(__name__)
 
 
-def set_log_level(level):
-    logger = logging.getLogger(__name__)
-    logger.setLevel(level=logging.DEBUG)
+def set_log_level(level=logging.DEBUG):
+    logger.setLevel(level=level)
 
 
 def replace_path_prefix(path, old_prefix, new_prefix):
-- 
GitLab


From 7c5928e09cc7e488d03680c2327c1825f848f6c1 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Sat, 14 Dec 2024 18:57:23 +0100
Subject: [PATCH 084/106] MNT: Replace BaseException with Exception where
 catching system errors does not seem necessary

---
 integrationtests/test_base_table_exporter_integration.py | 2 +-
 integrationtests/test_cache.py                           | 2 +-
 integrationtests/test_crawler_basics.py                  | 2 +-
 src/caosadvancedtools/crawler.py                         | 4 ++--
 src/caosadvancedtools/export_related.py                  | 2 +-
 src/caosadvancedtools/table_export.py                    | 2 +-
 6 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/integrationtests/test_base_table_exporter_integration.py b/integrationtests/test_base_table_exporter_integration.py
index 286c4ac3..0dbfc7e7 100644
--- a/integrationtests/test_base_table_exporter_integration.py
+++ b/integrationtests/test_base_table_exporter_integration.py
@@ -82,7 +82,7 @@ def setup_module():
     """Clear all test entities"""
     try:
         db.execute_query("FIND ENTITY Test*").delete()
-    except BaseException:
+    except Exception:
         pass
 
 
diff --git a/integrationtests/test_cache.py b/integrationtests/test_cache.py
index 13470b8b..7724cfb4 100644
--- a/integrationtests/test_cache.py
+++ b/integrationtests/test_cache.py
@@ -67,7 +67,7 @@ class CacheTest(unittest.TestCase):
         print(db.execute_query("FIND entity with id="+str(rec.id), unique=True))
         try:
             print(db.execute_query("FIND Record "+str(rec.id), unique=True))
-        except BaseException:
+        except Exception:
             print("Query does not work as expected")
         update.insert(cont, run_id)
         assert len(update.get_updates(run_id)) == 1
diff --git a/integrationtests/test_crawler_basics.py b/integrationtests/test_crawler_basics.py
index 04eb5459..67317f32 100644
--- a/integrationtests/test_crawler_basics.py
+++ b/integrationtests/test_crawler_basics.py
@@ -114,7 +114,7 @@ class CrawlerTest(unittest.TestCase):
         for el in [self.rec1, self.rec2, self.rec3]:
             try:
                 el.delete()
-            except BaseException:
+            except Exception:
                 pass
 
 
diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index 4214fd9e..ad2536c2 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -322,7 +322,7 @@ class Crawler(object):
                     except Exception as e:
                         try:
                             DataModelProblems.evaluate_exception(e)
-                        except BaseException:
+                        except Exception:
                             pass
                         logger.debug("Failed during execution of {}!".format(
                             Cfood.__name__))
@@ -354,7 +354,7 @@ class Crawler(object):
             except Exception as e:
                 try:
                     DataModelProblems.evaluate_exception(e)
-                except BaseException:
+                except Exception:
                     pass
                 logger.debug("Failed during execution of {}!".format(
                     cfood.__name__))
diff --git a/src/caosadvancedtools/export_related.py b/src/caosadvancedtools/export_related.py
index d25381f9..2114f388 100755
--- a/src/caosadvancedtools/export_related.py
+++ b/src/caosadvancedtools/export_related.py
@@ -118,7 +118,7 @@ def export(cont, directory="."):
             try:
                 el.download(target)
                 print("Downloaded:", target)
-            except BaseException:
+            except Exception:
                 print("Failed download of:", target)
 
     invert_ids(cont)
diff --git a/src/caosadvancedtools/table_export.py b/src/caosadvancedtools/table_export.py
index 9b821394..78830b19 100644
--- a/src/caosadvancedtools/table_export.py
+++ b/src/caosadvancedtools/table_export.py
@@ -125,7 +125,7 @@ class BaseTableExporter(object):
             try:
                 with open(export_dict, encoding="utf-8") as tmp:
                     self.export_dict = json.load(tmp)
-            except BaseException:
+            except Exception:
                 raise ValueError(
                     "export_dict must be either a dictionary"
                     " or the path to a json file.")
-- 
GitLab


From 198eecbf0bc29eefeecfb4bcc4b322b56fc6da90 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Sun, 15 Dec 2024 19:58:35 +0100
Subject: [PATCH 085/106] ENH: XLSXConverter now checks the paths in the given
 workbook for validity:

- New method XLSXConverter._check_path_validity() called in __init__
- New test with test data containing various incorrect paths
- Updated tests and test data to reflect new behaviour
---
 CHANGELOG.md                                  |   1 +
 .../table_json_conversion/convert.py          | 115 +++++++++++++++---
 .../data/simple_data_broken.xlsx              | Bin 9299 -> 9126 bytes
 .../data/simple_data_broken_paths_2.xlsx      | Bin 0 -> 8838 bytes
 .../table_json_conversion/test_read_xlsx.py   |  75 ++++++++----
 5 files changed, 149 insertions(+), 42 deletions(-)
 create mode 100644 unittests/table_json_conversion/data/simple_data_broken_paths_2.xlsx

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6a118d98..6628f1a7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -33,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 ### Fixed ###
 
 - Yaml data model parser adds data types of properties of record types and other attributes which fixes https://gitlab.indiscale.com/caosdb/customers/f-fit/management/-/issues/58
+- `XLSXConverter` now checks path validity before parsing the worksheet.
 
 ### Security ###
 
diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index b416fc29..370dc85d 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -182,16 +182,107 @@ class XLSXConverter:
         self._workbook = load_workbook(xlsx)
         self._schema = read_or_dict(schema)
         self._defining_path_index = xlsx_utils.get_defining_paths(self._workbook)
-        try:
-            self._check_columns(fail_fast=strict)
-        except KeyError as e:
-            raise jsonschema.ValidationError(f"Malformed metadata: Cannot parse paths. "
-                                             f"Unknown path: '{e.args[1]}' in sheet '{e.args[0]}'."
-                                             ) from e
+        self._check_path_validity()
+        self._check_columns(fail_fast=strict)
         self._handled_sheets: set[str] = set()
         self._result: dict = {}
         self._errors: dict = {}
 
+    def _check_path_validity(self):
+        """
+        Method to check the workbook paths for completeness and correctness,
+        and raises a jsonschema.ValidationError containing information on all
+        faulty paths if any are found.
+
+        If this method does not raise an error, this does not mean the workbook
+        is formatted correctly, only that the contained paths are complete and
+        can be found in the schema.
+        """
+        # Setup
+        error_message = ["There were errors during path validation:"]
+        only_warnings = True
+        for sheetname in self._workbook.sheetnames:
+            sheet = self._workbook[sheetname]
+            error_message.append(f"\nIn sheet {sheetname}:")
+
+            # Collect path information and filter out information column
+            row_i_col_type = xlsx_utils.get_column_type_row_index(sheet)
+            path_rows = xlsx_utils.get_path_rows(sheet)
+            paths = []
+            for col_i, col in enumerate(sheet.iter_cols()):
+                col_type = col[row_i_col_type].value
+                path = [col[row_i].value for row_i in path_rows
+                        if col[row_i].value not in [None, '']]
+                if col_type == 'COL_TYPE':
+                    continue
+                paths.append((col_type, path, col_i, col))
+
+            # Check paths
+            for col_type, path, col_i, col in paths:
+                # No column type set
+                if col_type in [None, '']:
+                    if len(path) == 0:              # Likely a comment column
+                        # Check whether the column has any visible content
+                        content_in_column = False
+                        for cell in col:
+                            visible_content = ''.join(str(cell.value)).split()
+                            if cell.value is not None and visible_content != '':
+                                content_in_column = True
+                        # If yes - might be an error but is not forbidden, so warn
+                        if content_in_column:
+                            m = (f"Warning:\tIn column {_column_id_to_chars(col_i)} "
+                                 f"there is no column metadata set. This column "
+                                 f"will be ignored during parsing.")
+                            error_message.append(m)
+                        continue
+                    else:                    # Path is set but no column type
+                        only_warnings = False
+                        m = (f"ERROR:\t\tIn column {_column_id_to_chars(col_i)} "
+                             f"the column type is missing.")
+                        error_message.append(m)
+                        # No continue - even if column type is missing, we can check path
+                if len(path) == 0:           # Column type is set but no path
+                    only_warnings = False
+                    m = (f"ERROR:\t\tIn column {_column_id_to_chars(col_i)} "
+                         f"the path is missing.")
+                    error_message.append(m)
+                    continue
+                # Check path is in schema
+                try:
+                    subschema = xlsx_utils.get_subschema(path, self._schema)
+                    schema_type = subschema.get('type', None)
+                    if schema_type is None and 'enum' in subschema:
+                        schema_type = 'enum'
+                    if schema_type is None and 'anyOf' in subschema:
+                        schema_type = 'anyOf'
+                    if schema_type == 'array':      # Check item type instead
+                        schema_type = subschema.get('items', {}).get('type', None)
+                    if schema_type in ['object', 'array', None]:
+                        m = (f"Warning:\tIn column {_column_id_to_chars(col_i)} "
+                             f"the path may be incomplete.")
+                        error_message.append(m)
+                except KeyError as e:
+                    only_warnings = False
+                    m = (f"ERROR:\t\tIn column {_column_id_to_chars(col_i)} "
+                         f"parsing of the path '{'.'.join(path)}' fails "
+                         f"on the path component {str(e)}.\n\t\t\t"
+                         f"This likely means the path is incomplete or not "
+                         f"present in the schema.")
+                    error_message.append(m)
+
+            # Cleanup if no errors were found
+            if error_message[-1] == f"\nIn sheet {sheetname}:":
+                error_message.pop(-1)
+
+        # Determine whether error / warning / nothing should be raised
+        if error_message == ["There were errors during path validation:"]:
+            return
+        error_message = '\n'.join(error_message)
+        if only_warnings:
+            warn(error_message)
+        else:
+            raise jsonschema.ValidationError(error_message)
+
     def to_dict(self, validate: bool = False, collect_errors: bool = True) -> dict:
         """Convert the xlsx contents to a dict.
 
@@ -375,13 +466,6 @@ class XLSXConverter:
                             value = self._validate_and_convert(value, path)
                             _set_in_nested(mydict=data, path=path, value=value, prefix=parent, skip=1)
                         continue
-                    elif sheet.cell(col_type_row+1, col_idx+1).value is None:
-                        mess = (f"\nNo metadata configured for column "
-                                f"'{_column_id_to_chars(col_idx)}' in worksheet "
-                                f"'{sheet.title}'.\n")
-                        if mess not in warns:
-                            print(mess, file=sys.stderr)
-                            warns.append(mess)  # Prevent multiple instances of same warning
                 except (ValueError, KeyError, jsonschema.ValidationError) as e:
                     # Append error for entire column only once
                     if isinstance(e, KeyError) and 'column' in str(e):
@@ -460,10 +544,7 @@ class XLSXConverter:
         """
         if value is None:
             return value
-        try:
-            subschema = self._get_subschema(path)
-        except KeyError as e:
-            raise KeyError("There is no entry in the schema that corresponds to this column.") from e
+        subschema = self._get_subschema(path)
         # Array handling only if schema says it's an array.
         if subschema.get("type") == "array":
             array_type = subschema["items"]["type"]
diff --git a/unittests/table_json_conversion/data/simple_data_broken.xlsx b/unittests/table_json_conversion/data/simple_data_broken.xlsx
index c75da9faaefcb7610d84e16dd6ff17dcd055b008..1e61cf108365d8e825c97742924c8ffc7b9643c1 100644
GIT binary patch
delta 6665
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
ZpDQbZx!fw!OjqS5YpAHQwJ3n}001QmIWGVJ

delta 6895
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

diff --git a/unittests/table_json_conversion/data/simple_data_broken_paths_2.xlsx b/unittests/table_json_conversion/data/simple_data_broken_paths_2.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..14bdbaaa5bcdf3e5541e8cfbddc68505e35f11f2
GIT binary patch
literal 8838
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

literal 0
HcmV?d00001

diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index a34c046f..2a81cdc8 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -105,7 +105,8 @@ def test_missing_columns():
     with pytest.warns(UserWarning) as caught:
         convert.to_dict(xlsx=rfp("data/simple_data_missing.xlsx"),
                         schema=rfp("data/simple_schema.json"))
-    assert str(caught.pop().message) == "Missing column: Training.coach.given_name"
+    messages = {str(w.message) for w in caught}
+    assert "Missing column: Training.coach.given_name" in messages
     with pytest.warns(UserWarning) as caught:
         convert.to_dict(xlsx=rfp("data/multiple_choice_data_missing.xlsx"),
                         schema=rfp("data/multiple_choice_schema.json"))
@@ -122,12 +123,10 @@ def test_error_table():
         convert.to_dict(xlsx=rfp("data/simple_data_broken.xlsx"),
                         schema=rfp("data/simple_schema.json"))
     # Correct Errors
-    assert "Malformed metadata: Cannot parse paths in worksheet 'Person'." in str(caught.value)
     assert "'Not a num' is not of type 'number'" in str(caught.value)
     assert "'Yes a number?' is not of type 'number'" in str(caught.value)
     assert "1.5 is not of type 'integer'" in str(caught.value)
     assert "1.2345 is not of type 'integer'" in str(caught.value)
-    assert "'There is no entry in the schema" in str(caught.value)
     assert "'Not an enum' is not one of [" in str(caught.value)
     # Correct Locations
     matches = set()
@@ -144,9 +143,6 @@ def test_error_table():
         if "1.2345 is not of type 'integer'" in line:
             assert "K8" in line
             matches.add("K8")
-        if "'There is no entry in the schema" in line:
-            assert "Column M" in line
-            matches.add("Col M")
         if "'Not an enum' is not one of [" in line:
             assert "G8" in line
             matches.add("K8")
@@ -157,33 +153,62 @@ def test_error_table():
         if "'=NOT(TRUE())' is not of type 'boolean'" in line:
             assert "L10" in line
             matches.add("L10")
-    assert matches == {"J7", "J8", "K7", "K8", "Col M", "K8", "L9", "L10"}
+    assert matches == {"J7", "J8", "K7", "K8", "K8", "L9", "L10"}
 
     # No additional errors
-    assert str(caught.value).count("Malformed metadata: Cannot parse paths in worksheet") == 1
-    assert str(caught.value).count("There is no entry in the schema") == 1
     assert str(caught.value).count("is not one of") == 1
     assert str(caught.value).count("is not of type") == 6
-    # Check correct error message for completely unknown path
-    with pytest.raises(jsonschema.ValidationError) as caught:
-        convert.to_dict(xlsx=rfp("data/simple_data_broken_paths.xlsx"),
-                        schema=rfp("data/simple_schema.json"))
-    assert ("Malformed metadata: Cannot parse paths. Unknown path: 'There' in sheet 'Person'."
-            == str(caught.value))
 
 
-def test_additional_column():
+def test_malformed_paths():
     with pytest.raises(jsonschema.ValidationError) as caught:
-        convert.to_dict(xlsx=rfp("data/simple_data_broken.xlsx"),
+        convert.to_dict(xlsx=rfp("data/simple_data_broken_paths_2.xlsx"),
                         schema=rfp("data/simple_schema.json"))
-    # Correct Error
-    assert "no entry in the schema that corresponds to this column" in str(caught.value)
-    # Correct Location
-    for line in str(caught.value).split('\n'):
-        if "no entry in the schema that corresponds to this column" in line:
-            assert " M " in line
-    # No additional column errors
-    assert str(caught.value).count("no entry in the schema that corresponds to this column") == 1
+    message_lines = str(caught.value).lower().split('\n')
+    expected_errors = {
+        'person': {'c': "column type is missing",
+                   'd': "parsing of the path",
+                   'e': "path may be incomplete"},
+        'training': {'c': "path is missing",
+                     'd': "column type is missing",
+                     'e': "path may be incomplete",
+                     'f': "parsing of the path",
+                     'g': "path may be incomplete",
+                     'h': "parsing of the path",
+                     'i': "parsing of the path"},
+        'training.coach': {'f': "no column metadata set"}}
+    current_sheet = None
+    for line in message_lines:
+        if 'in sheet' in line:
+            current_sheet = line.replace('in sheet ', '').replace(':', '')
+            continue
+        if 'in column' in line:
+            for column, expected_error in expected_errors[current_sheet].items():
+                if f'in column {column}' in line:
+                    assert expected_error in line
+                    expected_errors[current_sheet].pop(column)
+                    break
+    for _, errors_left in expected_errors.items():
+        assert len(errors_left) == 0
+
+
+def test_empty_columns():
+    with pytest.warns(UserWarning) as caught:
+        try:
+            convert.to_dict(xlsx=rfp("data/simple_data_broken.xlsx"),
+                            schema=rfp("data/simple_schema.json"))
+        except jsonschema.ValidationError:
+            pass                  # Errors are checked in test_error_table
+    messages = {str(w.message).lower() for w in caught}
+    expected_warnings = {"column h": "no column metadata"}
+    for message in messages:
+        for column, warning in list(expected_warnings.items()):
+            if column in message:
+                assert warning in message
+                expected_warnings.pop(column)
+            else:
+                assert warning not in message
+    assert len(expected_warnings) == 0
 
 
 def test_faulty_foreign():
-- 
GitLab


From 22bfe2f225dc3b178ca92fc2096229b9060835e6 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Sun, 15 Dec 2024 20:02:13 +0100
Subject: [PATCH 086/106] MNT: Remove variables now unused

---
 src/caosadvancedtools/table_json_conversion/convert.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index 370dc85d..87427cf8 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -407,7 +407,6 @@ class XLSXConverter:
           If True, do not fail with unresolvable foreign definitions, but collect all errors.
         """
         row_type_column = xlsx_utils.get_row_type_column_index(sheet)
-        col_type_row = xlsx_utils.get_column_type_row_index(sheet)
         foreign_columns = xlsx_utils.get_foreign_key_columns(sheet)
         foreign_column_paths = {col.index: col.path for col in foreign_columns.values()}
         data_columns = xlsx_utils.get_data_columns(sheet)
@@ -430,7 +429,6 @@ class XLSXConverter:
         # entries: dict[str, list[SimpleNamespace]] = {}
 
         exceptions = []
-        warns = []
         col_names = {}
         for row_idx, row in enumerate(sheet.iter_rows(values_only=True)):
             # Skip non-data rows
-- 
GitLab


From fa86a04e8adbd9fcf19e573d309537a7881d0457 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 17:17:54 +0100
Subject: [PATCH 087/106] MNT: Ignore errors in unused files soon to be
 deprecated

---
 src/caosadvancedtools/cfood.py             | 15 ++++++++----
 src/caosadvancedtools/crawler.py           | 27 +++++++++++++---------
 src/caosadvancedtools/structure_mapping.py |  5 ++++
 3 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index 4647a576..9424134e 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -52,6 +52,11 @@ from linkahead.exceptions import (BadQueryError, EmptyUniqueQueryError,
 from .datamodel_problems import DataModelProblems
 from .guard import global_guard as guard
 
+# The pylint warnings triggered in this file are ignored, as this code is
+# assumed to be deprecated in the near future. Should this change, they need
+# to be reevaluated.
+
+
 ENTITIES = {}
 PROPERTIES = {}
 RECORDS = {}
@@ -183,7 +188,7 @@ class AbstractCFood(object, metaclass=ABCMeta):
         """
 
     @classmethod
-    def match_item(cls, item):
+    def match_item(cls, item):                # pylint: disable=unused-argument
         """ Matches an item found by the crawler against this class. Returns
         True if the item shall be treated by this class, i.e. if this class
         matches the item.
@@ -215,7 +220,7 @@ class AbstractCFood(object, metaclass=ABCMeta):
     # TODO looking for should `attach` the files itsself. This would allow to
     # group them right away and makes it unnecessary to check matches later
     # again.
-    def looking_for(self, item):
+    def looking_for(self, item):              # pylint: disable=unused-argument
         """
         returns True if item can be added to this CFood.
 
@@ -351,7 +356,7 @@ class AbstractFileCFood(AbstractCFood):
         raise NotImplementedError()
 
     @classmethod
-    def match_item(cls, path):
+    def match_item(cls, path):              # pylint: disable=arguments-renamed
         """ Matches the regular expression of this class against file names
 
         Parameters
@@ -365,7 +370,7 @@ class AbstractFileCFood(AbstractCFood):
     # TODO looking for should `attach` the files itsself. This would allow to
     # group them right away and makes it unnecessary to check matches later
     # again.
-    def looking_for(self, crawled_file):
+    def looking_for(self, crawled_file):    # pylint: disable=arguments-renamed
         """
         returns True if crawled_file can be added to this CFood.
 
@@ -744,7 +749,7 @@ def assure_has_property(entity, name, value, to_be_updated=None,
 
 
 def assure_property_is(entity, name, value, datatype=None, to_be_updated=None,
-                       force=False):
+                       force=False):     # pylint: disable=unused-argument
     """
     Checks whether `entity` has a Property `name` with the given value.
 
diff --git a/src/caosadvancedtools/crawler.py b/src/caosadvancedtools/crawler.py
index ad2536c2..7b66440f 100644
--- a/src/caosadvancedtools/crawler.py
+++ b/src/caosadvancedtools/crawler.py
@@ -59,6 +59,11 @@ from .serverside.helper import send_mail as main_send_mail
 from .suppressKnown import SuppressKnown
 from .utils import create_entity_link
 
+# The pylint warnings triggered in this file are ignored, as this code is
+# assumed to be deprecated in the near future. Should this change, they need
+# to be reevaluated.
+
+
 logger = logging.getLogger(__name__)
 
 
@@ -133,7 +138,7 @@ def apply_list_of_updates(to_be_updated, update_flags=None,
             )
             logger.debug(traceback.format_exc())
             logger.debug(e)
-    except Exception as e:
+    except Exception as e:             # pylint: disable=broad-exception-caught
         DataModelProblems.evaluate_exception(e)
 
 
@@ -222,7 +227,7 @@ class Crawler(object):
             new_cont = db.Container.from_xml(new)
             ids = []
             tmp = db.Container()
-            update_incomplete = False
+            update_incomplete = False         # pylint: disable=unused-variable
             # remove duplicate entities
             for el in new_cont:
                 if el.id not in ids:
@@ -231,13 +236,13 @@ class Crawler(object):
                 else:
                     update_incomplete = True
             new_cont = tmp
-            if new_cont[0].version:
+            if new_cont[0].version:                 # pylint: disable=no-member
                 valids = db.Container()
                 nonvalids = db.Container()
 
                 for ent in new_cont:
                     remote_ent = db.Entity(id=ent.id).retrieve()
-                    if ent.version == remote_ent.version:
+                    if ent.version == remote_ent.version:       # pylint: disable=no-member
                         valids.append(ent)
                     else:
                         update_incomplete = True
@@ -319,10 +324,10 @@ class Crawler(object):
                         logger.debug(e)
                         # TODO: Generally: in which cases should exceptions be raised? When is
                         # errors_occured set to True? The expected behavior must be documented.
-                    except Exception as e:
+                    except Exception as e:      # pylint: disable=broad-exception-caught
                         try:
                             DataModelProblems.evaluate_exception(e)
-                        except Exception:
+                        except Exception:       # pylint: disable=broad-exception-caught
                             pass
                         logger.debug("Failed during execution of {}!".format(
                             Cfood.__name__))
@@ -351,10 +356,10 @@ class Crawler(object):
                 logger.info("Cannot access {}. However, it might be needed for"
                             " the correct execution".format(e.filename))
                 remove_cfoods.append(cfood)
-            except Exception as e:
+            except Exception as e:     # pylint: disable=broad-exception-caught
                 try:
                     DataModelProblems.evaluate_exception(e)
-                except Exception:
+                except Exception:      # pylint: disable=broad-exception-caught
                     pass
                 logger.debug("Failed during execution of {}!".format(
                     cfood.__name__))
@@ -444,10 +449,10 @@ class Crawler(object):
             except DataInconsistencyError as e:
                 logger.debug(traceback.format_exc())
                 logger.debug(e)
-            except Exception as e:
+            except Exception as e:     # pylint: disable=broad-exception-caught
                 try:
                     DataModelProblems.evaluate_exception(e)
-                except Exception:
+                except Exception:      # pylint: disable=broad-exception-caught
                     pass
                 logger.info("Failed during execution of {}!".format(
                     cfood.__class__.__name__))
@@ -682,7 +687,7 @@ carefully and if the changes are ok, click on the following link:
                     guard.safe_insert(missing, unique=False,
                                       flags={"force-missing-obligatory": "ignore"})
                     inserted.append(ent)
-                except Exception as e:
+                except Exception as e:       # pylint: disable=broad-exception-caught
                     DataModelProblems.evaluate_exception(e)
         if len(existing) > 0:
             info = "Identified the following existing entities:\n"
diff --git a/src/caosadvancedtools/structure_mapping.py b/src/caosadvancedtools/structure_mapping.py
index bf446c2a..aac051a1 100644
--- a/src/caosadvancedtools/structure_mapping.py
+++ b/src/caosadvancedtools/structure_mapping.py
@@ -25,6 +25,10 @@ from linkahead.common.utils import uuid
 from .cfood import (assure_has_description, assure_has_parent,
                     assure_property_is)
 
+# The pylint warnings triggered in this file are ignored, as this code is
+# assumed to be deprecated in the near future. Should this change, they need
+# to be reevaluated.
+
 
 class EntityMapping(object):
     """
@@ -42,6 +46,7 @@ class EntityMapping(object):
         if target._cuid is None:
             target._cuid = str(uuid())
         self.to_existing[str(target._cuid)] = existing
+            target._cuid = str(uuid())       # pylint: disable=protected-access
         self.to_target[existing.id] = target
 
 
-- 
GitLab


From 65ca9fba590339629efb78b5c22ebbee432b5f1c Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 17:23:58 +0100
Subject: [PATCH 088/106] MNT: Use new Entity getters

---
 src/caosadvancedtools/models/data_model.py |  2 +-
 src/caosadvancedtools/structure_mapping.py | 13 ++++++-------
 2 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 92afb7eb..6bc91c22 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -296,7 +296,7 @@ class DataModel(dict):
             if parent.name in visited_parents:
                 continue
             visited_parents.add(parent.name)
-            parent_importance = importances.get(parent._flags.get("inheritance"), 999)
+            parent_importance = importances.get(parent.flags.get("inheritance"), 999)
             if parent.name in self:
                 deep_parent = self.get_deep(parent.name,  # visited_props=visited_props,
                                             visited_parents=visited_parents
diff --git a/src/caosadvancedtools/structure_mapping.py b/src/caosadvancedtools/structure_mapping.py
index aac051a1..aba47058 100644
--- a/src/caosadvancedtools/structure_mapping.py
+++ b/src/caosadvancedtools/structure_mapping.py
@@ -43,10 +43,9 @@ class EntityMapping(object):
         self.to_target = {}
 
     def add(self, target, existing):
-        if target._cuid is None:
-            target._cuid = str(uuid())
-        self.to_existing[str(target._cuid)] = existing
+        if target.cuid is None:
             target._cuid = str(uuid())       # pylint: disable=protected-access
+        self.to_existing[str(target.cuid)] = existing
         self.to_target[existing.id] = target
 
 
@@ -108,11 +107,11 @@ def update_structure(em, updating: db.Container, target_structure: db.Record):
         A record which may have references to other records.  Must be a DAG.
     """
 
-    if target_structure._cuid in em.to_existing:
+    if target_structure.cuid in em.to_existing:
         update_matched_entity(em,
                               updating,
                               target_structure,
-                              em.to_existing[target_structure._cuid])
+                              em.to_existing[target_structure.cuid])
 
     for prop in target_structure.get_properties():
         if prop.is_reference(server_retrieval=True):
@@ -139,8 +138,8 @@ def update_matched_entity(em, updating, target_record, existing_record):
         # check for remaining property types
 
         if isinstance(prop.value, db.Entity):
-            if prop.value._cuid in em.to_existing:
-                value = em.to_existing[prop.value._cuid].id
+            if prop.value.cuid in em.to_existing:
+                value = em.to_existing[prop.value.cuid].id
             else:
                 value = prop.value.id
         else:
-- 
GitLab


From b767a8c141de04906c4db5b695ae2e901b303545 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 17:27:08 +0100
Subject: [PATCH 089/106] MNT: Add 'from e' to all orphaned 'raise's

---
 src/caosadvancedtools/cfood.py               | 4 ++--
 src/caosadvancedtools/pandoc_header_tools.py | 2 +-
 src/caosadvancedtools/table_export.py        | 8 ++++----
 src/caosadvancedtools/table_importer.py      | 8 ++++----
 4 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index 9424134e..d2e30de5 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -693,7 +693,7 @@ def assure_has_property(entity, name, value, to_be_updated=None,
 
             try:
                 compare_time = datetime.fromisoformat(el.value)
-            except ValueError:
+            except ValueError as e:
                 # special case of wrong iso format
                 # time zone
                 tmp = el.value.split("+")
@@ -711,7 +711,7 @@ def assure_has_property(entity, name, value, to_be_updated=None,
                         ms = '.' + tmp[1] + '0'*(6-len(tmp[1]))
                     else:
                         raise ValueError(
-                            "invalid millisecond format in {}".format(el.value))
+                            "invalid millisecond format in {}".format(el.value)) from e
                 else:
                     ms = ""
                 tmp = tmp[0] + ms + tz_str
diff --git a/src/caosadvancedtools/pandoc_header_tools.py b/src/caosadvancedtools/pandoc_header_tools.py
index a6879565..fec27cdb 100644
--- a/src/caosadvancedtools/pandoc_header_tools.py
+++ b/src/caosadvancedtools/pandoc_header_tools.py
@@ -141,7 +141,7 @@ it is not at the beginning, it must be preceded by a blank line.
         try:
             yaml_part = yaml.load("\n".join(headerlines), Loader=yaml.BaseLoader)
         except yaml.scanner.ScannerError as e:
-            raise ParseErrorsInHeader(filename, e)
+            raise ParseErrorsInHeader(filename, e) from e
         # except yaml.error.MarkedYAMLError as e:
         #     raise NoValidHeader(filename)
         if not isinstance(yaml_part, dict):
diff --git a/src/caosadvancedtools/table_export.py b/src/caosadvancedtools/table_export.py
index 78830b19..1805419b 100644
--- a/src/caosadvancedtools/table_export.py
+++ b/src/caosadvancedtools/table_export.py
@@ -125,10 +125,10 @@ class BaseTableExporter(object):
             try:
                 with open(export_dict, encoding="utf-8") as tmp:
                     self.export_dict = json.load(tmp)
-            except Exception:
+            except Exception as e:
                 raise ValueError(
                     "export_dict must be either a dictionary"
-                    " or the path to a json file.")
+                    " or the path to a json file.") from e
         self.record = record
         self._check_sanity_of_export_dict()
         self.raise_error_if_missing = raise_error_if_missing
@@ -159,7 +159,7 @@ class BaseTableExporter(object):
                     logger.debug(exc)
                     errmssg = "Empty or invalid query '{}' for entry {}".format(
                         q, e)
-                    raise TableExportError(errmssg)
+                    raise TableExportError(errmssg) from exc
 
                 if val is not None:
                     self.info[e] = val
@@ -189,7 +189,7 @@ class BaseTableExporter(object):
                         errmssg += ", nor does record {} have a property of that name".format(
                             self.record.id)
                     errmssg += "."
-                    raise TableExportError(errmssg)
+                    raise TableExportError(errmssg) from exc
 
         if self.missing:
             errmssg = "The following mandatory entries are missing:\n"
diff --git a/src/caosadvancedtools/table_importer.py b/src/caosadvancedtools/table_importer.py
index b3977b39..b061092e 100755
--- a/src/caosadvancedtools/table_importer.py
+++ b/src/caosadvancedtools/table_importer.py
@@ -497,7 +497,7 @@ class XLSImporter(TableImporter):
                                                      str(e)),
                 extra={'identifier': str(filename),
                        'category': "inconsistency"})
-            raise DataInconsistencyError(*e.args)
+            raise DataInconsistencyError(*e.args) from e
 
         if len(xls_file.sheet_names) > 1:
             # Multiple sheets is the default now. Only show in debug
@@ -515,7 +515,7 @@ class XLSImporter(TableImporter):
                 "Cannot parse {}.\n{}".format(filename, e),
                 extra={'identifier': str(filename),
                        'category': "inconsistency"})
-            raise DataInconsistencyError(*e.args)
+            raise DataInconsistencyError(*e.args) from e
 
         df = self.check_dataframe(df, filename)
 
@@ -537,7 +537,7 @@ class CSVImporter(TableImporter):
                 "Cannot parse {}.\n{}".format(filename, ve),
                 extra={'identifier': str(filename),
                        'category': "inconsistency"})
-            raise DataInconsistencyError(*ve.args)
+            raise DataInconsistencyError(*ve.args) from ve
         except TypeError as te:
             # Iterate through the columns and rows to identify
             # problematic cells with wrong types.
@@ -577,7 +577,7 @@ class CSVImporter(TableImporter):
                 for err in error_list:
                     msg += f"  * column \"{err[0]}\": Expected \"{err[1]}\" but found \"{err[2]}\".\n"
                 msg += '\n'
-            raise DataInconsistencyError(msg)
+            raise DataInconsistencyError(msg) from te
 
         df = self.check_dataframe(df, filename)
 
-- 
GitLab


From 4c88ff22717e87856cfb3f195fe88e2a4812fd6a Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 17:29:42 +0100
Subject: [PATCH 090/106] MNT: Use specific exception types instead of
 Exception

---
 src/caosadvancedtools/cfood.py         | 3 ++-
 src/caosadvancedtools/models/parser.py | 8 +++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/caosadvancedtools/cfood.py b/src/caosadvancedtools/cfood.py
index d2e30de5..0eb82632 100644
--- a/src/caosadvancedtools/cfood.py
+++ b/src/caosadvancedtools/cfood.py
@@ -572,6 +572,7 @@ def assure_parents_are(entity, parents, to_be_updated=None,
     the new parents and the old ones are discarded.
 
     Note that parent matching occurs based on names.
+    If a parent does not have a name, a ValueError is raised.
 
     If the list to_be_updated is supplied, the entity is added to
     the list in order to indicate, that the entity `entity` should be updated.
@@ -586,7 +587,7 @@ def assure_parents_are(entity, parents, to_be_updated=None,
     for i, e in enumerate(parents):
         if isinstance(e, db.Entity):
             if e.name is None:
-                raise Exception("Entity should have name")
+                raise ValueError("Entity should have name")
         else:
             parents[i] = db.Entity(name=e)
 
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index b97e507e..52552bd3 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -286,6 +286,12 @@ debug : bool, optional
         existing_model : dict, optional
           An existing model to which the created model shall be added.
 
+        Raises
+        ------
+        ValueError
+          If model_dict is not a dict, model_dict["extern"] contains an
+          unknown entry, or there is an unknown entry in model_dict.
+
         Returns
         -------
         out : data_model.DataModel
@@ -320,7 +326,7 @@ debug : bool, optional
                         f"FIND {role} WITH name=\"{name}\"", unique=True)
                     break
             else:
-                raise Exception("Did not find {}".format(name))
+                raise ValueError("Did not find {}".format(name))
 
         ymlmodel.pop("extern")
 
-- 
GitLab


From b236f79a16567a5a6616cae28a0d61fe13257434 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 17:35:59 +0100
Subject: [PATCH 091/106] MNT: Ignore pylint error where the current code seems
 the best solution:

- In export_related.py export() we do not care which Exception is raised & need to continue
- In import_from_xml.py import_xml() the File from which the _checksum is deleted is created within this method
- In table_export.py BaseTableExporter.collect_information(), the method called by _call_find_function is not set, so determining which exceptions may be raised is difficult
- table_importer.py TSVImporter.read_file() only exists for backward compatibility
---
 src/caosadvancedtools/export_related.py  | 2 +-
 src/caosadvancedtools/import_from_xml.py | 2 +-
 src/caosadvancedtools/table_export.py    | 2 +-
 src/caosadvancedtools/table_importer.py  | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/caosadvancedtools/export_related.py b/src/caosadvancedtools/export_related.py
index 2114f388..c7f25c90 100755
--- a/src/caosadvancedtools/export_related.py
+++ b/src/caosadvancedtools/export_related.py
@@ -118,7 +118,7 @@ def export(cont, directory="."):
             try:
                 el.download(target)
                 print("Downloaded:", target)
-            except Exception:
+            except Exception:          # pylint: disable=broad-exception-caught
                 print("Failed download of:", target)
 
     invert_ids(cont)
diff --git a/src/caosadvancedtools/import_from_xml.py b/src/caosadvancedtools/import_from_xml.py
index 540091b0..7eeafa67 100755
--- a/src/caosadvancedtools/import_from_xml.py
+++ b/src/caosadvancedtools/import_from_xml.py
@@ -63,7 +63,7 @@ def import_xml(filename, rerun=False, interactive=True):
 
     for el in cont:
         if isinstance(el, db.File):
-            el._checksum = None
+            el._checksum = None              # pylint: disable=protected-access
             target = os.path.join("downloads", el.path[1:])
 
             if os.path.exists(target):
diff --git a/src/caosadvancedtools/table_export.py b/src/caosadvancedtools/table_export.py
index 1805419b..32191530 100644
--- a/src/caosadvancedtools/table_export.py
+++ b/src/caosadvancedtools/table_export.py
@@ -172,7 +172,7 @@ class BaseTableExporter(object):
                         self.info[e] = val
                     else:
                         self._append_missing(e, d)
-                except Exception as exc:
+                except Exception as exc:      # pylint: disable=broad-exception-caught
                     self._append_missing(e, d)
                     logger.error(exc)
             # last resort: check if record has e as property:
diff --git a/src/caosadvancedtools/table_importer.py b/src/caosadvancedtools/table_importer.py
index b061092e..c2cb0250 100755
--- a/src/caosadvancedtools/table_importer.py
+++ b/src/caosadvancedtools/table_importer.py
@@ -585,5 +585,5 @@ class CSVImporter(TableImporter):
 
 
 class TSVImporter(CSVImporter):
-    def read_file(self, filename, **kwargs):
+    def read_file(self, filename, **kwargs):      # pylint: disable=arguments-differ
         return super().read_file(filename, sep="\t", **kwargs)
-- 
GitLab


From 3c4042a48585ad4dc4277d73f0ea1e73c1fc0437 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 17:38:17 +0100
Subject: [PATCH 092/106] MNT: Fix assorted simple pylint errors

---
 src/caosadvancedtools/loadFiles.py           | 4 +---
 src/caosadvancedtools/pandoc_header_tools.py | 2 --
 src/caosadvancedtools/suppressKnown.py       | 1 +
 src/caosadvancedtools/utils.py               | 4 ++--
 4 files changed, 4 insertions(+), 7 deletions(-)

diff --git a/src/caosadvancedtools/loadFiles.py b/src/caosadvancedtools/loadFiles.py
index 56d50e4d..f29bdd9e 100755
--- a/src/caosadvancedtools/loadFiles.py
+++ b/src/caosadvancedtools/loadFiles.py
@@ -375,9 +375,7 @@ exclude is given preference over include.
     logger.addHandler(logging.StreamHandler(stream=sys.stdout))
     logger.setLevel(logging.INFO)
 
-    con = db.get_connection()
-    con.timeout = float(args.timeout)
-    con._login()
+    db.configure_connection(timeout=float(args.timeout))
 
     loadpath(
         path=args.path,
diff --git a/src/caosadvancedtools/pandoc_header_tools.py b/src/caosadvancedtools/pandoc_header_tools.py
index fec27cdb..a0191e5a 100644
--- a/src/caosadvancedtools/pandoc_header_tools.py
+++ b/src/caosadvancedtools/pandoc_header_tools.py
@@ -107,12 +107,10 @@ it is not at the beginning, it must be preceded by a blank line.
         textlines = f.readlines()
 
     state = 0
-    found_0 = -1
     found_1 = -1
     found_2 = -1
     for i, line in enumerate(textlines):
         if len(line) == 1 and state in {-1, 0}:
-            found_0 = i
             state = 0
             continue
         if line.rstrip() == "---" and state == 0:
diff --git a/src/caosadvancedtools/suppressKnown.py b/src/caosadvancedtools/suppressKnown.py
index 1b31de7e..aada4ef6 100644
--- a/src/caosadvancedtools/suppressKnown.py
+++ b/src/caosadvancedtools/suppressKnown.py
@@ -28,6 +28,7 @@ class SuppressKnown(logging.Filter):
     """
 
     def __init__(self, db_file=None):
+        super().__init__()
         if db_file:
             self.db_file = db_file
         else:
diff --git a/src/caosadvancedtools/utils.py b/src/caosadvancedtools/utils.py
index 43ecb3f2..f64900c0 100644
--- a/src/caosadvancedtools/utils.py
+++ b/src/caosadvancedtools/utils.py
@@ -27,7 +27,7 @@ import logging
 import os
 
 import linkahead as db
-from linkahead.exceptions import TransactionError
+from linkahead.exceptions import TransactionError, BadQueryError
 
 logger = logging.getLogger(__name__)
 
@@ -232,7 +232,7 @@ def find_records_that_reference_ids(referenced_ids, rt="", step_size=50):
                             [str(el) for el in subset]))
             exps = db.execute_query(q_string)
             record_ids.update([exp.id for exp in exps])
-        except Exception as e:
+        except (TransactionError, BadQueryError) as e:
             print(e)
 
         index += step_size
-- 
GitLab


From 34439a1b2103ff8531b743b6b9796c16feacaa37 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 17:39:27 +0100
Subject: [PATCH 093/106] MNT: Fix pandoc_header_tools.get_header() name
 collision

---
 CHANGELOG.md                                 |  2 ++
 src/caosadvancedtools/pandoc_header_tools.py | 37 ++++++++++----------
 2 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6a118d98..825358c2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
   - `h5` instead of `h5-crawler`
   - `dev`, `doc`, `test` and `all` are new, they install the dependencies for developing, testing,
     documentation and everything.
+- The `pandoc_header_tools.get_header()` parameter `add_header` has been renamed to `add_header_to_file`
+  to resolve a name collision.
 
 ### Deprecated ###
 
diff --git a/src/caosadvancedtools/pandoc_header_tools.py b/src/caosadvancedtools/pandoc_header_tools.py
index a0191e5a..88cdbc19 100644
--- a/src/caosadvancedtools/pandoc_header_tools.py
+++ b/src/caosadvancedtools/pandoc_header_tools.py
@@ -68,31 +68,30 @@ description:
 """
 
 
-def get_header(filename, add_header=False):
-    """Open an md file identified by filename and read out the yaml
-header.
+def get_header(filename, add_header_to_file=False):
+    """Open an md file identified by filename and read out the yaml header.
 
-filename can also be a folder. In this case folder/README.md will be used for
-getting the header.
+    filename can also be a folder. In this case folder/README.md will be used
+    for getting the header.
 
-If a header is found a tuple is returned: (first yaml header line index, last+1
-yaml header line index, header)
+    If a header is found a tuple is returned: (first yaml header line index,
+    last+1 yaml header line index, header)
 
-Otherwise, if `add_header` is True, a header is added and the function is called
-again.
+    Otherwise, if `add_header_to_file` is True, a header is added and the
+    function is called again.
 
-The header is normalized in the following way:
+    The header is normalized in the following way:
 
-- If the value to a key is a string, a list with that string as only element is
-  returned.
+    - If the value to a key is a string, a list with that string as only
+      element is returned.
 
-From https://pandoc.org/MANUAL.html:
-
-A YAML metadata block is a valid YAML object, delimited by a line of three
-hyphens (---) at the top and a line of three hyphens (---) or three dots (...)
-at the bottom. A YAML metadata block may occur anywhere in the document, but if
-it is not at the beginning, it must be preceded by a blank line.
+    From https://pandoc.org/MANUAL.html:
 
+    A YAML metadata block is a valid YAML object, delimited by a line of three
+    hyphens (---) at the top and a line of three hyphens (---) or three
+    dots (...) at the bottom. A YAML metadata block may occur anywhere in the
+    document, but if it is not at the beginning, it must be preceded by a blank
+    line.
     """
 
     if os.path.isdir(filename):
@@ -146,7 +145,7 @@ it is not at the beginning, it must be preceded by a blank line.
             raise NoValidHeader(filename)
         return (found_1, found_2, clean_header(yaml_part))
 
-    if not add_header:
+    if not add_header_to_file:
         raise NoValidHeader(filename)
     else:
         print("Adding header in: {fn}".format(fn=filename))
-- 
GitLab


From d4d914d180906cdac85903315acd380e09d09872 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 17:53:48 +0100
Subject: [PATCH 094/106] STY: Fix style errors

---
 src/caosadvancedtools/table_converter.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/caosadvancedtools/table_converter.py b/src/caosadvancedtools/table_converter.py
index 16f27476..19e6d85f 100644
--- a/src/caosadvancedtools/table_converter.py
+++ b/src/caosadvancedtools/table_converter.py
@@ -112,4 +112,4 @@ def main():
 
 
 if __name__ == "__main__":
-    main()
\ No newline at end of file
+    main()
-- 
GitLab


From ee8e58919028c07a805621cb4d4ba883c73e708a Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Mon, 16 Dec 2024 18:27:16 +0100
Subject: [PATCH 095/106] DEV: Update 'make lint' fail threshold

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index c53f7013..911ea7a7 100644
--- a/Makefile
+++ b/Makefile
@@ -41,5 +41,5 @@ style:
 .PHONY: style
 
 lint:
-	pylint --unsafe-load-any-extension=y --fail-under=9.72 -d R,C --ignore=swagger_client src/caosadvancedtools
+	pylint --unsafe-load-any-extension=y --fail-under=9.99 -d R,C --ignore=swagger_client src/caosadvancedtools
 .PHONY: lint
-- 
GitLab


From 655cb000da2f41c5ce0fa6df999551904e3b0275 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 17 Dec 2024 10:22:16 +0100
Subject: [PATCH 096/106] CI: Remove python 3.8 tests from pipeline

---
 .gitlab-ci.yml | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5f9d7fe4..f3000856 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -135,21 +135,15 @@ unittest_py311:
     - python3 -c "import linkahead; print('LinkAhead Version:', linkahead.__version__)"
     - tox
 
-unittest_py38:
+unittest_py39:
   tags: [docker]
   stage: unittest
-  image: python:3.8
+  image: python:3.9
   script: &python_test_script
     - pip install --break-system-packages git+https://gitlab.indiscale.com/caosdb/src/caosdb-pylib.git@dev
     - pip install --break-system-packages .[all]
     - pytest --cov=caosadvancedtools unittests
 
-unittest_py39:
-  tags: [docker]
-  stage: unittest
-  image: python:3.9
-  script: *python_test_script
-
 unittest_py310:
   tags: [docker]
   stage: unittest
-- 
GitLab


From 8429c402362fae8ce7132fe7d62702eddc570ec3 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 17 Dec 2024 10:29:57 +0100
Subject: [PATCH 097/106] MNT: Remove support for Python 3.8

---
 CHANGELOG.md | 1 +
 setup.py     | 2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6a118d98..8b46b11a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Labfolder converter. It was broken anyway, not used by anyone we know and there were no automated
   tests.  For the time being, it lives on in the `f-labfolder-converter` branch, [issue 67](https://gitlab.com/linkahead/linkahead-advanced-user-tools/-/issues/67) is
   there to coordinate resurrections efforts if someone needs it..
+- Support for Python 3.8
 
 ### Fixed ###
 
diff --git a/setup.py b/setup.py
index 732bbf61..c7dd54a9 100755
--- a/setup.py
+++ b/setup.py
@@ -154,7 +154,7 @@ def setup_package():
         long_description_content_type="text/markdown",
         author='Henrik tom Wörden',
         author_email='h.tomwoerden@indiscale.com',
-        python_requires='>=3.8',
+        python_requires='>=3.9',
         install_requires=["linkahead>=0.13.1",
                           "jsonref",
                           "jsonschema[format]>=4.4.0",
-- 
GitLab


From aacf902d7ff60bd5a56d63dbda44b234fb96c9c9 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 17 Dec 2024 11:50:32 +0100
Subject: [PATCH 098/106] DEV: Remove 'make lint' fail threshold

---
 Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index 911ea7a7..1ce56f5b 100644
--- a/Makefile
+++ b/Makefile
@@ -41,5 +41,5 @@ style:
 .PHONY: style
 
 lint:
-	pylint --unsafe-load-any-extension=y --fail-under=9.99 -d R,C --ignore=swagger_client src/caosadvancedtools
+	pylint --unsafe-load-any-extension=y -d R,C --ignore=swagger_client src/caosadvancedtools
 .PHONY: lint
-- 
GitLab


From a6d5d230a56455080398811ce1e0433239a14fb9 Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 17 Dec 2024 11:51:12 +0100
Subject: [PATCH 099/106] MNT: Rename list comprehension variable to unconfuse
 linter

---
 src/caosadvancedtools/models/data_model.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 6bc91c22..ce4b7702 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -305,7 +305,7 @@ class DataModel(dict):
                 for prop in deep_parent.properties:
                     importance = importances[deep_parent.get_importance(prop.name)]
                     if (importance <= parent_importance
-                            and prop.name not in [prop.name for prop in entity.properties]):
+                            and prop.name not in [p.name for p in entity.properties]):
                         entity.add_property(prop)
             else:
                 print(f"Referenced parent \"{parent.name}\" not found in data model.")
-- 
GitLab


From 297530b11ea9bd35ba6385360cbda641d15fe7fc Mon Sep 17 00:00:00 2001
From: "i.nueske" <i.nueske@indiscale.com>
Date: Tue, 17 Dec 2024 12:03:15 +0100
Subject: [PATCH 100/106] MNT: Ignore pylint errors for which issues have been
 created.

---
 src/caosadvancedtools/models/data_model.py             | 4 +++-
 src/caosadvancedtools/models/parser.py                 | 4 +++-
 src/caosadvancedtools/table_json_conversion/convert.py | 4 +++-
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index ce4b7702..ea864bde 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -251,7 +251,9 @@ class DataModel(dict):
 
                 for par in entity.get_parents():
                     if par.name.lower() == valid_e.name.lower():
-                        par._wrap(valid_e)
+                        # ToDo: Fix https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/140
+                        #       and remove pylint disable, or close and leave
+                        par._wrap(valid_e)              # pylint: disable=protected-access
 
     def collect_entities(self):
         """ Collects all entities: explicitly defined RecordTypes and
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 52552bd3..8a18f15c 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -748,7 +748,9 @@ class JsonSchemaParser(Parser):
 
         return self._create_model_from_dict(model_dict, top_level_recordtype=top_level_recordtype)
 
-    def _create_model_from_dict(self, model_dict: [dict, List[dict]], top_level_recordtype: bool = True):
+    # ToDo: Fix https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/139
+    #       and remove pylint disable
+    def _create_model_from_dict(self, model_dict: [dict, List[dict]], top_level_recordtype: bool = True):  # pylint: disable=arguments-renamed
         """Parse a dictionary and return the Datamodel created from it.
 
         The dictionary was typically created from the model definition in a json schema file.
diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index b416fc29..e4a8fe5c 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -628,8 +628,10 @@ def _set_in_nested(mydict: dict, path: list, value: Any, prefix: list = [], skip
     return mydict
 
 
+# ToDo: Fix https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/138
+#       and remove pylint disable
 def to_dict(xlsx: Union[str, BinaryIO], schema: Union[dict, str, TextIO],
-            validate: bool = None, strict: bool = False) -> dict:
+            validate: bool = None, strict: bool = False) -> dict:   # pylint: disable=unused-argument
     """Convert the xlsx contents to a dict, it must follow a schema.
 
     Parameters
-- 
GitLab


From aa56cc0c12f9b3c188673cd028915afc05ecb3c5 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Fri, 10 Jan 2025 15:43:18 +0100
Subject: [PATCH 101/106] MAINT: simply set the parent ID when syncing the
 datamodel.

---
 src/caosadvancedtools/models/data_model.py | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index ea864bde..4d941993 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -251,9 +251,7 @@ class DataModel(dict):
 
                 for par in entity.get_parents():
                     if par.name.lower() == valid_e.name.lower():
-                        # ToDo: Fix https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/140
-                        #       and remove pylint disable, or close and leave
-                        par._wrap(valid_e)              # pylint: disable=protected-access
+                        par.id = valid_e.id
 
     def collect_entities(self):
         """ Collects all entities: explicitly defined RecordTypes and
-- 
GitLab


From fef11372cc389f03764d2f33e137118131782394 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Fri, 10 Jan 2025 16:18:15 +0100
Subject: [PATCH 102/106] MAINT: Adding NotImplementedError if validate=True

---
 src/caosadvancedtools/table_json_conversion/convert.py | 6 +++++-
 unittests/table_json_conversion/test_read_xlsx.py      | 4 +++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/src/caosadvancedtools/table_json_conversion/convert.py b/src/caosadvancedtools/table_json_conversion/convert.py
index aabdf827..4b02fa46 100644
--- a/src/caosadvancedtools/table_json_conversion/convert.py
+++ b/src/caosadvancedtools/table_json_conversion/convert.py
@@ -710,7 +710,7 @@ def _set_in_nested(mydict: dict, path: list, value: Any, prefix: list = [], skip
 # ToDo: Fix https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/138
 #       and remove pylint disable
 def to_dict(xlsx: Union[str, BinaryIO], schema: Union[dict, str, TextIO],
-            validate: bool = None, strict: bool = False) -> dict:   # pylint: disable=unused-argument
+            validate: Optional[bool] = None, strict: bool = False) -> dict:
     """Convert the xlsx contents to a dict, it must follow a schema.
 
     Parameters
@@ -733,5 +733,9 @@ def to_dict(xlsx: Union[str, BinaryIO], schema: Union[dict, str, TextIO],
     out: dict
       A dict representing the JSON with the extracted data.
     """
+    if validate:
+        raise NotImplementedError(
+            "For input validation implement "
+            "https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/138")
     converter = XLSXConverter(xlsx, schema, strict=strict)
     return converter.to_dict()
diff --git a/unittests/table_json_conversion/test_read_xlsx.py b/unittests/table_json_conversion/test_read_xlsx.py
index 2a81cdc8..ff32c6b1 100644
--- a/unittests/table_json_conversion/test_read_xlsx.py
+++ b/unittests/table_json_conversion/test_read_xlsx.py
@@ -43,7 +43,7 @@ def rfp(*pathcomponents):
 
 def convert_and_compare(xlsx_file: str, schema_file: str, known_good_file: str,
                         known_good_data: Optional[dict] = None, strict: bool = False,
-                        validate: bool = True) -> dict:
+                        validate: bool = False) -> dict:
     """Convert an XLSX file and compare to a known result.
 
 Exactly one of ``known_good_file`` and ``known_good_data`` should be non-empty.
@@ -53,6 +53,8 @@ Returns
 json: dict
   The result of the conversion.
     """
+    # FIXME Set default "validate" back to True, after implementation of
+    # https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/138
     result = convert.to_dict(xlsx=xlsx_file, schema=schema_file, validate=validate)
     if known_good_file:
         with open(known_good_file, encoding="utf-8") as myfile:
-- 
GitLab


From 522ec28e55b390dbdbbebbb1dd139949638571da Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Fri, 10 Jan 2025 16:35:39 +0100
Subject: [PATCH 103/106] STY: Some more small linter and style fixes.

---
 src/caosadvancedtools/models/data_model.py |    5 +-
 src/caosadvancedtools/models/parser.py     | 2118 ++++++++++----------
 unittests/test_json_schema_model_parser.py |    4 +-
 3 files changed, 1064 insertions(+), 1063 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 4d941993..beae2d78 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -27,7 +27,7 @@ from copy import deepcopy
 # actually
 # [deprecated](https://docs.python.org/3/library/typing.html#typing.List), so
 # remove this, when we drop support for old Python versions.
-from typing import List
+from typing import List, Optional
 
 import linkahead as db
 import linkahead.common.models as models
@@ -267,7 +267,8 @@ class DataModel(dict):
 
         return list(all_ents.values())
 
-    def get_deep(self, name: str, visited_props: dict = None, visited_parents: set = None):
+    def get_deep(self, name: str, visited_props: Optional[dict] = None,
+                 visited_parents: Optional[set] = None):
         """Attempt to resolve references for the given ``name``.
 
         The returned entity has all the properties it inherits from its ancestry and all properties
diff --git a/src/caosadvancedtools/models/parser.py b/src/caosadvancedtools/models/parser.py
index 8a18f15c..40734617 100644
--- a/src/caosadvancedtools/models/parser.py
+++ b/src/caosadvancedtools/models/parser.py
@@ -1,1059 +1,1059 @@
-# This file is a part of the LinkAhead project.
-#
-# Copyright (C) 2023 IndiScale GmbH <info@indiscale.com>
-# Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
-# Copyright (C) 2023 Daniel Hornung <d.hornung@indiscale.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program 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 Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <https://www.gnu.org/licenses/>.
-
-"""
-This module (and script) provides methods to read a DataModel from a YAML file.
-
-If a file name is passed to parse_model_from_yaml it is parsed and a DataModel
-is created. The yaml file needs to be structured in a certain way which will be
-described in the following.
-
-The file should only contain a dictionary. The keys are the names of
-RecordTypes or Properties. The values are again dictionaries describing the
-entities. This information can be defined via the keys listed in KEYWORDS.
-Notably, properties can be given in a dictionary under the xxxx_properties keys
-and will be added with the respective importance. These properties can be
-RecordTypes or Properties and can be defined right there.
-Every Property or RecordType only needs to be defined once anywhere. When it is
-not defined, simply the name can be supplied with no value.
-Parents can be provided under the 'inherit_from_xxxx' keywords. The value needs
-to be a list with the names. Here, NO NEW entities can be defined.
-"""
-import argparse
-import sys
-from typing import List, Optional
-
-import jsonref
-import jsonschema
-import linkahead as db
-import yaml
-from linkahead.common.datatype import get_list_datatype
-
-from .data_model import LINKAHEAD_INTERNAL_PROPERTIES, DataModel
-
-# Keywords which are allowed in data model descriptions.
-KEYWORDS = ["importance",
-            "datatype",  # for example TEXT, INTEGER or REFERENCE
-            "unit",
-            "description",
-            "recommended_properties",
-            "obligatory_properties",
-            "suggested_properties",
-            "inherit_from_recommended",
-            "inherit_from_suggested",
-            "inherit_from_obligatory",
-            "role",
-            "value",
-            ]
-
-# TODO: check whether it's really ignored
-# These KEYWORDS are not forbidden as properties, but merely ignored.
-KEYWORDS_IGNORED = [
-    "unit",
-]
-
-JSON_SCHEMA_ATOMIC_TYPES = [
-    "string",
-    "boolean",
-    "integer",
-    "number",
-    "null"
-]
-
-
-# Taken from https://stackoverflow.com/a/53647080, CC-BY-SA, 2018 by
-# https://stackoverflow.com/users/2572431/augurar
-
-
-class SafeLineLoader(yaml.SafeLoader):
-    """Load a line and keep meta-information.
-
-    Note that this will add a `__line__` element to all the dicts.
-    """
-
-    def construct_mapping(self, node, deep=False):
-        """Overwritung the parent method."""
-        mapping = super().construct_mapping(node, deep=deep)
-        # Add 1 so line numbering starts at 1
-        mapping['__line__'] = node.start_mark.line + 1
-
-        return mapping
-# End of https://stackoverflow.com/a/53647080
-
-
-class TwiceDefinedException(Exception):
-    def __init__(self, name):
-        super().__init__("The Entity '{}' was defined multiple times!".format(
-            name))
-
-
-class YamlDefinitionError(RuntimeError):
-    def __init__(self, line, template=None):
-        if not template:
-            template = "Error in YAML definition in line {}."
-        super().__init__(template.format(line))
-
-
-class JsonSchemaDefinitionError(RuntimeError):
-    # @author Florian Spreckelsen
-    # @date 2022-02-17
-    # @review Daniel Hornung 2022-02-18
-    def __init__(self, msg):
-        super().__init__(msg)
-
-
-def parse_model_from_yaml(filename, existing_model: Optional[dict] = None, debug: bool = False):
-    """Parse a data model from a YAML file.
-
-This is a convenience function if the Parser object is not needed, it calls
-``Parser.parse_model_from_yaml(...)`` internally.
-
-
-Parameters
-----------
-
-existing_model : dict, optional
-  An existing model to which the created model shall be added.
-
-debug : bool, optional
-  If True, turn on miscellaneous debugging.  Default is False.
-    """
-    parser = Parser(debug=debug)
-
-    return parser.parse_model_from_yaml(filename, existing_model=existing_model)
-
-
-def parse_model_from_string(string, existing_model: Optional[dict] = None, debug: bool = False):
-    """Parse a data model from a YAML string
-
-This is a convenience function if the Parser object is not needed, it calls
-``Parser.parse_model_from_string(...)`` internally.
-
-Parameters
-----------
-
-existing_model : dict, optional
-  An existing model to which the created model shall be added.
-
-debug : bool, optional
-  If True, turn on miscellaneous debugging.  Default is False.
-    """
-    parser = Parser(debug=debug)
-
-    return parser.parse_model_from_string(string, existing_model=existing_model)
-
-
-def parse_model_from_json_schema(
-        filename: str,
-        top_level_recordtype: bool = True,
-        types_for_missing_array_items: dict = None,
-        ignore_unspecified_array_items: bool = False,
-        existing_model: Optional[dict] = None
-):
-    """Return a datamodel parsed from a json schema definition.
-
-    Parameters
-    ----------
-
-    filename : str
-        The path of the json schema file that is to be parsed
-
-    top_level_recordtype : bool, optional
-        Whether there is a record type defined at the top level of the
-        schema. Default is true.
-
-    types_for_missing_array_items : dict, optional
-        dictionary containing fall-back types for json entries with `type:
-        array` but without `items` specification. Default is an empty dict.
-
-    ignore_unspecified_array_items : bool, optional
-        Whether to ignore `type: array` entries the type of which is not
-        specified by their `items` property or given in
-        `types_for_missing_array_items`. An error is raised if they are not
-        ignored. Default is False.
-
-    existing_model : dict, optional
-        An existing model to which the created model shall be added.  Not implemented yet.
-
-    Returns
-    -------
-
-    out : Datamodel
-        The datamodel generated from the input schema which then can be used for
-        synchronizing with LinkAhead.
-
-    Note
-    ----
-    This is an experimental feature, see ``JsonSchemaParser`` for information
-    about the limitations of the current implementation.
-
-    """
-    if types_for_missing_array_items is None:
-        types_for_missing_array_items = {}
-
-    if existing_model is not None:
-        raise NotImplementedError("Adding to an existing model is not implemented yet.")
-
-    # @author Florian Spreckelsen
-    # @date 2022-02-17
-    # @review Timm Fitschen 2023-05-25
-    parser = JsonSchemaParser(types_for_missing_array_items, ignore_unspecified_array_items)
-
-    return parser.parse_model_from_json_schema(filename, top_level_recordtype)
-
-
-class Parser(object):
-    def __init__(self, debug: bool = False):
-        """Initialize an empty parser object and initialize the dictionary of entities and the list of
-        treated elements.
-
-Parameters
-----------
-
-debug : bool, optional
-  If True, turn on miscellaneous debugging.  Default is False.
-
-        """
-        self.model = {}
-        self.treated = []
-        self.debug = debug
-
-    def parse_model_from_yaml(self, filename, existing_model: Optional[dict] = None):
-        """Create and return a data model from the given file.
-
-        Parameters
-        ----------
-        filename : str
-          The path to the YAML file.
-
-        existing_model : dict, optional
-          An existing model to which the created model shall be added.
-
-        Returns
-        -------
-        out : data_model.DataModel
-          The created DataModel
-        """
-        with open(filename, 'r', encoding="utf-8") as outfile:
-            ymlmodel = yaml.load(outfile, Loader=SafeLineLoader)
-
-        return self._create_model_from_dict(ymlmodel, existing_model=existing_model)
-
-    def parse_model_from_string(self, string, existing_model: Optional[dict] = None):
-        """Create and return a data model from the given YAML string.
-
-        Parameters
-        ----------
-        string : str
-          The YAML string.
-
-        existing_model : dict, optional
-          An existing model to which the created model shall be added.
-
-        Returns
-        -------
-        out : data_model.DataModel
-          The created DataModel
-        """
-        ymlmodel = yaml.load(string, Loader=SafeLineLoader)
-
-        return self._create_model_from_dict(ymlmodel, existing_model=existing_model)
-
-    def _create_model_from_dict(self, ymlmodel, existing_model: Optional[dict] = None):
-        """Create and return a data model out of the YAML dict `ymlmodel`.
-
-        Parameters
-        ----------
-        ymlmodel : dict
-          The dictionary parsed from a YAML file.
-
-        existing_model : dict, optional
-          An existing model to which the created model shall be added.
-
-        Raises
-        ------
-        ValueError
-          If model_dict is not a dict, model_dict["extern"] contains an
-          unknown entry, or there is an unknown entry in model_dict.
-
-        Returns
-        -------
-        out : data_model.DataModel
-          The created DataModel
-        """
-
-        if not isinstance(ymlmodel, dict):
-            raise ValueError("Yaml file should only contain one dictionary!")
-
-        if existing_model is not None:
-            self.model.update(existing_model)
-
-        # Extern keyword:
-        # The extern keyword can be used to include Properties and RecordTypes
-        # from existing LinkAhead datamodels into the current model.
-        # Any name included in the list specified by the extern keyword
-        # will be used in queries to retrieve a property or (if no property exists)
-        # a record type with the name of the element.
-        # The retrieved entity will be added to the model.
-        # If no entity with that name is found an exception is raised.
-
-        if "extern" not in ymlmodel:
-            ymlmodel["extern"] = []
-
-        for name in ymlmodel["extern"]:
-            if name in LINKAHEAD_INTERNAL_PROPERTIES:
-                self.model[name] = db.Property(name=name).retrieve()
-                continue
-            for role in ("Property", "RecordType", "Record", "File"):
-                if db.execute_query("COUNT {} \"{}\"".format(role, name)) > 0:
-                    self.model[name] = db.execute_query(
-                        f"FIND {role} WITH name=\"{name}\"", unique=True)
-                    break
-            else:
-                raise ValueError("Did not find {}".format(name))
-
-        ymlmodel.pop("extern")
-
-        # add all names to ymlmodel; initialize properties
-
-        for name, entity in ymlmodel.items():
-            self._add_entity_to_model(name, entity)
-        # initialize recordtypes
-        self._set_recordtypes()
-        self._check_and_convert_datatypes()
-
-        for name, entity in ymlmodel.items():
-            try:
-                self._treat_entity(name, entity, line=ymlmodel["__line__"])
-            except ValueError as err:
-                err_str = err.args[0].replace("invalid keyword:",
-                                              f"invalid keyword in line {entity['__line__']}:", 1)
-                raise ValueError(err_str, *err.args[1:]) from err
-
-#         Update properties that are part of record types:
-#         e.g. add their datatypes, units etc..
-#         Otherwise comparison of existing models and the parsed model become difficult.
-        for name, ent in self.model.items():
-            if not isinstance(ent, db.RecordType):
-                continue
-            props = ent.get_properties()
-            for prop in props:
-                if prop.name in self.model:
-                    model_prop = self.model[prop.name]
-                    # The information must be missing, we don't want to overwrite it accidentally:
-                    if prop.datatype is None:
-                        if isinstance(model_prop, db.RecordType):
-                            prop.datatype = model_prop.name
-                        else:
-                            prop.datatype = model_prop.datatype
-                    # TODO: Data type overwrite is allowed here (because
-                    #       of lists), but this might change in the future.
-                    # elif prop.datatype != model_prop.datatype:
-                    #     raise RuntimeError("datatype must not be set, here. This is probably a bug.")
-                    if prop.unit is None:
-                        # No unit for plain reference properties
-                        if not isinstance(model_prop, db.RecordType):
-                            prop.unit = model_prop.unit
-                    if prop.description is None:
-                        prop.description = model_prop.description
-
-        return DataModel(self.model.values())
-
-    @staticmethod
-    def _stringify(name, context=None):
-        """Make a string out of `name`.
-
-        Warnings are emitted for difficult values of `name`.
-
-        Parameters
-        ----------
-        name :
-          The value to be converted to a string.
-
-        context : obj
-          Will be printed in the case of warnings.
-
-        Returns
-        -------
-        out : str
-          If `name` was a string, return it. Else return str(`name`).
-        """
-
-        if name is None:
-            print("WARNING: Name of this context is None: {}".format(context),
-                  file=sys.stderr)
-
-        if not isinstance(name, str):
-            name = str(name)
-
-        return name
-
-    def _add_entity_to_model(self, name, definition):
-        """ adds names of Properties and RecordTypes to the model dictionary
-
-        Properties are also initialized.
-
-        name is the key of the yaml element and definition the value.
-        """
-
-        if name == "__line__":
-            return
-        name = self._stringify(name)
-
-        if name not in self.model:
-            self.model[name] = None
-
-        if definition is None:
-            return
-
-        if (self.model[name] is None and isinstance(definition, dict)
-                # is it a property
-                and "datatype" in definition
-                # but not simply an RT of the model
-                and not (get_list_datatype(definition["datatype"]) == name and
-                         get_list_datatype(definition["datatype"]) in self.model)):
-
-            # and create the new property
-            self.model[name] = db.Property(name=name,
-                                           datatype=definition["datatype"])
-        elif (self.model[name] is None and isinstance(definition, dict)
-              and "role" in definition):
-            if definition["role"] == "RecordType":
-                self.model[name] = db.RecordType(name=name)
-            elif definition["role"] == "Record":
-                self.model[name] = db.Record(name=name)
-            elif definition["role"] == "File":
-                # TODO(fspreck) Implement files at some later point in time
-                raise NotImplementedError(
-                    "The definition of file objects is not yet implemented.")
-
-                # self.model[name] = db.File(name=name)
-            elif definition["role"] == "Property":
-                self.model[name] = db.Property(name=name)
-            else:
-                raise RuntimeError("Unknown role {} in definition of entity.".format(
-                    definition["role"]))
-
-        # for setting values of properties directly:
-        if not isinstance(definition, dict):
-            return
-
-        # add other definitions recursively
-        for prop_type in ["recommended_properties",
-                          "suggested_properties", "obligatory_properties"]:
-
-            if prop_type in definition:
-                # Empty property mapping should be allowed.
-
-                if definition[prop_type] is None:
-                    definition[prop_type] = {}
-                try:
-                    for n, e in definition[prop_type].items():
-                        if n == "__line__":
-                            continue
-                        self._add_entity_to_model(n, e)
-                except AttributeError as ate:
-                    if ate.args[0].endswith("'items'"):
-                        line = definition["__line__"]
-
-                        if isinstance(definition[prop_type], list):
-                            line = definition[prop_type][0]["__line__"]
-                        raise YamlDefinitionError(line) from None
-                    raise
-
-        if self.debug and self.model[name] is not None:
-            self.model[name].__line__ = definition["__line__"]
-
-    def _add_to_recordtype(self, ent_name, props, importance):
-        """Add properties to a RecordType.
-
-        Parameters
-        ----------
-        ent_name : str
-          The name of the entity to which the properties shall be added.
-
-        props : dict [str -> dict or :doc:`Entity`]
-          The properties, indexed by their names.  Properties may be given as :doc:`Entity` objects
-          or as dictionaries.
-
-        importance
-          The importance as used in :doc:`Entity.add_property`.
-
-        Returns
-        -------
-        None
-
-        """
-
-        for n, e in props.items():
-
-            if n in KEYWORDS:
-                if n in KEYWORDS_IGNORED:
-                    continue
-                raise YamlDefinitionError("Unexpected keyword in line {}: {}".format(
-                    props["__line__"], n))
-
-            if n == "__line__":
-                continue
-            n = self._stringify(n)
-
-            if isinstance(e, dict):
-                if "datatype" in e and get_list_datatype(e["datatype"]) is not None:
-                    # Reuse the existing datatype for lists.
-                    datatype = db.LIST(get_list_datatype(e["datatype"]))
-                else:
-                    # Ignore a possible e["datatype"] here if it's not a list
-                    # since it has been treated in the definition of the
-                    # property (entity) already
-                    datatype = None
-                if "value" in e:
-                    value = e["value"]
-                else:
-                    value = None
-
-            else:
-                value = e
-                datatype = None
-
-            self.model[ent_name].add_property(name=n,
-                                              value=value,
-                                              importance=importance,
-                                              datatype=datatype)
-
-    def _inherit(self, name, prop, inheritance):
-        if not isinstance(prop, list):
-            if isinstance(prop, str):
-                raise YamlDefinitionError(
-                    f"Parents must be a list but is given as string: {name} > {prop}")
-            raise YamlDefinitionError("Parents must be a list, error in line {}".format(
-                prop["__line__"]))
-
-        for pname in prop:
-            if not isinstance(pname, str):
-                raise ValueError("Only provide the names of parents.")
-            self.model[name].add_parent(name=pname, inheritance=inheritance)
-
-    def _treat_entity(self, name, definition, line=None):
-        """Parse the definition and the information to the entity."""
-
-        if name == "__line__":
-            return
-        name = self._stringify(name)
-
-        try:
-            if definition is None:
-                return
-
-            # for setting values of properties directly:
-            if not isinstance(definition, dict):
-                return
-
-            # These definition items must be handled even for list props.
-            for prop_name, prop in definition.items():
-                if prop_name == "description":
-                    self.model[name].description = prop
-
-            # For lists, everything else is not needed at this level.
-            if ("datatype" in definition and definition["datatype"].startswith("LIST")):
-                return
-
-            if name in self.treated:
-                raise TwiceDefinedException(name)
-
-            # for reducing a little bit of code duplication:
-            importance_dict = {
-                "recommended_properties": db.RECOMMENDED,
-                "obligatory_properties": db.OBLIGATORY,
-                "suggested_properties": db.SUGGESTED
-                }
-
-            for prop_name, prop in definition.items():
-                if prop_name == "__line__":
-                    continue
-                line = definition["__line__"]
-
-                if prop_name == "unit":
-                    self.model[name].unit = prop
-
-                elif prop_name == "value":
-                    self.model[name].value = prop
-
-                elif prop_name == "description":
-                    # Handled above
-                    continue
-
-                elif prop_name in importance_dict:
-                    for imp_name, imp_val in importance_dict.items():
-                        if prop_name == imp_name:
-                            self._add_to_recordtype(
-                                name, prop, importance=imp_val)
-
-                            for n, e in prop.items():
-                                self._treat_entity(n, e)
-
-                # datatype is already set
-                elif prop_name == "datatype":
-                    continue
-
-                # role has already been used
-                elif prop_name == "role":
-                    continue
-
-                elif prop_name == "inherit_from_obligatory":
-                    self._inherit(name, prop, db.OBLIGATORY)
-                elif prop_name == "inherit_from_recommended":
-                    self._inherit(name, prop, db.RECOMMENDED)
-                elif prop_name == "inherit_from_suggested":
-                    self._inherit(name, prop, db.SUGGESTED)
-
-                else:
-                    raise ValueError("invalid keyword: {}".format(prop_name))
-        except AttributeError as ate:
-            if ate.args[0].endswith("'items'"):
-                raise YamlDefinitionError(line) from None
-        except Exception as e:
-            print("Error in treating: "+name)
-            raise e
-        self.treated.append(name)
-
-    def _check_and_convert_datatypes(self):
-        """ checks if datatype is valid.
-        datatype of properties is simply initialized with string. Here, we
-        iterate over properties and check whether it is a base datatype of a
-        name that was defined in the model (or extern part)
-
-        the string representations are replaced with linkahead objects
-
-        """
-
-        for _, value in self.model.items():
-
-            if isinstance(value, db.Property):
-                dtype = value.datatype
-                is_list = False
-
-                if get_list_datatype(dtype) is not None:
-                    dtype = get_list_datatype(dtype)
-                    is_list = True
-
-                dtype_name = dtype
-                if not isinstance(dtype_name, str):
-                    dtype_name = dtype.name
-
-                if dtype_name in self.model:
-                    if is_list:
-                        value.datatype = db.LIST(self.model[dtype_name])
-                    else:
-                        value.datatype = self.model[dtype_name]
-
-                    continue
-
-                if dtype in [db.DOUBLE,
-                             db.REFERENCE,
-                             db.TEXT,
-                             db.DATETIME,
-                             db.INTEGER,
-                             db.FILE,
-                             db.BOOLEAN]:
-
-                    if is_list:
-                        value.datatype = db.LIST(db.__getattribute__(  # pylint: disable=no-member
-                            dtype))
-                    else:
-                        value.datatype = db.__getattribute__(  # pylint: disable=no-member
-                            dtype)
-
-                    continue
-
-                raise ValueError("Property {} has an unknown datatype: {}".format(
-                    value.name, dtype_name))
-
-    def _set_recordtypes(self):
-        """ properties are defined in first iteration; set remaining as RTs """
-
-        for key, value in self.model.items():
-            if value is None:
-                self.model[key] = db.RecordType(name=key)
-
-
-class JsonSchemaParser(Parser):
-    """Extends the yaml parser to read in datamodels defined in a json schema.
-
-    **EXPERIMENTAL:** While this class can already be used to create data models
-    from basic json schemas, there are the following limitations and missing
-    features:
-
-    * Due to limitations of json-schema itself, we currently do not support
-      inheritance in the imported data models
-    * The same goes for suggested properties of RecordTypes
-    * Already defined RecordTypes and (scalar) Properties can't be re-used as
-      list properties
-    * Reference properties that are different from the referenced RT. (Although
-      this is possible for list of references)
-    * Values
-    * Roles
-    * The extern keyword from the yaml parser
-
-    """
-    # @author Florian Spreckelsen
-    # @date 2022-02-17
-    # @review Timm Fitschen 2023-05-25
-
-    def __init__(self, types_for_missing_array_items=None,
-                 ignore_unspecified_array_items=False):
-        super().__init__()
-        if types_for_missing_array_items is None:
-            types_for_missing_array_items = {}
-        self.types_for_missing_array_items = types_for_missing_array_items
-        self.ignore_unspecified_array_items = ignore_unspecified_array_items
-
-    def parse_model_from_json_schema(self, filename: str, top_level_recordtype: bool = True):
-        """Return a datamodel created from the definition in the json schema in
-        `filename`.
-
-        Parameters
-        ----------
-        filename : str
-            The path to the json-schema file containing the datamodel definition
-        top_level_recordtype : bool, optional
-            Whether there is a record type defined at the top level of the
-            schema. Default is true.
-
-        Returns
-        -------
-        out : data_model.DataModel
-            The created DataModel
-        """
-        # @author Florian Spreckelsen
-        # @date 2022-02-17
-        # @review Timm Fitschen 2023-05-25
-        with open(filename, 'r', encoding="utf-8") as schema_file:
-            model_dict = jsonref.load(schema_file)
-
-        return self._create_model_from_dict(model_dict, top_level_recordtype=top_level_recordtype)
-
-    # ToDo: Fix https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/139
-    #       and remove pylint disable
-    def _create_model_from_dict(self, model_dict: [dict, List[dict]], top_level_recordtype: bool = True):  # pylint: disable=arguments-renamed
-        """Parse a dictionary and return the Datamodel created from it.
-
-        The dictionary was typically created from the model definition in a json schema file.
-
-        Parameters
-        ----------
-        model_dict : dict or list[dict]
-            One or several dictionaries read in from a json-schema file
-        top_level_recordtype : bool, optional
-            Whether there is a record type defined at the top level of the
-            schema. Default is true.
-
-        Returns
-        -------
-        our : data_model.DataModel
-            The datamodel defined in `model_dict`
-        """
-        # @review Timm Fitschen 2023-05-25
-        if isinstance(model_dict, dict):
-            model_dict = [model_dict]
-
-        for ii, elt in enumerate(model_dict):
-            try:
-                jsonschema.Draft202012Validator.check_schema(elt)
-            except jsonschema.SchemaError as err:
-                key = elt["title"] if "title" in elt else f"element {ii}"
-                raise JsonSchemaDefinitionError(
-                    f"Json Schema error in {key}:\n{str(err)}") from err
-
-            if top_level_recordtype:
-                if "title" not in elt:
-                    raise JsonSchemaDefinitionError(
-                        f"Object {ii+1} is lacking the `title` key word")
-                if "type" not in elt:
-                    raise JsonSchemaDefinitionError(
-                        f"Object {ii+1} is lacking the `type` key word")
-                # Check if this is a valid Json Schema
-                name = self._stringify(elt["title"], context=elt)
-                self._treat_element(elt, name)
-            elif "properties" in elt or "patternProperties" in elt:
-                # No top-level type but there are entities
-                if "properties" in elt:
-                    for key, prop in elt["properties"].items():
-                        name = self._get_name_from_property(key, prop)
-                        self._treat_element(prop, name)
-                if "patternProperties" in elt:
-                    # See also treatment in ``_treat_record_type``. Since here,
-                    # there is no top-level RT we use the prefix `__Pattern`,
-                    # i.e., the resulting Record Types will be called
-                    # `__PatternElement`.
-                    self._treat_pattern_properties(
-                        elt["patternProperties"], name_prefix="__Pattern")
-            else:
-                # Neither RecordType itself, nor further properties in schema,
-                # so nothing to do here. Maybe add something in the future.
-                continue
-
-        return DataModel(self.model.values())
-
-    def _get_name_from_property(self, key: str, prop: dict):
-        # @review Timm Fitschen 2023-05-25
-        if "title" in prop:
-            name = self._stringify(prop["title"])
-        else:
-            name = self._stringify(key)
-
-        return name
-
-    def _get_atomic_datatype(self, elt):
-        # @review Timm Fitschen 2023-05-25
-        if elt["type"] == "string":
-            if "format" in elt and elt["format"] in ["date", "date-time"]:
-                return db.DATETIME
-            else:
-                return db.TEXT
-        elif elt["type"] == "integer":
-            return db.INTEGER
-        elif elt["type"] == "number":
-            return db.DOUBLE
-        elif elt["type"] == "boolean":
-            return db.BOOLEAN
-        elif elt["type"] == "null":
-            # This could be any datatype since a valid json will never have a
-            # value in a null property. We use TEXT for convenience.
-            return db.TEXT
-        else:
-            raise JsonSchemaDefinitionError(f"Unkown atomic type in {elt}.")
-
-    def _treat_element(self, elt: dict, name: str):
-        # @review Timm Fitschen 2023-05-25
-        force_list = False
-        if name in self.model:
-            return self.model[name], force_list
-        if "type" not in elt:
-            # Each element must have a specific type
-            raise JsonSchemaDefinitionError(
-                f"`type` is missing in element {name}.")
-        if name == "name":
-            # This is identified with the LinkAhead name property as long as the
-            # type is correct.
-            if not elt["type"] == "string" and "string" not in elt["type"]:
-                raise JsonSchemaDefinitionError(
-                    "The 'name' property must be string-typed, otherwise it cannot "
-                    "be identified with LinkAhead's name property."
-                )
-            return None, force_list
-        # LinkAhead suports null for all types, so in the very special case of
-        # `"type": ["null", "<other_type>"]`, only consider the other type:
-        if isinstance(elt["type"], list) and len(elt["type"]) == 2 and "null" in elt["type"]:
-            elt["type"].remove("null")
-            elt["type"] = elt["type"][0]
-        if "enum" in elt:
-            ent = self._treat_enum(elt, name)
-        elif elt["type"] in JSON_SCHEMA_ATOMIC_TYPES:
-            ent = db.Property(
-                name=name, datatype=self._get_atomic_datatype(elt))
-        elif elt["type"] == "object":
-            ent = self._treat_record_type(elt, name)
-        elif elt["type"] == "array":
-            ent, force_list = self._treat_list(elt, name)
-        else:
-            raise NotImplementedError(
-                f"Cannot parse items of type '{elt['type']}' (yet).")
-        if "description" in elt and ent.description is None:
-            # There is a description and it hasn't been set by another
-            # treat_something function
-            ent.description = elt["description"]
-
-        if ent is not None:
-            self.model[name] = ent
-        return ent, force_list
-
-    def _treat_record_type(self, elt: dict, name: str):
-        # @review Timm Fitschen 2023-05-25
-        rt = db.RecordType(name=name)
-        if "required" in elt:
-            required = elt["required"]
-        else:
-            required = []
-        if "properties" in elt:
-            for key, prop in elt["properties"].items():
-                name = self._get_name_from_property(key, prop)
-                prop_ent, force_list = self._treat_element(prop, name)
-                if prop_ent is None:
-                    # Nothing to be appended since the property has to be
-                    # treated specially.
-                    continue
-                importance = db.OBLIGATORY if key in required else db.RECOMMENDED
-                if not force_list:
-                    rt.add_property(prop_ent, importance=importance)
-                else:
-                    # Special case of rt used as a list property
-                    rt.add_property(prop_ent, importance=importance,
-                                    datatype=db.LIST(prop_ent))
-
-        if "patternProperties" in elt:
-
-            pattern_property_rts = self._treat_pattern_properties(
-                elt["patternProperties"], name_prefix=name)
-            for ppr in pattern_property_rts:
-                # add reference to pattern property type. These can never be
-                # obligatory since pattern properties cannot be required in the
-                # original schema (since their actual names are not known a
-                # priori).
-                rt.add_property(ppr)
-
-        if "description" in elt:
-            rt.description = elt["description"]
-        return rt
-
-    def _treat_enum(self, elt: dict, name: str):
-        # @review Timm Fitschen 2022-02-30
-        if "type" in elt and elt["type"] == "integer":
-            raise NotImplementedError(
-                "Integer-enums are not allowd until "
-                "https://gitlab.indiscale.com/caosdb/src/caosdb-server/-/issues/224 "
-                "has been fixed."
-            )
-        rt = db.RecordType(name=name)
-        for enum_elt in elt["enum"]:
-            rec = db.Record(name=self._stringify(enum_elt))
-            rec.add_parent(rt)
-            self.model[enum_elt] = rec
-
-        return rt
-
-    def _treat_list(self, elt: dict, name: str):
-        # @review Timm Fitschen 2023-05-25
-
-        if "items" not in elt and name not in self.types_for_missing_array_items:
-            if self.ignore_unspecified_array_items:
-                return None, False
-            raise JsonSchemaDefinitionError(
-                f"The definition of the list items is missing in {elt}.")
-        if "items" in elt:
-            items = elt["items"]
-            if "enum" in items:
-                return self._treat_enum(items, name), True
-            if items["type"] in JSON_SCHEMA_ATOMIC_TYPES:
-                datatype = db.LIST(self._get_atomic_datatype(items))
-                return db.Property(name=name, datatype=datatype), False
-            if items["type"] == "object":
-                if "title" not in items or self._stringify(items["title"]) == name:
-                    # Property is RecordType
-                    return self._treat_record_type(items, name), True
-                else:
-                    # List property will be an entity of its own with a name
-                    # different from the referenced RT
-                    ref_rt = self._treat_record_type(
-                        items, self._stringify(items["title"]))
-                    self.model[ref_rt.name] = ref_rt
-                    return db.Property(name=name, datatype=db.LIST(ref_rt)), False
-        else:
-            # Use predefined type:
-            datatype = db.LIST(self.types_for_missing_array_items[name])
-            return db.Property(name=name, datatype=datatype), False
-
-    def _get_pattern_prop(self):
-        # @review Timm Fitschen 2023-05-25
-        if "__pattern_property_pattern_property" in self.model:
-            return self.model["__pattern_property_pattern_property"]
-        pp = db.Property(name="__matched_pattern", datatype=db.TEXT)
-        self.model["__pattern_property_pattern_property"] = pp
-        return pp
-
-    def _treat_pattern_properties(self, pattern_elements, name_prefix=""):
-        """Special Treatment for pattern properties: A RecordType is created for
-        each pattern property. In case of a `type: object` PatternProperty, the
-        remaining properties of the JSON entry are appended to the new
-        RecordType; in case of an atomic type PatternProperty, a single value
-        Property is added to the RecordType.
-
-        Raises
-        ------
-        NotImplementedError
-            In case of patternProperties with non-object, non-atomic type, e.g.,
-            array.
-
-        """
-        # @review Timm Fitschen 2023-05-25
-        num_patterns = len(pattern_elements)
-        pattern_prop = self._get_pattern_prop()
-        returns = []
-        for ii, (key, element) in enumerate(pattern_elements.items()):
-            if "title" not in element:
-                name_suffix = f"_{ii+1}" if num_patterns > 1 else ""
-                name = name_prefix + "Entry" + name_suffix
-            else:
-                name = element["title"]
-            if element["type"] == "object":
-                # simple, is already an object, so can be treated like any other
-                # record type.
-                pattern_type = self._treat_record_type(element, name)
-            elif element["type"] in JSON_SCHEMA_ATOMIC_TYPES:
-                # create a property that stores the actual value of the pattern
-                # property.
-                propname = f"{name}_value"
-                prop = db.Property(name=propname, datatype=self._get_atomic_datatype(element))
-                self.model[propname] = prop
-                pattern_type = db.RecordType(name=name)
-                pattern_type.add_property(prop)
-            else:
-                raise NotImplementedError(
-                    "Pattern properties are currently only supported for types " +
-                    ", ".join(JSON_SCHEMA_ATOMIC_TYPES) + ", and object.")
-
-            # Add pattern property and description
-            pattern_type.add_property(pattern_prop, importance=db.OBLIGATORY)
-            if pattern_type.description:
-                pattern_type.description += f"\n\npattern: {key}"
-            else:
-                pattern_type.description = f"pattern: {key}"
-
-            self.model[name] = pattern_type
-            returns.append(pattern_type)
-
-        return returns
-
-
-def main():
-    parser = argparse.ArgumentParser(description=__doc__,
-                                     formatter_class=argparse.RawTextHelpFormatter)
-    parser.add_argument("data_model",
-                        help="Path name of the data model file (yaml or json) to be used.")
-    parser.add_argument("--sync", action="store_true",
-                        help="Whether or not to sync the data model with the server.")
-    parser.add_argument("--noquestion", action="store_true",
-                        help="Whether or not to ask questions during synchronization.")
-    parser.add_argument("--print", action="store_true",
-                        help="Whether or not to print the data model.")
-
-    args = parser.parse_args()
-    if args.data_model.endswith(".json"):
-        model = parse_model_from_json_schema(args.data_model)
-    elif args.data_model.endswith(".yml") or args.data_model.endswith(".yaml"):
-        model = parse_model_from_yaml(args.data_model)
-    else:
-        raise RuntimeError(f"Unknown file ending of data model: {args.data_model}")
-    if args.print:
-        print(model)
-    if args.sync:
-        model.sync_data_model(noquestion=args.noquestion)
-
-
-if __name__ == "__main__":
-    main()
+# This file is a part of the LinkAhead project.
+#
+# Copyright (C) 2023 IndiScale GmbH <info@indiscale.com>
+# Copyright (C) 2022 Florian Spreckelsen <f.spreckelsen@indiscale.com>
+# Copyright (C) 2023 Daniel Hornung <d.hornung@indiscale.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+"""
+This module (and script) provides methods to read a DataModel from a YAML file.
+
+If a file name is passed to parse_model_from_yaml it is parsed and a DataModel
+is created. The yaml file needs to be structured in a certain way which will be
+described in the following.
+
+The file should only contain a dictionary. The keys are the names of
+RecordTypes or Properties. The values are again dictionaries describing the
+entities. This information can be defined via the keys listed in KEYWORDS.
+Notably, properties can be given in a dictionary under the xxxx_properties keys
+and will be added with the respective importance. These properties can be
+RecordTypes or Properties and can be defined right there.
+Every Property or RecordType only needs to be defined once anywhere. When it is
+not defined, simply the name can be supplied with no value.
+Parents can be provided under the 'inherit_from_xxxx' keywords. The value needs
+to be a list with the names. Here, NO NEW entities can be defined.
+"""
+import argparse
+import sys
+from typing import List, Optional, Union
+
+import jsonref
+import jsonschema
+import linkahead as db
+import yaml
+from linkahead.common.datatype import get_list_datatype
+
+from .data_model import LINKAHEAD_INTERNAL_PROPERTIES, DataModel
+
+# Keywords which are allowed in data model descriptions.
+KEYWORDS = ["importance",
+            "datatype",  # for example TEXT, INTEGER or REFERENCE
+            "unit",
+            "description",
+            "recommended_properties",
+            "obligatory_properties",
+            "suggested_properties",
+            "inherit_from_recommended",
+            "inherit_from_suggested",
+            "inherit_from_obligatory",
+            "role",
+            "value",
+            ]
+
+# TODO: check whether it's really ignored
+# These KEYWORDS are not forbidden as properties, but merely ignored.
+KEYWORDS_IGNORED = [
+    "unit",
+]
+
+JSON_SCHEMA_ATOMIC_TYPES = [
+    "string",
+    "boolean",
+    "integer",
+    "number",
+    "null"
+]
+
+
+# Taken from https://stackoverflow.com/a/53647080, CC-BY-SA, 2018 by
+# https://stackoverflow.com/users/2572431/augurar
+
+
+class SafeLineLoader(yaml.SafeLoader):
+    """Load a line and keep meta-information.
+
+    Note that this will add a `__line__` element to all the dicts.
+    """
+
+    def construct_mapping(self, node, deep=False):
+        """Overwritung the parent method."""
+        mapping = super().construct_mapping(node, deep=deep)
+        # Add 1 so line numbering starts at 1
+        mapping['__line__'] = node.start_mark.line + 1
+
+        return mapping
+# End of https://stackoverflow.com/a/53647080
+
+
+class TwiceDefinedException(Exception):
+    def __init__(self, name):
+        super().__init__("The Entity '{}' was defined multiple times!".format(
+            name))
+
+
+class YamlDefinitionError(RuntimeError):
+    def __init__(self, line, template=None):
+        if not template:
+            template = "Error in YAML definition in line {}."
+        super().__init__(template.format(line))
+
+
+class JsonSchemaDefinitionError(RuntimeError):
+    # @author Florian Spreckelsen
+    # @date 2022-02-17
+    # @review Daniel Hornung 2022-02-18
+    def __init__(self, msg):
+        super().__init__(msg)
+
+
+def parse_model_from_yaml(filename, existing_model: Optional[dict] = None, debug: bool = False):
+    """Parse a data model from a YAML file.
+
+This is a convenience function if the Parser object is not needed, it calls
+``Parser.parse_model_from_yaml(...)`` internally.
+
+
+Parameters
+----------
+
+existing_model : dict, optional
+  An existing model to which the created model shall be added.
+
+debug : bool, optional
+  If True, turn on miscellaneous debugging.  Default is False.
+    """
+    parser = Parser(debug=debug)
+
+    return parser.parse_model_from_yaml(filename, existing_model=existing_model)
+
+
+def parse_model_from_string(string, existing_model: Optional[dict] = None, debug: bool = False):
+    """Parse a data model from a YAML string
+
+This is a convenience function if the Parser object is not needed, it calls
+``Parser.parse_model_from_string(...)`` internally.
+
+Parameters
+----------
+
+existing_model : dict, optional
+  An existing model to which the created model shall be added.
+
+debug : bool, optional
+  If True, turn on miscellaneous debugging.  Default is False.
+    """
+    parser = Parser(debug=debug)
+
+    return parser.parse_model_from_string(string, existing_model=existing_model)
+
+
+def parse_model_from_json_schema(
+        filename: str,
+        top_level_recordtype: bool = True,
+        types_for_missing_array_items: Optional[dict] = None,
+        ignore_unspecified_array_items: bool = False,
+        existing_model: Optional[dict] = None
+):
+    """Return a datamodel parsed from a json schema definition.
+
+    Parameters
+    ----------
+
+    filename : str
+        The path of the json schema file that is to be parsed
+
+    top_level_recordtype : bool, optional
+        Whether there is a record type defined at the top level of the
+        schema. Default is true.
+
+    types_for_missing_array_items : dict, optional
+        dictionary containing fall-back types for json entries with `type:
+        array` but without `items` specification. Default is an empty dict.
+
+    ignore_unspecified_array_items : bool, optional
+        Whether to ignore `type: array` entries the type of which is not
+        specified by their `items` property or given in
+        `types_for_missing_array_items`. An error is raised if they are not
+        ignored. Default is False.
+
+    existing_model : dict, optional
+        An existing model to which the created model shall be added.  Not implemented yet.
+
+    Returns
+    -------
+
+    out : Datamodel
+        The datamodel generated from the input schema which then can be used for
+        synchronizing with LinkAhead.
+
+    Note
+    ----
+    This is an experimental feature, see ``JsonSchemaParser`` for information
+    about the limitations of the current implementation.
+
+    """
+    if types_for_missing_array_items is None:
+        types_for_missing_array_items = {}
+
+    if existing_model is not None:
+        raise NotImplementedError("Adding to an existing model is not implemented yet.")
+
+    # @author Florian Spreckelsen
+    # @date 2022-02-17
+    # @review Timm Fitschen 2023-05-25
+    parser = JsonSchemaParser(types_for_missing_array_items, ignore_unspecified_array_items)
+
+    return parser.parse_model_from_json_schema(filename, top_level_recordtype)
+
+
+class Parser(object):
+    def __init__(self, debug: bool = False):
+        """Initialize an empty parser object and initialize the dictionary of entities and the list of
+        treated elements.
+
+Parameters
+----------
+
+debug : bool, optional
+  If True, turn on miscellaneous debugging.  Default is False.
+
+        """
+        self.model = {}
+        self.treated = []
+        self.debug = debug
+
+    def parse_model_from_yaml(self, filename, existing_model: Optional[dict] = None):
+        """Create and return a data model from the given file.
+
+        Parameters
+        ----------
+        filename : str
+          The path to the YAML file.
+
+        existing_model : dict, optional
+          An existing model to which the created model shall be added.
+
+        Returns
+        -------
+        out : data_model.DataModel
+          The created DataModel
+        """
+        with open(filename, 'r', encoding="utf-8") as outfile:
+            ymlmodel = yaml.load(outfile, Loader=SafeLineLoader)
+
+        return self._create_model_from_dict(ymlmodel, existing_model=existing_model)
+
+    def parse_model_from_string(self, string, existing_model: Optional[dict] = None):
+        """Create and return a data model from the given YAML string.
+
+        Parameters
+        ----------
+        string : str
+          The YAML string.
+
+        existing_model : dict, optional
+          An existing model to which the created model shall be added.
+
+        Returns
+        -------
+        out : data_model.DataModel
+          The created DataModel
+        """
+        ymlmodel = yaml.load(string, Loader=SafeLineLoader)
+
+        return self._create_model_from_dict(ymlmodel, existing_model=existing_model)
+
+    def _create_model_from_dict(self, ymlmodel, existing_model: Optional[dict] = None):
+        """Create and return a data model out of the YAML dict `ymlmodel`.
+
+        Parameters
+        ----------
+        ymlmodel : dict
+          The dictionary parsed from a YAML file.
+
+        existing_model : dict, optional
+          An existing model to which the created model shall be added.
+
+        Raises
+        ------
+        ValueError
+          If model_dict is not a dict, model_dict["extern"] contains an
+          unknown entry, or there is an unknown entry in model_dict.
+
+        Returns
+        -------
+        out : data_model.DataModel
+          The created DataModel
+        """
+
+        if not isinstance(ymlmodel, dict):
+            raise ValueError("Yaml file should only contain one dictionary!")
+
+        if existing_model is not None:
+            self.model.update(existing_model)
+
+        # Extern keyword:
+        # The extern keyword can be used to include Properties and RecordTypes
+        # from existing LinkAhead datamodels into the current model.
+        # Any name included in the list specified by the extern keyword
+        # will be used in queries to retrieve a property or (if no property exists)
+        # a record type with the name of the element.
+        # The retrieved entity will be added to the model.
+        # If no entity with that name is found an exception is raised.
+
+        if "extern" not in ymlmodel:
+            ymlmodel["extern"] = []
+
+        for name in ymlmodel["extern"]:
+            if name in LINKAHEAD_INTERNAL_PROPERTIES:
+                self.model[name] = db.Property(name=name).retrieve()
+                continue
+            for role in ("Property", "RecordType", "Record", "File"):
+                if db.execute_query("COUNT {} \"{}\"".format(role, name)) > 0:
+                    self.model[name] = db.execute_query(
+                        f"FIND {role} WITH name=\"{name}\"", unique=True)
+                    break
+            else:
+                raise ValueError("Did not find {}".format(name))
+
+        ymlmodel.pop("extern")
+
+        # add all names to ymlmodel; initialize properties
+
+        for name, entity in ymlmodel.items():
+            self._add_entity_to_model(name, entity)
+        # initialize recordtypes
+        self._set_recordtypes()
+        self._check_and_convert_datatypes()
+
+        for name, entity in ymlmodel.items():
+            try:
+                self._treat_entity(name, entity, line=ymlmodel["__line__"])
+            except ValueError as err:
+                err_str = err.args[0].replace("invalid keyword:",
+                                              f"invalid keyword in line {entity['__line__']}:", 1)
+                raise ValueError(err_str, *err.args[1:]) from err
+
+#         Update properties that are part of record types:
+#         e.g. add their datatypes, units etc..
+#         Otherwise comparison of existing models and the parsed model become difficult.
+        for name, ent in self.model.items():
+            if not isinstance(ent, db.RecordType):
+                continue
+            props = ent.get_properties()
+            for prop in props:
+                if prop.name in self.model:
+                    model_prop = self.model[prop.name]
+                    # The information must be missing, we don't want to overwrite it accidentally:
+                    if prop.datatype is None:
+                        if isinstance(model_prop, db.RecordType):
+                            prop.datatype = model_prop.name
+                        else:
+                            prop.datatype = model_prop.datatype
+                    # TODO: Data type overwrite is allowed here (because
+                    #       of lists), but this might change in the future.
+                    # elif prop.datatype != model_prop.datatype:
+                    #     raise RuntimeError("datatype must not be set, here. This is probably a bug.")
+                    if prop.unit is None:
+                        # No unit for plain reference properties
+                        if not isinstance(model_prop, db.RecordType):
+                            prop.unit = model_prop.unit
+                    if prop.description is None:
+                        prop.description = model_prop.description
+
+        return DataModel(self.model.values())
+
+    @staticmethod
+    def _stringify(name, context=None):
+        """Make a string out of `name`.
+
+        Warnings are emitted for difficult values of `name`.
+
+        Parameters
+        ----------
+        name :
+          The value to be converted to a string.
+
+        context : obj
+          Will be printed in the case of warnings.
+
+        Returns
+        -------
+        out : str
+          If `name` was a string, return it. Else return str(`name`).
+        """
+
+        if name is None:
+            print("WARNING: Name of this context is None: {}".format(context),
+                  file=sys.stderr)
+
+        if not isinstance(name, str):
+            name = str(name)
+
+        return name
+
+    def _add_entity_to_model(self, name, definition):
+        """ adds names of Properties and RecordTypes to the model dictionary
+
+        Properties are also initialized.
+
+        name is the key of the yaml element and definition the value.
+        """
+
+        if name == "__line__":
+            return
+        name = self._stringify(name)
+
+        if name not in self.model:
+            self.model[name] = None
+
+        if definition is None:
+            return
+
+        if (self.model[name] is None and isinstance(definition, dict)
+                # is it a property
+                and "datatype" in definition
+                # but not simply an RT of the model
+                and not (get_list_datatype(definition["datatype"]) == name and
+                         get_list_datatype(definition["datatype"]) in self.model)):
+
+            # and create the new property
+            self.model[name] = db.Property(name=name,
+                                           datatype=definition["datatype"])
+        elif (self.model[name] is None and isinstance(definition, dict)
+              and "role" in definition):
+            if definition["role"] == "RecordType":
+                self.model[name] = db.RecordType(name=name)
+            elif definition["role"] == "Record":
+                self.model[name] = db.Record(name=name)
+            elif definition["role"] == "File":
+                # TODO(fspreck) Implement files at some later point in time
+                raise NotImplementedError(
+                    "The definition of file objects is not yet implemented.")
+
+                # self.model[name] = db.File(name=name)
+            elif definition["role"] == "Property":
+                self.model[name] = db.Property(name=name)
+            else:
+                raise RuntimeError("Unknown role {} in definition of entity.".format(
+                    definition["role"]))
+
+        # for setting values of properties directly:
+        if not isinstance(definition, dict):
+            return
+
+        # add other definitions recursively
+        for prop_type in ["recommended_properties",
+                          "suggested_properties", "obligatory_properties"]:
+
+            if prop_type in definition:
+                # Empty property mapping should be allowed.
+
+                if definition[prop_type] is None:
+                    definition[prop_type] = {}
+                try:
+                    for n, e in definition[prop_type].items():
+                        if n == "__line__":
+                            continue
+                        self._add_entity_to_model(n, e)
+                except AttributeError as ate:
+                    if ate.args[0].endswith("'items'"):
+                        line = definition["__line__"]
+
+                        if isinstance(definition[prop_type], list):
+                            line = definition[prop_type][0]["__line__"]
+                        raise YamlDefinitionError(line) from None
+                    raise
+
+        if self.debug and self.model[name] is not None:
+            self.model[name].__line__ = definition["__line__"]
+
+    def _add_to_recordtype(self, ent_name, props, importance):
+        """Add properties to a RecordType.
+
+        Parameters
+        ----------
+        ent_name : str
+          The name of the entity to which the properties shall be added.
+
+        props : dict [str -> dict or :doc:`Entity`]
+          The properties, indexed by their names.  Properties may be given as :doc:`Entity` objects
+          or as dictionaries.
+
+        importance
+          The importance as used in :doc:`Entity.add_property`.
+
+        Returns
+        -------
+        None
+
+        """
+
+        for n, e in props.items():
+
+            if n in KEYWORDS:
+                if n in KEYWORDS_IGNORED:
+                    continue
+                raise YamlDefinitionError("Unexpected keyword in line {}: {}".format(
+                    props["__line__"], n))
+
+            if n == "__line__":
+                continue
+            n = self._stringify(n)
+
+            if isinstance(e, dict):
+                if "datatype" in e and get_list_datatype(e["datatype"]) is not None:
+                    # Reuse the existing datatype for lists.
+                    datatype = db.LIST(get_list_datatype(e["datatype"]))
+                else:
+                    # Ignore a possible e["datatype"] here if it's not a list
+                    # since it has been treated in the definition of the
+                    # property (entity) already
+                    datatype = None
+                if "value" in e:
+                    value = e["value"]
+                else:
+                    value = None
+
+            else:
+                value = e
+                datatype = None
+
+            self.model[ent_name].add_property(name=n,
+                                              value=value,
+                                              importance=importance,
+                                              datatype=datatype)
+
+    def _inherit(self, name, prop, inheritance):
+        if not isinstance(prop, list):
+            if isinstance(prop, str):
+                raise YamlDefinitionError(
+                    f"Parents must be a list but is given as string: {name} > {prop}")
+            raise YamlDefinitionError("Parents must be a list, error in line {}".format(
+                prop["__line__"]))
+
+        for pname in prop:
+            if not isinstance(pname, str):
+                raise ValueError("Only provide the names of parents.")
+            self.model[name].add_parent(name=pname, inheritance=inheritance)
+
+    def _treat_entity(self, name, definition, line=None):
+        """Parse the definition and the information to the entity."""
+
+        if name == "__line__":
+            return
+        name = self._stringify(name)
+
+        try:
+            if definition is None:
+                return
+
+            # for setting values of properties directly:
+            if not isinstance(definition, dict):
+                return
+
+            # These definition items must be handled even for list props.
+            for prop_name, prop in definition.items():
+                if prop_name == "description":
+                    self.model[name].description = prop
+
+            # For lists, everything else is not needed at this level.
+            if ("datatype" in definition and definition["datatype"].startswith("LIST")):
+                return
+
+            if name in self.treated:
+                raise TwiceDefinedException(name)
+
+            # for reducing a little bit of code duplication:
+            importance_dict = {
+                "recommended_properties": db.RECOMMENDED,
+                "obligatory_properties": db.OBLIGATORY,
+                "suggested_properties": db.SUGGESTED
+                }
+
+            for prop_name, prop in definition.items():
+                if prop_name == "__line__":
+                    continue
+                line = definition["__line__"]
+
+                if prop_name == "unit":
+                    self.model[name].unit = prop
+
+                elif prop_name == "value":
+                    self.model[name].value = prop
+
+                elif prop_name == "description":
+                    # Handled above
+                    continue
+
+                elif prop_name in importance_dict:
+                    for imp_name, imp_val in importance_dict.items():
+                        if prop_name == imp_name:
+                            self._add_to_recordtype(
+                                name, prop, importance=imp_val)
+
+                            for n, e in prop.items():
+                                self._treat_entity(n, e)
+
+                # datatype is already set
+                elif prop_name == "datatype":
+                    continue
+
+                # role has already been used
+                elif prop_name == "role":
+                    continue
+
+                elif prop_name == "inherit_from_obligatory":
+                    self._inherit(name, prop, db.OBLIGATORY)
+                elif prop_name == "inherit_from_recommended":
+                    self._inherit(name, prop, db.RECOMMENDED)
+                elif prop_name == "inherit_from_suggested":
+                    self._inherit(name, prop, db.SUGGESTED)
+
+                else:
+                    raise ValueError("invalid keyword: {}".format(prop_name))
+        except AttributeError as ate:
+            if ate.args[0].endswith("'items'"):
+                raise YamlDefinitionError(line) from None
+        except Exception as e:
+            print("Error in treating: "+name)
+            raise e
+        self.treated.append(name)
+
+    def _check_and_convert_datatypes(self):
+        """ checks if datatype is valid.
+        datatype of properties is simply initialized with string. Here, we
+        iterate over properties and check whether it is a base datatype of a
+        name that was defined in the model (or extern part)
+
+        the string representations are replaced with linkahead objects
+
+        """
+
+        for _, value in self.model.items():
+
+            if isinstance(value, db.Property):
+                dtype = value.datatype
+                is_list = False
+
+                if get_list_datatype(dtype) is not None:
+                    dtype = get_list_datatype(dtype)
+                    is_list = True
+
+                dtype_name = dtype
+                if not isinstance(dtype_name, str):
+                    dtype_name = dtype.name
+
+                if dtype_name in self.model:
+                    if is_list:
+                        value.datatype = db.LIST(self.model[dtype_name])
+                    else:
+                        value.datatype = self.model[dtype_name]
+
+                    continue
+
+                if dtype in [db.DOUBLE,
+                             db.REFERENCE,
+                             db.TEXT,
+                             db.DATETIME,
+                             db.INTEGER,
+                             db.FILE,
+                             db.BOOLEAN]:
+
+                    if is_list:
+                        value.datatype = db.LIST(db.__getattribute__(  # pylint: disable=no-member
+                            dtype))
+                    else:
+                        value.datatype = db.__getattribute__(  # pylint: disable=no-member
+                            dtype)
+
+                    continue
+
+                raise ValueError("Property {} has an unknown datatype: {}".format(
+                    value.name, dtype_name))
+
+    def _set_recordtypes(self):
+        """ properties are defined in first iteration; set remaining as RTs """
+
+        for key, value in self.model.items():
+            if value is None:
+                self.model[key] = db.RecordType(name=key)
+
+
+class JsonSchemaParser(Parser):
+    """Extends the yaml parser to read in datamodels defined in a json schema.
+
+    **EXPERIMENTAL:** While this class can already be used to create data models
+    from basic json schemas, there are the following limitations and missing
+    features:
+
+    * Due to limitations of json-schema itself, we currently do not support
+      inheritance in the imported data models
+    * The same goes for suggested properties of RecordTypes
+    * Already defined RecordTypes and (scalar) Properties can't be re-used as
+      list properties
+    * Reference properties that are different from the referenced RT. (Although
+      this is possible for list of references)
+    * Values
+    * Roles
+    * The extern keyword from the yaml parser
+
+    """
+    # @author Florian Spreckelsen
+    # @date 2022-02-17
+    # @review Timm Fitschen 2023-05-25
+
+    def __init__(self, types_for_missing_array_items=None,
+                 ignore_unspecified_array_items=False):
+        super().__init__()
+        if types_for_missing_array_items is None:
+            types_for_missing_array_items = {}
+        self.types_for_missing_array_items = types_for_missing_array_items
+        self.ignore_unspecified_array_items = ignore_unspecified_array_items
+
+    def parse_model_from_json_schema(self, filename: str, top_level_recordtype: bool = True):
+        """Return a datamodel created from the definition in the json schema in
+        `filename`.
+
+        Parameters
+        ----------
+        filename : str
+            The path to the json-schema file containing the datamodel definition
+        top_level_recordtype : bool, optional
+            Whether there is a record type defined at the top level of the
+            schema. Default is true.
+
+        Returns
+        -------
+        out : data_model.DataModel
+            The created DataModel
+        """
+        # @author Florian Spreckelsen
+        # @date 2022-02-17
+        # @review Timm Fitschen 2023-05-25
+        with open(filename, 'r', encoding="utf-8") as schema_file:
+            model_dict = jsonref.load(schema_file)
+
+        return self._create_model_from_dict(model_dict, top_level_recordtype=top_level_recordtype)
+
+    # ToDo: Fix https://gitlab.indiscale.com/caosdb/src/caosdb-advanced-user-tools/-/issues/139
+    #       and remove pylint disable
+    def _create_model_from_dict(self, model_dict: Union[dict, List[dict]], top_level_recordtype: bool = True):  # pylint: disable=arguments-renamed
+        """Parse a dictionary and return the Datamodel created from it.
+
+        The dictionary was typically created from the model definition in a json schema file.
+
+        Parameters
+        ----------
+        model_dict : dict or list[dict]
+            One or several dictionaries read in from a json-schema file
+        top_level_recordtype : bool, optional
+            Whether there is a record type defined at the top level of the
+            schema. Default is true.
+
+        Returns
+        -------
+        our : data_model.DataModel
+            The datamodel defined in `model_dict`
+        """
+        # @review Timm Fitschen 2023-05-25
+        if isinstance(model_dict, dict):
+            model_dict = [model_dict]
+
+        for ii, elt in enumerate(model_dict):
+            try:
+                jsonschema.Draft202012Validator.check_schema(elt)
+            except jsonschema.SchemaError as err:
+                key = elt["title"] if "title" in elt else f"element {ii}"
+                raise JsonSchemaDefinitionError(
+                    f"Json Schema error in {key}:\n{str(err)}") from err
+
+            if top_level_recordtype:
+                if "title" not in elt:
+                    raise JsonSchemaDefinitionError(
+                        f"Object {ii+1} is lacking the `title` key word")
+                if "type" not in elt:
+                    raise JsonSchemaDefinitionError(
+                        f"Object {ii+1} is lacking the `type` key word")
+                # Check if this is a valid Json Schema
+                name = self._stringify(elt["title"], context=elt)
+                self._treat_element(elt, name)
+            elif "properties" in elt or "patternProperties" in elt:
+                # No top-level type but there are entities
+                if "properties" in elt:
+                    for key, prop in elt["properties"].items():
+                        name = self._get_name_from_property(key, prop)
+                        self._treat_element(prop, name)
+                if "patternProperties" in elt:
+                    # See also treatment in ``_treat_record_type``. Since here,
+                    # there is no top-level RT we use the prefix `__Pattern`,
+                    # i.e., the resulting Record Types will be called
+                    # `__PatternElement`.
+                    self._treat_pattern_properties(
+                        elt["patternProperties"], name_prefix="__Pattern")
+            else:
+                # Neither RecordType itself, nor further properties in schema,
+                # so nothing to do here. Maybe add something in the future.
+                continue
+
+        return DataModel(self.model.values())
+
+    def _get_name_from_property(self, key: str, prop: dict):
+        # @review Timm Fitschen 2023-05-25
+        if "title" in prop:
+            name = self._stringify(prop["title"])
+        else:
+            name = self._stringify(key)
+
+        return name
+
+    def _get_atomic_datatype(self, elt):
+        # @review Timm Fitschen 2023-05-25
+        if elt["type"] == "string":
+            if "format" in elt and elt["format"] in ["date", "date-time"]:
+                return db.DATETIME
+            else:
+                return db.TEXT
+        elif elt["type"] == "integer":
+            return db.INTEGER
+        elif elt["type"] == "number":
+            return db.DOUBLE
+        elif elt["type"] == "boolean":
+            return db.BOOLEAN
+        elif elt["type"] == "null":
+            # This could be any datatype since a valid json will never have a
+            # value in a null property. We use TEXT for convenience.
+            return db.TEXT
+        else:
+            raise JsonSchemaDefinitionError(f"Unkown atomic type in {elt}.")
+
+    def _treat_element(self, elt: dict, name: str):
+        # @review Timm Fitschen 2023-05-25
+        force_list = False
+        if name in self.model:
+            return self.model[name], force_list
+        if "type" not in elt:
+            # Each element must have a specific type
+            raise JsonSchemaDefinitionError(
+                f"`type` is missing in element {name}.")
+        if name == "name":
+            # This is identified with the LinkAhead name property as long as the
+            # type is correct.
+            if not elt["type"] == "string" and "string" not in elt["type"]:
+                raise JsonSchemaDefinitionError(
+                    "The 'name' property must be string-typed, otherwise it cannot "
+                    "be identified with LinkAhead's name property."
+                )
+            return None, force_list
+        # LinkAhead suports null for all types, so in the very special case of
+        # `"type": ["null", "<other_type>"]`, only consider the other type:
+        if isinstance(elt["type"], list) and len(elt["type"]) == 2 and "null" in elt["type"]:
+            elt["type"].remove("null")
+            elt["type"] = elt["type"][0]
+        if "enum" in elt:
+            ent = self._treat_enum(elt, name)
+        elif elt["type"] in JSON_SCHEMA_ATOMIC_TYPES:
+            ent = db.Property(
+                name=name, datatype=self._get_atomic_datatype(elt))
+        elif elt["type"] == "object":
+            ent = self._treat_record_type(elt, name)
+        elif elt["type"] == "array":
+            ent, force_list = self._treat_list(elt, name)
+        else:
+            raise NotImplementedError(
+                f"Cannot parse items of type '{elt['type']}' (yet).")
+        if "description" in elt and ent.description is None:
+            # There is a description and it hasn't been set by another
+            # treat_something function
+            ent.description = elt["description"]
+
+        if ent is not None:
+            self.model[name] = ent
+        return ent, force_list
+
+    def _treat_record_type(self, elt: dict, name: str):
+        # @review Timm Fitschen 2023-05-25
+        rt = db.RecordType(name=name)
+        if "required" in elt:
+            required = elt["required"]
+        else:
+            required = []
+        if "properties" in elt:
+            for key, prop in elt["properties"].items():
+                name = self._get_name_from_property(key, prop)
+                prop_ent, force_list = self._treat_element(prop, name)
+                if prop_ent is None:
+                    # Nothing to be appended since the property has to be
+                    # treated specially.
+                    continue
+                importance = db.OBLIGATORY if key in required else db.RECOMMENDED
+                if not force_list:
+                    rt.add_property(prop_ent, importance=importance)
+                else:
+                    # Special case of rt used as a list property
+                    rt.add_property(prop_ent, importance=importance,
+                                    datatype=db.LIST(prop_ent))
+
+        if "patternProperties" in elt:
+
+            pattern_property_rts = self._treat_pattern_properties(
+                elt["patternProperties"], name_prefix=name)
+            for ppr in pattern_property_rts:
+                # add reference to pattern property type. These can never be
+                # obligatory since pattern properties cannot be required in the
+                # original schema (since their actual names are not known a
+                # priori).
+                rt.add_property(ppr)
+
+        if "description" in elt:
+            rt.description = elt["description"]
+        return rt
+
+    def _treat_enum(self, elt: dict, name: str):
+        # @review Timm Fitschen 2022-02-30
+        if "type" in elt and elt["type"] == "integer":
+            raise NotImplementedError(
+                "Integer-enums are not allowd until "
+                "https://gitlab.indiscale.com/caosdb/src/caosdb-server/-/issues/224 "
+                "has been fixed."
+            )
+        rt = db.RecordType(name=name)
+        for enum_elt in elt["enum"]:
+            rec = db.Record(name=self._stringify(enum_elt))
+            rec.add_parent(rt)
+            self.model[enum_elt] = rec
+
+        return rt
+
+    def _treat_list(self, elt: dict, name: str):
+        # @review Timm Fitschen 2023-05-25
+
+        if "items" not in elt and name not in self.types_for_missing_array_items:
+            if self.ignore_unspecified_array_items:
+                return None, False
+            raise JsonSchemaDefinitionError(
+                f"The definition of the list items is missing in {elt}.")
+        if "items" in elt:
+            items = elt["items"]
+            if "enum" in items:
+                return self._treat_enum(items, name), True
+            if items["type"] in JSON_SCHEMA_ATOMIC_TYPES:
+                datatype = db.LIST(self._get_atomic_datatype(items))
+                return db.Property(name=name, datatype=datatype), False
+            if items["type"] == "object":
+                if "title" not in items or self._stringify(items["title"]) == name:
+                    # Property is RecordType
+                    return self._treat_record_type(items, name), True
+                else:
+                    # List property will be an entity of its own with a name
+                    # different from the referenced RT
+                    ref_rt = self._treat_record_type(
+                        items, self._stringify(items["title"]))
+                    self.model[ref_rt.name] = ref_rt
+                    return db.Property(name=name, datatype=db.LIST(ref_rt)), False
+        else:
+            # Use predefined type:
+            datatype = db.LIST(self.types_for_missing_array_items[name])
+            return db.Property(name=name, datatype=datatype), False
+
+    def _get_pattern_prop(self):
+        # @review Timm Fitschen 2023-05-25
+        if "__pattern_property_pattern_property" in self.model:
+            return self.model["__pattern_property_pattern_property"]
+        pp = db.Property(name="__matched_pattern", datatype=db.TEXT)
+        self.model["__pattern_property_pattern_property"] = pp
+        return pp
+
+    def _treat_pattern_properties(self, pattern_elements, name_prefix=""):
+        """Special Treatment for pattern properties: A RecordType is created for
+        each pattern property. In case of a `type: object` PatternProperty, the
+        remaining properties of the JSON entry are appended to the new
+        RecordType; in case of an atomic type PatternProperty, a single value
+        Property is added to the RecordType.
+
+        Raises
+        ------
+        NotImplementedError
+            In case of patternProperties with non-object, non-atomic type, e.g.,
+            array.
+
+        """
+        # @review Timm Fitschen 2023-05-25
+        num_patterns = len(pattern_elements)
+        pattern_prop = self._get_pattern_prop()
+        returns = []
+        for ii, (key, element) in enumerate(pattern_elements.items()):
+            if "title" not in element:
+                name_suffix = f"_{ii+1}" if num_patterns > 1 else ""
+                name = name_prefix + "Entry" + name_suffix
+            else:
+                name = element["title"]
+            if element["type"] == "object":
+                # simple, is already an object, so can be treated like any other
+                # record type.
+                pattern_type = self._treat_record_type(element, name)
+            elif element["type"] in JSON_SCHEMA_ATOMIC_TYPES:
+                # create a property that stores the actual value of the pattern
+                # property.
+                propname = f"{name}_value"
+                prop = db.Property(name=propname, datatype=self._get_atomic_datatype(element))
+                self.model[propname] = prop
+                pattern_type = db.RecordType(name=name)
+                pattern_type.add_property(prop)
+            else:
+                raise NotImplementedError(
+                    "Pattern properties are currently only supported for types " +
+                    ", ".join(JSON_SCHEMA_ATOMIC_TYPES) + ", and object.")
+
+            # Add pattern property and description
+            pattern_type.add_property(pattern_prop, importance=db.OBLIGATORY)
+            if pattern_type.description:
+                pattern_type.description += f"\n\npattern: {key}"
+            else:
+                pattern_type.description = f"pattern: {key}"
+
+            self.model[name] = pattern_type
+            returns.append(pattern_type)
+
+        return returns
+
+
+def main():
+    parser = argparse.ArgumentParser(description=__doc__,
+                                     formatter_class=argparse.RawTextHelpFormatter)
+    parser.add_argument("data_model",
+                        help="Path name of the data model file (yaml or json) to be used.")
+    parser.add_argument("--sync", action="store_true",
+                        help="Whether or not to sync the data model with the server.")
+    parser.add_argument("--noquestion", action="store_true",
+                        help="Whether or not to ask questions during synchronization.")
+    parser.add_argument("--print", action="store_true",
+                        help="Whether or not to print the data model.")
+
+    args = parser.parse_args()
+    if args.data_model.endswith(".json"):
+        model = parse_model_from_json_schema(args.data_model)
+    elif args.data_model.endswith(".yml") or args.data_model.endswith(".yaml"):
+        model = parse_model_from_yaml(args.data_model)
+    else:
+        raise RuntimeError(f"Unknown file ending of data model: {args.data_model}")
+    if args.print:
+        print(model)
+    if args.sync:
+        model.sync_data_model(noquestion=args.noquestion)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/unittests/test_json_schema_model_parser.py b/unittests/test_json_schema_model_parser.py
index cdd4c074..619714aa 100644
--- a/unittests/test_json_schema_model_parser.py
+++ b/unittests/test_json_schema_model_parser.py
@@ -357,8 +357,8 @@ def test_name_property():
         broken = parse_model_from_json_schema(os.path.join(
             FILEPATH, "datamodel_name_wrong_type.schema.json"))
     assert str(err.value).startswith(
-        "The 'name' property must be string-typed, otherwise it cannot be identified with LinkAhead's "
-        "name property.")
+        "The 'name' property must be string-typed, otherwise it cannot be identified with "
+        "LinkAhead's name property.")
 
 
 def test_no_toplevel_entity():
-- 
GitLab


From 1949243032789473da2dbf75799549de37f63ec3 Mon Sep 17 00:00:00 2001
From: Daniel <d.hornung@indiscale.com>
Date: Fri, 10 Jan 2025 16:52:32 +0100
Subject: [PATCH 104/106] MAINT: Removed more Python 3.8 code.

---
 src/caosadvancedtools/models/data_model.py | 7 +------
 tox.ini                                    | 2 +-
 2 files changed, 2 insertions(+), 7 deletions(-)

diff --git a/src/caosadvancedtools/models/data_model.py b/src/caosadvancedtools/models/data_model.py
index 92afb7eb..6d30b8fb 100644
--- a/src/caosadvancedtools/models/data_model.py
+++ b/src/caosadvancedtools/models/data_model.py
@@ -23,11 +23,6 @@
 # ** end header
 #
 from copy import deepcopy
-# TODO(fspreck) for backwards compatibility with Python < 3.9 but this is
-# actually
-# [deprecated](https://docs.python.org/3/library/typing.html#typing.List), so
-# remove this, when we drop support for old Python versions.
-from typing import List
 
 import linkahead as db
 import linkahead.common.models as models
@@ -85,7 +80,7 @@ class DataModel(dict):
     def append(self, entity: db.Entity):
         self[entity.name] = entity
 
-    def extend(self, entities: List[db.Entity]):
+    def extend(self, entities: list[db.Entity]):
         for entity in entities:
             self.append(entity)
 
diff --git a/tox.ini b/tox.ini
index 12c7ad50..786a1054 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,5 @@
 [tox]
-envlist = py38, py39, py310, py311, py312, py313
+envlist = py39, py310, py311, py312, py313
 skip_missing_interpreters = true
 
 [testenv]
-- 
GitLab


From a800eb64cfb234096d366640fc28ef745543c044 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Thu, 16 Jan 2025 10:48:47 +0100
Subject: [PATCH 105/106] DOC: Update changelog

---
 CHANGELOG.md | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index e5090e89..1375a7d3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
-## [Unreleased] ##
+## [0.13.0] - 2025-01-16 ##
 
 ### Added ###
 
@@ -12,34 +12,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Changed ###
 
-- Using the official name "LinkAhead" wherever possible without large effort. This includes the
-  following exposed names / features:
+- Using the official name "LinkAhead" wherever possible without large
+  effort. This includes the following exposed names / features:
   - `models.data_model.LINKAHEAD_INTERNAL_PROPERTIES`
   - `export_related.export` exports to `linkahead_data.xml` now.
 - Renamed (and added) installation "extra" options:
   - `h5` instead of `h5-crawler`
-  - `dev`, `doc`, `test` and `all` are new, they install the dependencies for developing, testing,
-    documentation and everything.
-- The `pandoc_header_tools.get_header()` parameter `add_header` has been renamed to `add_header_to_file`
-  to resolve a name collision.
-
-### Deprecated ###
+  - `dev`, `doc`, `test` and `all` are new, they install the
+    dependencies for developing, testing, documentation and
+    everything.
+- The `pandoc_header_tools.get_header()` parameter `add_header` has
+  been renamed to `add_header_to_file` to resolve a name collision.
 
 ### Removed ###
 
-- Bloxberg code snippets. These were just a proof of concept, untested and never used in production.
-- Labfolder converter. It was broken anyway, not used by anyone we know and there were no automated
-  tests.  For the time being, it lives on in the `f-labfolder-converter` branch, [issue 67](https://gitlab.com/linkahead/linkahead-advanced-user-tools/-/issues/67) is
-  there to coordinate resurrections efforts if someone needs it..
+- Bloxberg code snippets. These were just a proof of concept, untested
+  and never used in production.
+- Labfolder converter. It was broken anyway, not used by anyone we
+  know and there were no automated tests. For the time being, it lives
+  on in the `f-labfolder-converter` branch, [issue
+  67](https://gitlab.com/linkahead/linkahead-advanced-user-tools/-/issues/67)
+  is there to coordinate resurrections efforts if someone needs it..
 - Support for Python 3.8
 
 ### Fixed ###
 
-- Yaml data model parser adds data types of properties of record types and other attributes which fixes https://gitlab.indiscale.com/caosdb/customers/f-fit/management/-/issues/58
+- Yaml data model parser adds data types of properties of record types
+  and other attributes which fixes
+  https://gitlab.indiscale.com/caosdb/customers/f-fit/management/-/issues/58
 - `XLSXConverter` now checks path validity before parsing the worksheet.
 
-### Security ###
-
 ### Documentation ###
 
 * Added documentation of `caosadvancedtools.loadFiles` module.
-- 
GitLab


From fea642646ee83306cf45d5044f833328bde49f95 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Thu, 16 Jan 2025 10:51:53 +0100
Subject: [PATCH 106/106] REL: Prepare 0.13.0

---
 CITATION.cff    | 4 ++--
 setup.py        | 6 +++---
 src/doc/conf.py | 6 +++---
 3 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/CITATION.cff b/CITATION.cff
index c4628534..6e685219 100644
--- a/CITATION.cff
+++ b/CITATION.cff
@@ -20,6 +20,6 @@ authors:
     given-names: Stefan
     orcid: https://orcid.org/0000-0001-7214-8125
 title: CaosDB - Advanced User Tools
-version: 0.12.0
+version: 0.13.0
 doi: 10.3390/data4020083
-date-released: 2024-07-31
\ No newline at end of file
+date-released: 2025-01-16
\ No newline at end of file
diff --git a/setup.py b/setup.py
index c7dd54a9..d8d28e4d 100755
--- a/setup.py
+++ b/setup.py
@@ -46,10 +46,10 @@ from setuptools import find_packages, setup
 ########################################################################
 
 MAJOR = 0
-MINOR = 12
-MICRO = 1
+MINOR = 13
+MICRO = 0
 PRE = ""  # e.g. rc0, alpha.1, 0.beta-23
-ISRELEASED = False
+ISRELEASED = True
 
 if PRE:
     VERSION = "{}.{}.{}-{}".format(MAJOR, MINOR, MICRO, PRE)
diff --git a/src/doc/conf.py b/src/doc/conf.py
index e8975650..12495069 100644
--- a/src/doc/conf.py
+++ b/src/doc/conf.py
@@ -23,13 +23,13 @@ import sphinx_rtd_theme
 # -- Project information -----------------------------------------------------
 
 project = 'caosadvancedtools'
-copyright = '2023, IndiScale GmbH'
+copyright = '2025, IndiScale GmbH'
 author = 'Daniel Hornung'
 
 # The short X.Y version
-version = '0.12.1'
+version = '0.13.0'
 # The full version, including alpha/beta/rc tags
-release = '0.12.1-dev'
+release = '0.13.0'
 
 
 # -- General configuration ---------------------------------------------------
-- 
GitLab