commit 306a191a033a734b0ac8c932194ebcb93ec2363b
Author: Romain Thomas <romainthomasc@gmail.com>
Date:   Thu Mar 30 16:56:49 2017 +0200

    First public release

diff --git a/.appveyor.yml b/.appveyor.yml
new file mode 100644
index 0000000..f302d85
--- /dev/null
+++ b/.appveyor.yml
@@ -0,0 +1,89 @@
+version: 0.4.{build}
+image: Visual Studio 2015
+clone_folder: c:\projects\lief
+
+configuration: Release
+
+clone_depth: 5
+
+platform:
+- x86
+- x64
+
+environment:
+ matrix:
+    # Python 2.7
+    - PYTHON_VERSION:   "2.7"
+      PYTHON32_PATH:    "C:\\Python27"
+      PYTHON32_INCLUDE: "C:\\Python27\\include"
+      PYTHON32_BINARY:  "C:\\Python27\\python.exe"
+      PYTHON32_LIBRARY: "C:\\Python27\\libs\\python27.lib"
+      PYTHON64_PATH:    "C:\\Python27-x64"
+      PYTHON64_INCLUDE: "C:\\Python27-x64\\include"
+      PYTHON64_BINARY:  "C:\\Python27-x64\\python.exe"
+      PYTHON64_LIBRARY: "C:\\Python27-x64\\libs\\python27.lib"
+
+
+    # Python 3.5
+    - PYTHON_VERSION:   "3.5"
+      PYTHON32_PATH:    "C:\\Python35"
+      PYTHON32_INCLUDE: "C:\\Python35\\include"
+      PYTHON32_BINARY:  "C:\\Python35\\python.exe"
+      PYTHON32_LIBRARY: "C:\\Python35\\libs\\python35.lib"
+      PYTHON64_PATH:    "C:\\Python35-x64"
+      PYTHON64_INCLUDE: "C:\\Python35-x64\\include"
+      PYTHON64_BINARY:  "C:\\Python35-x64\\python.exe"
+      PYTHON64_LIBRARY: "C:\\Python35-x64\\libs\\python35.lib"
+
+
+    # Python 3.6
+    - PYTHON_VERSION:   "3.6"
+      PYTHON32_PATH:    "C:\\Python36"
+      PYTHON32_INCLUDE: "C:\\Python36\\include"
+      PYTHON32_BINARY:  "C:\\Python36\\python.exe"
+      PYTHON32_LIBRARY: "C:\\Python36\\libs\\python36.lib"
+      PYTHON64_PATH:    "C:\\Python36-x64"
+      PYTHON64_INCLUDE: "C:\\Python36-x64\\include"
+      PYTHON64_BINARY:  "C:\\Python36-x64\\python.exe"
+      PYTHON64_LIBRARY: "C:\\Python36-x64\\libs\\python36.lib"
+
+matrix:
+  fast_finish: true     # set this flag to immediately finish build once one of the jobs fails.
+  allow_failures:
+    - platform: x86
+      configuration: Release
+    - platform: x64
+      configuration: Release
+
+install:
+  - ps: if ($env:PLATFORM -eq "x64") { $env:CMAKE_ARCH = "x64" }
+
+  - ps: if ($env:PLATFORM -eq "x64") { $env:PYTHON_PATH    = $env:PYTHON64_PATH }
+  - ps: if ($env:PLATFORM -eq "x64") { $env:PYTHON_INCLUDE = $env:PYTHON64_INCLUDE }
+  - ps: if ($env:PLATFORM -eq "x64") { $env:PYTHON_BINARY  = $env:PYTHON64_BINARY }
+  - ps: if ($env:PLATFORM -eq "x64") { $env:PYTHON_LIBRARY = $env:PYTHON64_LIBRARY }
+
+  - ps: if ($env:PLATFORM -eq "x86") { $env:PYTHON_PATH    = $env:PYTHON32_PATH }
+  - ps: if ($env:PLATFORM -eq "x86") { $env:PYTHON_INCLUDE = $env:PYTHON32_INCLUDE }
+  - ps: if ($env:PLATFORM -eq "x86") { $env:PYTHON_BINARY  = $env:PYTHON32_BINARY }
+  - ps: if ($env:PLATFORM -eq "x86") { $env:PYTHON_LIBRARY = $env:PYTHON32_LIBRARY }
+
+  - set PATH=%PYTHON_PATH%;%PATH%
+
+build_script:
+  - cmake -A "%CMAKE_ARCH%" -DLIEF_TESTS=on -DLIEF_PYTHON_API=on -DPYTHON_VERSION=%PYTHON_VERSION% -DPYTHON_INCLUDE_DIR=%PYTHON_INCLUDE% -DPYTHON_EXECUTABLE=%PYTHON_BINARY% -DPYTHON_LIBRARY=%PYTHON_LIBRARY%
+  - set MSBuildLogger="C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
+  - cmake --build . --config Release --target ALL_BUILD -- /v:m /logger:%MSBuildLogger%
+
+test_script:
+  - cmake --build . --config Release --target RUN_TESTS -- /v:m /logger:%MSBuildLogger%
+
+after_test:
+  - cd api\python
+  - python.exe .\setup.py sdist --formats=zip && exit 0 # Ignore warnings...
+  - ps: gci dist\*.zip | % { rename-item –path $_.Fullname –Newname ( "windows_" + $env:PLATFORM + "_" + $_.basename + "_py" + $env:PYTHON_VERSION + $_.extension) }
+
+#artifacts:
+#  - path: 'api\python\dist\*.zip'
+
+
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..5f81c69
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,10 @@
+*
+!src
+!doc
+!tests
+!include
+!examples
+!api
+!CMakeLists.txt
+!CMakeModules
+!package
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..27e015a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,156 @@
+language: cpp
+
+
+matrix:
+    include:
+        # Linux gcc 5.0 - Python 2.7
+        - os: linux
+          dist: trusty
+          compiler: gcc
+          addons:
+            apt:
+              sources: ['ubuntu-toolchain-r-test']
+              packages: ['g++-5', 'ccache', 'libpython2.7']
+          env: [ CXX_COMPILER=g++-5, C_COMPILER=gcc-5, PYTHON_VERSION=2.7, PYTHON_INCLUDE_DIR=/usr/include/python2.7, PYTHON_LIBRARY=/usr/lib/libpython2.7.so, PYTHON_BINARY=/usr/bin/python2.7 ]
+
+
+        ## Linux gcc 5.0 - Python 3.5
+        - os: linux
+          dist: trusty
+          compiler: gcc
+          addons:
+            apt:
+              sources: ['ubuntu-toolchain-r-test', 'deadsnakes']
+              packages: ['g++-5', 'gcc-5', 'ccache', 'python3.5-dev']
+          env: [ CXX_COMPILER=g++-5, C_COMPILER=gcc-5, PYTHON_VERSION=3.5, PYTHON_INCLUDE_DIR=/usr/include/python3.5m, PYTHON_LIBRARY=/usr/lib/libpython3.5m.so, PYTHON_BINARY=/usr/bin/python3.5]
+
+
+        # Linux gcc 6 - Python 3.6
+        - os: linux
+          dist: trusty
+          compiler: gcc
+          addons:
+            apt:
+              sources: ['ubuntu-toolchain-r-test', 'deadsnakes']
+              packages: ['g++-6', 'gcc-6', 'ccache', 'python3.6-dev', 'python-sphinx']
+          env: [ CXX_COMPILER=g++-6, C_COMPILER=gcc-6, PYTHON_VERSION=3.6, PYTHON_INCLUDE_DIR=/usr/include/python3.6m, PYTHON_LIBRARY=/usr/lib/libpython3.6m.so, PYTHON_BINARY=/usr/bin/python3.6, LIEF_DOC=OFF]
+
+        # OSX 10.11 - xcode 7.3 - Python 2.7
+        - os: osx
+          osx_image: xcode7.3
+          compiler: clang
+          env: [CXX_COMPILER=clang++, C_COMPILER=clang, PYTHON_VERSION=2.7]
+
+        # OSX 10.12 - xcode 8.2 - Python 3.5
+        - os: osx
+          osx_image: xcode8.2
+          compiler: clang
+          env: [ CXX_COMPILER=clang++, C_COMPILER=clang, PYTHON_VERSION=3.5]
+
+
+        ## OSX 10.12 - xcode 8.2 - Python 3.6
+        - os: osx
+          osx_image: xcode8.2
+          compiler: clang
+          env: [CXX_COMPILER=clang++, C_COMPILER=clang, PYTHON_VERSION=3.6]
+
+#branches:
+#  only:
+#  - master
+
+
+notifications:
+  email: false
+
+sudo: required
+
+cache:
+  - apt
+  - ccache
+
+before_install:
+  - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get update -q; fi
+  - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo apt-get install python-setuptools; fi
+  - export CC="$C_COMPILER"
+  - export CXX="$CXX_COMPILER"
+  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PREFIX="/usr/local"; fi
+  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update; fi
+
+  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then export PYTHON_CONFIGURE_OPTS="--enable-shared"; fi
+  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then pyenv root; fi
+  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then pyenv install --list  ;fi
+
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "2.7" ]]; then pyenv install 2.7.10; fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "3.5" ]]; then pyenv install 3.5.0; fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "3.6" ]]; then pyenv install 3.6.0b4; fi
+
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "2.7" ]]; then export PYTHON_INCLUDE_DIR=$(pyenv root)/versions/2.7.10/include/python2.7  ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "2.7" ]]; then export PYTHON_LIBRARY=$(pyenv root)/versions/2.7.10/lib/libpython2.7.dylib ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "2.7" ]]; then export PYTHON_BINARY=$(pyenv root)/versions/2.7.10/bin/python2.7           ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "2.7" ]]; then $PYTHON_BINARY -m pip install --upgrade pip                                ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "2.7" ]]; then $PYTHON_BINARY -m pip install --upgrade setuptools                         ;fi
+
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "3.5" ]]; then export PYTHON_INCLUDE_DIR=$(pyenv root)/versions/3.5.0/include/python3.5m ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "3.5" ]]; then export PYTHON_LIBRARY=$(pyenv root)/versions/3.5.0/lib/libpython3.dylib   ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "3.5" ]]; then export PYTHON_BINARY=$(pyenv root)/versions/3.5.0/bin/python3.5           ;fi
+
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "3.6" ]]; then export PYTHON_INCLUDE_DIR=$(pyenv root)/versions/3.6.0b4/include/python3.6m ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "3.6" ]]; then export PYTHON_LIBRARY=$(pyenv root)/versions/3.6.0b4/lib/libpython3.dylib   ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" && "$PYTHON_VERSION" == "3.6" ]]; then export PYTHON_BINARY=$(pyenv root)/versions/3.6.0b4/bin/python3.6           ;fi
+
+install:
+  - if [ "$GCOV" == "ON" ]; then sudo ln -sf /usr/bin/gcov-5 /usr/bin/gcov; fi
+  - if [ "$GCOV" == "ON" ]; then wget http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.13.orig.tar.gz; fi
+  - if [ "$GCOV" == "ON" ]; then tar xf lcov_1.13.orig.tar.gz; fi
+  - if [ "$GCOV" == "ON" ]; then sudo make -C lcov-1.13/ install; fi
+
+  - if [[ "$LIEF_DOC" == "ON" ]]; then wget --no-check-certificate ftp://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.10.linux.bin.tar.gz; fi
+  - if [[ "$LIEF_DOC" == "ON" ]]; then tar -xzf doxygen-1.8.10.linux.bin.tar.gz; fi
+  - if [[ "$LIEF_DOC" == "ON" ]]; then cd doxygen-1.8.10; fi
+  - if [[ "$LIEF_DOC" == "ON" ]]; then ./configure --prefix /usr; fi
+  - if [[ "$LIEF_DOC" == "ON" ]]; then sudo make install; fi
+  - if [[ "$LIEF_DOC" == "ON" ]]; then cd ..; fi
+
+  # Setup CMake 3.1 for Linux
+  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then wget --no-check-certificate http://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.tar.gz   ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then tar -xzf cmake-3.7.2-Linux-x86_64.tar.gz                                                  ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then export PATH=$PWD/cmake-3.7.2-Linux-x86_64/bin:$PATH                                       ;fi
+
+  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py   ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo $PYTHON_BINARY ./get-pip.py ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$LIEF_DOC" == "ON" ]]; then sudo $PYTHON_BINARY -m pip install breathe ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "linux" && "$LIEF_DOC" == "ON" ]]; then sudo $PYTHON_BINARY -m pip install sphinx_rtd_theme ;fi
+
+  # Prepare build
+  - mkdir build
+  - cd build
+
+
+script:
+  - cmake -DCMAKE_C_COMPILER=$C_COMPILER -DCMAKE_CXX_COMPILER=$CXX_COMPILER -DPYTHON_VERSION=$PYTHON_VERSION -DPYTHON_INCLUDE_DIR=$PYTHON_INCLUDE_DIR -DPYTHON_LIBRARY=$PYTHON_LIBRARY -DPYTHON_EXECUTABLE=$PYTHON_BINARY -DLIEF_TESTS=on  -DLIEF_DOC=${LIEF_DOC:-OFF} ..
+  - make -j2
+  - sudo make check-lief
+
+after_success:
+  - make package
+  - sudo $PYTHON_BINARY -m pip install setuptools
+  - sudo $PYTHON_BINARY -m pip install --upgrade setuptools
+  - cd api/python
+  - $PYTHON_BINARY setup.py sdist
+  - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then bash -c 'cd dist && for f in *.tar.gz; do mv $f "linux_${f%.tar.gz}_py${PYTHON_VERSION}.tar.gz"; done' ;fi
+  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then bash -c 'cd dist && for f in *.tar.gz; do mv $f "osx_${f%.tar.gz}_py$PYTHON_VERSION.tar.gz"; done' ;fi
+
+
+deploy:
+  provider: releases
+  api-key:
+    - secure: "E+rseEB8MX81WvdM8HS/mOwGNS1kSMzaitOqVl0KA09Ir1I/gtyzli3p5M3rVRws7uYsEWqOAVEGrBeH3LhuX4D5aS5i5+IKKmlHLMhd+XT3Nmg+VsWgiHm4PVpdKLegN78CVcZs3NsbUYvEvEzmPGiNqHjUp0+EvuE1jsSXuXdDaYK3aLn2YRkQpFrMOZcHzItsbD/XXqQoupA99SdsNLVLi2UbCFh2qULi2Y/yOGGoK1PYJxuLd1H4Z992MFqcCbHFHGWRH6OTA/oPcDjluPSChj+YPJ4Logl+NpaLEH5FCbKFdpIi7b6ay5cyQ4m4BxGGmTn/qEPmp/3ouzAQY+yGKONpdMmAb8nKLcs2F+jCNLx/hCem+52yElFF4iTcCP6Xca/Ntj+D447GwZOWOlSGpBygPePVzXmj3PnI/KnRhRNHqLntkNe98Qz7QC9Sla+0e1TJJuegsTANJ0DM2iHtlCOxqRK8WskqeTkrxX4zYK3qTyouG8VxJg23qeRk5I1tNtiaZqsEfiqFVw25DWdLz6B3nDarCMS6hQhEzkQptXLNtPDWNmtvr/CFGjpZFJxACd1tgPGSARhPdhAfcRZUUyPPfptKHp5oxqTGrW8UKzOEhF+cwIg3BCMWsAGzrpuRTXKSfwMeqrVddXzgyhhyD3ywFkXwc1/wLIIEfAE="
+  file_glob: true
+  file:
+    - ${TRAVIS_BUILD_DIR}/build/api/python/dist/*.tar.gz
+    - ${TRAVIS_BUILD_DIR}/build/*.tar.gz
+  skip_cleanup: true
+  on:
+    #branch: master
+    tags: true
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..2f26194
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,3 @@
+Authors:
+
+  Romain Thomas <rthomas@quarkslab.com>
diff --git a/Acknowledgements b/Acknowledgements
new file mode 100644
index 0000000..ffda7b2
--- /dev/null
+++ b/Acknowledgements
@@ -0,0 +1,16 @@
+Acknowledgements
+----------------
+
+LIEF makes use of the following open source projects:
+
+ - mbedTLS - https://tls.mbed.org/
+ - pybind11 - https://github.com/pybind/pybind11
+ - json - https://nlohmann.github.io/json/
+ - rang - https://agauniyal.github.io/rang/
+ - easyloggingpp - https://github.com/muflihun/easyloggingpp
+ - Catch - https://github.com/philsquared/Catch
+ - yamlcpp - https://github.com/jbeder/yaml-cpp
+ - filesystem - https://github.com/wjakob/filesystem
+ - utf8-cpp - https://sourceforge.net/projects/utfcpp/
+
+The logo is designed by Freepik
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..e150ff6
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,7 @@
+Changelog
+=========
+
+v0.6:
+  * First public release
+
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..2036331
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,552 @@
+cmake_minimum_required(VERSION 3.1)
+
+# Modules
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules/")
+include(CheckCXXCompilerFlag)
+include(CheckCCompilerFlag)
+include(Findcppcheck)
+include(CppcheckTargets)
+include(ExternalProject)
+
+# LIEF version
+set(LIEF_VERSION_MAJOR 0)
+set(LIEF_VERSION_MINOR 6)
+set(LIEF_VERSION_PATCH 0)
+
+project(LIEF VERSION ${LIEF_VERSION_MAJOR}.${LIEF_VERSION_MINOR}.${LIEF_VERSION_PATCH})
+message(STATUS "${PROJECT_NAME} ${PROJECT_VERSION}")
+
+# options
+option(LIEF_TESTS          "Enable tests"                               OFF)
+option(LIEF_DOC            "Enable documentation"                       OFF)
+option(LIEF_PYTHON_API     "Enable Python API"                          ON)
+option(LIEF_INSTALL_PYTHON "Install Python bindings"                    OFF)
+option(LIEF_C_API          "C API"                                      ON)
+option(LIEF_EXAMPLES       "Build LIEF C++ examples"                    ON)
+option(LIEF_FORCE32        "Force build LIEF 32 bits version"           OFF)
+option(LIEF_COVERAGE       "Perform code coverage"                      OFF)
+option(LIEF_USE_CCACHE     "Use ccache to speed up compilation"         ON)
+option(LIEF_EXTRA_WARNINGS "Enable extra warning from the compiler"     OFF)
+option(LIEF_LOGGING        "Enable logging"                             ON)
+
+option(LIEF_ELF            "Build LIEF with ELF module"                 ON)
+option(LIEF_PE             "Build LIEF with PE  module"                 ON)
+option(LIEF_MACHO          "Build LIEF with MachO module"               ON)
+
+# CCACHE
+# ======
+find_program(CCACHE_FOUND ccache)
+message(STATUS "ccache: ${LIEF_USE_CCACHE}")
+if(CCACHE_FOUND AND LIEF_USE_CCACHE)
+  set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
+  set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
+endif()
+
+
+# Dependencies
+# ============
+find_package(Git REQUIRED)
+
+# Json
+# ----
+set(LIBJSON_GIT_URL "https://github.com/nlohmann/json.git" CACHE STRING "URL to the JSON lib repo")
+ExternalProject_Add(libjson
+  GIT_REPOSITORY    ${LIBJSON_GIT_URL}
+  GIT_TAG           v2.0.8
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND     ""
+  INSTALL_COMMAND   "")
+
+ExternalProject_get_property(libjson SOURCE_DIR)
+set(LIBJSON_SOURCE_DIR ${SOURCE_DIR})
+
+
+# Rang
+# ----
+set(LIBRANG_GIT_URL "https://github.com/agauniyal/rang.git" CACHE STRING "URL to the Rang lib repo")
+ExternalProject_Add(rang_cpp_color
+  GIT_REPOSITORY    ${LIBRANG_GIT_URL}
+  GIT_TAG           master
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND     ""
+  INSTALL_COMMAND   "")
+
+ExternalProject_get_property(rang_cpp_color SOURCE_DIR)
+set(LIBRANG_SOURCE_DIR ${SOURCE_DIR})
+
+
+# mbed TLS
+# --------
+set(MBED_TLS_TAG mbedtls-2.4.0)
+set(MBED_TLS_GIT_URL "https://github.com/ARMmbed/mbedtls.git" CACHE STRING "URL to MbedTLS")
+set(MBED_TLS_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/mbed_tls)
+
+
+ExternalProject_Add(mbed_tls
+  PREFIX            ${MBED_TLS_PREFIX}
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND     ""
+  INSTALL_COMMAND   ""
+  GIT_REPOSITORY    ${MBED_TLS_GIT_URL}
+  GIT_TAG           ${MBED_TLS_TAG}
+  UPDATE_COMMAND    "" # repetitive update are a pain
+  BUILD_BYPRODUCTS  ${MBED_TLS_PREFIX})
+
+ExternalProject_get_property(mbed_tls SOURCE_DIR)
+set(MBEDTLS_SOURCE_DIR ${SOURCE_DIR})
+set(MBEDTLS_INCLUDE_DIRS "${MBEDTLS_SOURCE_DIR}/include")
+
+set(mbedtls_src_crypto
+    ${MBEDTLS_SOURCE_DIR}/library/aes.c
+    ${MBEDTLS_SOURCE_DIR}/library/aesni.c
+    ${MBEDTLS_SOURCE_DIR}/library/arc4.c
+    ${MBEDTLS_SOURCE_DIR}/library/asn1parse.c
+    ${MBEDTLS_SOURCE_DIR}/library/asn1write.c
+    ${MBEDTLS_SOURCE_DIR}/library/base64.c
+    ${MBEDTLS_SOURCE_DIR}/library/bignum.c
+    ${MBEDTLS_SOURCE_DIR}/library/blowfish.c
+    ${MBEDTLS_SOURCE_DIR}/library/camellia.c
+    ${MBEDTLS_SOURCE_DIR}/library/ccm.c
+    ${MBEDTLS_SOURCE_DIR}/library/cipher.c
+    ${MBEDTLS_SOURCE_DIR}/library/cipher_wrap.c
+    ${MBEDTLS_SOURCE_DIR}/library/cmac.c
+    ${MBEDTLS_SOURCE_DIR}/library/ctr_drbg.c
+    ${MBEDTLS_SOURCE_DIR}/library/des.c
+    ${MBEDTLS_SOURCE_DIR}/library/dhm.c
+    ${MBEDTLS_SOURCE_DIR}/library/ecdh.c
+    ${MBEDTLS_SOURCE_DIR}/library/ecdsa.c
+    ${MBEDTLS_SOURCE_DIR}/library/ecjpake.c
+    ${MBEDTLS_SOURCE_DIR}/library/ecp.c
+    ${MBEDTLS_SOURCE_DIR}/library/ecp_curves.c
+    ${MBEDTLS_SOURCE_DIR}/library/entropy.c
+    ${MBEDTLS_SOURCE_DIR}/library/entropy_poll.c
+    ${MBEDTLS_SOURCE_DIR}/library/error.c
+    ${MBEDTLS_SOURCE_DIR}/library/gcm.c
+    ${MBEDTLS_SOURCE_DIR}/library/havege.c
+    ${MBEDTLS_SOURCE_DIR}/library/hmac_drbg.c
+    ${MBEDTLS_SOURCE_DIR}/library/md.c
+    ${MBEDTLS_SOURCE_DIR}/library/md2.c
+    ${MBEDTLS_SOURCE_DIR}/library/md4.c
+    ${MBEDTLS_SOURCE_DIR}/library/md5.c
+    ${MBEDTLS_SOURCE_DIR}/library/md_wrap.c
+    ${MBEDTLS_SOURCE_DIR}/library/memory_buffer_alloc.c
+    ${MBEDTLS_SOURCE_DIR}/library/oid.c
+    ${MBEDTLS_SOURCE_DIR}/library/padlock.c
+    ${MBEDTLS_SOURCE_DIR}/library/pem.c
+    ${MBEDTLS_SOURCE_DIR}/library/pk.c
+    ${MBEDTLS_SOURCE_DIR}/library/pk_wrap.c
+    ${MBEDTLS_SOURCE_DIR}/library/pkcs12.c
+    ${MBEDTLS_SOURCE_DIR}/library/pkcs5.c
+    ${MBEDTLS_SOURCE_DIR}/library/pkparse.c
+    ${MBEDTLS_SOURCE_DIR}/library/pkwrite.c
+    ${MBEDTLS_SOURCE_DIR}/library/platform.c
+    ${MBEDTLS_SOURCE_DIR}/library/ripemd160.c
+    ${MBEDTLS_SOURCE_DIR}/library/rsa.c
+    ${MBEDTLS_SOURCE_DIR}/library/sha1.c
+    ${MBEDTLS_SOURCE_DIR}/library/sha256.c
+    ${MBEDTLS_SOURCE_DIR}/library/sha512.c
+    ${MBEDTLS_SOURCE_DIR}/library/threading.c
+    ${MBEDTLS_SOURCE_DIR}/library/timing.c
+    ${MBEDTLS_SOURCE_DIR}/library/version.c
+    ${MBEDTLS_SOURCE_DIR}/library/version_features.c
+    ${MBEDTLS_SOURCE_DIR}/library/xtea.c
+)
+
+set(mbedtls_src_x509
+    ${MBEDTLS_SOURCE_DIR}/library/certs.c
+    ${MBEDTLS_SOURCE_DIR}/library/pkcs11.c
+    ${MBEDTLS_SOURCE_DIR}/library/x509.c
+    ${MBEDTLS_SOURCE_DIR}/library/x509_create.c
+    ${MBEDTLS_SOURCE_DIR}/library/x509_crl.c
+    ${MBEDTLS_SOURCE_DIR}/library/x509_crt.c
+    ${MBEDTLS_SOURCE_DIR}/library/x509_csr.c
+    ${MBEDTLS_SOURCE_DIR}/library/x509write_crt.c
+    ${MBEDTLS_SOURCE_DIR}/library/x509write_csr.c
+)
+
+set(mbedtls_src_tls
+    ${MBEDTLS_SOURCE_DIR}/library/debug.c
+    ${MBEDTLS_SOURCE_DIR}/library/net_sockets.c
+    ${MBEDTLS_SOURCE_DIR}/library/ssl_cache.c
+    ${MBEDTLS_SOURCE_DIR}/library/ssl_ciphersuites.c
+    ${MBEDTLS_SOURCE_DIR}/library/ssl_cli.c
+    ${MBEDTLS_SOURCE_DIR}/library/ssl_cookie.c
+    ${MBEDTLS_SOURCE_DIR}/library/ssl_srv.c
+    ${MBEDTLS_SOURCE_DIR}/library/ssl_ticket.c
+    ${MBEDTLS_SOURCE_DIR}/library/ssl_tls.c
+)
+
+
+# easyloggingpp
+# -------------
+set(ELG_GIT_URL "https://github.com/easylogging/easyloggingpp.git" CACHE STRING "URL to the easyloggingpp lib repo")
+ExternalProject_Add(easyloggingpp
+  GIT_REPOSITORY    ${ELG_GIT_URL}
+  #GIT_TAG           "v9.83"
+  GIT_TAG           "master"
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND     ""
+  INSTALL_COMMAND   "")
+
+ExternalProject_get_property(easyloggingpp SOURCE_DIR)
+set(ELG_SOURCE_DIR ${SOURCE_DIR}/src)
+
+
+
+# LIEF Source definition
+# ======================
+set_source_files_properties(${mbedtls_src_crypto} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${mbedtls_src_x509} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${mbedtls_src_tls} PROPERTIES GENERATED TRUE)
+set_source_files_properties(${ELG_SOURCE_DIR}/easylogging++.cc PROPERTIES GENERATED TRUE)
+
+set(LIEF_SRC
+  ${ELG_SOURCE_DIR}/easylogging++.cc
+  ${mbedtls_src_crypto}
+  ${mbedtls_src_x509}
+  ${mbedtls_src_tls}
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/logging.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/exception.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/iostream.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/utils.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/Visitable.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/Visitor.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/BinaryStream/BinaryStream.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/BinaryStream/VectorStream.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/visitors/elf_json.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/visitors/json.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/visitors/hash.cpp)
+
+set(LIEF_ABSTRACT_SRC
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/Abstract/Binary.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/Abstract/Symbol.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/Abstract/EnumToString.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/Abstract/Header.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/Abstract/Section.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/src/Abstract/Parser.cpp)
+
+
+
+set(LIBLIEF_SOURCE_FILES
+  ${LIEF_SRC}
+  ${LIEF_ABSTRACT_SRC})
+
+add_library(LIB_LIEF_STATIC STATIC ${LIBLIEF_SOURCE_FILES}) # Static one
+add_library(LIB_LIEF_SHARED SHARED ${LIBLIEF_SOURCE_FILES}) # Shared one
+
+
+if (LIEF_ELF)
+  include(${CMAKE_CURRENT_SOURCE_DIR}/src/ELF/CMakeLists.txt)
+endif()
+
+if (LIEF_PE)
+  include(${CMAKE_CURRENT_SOURCE_DIR}/src/PE/CMakeLists.txt)
+endif()
+
+if (LIEF_MACHO)
+  include(${CMAKE_CURRENT_SOURCE_DIR}/src/MachO/CMakeLists.txt)
+endif()
+
+
+# LIEF includes
+# =============
+
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/version.h.in
+  ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/version.h
+)
+
+set (LIEF_PUBLIC_INCLUDE_DIR
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/
+  ${CMAKE_CURRENT_BINARY_DIR}/include/
+  ${LIBJSON_SOURCE_DIR}/src/)
+
+set(LIEF_PRIVATE_INCLUDE_DIR
+  ${LIEF_PUBLIC_INCLUDE_DIR}
+  ${LIBRANG_SOURCE_DIR}/include
+  ${ELG_SOURCE_DIR}/
+  ${MBEDTLS_INCLUDE_DIRS})
+
+# Library definition
+# ==================
+add_definitions(-DELPP_NO_DEFAULT_LOG_FILE)
+if (LIEF_ELF)
+  add_definitions(-DLIEF_ELF_MODULE)
+endif()
+
+if (LIEF_PE)
+  add_definitions(-DLIEF_PE_MODULE)
+endif()
+
+if (LIEF_MACHO)
+  add_definitions(-DLIEF_MACHO_MODULE)
+endif()
+
+target_include_directories(LIB_LIEF_STATIC
+  PUBLIC  ${LIEF_PUBLIC_INCLUDE_DIR}
+  PRIVATE ${LIEF_PRIVATE_INCLUDE_DIR})
+
+target_include_directories(LIB_LIEF_SHARED
+  PUBLIC  ${LIEF_PUBLIC_INCLUDE_DIR}
+  PRIVATE ${LIEF_PRIVATE_INCLUDE_DIR})
+
+
+add_dependencies(LIB_LIEF_STATIC libjson)
+add_dependencies(LIB_LIEF_SHARED libjson)
+
+add_dependencies(LIB_LIEF_STATIC easyloggingpp)
+add_dependencies(LIB_LIEF_SHARED easyloggingpp)
+
+add_dependencies(LIB_LIEF_STATIC rang_cpp_color)
+add_dependencies(LIB_LIEF_SHARED rang_cpp_color)
+
+add_dependencies(LIB_LIEF_STATIC mbed_tls)
+add_dependencies(LIB_LIEF_SHARED mbed_tls)
+
+# Flags definition
+# ----------------
+set_property(TARGET LIB_LIEF_STATIC LIB_LIEF_SHARED PROPERTY CXX_STANDARD              11)
+set_property(TARGET LIB_LIEF_STATIC LIB_LIEF_SHARED PROPERTY CXX_STANDARD_REQUIRED     ON)
+set_property(TARGET LIB_LIEF_STATIC LIB_LIEF_SHARED PROPERTY POSITION_INDEPENDENT_CODE ON)
+#set_property(TARGET LIB_LIEF_STATIC LIB_LIEF_SHARED PROPERTY CXX_VISIBILITY_PRESET hidden)
+
+
+CHECK_CXX_COMPILER_FLAG("-Weverything" HAS_WARN_EVERY)
+
+if (LIEF_EXTRA_WARNINGS AND HAS_WARN_EVERY)
+  set(EXTRA_FLAGS
+    -Weverything
+    -Wno-c++98-compat
+    -Wno-c++98-compat-pedantic
+    -Wno-padded
+    -Wno-unused-exception-parameter
+    -Wno-weak-vtables
+    -Wno-exit-time-destructors
+    -Wno-global-constructors
+    -Wno-documentation
+    -Wno-documentation-unknown-command
+    -Wno-sign-conversion)
+
+  target_compile_options(LIB_LIEF_STATIC PRIVATE ${EXTRA_FLAGS})
+  target_compile_options(LIB_LIEF_SHARED PRIVATE ${EXTRA_FLAGS})
+endif()
+
+if (MSVC)
+  add_definitions(-DNOMINMAX)
+  target_compile_options(LIB_LIEF_STATIC PUBLIC /FIiso646.h)
+  target_compile_options(LIB_LIEF_SHARED PUBLIC /FIiso646.h)
+
+  target_compile_options(LIB_LIEF_STATIC PUBLIC /MT)
+
+endif()
+
+if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+  if (UNIX)
+    if (LIEF_FORCE32)
+      target_compile_options(LIB_LIEF_STATIC PRIVATE -m32)
+      target_compile_options(LIB_LIEF_SHARED PRIVATE -m32)
+
+      set_property(TARGET LIB_LIEF_STATIC LIB_LIEF_SHARED PROPERTY LINK_FLAGS -m32)
+    endif()
+
+    set(LIB_LIEF_COMPILE_FLAGS
+      -Wall -Wextra -Wpedantic
+      -Wno-expansion-to-defined
+      -fno-stack-protector
+      -fomit-frame-pointer -fno-strict-aliasing
+      -fexceptions
+      -fvisibility=hidden)
+    target_compile_options(LIB_LIEF_STATIC PRIVATE ${LIB_LIEF_COMPILE_FLAGS})
+    target_compile_options(LIB_LIEF_SHARED PRIVATE ${LIB_LIEF_COMPILE_FLAGS})
+  endif()
+endif()
+
+
+if(CROSS_COMPILE_WINDOWS)
+  target_link_libraries(LIB_LIEF_STATIC -static -static-libgcc -static-libstdc++)
+endif()
+
+if(LIEF_COVERAGE)
+  target_compile_options(LIB_LIEF_STATIC PRIVATE -g -O0 --coverage -fprofile-arcs -ftest-coverage)
+  target_compile_options(LIB_LIEF_SHARED PRIVATE -g -O0 --coverage -fprofile-arcs -ftest-coverage)
+  target_link_libraries(LIB_LIEF_STATIC gcov)
+  target_link_libraries(LIB_LIEF_SHARED gcov)
+endif()
+
+find_package(cppcheck)
+
+set_target_properties(
+  LIB_LIEF_STATIC
+  PROPERTIES OUTPUT_NAME LIEF
+  CLEAN_DIRECT_OUTPUT 1)
+
+set_target_properties(
+  LIB_LIEF_SHARED
+  PROPERTIES OUTPUT_NAME LIEF
+  CLEAN_DIRECT_OUTPUT 1)
+
+
+
+# Set a default build type if none was specified
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+  message(STATUS "Setting build type to 'Release' as none was specified.")
+  set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE)
+  # Set the possible values of build type for cmake-gui
+  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
+    "MinSizeRel" "RelWithDebInfo")
+endif()
+
+message(STATUS "Configuration Types: ${CMAKE_CONFIGURATION_TYPES}")
+message(STATUS "Build Types: ${CMAKE_BUILD_TYPE}")
+
+
+if(APPLE)
+  set_target_properties(LIB_LIEF_STATIC PROPERTIES MACOSX_RPATH ".")
+  set_target_properties(LIB_LIEF_SHARED PROPERTIES MACOSX_RPATH ".")
+endif()
+
+
+# API
+# ===
+
+# Python
+# ------
+
+if (LIEF_PYTHON_API)
+  if(WIN32)
+    set(PYTHON_BUILD_LIEF_DIRECTORY "${CMAKE_BINARY_DIR}/api/python/Release")
+  else()
+    set(PYTHON_BUILD_LIEF_DIRECTORY "${CMAKE_BINARY_DIR}/api/python")
+  endif()
+  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/api/python)
+endif()
+
+# C API
+# -----
+if(LIEF_C_API)
+
+  # ELF
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/enums.h.in
+    ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/ELF/enums.h
+    @ONLY
+  )
+
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/ELF/structures.h.in
+    ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/ELF/structures.h
+    @ONLY
+  )
+
+  # PE
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/enums.h.in
+    ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/PE/enums.h
+    @ONLY
+  )
+
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/PE/structures.h.in
+    ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/PE/structures.h
+    @ONLY
+  )
+
+
+  # MachO
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/enums.h.in
+    ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/MachO/enums.h
+    @ONLY
+  )
+
+  configure_file(
+    ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include/LIEF/MachO/structures.h.in
+    ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/MachO/structures.h
+    @ONLY
+  )
+
+  target_include_directories(LIB_LIEF_STATIC
+    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include
+    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include)
+
+  target_include_directories(LIB_LIEF_SHARED
+    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include
+    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/api/c/include)
+
+  include(${CMAKE_CURRENT_SOURCE_DIR}/api/c/CMakeLists.txt)
+endif()
+
+
+
+# Examples
+# ========
+if(LIEF_EXAMPLES)
+  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/examples/cpp)
+
+  if (LIEF_C_API)
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/examples/c)
+  endif()
+endif()
+
+# Tests
+# =====
+if(LIEF_TESTS)
+  enable_testing()
+  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tests)
+  add_custom_target(check-lief COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure)
+endif()
+
+# CPP Check
+# =========
+set(CPPCHECK_TEMPLATE_ARG "[{severity}][{id}] {message} {callstack} \(On {file}:{line}\)")
+set(_cppcheck_args "--enable=warning,performance,portability,information")
+#add_cppcheck(LIB_LIEF_STATIC FORCE)
+
+
+# Documentation
+# =============
+if (LIEF_DOC)
+  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/doc)
+endif()
+
+
+# Install Prefix
+# ==============
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND UNIX)
+  if (UNIX AND NOT APPLE)
+    set(CMAKE_INSTALL_PREFIX "/usr" CACHE PATH "Install path prefix prepended on to install directories." FORCE)
+  elseif (APPLE)
+    set(CMAKE_INSTALL_PREFIX "/usr/local" CACHE PATH "" FORCE)
+  endif()
+endif()
+
+# Installation
+# ============
+
+install(TARGETS LIB_LIEF_STATIC
+  ARCHIVE
+  DESTINATION lib
+  LIBRARY
+  DESTINATION lib
+  COMPONENT libraries)
+
+install(TARGETS LIB_LIEF_SHARED
+  ARCHIVE
+  DESTINATION lib
+  LIBRARY
+  DESTINATION lib
+  COMPONENT libraries)
+
+install(
+  DIRECTORY ${LIEF_PUBLIC_INCLUDE_DIR}
+  DESTINATION include
+  COMPONENT headers
+  FILES_MATCHING REGEX "(.*).(hpp|h|def)$")
+
+# Package
+add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/package)
+
+
+
+
+
diff --git a/CMakeModules/CodeCoverage.cmake b/CMakeModules/CodeCoverage.cmake
new file mode 100644
index 0000000..d5d4940
--- /dev/null
+++ b/CMakeModules/CodeCoverage.cmake
@@ -0,0 +1,197 @@
+# Copyright (c) 2012 - 2015, Lars Bilke
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice, this
+#    list of conditions and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+#    this list of conditions and the following disclaimer in the documentation
+#    and/or other materials provided with the distribution.
+#
+# 3. Neither the name of the copyright holder nor the names of its contributors
+#    may be used to endorse or promote products derived from this software without
+#    specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+#
+#
+# 2012-01-31, Lars Bilke
+# - Enable Code Coverage
+#
+# 2013-09-17, Joakim Söderberg
+# - Added support for Clang.
+# - Some additional usage instructions.
+#
+# USAGE:
+
+# 0. (Mac only) If you use Xcode 5.1 make sure to patch geninfo as described here:
+#      http://stackoverflow.com/a/22404544/80480
+#
+# 1. Copy this file into your cmake modules path.
+#
+# 2. Add the following line to your CMakeLists.txt:
+#      INCLUDE(CodeCoverage)
+#
+# 3. Set compiler flags to turn off optimization and enable coverage:
+#    SET(CMAKE_CXX_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
+#	 SET(CMAKE_C_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
+#
+# 3. Use the function SETUP_TARGET_FOR_COVERAGE to create a custom make target
+#    which runs your test executable and produces a lcov code coverage report:
+#    Example:
+#	 SETUP_TARGET_FOR_COVERAGE(
+#				my_coverage_target  # Name for custom target.
+#				test_driver         # Name of the test driver executable that runs the tests.
+#									# NOTE! This should always have a ZERO as exit code
+#									# otherwise the coverage generation will not complete.
+#				coverage            # Name of output directory.
+#				)
+#
+# 4. Build a Debug build:
+#	 cmake -DCMAKE_BUILD_TYPE=Debug ..
+#	 make
+#	 make my_coverage_target
+#
+#
+
+# Check prereqs
+FIND_PROGRAM( GCOV_PATH gcov )
+FIND_PROGRAM( LCOV_PATH lcov )
+FIND_PROGRAM( GENHTML_PATH genhtml )
+FIND_PROGRAM( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/tests)
+
+IF(NOT GCOV_PATH)
+	MESSAGE(FATAL_ERROR "gcov not found! Aborting...")
+ENDIF() # NOT GCOV_PATH
+
+IF("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang")
+	IF("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3)
+		MESSAGE(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...")
+	ENDIF()
+ELSEIF(NOT CMAKE_COMPILER_IS_GNUCXX)
+	MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
+ENDIF() # CHECK VALID COMPILER
+
+SET(CMAKE_CXX_FLAGS_COVERAGE
+    "-g -O0 --coverage  -fprofile-arcs -ftest-coverage"
+    CACHE STRING "Flags used by the C++ compiler during coverage builds."
+    FORCE )
+SET(CMAKE_C_FLAGS_COVERAGE
+    "-g -O0 --coverage -fprofile-arcs -ftest-coverage"
+    CACHE STRING "Flags used by the C compiler during coverage builds."
+    FORCE )
+SET(CMAKE_EXE_LINKER_FLAGS_COVERAGE
+    ""
+    CACHE STRING "Flags used for linking binaries during coverage builds."
+    FORCE )
+SET(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
+    ""
+    CACHE STRING "Flags used by the shared libraries linker during coverage builds."
+    FORCE )
+MARK_AS_ADVANCED(
+    CMAKE_CXX_FLAGS_COVERAGE
+    CMAKE_C_FLAGS_COVERAGE
+    CMAKE_EXE_LINKER_FLAGS_COVERAGE
+    CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
+
+IF ( NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "Coverage"))
+  MESSAGE( WARNING "Code coverage results with an optimized (non-Debug) build may be misleading" )
+ENDIF() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug"
+
+
+# Param _targetname     The name of new the custom make target
+# Param _testrunner     The name of the target which runs the tests.
+#						MUST return ZERO always, even on errors.
+#						If not, no coverage report will be created!
+# Param _outputname     lcov output is generated as _outputname.info
+#                       HTML report is generated in _outputname/index.html
+# Optional fourth parameter is passed as arguments to _testrunner
+#   Pass them in list form, e.g.: "-j;2" for -j 2
+FUNCTION(SETUP_TARGET_FOR_COVERAGE _targetname _testrunner _outputname)
+
+	IF(NOT LCOV_PATH)
+		MESSAGE(FATAL_ERROR "lcov not found! Aborting...")
+	ENDIF() # NOT LCOV_PATH
+
+	IF(NOT GENHTML_PATH)
+		MESSAGE(FATAL_ERROR "genhtml not found! Aborting...")
+	ENDIF() # NOT GENHTML_PATH
+
+	SET(coverage_info "${CMAKE_BINARY_DIR}/${_outputname}.info")
+	SET(coverage_cleaned "${coverage_info}.cleaned")
+
+	SEPARATE_ARGUMENTS(test_command UNIX_COMMAND "${_testrunner}")
+
+	# Setup target
+	ADD_CUSTOM_TARGET(${_targetname}
+
+		# Cleanup lcov
+		${LCOV_PATH} --directory . --zerocounters
+
+		# Run tests
+		COMMAND ${test_command} ${ARGV3}
+
+		# Capturing lcov counters and generating report
+		COMMAND ${LCOV_PATH} --directory . --capture --output-file ${coverage_info}
+		COMMAND ${LCOV_PATH} --remove ${coverage_info} 'tests/*' '/usr/*' --output-file ${coverage_cleaned}
+		COMMAND ${GENHTML_PATH} -o ${_outputname} ${coverage_cleaned}
+		COMMAND ${CMAKE_COMMAND} -E remove ${coverage_info} ${coverage_cleaned}
+
+		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+		COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report."
+	)
+
+	# Show info where to find the report
+	ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD
+		COMMAND ;
+		COMMENT "Open ./${_outputname}/index.html in your browser to view the coverage report."
+	)
+
+ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE
+
+# Param _targetname     The name of new the custom make target
+# Param _testrunner     The name of the target which runs the tests
+# Param _outputname     cobertura output is generated as _outputname.xml
+# Optional fourth parameter is passed as arguments to _testrunner
+#   Pass them in list form, e.g.: "-j;2" for -j 2
+FUNCTION(SETUP_TARGET_FOR_COVERAGE_COBERTURA _targetname _testrunner _outputname)
+
+	IF(NOT PYTHON_EXECUTABLE)
+		MESSAGE(FATAL_ERROR "Python not found! Aborting...")
+	ENDIF() # NOT PYTHON_EXECUTABLE
+
+	IF(NOT GCOVR_PATH)
+		MESSAGE(FATAL_ERROR "gcovr not found! Aborting...")
+	ENDIF() # NOT GCOVR_PATH
+
+	ADD_CUSTOM_TARGET(${_targetname}
+
+		# Run tests
+		${_testrunner} ${ARGV3}
+
+		# Running gcovr
+		COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} -e '${CMAKE_SOURCE_DIR}/tests/'  -o ${_outputname}.xml
+		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+		COMMENT "Running gcovr to produce Cobertura code coverage report."
+	)
+
+	# Show info where to find the report
+	ADD_CUSTOM_COMMAND(TARGET ${_targetname} POST_BUILD
+		COMMAND ;
+		COMMENT "Cobertura code coverage report saved in ${_outputname}.xml."
+	)
+
+ENDFUNCTION() # SETUP_TARGET_FOR_COVERAGE_COBERTURA
diff --git a/CMakeModules/CppcheckTargets.cmake b/CMakeModules/CppcheckTargets.cmake
new file mode 100644
index 0000000..29bc898
--- /dev/null
+++ b/CMakeModules/CppcheckTargets.cmake
@@ -0,0 +1,231 @@
+# - Run cppcheck on c++ source files as a custom target and a test
+#
+#  include(CppcheckTargets)
+#  add_cppcheck(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FORCE] [FAIL_ON_WARNINGS]) -
+#    Create a target to check a target's sources with cppcheck and the indicated options
+#  add_cppcheck_sources(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FORCE] [FAIL_ON_WARNINGS]) -
+#    Create a target to check standalone sources with cppcheck and the indicated options
+#
+# Requires these CMake modules:
+#  Findcppcheck
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+if(__add_cppcheck)
+	return()
+endif()
+set(__add_cppcheck YES)
+
+if(NOT CPPCHECK_FOUND)
+	find_package(cppcheck QUIET)
+endif()
+
+if(CPPCHECK_FOUND)
+	if(NOT TARGET all_cppcheck)
+		add_custom_target(all_cppcheck)
+		set_target_properties(all_cppcheck PROPERTIES EXCLUDE_FROM_ALL TRUE)
+	endif()
+endif()
+
+function(add_cppcheck_sources _targetname)
+	if(CPPCHECK_FOUND)
+		set(_cppcheck_args)
+		set(_input ${ARGN})
+		list(FIND _input UNUSED_FUNCTIONS _unused_func)
+		if("${_unused_func}" GREATER "-1")
+			list(APPEND _cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG})
+			list(REMOVE_AT _input ${_unused_func})
+		endif()
+
+		list(FIND _input STYLE _style)
+		if("${_style}" GREATER "-1")
+			list(APPEND _cppcheck_args ${CPPCHECK_STYLE_ARG})
+			list(REMOVE_AT _input ${_style})
+		endif()
+
+		list(FIND _input POSSIBLE_ERROR _poss_err)
+		if("${_poss_err}" GREATER "-1")
+			list(APPEND _cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG})
+			list(REMOVE_AT _input ${_poss_err})
+		endif()
+
+		list(FIND _input FORCE _force)
+		if("${_force}" GREATER "-1")
+			list(APPEND _cppcheck_args "--force")
+			list(REMOVE_AT _input ${_force})
+		endif()
+
+		list(FIND _input FAIL_ON_WARNINGS _fail_on_warn)
+		if("${_fail_on_warn}" GREATER "-1")
+			list(APPEND
+				CPPCHECK_FAIL_REGULAR_EXPRESSION
+				${CPPCHECK_WARN_REGULAR_EXPRESSION})
+			list(REMOVE_AT _input ${_fail_on_warn})
+		endif()
+
+		set(_files)
+		foreach(_source ${_input})
+			get_source_file_property(_cppcheck_loc "${_source}" LOCATION)
+			if(_cppcheck_loc)
+				# This file has a source file property, carry on.
+				get_source_file_property(_cppcheck_lang "${_source}" LANGUAGE)
+				if("${_cppcheck_lang}" MATCHES "CXX")
+					list(APPEND _files "${_cppcheck_loc}")
+				endif()
+			else()
+				# This file doesn't have source file properties - figure it out.
+				get_filename_component(_cppcheck_loc "${_source}" ABSOLUTE)
+				if(EXISTS "${_cppcheck_loc}")
+					list(APPEND _files "${_cppcheck_loc}")
+				else()
+					message(FATAL_ERROR
+						"Adding CPPCHECK for file target ${_targetname}: "
+						"File ${_source} does not exist or needs a corrected path location "
+						"since we think its absolute path is ${_cppcheck_loc}")
+				endif()
+			endif()
+		endforeach()
+
+		if("1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0")
+			# Older than CMake 2.8.0
+			add_test(${_targetname}_cppcheck_test
+				"${CPPCHECK_EXECUTABLE}"
+				${CPPCHECK_TEMPLATE_ARG}
+				${_cppcheck_args} "--inline-suppr"
+				${_files})
+		else()
+			# CMake 2.8.0 and newer
+			add_test(NAME
+				${_targetname}_cppcheck_test
+				COMMAND
+				"${CPPCHECK_EXECUTABLE}"
+				${CPPCHECK_TEMPLATE_ARG}
+				${_cppcheck_args} "--inline-suppr"
+				${_files})
+		endif()
+
+		set_tests_properties(${_targetname}_cppcheck_test
+			PROPERTIES
+			FAIL_REGULAR_EXPRESSION
+			"${CPPCHECK_FAIL_REGULAR_EXPRESSION}")
+
+		add_custom_command(TARGET
+			all_cppcheck
+			PRE_BUILD
+			COMMAND
+			${CPPCHECK_EXECUTABLE}
+			${CPPCHECK_QUIET_ARG}
+			${CPPCHECK_TEMPLATE_ARG}
+			${_cppcheck_args} "--inline-suppr"
+			${_files}
+			WORKING_DIRECTORY
+			"${CMAKE_CURRENT_SOURCE_DIR}"
+			COMMENT
+			"${_targetname}_cppcheck: Running cppcheck on target ${_targetname}..."
+			VERBATIM)
+	endif()
+endfunction()
+
+function(add_cppcheck _name)
+	if(NOT TARGET ${_name})
+		message(FATAL_ERROR
+			"add_cppcheck given a target name that does not exist: '${_name}' !")
+	endif()
+	if(CPPCHECK_FOUND)
+    set(_cppcheck_args CACHE STRING "${_cppcheck_args} ")
+    #set(_cppcheck_args "${_cppcheck_args} ")
+		list(FIND ARGN UNUSED_FUNCTIONS _unused_func)
+		if("${_unused_func}" GREATER "-1")
+			list(APPEND _cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG})
+		endif()
+
+		list(FIND ARGN STYLE _style)
+		if("${_style}" GREATER "-1")
+			list(APPEND _cppcheck_args ${CPPCHECK_STYLE_ARG})
+		endif()
+
+    list(FIND ARGN POSSIBLE_ERROR _poss_err)
+		if("${_poss_err}" GREATER "-1")
+			list(APPEND _cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG})
+		endif()
+
+		list(FIND ARGN FORCE _force)
+		if("${_force}" GREATER "-1")
+			list(APPEND _cppcheck_args "--force")
+		endif()
+
+		list(FIND _input FAIL_ON_WARNINGS _fail_on_warn)
+		if("${_fail_on_warn}" GREATER "-1")
+			list(APPEND
+				CPPCHECK_FAIL_REGULAR_EXPRESSION
+				${CPPCHECK_WARN_REGULAR_EXPRESSION})
+			list(REMOVE_AT _input ${_unused_func})
+		endif()
+
+		get_target_property(_cppcheck_includes "${_name}" INCLUDE_DIRECTORIES)
+		set(_includes)
+		foreach(_include ${_cppcheck_includes})
+			list(APPEND _includes "-I${_include}")
+		endforeach()
+
+		get_target_property(_cppcheck_sources "${_name}" SOURCES)
+		set(_files)
+		foreach(_source ${_cppcheck_sources})
+			get_source_file_property(_cppcheck_lang "${_source}" LANGUAGE)
+			get_source_file_property(_cppcheck_loc "${_source}" LOCATION)
+			if("${_cppcheck_lang}" MATCHES "CXX")
+				list(APPEND _files "${_cppcheck_loc}")
+			endif()
+		endforeach()
+
+		if("1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0")
+			# Older than CMake 2.8.0
+			add_test(${_name}_cppcheck_test
+				"${CPPCHECK_EXECUTABLE}"
+				${CPPCHECK_TEMPLATE_ARG}
+				${_cppcheck_args} "--inline-suppr"
+				${_files})
+		else()
+			# CMake 2.8.0 and newer
+			add_test(NAME
+				${_name}_cppcheck_test
+				COMMAND
+				"${CPPCHECK_EXECUTABLE}"
+				${CPPCHECK_TEMPLATE_ARG}
+				${_cppcheck_args} "--inline-suppr"
+				${_files})
+		endif()
+
+		set_tests_properties(${_name}_cppcheck_test
+			PROPERTIES
+			FAIL_REGULAR_EXPRESSION
+			"${CPPCHECK_FAIL_REGULAR_EXPRESSION}")
+    MESSAGE(STATUS "CPPCHECKargs: ${_cppcheck_args}")
+		add_custom_command(TARGET
+			all_cppcheck
+			PRE_BUILD
+			COMMAND
+			${CPPCHECK_EXECUTABLE}
+			${CPPCHECK_QUIET_ARG}
+			${CPPCHECK_TEMPLATE_ARG}
+			${_cppcheck_args} "--inline-suppr"
+			${_includes}
+			${_files}
+			WORKING_DIRECTORY
+			"${CMAKE_CURRENT_SOURCE_DIR}"
+			COMMENT
+			"${_name}_cppcheck: Running cppcheck on target ${_name}..."
+			VERBATIM)
+	endif()
+
+endfunction()
diff --git a/CMakeModules/FindYamlCpp.cmake b/CMakeModules/FindYamlCpp.cmake
new file mode 100644
index 0000000..c099afa
--- /dev/null
+++ b/CMakeModules/FindYamlCpp.cmake
@@ -0,0 +1,98 @@
+# Locate yaml-cpp
+#
+# This module defines
+#  YAMLCPP_FOUND, if false, do not try to link to yaml-cpp
+#  YAMLCPP_LIBNAME, name of yaml library
+#  YAMLCPP_LIBRARY, where to find yaml-cpp
+#  YAMLCPP_LIBRARY_RELEASE, where to find Release or RelWithDebInfo yaml-cpp
+#  YAMLCPP_LIBRARY_DEBUG, where to find Debug yaml-cpp
+#  YAMLCPP_INCLUDE_DIR, where to find yaml.h
+#  YAMLCPP_LIBRARY_DIR, the directories to find YAMLCPP_LIBRARY
+#
+# By default, the dynamic libraries of yaml-cpp will be found. To find the static ones instead,
+# you must set the YAMLCPP_USE_STATIC_LIBS variable to TRUE before calling find_package(YamlCpp ...)
+
+# attempt to find static library first if this is set
+if(YAMLCPP_USE_STATIC_LIBS)
+    set(YAMLCPP_STATIC libyaml-cpp.a)
+    set(YAMLCPP_STATIC_DEBUG libyaml-cpp-dbg.a)
+endif()
+
+if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")    ### Set Yaml libary name for Windows
+  set(YAMLCPP_LIBNAME "libyaml-cppmd" CACHE STRING "Name of YAML library")
+  set(YAMLCPP_LIBNAME optimized ${YAMLCPP_LIBNAME} debug ${YAMLCPP_LIBNAME}d)
+else()                      ### Set Yaml libary name for Unix, Linux, OS X, etc
+  set(YAMLCPP_LIBNAME "yaml-cpp" CACHE STRING "Name of YAML library")
+endif()
+
+# find the yaml-cpp include directory
+find_path(YAMLCPP_INCLUDE_DIR
+  NAMES yaml-cpp/yaml.h
+  PATH_SUFFIXES include
+  PATHS
+    ${PROJECT_SOURCE_DIR}/dependencies/yaml-cpp-0.5.1/include
+    ~/Library/Frameworks/yaml-cpp/include/
+    /Library/Frameworks/yaml-cpp/include/
+    /usr/local/include/
+    /usr/include/
+    /sw/yaml-cpp/         # Fink
+    /opt/local/yaml-cpp/  # DarwinPorts
+    /opt/csw/yaml-cpp/    # Blastwave
+    /opt/yaml-cpp/)
+
+# find the release yaml-cpp library
+find_library(YAMLCPP_LIBRARY_RELEASE
+  NAMES ${YAMLCPP_STATIC} yaml-cpp libyaml-cppmd.lib
+  PATH_SUFFIXES lib64 lib Release RelWithDebInfo
+  PATHS
+    ${PROJECT_SOURCE_DIR}/dependencies/yaml-cpp-0.5.1/
+    ${PROJECT_SOURCE_DIR}/dependencies/yaml-cpp-0.5.1/build
+    ~/Library/Frameworks
+    /Library/Frameworks
+    /usr/local
+    /usr
+    /sw
+    /opt/local
+    /opt/csw
+    /opt)
+
+# find the debug yaml-cpp library
+find_library(YAMLCPP_LIBRARY_DEBUG
+  NAMES ${YAMLCPP_STATIC_DEBUG} yaml-cpp-dbg libyaml-cppmdd.lib
+  PATH_SUFFIXES lib64 lib Debug
+  PATHS
+    ${PROJECT_SOURCE_DIR}/dependencies/yaml-cpp-0.5.1/
+    ${PROJECT_SOURCE_DIR}/dependencies/yaml-cpp-0.5.1/build
+    ~/Library/Frameworks
+    /Library/Frameworks
+    /usr/local
+    /usr
+    /sw
+    /opt/local
+    /opt/csw
+    /opt)
+
+# set library vars
+set(YAMLCPP_LIBRARY ${YAMLCPP_LIBRARY_RELEASE})
+if(CMAKE_BUILD_TYPE MATCHES Debug AND EXISTS ${YAMLCPP_LIBRARY_DEBUG})
+  set(YAMLCPP_LIBRARY ${YAMLCPP_LIBRARY_DEBUG})
+endif()
+
+get_filename_component(YAMLCPP_LIBRARY_RELEASE_DIR ${YAMLCPP_LIBRARY_RELEASE} PATH)
+get_filename_component(YAMLCPP_LIBRARY_DEBUG_DIR ${YAMLCPP_LIBRARY_DEBUG} PATH)
+set(YAMLCPP_LIBRARY_DIR ${YAMLCPP_LIBRARY_RELEASE_DIR} ${YAMLCPP_LIBRARY_DEBUG_DIR})
+
+# handle the QUIETLY and REQUIRED arguments and set YAMLCPP_FOUND to TRUE if all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(YamlCpp DEFAULT_MSG
+  YAMLCPP_INCLUDE_DIR
+  YAMLCPP_LIBRARY
+  YAMLCPP_LIBRARY_DIR)
+mark_as_advanced(
+  YAMLCPP_INCLUDE_DIR
+  YAMLCPP_LIBRARY_DIR
+  YAMLCPP_LIBRARY
+  YAMLCPP_LIBRARY_RELEASE
+  YAMLCPP_LIBRARY_RELEASE_DIR
+  YAMLCPP_LIBRARY_DEBUG
+  YAMLCPP_LIBRARY_DEBUG_DIR)
diff --git a/CMakeModules/Findcppcheck.cmake b/CMakeModules/Findcppcheck.cmake
new file mode 100644
index 0000000..2dcf799
--- /dev/null
+++ b/CMakeModules/Findcppcheck.cmake
@@ -0,0 +1,167 @@
+# - try to find cppcheck tool
+#
+# Cache Variables:
+#  CPPCHECK_EXECUTABLE
+#
+# Non-cache variables you might use in your CMakeLists.txt:
+#  CPPCHECK_FOUND
+#  CPPCHECK_POSSIBLEERROR_ARG
+#  CPPCHECK_UNUSEDFUNC_ARG
+#  CPPCHECK_STYLE_ARG
+#  CPPCHECK_QUIET_ARG
+#  CPPCHECK_INCLUDEPATH_ARG
+#  CPPCHECK_FAIL_REGULAR_EXPRESSION
+#  CPPCHECK_WARN_REGULAR_EXPRESSION
+#  CPPCHECK_MARK_AS_ADVANCED - whether to mark our vars as advanced even
+#    if we don't find this program.
+#
+# Requires these CMake modules:
+#  FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+file(TO_CMAKE_PATH "${CPPCHECK_ROOT_DIR}" CPPCHECK_ROOT_DIR)
+set(CPPCHECK_ROOT_DIR
+	"${CPPCHECK_ROOT_DIR}"
+	CACHE
+	PATH
+	"Path to search for cppcheck")
+
+# cppcheck app bundles on Mac OS X are GUI, we want command line only
+set(_oldappbundlesetting ${CMAKE_FIND_APPBUNDLE})
+set(CMAKE_FIND_APPBUNDLE NEVER)
+
+if(CPPCHECK_EXECUTABLE AND NOT EXISTS "${CPPCHECK_EXECUTABLE}")
+	set(CPPCHECK_EXECUTABLE "notfound" CACHE PATH FORCE "")
+endif()
+
+# If we have a custom path, look there first.
+if(CPPCHECK_ROOT_DIR)
+	find_program(CPPCHECK_EXECUTABLE
+		NAMES
+		cppcheck
+		cli
+		PATHS
+		"${CPPCHECK_ROOT_DIR}"
+		PATH_SUFFIXES
+		cli
+		NO_DEFAULT_PATH)
+endif()
+
+find_program(CPPCHECK_EXECUTABLE NAMES cppcheck)
+
+# Restore original setting for appbundle finding
+set(CMAKE_FIND_APPBUNDLE ${_oldappbundlesetting})
+
+# Find out where our test file is
+get_filename_component(_cppcheckmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
+set(_cppcheckdummyfile "${_cppcheckmoddir}/Findcppcheck.cpp")
+if(NOT EXISTS "${_cppcheckdummyfile}")
+	message(FATAL_ERROR
+		"Missing file ${_cppcheckdummyfile} - should be alongside Findcppcheck.cmake, can be found at https://github.com/rpavlik/cmake-modules")
+endif()
+
+function(_cppcheck_test_arg _resultvar _arg)
+	if(NOT CPPCHECK_EXECUTABLE)
+		set(${_resultvar} NO)
+		return()
+	endif()
+	execute_process(COMMAND
+		"${CPPCHECK_EXECUTABLE}"
+		"${_arg}"
+		"--quiet"
+		"${_cppcheckdummyfile}"
+		RESULT_VARIABLE
+		_cppcheck_result
+		OUTPUT_QUIET
+		ERROR_QUIET)
+	if("${_cppcheck_result}" EQUAL 0)
+		set(${_resultvar} YES PARENT_SCOPE)
+	else()
+		set(${_resultvar} NO PARENT_SCOPE)
+	endif()
+endfunction()
+
+function(_cppcheck_set_arg_var _argvar _arg)
+	if("${${_argvar}}" STREQUAL "")
+		_cppcheck_test_arg(_cppcheck_arg "${_arg}")
+		if(_cppcheck_arg)
+			set(${_argvar} "${_arg}" PARENT_SCOPE)
+		endif()
+	endif()
+endfunction()
+
+if(CPPCHECK_EXECUTABLE)
+
+	# Check for the two types of command line arguments by just trying them
+	_cppcheck_set_arg_var(CPPCHECK_STYLE_ARG "--enable=style")
+	_cppcheck_set_arg_var(CPPCHECK_STYLE_ARG "--style")
+	if("${CPPCHECK_STYLE_ARG}" STREQUAL "--enable=style")
+
+		_cppcheck_set_arg_var(CPPCHECK_UNUSEDFUNC_ARG
+			"--enable=unusedFunction")
+		_cppcheck_set_arg_var(CPPCHECK_INFORMATION_ARG "--enable=information")
+		_cppcheck_set_arg_var(CPPCHECK_MISSINGINCLUDE_ARG
+			"--enable=missingInclude")
+		_cppcheck_set_arg_var(CPPCHECK_POSIX_ARG "--enable=posix")
+		_cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG
+			"--enable=possibleError")
+		_cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG "--enable=all")
+
+		if(MSVC)
+			set(CPPCHECK_TEMPLATE_ARG --template vs)
+			set(CPPCHECK_FAIL_REGULAR_EXPRESSION "[(]error[)]")
+			set(CPPCHECK_WARN_REGULAR_EXPRESSION "[(]style[)]")
+		elseif(CMAKE_COMPILER_IS_GNUCXX)
+			set(CPPCHECK_TEMPLATE_ARG --template gcc)
+			set(CPPCHECK_FAIL_REGULAR_EXPRESSION " error: ")
+			set(CPPCHECK_WARN_REGULAR_EXPRESSION " style: ")
+		else()
+			set(CPPCHECK_TEMPLATE_ARG --template gcc)
+			set(CPPCHECK_FAIL_REGULAR_EXPRESSION " error: ")
+			set(CPPCHECK_WARN_REGULAR_EXPRESSION " style: ")
+		endif()
+	elseif("${CPPCHECK_STYLE_ARG}" STREQUAL "--style")
+		# Old arguments
+		_cppcheck_set_arg_var(CPPCHECK_UNUSEDFUNC_ARG "--unused-functions")
+		_cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG "--all")
+		set(CPPCHECK_FAIL_REGULAR_EXPRESSION "error:")
+		set(CPPCHECK_WARN_REGULAR_EXPRESSION "[(]style[)]")
+	else()
+		# No idea - some other issue must be getting in the way
+		message(STATUS
+			"WARNING: Can't detect whether CPPCHECK wants new or old-style arguments!")
+	endif()
+
+	set(CPPCHECK_QUIET_ARG "--quiet")
+	set(CPPCHECK_INCLUDEPATH_ARG "-I")
+
+endif()
+
+set(CPPCHECK_ALL
+	"${CPPCHECK_EXECUTABLE} ${CPPCHECK_POSSIBLEERROR_ARG} ${CPPCHECK_UNUSEDFUNC_ARG} ${CPPCHECK_STYLE_ARG} ${CPPCHECK_QUIET_ARG} ${CPPCHECK_INCLUDEPATH_ARG} some/include/path")
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(cppcheck
+	DEFAULT_MSG
+	CPPCHECK_ALL
+	CPPCHECK_EXECUTABLE
+	CPPCHECK_POSSIBLEERROR_ARG
+	CPPCHECK_UNUSEDFUNC_ARG
+	CPPCHECK_STYLE_ARG
+	CPPCHECK_INCLUDEPATH_ARG
+	CPPCHECK_QUIET_ARG)
+
+if(CPPCHECK_FOUND OR CPPCHECK_MARK_AS_ADVANCED)
+	mark_as_advanced(CPPCHECK_ROOT_DIR)
+endif()
+
+mark_as_advanced(CPPCHECK_EXECUTABLE)
diff --git a/CMakeModules/Findcppcheck.cpp b/CMakeModules/Findcppcheck.cpp
new file mode 100644
index 0000000..84350db
--- /dev/null
+++ b/CMakeModules/Findcppcheck.cpp
@@ -0,0 +1,16 @@
+/**
+ * \file Findcppcheck.cpp
+ * \brief Dummy C++ source file used by CMake module Findcppcheck.cmake
+ *
+ * \author
+ * Ryan Pavlik, 2009-2010
+ * <rpavlik@iastate.edu>
+ * http://academic.cleardefinition.com/
+ *
+ */
+
+
+
+int main(int argc, char* argv[]) {
+	return 0;
+}
diff --git a/CMakeModules/Toolchain-mingw32.cmake b/CMakeModules/Toolchain-mingw32.cmake
new file mode 100644
index 0000000..84470ad
--- /dev/null
+++ b/CMakeModules/Toolchain-mingw32.cmake
@@ -0,0 +1,19 @@
+SET(CROSS_COMPILE_WINDOWS ON)
+
+# the name of the target operating system
+SET(CMAKE_SYSTEM_NAME Windows)
+
+# which compilers to use for C and C++
+SET(CMAKE_C_COMPILER x86_64-w64-mingw32-gcc)
+SET(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
+SET(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
+
+# here is the target environment located
+SET(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
+
+# adjust the default behaviour of the FIND_XXX() commands:
+# search headers and libraries in the target environment, search
+# programs in the host environment
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..5dd1fd4
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2017 R. Thomas
+   Copyright 2017 Quarkslab
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a6fbc99
--- /dev/null
+++ b/README.md
@@ -0,0 +1,107 @@
+<p align="center" >
+<img width="40%" src="http://romainthomas.fr/logo_blue_with_name_500.png"/><br />
+</p>
+<hr>
+<p>
+  <a href="https://gitter.im/lief-project">
+    <img src="https://img.shields.io/gitter/room/gitterHQ/gitter.svg">
+  </a>
+
+</p>
+
+The purpose of this project is to provide a cross platform library which can parse, modify and abstract ELF, PE and MachO formats.
+
+Main features:
+
+  * **Parsing**: LIEF can parse ELF, PE, MachO and provides an user-friendly API to access to format internals.
+  * **Modify**: LIEF enables to modify some parts of these formats
+  * **Abstract**: Three formats have common features like sections, symbols, entry point... LIEF factors them.
+  * **API**: LIEF can be used in C, C++ and Python
+
+## Getting started
+
+### Python
+
+```python
+import lief
+# ELF
+binary = lief.parse("/usr/bin/ls")
+print(binary)
+
+# PE
+binary = lief.parse("C:\\Windows\\explorer.exe")
+print(binary)
+
+# Mach-O
+binary = lief.parse("/usr/bin/ls")
+print(binary)
+
+```
+
+### C++
+
+```cpp
+#include <LIEF/LIEF.hpp>
+int main(int argc, const char** argv) {
+  LIEF::ELF::Binary*   elf   = LIEF::ELF::Parser::parse("/usr/bin/ls");
+  LIEF::PE::Binary*    pe    = LIEF::PE::Parser::parse("C:\\Windows\\explorer.exe");
+  LIEF::MachO::Binary* macho = LIEF::MachO::Parser::parse("/usr/bin/ls");
+
+  std::cout << *elf   << std::endl;
+  std::cout << *pe    << std::endl;
+  std::cout << *macho << std::endl;
+
+  delete elf;
+  delete pe;
+  delete macho;
+}
+```
+
+### C
+
+```cpp
+#include <LIEF/LIEF.h>
+int main(int argc, const char** argv) {
+
+  Elf_Binary_t*    elf_binary     = elf_parse("/usr/bin/ls");
+  Pe_Binary_t*     pe_binary      = pe_parse("C:\\Windows\\explorer.exe");
+  Macho_Binary_t** macho_binaries = macho_parse("/usr/bin/ls");
+
+  Pe_Section_t**    pe_sections    = pe_binary->sections;
+  Elf_Section_t**   elf_sections   = elf_binary->sections;
+  Macho_Section_t** macho_sections = macho_binaries[0]->sections;
+
+  for (size_t i = 0; pe_sections[i] != NULL; ++i) {
+    printf("%s\n", pe_sections[i]->name)
+  }
+
+  for (size_t i = 0; elf_sections[i] != NULL; ++i) {
+    printf("%s\n", elf_sections[i]->name)
+  }
+
+  for (size_t i = 0; macho_sections[i] != NULL; ++i) {
+    printf("%s\n", macho_sections[i]->name)
+  }
+
+  elf_binary_destroy(elf_binary);
+  pe_binary_destroy(pe_binary);
+  macho_binaries_destroy(macho_binaries);
+}
+
+```
+## Documentation
+
+* [Tutorial](http://lief.quarkslab.com/doc)
+* [API](http://lief.quarkslab.com/doc)
+* [Doxygen](http://lief.quarkslab.com/doc)
+
+## Support
+
+* **Mail**: lief at quarkslab com
+* **Gitter**: [lief-project](https://gitter.im/lief-project)
+
+## Authors
+
+Romain Thomas - [Quarkslab](https://www.quarkslab.com)
+
+
diff --git a/api/c/CMakeLists.txt b/api/c/CMakeLists.txt
new file mode 100644
index 0000000..3b941c5
--- /dev/null
+++ b/api/c/CMakeLists.txt
@@ -0,0 +1,52 @@
+include_directories(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF
+  ${CMAKE_CURRENT_SOURCE_DIR}/include
+)
+
+set(LIEF_C_ELF_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/ELF/Symbol.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ELF/Section.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ELF/Segment.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ELF/DynamicEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ELF/Header.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ELF/Binary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ELF/EnumToString.cpp)
+
+
+set(LIEF_C_PE_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/PE/Binary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/PE/DosHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/PE/Header.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/PE/OptionalHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/PE/Section.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/PE/DataDirectory.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/PE/EnumToString.cpp)
+
+
+set(LIEF_C_MACHO_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/MachO/Parser.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/MachO/LoadCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/MachO/Segment.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/MachO/Symbol.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/MachO/Section.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/MachO/Header.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/MachO/Binary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/MachO/EnumToString.cpp)
+
+set(LIEF_C_SRC)
+
+if (LIEF_ELF)
+  set(LIEF_C_SRC ${LIEF_C_SRC} ${LIEF_C_ELF_SRC})
+endif()
+
+if (LIEF_PE)
+  set(LIEF_C_SRC ${LIEF_C_SRC} ${LIEF_C_PE_SRC})
+endif()
+
+if (LIEF_MACHO)
+  set(LIEF_C_SRC ${LIEF_C_SRC} ${LIEF_C_MACHO_SRC})
+endif()
+
+target_sources(LIB_LIEF_STATIC PRIVATE ${LIEF_C_SRC})
+target_sources(LIB_LIEF_SHARED PRIVATE ${LIEF_C_SRC})
+
diff --git a/api/c/ELF/Binary.cpp b/api/c/ELF/Binary.cpp
new file mode 100644
index 0000000..9370583
--- /dev/null
+++ b/api/c/ELF/Binary.cpp
@@ -0,0 +1,112 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/Binary.h"
+#include "LIEF/ELF/Section.h"
+#include "LIEF/ELF/Segment.h"
+#include "LIEF/ELF/Header.h"
+#include "LIEF/ELF/Symbol.h"
+
+#include "LIEF/ELF/Parser.hpp"
+#include "LIEF/ELF/Binary.hpp"
+
+#include "Section.hpp"
+#include "Segment.hpp"
+#include "DynamicEntry.hpp"
+#include "Symbol.hpp"
+#include "Header.hpp"
+#include "Binary.hpp"
+
+using namespace LIEF::ELF;
+
+namespace LIEF {
+namespace ELF {
+void init_c_binary(Elf_Binary_t* c_binary, Binary* binary) {
+  c_binary->handler     = reinterpret_cast<void*>(binary);
+  c_binary->name        = binary->name().c_str();
+  c_binary->type        = static_cast<enum ::ELF_CLASS>(binary->type());
+  c_binary->interpreter = nullptr;
+  if (binary->has_interpreter()) {
+    std::string interp = binary->get_interpreter();
+    c_binary->interpreter = static_cast<char*>(malloc(interp.size() * sizeof(char)));
+    std::memcpy(
+        reinterpret_cast<void*>(const_cast<char*>(c_binary->interpreter)),
+        reinterpret_cast<const void*>(interp.data()),
+        interp.size());
+  }
+
+
+  init_c_header(c_binary, binary);
+  init_c_sections(c_binary, binary);
+  init_c_segments(c_binary, binary);
+  init_c_dynamic_symbols(c_binary, binary);
+  init_c_static_symbols(c_binary, binary);
+  init_c_dynamic_entries(c_binary, binary);
+
+
+}
+
+}
+}
+
+Elf_Binary_t* elf_parse(const char *file) {
+  Binary* binary = Parser::parse(file);
+  Elf_Binary_t* c_binary = static_cast<Elf_Binary_t*>(malloc(sizeof(Elf_Binary_t)));
+  memset(c_binary, 0, sizeof(Elf_Binary_t));
+  init_c_binary(c_binary, binary);
+  return c_binary;
+}
+
+// Binary Methods
+// ==============
+
+int elf_binary_save_header(Elf_Binary_t* binary) {
+  Header& hdr = reinterpret_cast<Binary*>(binary->handler)->get_header();
+
+  hdr.file_type(static_cast<LIEF::ELF::E_TYPE>(binary->header.file_type));
+  hdr.machine_type(static_cast<LIEF::ELF::ARCH>(binary->header.machine_type));
+  hdr.object_file_version(static_cast<LIEF::ELF::VERSION>(binary->header.object_file_version));
+  hdr.program_headers_offset(binary->header.program_headers_offset);
+  hdr.section_headers_offset(binary->header.section_headers_offset);
+  hdr.processor_flag(binary->header.processor_flags);
+  hdr.header_size(binary->header.header_size);
+  hdr.program_header_size(binary->header.program_header_size);
+  hdr.numberof_segments(binary->header.numberof_segments);
+  hdr.sizeof_section_header(binary->header.sizeof_section_header);
+  hdr.numberof_sections(binary->header.numberof_sections);
+  hdr.section_name_table_idx(binary->header.name_string_table_idx);
+  hdr.entrypoint(binary->header.entrypoint);
+
+  //TODO: identity
+  return true;
+}
+
+
+void elf_binary_destroy(Elf_Binary_t* binary) {
+  destroy_sections(binary);
+  destroy_segments(binary);
+  destroy_dynamic_symbols(binary);
+  destroy_static_symbols(binary);
+  destroy_dynamic_entries(binary);
+
+  if (binary->interpreter != nullptr) {
+    free(const_cast<char*>(binary->interpreter));
+  }
+
+  delete reinterpret_cast<Binary*>(binary->handler);
+  free(binary);
+
+}
+//}
diff --git a/api/c/ELF/Binary.hpp b/api/c/ELF/Binary.hpp
new file mode 100644
index 0000000..61d11a2
--- /dev/null
+++ b/api/c/ELF/Binary.hpp
@@ -0,0 +1,30 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_BINARY_CPP_C_API_
+#define LIEF_ELF_BINARY_CPP_C_API_
+
+#include "LIEF/ELF/Binary.h"
+#include "LIEF/ELF/Binary.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_binary(Elf_Binary_t* c_binary, Binary* binary);
+
+}
+}
+
+#endif
diff --git a/api/c/ELF/DynamicEntry.cpp b/api/c/ELF/DynamicEntry.cpp
new file mode 100644
index 0000000..fd05d67
--- /dev/null
+++ b/api/c/ELF/DynamicEntry.cpp
@@ -0,0 +1,174 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "DynamicEntry.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_dynamic_entries(Elf_Binary_t* c_binary, Binary* binary) {
+
+  it_dynamic_entries dyn_entries = binary->get_dynamic_entries();
+  c_binary->dynamic_entries = static_cast<Elf_DynamicEntry_t**>(
+      malloc((dyn_entries.size() + 1) * sizeof(Elf_DynamicEntry_t**)));
+
+  for (size_t i = 0; i < dyn_entries.size(); ++i) {
+    DynamicEntry& entry = dyn_entries[i];
+    switch(entry.tag()) {
+      case DYNAMIC_TAGS::DT_NEEDED:
+        {
+
+          Elf_DynamicEntry_Library_t* e = static_cast<Elf_DynamicEntry_Library_t*>(
+              malloc(sizeof(Elf_DynamicEntry_Library_t)));
+
+          e->tag   = static_cast<enum ::DYNAMIC_TAGS>(entry.tag());
+          e->value = entry.value();
+          e->name  = dynamic_cast<DynamicEntryLibrary*>(&entry)->name().c_str();
+
+          c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
+          break;
+          // cppcheck-suppress memleak
+        }
+
+      case DYNAMIC_TAGS::DT_SONAME:
+        {
+          Elf_DynamicEntry_SharedObject_t* e = static_cast<Elf_DynamicEntry_SharedObject_t*>(
+              malloc(sizeof(Elf_DynamicEntry_SharedObject_t)));
+
+          e->tag   = static_cast<enum ::DYNAMIC_TAGS>(entry.tag());
+          e->value = entry.value();
+          e->name  = dynamic_cast<DynamicSharedObject*>(&entry)->name().c_str();
+
+          c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RPATH:
+        {
+          Elf_DynamicEntry_Rpath_t* e = static_cast<Elf_DynamicEntry_Rpath_t*>(
+              malloc(sizeof(Elf_DynamicEntry_Rpath_t)));
+
+          e->tag   = static_cast<enum ::DYNAMIC_TAGS>(entry.tag());
+          e->value = entry.value();
+          e->rpath = dynamic_cast<DynamicEntryRpath*>(&entry)->name().c_str();
+
+          c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
+
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RUNPATH:
+        {
+          Elf_DynamicEntry_RunPath_t* e = static_cast<Elf_DynamicEntry_RunPath_t*>(
+              malloc(sizeof(Elf_DynamicEntry_RunPath_t)));
+
+          e->tag   = static_cast<enum ::DYNAMIC_TAGS>(entry.tag());
+          e->value   = entry.value();
+          e->runpath = dynamic_cast<DynamicEntryRunPath*>(&entry)->name().c_str();
+
+          c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
+
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_INIT_ARRAY:
+      case DYNAMIC_TAGS::DT_FINI_ARRAY:
+      case DYNAMIC_TAGS::DT_PREINIT_ARRAY:
+        {
+          Elf_DynamicEntry_Array_t* e = static_cast<Elf_DynamicEntry_Array_t*>(
+              malloc(sizeof(Elf_DynamicEntry_Array_t)));
+
+          e->tag   = static_cast<enum ::DYNAMIC_TAGS>(entry.tag());
+          e->value = entry.value();
+          const std::vector<uint64_t>& array = dynamic_cast<DynamicEntryArray*>(&entry)->array();
+          e->array = static_cast<uint64_t*>(malloc((array.size() + 1) * sizeof(uint64_t)));
+          for (size_t i = 0; i < array.size(); ++i) {
+            e->array[i] = array[i];
+          }
+          e->array[array.size()] = 0;
+          c_binary->dynamic_entries[i] = reinterpret_cast<Elf_DynamicEntry_t*>(e);
+
+          break;
+        }
+      default:
+        {
+          c_binary->dynamic_entries[i] =
+            static_cast<Elf_DynamicEntry_t*>(malloc(sizeof(Elf_DynamicEntry_t)));
+          c_binary->dynamic_entries[i]->tag   = static_cast<enum ::DYNAMIC_TAGS>(entry.tag());
+          c_binary->dynamic_entries[i]->value = entry.value();
+
+        }
+    }
+  }
+
+  c_binary->dynamic_entries[dyn_entries.size()] = nullptr;
+
+}
+
+
+
+void destroy_dynamic_entries(Elf_Binary_t* c_binary) {
+
+  Elf_DynamicEntry_t **dynamic_entries = c_binary->dynamic_entries;
+  for (size_t idx = 0; dynamic_entries[idx] != NULL; ++idx) {
+    switch(dynamic_entries[idx]->tag) {
+      case DYNAMIC_TAGS::DT_NEEDED:
+        {
+          free(reinterpret_cast<Elf_DynamicEntry_Library_t*>(dynamic_entries[idx]));
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_SONAME:
+        {
+          free(reinterpret_cast<Elf_DynamicEntry_SharedObject_t*>(dynamic_entries[idx]));
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RPATH:
+        {
+          free(reinterpret_cast<Elf_DynamicEntry_Rpath_t*>(dynamic_entries[idx]));
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RUNPATH:
+        {
+          free(reinterpret_cast<Elf_DynamicEntry_RunPath_t*>(dynamic_entries[idx]));
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_INIT_ARRAY:
+      case DYNAMIC_TAGS::DT_FINI_ARRAY:
+      case DYNAMIC_TAGS::DT_PREINIT_ARRAY:
+        {
+          free(reinterpret_cast<Elf_DynamicEntry_Array_t*>(dynamic_entries[idx]));
+          break;
+        }
+      default:
+        {
+
+          free(dynamic_entries[idx]);
+        }
+
+
+    }
+  }
+  free(c_binary->dynamic_entries);
+
+}
+
+}
+}
+
+
diff --git a/api/c/ELF/DynamicEntry.hpp b/api/c/ELF/DynamicEntry.hpp
new file mode 100644
index 0000000..5004227
--- /dev/null
+++ b/api/c/ELF/DynamicEntry.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_DYNAMIC_ENTRY_CPP_C_API_
+#define LIEF_ELF_DYNAMIC_ENTRY_CPP_C_API_
+
+#include "LIEF/ELF/Binary.h"
+#include "LIEF/ELF/Binary.hpp"
+
+#include "LIEF/ELF/DynamicEntry.h"
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_dynamic_entries(Elf_Binary_t* c_binary, Binary* binary);
+void destroy_dynamic_entries(Elf_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/ELF/EnumToString.cpp b/api/c/ELF/EnumToString.cpp
new file mode 100644
index 0000000..95e60e9
--- /dev/null
+++ b/api/c/ELF/EnumToString.cpp
@@ -0,0 +1,73 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/EnumToString.h"
+#include "LIEF/ELF/EnumToString.hpp"
+
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/structures.h"
+
+
+extern "C"
+{
+  const char* E_TYPE_to_string(enum E_TYPE e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::E_TYPE>(e));
+  }
+
+  const char* SYMBOL_BINDINGS_to_string(enum SYMBOL_BINDINGS e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::SYMBOL_BINDINGS>(e));
+  }
+
+  const char* VERSION_to_string(enum VERSION e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::VERSION>(e));
+  }
+
+  const char* ARCH_to_string(enum ARCH e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::ARCH>(e));
+  }
+
+  const char* SEGMENT_TYPES_to_string(enum SEGMENT_TYPES e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::SEGMENT_TYPES>(e));
+  }
+
+  const char* DYNAMIC_TAGS_to_string(enum DYNAMIC_TAGS e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::DYNAMIC_TAGS>(e));
+  }
+
+  const char* SECTION_TYPES_to_string(enum SECTION_TYPES e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::SECTION_TYPES>(e));
+  }
+
+  const char* SECTION_FLAGS_to_string(enum SECTION_FLAGS e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::SECTION_FLAGS>(e));
+  }
+
+  const char* SYMBOL_TYPES_to_string(enum SYMBOL_TYPES e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::SYMBOL_TYPES>(e));
+  }
+
+  const char* ELF_CLASS_to_string(enum ELF_CLASS e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::ELF_CLASS>(e));
+  }
+
+  const char* ELF_DATA_to_string(enum ELF_DATA e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::ELF_DATA>(e));
+  }
+
+  const char* OS_ABI_to_string(enum OS_ABI e) {
+    return LIEF::ELF::to_string(static_cast<LIEF::ELF::OS_ABI>(e));
+  }
+
+}
diff --git a/api/c/ELF/Header.cpp b/api/c/ELF/Header.cpp
new file mode 100644
index 0000000..603bac1
--- /dev/null
+++ b/api/c/ELF/Header.cpp
@@ -0,0 +1,46 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Header.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_header(Elf_Binary_t* c_binary, Binary* binary) {
+
+  const Header& hdr                       = binary->get_header();
+  c_binary->header.file_type              = static_cast<enum ::E_TYPE>(hdr.file_type());
+  c_binary->header.machine_type           = static_cast<enum ::ARCH>(hdr.machine_type());
+  c_binary->header.object_file_version    = static_cast<enum ::VERSION>(hdr.object_file_version());
+  c_binary->header.program_headers_offset = hdr.program_headers_offset();
+  c_binary->header.section_headers_offset = hdr.section_headers_offset();
+  c_binary->header.processor_flags        = hdr.processor_flag();
+  c_binary->header.header_size            = hdr.header_size();
+  c_binary->header.program_header_size    = hdr.program_header_size();
+  c_binary->header.numberof_segments      = hdr.numberof_segments();
+  c_binary->header.sizeof_section_header  = hdr.sizeof_section_header();
+  c_binary->header.numberof_sections      = hdr.numberof_sections();
+  c_binary->header.name_string_table_idx  = hdr.section_name_table_idx();
+  c_binary->header.entrypoint             = hdr.entrypoint();
+  const Header::identity_t& ident         = hdr.identity();
+  std::copy(
+      std::begin(ident),
+      std::end(ident),
+      c_binary->header.identity);
+
+}
+
+}
+}
diff --git a/api/c/ELF/Header.hpp b/api/c/ELF/Header.hpp
new file mode 100644
index 0000000..cc2bcd6
--- /dev/null
+++ b/api/c/ELF/Header.hpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_HEADER_CPP_C_API_
+#define LIEF_ELF_HEADER_CPP_C_API_
+
+#include "LIEF/ELF/Binary.h"
+#include "LIEF/ELF/Binary.hpp"
+
+#include "LIEF/ELF/Header.h"
+#include "LIEF/ELF/Header.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_header(Elf_Binary_t* c_binary, Binary* binary);
+
+}
+}
+
+#endif
diff --git a/api/c/ELF/Section.cpp b/api/c/ELF/Section.cpp
new file mode 100644
index 0000000..3c5facf
--- /dev/null
+++ b/api/c/ELF/Section.cpp
@@ -0,0 +1,71 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Section.hpp"
+
+namespace LIEF {
+namespace ELF {
+void init_c_sections(Elf_Binary_t* c_binary, Binary* binary) {
+
+  it_sections sections = binary->get_sections();
+
+  c_binary->sections = static_cast<Elf_Section_t**>(
+      malloc((sections.size() + 1) * sizeof(Elf_Section_t**)));
+
+  for (size_t i = 0; i < sections.size(); ++i) {
+    Section& b_section = sections[i];
+    c_binary->sections[i] = static_cast<Elf_Section_t*>(malloc(sizeof(Elf_Section_t)));
+    const std::vector<uint8_t>& section_content = b_section.content();
+    uint8_t* content = static_cast<uint8_t*>(malloc(section_content.size() * sizeof(uint8_t)));
+    std::copy(
+        std::begin(section_content),
+        std::end(section_content),
+        content);
+
+    c_binary->sections[i]->name            = b_section.name().c_str();
+    c_binary->sections[i]->flags           = b_section.flags();
+    c_binary->sections[i]->type            = static_cast<enum ::SECTION_TYPES>(b_section.type());
+    c_binary->sections[i]->virtual_address = b_section.virtual_address();
+    c_binary->sections[i]->offset          = b_section.file_offset();
+    c_binary->sections[i]->original_size   = b_section.original_size();
+    c_binary->sections[i]->link            = b_section.link();
+    c_binary->sections[i]->info            = b_section.information();
+    c_binary->sections[i]->alignment       = b_section.alignment();
+    c_binary->sections[i]->entry_size      = b_section.entry_size();
+    c_binary->sections[i]->content         = content;
+    c_binary->sections[i]->size            = section_content.size();
+    c_binary->sections[i]->entropy         = b_section.entropy();
+  }
+  c_binary->sections[sections.size()] = nullptr;
+
+}
+
+
+
+void destroy_sections(Elf_Binary_t* c_binary) {
+
+  Elf_Section_t **sections = c_binary->sections;
+  for (size_t idx = 0; sections[idx] != nullptr; ++idx) {
+    free(sections[idx]->content);
+    free(sections[idx]);
+  }
+  free(c_binary->sections);
+
+}
+
+}
+}
+
+
diff --git a/api/c/ELF/Section.hpp b/api/c/ELF/Section.hpp
new file mode 100644
index 0000000..90d8ece
--- /dev/null
+++ b/api/c/ELF/Section.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SECTION_CPP_C_API_
+#define LIEF_ELF_SECTION_CPP_C_API_
+
+#include "LIEF/ELF/Binary.h"
+#include "LIEF/ELF/Binary.hpp"
+
+#include "LIEF/ELF/Section.h"
+#include "LIEF/ELF/Section.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_sections(Elf_Binary_t* c_binary, Binary* binary);
+void destroy_sections(Elf_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/ELF/Segment.cpp b/api/c/ELF/Segment.cpp
new file mode 100644
index 0000000..6ad3a19
--- /dev/null
+++ b/api/c/ELF/Segment.cpp
@@ -0,0 +1,67 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Segment.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_segments(Elf_Binary_t* c_binary, Binary* binary) {
+
+  it_segments segments = binary->get_segments();
+  c_binary->segments = static_cast<Elf_Segment_t**>(
+      malloc((segments.size() + 1) * sizeof(Elf_Segment_t**)));
+  for (size_t i = 0; i < segments.size(); ++i) {
+    Segment& segment = segments[i];
+
+    const std::vector<uint8_t>& segment_content = segment.content();
+    uint8_t* content = static_cast<uint8_t*>(malloc(segment_content.size() * sizeof(uint8_t)));
+    std::copy(
+        std::begin(segment_content),
+        std::end(segment_content),
+        content);
+
+    c_binary->segments[i] = static_cast<Elf_Segment_t*>(malloc(sizeof(Elf_Segment_t)));
+    c_binary->segments[i]->type            = static_cast<enum ::SEGMENT_TYPES>(segment.type());
+    c_binary->segments[i]->flags           = segment.flag();
+    c_binary->segments[i]->virtual_address = segment.virtual_address();
+    c_binary->segments[i]->virtual_size    = segment.virtual_size();
+    c_binary->segments[i]->offset          = segment.file_offset();
+    c_binary->segments[i]->alignment       = segment.alignment();
+    c_binary->segments[i]->size            = segment_content.size();
+    c_binary->segments[i]->content         = content;
+  }
+
+  c_binary->segments[segments.size()] = nullptr;
+
+}
+
+
+
+void destroy_segments(Elf_Binary_t* c_binary) {
+
+  Elf_Segment_t **segments = c_binary->segments;
+  for (size_t idx = 0; segments[idx] != nullptr; ++idx) {
+    free(segments[idx]->content);
+    free(segments[idx]);
+  }
+  free(c_binary->segments);
+
+}
+
+}
+}
+
+
diff --git a/api/c/ELF/Segment.hpp b/api/c/ELF/Segment.hpp
new file mode 100644
index 0000000..858bdf2
--- /dev/null
+++ b/api/c/ELF/Segment.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SEGMENT_CPP_C_API_
+#define LIEF_ELF_SEGMENT_CPP_C_API_
+
+#include "LIEF/ELF/Binary.h"
+#include "LIEF/ELF/Binary.hpp"
+
+#include "LIEF/ELF/Segment.h"
+#include "LIEF/ELF/Segment.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_segments(Elf_Binary_t* c_binary, Binary* binary);
+void destroy_segments(Elf_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/ELF/Symbol.cpp b/api/c/ELF/Symbol.cpp
new file mode 100644
index 0000000..fdde7f4
--- /dev/null
+++ b/api/c/ELF/Symbol.cpp
@@ -0,0 +1,90 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Symbol.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_dynamic_symbols(Elf_Binary_t* c_binary, Binary* binary) {
+  it_symbols dyn_symb = binary->get_dynamic_symbols();
+
+  c_binary->dynamic_symbols = static_cast<Elf_Symbol_t**>(
+      malloc((dyn_symb.size() + 1) * sizeof(Elf_Symbol_t**)));
+
+  for (size_t i = 0; i < dyn_symb.size(); ++i) {
+    Symbol& b_sym = dyn_symb[i];
+    c_binary->dynamic_symbols[i] = static_cast<Elf_Symbol_t*>(malloc(sizeof(Elf_Symbol_t)));
+    c_binary->dynamic_symbols[i]->name        = b_sym.name().c_str();
+    c_binary->dynamic_symbols[i]->type        = static_cast<enum ::SYMBOL_TYPES>(b_sym.type());
+    c_binary->dynamic_symbols[i]->binding     = static_cast<enum ::SYMBOL_BINDINGS>(b_sym.binding());
+    c_binary->dynamic_symbols[i]->other       = b_sym.other();
+    c_binary->dynamic_symbols[i]->shndx       = b_sym.shndx();
+    c_binary->dynamic_symbols[i]->value       = b_sym.value();
+    c_binary->dynamic_symbols[i]->size        = b_sym.size();
+    c_binary->dynamic_symbols[i]->information = b_sym.information();
+  }
+  c_binary->dynamic_symbols[dyn_symb.size()] = nullptr;
+
+
+
+}
+
+
+void init_c_static_symbols(Elf_Binary_t* c_binary, Binary* binary) {
+  it_symbols static_symb = binary->get_static_symbols();
+
+  c_binary->static_symbols = static_cast<Elf_Symbol_t**>(
+      malloc((static_symb.size() + 1) * sizeof(Elf_Symbol_t**)));
+
+  for (size_t i = 0; i < static_symb.size(); ++i) {
+    Symbol& b_sym = static_symb[i];
+    c_binary->static_symbols[i]              = static_cast<Elf_Symbol_t*>(malloc(sizeof(Elf_Symbol_t)));
+    c_binary->static_symbols[i]->name        = b_sym.name().c_str();
+    c_binary->static_symbols[i]->type        = static_cast<enum ::SYMBOL_TYPES>(b_sym.type());
+    c_binary->static_symbols[i]->binding     = static_cast<enum ::SYMBOL_BINDINGS>(b_sym.binding());
+    c_binary->static_symbols[i]->other       = b_sym.other();
+    c_binary->static_symbols[i]->shndx       = b_sym.shndx();
+    c_binary->static_symbols[i]->value       = b_sym.value();
+    c_binary->static_symbols[i]->size        = b_sym.size();
+    c_binary->static_symbols[i]->information = b_sym.information();
+  }
+  c_binary->static_symbols[static_symb.size()] = nullptr;
+
+}
+
+
+
+void destroy_dynamic_symbols(Elf_Binary_t* c_binary) {
+  Elf_Symbol_t **dynamic_symbols = c_binary->dynamic_symbols;
+  for (size_t idx = 0; dynamic_symbols[idx] != nullptr; ++idx) {
+    free(dynamic_symbols[idx]);
+  }
+  free(c_binary->dynamic_symbols);
+}
+
+
+void destroy_static_symbols(Elf_Binary_t* c_binary) {
+  Elf_Symbol_t **static_symbols = c_binary->static_symbols;
+  for (size_t idx = 0; static_symbols[idx] != nullptr; ++idx) {
+    free(static_symbols[idx]);
+  }
+  free(c_binary->static_symbols);
+}
+
+}
+}
+
+
diff --git a/api/c/ELF/Symbol.hpp b/api/c/ELF/Symbol.hpp
new file mode 100644
index 0000000..4597068
--- /dev/null
+++ b/api/c/ELF/Symbol.hpp
@@ -0,0 +1,37 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SYMBOL_CPP_C_API_
+#define LIEF_ELF_SYMBOL_CPP_C_API_
+
+#include "LIEF/ELF/Binary.h"
+#include "LIEF/ELF/Binary.hpp"
+
+#include "LIEF/ELF/Symbol.h"
+#include "LIEF/ELF/Symbol.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+void init_c_dynamic_symbols(Elf_Binary_t* c_binary, Binary* binary);
+void init_c_static_symbols(Elf_Binary_t* c_binary, Binary* binary);
+
+void destroy_dynamic_symbols(Elf_Binary_t* c_binary);
+void destroy_static_symbols(Elf_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/MachO/Binary.cpp b/api/c/MachO/Binary.cpp
new file mode 100644
index 0000000..8a55012
--- /dev/null
+++ b/api/c/MachO/Binary.cpp
@@ -0,0 +1,58 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/MachO/Binary.h"
+
+#include "LIEF/MachO/Binary.hpp"
+
+#include "Binary.hpp"
+#include "Section.hpp"
+#include "Header.hpp"
+#include "Symbol.hpp"
+#include "Segment.hpp"
+#include "LoadCommand.hpp"
+
+
+using namespace LIEF::MachO;
+
+namespace LIEF {
+namespace MachO {
+void init_c_binary(Macho_Binary_t* c_binary, Binary* binary) {
+
+  c_binary->handler = reinterpret_cast<void*>(binary);
+  c_binary->name    = binary->name().c_str();
+  c_binary->imagebase = binary->imagebase();
+  init_c_header(c_binary, binary);
+  init_c_commands(c_binary, binary);
+  init_c_symbols(c_binary, binary);
+  init_c_sections(c_binary, binary);
+  init_c_segments(c_binary, binary);
+}
+}
+}
+
+void macho_binaries_destroy(Macho_Binary_t** binaries) {
+  for (size_t i = 0; binaries[i] != nullptr; ++i) {
+    destroy_sections(binaries[i]);
+    destroy_commands(binaries[i]);
+    destroy_symbols(binaries[i]);
+    destroy_segments(binaries[i]);
+
+    delete reinterpret_cast<Binary*>(binaries[i]->handler);
+    free(binaries[i]);
+  }
+  free(binaries);
+
+}
diff --git a/api/c/MachO/Binary.hpp b/api/c/MachO/Binary.hpp
new file mode 100644
index 0000000..134800a
--- /dev/null
+++ b/api/c/MachO/Binary.hpp
@@ -0,0 +1,30 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_BINARY_CPP_C_API_
+#define LIEF_MACHO_BINARY_CPP_C_API_
+
+#include "LIEF/MachO/Binary.h"
+#include "LIEF/MachO/Binary.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+void init_c_binary(Macho_Binary_t* c_binary, Binary* binary);
+
+}
+}
+
+#endif
diff --git a/api/c/MachO/EnumToString.cpp b/api/c/MachO/EnumToString.cpp
new file mode 100644
index 0000000..5ff9357
--- /dev/null
+++ b/api/c/MachO/EnumToString.cpp
@@ -0,0 +1,76 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/MachO/EnumToString.h"
+#include "LIEF/MachO/EnumToString.hpp"
+
+#include "LIEF/MachO/enums.hpp"
+#include "LIEF/MachO/enums.h"
+
+
+extern "C"
+{
+
+const char* LOAD_COMMAND_TYPES_to_string(enum LOAD_COMMAND_TYPES e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::LOAD_COMMAND_TYPES>(e));
+}
+
+
+const char* MACHO_TYPES_to_string(enum MACHO_TYPES e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::MACHO_TYPES>(e));
+}
+
+
+const char* FILE_TYPES_to_string(enum FILE_TYPES e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::FILE_TYPES>(e));
+}
+
+
+const char* CPU_TYPES_to_string(enum CPU_TYPES e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::CPU_TYPES>(e));
+}
+
+
+const char* HEADER_FLAGS_to_string(enum HEADER_FLAGS e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::HEADER_FLAGS>(e));
+}
+
+
+const char* MachO_SECTION_TYPES_to_string(enum SECTION_TYPES e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::SECTION_TYPES>(e));
+}
+
+
+const char* MachO_SYMBOL_TYPES_to_string(enum SYMBOL_TYPES e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::SYMBOL_TYPES>(e));
+}
+
+
+const char* N_LIST_TYPES_to_string(enum N_LIST_TYPES e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::N_LIST_TYPES>(e));
+}
+
+
+const char* SYMBOL_DESCRIPTIONS_to_string(enum SYMBOL_DESCRIPTIONS e) {
+  return LIEF::MachO::to_string(static_cast<LIEF::MachO::SYMBOL_DESCRIPTIONS>(e));
+}
+
+
+
+
+
+
+
+}
diff --git a/api/c/MachO/Header.cpp b/api/c/MachO/Header.cpp
new file mode 100644
index 0000000..5d00c17
--- /dev/null
+++ b/api/c/MachO/Header.cpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Header.hpp"
+
+namespace LIEF {
+namespace MachO {
+void init_c_header(Macho_Binary_t* c_binary, Binary* binary) {
+  Header& header = binary->header();
+  c_binary->header.magic       = header.magic();
+  c_binary->header.cpu_type    = static_cast<enum ::CPU_TYPES>(header.cpu_type());
+  c_binary->header.cpu_subtype = header.cpu_subtype();
+  c_binary->header.file_type   = static_cast<enum ::FILE_TYPES>(header.file_type());
+  c_binary->header.nb_cmds     = header.nb_cmds();
+  c_binary->header.sizeof_cmds = header.sizeof_cmds();
+  c_binary->header.flags       = header.flags();
+  c_binary->header.reserved    = header.reserved();
+}
+
+}
+}
diff --git a/api/c/MachO/Header.hpp b/api/c/MachO/Header.hpp
new file mode 100644
index 0000000..aea92e2
--- /dev/null
+++ b/api/c/MachO/Header.hpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_HEADER_CPP_C_API_
+#define LIEF_MACHO_HEADER_CPP_C_API_
+
+#include "LIEF/MachO/Binary.h"
+#include "LIEF/MachO/Binary.hpp"
+
+#include "LIEF/MachO/Header.h"
+#include "LIEF/MachO/Header.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+void init_c_header(Macho_Binary_t* c_binary, Binary* binary);
+
+}
+}
+
+#endif
diff --git a/api/c/MachO/LoadCommand.cpp b/api/c/MachO/LoadCommand.cpp
new file mode 100644
index 0000000..89c53ed
--- /dev/null
+++ b/api/c/MachO/LoadCommand.cpp
@@ -0,0 +1,62 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LoadCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+void init_c_commands(Macho_Binary_t* c_binary, Binary* binary) {
+  it_commands commands = binary->commands();
+
+  c_binary->commands = static_cast<Macho_Command_t**>(
+      malloc((commands.size() + 1) * sizeof(Macho_Command_t**)));
+
+  for (size_t i = 0; i < commands.size(); ++i) {
+    LoadCommand& cmd = commands[i];
+
+    c_binary->commands[i] = static_cast<Macho_Command_t*>(malloc(sizeof(Macho_Command_t)));
+    const std::vector<uint8_t>& cmd_content = cmd.data();
+    uint8_t* content = static_cast<uint8_t*>(malloc(cmd_content.size() * sizeof(uint8_t)));
+    std::copy(
+        std::begin(cmd_content),
+        std::end(cmd_content),
+        content);
+
+    c_binary->commands[i]->command = static_cast<enum ::LOAD_COMMAND_TYPES>(cmd.command());
+    c_binary->commands[i]->size    = cmd.size();
+    c_binary->commands[i]->data    = content;
+    c_binary->commands[i]->offset  = cmd.command_offset();
+  }
+
+  c_binary->commands[commands.size()] = nullptr;
+
+}
+
+
+
+void destroy_commands(Macho_Binary_t* c_binary) {
+  Macho_Command_t **commands = c_binary->commands;
+  for (size_t idx = 0; commands[idx] != nullptr; ++idx) {
+    free(commands[idx]->data);
+    free(commands[idx]);
+  }
+  free(c_binary->commands);
+
+}
+
+}
+}
+
+
diff --git a/api/c/MachO/LoadCommand.hpp b/api/c/MachO/LoadCommand.hpp
new file mode 100644
index 0000000..f28c509
--- /dev/null
+++ b/api/c/MachO/LoadCommand.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_LOAD_COMMAND_CPP_C_API_
+#define LIEF_MACHO_LOAD_COMMAND_CPP_C_API_
+
+#include "LIEF/MachO/Binary.h"
+#include "LIEF/MachO/Binary.hpp"
+
+#include "LIEF/MachO/LoadCommand.h"
+#include "LIEF/MachO/LoadCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+void init_c_commands(Macho_Binary_t* c_binary, Binary* binary);
+void destroy_commands(Macho_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/MachO/Parser.cpp b/api/c/MachO/Parser.cpp
new file mode 100644
index 0000000..6907820
--- /dev/null
+++ b/api/c/MachO/Parser.cpp
@@ -0,0 +1,41 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <cstring>
+
+#include "LIEF/MachO/Binary.h"
+#include "LIEF/MachO/Parser.hpp"
+
+#include "Binary.hpp"
+
+using namespace LIEF::MachO;
+
+Macho_Binary_t** macho_parse(const char *file) {
+  std::vector<Binary*> macho_binaries{Parser::parse(file)};
+
+  Macho_Binary_t** c_macho_binaries = static_cast<Macho_Binary_t**>(
+      malloc((macho_binaries.size() + 1) * sizeof(Macho_Binary_t**)));
+
+  for (size_t i = 0; i < macho_binaries.size(); ++i) {
+    Binary* binary = macho_binaries [i];
+    c_macho_binaries[i] = static_cast<Macho_Binary_t*>(malloc(sizeof(Macho_Binary_t)));
+    init_c_binary(c_macho_binaries[i], binary);
+  }
+
+  c_macho_binaries[macho_binaries.size()] = nullptr;
+
+  return c_macho_binaries;
+}
+
diff --git a/api/c/MachO/Section.cpp b/api/c/MachO/Section.cpp
new file mode 100644
index 0000000..5ffd20f
--- /dev/null
+++ b/api/c/MachO/Section.cpp
@@ -0,0 +1,72 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Section.hpp"
+
+namespace LIEF {
+namespace MachO {
+void init_c_sections(Macho_Binary_t* c_binary, Binary* binary) {
+  it_sections sections = binary->sections();
+
+  c_binary->sections = static_cast<Macho_Section_t**>(
+      malloc((sections.size() + 1) * sizeof(Macho_Section_t**)));
+
+  for (size_t i = 0; i < sections.size(); ++i) {
+    Section& section = sections[i];
+
+    c_binary->sections[i] = static_cast<Macho_Section_t*>(malloc(sizeof(Macho_Section_t)));
+    const std::vector<uint8_t>& section_content = section.content();
+    uint8_t* content = static_cast<uint8_t*>(malloc(section_content.size() * sizeof(uint8_t)));
+    std::copy(
+        std::begin(section_content),
+        std::end(section_content),
+        content);
+
+    c_binary->sections[i]->name                 = section.name().c_str();
+    c_binary->sections[i]->alignment            = section.alignment();
+    c_binary->sections[i]->relocation_offset    = section.relocation_offset();
+    c_binary->sections[i]->numberof_relocations = section.numberof_relocations();
+    c_binary->sections[i]->flags                = section.flags();
+    c_binary->sections[i]->type                 = static_cast<enum ::SECTION_TYPES>(section.type());
+    c_binary->sections[i]->reserved1            = section.reserved1();
+    c_binary->sections[i]->reserved2            = section.reserved2();
+    c_binary->sections[i]->reserved3            = section.reserved3();
+    c_binary->sections[i]->virtual_address      = section.virtual_address();
+    c_binary->sections[i]->offset               = section.offset();
+    c_binary->sections[i]->size                 = section.size();
+    c_binary->sections[i]->content              = content;
+    c_binary->sections[i]->entropy              = section.entropy();
+  }
+
+  c_binary->sections[sections.size()] = nullptr;
+
+}
+
+
+
+void destroy_sections(Macho_Binary_t* c_binary) {
+  Macho_Section_t **sections = c_binary->sections;
+  for (size_t idx = 0; sections[idx] != nullptr; ++idx) {
+    free(sections[idx]->content);
+    free(sections[idx]);
+  }
+  free(c_binary->sections);
+
+}
+
+}
+}
+
+
diff --git a/api/c/MachO/Section.hpp b/api/c/MachO/Section.hpp
new file mode 100644
index 0000000..26fdd33
--- /dev/null
+++ b/api/c/MachO/Section.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_SECTION_CPP_C_API_
+#define LIEF_MACHO_SECTION_CPP_C_API_
+
+#include "LIEF/MachO/Binary.h"
+#include "LIEF/MachO/Binary.hpp"
+
+#include "LIEF/MachO/Section.h"
+#include "LIEF/MachO/Section.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+void init_c_sections(Macho_Binary_t* c_binary, Binary* binary);
+void destroy_sections(Macho_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/MachO/Segment.cpp b/api/c/MachO/Segment.cpp
new file mode 100644
index 0000000..2cdfa70
--- /dev/null
+++ b/api/c/MachO/Segment.cpp
@@ -0,0 +1,69 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Segment.hpp"
+
+namespace LIEF {
+namespace MachO {
+void init_c_segments(Macho_Binary_t* c_binary, Binary* binary) {
+  it_segments segments = binary->segments();
+
+  c_binary->segments = static_cast<Macho_Segment_t**>(
+      malloc((segments.size() + 1) * sizeof(Macho_Segment_t**)));
+
+  for (size_t i = 0; i < segments.size(); ++i) {
+    SegmentCommand& segment = segments[i];
+
+    c_binary->segments[i] = static_cast<Macho_Segment_t*>(malloc(sizeof(Macho_Segment_t)));
+    const std::vector<uint8_t>& segment_content = segment.content();
+    uint8_t* content = static_cast<uint8_t*>(malloc(segment_content.size() * sizeof(uint8_t)));
+    std::copy(
+        std::begin(segment_content),
+        std::end(segment_content),
+        content);
+
+    c_binary->segments[i]->name              = segment.name().c_str();
+    c_binary->segments[i]->virtual_address   = segment.virtual_address();
+    c_binary->segments[i]->virtual_size      = segment.virtual_size();
+    c_binary->segments[i]->file_size         = segment.file_size();
+    c_binary->segments[i]->file_offset       = segment.file_offset();
+    c_binary->segments[i]->max_protection    = segment.max_protection();
+    c_binary->segments[i]->init_protection   = segment.init_protection();
+    c_binary->segments[i]->numberof_sections = segment.numberof_sections();
+    c_binary->segments[i]->flags             = segment.flags();
+    c_binary->segments[i]->content           = content;
+    c_binary->segments[i]->sections          = nullptr; //TODO
+  }
+
+  c_binary->segments[segments.size()] = nullptr;
+
+}
+
+
+
+void destroy_segments(Macho_Binary_t* c_binary) {
+  Macho_Segment_t **segments = c_binary->segments;
+  for (size_t idx = 0; segments[idx] != nullptr; ++idx) {
+    free(segments[idx]->content);
+    free(segments[idx]);
+  }
+  free(c_binary->segments);
+
+}
+
+}
+}
+
+
diff --git a/api/c/MachO/Segment.hpp b/api/c/MachO/Segment.hpp
new file mode 100644
index 0000000..e56df2b
--- /dev/null
+++ b/api/c/MachO/Segment.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_SEGMENT_CPP_C_API_
+#define LIEF_MACHO_SEGMENT_CPP_C_API_
+
+#include "LIEF/MachO/Binary.h"
+#include "LIEF/MachO/Binary.hpp"
+
+#include "LIEF/MachO/Segment.h"
+#include "LIEF/MachO/SegmentCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+void init_c_segments(Macho_Binary_t* c_binary, Binary* binary);
+void destroy_segments(Macho_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/MachO/Symbol.cpp b/api/c/MachO/Symbol.cpp
new file mode 100644
index 0000000..68369bb
--- /dev/null
+++ b/api/c/MachO/Symbol.cpp
@@ -0,0 +1,56 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Symbol.hpp"
+
+namespace LIEF {
+namespace MachO {
+void init_c_symbols(Macho_Binary_t* c_binary, Binary* binary) {
+  it_symbols symbols = binary->symbols();
+
+  c_binary->symbols = static_cast<Macho_Symbol_t**>(
+      malloc((symbols.size() + 1) * sizeof(Macho_Symbol_t**)));
+
+  for (size_t i = 0; i < symbols.size(); ++i) {
+    Symbol& symbol = symbols[i];
+
+    c_binary->symbols[i] = static_cast<Macho_Symbol_t*>(malloc(sizeof(Macho_Symbol_t)));
+
+    c_binary->symbols[i]->name              = symbol.name().c_str();
+    c_binary->symbols[i]->type              = symbol.type();
+    c_binary->symbols[i]->numberof_sections = symbol.numberof_sections();
+    c_binary->symbols[i]->description       = symbol.description();
+    c_binary->symbols[i]->value             = symbol.value();
+  }
+
+  c_binary->symbols[symbols.size()] = nullptr;
+
+}
+
+
+
+void destroy_symbols(Macho_Binary_t* c_binary) {
+  Macho_Symbol_t **symbols = c_binary->symbols;
+  for (size_t idx = 0; symbols[idx] != nullptr; ++idx) {
+    free(symbols[idx]);
+  }
+  free(c_binary->symbols);
+
+}
+
+}
+}
+
+
diff --git a/api/c/MachO/Symbol.hpp b/api/c/MachO/Symbol.hpp
new file mode 100644
index 0000000..183f429
--- /dev/null
+++ b/api/c/MachO/Symbol.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_SYMBOL_CPP_C_API_
+#define LIEF_MACHO_SYMBOL_CPP_C_API_
+
+#include "LIEF/MachO/Binary.h"
+#include "LIEF/MachO/Binary.hpp"
+
+#include "LIEF/MachO/Symbol.h"
+#include "LIEF/MachO/Symbol.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+void init_c_symbols(Macho_Binary_t* c_binary, Binary* binary);
+void destroy_symbols(Macho_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/PE/Binary.cpp b/api/c/PE/Binary.cpp
new file mode 100644
index 0000000..d10410c
--- /dev/null
+++ b/api/c/PE/Binary.cpp
@@ -0,0 +1,64 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <cstring>
+
+#include "LIEF/PE/Binary.h"
+
+#include "LIEF/PE/Parser.hpp"
+#include "LIEF/PE/Binary.hpp"
+
+#include "Binary.hpp"
+#include "DosHeader.hpp"
+#include "Header.hpp"
+#include "OptionalHeader.hpp"
+#include "Section.hpp"
+#include "DataDirectory.hpp"
+
+using namespace LIEF::PE;
+
+namespace LIEF {
+namespace PE {
+
+void init_c_binary(Pe_Binary_t* c_binary, Binary* binary) {
+  c_binary->name    = binary->name().c_str();
+  c_binary->handler = reinterpret_cast<void*>(binary);
+
+  init_c_dos_header(c_binary, binary);
+  init_c_header(c_binary, binary);
+  init_c_optional_header(c_binary, binary);
+  init_c_sections(c_binary, binary);
+  init_c_data_directories(c_binary, binary);
+
+}
+
+}
+}
+
+Pe_Binary_t* pe_parse(const char *file) {
+  Binary* binary = Parser::parse(file);
+  Pe_Binary_t* c_binary = static_cast<Pe_Binary_t*>(malloc(sizeof(Pe_Binary_t)));
+  std::memset(c_binary, 0, sizeof(Pe_Binary_t));
+  init_c_binary(c_binary, binary);
+
+  return c_binary;
+}
+
+void pe_binary_destroy(Pe_Binary_t* binary) {
+  destroy_sections(binary);
+  destroy_data_directories(binary);
+  delete reinterpret_cast<Binary*>(binary->handler);
+  free(binary);
+}
diff --git a/api/c/PE/Binary.hpp b/api/c/PE/Binary.hpp
new file mode 100644
index 0000000..26510ca
--- /dev/null
+++ b/api/c/PE/Binary.hpp
@@ -0,0 +1,30 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_BINARY_CPP_C_API_
+#define LIEF_PE_BINARY_CPP_C_API_
+
+#include "LIEF/PE/Binary.h"
+#include "LIEF/PE/Binary.hpp"
+
+namespace LIEF {
+namespace PE {
+
+void init_c_binary(Pe_Binary_t* c_binary, Binary* binary);
+
+}
+}
+
+#endif
diff --git a/api/c/PE/DataDirectory.cpp b/api/c/PE/DataDirectory.cpp
new file mode 100644
index 0000000..57d5286
--- /dev/null
+++ b/api/c/PE/DataDirectory.cpp
@@ -0,0 +1,54 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "DataDirectory.hpp"
+
+namespace LIEF {
+namespace PE {
+void init_c_data_directories(Pe_Binary_t* c_binary, Binary* binary) {
+
+  it_data_directories data_directories = binary->data_directories();
+
+  c_binary->data_directories = static_cast<Pe_DataDirectory_t**>(
+      malloc((data_directories.size() + 1) * sizeof(Pe_DataDirectory_t**)));
+
+  for (size_t i = 0; i < data_directories.size(); ++i) {
+
+    c_binary->data_directories[i] = static_cast<Pe_DataDirectory_t*>(malloc(sizeof(Pe_DataDirectory_t)));
+    c_binary->data_directories[i]->rva  = data_directories[i].RVA();
+    c_binary->data_directories[i]->size = data_directories[i].size();
+  }
+  c_binary->data_directories[data_directories.size()] = nullptr;
+
+
+
+}
+
+
+
+void destroy_data_directories(Pe_Binary_t* c_binary) {
+
+  Pe_DataDirectory_t **data_directories = c_binary->data_directories;
+  for (size_t idx = 0; data_directories[idx] != nullptr; ++idx) {
+    free(data_directories[idx]);
+  }
+  free(c_binary->data_directories);
+
+}
+
+}
+}
+
+
diff --git a/api/c/PE/DataDirectory.hpp b/api/c/PE/DataDirectory.hpp
new file mode 100644
index 0000000..9e9ea5a
--- /dev/null
+++ b/api/c/PE/DataDirectory.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_DATA_DIRECTORY_CPP_C_API_
+#define LIEF_PE_DATA_DIRECTORY_CPP_C_API_
+
+#include "LIEF/PE/Binary.h"
+#include "LIEF/PE/Binary.hpp"
+
+#include "LIEF/PE/DataDirectory.h"
+#include "LIEF/PE/DataDirectory.hpp"
+
+namespace LIEF {
+namespace PE {
+
+void init_c_data_directories(Pe_Binary_t* c_binary, Binary* binary);
+void destroy_data_directories(Pe_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/PE/DosHeader.cpp b/api/c/PE/DosHeader.cpp
new file mode 100644
index 0000000..bca64d6
--- /dev/null
+++ b/api/c/PE/DosHeader.cpp
@@ -0,0 +1,55 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "DosHeader.hpp"
+
+namespace LIEF {
+namespace PE {
+void init_c_dos_header(Pe_Binary_t* c_binary, Binary* binary) {
+  const DosHeader& dos_header                      = binary->dos_header();
+  c_binary->dos_header.magic                       = dos_header.magic();
+  c_binary->dos_header.used_bytes_in_the_last_page = dos_header.used_bytes_in_the_last_page();
+  c_binary->dos_header.file_size_in_pages          = dos_header.file_size_in_pages();
+  c_binary->dos_header.numberof_relocation         = dos_header.numberof_relocation();
+  c_binary->dos_header.header_size_in_paragraphs   = dos_header.header_size_in_paragraphs();
+  c_binary->dos_header.minimum_extra_paragraphs    = dos_header.minimum_extra_paragraphs();
+  c_binary->dos_header.maximum_extra_paragraphs    = dos_header.maximum_extra_paragraphs();
+  c_binary->dos_header.initial_relative_ss         = dos_header.initial_relative_ss();
+  c_binary->dos_header.initial_sp                  = dos_header.initial_sp();
+  c_binary->dos_header.checksum                    = dos_header.checksum();
+  c_binary->dos_header.initial_ip                  = dos_header.initial_ip();
+  c_binary->dos_header.initial_relative_cs         = dos_header.initial_relative_cs();
+  c_binary->dos_header.addressof_relocation_table  = dos_header.addressof_relocation_table();
+  c_binary->dos_header.overlay_number              = dos_header.overlay_number();
+  c_binary->dos_header.oem_id                      = dos_header.oem_id();
+  c_binary->dos_header.oem_info                    = dos_header.oem_info();
+  c_binary->dos_header.addressof_new_exeheader     = dos_header.addressof_new_exeheader();
+
+  const DosHeader::reserved_t& reserved = dos_header.reserved();
+  std::copy(
+      std::begin(reserved),
+      std::end(reserved),
+      c_binary->dos_header.reserved);
+
+
+  const DosHeader::reserved2_t& reserved2 = dos_header.reserved2();
+  std::copy(
+      std::begin(reserved2),
+      std::end(reserved2),
+      c_binary->dos_header.reserved2);
+}
+
+}
+}
diff --git a/api/c/PE/DosHeader.hpp b/api/c/PE/DosHeader.hpp
new file mode 100644
index 0000000..f3f2ec3
--- /dev/null
+++ b/api/c/PE/DosHeader.hpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_DOS_HEADER_CPP_C_API_
+#define LIEF_PE_DOS_HEADER_CPP_C_API_
+
+#include "LIEF/PE/Binary.h"
+#include "LIEF/PE/Binary.hpp"
+
+#include "LIEF/PE/DosHeader.h"
+#include "LIEF/PE/DosHeader.hpp"
+
+namespace LIEF {
+namespace PE {
+
+void init_c_dos_header(Pe_Binary_t* c_binary, Binary* binary);
+
+}
+}
+
+#endif
diff --git a/api/c/PE/EnumToString.cpp b/api/c/PE/EnumToString.cpp
new file mode 100644
index 0000000..ec7668c
--- /dev/null
+++ b/api/c/PE/EnumToString.cpp
@@ -0,0 +1,40 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/PE/EnumToString.h"
+#include "LIEF/PE/EnumToString.hpp"
+
+#include "LIEF/PE/enums.hpp"
+#include "LIEF/PE/enums.h"
+
+
+extern "C"
+{
+
+const char* PE_TYPES_to_string(enum PE_TYPES e) {
+  return LIEF::PE::to_string(static_cast<LIEF::PE::PE_TYPE>(e));
+}
+
+
+const char* MACHINE_TYPES_to_string(enum MACHINE_TYPES e) {
+  return LIEF::PE::to_string(static_cast<LIEF::PE::MACHINE_TYPES>(e));
+}
+
+
+const char* SUBSYSTEM_to_string(enum SUBSYSTEM e) {
+  return LIEF::PE::to_string(static_cast<LIEF::PE::SUBSYSTEM>(e));
+}
+
+}
diff --git a/api/c/PE/Header.cpp b/api/c/PE/Header.cpp
new file mode 100644
index 0000000..6f9ff2f
--- /dev/null
+++ b/api/c/PE/Header.cpp
@@ -0,0 +1,42 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Header.hpp"
+
+namespace LIEF {
+namespace PE {
+
+void init_c_header(Pe_Binary_t* c_binary, Binary* binary) {
+
+  const Header& header = binary->header();
+
+  const Header::signature_t& signature = header.signature();
+
+  c_binary->header.machine                = static_cast<enum ::MACHINE_TYPES>(header.machine());
+  c_binary->header.numberof_sections      = header.numberof_sections();
+  c_binary->header.time_date_stamp        = header.time_date_stamp();
+  c_binary->header.pointerto_symbol_table = header.pointerto_symbol_table();
+  c_binary->header.numberof_symbols       = header.numberof_symbols();
+  c_binary->header.sizeof_optional_header = header.sizeof_optional_header();
+  c_binary->header.characteristics        = header.characteristics();
+
+  std::copy(
+      std::begin(signature),
+      std::end(signature),
+      c_binary->header.signature);
+}
+
+}
+}
diff --git a/api/c/PE/Header.hpp b/api/c/PE/Header.hpp
new file mode 100644
index 0000000..3bfde88
--- /dev/null
+++ b/api/c/PE/Header.hpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_HEADER_CPP_C_API_
+#define LIEF_PE_HEADER_CPP_C_API_
+
+#include "LIEF/PE/Binary.h"
+#include "LIEF/PE/Binary.hpp"
+
+#include "LIEF/PE/Header.h"
+#include "LIEF/PE/Header.hpp"
+
+namespace LIEF {
+namespace PE {
+
+void init_c_header(Pe_Binary_t* c_binary, Binary* binary);
+
+}
+}
+
+#endif
diff --git a/api/c/PE/OptionalHeader.cpp b/api/c/PE/OptionalHeader.cpp
new file mode 100644
index 0000000..5c69a5c
--- /dev/null
+++ b/api/c/PE/OptionalHeader.cpp
@@ -0,0 +1,61 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "OptionalHeader.hpp"
+
+namespace LIEF {
+namespace PE {
+
+void init_c_optional_header(Pe_Binary_t* c_binary, Binary* binary) {
+
+  const OptionalHeader& optional_header = binary->optional_header();
+  c_binary->optional_header.magic                          = static_cast<enum PE_TYPES>(optional_header.magic());
+  c_binary->optional_header.major_linker_version           = optional_header.major_linker_version();
+  c_binary->optional_header.minor_linker_version           = optional_header.minor_linker_version();
+  c_binary->optional_header.sizeof_code                    = optional_header.sizeof_code();
+  c_binary->optional_header.sizeof_initialized_data        = optional_header.sizeof_initialized_data();
+  c_binary->optional_header.sizeof_uninitialized_data      = optional_header.sizeof_uninitialized_data();
+  c_binary->optional_header.addressof_entrypoint           = optional_header.addressof_entrypoint();
+  c_binary->optional_header.baseof_code                    = optional_header.baseof_code();
+  if (optional_header.magic() == PE_TYPE::PE32) {
+    c_binary->optional_header.baseof_data                  = optional_header.baseof_data();
+  } else {
+    c_binary->optional_header.baseof_data                  = 0;
+  }
+  c_binary->optional_header.imagebase                      = optional_header.imagebase();
+  c_binary->optional_header.section_alignment              = optional_header.section_alignment();
+  c_binary->optional_header.file_alignment                 = optional_header.file_alignment();
+  c_binary->optional_header.major_operating_system_version = optional_header.major_operating_system_version();
+  c_binary->optional_header.minor_operating_system_version = optional_header.minor_operating_system_version();
+  c_binary->optional_header.major_image_version            = optional_header.major_image_version();
+  c_binary->optional_header.minor_image_version            = optional_header.minor_image_version();
+  c_binary->optional_header.major_subsystem_version        = optional_header.major_subsystem_version();
+  c_binary->optional_header.minor_subsystem_version        = optional_header.minor_subsystem_version();
+  c_binary->optional_header.win32_version_value            = optional_header.win32_version_value();
+  c_binary->optional_header.sizeof_image                   = optional_header.sizeof_image();
+  c_binary->optional_header.sizeof_headers                 = optional_header.sizeof_headers();
+  c_binary->optional_header.checksum                       = optional_header.checksum();
+  c_binary->optional_header.subsystem                      = static_cast<enum ::SUBSYSTEM>(optional_header.subsystem());
+  c_binary->optional_header.dll_characteristics            = optional_header.dll_characteristics();
+  c_binary->optional_header.sizeof_stack_reserve           = optional_header.sizeof_stack_reserve();
+  c_binary->optional_header.sizeof_stack_commit            = optional_header.sizeof_stack_commit();
+  c_binary->optional_header.sizeof_heap_reserve            = optional_header.sizeof_heap_reserve();
+  c_binary->optional_header.sizeof_heap_commit             = optional_header.sizeof_heap_commit();
+  c_binary->optional_header.loader_flags                   = optional_header.loader_flags();
+  c_binary->optional_header.numberof_rva_and_size          = optional_header.numberof_rva_and_size();
+}
+
+}
+}
diff --git a/api/c/PE/OptionalHeader.hpp b/api/c/PE/OptionalHeader.hpp
new file mode 100644
index 0000000..c466716
--- /dev/null
+++ b/api/c/PE/OptionalHeader.hpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_OPTIONAL_HEADER_CPP_C_API_
+#define LIEF_PE_OPTIONAL_HEADER_CPP_C_API_
+
+#include "LIEF/PE/Binary.h"
+#include "LIEF/PE/Binary.hpp"
+
+#include "LIEF/PE/OptionalHeader.h"
+#include "LIEF/PE/OptionalHeader.hpp"
+
+namespace LIEF {
+namespace PE {
+
+void init_c_optional_header(Pe_Binary_t* c_binary, Binary* binary);
+
+}
+}
+
+#endif
diff --git a/api/c/PE/Section.cpp b/api/c/PE/Section.cpp
new file mode 100644
index 0000000..4b8859f
--- /dev/null
+++ b/api/c/PE/Section.cpp
@@ -0,0 +1,68 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "Section.hpp"
+
+namespace LIEF {
+namespace PE {
+void init_c_sections(Pe_Binary_t* c_binary, Binary* binary) {
+
+  it_sections sections = binary->get_sections();
+
+  c_binary->sections = static_cast<Pe_Section_t**>(
+      malloc((sections.size() + 1) * sizeof(Pe_Section_t**)));
+
+  for (size_t i = 0; i < sections.size(); ++i) {
+    Section& b_section = sections[i];
+    c_binary->sections[i] = static_cast<Pe_Section_t*>(malloc(sizeof(Pe_Section_t)));
+    const std::vector<uint8_t>& section_content = b_section.content();
+    uint8_t* content = static_cast<uint8_t*>(malloc(section_content.size() * sizeof(uint8_t)));
+    std::copy(
+        std::begin(section_content),
+        std::end(section_content),
+        content);
+
+    c_binary->sections[i]->name                    = b_section.name().c_str();
+    c_binary->sections[i]->virtual_address         = b_section.virtual_address();
+    c_binary->sections[i]->size                    = b_section.size();
+    c_binary->sections[i]->offset                  = b_section.offset();
+    c_binary->sections[i]->virtual_size            = b_section.virtual_size();
+    c_binary->sections[i]->pointerto_relocation    = b_section.pointerto_relocation();
+    c_binary->sections[i]->pointerto_line_numbers  = b_section.pointerto_line_numbers();
+    c_binary->sections[i]->characteristics         = b_section.characteristics();
+    c_binary->sections[i]->content                 = content;
+    c_binary->sections[i]->entropy                 = b_section.entropy();
+  }
+  c_binary->sections[sections.size()] = nullptr;
+
+}
+
+
+
+void destroy_sections(Pe_Binary_t* c_binary) {
+
+  Pe_Section_t **sections = c_binary->sections;
+  for (size_t idx = 0; sections[idx] != nullptr; ++idx) {
+    free(sections[idx]->content);
+    free(sections[idx]);
+  }
+  free(c_binary->sections);
+
+}
+
+}
+}
+
+
diff --git a/api/c/PE/Section.hpp b/api/c/PE/Section.hpp
new file mode 100644
index 0000000..c662604
--- /dev/null
+++ b/api/c/PE/Section.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_SECTION_CPP_C_API_
+#define LIEF_PE_SECTION_CPP_C_API_
+
+#include "LIEF/PE/Binary.h"
+#include "LIEF/PE/Binary.hpp"
+
+#include "LIEF/PE/Section.h"
+#include "LIEF/PE/Section.hpp"
+
+namespace LIEF {
+namespace PE {
+
+void init_c_sections(Pe_Binary_t* c_binary, Binary* binary);
+void destroy_sections(Pe_Binary_t* c_binary);
+
+}
+}
+
+#endif
diff --git a/api/c/include/LIEF/ELF.h b/api/c/include/LIEF/ELF.h
new file mode 100644
index 0000000..b259f39
--- /dev/null
+++ b/api/c/include/LIEF/ELF.h
@@ -0,0 +1,27 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_ELF_H_
+#define C_LIEF_ELF_H_
+
+//! @defgroup elf_c_api ELF C API
+
+#include "LIEF/ELF/Binary.h"
+#include "LIEF/ELF/Symbol.h"
+#include "LIEF/ELF/Section.h"
+#include "LIEF/ELF/Header.h"
+#include "LIEF/ELF/DynamicEntry.h"
+#include "LIEF/ELF/EnumToString.h"
+#endif
diff --git a/api/c/include/LIEF/ELF/Binary.h b/api/c/include/LIEF/ELF/Binary.h
new file mode 100644
index 0000000..1ef6c7d
--- /dev/null
+++ b/api/c/include/LIEF/ELF/Binary.h
@@ -0,0 +1,79 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_ELF_BINARY_H_
+#define C_LIEF_ELF_BINARY_H_
+
+/** @defgroup elf_binary_c_api Binary
+ *  @ingroup elf_c_api
+ *  @addtogroup elf_binary_c_api
+ *  @brief Binary C API
+ *
+ *  @{
+ */
+
+#include <stddef.h>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/enums.h"
+
+#include "LIEF/ELF/Section.h"
+#include "LIEF/ELF/Segment.h"
+#include "LIEF/ELF/Header.h"
+#include "LIEF/ELF/DynamicEntry.h"
+#include "LIEF/ELF/Symbol.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @brief LIEF::ELF::Binary C Handler */
+struct Elf_Binary_t {
+  void*              handler;
+  const char*        name;
+  const char*        interpreter;
+  enum ELF_CLASS     type;
+  Elf_Header_t       header;
+  Elf_Section_t      **sections;
+  Elf_Segment_t      **segments;
+  Elf_DynamicEntry_t **dynamic_entries;
+  Elf_Symbol_t       **dynamic_symbols;
+  Elf_Symbol_t       **static_symbols;
+};
+
+typedef struct Elf_Binary_t Elf_Binary_t;
+
+/** @brief Wrapper for LIEF::ELF::Parser::parse */
+DLL_PUBLIC Elf_Binary_t* elf_parse(const char *file);
+
+DLL_PUBLIC void elf_binary_destroy(Elf_Binary_t* binary);
+
+/* ELF::Binary methods
+ * ==================
+ */
+
+/** @brief Update LIEF::ELF::Header object */
+DLL_PUBLIC int elf_binary_save_header(Elf_Binary_t* binary);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/ELF/DynamicEntry.h b/api/c/include/LIEF/ELF/DynamicEntry.h
new file mode 100644
index 0000000..5512422
--- /dev/null
+++ b/api/c/include/LIEF/ELF/DynamicEntry.h
@@ -0,0 +1,83 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_ELF_DYNAMIC_ENTRY_H_
+#define C_LIEF_ELF_DYNAMIC_ENTRY_H_
+
+#include <stdint.h>
+
+#include "LIEF/ELF/enums.h"
+
+/** @defgroup elf_dynamic_entry_c_api Dynamic Entry
+ *  @ingroup elf_c_api
+ *  @addtogroup elf_dynamic_entry_c_api
+ *  @brief Dynamic Entry C API
+ *
+ *  @{
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Elf_DynamicEntry_t {
+  enum DYNAMIC_TAGS tag;
+  uint64_t          value;
+};
+
+struct Elf_DynamicEntry_Library_t {
+  enum DYNAMIC_TAGS tag;
+  uint64_t          value;
+  const char*       name;
+};
+
+struct Elf_DynamicEntry_SharedObject_t {
+  enum DYNAMIC_TAGS tag;
+  uint64_t          value;
+  const char*       name;
+};
+
+struct Elf_DynamicEntry_Array_t {
+  enum DYNAMIC_TAGS tag;
+  uint64_t          value;
+  uint64_t*         array;
+};
+
+struct Elf_DynamicEntry_Rpath_t {
+  enum DYNAMIC_TAGS tag;
+  uint64_t          value;
+  const char*       rpath;
+};
+
+struct Elf_DynamicEntry_RunPath_t {
+  enum DYNAMIC_TAGS tag;
+  uint64_t          value;
+  const char*       runpath;
+};
+
+typedef struct Elf_DynamicEntry_t              Elf_DynamicEntry_t;
+typedef struct Elf_DynamicEntry_Library_t      Elf_DynamicEntry_Library_t;
+typedef struct Elf_DynamicEntry_SharedObject_t Elf_DynamicEntry_SharedObject_t;
+typedef struct Elf_DynamicEntry_Array_t        Elf_DynamicEntry_Array_t;
+typedef struct Elf_DynamicEntry_Rpath_t        Elf_DynamicEntry_Rpath_t;
+typedef struct Elf_DynamicEntry_RunPath_t      Elf_DynamicEntry_RunPath_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/ELF/EnumToString.h b/api/c/include/LIEF/ELF/EnumToString.h
new file mode 100644
index 0000000..37f3454
--- /dev/null
+++ b/api/c/include/LIEF/ELF/EnumToString.h
@@ -0,0 +1,45 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_ELF_ENUM_TO_STRING_H_
+#define C_LIEF_ELF_ENUM_TO_STRING_H_
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/enums.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLL_PUBLIC const char* SYMBOL_BINDINGS_to_string(enum SYMBOL_BINDINGS e);
+DLL_PUBLIC const char* E_TYPE_to_string(enum E_TYPE e);
+DLL_PUBLIC const char* VERSION_to_string(enum VERSION e);
+DLL_PUBLIC const char* ARCH_to_string(enum ARCH e);
+DLL_PUBLIC const char* SEGMENT_TYPES_to_string(enum SEGMENT_TYPES e);
+DLL_PUBLIC const char* DYNAMIC_TAGS_to_string(enum DYNAMIC_TAGS e);
+DLL_PUBLIC const char* SECTION_TYPES_to_string(enum SECTION_TYPES e);
+DLL_PUBLIC const char* SECTION_FLAGS_to_string(enum SECTION_FLAGS e);
+DLL_PUBLIC const char* SYMBOL_TYPES_to_string(enum SYMBOL_TYPES e);
+DLL_PUBLIC const char* ELF_CLASS_to_string(enum ELF_CLASS e);
+DLL_PUBLIC const char* ELF_DATA_to_string(enum ELF_DATA e);
+DLL_PUBLIC const char* OS_ABI_to_string(enum OS_ABI e);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/c/include/LIEF/ELF/Header.h b/api/c/include/LIEF/ELF/Header.h
new file mode 100644
index 0000000..b9abd3e
--- /dev/null
+++ b/api/c/include/LIEF/ELF/Header.h
@@ -0,0 +1,58 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_ELF_HEADER_H_
+#define C_LIEF_ELF_HEADER_H_
+#include <inttypes.h>
+
+#include "LIEF/ELF/enums.h"
+/**  @defgroup elf_header_c_api Header
+ *  @ingroup elf_c_api
+ *  @addtogroup elf_header_c_api
+ *  @brief Header C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Elf_Header_t {
+  uint8_t      identity[EI_NIDENT];
+  enum E_TYPE  file_type;
+  enum ARCH    machine_type;
+  enum VERSION object_file_version;
+  uint64_t     entrypoint;
+  uint64_t     program_headers_offset;
+  uint64_t     section_headers_offset;
+  uint32_t     processor_flags;
+  uint32_t     header_size;
+  uint32_t     program_header_size;
+  uint32_t     numberof_segments;
+  uint32_t     sizeof_section_header;
+  uint32_t     numberof_sections;
+  uint32_t     name_string_table_idx;
+};
+
+typedef struct Elf_Header_t Elf_Header_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/ELF/Section.h b/api/c/include/LIEF/ELF/Section.h
new file mode 100644
index 0000000..fe4b7c2
--- /dev/null
+++ b/api/c/include/LIEF/ELF/Section.h
@@ -0,0 +1,58 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_ELF_SECTION_H_
+#define C_LIEF_ELF_SECTION_H_
+
+#include <stdint.h>
+
+#include "LIEF/ELF/enums.h"
+
+/** @defgroup elf_section_c_api Section
+ *  @ingroup elf_c_api
+ *  @addtogroup elf_section_c_api
+ *  @brief Section C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Elf_Section_t {
+  const char*        name;
+  uint32_t           flags;
+  enum SECTION_TYPES type;
+  uint64_t           virtual_address;
+  uint64_t           offset;
+  uint64_t           original_size;
+  uint32_t           link;
+  uint32_t           info;
+  uint64_t           alignment;
+  uint64_t           entry_size;
+  uint64_t           size;
+  uint8_t*           content;
+  double             entropy;
+};
+
+typedef struct Elf_Section_t Elf_Section_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/ELF/Segment.h b/api/c/include/LIEF/ELF/Segment.h
new file mode 100644
index 0000000..a07b1b8
--- /dev/null
+++ b/api/c/include/LIEF/ELF/Segment.h
@@ -0,0 +1,52 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_ELF_SEGMENT_H_
+#define C_LIEF_ELF_SEGMENT_H_
+
+#include <stdint.h>
+#include "LIEF/ELF/enums.h"
+
+/**  @defgroup elf_segment_c_api Segment
+ *  @ingroup elf_c_api
+ *  @addtogroup elf_segment_c_api
+ *  @brief Segment C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Elf_Segment_t {
+  enum SEGMENT_TYPES type;
+  uint32_t           flags;
+  uint64_t           virtual_address;
+  uint64_t           virtual_size;
+  uint64_t           offset;
+  uint64_t           alignment;
+  uint64_t           size;
+  uint8_t*           content;
+};
+
+typedef struct Elf_Segment_t Elf_Segment_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/ELF/Symbol.h b/api/c/include/LIEF/ELF/Symbol.h
new file mode 100644
index 0000000..2b0c8e9
--- /dev/null
+++ b/api/c/include/LIEF/ELF/Symbol.h
@@ -0,0 +1,52 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_ELF_SYMBOL_H_
+#define C_LIEF_ELF_SYMBOL_H_
+
+#include <stdint.h>
+
+#include "LIEF/ELF/enums.h"
+/*  @defgroup elf_symbol_c_api Symbol
+ *  @ingroup elf_c_api
+ *  @addtogroup elf_symbol_c_api
+ *  @brief Symbol C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Elf_Symbol_t {
+  const char*          name;
+  enum SYMBOL_TYPES    type;
+  enum SYMBOL_BINDINGS binding;
+  uint8_t              information;
+  uint8_t              other;
+  uint16_t             shndx;
+  uint64_t             value;
+  uint64_t             size;
+};
+
+typedef struct Elf_Symbol_t Elf_Symbol_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/ELF/enums.h.in b/api/c/include/LIEF/ELF/enums.h.in
new file mode 100644
index 0000000..14777fa
--- /dev/null
+++ b/api/c/include/LIEF/ELF/enums.h.in
@@ -0,0 +1,14 @@
+#ifndef LIEF_ELF_C_ENUMS_H_
+#define LIEF_ELF_C_ENUMS_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@LIEF_ELF_ENUMS@
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/c/include/LIEF/ELF/structures.h.in b/api/c/include/LIEF/ELF/structures.h.in
new file mode 100644
index 0000000..82a8fb4
--- /dev/null
+++ b/api/c/include/LIEF/ELF/structures.h.in
@@ -0,0 +1,14 @@
+#ifndef LIEF_ELF_C_STRUCTURES_H_
+#define LIEF_ELF_C_STRUCTURES_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@LIEF_ELF_STRUCTURES@
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/c/include/LIEF/LIEF.h b/api/c/include/LIEF/LIEF.h
new file mode 100644
index 0000000..39a4104
--- /dev/null
+++ b/api/c/include/LIEF/LIEF.h
@@ -0,0 +1,23 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_H_
+#define C_LIEF_H_
+
+#include <LIEF/MachO.h>
+#include <LIEF/PE.h>
+#include <LIEF/ELF.h>
+
+#endif
diff --git a/api/c/include/LIEF/MachO.h b/api/c/include/LIEF/MachO.h
new file mode 100644
index 0000000..63ab4f7
--- /dev/null
+++ b/api/c/include/LIEF/MachO.h
@@ -0,0 +1,28 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_MACHO_H_
+#define C_LIEF_MACHO_H_
+
+//! @defgroup macho_c_api MachO C API
+
+#include "LIEF/MachO/Binary.h"
+#include "LIEF/MachO/Symbol.h"
+#include "LIEF/MachO/Segment.h"
+#include "LIEF/MachO/Section.h"
+#include "LIEF/MachO/LoadCommand.h"
+#include "LIEF/MachO/Header.h"
+#include "LIEF/MachO/EnumToString.h"
+#endif
diff --git a/api/c/include/LIEF/MachO/Binary.h b/api/c/include/LIEF/MachO/Binary.h
new file mode 100644
index 0000000..b84d4ad
--- /dev/null
+++ b/api/c/include/LIEF/MachO/Binary.h
@@ -0,0 +1,68 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_MACHO_BINARY_H_
+#define C_LIEF_MACHO_BINARY_H_
+
+/** @defgroup macho_binary_c_api Binary
+ *  @ingroup macho_c_api
+ *  @addtogroup macho_binary_c_api
+ *  @brief Binary C API
+ *
+ *  @{
+ */
+
+#include <stddef.h>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/MachO/Header.h"
+#include "LIEF/MachO/LoadCommand.h"
+#include "LIEF/MachO/Symbol.h"
+#include "LIEF/MachO/Section.h"
+#include "LIEF/MachO/Segment.h"
+#include "LIEF/MachO/enums.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @brief LIEF::MachO::Binary C Handler */
+struct Macho_Binary_t {
+  void*               handler;
+  const char*         name;
+  uint64_t            imagebase;
+  Macho_Header_t      header;
+  Macho_Command_t**   commands;
+  Macho_Symbol_t**    symbols;
+  Macho_Section_t**   sections;
+  Macho_Segment_t**   segments;
+
+};
+
+typedef struct Macho_Binary_t Macho_Binary_t;
+
+/** @brief Wrapper on LIEF::MachO::Parser::parse */
+DLL_PUBLIC Macho_Binary_t** macho_parse(const char *file);
+
+DLL_PUBLIC void macho_binaries_destroy(Macho_Binary_t** binaries);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/MachO/EnumToString.h b/api/c/include/LIEF/MachO/EnumToString.h
new file mode 100644
index 0000000..bf360ed
--- /dev/null
+++ b/api/c/include/LIEF/MachO/EnumToString.h
@@ -0,0 +1,41 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_MACHO_ENUM_TO_STRING_H_
+#define C_LIEF_MACHO_ENUM_TO_STRING_H_
+
+#include "LIEF/visibility.h"
+#include "LIEF/MachO/enums.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+DLL_PUBLIC const char* LOAD_COMMAND_TYPES_to_string(enum LOAD_COMMAND_TYPES e);
+DLL_PUBLIC const char* MACHO_TYPES_to_string(enum MACHO_TYPES e);
+DLL_PUBLIC const char* FILE_TYPES_to_string(enum FILE_TYPES e);
+DLL_PUBLIC const char* CPU_TYPES_to_string(enum CPU_TYPES e);
+DLL_PUBLIC const char* HEADER_FLAGS_to_string(enum HEADER_FLAGS e);
+DLL_PUBLIC const char* MachO_SECTION_TYPES_to_string(enum SECTION_TYPES e);
+DLL_PUBLIC const char* MachO_SYMBOL_TYPES_to_string(enum SYMBOL_TYPES e);
+DLL_PUBLIC const char* N_LIST_TYPES_to_string(enum N_LIST_TYPES e);
+DLL_PUBLIC const char* SYMBOL_DESCRIPTIONS_to_string(enum SYMBOL_DESCRIPTIONS e);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/c/include/LIEF/MachO/Header.h b/api/c/include/LIEF/MachO/Header.h
new file mode 100644
index 0000000..31c8160
--- /dev/null
+++ b/api/c/include/LIEF/MachO/Header.h
@@ -0,0 +1,52 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_MACHO_HEADER_H_
+#define C_LIEF_MACHO_HEADER_H_
+#include <inttypes.h>
+
+#include "LIEF/MachO/enums.h"
+/**  @defgroup macho_header_c_api Header
+ *  @ingroup macho_c_api
+ *  @addtogroup macho_header_c_api
+ *  @brief Header C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Macho_Header_t {
+  uint32_t        magic;
+  enum CPU_TYPES  cpu_type;
+  uint32_t        cpu_subtype;
+  enum FILE_TYPES file_type;
+  uint32_t        nb_cmds;
+  uint32_t        sizeof_cmds;
+  uint32_t        flags;
+  uint32_t        reserved;
+};
+
+typedef struct Macho_Header_t Macho_Header_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/MachO/LoadCommand.h b/api/c/include/LIEF/MachO/LoadCommand.h
new file mode 100644
index 0000000..d88b126
--- /dev/null
+++ b/api/c/include/LIEF/MachO/LoadCommand.h
@@ -0,0 +1,48 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_MACHO_LOAD_COMMAND_H_
+#define C_LIEF_MACHO_LOAD_COMMAND_H_
+#include <inttypes.h>
+
+#include "LIEF/MachO/enums.h"
+/**  @defgroup macho_load_command_c_api Header
+ *  @ingroup macho_c_api
+ *  @addtogroup macho_load_command_c_api
+ *  @brief Load Command C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Macho_Command_t {
+  enum LOAD_COMMAND_TYPES command;
+  uint32_t                size;
+  uint8_t*                data;
+  uint32_t                offset;
+};
+
+typedef struct Macho_Command_t Macho_Command_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/MachO/Section.h b/api/c/include/LIEF/MachO/Section.h
new file mode 100644
index 0000000..3eba29e
--- /dev/null
+++ b/api/c/include/LIEF/MachO/Section.h
@@ -0,0 +1,59 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_MACHO_SECTION_H_
+#define C_LIEF_MACHO_SECTION_H_
+#include <inttypes.h>
+
+#include "LIEF/MachO/enums.h"
+/**  @defgroup macho_section_c_api Header
+ *  @ingroup macho_c_api
+ *  @addtogroup macho_section_c_api
+ *  @brief Section C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Macho_Section_t {
+
+  const char*        name;
+  uint32_t           alignment;
+  uint32_t           relocation_offset;
+  uint32_t           numberof_relocations;
+  uint32_t           flags;
+  enum SECTION_TYPES type;
+  uint32_t           reserved1;
+  uint32_t           reserved2;
+  uint32_t           reserved3;
+  uint64_t           virtual_address;
+  uint64_t           offset;
+  uint64_t           size;
+  uint8_t*           content;
+  double             entropy;
+};
+
+typedef struct Macho_Section_t Macho_Section_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/MachO/Segment.h b/api/c/include/LIEF/MachO/Segment.h
new file mode 100644
index 0000000..b263940
--- /dev/null
+++ b/api/c/include/LIEF/MachO/Segment.h
@@ -0,0 +1,55 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_MACHO_SEGMENT_H_
+#define C_LIEF_MACHO_SEGMENT_H_
+#include <inttypes.h>
+
+#include "LIEF/MachO/enums.h"
+/**  @defgroup macho_segment_c_api Header
+ *  @ingroup macho_c_api
+ *  @addtogroup macho_segment_c_api
+ *  @brief Segment C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Macho_Segment_t {
+  const char*       name;
+  uint64_t          virtual_address;
+  uint64_t          virtual_size;
+  uint64_t          file_size;
+  uint64_t          file_offset;
+  uint32_t          max_protection;
+  uint32_t          init_protection;
+  uint32_t          numberof_sections;
+  uint32_t          flags;
+  uint8_t*          content;
+  Macho_Section_t** sections;
+};
+
+typedef struct Macho_Segment_t Macho_Segment_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/MachO/Symbol.h b/api/c/include/LIEF/MachO/Symbol.h
new file mode 100644
index 0000000..ff0181b
--- /dev/null
+++ b/api/c/include/LIEF/MachO/Symbol.h
@@ -0,0 +1,49 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_MACHO_SYMBOL_H_
+#define C_LIEF_MACHO_SYMBOL_H_
+#include <inttypes.h>
+
+#include "LIEF/MachO/enums.h"
+/**  @defgroup macho_symbol_c_api Header
+ *  @ingroup macho_c_api
+ *  @addtogroup macho_symbol_c_api
+ *  @brief Symbol C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Macho_Symbol_t {
+  const char* name;
+  uint8_t     type;
+  uint8_t     numberof_sections;
+  uint16_t    description;
+  uint64_t    value;
+};
+
+typedef struct Macho_Symbol_t Macho_Symbol_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/MachO/enums.h.in b/api/c/include/LIEF/MachO/enums.h.in
new file mode 100644
index 0000000..33f1617
--- /dev/null
+++ b/api/c/include/LIEF/MachO/enums.h.in
@@ -0,0 +1,14 @@
+#ifndef LIEF_MACHO_C_ENUMS_H_
+#define LIEF_MACHO_C_ENUMS_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@LIEF_MACHO_ENUMS@
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/c/include/LIEF/MachO/structures.h.in b/api/c/include/LIEF/MachO/structures.h.in
new file mode 100644
index 0000000..7dc4475
--- /dev/null
+++ b/api/c/include/LIEF/MachO/structures.h.in
@@ -0,0 +1,14 @@
+#ifndef LIEF_MACHO_C_STRUCTURES_H_
+#define LIEF_MACHO_C_STRUCTURES_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@LIEF_MACHO_STRUCTURES@
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/c/include/LIEF/PE.h b/api/c/include/LIEF/PE.h
new file mode 100644
index 0000000..7ca1528
--- /dev/null
+++ b/api/c/include/LIEF/PE.h
@@ -0,0 +1,23 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_PE_H_
+#define C_LIEF_PE_H_
+
+//! @defgroup pe_c_api PE C API
+
+#include "LIEF/PE/Binary.h"
+#include "LIEF/PE/EnumToString.h"
+#endif
diff --git a/api/c/include/LIEF/PE/Binary.h b/api/c/include/LIEF/PE/Binary.h
new file mode 100644
index 0000000..007f621
--- /dev/null
+++ b/api/c/include/LIEF/PE/Binary.h
@@ -0,0 +1,67 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_PE_BINARY_H_
+#define C_LIEF_PE_BINARY_H_
+
+/** @defgroup pe_binary_c_api Binary
+ *  @ingroup pe_c_api
+ *  @addtogroup pe_binary_c_api
+ *  @brief Binary C API
+ *
+ *  @{
+ */
+
+#include <stddef.h>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/enums.h"
+
+#include "LIEF/PE/DosHeader.h"
+#include "LIEF/PE/Header.h"
+#include "LIEF/PE/OptionalHeader.h"
+#include "LIEF/PE/DataDirectory.h"
+#include "LIEF/PE/Section.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @brief LIEF::PE::Binary C Handler */
+struct Pe_Binary_t {
+  void*                handler;
+  const char*          name;
+  Pe_DosHeader_t       dos_header;
+  Pe_Header_t          header;
+  Pe_OptionalHeader_t  optional_header;
+  Pe_DataDirectory_t** data_directories;
+  Pe_Section_t**       sections;
+};
+
+typedef struct Pe_Binary_t Pe_Binary_t;
+
+/** @brief Wrapper on LIEF::PE::Parser::parse */
+DLL_PUBLIC Pe_Binary_t* pe_parse(const char *file);
+
+DLL_PUBLIC void pe_binary_destroy(Pe_Binary_t* binary);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/PE/DataDirectory.h b/api/c/include/LIEF/PE/DataDirectory.h
new file mode 100644
index 0000000..dc99864
--- /dev/null
+++ b/api/c/include/LIEF/PE/DataDirectory.h
@@ -0,0 +1,47 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_PE_DATA_DIRECTORY_H_
+#define C_LIEF_PE_DATA_DIRECTORY_H_
+
+#include <inttypes.h>
+
+#include "LIEF/PE/enums.h"
+/**  @defgroup pe_data_directory_c_api Section
+ *  @ingroup pe_c_api
+ *  @addtogroup pe_data_directory_c_api
+ *  @brief Data directory C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Pe_DataDirectory_t {
+  uint32_t rva;
+  uint32_t size;
+};
+
+typedef struct Pe_DataDirectory_t Pe_DataDirectory_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/PE/DosHeader.h b/api/c/include/LIEF/PE/DosHeader.h
new file mode 100644
index 0000000..1b1e5bd
--- /dev/null
+++ b/api/c/include/LIEF/PE/DosHeader.h
@@ -0,0 +1,63 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_PE_DOS_HEADER_H_
+#define C_LIEF_PE_DOS_HEADER_H_
+#include <inttypes.h>
+
+#include "LIEF/ELF/enums.h"
+/**  @defgroup pe_dos_header_c_api DosHeader
+ *  @ingroup pe_c_api
+ *  @addtogroup pe_dos_header_c_api
+ *  @brief Dos Header C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Pe_DosHeader_t {
+  uint16_t magic ;
+  uint16_t used_bytes_in_the_last_page;
+  uint16_t file_size_in_pages;
+  uint16_t numberof_relocation;
+  uint16_t header_size_in_paragraphs;
+  uint16_t minimum_extra_paragraphs;
+  uint16_t maximum_extra_paragraphs;
+  uint16_t initial_relative_ss;
+  uint16_t initial_sp;
+  uint16_t checksum;
+  uint16_t initial_ip;
+  uint16_t initial_relative_cs;
+  uint16_t addressof_relocation_table;
+  uint16_t overlay_number;
+  uint16_t reserved[4];
+  uint16_t oem_id;
+  uint16_t oem_info;
+  uint16_t reserved2[10];
+  uint32_t addressof_new_exeheader;
+};
+
+typedef struct Pe_DosHeader_t Pe_DosHeader_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/PE/EnumToString.h b/api/c/include/LIEF/PE/EnumToString.h
new file mode 100644
index 0000000..8e79ea2
--- /dev/null
+++ b/api/c/include/LIEF/PE/EnumToString.h
@@ -0,0 +1,37 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_PE_ENUM_TO_STRING_H_
+#define C_LIEF_PE_ENUM_TO_STRING_H_
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/enums.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+DLL_PUBLIC const char* PE_TYPES_to_string(enum PE_TYPES e);
+DLL_PUBLIC const char* MACHINE_TYPES_to_string(enum MACHINE_TYPES e);
+DLL_PUBLIC const char* SUBSYSTEM_to_string(enum SUBSYSTEM e);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/c/include/LIEF/PE/Header.h b/api/c/include/LIEF/PE/Header.h
new file mode 100644
index 0000000..a71208f
--- /dev/null
+++ b/api/c/include/LIEF/PE/Header.h
@@ -0,0 +1,53 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_PE_HEADER_H_
+#define C_LIEF_PE_HEADER_H_
+
+#include <inttypes.h>
+
+#include "LIEF/PE/enums.h"
+/**  @defgroup pe_header_c_api Header
+ *  @ingroup pe_c_api
+ *  @addtogroup pe_header_c_api
+ *  @brief Header C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Pe_Header_t {
+  uint8_t            signature[4];
+  enum MACHINE_TYPES machine;
+  uint16_t           numberof_sections;
+  uint32_t           time_date_stamp;
+  uint32_t           pointerto_symbol_table;
+  uint32_t           numberof_symbols;
+  uint16_t           sizeof_optional_header;
+  uint16_t           characteristics;
+};
+
+typedef struct Pe_Header_t Pe_Header_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/PE/OptionalHeader.h b/api/c/include/LIEF/PE/OptionalHeader.h
new file mode 100644
index 0000000..9b5c593
--- /dev/null
+++ b/api/c/include/LIEF/PE/OptionalHeader.h
@@ -0,0 +1,74 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_PE_OPTIONAL_HEADER_H_
+#define C_LIEF_PE_OPTIONAL_HEADER_H_
+#include <inttypes.h>
+
+#include "LIEF/PE/enums.h"
+/**  @defgroup pe_optional_header_c_api OptionalHeader
+ *  @ingroup pe_c_api
+ *  @addtogroup pe_optional_header_c_api
+ *  @brief OptionalHeader C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Pe_OptionalHeader_t {
+  enum PE_TYPES  magic;
+  uint8_t        major_linker_version;
+  uint8_t        minor_linker_version;
+  uint32_t       sizeof_code;
+  uint32_t       sizeof_initialized_data;
+  uint32_t       sizeof_uninitialized_data;
+  uint32_t       addressof_entrypoint;
+  uint32_t       baseof_code;
+  uint32_t       baseof_data;
+  uint64_t       imagebase;
+  uint32_t       section_alignment;
+  uint32_t       file_alignment;
+  uint16_t       major_operating_system_version;
+  uint16_t       minor_operating_system_version;
+  uint16_t       major_image_version;
+  uint16_t       minor_image_version;
+  uint16_t       major_subsystem_version;
+  uint16_t       minor_subsystem_version;
+  uint32_t       win32_version_value;
+  uint32_t       sizeof_image;
+  uint32_t       sizeof_headers;
+  uint32_t       checksum;
+  enum SUBSYSTEM subsystem;
+  uint32_t       dll_characteristics;
+  uint64_t       sizeof_stack_reserve;
+  uint64_t       sizeof_stack_commit;
+  uint64_t       sizeof_heap_reserve;
+  uint64_t       sizeof_heap_commit;
+  uint32_t       loader_flags;
+  uint32_t       numberof_rva_and_size;
+};
+
+typedef struct Pe_OptionalHeader_t Pe_OptionalHeader_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/PE/Section.h b/api/c/include/LIEF/PE/Section.h
new file mode 100644
index 0000000..b63df5e
--- /dev/null
+++ b/api/c/include/LIEF/PE/Section.h
@@ -0,0 +1,58 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef C_LIEF_PE_SECTION_H_
+#define C_LIEF_PE_SECTION_H_
+
+#include <inttypes.h>
+
+#include "LIEF/PE/enums.h"
+/**  @defgroup pe_section_c_api Section
+ *  @ingroup pe_c_api
+ *  @addtogroup pe_section_c_api
+ *  @brief Section C API
+ *
+ *  @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Pe_Section_t {
+  const char* name;
+  uint64_t    virtual_address;
+  uint64_t    size;
+  uint64_t    offset;
+
+  uint32_t    virtual_size;
+  uint32_t    pointerto_relocation;
+  uint32_t    pointerto_line_numbers;
+  uint32_t    characteristics;
+
+  uint8_t*    content;
+  double      entropy;
+
+};
+
+typedef struct Pe_Section_t Pe_Section_t;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/** @} */
+#endif
diff --git a/api/c/include/LIEF/PE/enums.h.in b/api/c/include/LIEF/PE/enums.h.in
new file mode 100644
index 0000000..8e5d76d
--- /dev/null
+++ b/api/c/include/LIEF/PE/enums.h.in
@@ -0,0 +1,20 @@
+#ifndef LIEF_PE_C_ENUMS_H_
+#define LIEF_PE_C_ENUMS_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@LIEF_PE_ENUMS@
+
+
+enum PE_TYPES {
+    PE32      = 0x10b, /** 32bits  */
+    PE32_PLUS = 0x20b  /** 64 bits */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/c/include/LIEF/PE/structures.h.in b/api/c/include/LIEF/PE/structures.h.in
new file mode 100644
index 0000000..893a65d
--- /dev/null
+++ b/api/c/include/LIEF/PE/structures.h.in
@@ -0,0 +1,14 @@
+#ifndef LIEF_PE_C_STRUCTURES_H_
+#define LIEF_PE_C_STRUCTURES_H_
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@LIEF_PE_STRUCTURES@
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/api/python/Abstract/init.cpp b/api/python/Abstract/init.cpp
new file mode 100644
index 0000000..99d81e2
--- /dev/null
+++ b/api/python/Abstract/init.cpp
@@ -0,0 +1,26 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyLIEF.hpp"
+#include "init.hpp"
+
+void init_LIEF_module(py::module& m) {
+  init_LIEF_Enum(m);
+  init_LIEF_Header_class(m);
+  init_LIEF_Binary_class(m);
+  init_LIEF_Section_class(m);
+  init_LIEF_Symbol_class(m);
+  init_LIEF_Parser_class(m);
+}
diff --git a/api/python/Abstract/init.hpp b/api/python/Abstract/init.hpp
new file mode 100644
index 0000000..0a029eb
--- /dev/null
+++ b/api/python/Abstract/init.hpp
@@ -0,0 +1,28 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef PY_LIEF_INIT_H_
+#define PY_LIEF_INIT_H_
+
+#include "pyLIEF.hpp"
+
+void init_LIEF_Enum(py::module&);
+void init_LIEF_Header_class(py::module&);
+void init_LIEF_Binary_class(py::module&);
+void init_LIEF_Section_class(py::module&);
+void init_LIEF_Symbol_class(py::module&);
+void init_LIEF_Parser_class(py::module&);
+
+#endif
diff --git a/api/python/Abstract/objects/pyBinary.cpp b/api/python/Abstract/objects/pyBinary.cpp
new file mode 100644
index 0000000..144fa9a
--- /dev/null
+++ b/api/python/Abstract/objects/pyBinary.cpp
@@ -0,0 +1,102 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "init.hpp"
+#include "LIEF/Abstract/Binary.hpp"
+#include "LIEF/ELF/Binary.hpp"
+
+#include <algorithm>
+
+using namespace LIEF;
+
+template<class T>
+using getter_t = T (Binary::*)(void) const;
+
+template<class T>
+using setter_t = void (Binary::*)(T);
+
+template<class T>
+using it_t = T (Binary::*)(void);
+
+void init_LIEF_Binary_class(py::module& m) {
+  py::class_<Binary>(m, "Binary")
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&Binary::name),
+        static_cast<setter_t<const std::string&>>(&Binary::name),
+        "Binary's name")
+
+    .def_property_readonly("header",
+        &Binary::get_header,
+        "Binary's header")
+
+    .def_property_readonly("entrypoint",
+        &Binary::entrypoint,
+        "Binary's entrypoint")
+
+    .def_property_readonly("sections",
+        static_cast<it_t<it_sections>>(&Binary::get_sections),
+        "Return a list in **read only** of binary's abstract " RST_CLASS_REF(lief.Section) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("exported_functions",
+        &Binary::get_exported_functions,
+        "Return binary's exported functions (name)")
+
+    .def_property_readonly("imported_functions",
+        &Binary::get_imported_functions,
+        "Return binary's imported functions (name)")
+
+    .def_property_readonly("libraries",
+        &Binary::get_imported_libraries,
+        "Return binary's imported libraries (name)")
+
+    .def_property_readonly("symbols",
+        static_cast<it_t<it_symbols>>(&Binary::get_symbols),
+        "Return a list in **read only** of binary's abstract " RST_CLASS_REF(lief.Symbol) "",
+        py::return_value_policy::reference_internal)
+
+    .def("get_function_address",
+        &Binary::get_function_address,
+        "Return the address of the given function name")
+
+    .def("patch_address",
+        static_cast<void (Binary::*) (uint64_t, const std::vector<uint8_t>&)>(&Binary::patch_address),
+        "Patch the address with the given value",
+        py::arg("address"), py::arg("patch_value"))
+
+    .def("patch_address",
+        static_cast<void (Binary::*) (uint64_t, uint64_t, size_t)>(&Binary::patch_address),
+        "Patch the address with the given value",
+        py::arg("address"), py::arg("patch_value"), py::arg_v("size", 8))
+
+
+   .def("get_content_from_virtual_address",
+        &Binary::get_content_from_virtual_address,
+       "Return the content located at virtual address")
+
+
+    .def("__str__",
+        [] (const Binary& binary)
+        {
+          std::ostringstream stream;
+          stream << binary;
+          std::string str = stream.str();
+          return str;
+        });
+
+}
+
+
+
diff --git a/api/python/Abstract/objects/pyHeader.cpp b/api/python/Abstract/objects/pyHeader.cpp
new file mode 100644
index 0000000..6ad0eb5
--- /dev/null
+++ b/api/python/Abstract/objects/pyHeader.cpp
@@ -0,0 +1,51 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <sstream>
+
+#include "init.hpp"
+#include "LIEF/Abstract/Header.hpp"
+
+template<class T>
+using getter_t = T (LIEF::Header::*)(void) const;
+
+template<class T>
+using setter_t = void (LIEF::Header::*)(T);
+
+void init_LIEF_Header_class(py::module& m) {
+  py::class_<LIEF::Header>(m, "Header")
+    .def(py::init())
+
+    .def_property("architecture",
+        static_cast<getter_t<LIEF::ARCHITECTURES>>(&LIEF::Header::architecture),
+        static_cast<setter_t<LIEF::ARCHITECTURES>>(&LIEF::Header::architecture),
+        "Target's architecture")
+
+
+    .def_property("entrypoint",
+        static_cast<getter_t<uint64_t>>(&LIEF::Header::entrypoint),
+        static_cast<setter_t<uint64_t>>(&LIEF::Header::entrypoint),
+        "Binary's entrypoint")
+
+
+    .def("__str__",
+        [] (const LIEF::Header& header)
+        {
+          std::ostringstream stream;
+          stream << header;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/Abstract/objects/pyParser.cpp b/api/python/Abstract/objects/pyParser.cpp
new file mode 100644
index 0000000..e3b4bd8
--- /dev/null
+++ b/api/python/Abstract/objects/pyParser.cpp
@@ -0,0 +1,28 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "init.hpp"
+
+#include "LIEF/Abstract/Parser.hpp"
+
+#include <string>
+
+void init_LIEF_Parser_class(py::module& m) {
+
+    m.def("parse",
+      &LIEF::Parser::parse,
+      "Parse the given binary and return a " RST_CLASS_REF(lief.Binary) " object",
+      py::return_value_policy::take_ownership);
+}
diff --git a/api/python/Abstract/objects/pySection.cpp b/api/python/Abstract/objects/pySection.cpp
new file mode 100644
index 0000000..acc0a1c
--- /dev/null
+++ b/api/python/Abstract/objects/pySection.cpp
@@ -0,0 +1,57 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "init.hpp"
+#include "LIEF/Abstract/Section.hpp"
+
+template<class T>
+using getter_t = T (LIEF::Section::*)(void) const;
+
+template<class T>
+using setter_t = void (LIEF::Section::*)(T);
+
+void init_LIEF_Section_class(py::module& m) {
+  py::class_<LIEF::Section>(m, "Section")
+    .def(py::init())
+
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&LIEF::Section::name),
+        static_cast<setter_t<const std::string&>>(&LIEF::Section::name),
+        "Section's name")
+
+    .def_property("size",
+        static_cast<getter_t<uint64_t>>(&LIEF::Section::size),
+        static_cast<setter_t<uint64_t>>(&LIEF::Section::size),
+        "Section's size")
+
+    .def_property("offset",
+        static_cast<getter_t<uint64_t>>(&LIEF::Section::offset),
+        static_cast<setter_t<uint64_t>>(&LIEF::Section::offset),
+        "Section's offset")
+
+    .def_property("virtual_address",
+        static_cast<getter_t<uint64_t>>(&LIEF::Section::virtual_address),
+        static_cast<setter_t<uint64_t>>(&LIEF::Section::virtual_address),
+        "Section's size")
+
+    .def_property("content",
+        static_cast<getter_t<std::vector<uint8_t>>>(&LIEF::Section::content),
+        static_cast<setter_t<const std::vector<uint8_t>&>>(&LIEF::Section::content),
+        "section's content")
+
+    .def_property_readonly("entropy",
+        &LIEF::Section::entropy,
+        "Section's entropy");
+}
diff --git a/api/python/Abstract/objects/pySymbol.cpp b/api/python/Abstract/objects/pySymbol.cpp
new file mode 100644
index 0000000..b173722
--- /dev/null
+++ b/api/python/Abstract/objects/pySymbol.cpp
@@ -0,0 +1,61 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "init.hpp"
+#include "LIEF/Abstract/Symbol.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = const T& (LIEF::Symbol::*)(void) const;
+
+template<class T>
+using setter_t = void (LIEF::Symbol::*)(const T&);
+
+
+class PySymbol : public LIEF::Symbol {
+  public:
+    using LIEF::Symbol::Symbol;
+
+    virtual const std::string& name(void) const override {
+      PYBIND11_OVERLOAD(const std::string&, LIEF::Symbol, name,);
+    };
+
+    virtual void name(const std::string& name) override {
+      PYBIND11_OVERLOAD(void, LIEF::Symbol, name, name);
+    };
+};
+
+
+void init_LIEF_Symbol_class(py::module& m) {
+
+  py::class_<LIEF::Symbol, PySymbol>(m, "Symbol")
+    .def(py::init())
+
+    .def_property("name",
+        static_cast<getter_t<std::string>>(&LIEF::Symbol::name),
+        static_cast<setter_t<std::string>>(&LIEF::Symbol::name),
+        "Symbol's name")
+
+    .def("__str__",
+        [] (const LIEF::Symbol& symbol)
+        {
+          std::ostringstream stream;
+          stream << symbol;
+          std::string str = stream.str();
+          return str;
+        });
+}
diff --git a/api/python/Abstract/pyEnums.cpp b/api/python/Abstract/pyEnums.cpp
new file mode 100644
index 0000000..da41456
--- /dev/null
+++ b/api/python/Abstract/pyEnums.cpp
@@ -0,0 +1,28 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "init.hpp"
+#include "LIEF/Abstract/enums.hpp"
+#include "LIEF/Abstract/EnumToString.hpp"
+
+#define PY_ENUM(x) LIEF::to_string(x), x
+
+void init_LIEF_Enum(py::module& m) {
+  py::enum_<LIEF::FILE_FORMATS>(m, "FILE_FORMATS")
+    .value(PY_ENUM(LIEF::FILE_FORMATS::FORMAT_ELF))
+    .value(PY_ENUM(LIEF::FILE_FORMATS::FORMAT_PE))
+    .value(PY_ENUM(LIEF::FILE_FORMATS::FORMAT_MACHO))
+    .export_values();
+}
diff --git a/api/python/CMakeLists.txt b/api/python/CMakeLists.txt
new file mode 100644
index 0000000..d07d2ba
--- /dev/null
+++ b/api/python/CMakeLists.txt
@@ -0,0 +1,164 @@
+cmake_minimum_required(VERSION 3.1)
+include(ExternalProject)
+
+
+set(Python_ADDITIONAL_VERSIONS 2.7 2.7.6 3.4 3.5 3.6 3.7)
+if (NOT ${PYTHON_VERSION} STREQUAL "")
+  find_package(PythonLibs ${PYTHON_VERSION} EXACT)
+
+  if (NOT PythonLibs_FOUND)
+    find_package(PythonLibs ${PYTHON_VERSION})
+  endif()
+
+  set(PYTHONLIBS_VERSION_STRING "${PYTHON_VERSION}")
+  if (NOT PythonLibs_FOUND)
+    # WARNING: DIRTY HACK
+    # ^^^^^^^^^^^^^^^^^^^
+    if ((${PYTHON_VERSION} VERSION_GREATER "3") OR (${PYTHON_VERSION} VERSION_EQUAL "3"))
+      if (UNIX)
+        set(PYTHON_LIBRARY /usr/lib/libpython${PYTHON_VERSION}.so)
+        if(EXISTS "/usr/include/python${PYTHON_VERSION}" AND IS_DIRECTORY "/usr/include/python${PYTHON_VERSION}")
+          set(PYTHON_INCLUDE_DIR /usr/include/python${PYTHON_VERSION})
+          set(PYTHONLIBS_VERSION_STRING "${PYTHON_VERSION}")
+        elseif(EXISTS "/usr/include/python${PYTHON_VERSION}m" AND IS_DIRECTORY "/usr/include/python${PYTHON_VERSION}m")
+          set(PYTHON_INCLUDE_DIR /usr/include/python${PYTHON_VERSION}m)
+          set(PYTHONLIBS_VERSION_STRING "${PYTHON_VERSION}m")
+        endif()
+      endif()
+    endif()
+  endif()
+else()
+  find_package(PythonLibs REQUIRED)
+endif()
+
+
+message(STATUS "Python version: ${PYTHONLIBS_VERSION_STRING}")
+message(STATUS "Python lib:     ${PYTHON_LIBRARY}")
+message(STATUS "Python include: ${PYTHON_INCLUDE_DIR}")
+
+
+set(PYBIND11_GIT_URL "https://github.com/pybind/pybind11.git" CACHE STRING "URL to the Pybind11 repo")
+ExternalProject_Add(pybind11
+  GIT_REPOSITORY ${PYBIND11_GIT_URL}
+  GIT_TAG           v2.0.1
+  CONFIGURE_COMMAND ""
+  BUILD_COMMAND     ""
+  INSTALL_COMMAND   "")
+ExternalProject_get_property(pybind11 SOURCE_DIR)
+set(PYBIND11_SOURCE_DIR ${SOURCE_DIR})
+
+
+# Define source files
+set(LIEF_PYTHON_SRC
+  ${CMAKE_CURRENT_SOURCE_DIR}/pyLIEF.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/pyUtils.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/pyJson.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/pyIterators.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/pyExceptions.cpp
+
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract/init.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract/objects
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract/objects/pyBinary.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract/objects/pyHeader.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract/objects/pySection.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract/objects/pyParser.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract/objects/pySymbol.cpp
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract/pyEnums.cpp
+)
+
+
+add_library(pyLIEF SHARED ${LIEF_PYTHON_SRC})
+
+
+target_include_directories(pyLIEF PUBLIC
+  ${CMAKE_CURRENT_SOURCE_DIR}/
+  ${CMAKE_CURRENT_SOURCE_DIR}/Abstract
+  ${PYTHON_INCLUDE_DIR}
+  ${PYBIND11_SOURCE_DIR}/include)
+
+add_definitions(-DELPP_NO_DEFAULT_LOG_FILE)
+
+if(LIEF_ELF)
+  include(${CMAKE_CURRENT_SOURCE_DIR}/ELF/CMakeLists.txt)
+endif()
+
+if(LIEF_PE)
+  include(${CMAKE_CURRENT_SOURCE_DIR}/PE/CMakeLists.txt)
+endif()
+
+if(LIEF_MACHO)
+  include(${CMAKE_CURRENT_SOURCE_DIR}/MachO/CMakeLists.txt)
+endif()
+
+
+target_compile_features(pyLIEF PRIVATE cxx_attribute_deprecated)
+
+set_property(TARGET pyLIEF PROPERTY CXX_STANDARD          11)
+set_property(TARGET pyLIEF PROPERTY CXX_STANDARD_REQUIRED ON)
+
+if (MSVC)
+  target_compile_options(pyLIEF PUBLIC /FIiso646.h)
+	set_property(TARGET pyLIEF PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
+endif()
+
+set_target_properties(pyLIEF PROPERTIES PYTHON_VERSION ${PYTHONLIBS_VERSION_STRING})
+set(PYLIEF_DEPS_LIBRARIES LIB_LIEF_STATIC)
+
+if(LIEF_COVERAGE)
+  target_compile_options(pyLIEF PRIVATE -g -O0 --coverage -fprofile-arcs -ftest-coverage)
+  set(PYLIEF_DEPS_LIBRARIES ${PYLIEF_DEPS_LIBRARIES} gcov)
+endif()
+
+if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+  target_compile_options(pyLIEF PRIVATE -Wall -Wextra -Wpedantic -Wno-macro-redefined)
+endif()
+
+set_target_properties(pyLIEF PROPERTIES PREFIX "" OUTPUT_NAME "lief")
+add_dependencies(pyLIEF pybind11)
+
+if(APPLE)
+    set_target_properties(pyLIEF PROPERTIES MACOSX_RPATH ".")
+    set_target_properties(pyLIEF PROPERTIES LINK_FLAGS "-undefined dynamic_lookup ")
+endif()
+
+set_target_properties(pyLIEF PROPERTIES PREFIX "")
+if (UNIX)
+  set_target_properties(pyLIEF PROPERTIES SUFFIX ".so")
+elseif(WIN32)
+  set_target_properties(pyLIEF PROPERTIES SUFFIX ".pyd")
+endif()
+
+get_target_property(suffix pyLIEF SUFFIX)
+set(LIEF_LIBRARY_NAME "lief${suffix}")
+
+if (WIN32)
+  set(PYLIEF_DEPS_LIBRARIES ${PYLIEF_DEPS_LIBRARIES} ${PYTHON_LIBRARIES})
+endif()
+
+target_link_libraries(pyLIEF PUBLIC ${PYLIEF_DEPS_LIBRARIES})
+
+add_custom_command(TARGET pyLIEF POST_BUILD
+    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:pyLIEF> ${PROJECT_BINARY_DIR}/api/python/
+)
+
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in" "${CMAKE_CURRENT_BINARY_DIR}/setup.py")
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in" "${CMAKE_CURRENT_BINARY_DIR}/__init__.py")
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/README.in" "${CMAKE_CURRENT_BINARY_DIR}/README")
+configure_file("${CMAKE_CURRENT_SOURCE_DIR}/MANIFEST.in.in" "${CMAKE_CURRENT_BINARY_DIR}/MANIFEST.in")
+
+MESSAGE(STATUS "OS: ${CMAKE_HOST_SYSTEM}")
+
+find_program(ENV_BINARY "env")
+
+if (UNIX AND ENV_BINARY AND LIEF_INSTALL_PYTHON)
+  if ((${PYTHONLIBS_VERSION_STRING} VERSION_GREATER "3") OR (${PYTHONLIBS_VERSION_STRING} VERSION_EQUAL "3"))
+    install(CODE "execute_process(COMMAND ${ENV_BINARY} python3 ${CMAKE_CURRENT_BINARY_DIR}/setup.py install)"
+      COMPONENT python)
+  else()
+    install(
+      CODE "execute_process(COMMAND ${ENV_BINARY} python2 ${CMAKE_CURRENT_BINARY_DIR}/setup.py install)"
+      COMPONENT python)
+  endif()
+endif()
+
+
diff --git a/api/python/ELF/CMakeLists.txt b/api/python/ELF/CMakeLists.txt
new file mode 100644
index 0000000..b82e344
--- /dev/null
+++ b/api/python/ELF/CMakeLists.txt
@@ -0,0 +1,29 @@
+set(LIEF_PYTHON_ELF_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/pyELF.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDynamicEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySymbolVersionAuxRequirement.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySymbolVersion.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDynamicEntryRunPath.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySymbolVersionRequirement.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyBinary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySymbolVersionDefinition.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySymbolVersionAux.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDynamicEntryArray.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySegment.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySection.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDynamicEntryRpath.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyRelocation.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDynamicSharedObject.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyParser.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDynamicEntryLibrary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySymbol.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyGnuHash.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyBuilder.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/pyELFStructures.cpp
+)
+
+target_sources(pyLIEF PRIVATE ${LIEF_PYTHON_ELF_SRC})
+target_include_directories(pyLIEF PUBLIC ${CMAKE_CURRENT_LIST_DIR})
+
+
diff --git a/api/python/ELF/objects/pyBinary.cpp b/api/python/ELF/objects/pyBinary.cpp
new file mode 100644
index 0000000..1a03f58
--- /dev/null
+++ b/api/python/ELF/objects/pyBinary.cpp
@@ -0,0 +1,215 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+
+#include "LIEF/ELF/Binary.hpp"
+#include "LIEF/Abstract/Binary.hpp"
+
+#include "pyELF.hpp"
+
+template<class T>
+using no_const_getter = T (Binary::*)(void);
+
+template<class T, class P>
+using no_const_func = T (Binary::*)(P);
+
+void init_ELF_Binary_class(py::module& m) {
+
+  // Binary object
+  py::class_<Binary, LIEF::Binary>(m, "Binary", "ELF binary representation")
+    .def(py::init<const std::string &, ELF_CLASS>())
+
+    .def_property_readonly("type",
+        &Binary::type)
+
+    .def_property_readonly("header",
+        static_cast<no_const_getter<Header&>>(&Binary::get_header),
+        "Return " RST_CLASS_REF(lief.ELF.Header) " object",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("sections",
+        static_cast<no_const_getter<it_sections>>(&Binary::get_sections),
+        "Return binary's " RST_CLASS_REF(lief.ELF.Section) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("segments",
+        static_cast<no_const_getter<it_segments>>(&Binary::get_segments),
+        "Return binary's " RST_CLASS_REF(lief.ELF.Segment) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("dynamic_entries",
+        static_cast<no_const_getter<it_dynamic_entries>>(&Binary::get_dynamic_entries),
+        "Return " RST_CLASS_REF(lief.ELF.DynamicEntry) " entries as a list",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("static_symbols",
+        static_cast<no_const_getter<it_symbols>>(&Binary::get_static_symbols),
+        "Return static's " RST_CLASS_REF(lief.ELF.Symbol) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("dynamic_symbols",
+        static_cast<no_const_getter<it_symbols>>(&Binary::get_dynamic_symbols),
+        "Return dynamic's " RST_CLASS_REF(lief.ELF.Symbol) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("exported_symbols",
+        static_cast<no_const_getter<it_exported_symbols>>(&Binary::get_exported_symbols),
+        "Return dynamic's " RST_CLASS_REF(lief.ELF.Symbol) " which are exported",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("imported_symbols",
+        static_cast<no_const_getter<it_imported_symbols>>(&Binary::get_imported_symbols),
+        "Return dynamic's " RST_CLASS_REF(lief.ELF.Symbol) " which are imported",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("dynamic_relocations",
+        static_cast<no_const_getter<it_relocations>>(&Binary::get_dynamic_relocations),
+        "Return PLT/GOT " RST_CLASS_REF(lief.ELF.Relocation) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("pltgot_relocations",
+        static_cast<no_const_getter<it_relocations>>(&Binary::get_pltgot_relocations),
+        "Return dynamics " RST_CLASS_REF(lief.ELF.Relocation) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("symbols_version",
+        static_cast<no_const_getter<it_symbols_version>>(&Binary::get_symbols_version),
+        "Return " RST_CLASS_REF(lief.ELF.SymbolVersion) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("symbols_version_requirement",
+        static_cast<no_const_getter<it_symbols_version_requirement>>(&Binary::get_symbols_version_requirement),
+        "Return " RST_CLASS_REF(lief.ELF.SymbolVersionRequirement) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("symbols_version_definition",
+        static_cast<no_const_getter<it_symbols_version_definition>>(&Binary::get_symbols_version_definition),
+        "Return " RST_CLASS_REF(lief.ELF.SymbolVersionDefinition) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("gnu_hash",
+        &Binary::get_gnu_hash,
+        "Return " RST_CLASS_REF(lief.ELF.GnuHash) " object",
+        py::return_value_policy::reference_internal)
+
+   .def_property_readonly("imagebase",
+        &Binary::get_imagebase,
+       "Return the program image base. (e.g. 0x400000)")
+
+   .def_property_readonly("virtual_size",
+        &Binary::get_virtual_size,
+       "Return the binary's size when mapped in memory")
+
+   .def_property_readonly("is_pie",
+        &Binary::is_pie,
+       "Check if the binary is a ``pie`` one")
+
+   .def_property_readonly("has_interpreter",
+        &Binary::has_interpreter,
+       "Check if the binary uses a loader")
+
+   .def_property_readonly("interpreter",
+        &Binary::get_interpreter,
+       "Return ELF interprer if any. (e.g. ``/lib64/ld-linux-x86-64.so.2``)")
+
+    .def("section_from_offset",
+        static_cast<no_const_func<Section&, uint64_t>>(&Binary::section_from_offset),
+        "Return binary's " RST_CLASS_REF(lief.ELF.Section) " which holds the offset",
+        "address"_a,
+        py::return_value_policy::reference)
+
+    .def("section_from_virtual_address",
+        static_cast<no_const_func<Section&, uint64_t>>(&Binary::section_from_virtual_address),
+        "Return binary's " RST_CLASS_REF(lief.ELF.Section) " which holds the given virtual address",
+        py::return_value_policy::reference)
+
+    .def("segment_from_virtual_address",
+        static_cast<no_const_func<Segment&, uint64_t>>(&Binary::segment_from_virtual_address),
+        "Return binary's " RST_CLASS_REF(lief.ELF.Segment) " which holds the address",
+        py::return_value_policy::reference)
+
+    .def("segment_from_offset",
+        static_cast<no_const_func<Segment&, uint64_t>>(&Binary::segment_from_offset),
+        "Return binary's " RST_CLASS_REF(lief.ELF.Segment) " which holds the offset",
+        py::return_value_policy::reference)
+
+    .def("dynamic_entry_from_tag",
+        static_cast<no_const_func<DynamicEntry&, DYNAMIC_TAGS>>(&Binary::dynamic_entry_from_tag),
+        "Return first binary's " RST_CLASS_REF(lief.ELF.DynamicEntry) " given its tag",
+        py::return_value_policy::reference)
+
+    .def("has_dynamic_entry",
+        &Binary::has_dynamic_entry,
+        "Check if the " RST_CLASS_REF(lief.ELF.DynamicEntry) " associated with the given tag exists")
+
+    .def("patch_pltgot",
+        static_cast<void (Binary::*) (const std::string&, uint64_t)>(&Binary::patch_pltgot),
+        "Patch the imported symbol's name with the ``address``")
+
+    .def("patch_pltgot",
+        static_cast<void (Binary::*) (const Symbol&, uint64_t)>(&Binary::patch_pltgot),
+        "Patch the imported symbol's name with the ``address``")
+
+    .def("has_section",
+        &Binary::has_section,
+        "Check if a section with the given name exists in the binary")
+
+    .def("get_section",
+        static_cast<no_const_func<Section&, const std::string&>>(&Binary::get_section),
+        py::return_value_policy::reference)
+
+    .def("add_static_symbol",
+        &Binary::add_static_symbol,
+        py::return_value_policy::reference)
+
+    .def("virtual_address_to_offset",
+        &Binary::virtual_address_to_offset,
+        "Convert the virtual address to an offset in the binary")
+
+    .def("add_section",
+        &Binary::add_section,
+        "Add a section in the binary",
+        py::return_value_policy::reference)
+
+    .def("add_segment",
+        &Binary::add_segment,
+        "Add a segment in the binary",
+        py::arg("segment"), py::arg_v("base", 0x400000), py::arg_v("force_note", false),
+        py::return_value_policy::reference)
+
+    .def("insert_content",
+        &Binary::insert_content,
+        "Add some datas in the binary")
+
+    .def("strip",
+        &Binary::strip,
+        "Strip the binary")
+
+    .def("write",
+        &Binary::write,
+        "Rebuild the binary and write it in a file",
+        py::return_value_policy::reference_internal)
+
+
+    .def("__str__",
+        [] (const Binary& binary)
+        {
+          std::ostringstream stream;
+          stream << binary;
+          std::string str = stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pyBuilder.cpp b/api/python/ELF/objects/pyBuilder.cpp
new file mode 100644
index 0000000..3749eb4
--- /dev/null
+++ b/api/python/ELF/objects/pyBuilder.cpp
@@ -0,0 +1,41 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/ELF/Builder.hpp"
+
+#include <string>
+#include <sstream>
+
+
+void init_ELF_Builder_class(py::module& m) {
+  py::class_<Builder>(m, "Builder")
+    .def(py::init<Binary*>())
+
+    .def("build", static_cast<void (Builder::*)(void)>(&Builder::build))
+
+    .def("empties_gnuhash",
+        &Builder::empties_gnuhash,
+        py::return_value_policy::reference)
+
+    .def("write",
+        &Builder::write)
+
+    .def("get_build",
+        &Builder::get_build,
+        py::return_value_policy::reference_internal);
+
+}
diff --git a/api/python/ELF/objects/pyDynamicEntry.cpp b/api/python/ELF/objects/pyDynamicEntry.cpp
new file mode 100644
index 0000000..6294460
--- /dev/null
+++ b/api/python/ELF/objects/pyDynamicEntry.cpp
@@ -0,0 +1,66 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/ELF/DynamicEntry.hpp"
+#include "LIEF/visitors/Hash.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (DynamicEntry::*)(void) const;
+
+template<class T>
+using setter_t = void (DynamicEntry::*)(T);
+
+void init_ELF_DynamicEntry_class(py::module& m) {
+
+  // DynamicEntry object
+  py::class_<DynamicEntry>(m, "DynamicEntry")
+    .def_property("tag",
+        static_cast<getter_t<DYNAMIC_TAGS>>(&DynamicEntry::tag),
+        static_cast<setter_t<DYNAMIC_TAGS>>(&DynamicEntry::tag),
+        "Return the entry's " RST_CLASS_REF(lief.ELF.DYNAMIC_TAGS) " which represent the entry type")
+
+
+    .def_property("value",
+        static_cast<getter_t<uint64_t>>(&DynamicEntry::value),
+        static_cast<setter_t<uint64_t>>(&DynamicEntry::value),
+        "Return the entry's value.")
+
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&DynamicEntry::name),
+        static_cast<setter_t<const std::string&>>(&DynamicEntry::name),
+        "Depending on the entry type, it return a name. For instance for a `DT_SONAME`\
+        entry it returns the library name")
+
+    .def("__eq__", &DynamicEntry::operator==)
+    .def("__ne__", &DynamicEntry::operator!=)
+    .def("__hash__",
+        [] (const DynamicEntry& entry) {
+          return LIEF::Hash::hash(entry);
+        })
+
+    .def("__str__",
+        [] (const DynamicEntry& dynamicEntry)
+        {
+          std::ostringstream stream;
+          stream << dynamicEntry;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pyDynamicEntryArray.cpp b/api/python/ELF/objects/pyDynamicEntryArray.cpp
new file mode 100644
index 0000000..2601208
--- /dev/null
+++ b/api/python/ELF/objects/pyDynamicEntryArray.cpp
@@ -0,0 +1,58 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/DynamicEntryArray.hpp"
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (DynamicEntryArray::*)(void) const;
+
+template<class T>
+using setter_t = void (DynamicEntryArray::*)(T);
+
+void init_ELF_DynamicEntryArray_class(py::module& m) {
+
+  // Dynamic Entry Array object
+  py::class_<DynamicEntryArray, DynamicEntry>(m, "DynamicEntryArray")
+    .def(py::init<>())
+    .def_property("array",
+        static_cast<std::vector<uint64_t>& (DynamicEntryArray::*) (void)>(&DynamicEntryArray::array),
+        static_cast<setter_t<const std::vector<uint64_t>&>>(&DynamicEntryArray::array),
+        "Return the array")
+
+    .def("__eq__", &DynamicEntryArray::operator==)
+    .def("__ne__", &DynamicEntryArray::operator!=)
+    .def("__hash__",
+        [] (const DynamicEntryArray& entry) {
+          return LIEF::Hash::hash(entry);
+        })
+
+
+    .def("__str__",
+        [] (const DynamicEntryArray& entry)
+        {
+          std::ostringstream stream;
+          stream << entry;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pyDynamicEntryLibrary.cpp b/api/python/ELF/objects/pyDynamicEntryLibrary.cpp
new file mode 100644
index 0000000..5dd8166
--- /dev/null
+++ b/api/python/ELF/objects/pyDynamicEntryLibrary.cpp
@@ -0,0 +1,60 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/DynamicEntryLibrary.hpp"
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (DynamicEntryLibrary::*)(void) const;
+
+template<class T>
+using setter_t = void (DynamicEntryLibrary::*)(T);
+
+void init_ELF_DynamicEntryLibrary_class(py::module& m) {
+
+  //
+  // Dynamic Entry Library object
+  //
+  py::class_<DynamicEntryLibrary, DynamicEntry>(m, "DynamicEntryLibrary")
+    .def(py::init<const std::string &>())
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&DynamicEntryLibrary::name),
+        static_cast<setter_t<const std::string&>>(&DynamicEntryLibrary::name),
+        "Return library's name")
+
+    .def("__eq__", &DynamicEntryLibrary::operator==)
+    .def("__ne__", &DynamicEntryLibrary::operator!=)
+    .def("__hash__",
+        [] (const DynamicEntryLibrary& entry) {
+          return LIEF::Hash::hash(entry);
+        })
+
+
+    .def("__str__",
+        [] (const DynamicEntryLibrary& dynamicEntryLibrary)
+        {
+          std::ostringstream stream;
+          stream << dynamicEntryLibrary;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pyDynamicEntryRpath.cpp b/api/python/ELF/objects/pyDynamicEntryRpath.cpp
new file mode 100644
index 0000000..41fad18
--- /dev/null
+++ b/api/python/ELF/objects/pyDynamicEntryRpath.cpp
@@ -0,0 +1,65 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/DynamicEntryRpath.hpp"
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (DynamicEntryRpath::*)(void) const;
+
+template<class T>
+using setter_t = void (DynamicEntryRpath::*)(T);
+
+void init_ELF_DynamicEntryRpath_class(py::module& m) {
+
+  //
+  // Dynamic Entry RPATH object
+  //
+  py::class_<DynamicEntryRpath, DynamicEntry>(m, "DynamicEntryRpath")
+    .def(py::init<const std::string &>())
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&DynamicEntryRpath::name),
+        static_cast<setter_t<const std::string&>>(&DynamicEntryRpath::name),
+        "Return path value")
+
+    .def_property("rpath",
+        static_cast<getter_t<const std::string&>>(&DynamicEntryRpath::rpath),
+        static_cast<setter_t<const std::string&>>(&DynamicEntryRpath::rpath),
+        "Return path value")
+
+    .def("__eq__", &DynamicEntryRpath::operator==)
+    .def("__ne__", &DynamicEntryRpath::operator!=)
+    .def("__hash__",
+        [] (const DynamicEntryRpath& entry) {
+          return LIEF::Hash::hash(entry);
+        })
+
+
+    .def("__str__",
+        [] (const DynamicEntryRpath& entry)
+        {
+          std::ostringstream stream;
+          stream << entry;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pyDynamicEntryRunPath.cpp b/api/python/ELF/objects/pyDynamicEntryRunPath.cpp
new file mode 100644
index 0000000..8ff3f50
--- /dev/null
+++ b/api/python/ELF/objects/pyDynamicEntryRunPath.cpp
@@ -0,0 +1,64 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/DynamicEntryRunPath.hpp"
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (DynamicEntryRunPath::*)(void) const;
+
+template<class T>
+using setter_t = void (DynamicEntryRunPath::*)(T);
+
+void init_ELF_DynamicEntryRunPath_class(py::module& m) {
+
+  //
+  // Dynamic Entry RUNPATH object
+  //
+  py::class_<DynamicEntryRunPath, DynamicEntry>(m, "DynamicEntryRunPath")
+    .def(py::init<const std::string &>())
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&DynamicEntryRunPath::name),
+        static_cast<setter_t<const std::string&>>(&DynamicEntryRunPath::name),
+        "Return path value")
+
+    .def_property("runpath",
+        static_cast<getter_t<const std::string&>>(&DynamicEntryRunPath::runpath),
+        static_cast<setter_t<const std::string&>>(&DynamicEntryRunPath::runpath),
+        "Return path value")
+
+    .def("__eq__", &DynamicEntryRunPath::operator==)
+    .def("__ne__", &DynamicEntryRunPath::operator!=)
+    .def("__hash__",
+        [] (const DynamicEntryRunPath& entry) {
+          return LIEF::Hash::hash(entry);
+        })
+
+    .def("__str__",
+        [] (const DynamicEntryRunPath& entry)
+        {
+          std::ostringstream stream;
+          stream << entry;
+          std::string str = stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pyDynamicSharedObject.cpp b/api/python/ELF/objects/pyDynamicSharedObject.cpp
new file mode 100644
index 0000000..8cf4c1a
--- /dev/null
+++ b/api/python/ELF/objects/pyDynamicSharedObject.cpp
@@ -0,0 +1,58 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/DynamicSharedObject.hpp"
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (DynamicSharedObject::*)(void) const;
+
+template<class T>
+using setter_t = void (DynamicSharedObject::*)(T);
+
+void init_ELF_DynamicSharedObject_class(py::module& m) {
+
+  //
+  // Dynamic Shared Object object
+  //
+  py::class_<DynamicSharedObject, DynamicEntry>(m, "DynamicSharedObject")
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&DynamicSharedObject::name),
+        static_cast<setter_t<const std::string&>>(&DynamicSharedObject::name),
+        "Return the library name")
+
+    .def("__eq__", &DynamicSharedObject::operator==)
+    .def("__ne__", &DynamicSharedObject::operator!=)
+    .def("__hash__",
+        [] (const DynamicSharedObject& entry) {
+          return LIEF::Hash::hash(entry);
+        })
+
+    .def("__str__",
+        [] (const DynamicSharedObject& dynamicSharedObject)
+        {
+        std::ostringstream stream;
+        stream << dynamicSharedObject;
+        std::string str =  stream.str();
+        return str;
+        });
+}
diff --git a/api/python/ELF/objects/pyGnuHash.cpp b/api/python/ELF/objects/pyGnuHash.cpp
new file mode 100644
index 0000000..b26ecea
--- /dev/null
+++ b/api/python/ELF/objects/pyGnuHash.cpp
@@ -0,0 +1,79 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "pyELF.hpp"
+
+#include "LIEF/ELF/GnuHash.hpp"
+
+
+template<class T>
+using getter_t = T (GnuHash::*)(void) const;
+
+template<class T>
+using setter_t = void (GnuHash::*)(T);
+
+void init_ELF_GnuHash_class(py::module& m) {
+
+  py::class_<GnuHash>(m, "GnuHash")
+    .def(py::init<>())
+
+    .def_property_readonly("nb_buckets",
+      &GnuHash::nb_buckets,
+      "Return the number of buckets")
+
+    .def_property_readonly("symbol_index",
+      &GnuHash::symbol_index,
+      "Index of the first symbol in the dynamic symbols table which accessible with the hash table")
+
+    .def_property_readonly("shift2",
+      &GnuHash::shift2,
+      "Shift count used in the bloom filter")
+
+    .def_property_readonly("bloom_filters",
+      &GnuHash::bloom_filters,
+      "Bloom filters",
+      py::return_value_policy::reference_internal)
+
+    .def_property_readonly("bloom_filters",
+      &GnuHash::bloom_filters,
+      "Bloom filters",
+      py::return_value_policy::reference_internal)
+
+    .def_property_readonly("buckets",
+      &GnuHash::buckets,
+      "hash buckets",
+      py::return_value_policy::reference_internal)
+
+    .def_property_readonly("hash_values",
+      &GnuHash::hash_values,
+      "Hash values",
+      py::return_value_policy::reference_internal)
+
+    .def("__str__",
+        [] (const GnuHash& gnuhash)
+        {
+          std::ostringstream stream;
+          stream << gnuhash;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+
+}
+
diff --git a/api/python/ELF/objects/pyHeader.cpp b/api/python/ELF/objects/pyHeader.cpp
new file mode 100644
index 0000000..83fb4f8
--- /dev/null
+++ b/api/python/ELF/objects/pyHeader.cpp
@@ -0,0 +1,150 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/ELF/Header.hpp"
+
+template<class T>
+using getter_t = T (Header::*)(void) const;
+
+template<class T>
+using setter_t = void (Header::*)(T);
+
+void init_ELF_Header_class(py::module& m) {
+
+  //
+  // Header object
+  //
+  py::class_<Header>(m, "Header")
+    .def(py::init<>())
+    .def(py::init<const std::vector<uint8_t>&>())
+
+    .def_property("identity_class",
+        static_cast<getter_t<ELF_CLASS>>(&Header::identity_class),
+        static_cast<setter_t<ELF_CLASS>>(&Header::identity_class),
+        "Return header's " RST_CLASS_REF(lief.ELF.ELF_CLASS) "."
+        )
+
+    .def_property("identity_data",
+        static_cast<getter_t<ELF_DATA>>(&Header::identity_data),
+        static_cast<setter_t<ELF_DATA>>(&Header::identity_data),
+        "Return header's " RST_CLASS_REF(lief.ELF.ELF_DATA) "."
+        )
+
+    .def_property("identity_version",
+        static_cast<getter_t<VERSION>>(&Header::identity_version),
+        static_cast<setter_t<VERSION>>(&Header::identity_version),
+        "Return header's " RST_CLASS_REF(lief.ELF.VERSION) "."
+        )
+
+    .def_property("identity_os_abi",
+        static_cast<getter_t<OS_ABI>>(&Header::identity_os_abi),
+        static_cast<setter_t<OS_ABI>>(&Header::identity_os_abi),
+        "Return header's " RST_CLASS_REF(lief.ELF.OS_ABI) "."
+        )
+
+    .def_property_readonly("identity",
+        static_cast<Header::identity_t& (Header::*)(void)>(&Header::identity),
+        "Return header's identity.",
+        py::return_value_policy::reference_internal
+        )
+
+    .def_property("file_type",
+        static_cast<getter_t<E_TYPE>>(&Header::file_type),
+        static_cast<setter_t<E_TYPE>>(&Header::file_type),
+        "Return binary's " RST_CLASS_REF(lief.ELF.E_TYPE) ". It determine if the binary \
+        is a executable, a library..."
+        )
+
+    .def_property("machine_type",
+        static_cast<getter_t<ARCH>>(&Header::machine_type),
+        static_cast<setter_t<ARCH>>(&Header::machine_type),
+        "Return target architecture (" RST_CLASS_REF(lief.ELF.ARCH) ")")
+
+    .def_property("object_file_version",
+        static_cast<getter_t<VERSION>>(&Header::object_file_version),
+        static_cast<setter_t<VERSION>>(&Header::object_file_version),
+        "Return " RST_CLASS_REF(lief.ELF.VERSION) "")
+
+    .def_property("entrypoint",
+        static_cast<getter_t<uint64_t>>(&Header::entrypoint),
+        static_cast<setter_t<uint64_t>>(&Header::entrypoint),
+        "Return binary entry point")
+
+    .def_property("program_header_offset",
+        static_cast<getter_t<uint64_t>>(&Header::program_headers_offset),
+        static_cast<setter_t<uint64_t>>(&Header::program_headers_offset),
+        "Return file offset to the program header table")
+
+    .def_property("section_header_offset",
+        static_cast<getter_t<uint64_t>>(&Header::section_headers_offset),
+        static_cast<setter_t<uint64_t>>(&Header::section_headers_offset),
+        "Return file offset to the section header table")
+
+    .def_property("processor_flag",
+        static_cast<getter_t<uint32_t>>(&Header::processor_flag),
+        static_cast<setter_t<uint32_t>>(&Header::processor_flag))
+
+    .def_property("header_size",
+        static_cast<getter_t<uint32_t>>(&Header::header_size),
+        static_cast<setter_t<uint32_t>>(&Header::header_size),
+        "Return the size of the ELF header")
+
+    .def_property("program_header_size",
+        static_cast<getter_t<uint32_t>>(&Header::program_header_size),
+        static_cast<setter_t<uint32_t>>(&Header::program_header_size),
+        "Return this size of a program header entry")
+
+    .def_property("numberof_segments",
+        static_cast<getter_t<uint32_t>>(&Header::numberof_segments),
+        static_cast<setter_t<uint32_t>>(&Header::numberof_segments),
+        "Return the number of program headers (segments)")
+
+    .def_property("sizeof_section_header",
+        static_cast<getter_t<uint32_t>>(&Header::sizeof_section_header),
+        static_cast<setter_t<uint32_t>>(&Header::sizeof_section_header),
+        "Return the size of an section header entry")
+
+    .def_property("numberof_sections",
+        static_cast<getter_t<uint32_t>>(&Header::numberof_sections),
+        static_cast<setter_t<uint32_t>>(&Header::numberof_sections),
+        "Return the number of section's headers")
+
+    .def_property("section_name_table_idx",
+        static_cast<getter_t<uint32_t>>(&Header::section_name_table_idx),
+        static_cast<setter_t<uint32_t>>(&Header::section_name_table_idx),
+        "Return the section index which hold sections's name")
+
+    .def("__eq__", &Header::operator==)
+    .def("__ne__", &Header::operator!=)
+    .def("__hash__",
+        [] (const Header& header) {
+          return LIEF::Hash::hash(header);
+        })
+
+    .def("__str__",
+        [] (const Header& header)
+        {
+          std::ostringstream stream;
+          stream << header;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pyParser.cpp b/api/python/ELF/objects/pyParser.cpp
new file mode 100644
index 0000000..3d74d0a
--- /dev/null
+++ b/api/python/ELF/objects/pyParser.cpp
@@ -0,0 +1,36 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/ELF/Parser.hpp"
+
+#include <string>
+
+void init_ELF_Parser_class(py::module& m) {
+
+  // Parser (Parser)
+  m.def("parse",
+    static_cast<Binary* (*) (const std::string&)>(&Parser::parse),
+    "Parse the given binary and return a " RST_CLASS_REF(lief.ELF.Binary) " object",
+    py::return_value_policy::take_ownership);
+
+
+  m.def("parse_from_raw",
+    static_cast<Binary* (*) (const std::vector<uint8_t>&, const std::string&)>(&Parser::parse),
+    "Parse the given raw data and return a " RST_CLASS_REF(lief.ELF.Binary) " object",
+    py::arg("raw"), py::arg("name") = "",
+    py::return_value_policy::take_ownership);
+}
diff --git a/api/python/ELF/objects/pyRelocation.cpp b/api/python/ELF/objects/pyRelocation.cpp
new file mode 100644
index 0000000..4e7e4fe
--- /dev/null
+++ b/api/python/ELF/objects/pyRelocation.cpp
@@ -0,0 +1,74 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/ELF/Relocation.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Relocation::*)(void) const;
+
+template<class T>
+using setter_t = void (Relocation::*)(T);
+
+void init_ELF_Relocation_class(py::module& m) {
+  // Relocation object
+  py::class_<Relocation>(m, "Relocation")
+    .def_property("address",
+        static_cast<getter_t<uint64_t>>(&Relocation::address),
+        static_cast<setter_t<uint64_t>>(&Relocation::address))
+
+    .def_property("addend",
+        static_cast<getter_t<int64_t>>(&Relocation::addend),
+        static_cast<setter_t<int64_t>>(&Relocation::addend))
+
+    .def_property("type",
+        static_cast<getter_t<uint32_t>>(&Relocation::type),
+        static_cast<setter_t<uint32_t>>(&Relocation::type))
+
+    .def_property_readonly("has_symbol",
+        &Relocation::has_symbol)
+
+    .def_property_readonly("symbol",
+        static_cast<Symbol& (Relocation::*)(void)>(&Relocation::symbol),
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("is_rela",
+      static_cast<getter_t<bool>>(&Relocation::is_rela))
+
+    .def_property_readonly("is_rel",
+      static_cast<getter_t<bool>>(&Relocation::is_rel))
+
+
+    .def("__eq__", &Relocation::operator==)
+    .def("__ne__", &Relocation::operator!=)
+    .def("__hash__",
+        [] (const Relocation& relocation) {
+          return LIEF::Hash::hash(relocation);
+        })
+
+    .def("__str__",
+      [] (const Relocation& relocation)
+        {
+          std::ostringstream stream;
+          stream << relocation;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pySection.cpp b/api/python/ELF/objects/pySection.cpp
new file mode 100644
index 0000000..2d97b2e
--- /dev/null
+++ b/api/python/ELF/objects/pySection.cpp
@@ -0,0 +1,130 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/Abstract/Section.hpp"
+#include "LIEF/ELF/Section.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Section::*)(void) const;
+
+template<class T>
+using setter_t = void (Section::*)(T);
+
+template<class T>
+using no_const_getter = T (Section::*)(void);
+
+void init_ELF_Section_class(py::module& m) {
+
+  // Section object
+  py::class_<Section, LIEF::Section>(m, "Section")
+    .def(py::init<>())
+
+    .def("__init__",
+        [] (Section& section, std::vector<uint8_t>& content, ELF_CLASS type)
+        {
+          new (&section) Section(content.data(), type);
+        })
+
+    .def_property_readonly("name_idx",
+        static_cast<getter_t<uint32_t>>(&Section::name_idx),
+        "Index of the section's name in the string table\n\n"
+        ".. warning:: The value will probably change when re-building binary.")
+
+    .def_property("type",
+        static_cast<getter_t<SECTION_TYPES>>(&Section::type),
+        static_cast<setter_t<SECTION_TYPES>>(&Section::type),
+        "Return a " RST_CLASS_REF(lief.ELF.SECTION_TYPES) "")
+
+    .def_property("flags",
+        static_cast<getter_t<uint64_t>>(&Section::flags),
+        static_cast<setter_t<uint64_t>>(&Section::flags),
+        "Return sections flags")
+
+    .def_property("virtual_address",
+        static_cast<getter_t<uint64_t>>(&Section::virtual_address),
+        static_cast<setter_t<uint64_t>>(&Section::virtual_address),
+        "Return address where the section will be mapped in memory\n\n"
+        ".. warning:: This value is not reliable use segment's virtual address "
+        "(:attr:`~lief.ELF.Segment.virtual_address`) instead.")
+
+    .def_property("file_offset",
+        static_cast<getter_t<uint64_t>>(&Section::file_offset),
+        static_cast<setter_t<uint64_t>>(&Section::file_offset),
+        "Data offset in the binary")
+
+    .def_property_readonly("original_size",
+        static_cast<getter_t<uint64_t>>(&Section::original_size),
+        "original data size. Without modification we have `original_size == size`")
+
+    .def_property("alignment",
+        static_cast<getter_t<uint64_t>>(&Section::alignment),
+        static_cast<setter_t<uint64_t>>(&Section::alignment)
+        )
+
+    .def_property("information",
+        static_cast<getter_t<uint64_t>>(&Section::information),
+        static_cast<setter_t<uint32_t>>(&Section::information))
+
+    .def_property("entry_size",
+        static_cast<getter_t<uint64_t>>(&Section::entry_size),
+        static_cast<setter_t<uint64_t>>(&Section::entry_size),
+        "If section's content is an array, `entry_size` holds the element's size\n\n"
+        ":Example:\n"
+        "\tThe `.dynamic` section contains an array of " RST_CLASS_REF(lief.ELF.DynamicEntry) ". As the size "
+        "of a dynamic entry is 0x10 (for ELF64), entry_size will contains this value\n\n"
+        ".. warning:: This value is not necessarily reliable.")
+
+    .def_property("link",
+        static_cast<getter_t<uint32_t>>(&Section::link),
+        static_cast<setter_t<uint32_t>>(&Section::link))
+
+    .def_property("data",
+        static_cast<getter_t<std::vector<uint8_t>>>(&Section::content),
+        static_cast<setter_t<const std::vector<uint8_t>&>>(&Section::content))
+
+    .def_property_readonly("segments",
+      static_cast<no_const_getter<it_segments>>(&Section::segments),
+      py::return_value_policy::reference_internal)
+
+    .def("__contains__",
+        [] (const Section &section, SECTION_FLAGS flag)
+        {
+          return section.has_flag(flag);
+        }, "Test if the current section has the given flag")
+
+
+    .def("__eq__", &Section::operator==)
+    .def("__ne__", &Section::operator!=)
+    .def("__hash__",
+        [] (const Section& section) {
+          return LIEF::Hash::hash(section);
+        })
+
+    .def("__str__",
+        [] (const Section& section)
+        {
+          std::ostringstream stream;
+          stream << section;
+          std::string str =  stream.str();
+          return str;
+        });
+}
+
diff --git a/api/python/ELF/objects/pySegment.cpp b/api/python/ELF/objects/pySegment.cpp
new file mode 100644
index 0000000..552f15d
--- /dev/null
+++ b/api/python/ELF/objects/pySegment.cpp
@@ -0,0 +1,121 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+#include <vector>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/ELF/Segment.hpp"
+
+#include "pyELF.hpp"
+
+template<class T>
+using getter_t = T (Segment::*)(void) const;
+
+template<class T>
+using setter_t = void (Segment::*)(T);
+
+template<class T>
+using no_const_getter = T (Segment::*)(void);
+
+
+void init_ELF_Segment_class(py::module& m) {
+  py::class_<Segment>(m, "Segment")
+
+    .def(py::init<>())
+    .def(py::init<const std::vector<uint8_t>&>())
+    .def(py::init<const std::vector<uint8_t>&, ELF_CLASS>())
+
+    .def_property("type",
+        static_cast<getter_t<SEGMENT_TYPES>>(&Segment::type),
+        static_cast<setter_t<SEGMENT_TYPES>>(&Segment::type),
+        "Segment's " RST_CLASS_REF(lief.ELF.SEGMENT_TYPES) "")
+
+    .def_property("flag",
+        static_cast<getter_t<uint32_t>>(&Segment::flag),
+        static_cast<setter_t<uint32_t>>(&Segment::flag),
+        "Segment's flags")
+
+    .def_property("file_offset",
+        static_cast<getter_t<uint64_t>>(&Segment::file_offset),
+        static_cast<setter_t<uint64_t>>(&Segment::file_offset),
+        "Data offset in the binary")
+
+    .def_property("virtual_address",
+        static_cast<getter_t<uint64_t>>(&Segment::virtual_address),
+        static_cast<setter_t<uint64_t>>(&Segment::virtual_address),
+        "Address where the segment will be mapped\n\n"
+        ".. warning:: We must have\n\n"
+        "\t.. math::\n\n"
+        "\t\t\\text{virtual address} \\equiv \\text{file offset} \\pmod{\\text{page size}}\n\n"
+        "\t\t\\text{virtual address} \\equiv \\text{file offset} \\pmod{\\text{alignment}}"
+        )
+
+    .def_property("physical_address",
+        static_cast<getter_t<uint64_t>>(&Segment::physical_address),
+        static_cast<setter_t<uint64_t>>(&Segment::physical_address),
+        "Physical address of beginning of segment (OS-specific)")
+
+    .def_property("physical_size",
+        static_cast<getter_t<uint64_t>>(&Segment::physical_size),
+        static_cast<setter_t<uint64_t>>(&Segment::physical_size),
+        "Size of data in the binary")
+
+    .def_property("virtual_size",
+        static_cast<getter_t<uint64_t>>(&Segment::virtual_size),
+        static_cast<setter_t<uint64_t>>(&Segment::virtual_size),
+        "Size of this segment in memory")
+
+    .def_property("alignment",
+        static_cast<getter_t<uint64_t>>(&Segment::alignment),
+        static_cast<setter_t<uint64_t>>(&Segment::alignment),
+        "This member gives the value to which the segments are aligned in memory and in the file.\n"
+        "Values 0 and 1 mean no alignment is required.")
+
+    .def_property("data",
+        static_cast<getter_t<std::vector<uint8_t>>>(&Segment::content),
+        static_cast<setter_t<const std::vector<uint8_t>&>>(&Segment::content),
+        "Segment's raw data")
+
+    .def_property_readonly("sections",
+      static_cast<no_const_getter<it_sections>>(&Segment::sections),
+      "" RST_CLASS_REF(lief.ELF.Section) " (s) inside this segment",
+      py::return_value_policy::reference_internal)
+
+    .def("__contains__",
+        [] (const Segment& segment, SEGMENT_FLAGS flag) -> bool
+        {
+          return segment.has_flag(flag);
+        }
+        , "Test if the current segment has the given flag")
+
+
+    .def("__eq__", &Segment::operator==)
+    .def("__ne__", &Segment::operator!=)
+    .def("__hash__",
+        [] (const Segment& segment) {
+          return LIEF::Hash::hash(segment);
+        })
+
+    .def("__str__",
+        [] (const Segment& segment)
+        {
+          std::ostringstream stream;
+          stream << segment;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pySymbol.cpp b/api/python/ELF/objects/pySymbol.cpp
new file mode 100644
index 0000000..0a10d50
--- /dev/null
+++ b/api/python/ELF/objects/pySymbol.cpp
@@ -0,0 +1,110 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/ELF/Symbol.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/Abstract/Symbol.hpp"
+
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Symbol::*)(void) const;
+
+template<class T>
+using setter_t = void (Symbol::*)(T);
+
+void init_ELF_Symbol_class(py::module& m) {
+
+  py::class_<Symbol, LIEF::Symbol>(m, "Symbol")
+    .def(py::init<>())
+    .def_property_readonly("demangled_name",
+        &Symbol::demangled_name,
+        "Symbol's unmangled name")
+
+    .def_property("type",
+        static_cast<getter_t<SYMBOL_TYPES>>(&Symbol::type),
+        static_cast<setter_t<SYMBOL_TYPES>>(&Symbol::type),
+        "A symbol's type provides a general classification for the associated entity")
+
+    .def_property("binding",
+        static_cast<getter_t<SYMBOL_BINDINGS>>(&Symbol::binding),
+        static_cast<setter_t<SYMBOL_BINDINGS>>(&Symbol::binding),
+        "A symbol’s binding determines the linkage visibility and behavior")
+
+    .def_property("information",
+        static_cast<getter_t<uint8_t>>(&Symbol::information),
+        static_cast<setter_t<uint8_t>>(&Symbol::information),
+        "This member specifies the symbol's type and binding attributes.\n")
+
+    .def_property("other",
+        static_cast<getter_t<uint8_t>>(&Symbol::other),
+        static_cast<setter_t<uint8_t>>(&Symbol::other),
+        "This member currently holds 0 and has no defined meaning.")
+
+    .def_property("value",
+        static_cast<getter_t<uint64_t>>(&Symbol::value),
+        static_cast<setter_t<uint64_t>>(&Symbol::value),
+        "This member have slightly different interpretations\n\n"
+        "\t- In relocatable files, `value` holds alignment constraints for a symbol whose section index is "
+        "`SHN_COMMON`.\n\n"
+        "\t- In relocatable files, `value` holds a section offset for a defined symbol. That is, `value` is an"
+        "offset from the beginning of the section associated with this symbol.\n\n"
+        "\t- In executable and shared object files, `value` holds a virtual address. To make these files's"
+        "symbols more useful for the dynamic linker, the section offset (file interpretation) gives way to"
+        "a virtual address (memory interpretation) for which the section number is irrelevant.")
+
+    .def_property("size",
+        static_cast<getter_t<uint64_t>>(&Symbol::size),
+        static_cast<setter_t<uint64_t>>(&Symbol::size),
+        "Many symbols have associated sizes. For example, a data object's size is the number of "
+        "bytes contained in the object. This member holds `0` if the symbol has no size or "
+        "an unknown size.")
+
+    .def_property("shndx",
+        static_cast<getter_t<uint16_t>>(&Symbol::shndx),
+        static_cast<setter_t<uint16_t>>(&Symbol::shndx),
+        "Section associated with the symbol")
+
+    .def_property_readonly("has_version",
+        &Symbol::has_version,
+        "Check if this symbols has a " RST_CLASS_REF(lief.ELF.SymbolVersion) "")
+
+    .def_property_readonly("symbol_version",
+        static_cast<SymbolVersion& (Symbol::*)(void)>(&Symbol::symbol_version),
+        "Return the " RST_CLASS_REF(lief.ELF.SymbolVersion) " associated with this symbol",
+        py::return_value_policy::reference_internal)
+
+    .def("__eq__", &Symbol::operator==)
+    .def("__ne__", &Symbol::operator!=)
+    .def("__hash__",
+        [] (const Symbol& symbol) {
+          return LIEF::Hash::hash(symbol);
+        })
+
+
+    .def("__str__",
+      [] (const Symbol& symbol)
+      {
+        std::ostringstream stream;
+        stream << symbol;
+        std::string str =  stream.str();
+        return str;
+      });
+}
diff --git a/api/python/ELF/objects/pySymbolVersion.cpp b/api/python/ELF/objects/pySymbolVersion.cpp
new file mode 100644
index 0000000..db36633
--- /dev/null
+++ b/api/python/ELF/objects/pySymbolVersion.cpp
@@ -0,0 +1,69 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/ELF/SymbolVersion.hpp"
+#include "LIEF/visitors/Hash.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (SymbolVersion::*)(void) const;
+
+template<class T>
+using setter_t = void (SymbolVersion::*)(T);
+
+void init_ELF_SymbolVersion_class(py::module& m) {
+
+  // SymbolVersion version object
+  py::class_<SymbolVersion>(m, "SymbolVersion")
+    .def_property("value",
+        static_cast<getter_t<uint16_t>>(&SymbolVersion::value),
+        static_cast<setter_t<uint16_t>>(&SymbolVersion::value),
+        "- `0` : The symbol is local\n"
+        "- `1` : The symbol is global\n\n"
+        "All other values are used for versions in the own object or in any of\n"
+        "the dependencies.  This is the version the symbol is tight to.")
+
+    .def_property_readonly("has_auxiliary_version",
+        &SymbolVersion::has_auxiliary_version,
+        "Check if this symbols has a " RST_CLASS_REF(lief.ELF.SymbolVersionAux) "")
+
+    .def_property_readonly(
+        "symbol_version_auxiliary",
+        static_cast<SymbolVersionAux& (SymbolVersion::*)(void)>(
+          &SymbolVersion::symbol_version_auxiliary),
+        "Return the " RST_CLASS_REF(lief.ELF.SymbolVersionAux) " associated with this version",
+        py::return_value_policy::reference_internal)
+
+
+    .def("__eq__", &SymbolVersion::operator==)
+    .def("__ne__", &SymbolVersion::operator!=)
+    .def("__hash__",
+        [] (const SymbolVersion& sv) {
+          return LIEF::Hash::hash(sv);
+        })
+
+    .def("__str__",
+        [] (const SymbolVersion& symbolVersion)
+        {
+          std::ostringstream stream;
+          stream << symbolVersion;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pySymbolVersionAux.cpp b/api/python/ELF/objects/pySymbolVersionAux.cpp
new file mode 100644
index 0000000..2d74958
--- /dev/null
+++ b/api/python/ELF/objects/pySymbolVersionAux.cpp
@@ -0,0 +1,56 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/ELF/SymbolVersionAux.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (SymbolVersionAux::*)(void) const;
+
+template<class T>
+using setter_t = void (SymbolVersionAux::*)(T);
+
+void init_ELF_SymbolVersionAux_class(py::module& m) {
+
+  // Symbol Version Auxiliary object
+  py::class_<SymbolVersionAux>(m, "SymbolVersionAux",
+      "Class which modelize an Auxiliary Symbol version")
+
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&SymbolVersionAux::name),
+        static_cast<getter_t<const std::string&>>(&SymbolVersionAux::name),
+        "Symbol's name")
+
+    .def("__eq__", &SymbolVersionAux::operator==)
+    .def("__ne__", &SymbolVersionAux::operator!=)
+    .def("__hash__",
+        [] (const SymbolVersionAux& sva) {
+          return LIEF::Hash::hash(sva);
+        })
+
+    .def("__str__",
+        [] (const SymbolVersionAux& symbolVersionAux)
+        {
+          std::ostringstream stream;
+          stream << symbolVersionAux;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pySymbolVersionAuxRequirement.cpp b/api/python/ELF/objects/pySymbolVersionAuxRequirement.cpp
new file mode 100644
index 0000000..5f22cab
--- /dev/null
+++ b/api/python/ELF/objects/pySymbolVersionAuxRequirement.cpp
@@ -0,0 +1,63 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/ELF/SymbolVersionAuxRequirement.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (SymbolVersionAuxRequirement::*)(void) const;
+
+template<class T>
+using setter_t = void (SymbolVersionAuxRequirement::*)(T);
+
+void init_ELF_SymbolVersionAuxRequirement_class(py::module& m) {
+  //
+  // Symbol Version Requirement Auxiliary object
+  //
+  py::class_<SymbolVersionAuxRequirement, SymbolVersionAux>(m, "SymbolVersionAuxRequirement")
+    .def_property("hash",
+        static_cast<getter_t<uint32_t>>(&SymbolVersionAuxRequirement::hash),
+        static_cast<setter_t<uint32_t>>(&SymbolVersionAuxRequirement::hash))
+
+    .def_property("flags",
+        static_cast<getter_t<uint16_t>>(&SymbolVersionAuxRequirement::flags),
+        static_cast<setter_t<uint16_t>>(&SymbolVersionAuxRequirement::flags))
+
+    .def_property("other",
+        static_cast<getter_t<uint16_t>>(&SymbolVersionAuxRequirement::other),
+        static_cast<setter_t<uint16_t>>(&SymbolVersionAuxRequirement::other))
+
+
+    .def("__eq__", &SymbolVersionAuxRequirement::operator==)
+    .def("__ne__", &SymbolVersionAuxRequirement::operator!=)
+    .def("__hash__",
+        [] (const SymbolVersionAuxRequirement& svar) {
+          return LIEF::Hash::hash(svar);
+        })
+
+    .def("__str__",
+        [] (const SymbolVersionAuxRequirement& symbolVersionAux)
+        {
+          std::ostringstream stream;
+          stream << symbolVersionAux;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pySymbolVersionDefinition.cpp b/api/python/ELF/objects/pySymbolVersionDefinition.cpp
new file mode 100644
index 0000000..2e325c6
--- /dev/null
+++ b/api/python/ELF/objects/pySymbolVersionDefinition.cpp
@@ -0,0 +1,70 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "pyELF.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/ELF/SymbolVersionDefinition.hpp"
+
+template<class T>
+using getter_t = T (SymbolVersionDefinition::*)(void) const;
+
+template<class T>
+using setter_t = void (SymbolVersionDefinition::*)(T);
+
+template<class T>
+using no_const_getter = T (SymbolVersionDefinition::*)(void);
+
+void init_ELF_SymbolVersionDefinition_class(py::module& m) {
+
+  py::class_<SymbolVersionDefinition>(m, "SymbolVersionDefinition",
+      "Class which modelization of an entry defined in ``DT_VERDEF`` (or ``.gnu.version_d``)")
+
+    .def_property("version",
+        static_cast<getter_t<uint16_t>>(&SymbolVersionDefinition::version),
+        static_cast<setter_t<uint16_t>>(&SymbolVersionDefinition::version),
+        "Version revision. Should holds 1")
+
+    .def_property("flags",
+        static_cast<getter_t<uint16_t>>(&SymbolVersionDefinition::flags),
+        static_cast<setter_t<uint16_t>>(&SymbolVersionDefinition::flags))
+
+    .def_property("hash",
+        static_cast<getter_t<uint32_t>>(&SymbolVersionDefinition::hash),
+        static_cast<setter_t<uint32_t>>(&SymbolVersionDefinition::hash))
+
+    .def_property_readonly("auxiliary_symbols",
+        static_cast<no_const_getter<it_symbols_version_aux>>(&SymbolVersionDefinition::symbols_aux),
+        py::return_value_policy::reference_internal)
+
+    .def("__eq__", &SymbolVersionDefinition::operator==)
+    .def("__ne__", &SymbolVersionDefinition::operator!=)
+    .def("__hash__",
+        [] (const SymbolVersionDefinition& svd) {
+          return LIEF::Hash::hash(svd);
+        })
+
+    .def("__str__",
+        [] (const SymbolVersionDefinition& svd)
+        {
+          std::ostringstream stream;
+          stream << svd;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/objects/pySymbolVersionRequirement.cpp b/api/python/ELF/objects/pySymbolVersionRequirement.cpp
new file mode 100644
index 0000000..0810397
--- /dev/null
+++ b/api/python/ELF/objects/pySymbolVersionRequirement.cpp
@@ -0,0 +1,68 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/ELF/SymbolVersionRequirement.hpp"
+
+#include "pyELF.hpp"
+
+template<class T>
+using getter_t = T (SymbolVersionRequirement::*)(void) const;
+
+template<class T>
+using setter_t = void (SymbolVersionRequirement::*)(T);
+
+template<class T>
+using no_const_getter = T (SymbolVersionRequirement::*)(void);
+
+void init_ELF_SymbolVersionRequirement_class(py::module& m) {
+
+  // Symbol Version Requirement object
+  py::class_<SymbolVersionRequirement>(m, "SymbolVersionRequirement",
+      "Class which modelize an entry in ``DT_VERNEED`` or ``.gnu.version_r`` table")
+
+    .def_property("version",
+        static_cast<getter_t<uint16_t>>(&SymbolVersionRequirement::version),
+        static_cast<setter_t<uint16_t>>(&SymbolVersionRequirement::version),
+        "Version revision. Should holds 1")
+
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&SymbolVersionRequirement::name),
+        static_cast<setter_t<const std::string&>>(&SymbolVersionRequirement::name))
+
+    .def("get_auxiliary_symbols",
+        static_cast<no_const_getter<it_symbols_version_aux_requirement>>(&SymbolVersionRequirement::get_auxiliary_symbols),
+        "Auxiliary entries",
+        py::return_value_policy::reference_internal)
+
+    .def("__eq__", &SymbolVersionRequirement::operator==)
+    .def("__ne__", &SymbolVersionRequirement::operator!=)
+    .def("__hash__",
+        [] (const SymbolVersionRequirement& svr) {
+          return LIEF::Hash::hash(svr);
+        })
+
+    .def("__str__",
+        [] (const SymbolVersionRequirement& symbolVersionRequirement)
+        {
+          std::ostringstream stream;
+          stream << symbolVersionRequirement;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/ELF/pyELF.cpp b/api/python/ELF/pyELF.cpp
new file mode 100644
index 0000000..31df338
--- /dev/null
+++ b/api/python/ELF/pyELF.cpp
@@ -0,0 +1,54 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+
+//
+// ELF modules
+//
+void init_ELF_module(py::module& m) {
+  py::module LIEF_ELF_module = m.def_submodule("ELF", "Python API for ELF");
+
+  // Objects
+  init_ELF_Parser_class(LIEF_ELF_module);
+  init_ELF_Binary_class(LIEF_ELF_module);
+  init_ELF_Header_class(LIEF_ELF_module);
+  init_ELF_Section_class(LIEF_ELF_module);
+  init_ELF_Segment_class(LIEF_ELF_module);
+  init_ELF_Symbol_class(LIEF_ELF_module);
+  init_ELF_Relocation_class(LIEF_ELF_module);
+  init_ELF_SymbolVersion_class(LIEF_ELF_module);
+  init_ELF_SymbolVersionAux_class(LIEF_ELF_module);
+  init_ELF_SymbolVersionAuxRequirement_class(LIEF_ELF_module);
+  init_ELF_SymbolVersionDefinition_class(LIEF_ELF_module);
+  init_ELF_SymbolVersionRequirement_class(LIEF_ELF_module);
+  init_ELF_DynamicEntry_class(LIEF_ELF_module);
+  init_ELF_DynamicEntryLibrary_class(LIEF_ELF_module);
+  init_ELF_DynamicSharedObject_class(LIEF_ELF_module);
+  init_ELF_DynamicEntryArray_class(LIEF_ELF_module);
+  init_ELF_DynamicEntryRpath_class(LIEF_ELF_module);
+  init_ELF_DynamicEntryRunPath_class(LIEF_ELF_module);
+  init_ELF_GnuHash_class(LIEF_ELF_module);
+  init_ELF_Builder_class(LIEF_ELF_module);
+
+  // Enums
+  init_ELF_Structures_enum(LIEF_ELF_module);
+
+  py::module LIEF_ELF32_module = LIEF_ELF_module.def_submodule("ELF32", "");
+  init_ELF32_Structures(LIEF_ELF32_module);
+
+  py::module LIEF_ELF64_module = LIEF_ELF_module.def_submodule("ELF64", "");
+  init_ELF64_Structures(LIEF_ELF64_module);
+}
diff --git a/api/python/ELF/pyELF.hpp b/api/python/ELF/pyELF.hpp
new file mode 100644
index 0000000..cb835bd
--- /dev/null
+++ b/api/python/ELF/pyELF.hpp
@@ -0,0 +1,55 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef PY_LIEF_ELF_H_
+#define PY_LIEF_ELF_H_
+
+#include "LIEF/ELF/Parser.hpp"
+#include "LIEF/ELF/Binary.hpp"
+#include "LIEF/ELF/Builder.hpp"
+
+#include "pyLIEF.hpp"
+using namespace LIEF::ELF;
+
+void init_ELF_Parser_class(py::module&);
+void init_ELF_Binary_class(py::module&);
+void init_ELF_Header_class(py::module&);
+void init_ELF_Section_class(py::module&);
+void init_ELF_Segment_class(py::module&);
+void init_ELF_Symbol_class(py::module&);
+void init_ELF_Relocation_class(py::module&);
+void init_ELF_SymbolVersion_class(py::module&);
+void init_ELF_SymbolVersionAux_class(py::module&);
+void init_ELF_SymbolVersionRequirement_class(py::module&);
+void init_ELF_SymbolVersionDefinition_class(py::module&);
+void init_ELF_SymbolVersionAuxRequirement_class(py::module&);
+void init_ELF_DynamicEntry_class(py::module&);
+void init_ELF_DynamicEntryLibrary_class(py::module&);
+void init_ELF_DynamicSharedObject_class(py::module&);
+void init_ELF_DynamicEntryArray_class(py::module&);
+void init_ELF_DynamicEntryRpath_class(py::module&);
+void init_ELF_DynamicEntryRunPath_class(py::module&);
+void init_ELF_GnuHash_class(py::module&);
+void init_ELF_Builder_class(py::module&);
+
+// Enums
+void init_ELF_Structures_enum(py::module&);
+
+// ELF32 and ELF64 structures
+void init_ELF32_Structures(py::module&);
+void init_ELF64_Structures(py::module&);
+
+
+#endif
diff --git a/api/python/ELF/pyELFStructures.cpp b/api/python/ELF/pyELFStructures.cpp
new file mode 100644
index 0000000..46680be
--- /dev/null
+++ b/api/python/ELF/pyELFStructures.cpp
@@ -0,0 +1,749 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyELF.hpp"
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/EnumToString.hpp"
+
+#define PY_ENUM(x) to_string(x), x
+
+void init_ELF32_Structures(py::module& m) {
+  //py::class_<Sizes<ELF32>>(m, "Sizes")
+  //  .def_property_readonly_static("ehdr",
+  //      [] (py::object) {return Sizes<ELF32>::ehdr;})
+
+  //  .def_property_readonly_static("phdr",
+  //      [] (py::object) {return Sizes<ELF32>::phdr;})
+
+  //  .def_property_readonly_static("shdr",
+  //      [] (py::object) {return Sizes<ELF32>::shdr;})
+
+  //  .def_property_readonly_static("sym",
+  //      [] (py::object) {return Sizes<ELF32>::sym;});
+
+}
+
+void init_ELF64_Structures(py::module& m) {
+  //py::class_<Sizes<ELF64>>(m, "Sizes")
+  //  .def_property_readonly_static("ehdr",
+  //      [] (py::object) {return Sizes<ELF64>::ehdr;})
+
+  //  .def_property_readonly_static("phdr",
+  //      [] (py::object) {return Sizes<ELF64>::phdr;})
+
+  //  .def_property_readonly_static("shdr",
+  //      [] (py::object) {return Sizes<ELF64>::shdr;})
+
+  //  .def_property_readonly_static("sym",
+  //      [] (py::object) {return Sizes<ELF64>::sym;});
+
+}
+
+void init_ELF_Structures_enum(py::module& m) {
+
+  py::enum_<ELF_CLASS>(m, "ELF_CLASS")
+    .value(PY_ENUM(ELF_CLASS::ELFCLASSNONE))
+    .value(PY_ENUM(ELF_CLASS::ELFCLASS32))
+    .value(PY_ENUM(ELF_CLASS::ELFCLASS64))
+    .export_values();
+
+
+  py::enum_<ELF_DATA>(m, "ELF_DATA")
+    .value(PY_ENUM(ELF_DATA::ELFDATANONE))
+    .value(PY_ENUM(ELF_DATA::ELFDATA2LSB))
+    .value(PY_ENUM(ELF_DATA::ELFDATA2MSB))
+    .export_values();
+
+  py::enum_<OS_ABI>(m, "OS_ABI")
+    .value(PY_ENUM(OS_ABI::ELFOSABI_SYSTEMV))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_HPUX))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_NETBSD))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_GNU))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_LINUX))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_HURD))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_SOLARIS))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_AIX))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_IRIX))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_FREEBSD))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_TRU64))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_MODESTO))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_OPENBSD))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_OPENVMS))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_NSK))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_AROS))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_FENIXOS))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_CLOUDABI))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_C6000_ELFABI))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_AMDGPU_HSA))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_C6000_LINUX))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_ARM))
+    .value(PY_ENUM(OS_ABI::ELFOSABI_STANDALONE))
+    .export_values();
+
+  // Enum for the *e_type* of ElfXX_Ehdr
+  py::enum_<E_TYPE>(m, "E_TYPE")
+    .value(PY_ENUM(E_TYPE::ET_NONE))
+    .value(PY_ENUM(E_TYPE::ET_REL))
+    .value(PY_ENUM(E_TYPE::ET_EXEC))
+    .value(PY_ENUM(E_TYPE::ET_DYN))
+    .value(PY_ENUM(E_TYPE::ET_CORE))
+    .value(PY_ENUM(E_TYPE::ET_LOPROC))
+    .value(PY_ENUM(E_TYPE::ET_HIPROC))
+    .export_values();
+
+  //! Enum for the *e_version* of ElfXX_Ehdr;
+  py::enum_<VERSION>(m, "VERSION")
+    .value(PY_ENUM(VERSION::EV_NONE))
+    .value(PY_ENUM(VERSION::EV_CURRENT))
+    .export_values();
+
+  // Enum for the *e_machine* of ElfXX_Ehdr
+  py::enum_<ARCH>(m, "ARCH")
+    .value(PY_ENUM(ARCH::EM_NONE))
+    .value(PY_ENUM(ARCH::EM_M32))
+    .value(PY_ENUM(ARCH::EM_SPARC))
+    .value(PY_ENUM(ARCH::EM_386))
+    .value(PY_ENUM(ARCH::EM_68K))
+    .value(PY_ENUM(ARCH::EM_88K))
+    .value(PY_ENUM(ARCH::EM_IAMCU))
+    .value(PY_ENUM(ARCH::EM_860))
+    .value(PY_ENUM(ARCH::EM_MIPS))
+    .value(PY_ENUM(ARCH::EM_S370))
+    .value(PY_ENUM(ARCH::EM_MIPS_RS3_LE))
+    .value(PY_ENUM(ARCH::EM_PARISC))
+    .value(PY_ENUM(ARCH::EM_VPP500))
+    .value(PY_ENUM(ARCH::EM_NONE))
+    .value(PY_ENUM(ARCH::EM_960))
+    .value(PY_ENUM(ARCH::EM_PPC))
+    .value(PY_ENUM(ARCH::EM_PPC64))
+    .value(PY_ENUM(ARCH::EM_S390))
+    .value(PY_ENUM(ARCH::EM_SPU))
+    .value(PY_ENUM(ARCH::EM_V800))
+    .value(PY_ENUM(ARCH::EM_FR20))
+    .value(PY_ENUM(ARCH::EM_RH32))
+    .value(PY_ENUM(ARCH::EM_RCE))
+    .value(PY_ENUM(ARCH::EM_ARM))
+    .value(PY_ENUM(ARCH::EM_ALPHA))
+    .value(PY_ENUM(ARCH::EM_SH))
+    .value(PY_ENUM(ARCH::EM_SPARCV9))
+    .value(PY_ENUM(ARCH::EM_TRICORE))
+    .value(PY_ENUM(ARCH::EM_ARC))
+    .value(PY_ENUM(ARCH::EM_H8_300))
+    .value(PY_ENUM(ARCH::EM_H8_300H))
+    .value(PY_ENUM(ARCH::EM_H8S))
+    .value(PY_ENUM(ARCH::EM_H8_500))
+    .value(PY_ENUM(ARCH::EM_IA_64))
+    .value(PY_ENUM(ARCH::EM_MIPS_X))
+    .value(PY_ENUM(ARCH::EM_COLDFIRE))
+    .value(PY_ENUM(ARCH::EM_68HC12))
+    .value(PY_ENUM(ARCH::EM_MMA))
+    .value(PY_ENUM(ARCH::EM_PCP))
+    .value(PY_ENUM(ARCH::EM_NCPU))
+    .value(PY_ENUM(ARCH::EM_NDR1))
+    .value(PY_ENUM(ARCH::EM_STARCORE))
+    .value(PY_ENUM(ARCH::EM_ME16))
+    .value(PY_ENUM(ARCH::EM_ST100))
+    .value(PY_ENUM(ARCH::EM_TINYJ))
+    .value(PY_ENUM(ARCH::EM_X86_64))
+    .value(PY_ENUM(ARCH::EM_PDSP))
+    .value(PY_ENUM(ARCH::EM_PDP10))
+    .value(PY_ENUM(ARCH::EM_PDP11))
+    .value(PY_ENUM(ARCH::EM_FX66))
+    .value(PY_ENUM(ARCH::EM_ST9PLUS))
+    .value(PY_ENUM(ARCH::EM_ST7))
+    .value(PY_ENUM(ARCH::EM_68HC16))
+    .value(PY_ENUM(ARCH::EM_68HC11))
+    .value(PY_ENUM(ARCH::EM_68HC08))
+    .value(PY_ENUM(ARCH::EM_68HC05))
+    .value(PY_ENUM(ARCH::EM_SVX))
+    .value(PY_ENUM(ARCH::EM_ST19))
+    .value(PY_ENUM(ARCH::EM_VAX))
+    .value(PY_ENUM(ARCH::EM_CRIS))
+    .value(PY_ENUM(ARCH::EM_JAVELIN))
+    .value(PY_ENUM(ARCH::EM_FIREPATH))
+    .value(PY_ENUM(ARCH::EM_ZSP))
+    .value(PY_ENUM(ARCH::EM_MMIX))
+    .value(PY_ENUM(ARCH::EM_HUANY))
+    .value(PY_ENUM(ARCH::EM_PRISM))
+    .value(PY_ENUM(ARCH::EM_AVR))
+    .value(PY_ENUM(ARCH::EM_FR30))
+    .value(PY_ENUM(ARCH::EM_D10V))
+    .value(PY_ENUM(ARCH::EM_D30V))
+    .value(PY_ENUM(ARCH::EM_V850))
+    .value(PY_ENUM(ARCH::EM_M32R))
+    .value(PY_ENUM(ARCH::EM_MN10300))
+    .value(PY_ENUM(ARCH::EM_MN10200))
+    .value(PY_ENUM(ARCH::EM_PJ))
+    .value(PY_ENUM(ARCH::EM_OPENRISC))
+    .value(PY_ENUM(ARCH::EM_ARC_COMPACT))
+    .value(PY_ENUM(ARCH::EM_XTENSA))
+    .value(PY_ENUM(ARCH::EM_VIDEOCORE))
+    .value(PY_ENUM(ARCH::EM_TMM_GPP))
+    .value(PY_ENUM(ARCH::EM_NS32K))
+    .value(PY_ENUM(ARCH::EM_TPC))
+    .value(PY_ENUM(ARCH::EM_SNP1K))
+    .value(PY_ENUM(ARCH::EM_ST200))
+    .value(PY_ENUM(ARCH::EM_IP2K))
+    .value(PY_ENUM(ARCH::EM_MAX))
+    .value(PY_ENUM(ARCH::EM_CR))
+    .value(PY_ENUM(ARCH::EM_F2MC16))
+    .value(PY_ENUM(ARCH::EM_MSP430))
+    .value(PY_ENUM(ARCH::EM_BLACKFIN))
+    .value(PY_ENUM(ARCH::EM_SE_C33))
+    .value(PY_ENUM(ARCH::EM_SEP))
+    .value(PY_ENUM(ARCH::EM_ARCA))
+    .value(PY_ENUM(ARCH::EM_UNICORE))
+    .value(PY_ENUM(ARCH::EM_EXCESS))
+    .value(PY_ENUM(ARCH::EM_DXP))
+    .value(PY_ENUM(ARCH::EM_ALTERA_NIOS2))
+    .value(PY_ENUM(ARCH::EM_CRX))
+    .value(PY_ENUM(ARCH::EM_XGATE))
+    .value(PY_ENUM(ARCH::EM_C166))
+    .value(PY_ENUM(ARCH::EM_M16C))
+    .value(PY_ENUM(ARCH::EM_DSPIC30F))
+    .value(PY_ENUM(ARCH::EM_CE))
+    .value(PY_ENUM(ARCH::EM_M32C))
+    .value(PY_ENUM(ARCH::EM_TSK3000))
+    .value(PY_ENUM(ARCH::EM_RS08))
+    .value(PY_ENUM(ARCH::EM_SHARC))
+    .value(PY_ENUM(ARCH::EM_ECOG2))
+    .value(PY_ENUM(ARCH::EM_SCORE7))
+    .value(PY_ENUM(ARCH::EM_DSP24))
+    .value(PY_ENUM(ARCH::EM_VIDEOCORE3))
+    .value(PY_ENUM(ARCH::EM_LATTICEMICO32))
+    .value(PY_ENUM(ARCH::EM_SE_C17))
+    .value(PY_ENUM(ARCH::EM_TI_C6000))
+    .value(PY_ENUM(ARCH::EM_TI_C2000))
+    .value(PY_ENUM(ARCH::EM_TI_C5500))
+    .value(PY_ENUM(ARCH::EM_MMDSP_PLUS))
+    .value(PY_ENUM(ARCH::EM_CYPRESS_M8C))
+    .value(PY_ENUM(ARCH::EM_R32C))
+    .value(PY_ENUM(ARCH::EM_TRIMEDIA))
+    .value(PY_ENUM(ARCH::EM_HEXAGON))
+    .value(PY_ENUM(ARCH::EM_8051))
+    .value(PY_ENUM(ARCH::EM_STXP7X))
+    .value(PY_ENUM(ARCH::EM_NDS32))
+    .value(PY_ENUM(ARCH::EM_ECOG1))
+    .value(PY_ENUM(ARCH::EM_ECOG1X))
+    .value(PY_ENUM(ARCH::EM_MAXQ30))
+    .value(PY_ENUM(ARCH::EM_XIMO16))
+    .value(PY_ENUM(ARCH::EM_MANIK))
+    .value(PY_ENUM(ARCH::EM_CRAYNV2))
+    .value(PY_ENUM(ARCH::EM_RX))
+    .value(PY_ENUM(ARCH::EM_METAG))
+    .value(PY_ENUM(ARCH::EM_MCST_ELBRUS))
+    .value(PY_ENUM(ARCH::EM_ECOG16))
+    .value(PY_ENUM(ARCH::EM_CR16))
+    .value(PY_ENUM(ARCH::EM_ETPU))
+    .value(PY_ENUM(ARCH::EM_SLE9X))
+    .value(PY_ENUM(ARCH::EM_L10M))
+    .value(PY_ENUM(ARCH::EM_K10M))
+    .value(PY_ENUM(ARCH::EM_AARCH64))
+    .value(PY_ENUM(ARCH::EM_AVR32))
+    .value(PY_ENUM(ARCH::EM_STM8))
+    .value(PY_ENUM(ARCH::EM_TILE64))
+    .value(PY_ENUM(ARCH::EM_TILEPRO))
+    .value(PY_ENUM(ARCH::EM_CUDA))
+    .value(PY_ENUM(ARCH::EM_TILEGX))
+    .value(PY_ENUM(ARCH::EM_CLOUDSHIELD))
+    .value(PY_ENUM(ARCH::EM_COREA_1ST))
+    .value(PY_ENUM(ARCH::EM_COREA_2ND))
+    .value(PY_ENUM(ARCH::EM_ARC_COMPACT2))
+    .value(PY_ENUM(ARCH::EM_OPEN8))
+    .value(PY_ENUM(ARCH::EM_RL78))
+    .value(PY_ENUM(ARCH::EM_VIDEOCORE5))
+    .value(PY_ENUM(ARCH::EM_78KOR))
+    .value(PY_ENUM(ARCH::EM_56800EX))
+    .value(PY_ENUM(ARCH::EM_BA1))
+    .value(PY_ENUM(ARCH::EM_BA2))
+    .value(PY_ENUM(ARCH::EM_XCORE))
+    .value(PY_ENUM(ARCH::EM_MCHP_PIC))
+    .value(PY_ENUM(ARCH::EM_INTEL205))
+    .value(PY_ENUM(ARCH::EM_INTEL206))
+    .value(PY_ENUM(ARCH::EM_INTEL207))
+    .value(PY_ENUM(ARCH::EM_INTEL208))
+    .value(PY_ENUM(ARCH::EM_INTEL209))
+    .value(PY_ENUM(ARCH::EM_KM32))
+    .value(PY_ENUM(ARCH::EM_KMX32))
+    .value(PY_ENUM(ARCH::EM_KMX16))
+    .value(PY_ENUM(ARCH::EM_KMX8))
+    .value(PY_ENUM(ARCH::EM_KVARC))
+    .value(PY_ENUM(ARCH::EM_CDP))
+    .value(PY_ENUM(ARCH::EM_COGE))
+    .value(PY_ENUM(ARCH::EM_COOL))
+    .value(PY_ENUM(ARCH::EM_NORC))
+    .value(PY_ENUM(ARCH::EM_CSR_KALIMBA))
+    .value(PY_ENUM(ARCH::EM_AMDGPU))
+    .export_values();
+
+
+  //! Enum for the *sh_type* of ElfXX_Shdr;
+  py::enum_<SECTION_TYPES>(m, "SECTION_TYPES")
+    .value(PY_ENUM(SECTION_TYPES::SHT_NULL))
+    .value(PY_ENUM(SECTION_TYPES::SHT_PROGBITS))
+    .value(PY_ENUM(SECTION_TYPES::SHT_SYMTAB))
+    .value(PY_ENUM(SECTION_TYPES::SHT_STRTAB))
+    .value(PY_ENUM(SECTION_TYPES::SHT_RELA))
+    .value(PY_ENUM(SECTION_TYPES::SHT_HASH))
+    .value(PY_ENUM(SECTION_TYPES::SHT_DYNAMIC))
+    .value(PY_ENUM(SECTION_TYPES::SHT_NOTE))
+    .value(PY_ENUM(SECTION_TYPES::SHT_NOBITS))
+    .value(PY_ENUM(SECTION_TYPES::SHT_REL))
+    .value(PY_ENUM(SECTION_TYPES::SHT_SHLIB))
+    .value(PY_ENUM(SECTION_TYPES::SHT_DYNSYM))
+    .value(PY_ENUM(SECTION_TYPES::SHT_INIT_ARRAY))
+    .value(PY_ENUM(SECTION_TYPES::SHT_FINI_ARRAY))
+    .value(PY_ENUM(SECTION_TYPES::SHT_PREINIT_ARRAY))
+    .value(PY_ENUM(SECTION_TYPES::SHT_GROUP))
+    .value(PY_ENUM(SECTION_TYPES::SHT_SYMTAB_SHNDX))
+    .value(PY_ENUM(SECTION_TYPES::SHT_LOOS))
+    .value(PY_ENUM(SECTION_TYPES::SHT_GNU_ATTRIBUTES))
+    .value(PY_ENUM(SECTION_TYPES::SHT_GNU_HASH))
+    .value(PY_ENUM(SECTION_TYPES::SHT_GNU_verdef))
+    .value(PY_ENUM(SECTION_TYPES::SHT_GNU_verneed))
+    .value(PY_ENUM(SECTION_TYPES::SHT_GNU_versym))
+    .value(PY_ENUM(SECTION_TYPES::SHT_HIOS))
+    .value(PY_ENUM(SECTION_TYPES::SHT_LOPROC))
+    .value(PY_ENUM(SECTION_TYPES::SHT_ARM_EXIDX))
+    .value(PY_ENUM(SECTION_TYPES::SHT_ARM_PREEMPTMAP))
+    .value(PY_ENUM(SECTION_TYPES::SHT_ARM_ATTRIBUTES))
+    .value(PY_ENUM(SECTION_TYPES::SHT_ARM_DEBUGOVERLAY))
+    .value(PY_ENUM(SECTION_TYPES::SHT_ARM_OVERLAYSECTION))
+    .value(PY_ENUM(SECTION_TYPES::SHT_HEX_ORDERED))
+    .value(PY_ENUM(SECTION_TYPES::SHT_X86_64_UNWIND))
+    .value(PY_ENUM(SECTION_TYPES::SHT_MIPS_REGINFO))
+    .value(PY_ENUM(SECTION_TYPES::SHT_MIPS_OPTIONS))
+    .value(PY_ENUM(SECTION_TYPES::SHT_MIPS_ABIFLAGS))
+    .value(PY_ENUM(SECTION_TYPES::SHT_HIPROC))
+    .value(PY_ENUM(SECTION_TYPES::SHT_LOUSER))
+    .value(PY_ENUM(SECTION_TYPES::SHT_HIUSER))
+    .export_values();
+
+
+  //! Enum for the *sh_flags* field of ElfXX_Shdr;
+  py::enum_<SECTION_FLAGS>(m, "SECTION_FLAGS", py::arithmetic())
+    .value(PY_ENUM(SECTION_FLAGS::SHF_NONE))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_WRITE))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_ALLOC))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_EXECINSTR))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MERGE))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_STRINGS))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_INFO_LINK))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_LINK_ORDER))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_OS_NONCONFORMING))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_GROUP))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_TLS))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_EXCLUDE))
+    .value(PY_ENUM(SECTION_FLAGS::XCORE_SHF_CP_SECTION))
+    .value(PY_ENUM(SECTION_FLAGS::XCORE_SHF_DP_SECTION))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MASKOS))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MASKPROC))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_HEX_GPREL))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MIPS_NODUPES))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MIPS_NAMES))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MIPS_LOCAL))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MIPS_NOSTRIP))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MIPS_GPREL))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MIPS_MERGE))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MIPS_ADDR))
+    .value(PY_ENUM(SECTION_FLAGS::SHF_MIPS_STRING))
+    .export_values();
+
+
+  //! Enum for the *p_type* field of ElfXX_Phdr
+  py::enum_<SEGMENT_TYPES>(m, "SEGMENT_TYPES")
+    .value(PY_ENUM(SEGMENT_TYPES::PT_NULL))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_LOAD))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_DYNAMIC))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_INTERP))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_NOTE))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_SHLIB))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_PHDR))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_TLS))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_LOOS))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_HIOS))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_LOPROC))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_HIPROC))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_GNU_EH_FRAME))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_SUNW_EH_FRAME))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_SUNW_UNWIND))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_GNU_STACK))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_GNU_RELRO))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_ARM_ARCHEXT))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_ARM_EXIDX))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_ARM_UNWIND))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_MIPS_REGINFO))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_MIPS_RTPROC))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_MIPS_OPTIONS))
+    .value(PY_ENUM(SEGMENT_TYPES::PT_MIPS_ABIFLAGS))
+    .export_values();
+
+  //! Enum for the *p_flags* field of ElfXX_Phdr
+  py::enum_<SEGMENT_FLAGS>(m, "SEGMENT_FLAGS", py::arithmetic())
+    .value("PF_X",           SEGMENT_FLAGS::PF_X)
+    .value("PF_W",           SEGMENT_FLAGS::PF_W)
+    .value("PF_R",           SEGMENT_FLAGS::PF_R)
+    .value("PF_MASKOS",      SEGMENT_FLAGS::PF_MASKOS)
+    .value("PF_MASKPROC",    SEGMENT_FLAGS::PF_MASKPROC)
+    .export_values();
+
+
+
+  py::enum_<DYNAMIC_TAGS>(m, "DYNAMIC_TAGS")
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_NULL))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_NEEDED))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_PLTRELSZ))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_PLTGOT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_HASH))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_STRTAB))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_SYMTAB))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RELA))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RELASZ))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RELAENT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_STRSZ))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_SYMENT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_INIT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_FINI))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_SONAME))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RPATH))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_SYMBOLIC))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_REL))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RELSZ))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RELENT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_PLTREL))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_DEBUG))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_TEXTREL))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_JMPREL))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_BIND_NOW))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_INIT_ARRAY))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_FINI_ARRAY))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_INIT_ARRAYSZ))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_FINI_ARRAYSZ))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RUNPATH))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_FLAGS))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_ENCODING))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_PREINIT_ARRAY))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_PREINIT_ARRAYSZ))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_LOOS))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_HIOS))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_LOPROC))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_HIPROC))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_GNU_HASH))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RELACOUNT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_RELCOUNT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_FLAGS_1))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_VERSYM))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_VERDEF))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_VERDEFNUM))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_VERNEED))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_VERNEEDNUM))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_RLD_VERSION))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_TIME_STAMP))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_ICHECKSUM))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_IVERSION))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_FLAGS))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_BASE_ADDRESS))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_MSYM))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_CONFLICT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_LIBLIST))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_LOCAL_GOTNO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_CONFLICTNO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_LIBLISTNO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_SYMTABNO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_UNREFEXTNO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_GOTSYM))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_HIPAGENO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_RLD_MAP))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_CLASS))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_CLASS_NO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_INSTANCE))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_INSTANCE_NO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_RELOC))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_RELOC_NO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_SYM))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_SYM_NO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_CLASSSYM))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DELTA_CLASSSYM_NO))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_CXX_FLAGS))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_PIXIE_INIT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_SYMBOL_LIB))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_LOCALPAGE_GOTIDX))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_LOCAL_GOTIDX))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_HIDDEN_GOTIDX))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_PROTECTED_GOTIDX))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_OPTIONS))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_INTERFACE))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_DYNSTR_ALIGN))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_INTERFACE_SIZE))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_RLD_TEXT_RESOLVE_ADDR))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_PERF_SUFFIX))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_COMPACT_SIZE))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_GP_VALUE))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_AUX_DYNAMIC))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_PLTGOT))
+    .value(PY_ENUM(DYNAMIC_TAGS::DT_MIPS_RWPLT))
+    .export_values();
+
+
+  py::enum_<SYMBOL_TYPES>(m, "SYMBOL_TYPES")
+    .value(PY_ENUM(SYMBOL_TYPES::STT_NOTYPE))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_OBJECT))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_FUNC))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_SECTION))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_FILE))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_COMMON))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_TLS))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_GNU_IFUNC))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_LOOS))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_HIOS))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_LOPROC))
+    .value(PY_ENUM(SYMBOL_TYPES::STT_HIPROC))
+    .export_values();
+
+
+  py::enum_<SYMBOL_BINDINGS>(m, "SYMBOL_BINDINGS")
+    .value(PY_ENUM(SYMBOL_BINDINGS::STB_LOCAL))
+    .value(PY_ENUM(SYMBOL_BINDINGS::STB_GLOBAL))
+    .value(PY_ENUM(SYMBOL_BINDINGS::STB_WEAK))
+    .value(PY_ENUM(SYMBOL_BINDINGS::STB_GNU_UNIQUE))
+    .value(PY_ENUM(SYMBOL_BINDINGS::STB_LOOS))
+    .value(PY_ENUM(SYMBOL_BINDINGS::STB_HIOS))
+    .value(PY_ENUM(SYMBOL_BINDINGS::STB_LOPROC))
+    .value(PY_ENUM(SYMBOL_BINDINGS::STB_HIPROC))
+    .export_values();
+
+
+  py::enum_<RELOC_x86_64>(m, "RELOCATION_X86_64")
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_NONE))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_PC32))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOT32))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_PLT32))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_COPY))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GLOB_DAT))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_JUMP_SLOT))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_RELATIVE))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOTPCREL))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_32))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_32S))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_16))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_PC16))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_8))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_PC8))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_DTPMOD64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_DTPOFF64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_TPOFF64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_TLSGD))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_TLSLD))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_DTPOFF32))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOTTPOFF))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_TPOFF32))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_PC64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOTOFF64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOTPC32))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOT64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOTPCREL64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOTPC64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOTPLT64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_PLTOFF64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_SIZE32))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_SIZE64))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_GOTPC32_TLSDESC))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_TLSDESC_CALL))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_TLSDESC))
+    .value(PY_ENUM(RELOC_x86_64::R_X86_64_IRELATIVE))
+    .export_values();
+
+
+  py::enum_<RELOC_ARM>(m, "RELOCATION_ARM")
+    .value(PY_ENUM(RELOC_ARM::R_ARM_NONE))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PC24))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ABS32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_REL32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDR_PC_G0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ABS16))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ABS12))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_ABS5))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ABS8))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_SBREL32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_CALL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_PC8))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_BREL_ADJ))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_DESC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_SWI8))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_XPC25))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_XPC22))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_DTPMOD32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_DTPOFF32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_TPOFF32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_COPY))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GLOB_DAT))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_JUMP_SLOT))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_RELATIVE))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GOTOFF32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_BASE_PREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GOT_BREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PLT32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_CALL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_JUMP24))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_JUMP24))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_BASE_ABS))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_PCREL_7_0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_PCREL_15_8))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_PCREL_23_15))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDR_SBREL_11_0_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_SBREL_19_12_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_SBREL_27_20_CK))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TARGET1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_SBREL31))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_V4BX))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TARGET2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PREL31))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_MOVW_ABS_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_MOVT_ABS))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_MOVW_PREL_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_MOVT_PREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_MOVW_ABS_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_MOVT_ABS))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_MOVW_PREL_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_MOVT_PREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_JUMP19))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_JUMP6))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_ALU_PREL_11_0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_PC12))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ABS32_NOI))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_REL32_NOI))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_PC_G0_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_PC_G0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_PC_G1_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_PC_G1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_PC_G2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDR_PC_G1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDR_PC_G2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDRS_PC_G0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDRS_PC_G1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDRS_PC_G2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDC_PC_G0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDC_PC_G1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDC_PC_G2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_SB_G0_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_SB_G0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_SB_G1_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_SB_G1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ALU_SB_G2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDR_SB_G0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDR_SB_G1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDR_SB_G2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDRS_SB_G0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDRS_SB_G1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDRS_SB_G2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDC_SB_G0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDC_SB_G1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_LDC_SB_G2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_MOVW_BREL_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_MOVT_BREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_MOVW_BREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_MOVW_BREL_NC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_MOVT_BREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_MOVW_BREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_GOTDESC))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_CALL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_DESCSEQ))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_TLS_CALL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PLT32_ABS))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GOT_ABS))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GOT_PREL))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GOT_BREL12))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GOTOFF12))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GOTRELAX))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GNU_VTENTRY))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_GNU_VTINHERIT))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_JUMP11))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_JUMP8))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_GD32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_LDM32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_LDO32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_IE32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_LE32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_LDO12))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_LE12))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_TLS_IE12GP))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_0))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_1))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_2))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_3))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_4))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_5))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_6))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_7))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_8))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_9))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_10))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_11))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_12))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_13))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_14))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_PRIVATE_15))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_ME_TOO))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_TLS_DESCSEQ16))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_THM_TLS_DESCSEQ32))
+    .value(PY_ENUM(RELOC_ARM::R_ARM_IRELATIVE))
+    .export_values();
+
+
+  py::enum_<RELOC_i386>(m, "RELOCATION_i386")
+    .value(PY_ENUM(RELOC_i386::R_386_NONE))
+    .value(PY_ENUM(RELOC_i386::R_386_32))
+    .value(PY_ENUM(RELOC_i386::R_386_PC32))
+    .value(PY_ENUM(RELOC_i386::R_386_GOT32))
+    .value(PY_ENUM(RELOC_i386::R_386_PLT32))
+    .value(PY_ENUM(RELOC_i386::R_386_COPY))
+    .value(PY_ENUM(RELOC_i386::R_386_GLOB_DAT))
+    .value(PY_ENUM(RELOC_i386::R_386_JUMP_SLOT))
+    .value(PY_ENUM(RELOC_i386::R_386_RELATIVE))
+    .value(PY_ENUM(RELOC_i386::R_386_GOTOFF))
+    .value(PY_ENUM(RELOC_i386::R_386_GOTPC))
+    .value(PY_ENUM(RELOC_i386::R_386_32PLT))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_TPOFF))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_IE))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_GOTIE))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_LE))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_GD))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_LDM))
+    .value(PY_ENUM(RELOC_i386::R_386_16))
+    .value(PY_ENUM(RELOC_i386::R_386_PC16))
+    .value(PY_ENUM(RELOC_i386::R_386_8))
+    .value(PY_ENUM(RELOC_i386::R_386_PC8))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_GD_32))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_GD_PUSH))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_GD_CALL))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_GD_POP))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_LDM_32))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_LDM_PUSH))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_LDM_CALL))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_LDM_POP))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_LDO_32))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_IE_32))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_LE_32))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_DTPMOD32))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_DTPOFF32))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_TPOFF32))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_GOTDESC))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_DESC_CALL))
+    .value(PY_ENUM(RELOC_i386::R_386_TLS_DESC))
+    .value(PY_ENUM(RELOC_i386::R_386_IRELATIVE))
+    .value(PY_ENUM(RELOC_i386::R_386_NUM))
+    .export_values();
+}
diff --git a/api/python/MANIFEST.in.in b/api/python/MANIFEST.in.in
new file mode 100644
index 0000000..5c82446
--- /dev/null
+++ b/api/python/MANIFEST.in.in
@@ -0,0 +1 @@
+include README
diff --git a/api/python/MachO/CMakeLists.txt b/api/python/MachO/CMakeLists.txt
new file mode 100644
index 0000000..1e02634
--- /dev/null
+++ b/api/python/MachO/CMakeLists.txt
@@ -0,0 +1,18 @@
+set(LIEF_PYTHON_MACHO_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/pyMachO.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDylibCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyBinary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyLoadCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySegmentCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySection.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyParser.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySymbol.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/pyMachOStructures.cpp
+)
+
+target_include_directories(pyLIEF PUBLIC ${CMAKE_CURRENT_LIST_DIR})
+target_sources(pyLIEF PRIVATE ${LIEF_PYTHON_MACHO_SRC})
+
+
+
diff --git a/api/python/MachO/objects/pyBinary.cpp b/api/python/MachO/objects/pyBinary.cpp
new file mode 100644
index 0000000..80ffe7c
--- /dev/null
+++ b/api/python/MachO/objects/pyBinary.cpp
@@ -0,0 +1,108 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+
+#include "LIEF/Abstract/Binary.hpp"
+#include "LIEF/MachO/Binary.hpp"
+
+#include "pyMachO.hpp"
+
+template<class T>
+using no_const_getter = T (Binary::*)(void);
+
+void init_MachO_Binary_class(py::module& m) {
+
+
+  py::class_<Binary, LIEF::Binary>(m, "Binary")
+    .def_property_readonly("header",
+        static_cast<no_const_getter<Header&>>(&Binary::header),
+        "Return binary's " RST_CLASS_REF(lief.MachO.Header) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("sections",
+        static_cast<no_const_getter<it_sections>>(&Binary::sections),
+        "Return binary's " RST_CLASS_REF(lief.MachO.Section) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("segments",
+        static_cast<no_const_getter<it_segments>>(&Binary::segments),
+        "Return binary's " RST_CLASS_REF(lief.MachO.SegmentCommand) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("libraries",
+        static_cast<no_const_getter<it_libraries>>(&Binary::libraries),
+        "Return binary's " RST_CLASS_REF(lief.MachO.DylibCommand) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("symbols",
+        static_cast<no_const_getter<it_symbols>>(&Binary::symbols),
+        "Return binary's " RST_CLASS_REF(lief.MachO.Symbol) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("imported_symbols",
+        static_cast<no_const_getter<it_imported_symbols>>(&Binary::get_imported_symbols),
+        "Return binary's " RST_CLASS_REF(lief.MachO.Symbol) " which are imported",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("exported_symbols",
+        static_cast<no_const_getter<it_exported_symbols>>(&Binary::get_exported_symbols),
+        "Return binary's " RST_CLASS_REF(lief.MachO.Symbol) " which are exported",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("commands",
+        static_cast<no_const_getter<it_commands>>(&Binary::commands),
+        "Return binary's " RST_CLASS_REF(lief.MachO.Command) "",
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("imagebase",
+        &Binary::imagebase,
+        "Return binary's ``image base`` which is the base address\
+        where segments are mapped (without PIE)",
+        py::return_value_policy::reference_internal)
+
+    .def("section_from_offset",
+        static_cast<Section& (Binary::*)(uint64_t)>(&Binary::section_from_offset),
+        "Return the " RST_CLASS_REF(lief.MachO.Section) " which contains the offset",
+        py::return_value_policy::reference)
+
+    .def("segment_from_offset",
+        static_cast<SegmentCommand& (Binary::*)(uint64_t)>(&Binary::segment_from_offset),
+        "Return the " RST_CLASS_REF(lief.MachO.SegmentCommand) " which contains the offset",
+        py::return_value_policy::reference)
+
+    .def("segment_from_virtual_address",
+        static_cast<SegmentCommand& (Binary::*)(uint64_t)>(&Binary::segment_from_virtual_address),
+        "Return the " RST_CLASS_REF(lief.MachO.SegmentCommand) " which contains the (relative) virtual address",
+        py::return_value_policy::reference)
+
+
+
+    .def_property_readonly("entrypoint",
+        &Binary::entrypoint,
+        "Return binary's entrypoint",
+        py::return_value_policy::reference_internal)
+
+    .def("__str__",
+        [] (const Binary& binary)
+        {
+          std::ostringstream stream;
+          stream << binary;
+          std::string str = stream.str();
+          return str;
+        });
+
+}
+
diff --git a/api/python/MachO/objects/pyDylibCommand.cpp b/api/python/MachO/objects/pyDylibCommand.cpp
new file mode 100644
index 0000000..ec5beac
--- /dev/null
+++ b/api/python/MachO/objects/pyDylibCommand.cpp
@@ -0,0 +1,78 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/MachO/DylibCommand.hpp"
+
+#include "pyMachO.hpp"
+
+template<class T>
+using getter_t = T (DylibCommand::*)(void) const;
+
+template<class T>
+using setter_t = void (DylibCommand::*)(T);
+
+
+void init_MachO_DylibCommand_class(py::module& m) {
+
+  py::class_<DylibCommand, LoadCommand>(m, "DylibCommand")
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&DylibCommand::name),
+        static_cast<setter_t<const std::string&>>(&DylibCommand::name),
+        "Library's name",
+        py::return_value_policy::reference_internal)
+
+    .def_property("timestamp",
+        static_cast<getter_t<uint32_t>>(&DylibCommand::timestamp),
+        static_cast<setter_t<uint32_t>>(&DylibCommand::timestamp),
+        "Library's timestamp",
+        py::return_value_policy::reference_internal)
+
+    .def_property("current_version",
+        static_cast<getter_t<uint32_t>>(&DylibCommand::current_version),
+        static_cast<setter_t<uint32_t>>(&DylibCommand::current_version),
+        "Library's current version",
+        py::return_value_policy::reference_internal)
+
+    .def_property("compatibility_version",
+        static_cast<getter_t<uint32_t>>(&DylibCommand::compatibility_version),
+        static_cast<setter_t<uint32_t>>(&DylibCommand::compatibility_version),
+        "Library's compatibility version",
+        py::return_value_policy::reference_internal)
+
+
+    .def("__eq__", &DylibCommand::operator==)
+    .def("__ne__", &DylibCommand::operator!=)
+    .def("__hash__",
+        [] (const DylibCommand& dylib_command) {
+          return LIEF::Hash::hash(dylib_command);
+        })
+
+
+    .def("__str__",
+        [] (const DylibCommand& command)
+        {
+          std::ostringstream stream;
+          stream << command;
+          std::string str = stream.str();
+          return str;
+        });
+
+}
diff --git a/api/python/MachO/objects/pyHeader.cpp b/api/python/MachO/objects/pyHeader.cpp
new file mode 100644
index 0000000..b2afc73
--- /dev/null
+++ b/api/python/MachO/objects/pyHeader.cpp
@@ -0,0 +1,93 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/MachO/Header.hpp"
+
+#include "pyMachO.hpp"
+
+template<class T>
+using getter_t = T (Header::*)(void) const;
+
+template<class T>
+using setter_t = void (Header::*)(T);
+
+void init_MachO_Header_class(py::module& m) {
+
+  py::class_<Header>(m, "Header")
+    .def(py::init<>())
+
+    .def_property("magic",
+        static_cast<getter_t<uint32_t>>(&Header::magic),
+        static_cast<setter_t<uint32_t>>(&Header::magic),
+        ""
+        )
+
+    .def_property("cpu_type",
+        static_cast<getter_t<CPU_TYPES>>(&Header::cpu_type),
+        static_cast<setter_t<CPU_TYPES>>(&Header::cpu_type),
+        "Target CPU ( " RST_CLASS_REF(lief.MachO.CPU_TYPES) ")")
+
+    .def_property("cpu_subtype",
+        static_cast<getter_t<uint32_t>>(&Header::cpu_subtype),
+        static_cast<setter_t<uint32_t>>(&Header::cpu_subtype),
+        "CPU subtype")
+
+    .def_property("file_type",
+        static_cast<getter_t<FILE_TYPES>>(&Header::file_type),
+        static_cast<setter_t<FILE_TYPES>>(&Header::file_type),
+        "Binary's type ( " RST_CLASS_REF(lief.MachO.FILE_TYPES) ")")
+
+    .def_property("flags",
+        &Header::flags_list,
+        static_cast<setter_t<uint32_t>>(&Header::flags),
+        "Binary's flags ( " RST_CLASS_REF(lief.MachO.HEADER_FLAGS) ")")
+
+    .def_property("nb_cmds",
+        static_cast<getter_t<uint32_t>>(&Header::nb_cmds),
+        static_cast<setter_t<uint32_t>>(&Header::nb_cmds),
+        "Number of " RST_CLASS_REF(lief.MachO.LoadCommand) "")
+
+    .def_property("sizeof_cmds",
+        static_cast<getter_t<uint32_t>>(&Header::sizeof_cmds),
+        static_cast<setter_t<uint32_t>>(&Header::sizeof_cmds),
+        "Size of all " RST_CLASS_REF(lief.MachO.LoadCommand) "")
+
+    .def_property("reserved",
+        static_cast<getter_t<uint32_t>>(&Header::reserved),
+        static_cast<setter_t<uint32_t>>(&Header::reserved),
+        "")
+
+
+    .def("__eq__", &Header::operator==)
+    .def("__ne__", &Header::operator!=)
+    .def("__hash__",
+        [] (const Header& header) {
+          return LIEF::Hash::hash(header);
+        })
+
+
+    .def("__str__",
+        [] (const Header& header)
+        {
+          std::ostringstream stream;
+          stream << header;
+          std::string str =  stream.str();
+          return str;
+        });
+}
diff --git a/api/python/MachO/objects/pyLoadCommand.cpp b/api/python/MachO/objects/pyLoadCommand.cpp
new file mode 100644
index 0000000..6af7f77
--- /dev/null
+++ b/api/python/MachO/objects/pyLoadCommand.cpp
@@ -0,0 +1,72 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/MachO/LoadCommand.hpp"
+
+#include "pyMachO.hpp"
+
+
+template<class T>
+using getter_t = T (LoadCommand::*)(void) const;
+
+template<class T>
+using setter_t = void (LoadCommand::*)(T);
+
+void init_MachO_LoadCommand_class(py::module& m) {
+
+  py::class_<LoadCommand>(m, "LoadCommand")
+    .def(py::init<>())
+
+    .def_property("command",
+        static_cast<getter_t<LOAD_COMMAND_TYPES>>(&LoadCommand::command),
+        static_cast<setter_t<LOAD_COMMAND_TYPES>>(&LoadCommand::command),
+        "Command type ( " RST_CLASS_REF(lief.MachO.LOAD_COMMAND_TYPES) ")"
+        )
+
+    .def_property("size",
+        static_cast<getter_t<uint32_t>>(&LoadCommand::size),
+        static_cast<setter_t<uint32_t>>(&LoadCommand::size),
+        "Command size")
+
+    .def_property("data",
+        static_cast<getter_t<const std::vector<uint8_t>&>>(&LoadCommand::data),
+        static_cast<setter_t<const std::vector<uint8_t>&>>(&LoadCommand::data),
+        "Command's data")
+
+    .def_property("command_offset",
+        static_cast<getter_t<uint64_t>>(&LoadCommand::command_offset),
+        static_cast<setter_t<uint64_t>>(&LoadCommand::command_offset),
+        "Offset to the comand")
+
+    .def("__eq__", &LoadCommand::operator==)
+    .def("__ne__", &LoadCommand::operator!=)
+    .def("__hash__",
+        [] (const LoadCommand& load_command) {
+          return LIEF::Hash::hash(load_command);
+        })
+
+    .def("__str__",
+        [] (const LoadCommand& command)
+        {
+          std::ostringstream stream;
+          stream << command;
+          std::string str = stream.str();
+          return str;
+        });
+}
diff --git a/api/python/MachO/objects/pyParser.cpp b/api/python/MachO/objects/pyParser.cpp
new file mode 100644
index 0000000..ceec89c
--- /dev/null
+++ b/api/python/MachO/objects/pyParser.cpp
@@ -0,0 +1,29 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <memory>
+
+#include "LIEF/MachO/Parser.hpp"
+
+#include "pyMachO.hpp"
+
+void init_MachO_Parser_class(py::module& m) {
+
+  // Parser (Parser)
+  m.def("parse",
+    &LIEF::MachO::Parser::parse,
+    py::return_value_policy::take_ownership);
+}
diff --git a/api/python/MachO/objects/pySection.cpp b/api/python/MachO/objects/pySection.cpp
new file mode 100644
index 0000000..f7a842b
--- /dev/null
+++ b/api/python/MachO/objects/pySection.cpp
@@ -0,0 +1,78 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/MachO/Section.hpp"
+
+#include "pyMachO.hpp"
+
+
+
+template<class T>
+using getter_t = T (Section::*)(void) const;
+
+template<class T>
+using setter_t = void (Section::*)(T);
+
+void init_MachO_Section_class(py::module& m) {
+
+  py::class_<Section, LIEF::Section>(m, "Section")
+    .def(py::init<>())
+
+    .def_property("alignment",
+        static_cast<getter_t<uint32_t>>(&Section::alignment),
+        static_cast<setter_t<uint32_t>>(&Section::alignment),
+        "Section's alignment ")
+
+    .def_property("relocation_offset",
+        static_cast<getter_t<uint32_t>>(&Section::relocation_offset),
+        static_cast<setter_t<uint32_t>>(&Section::relocation_offset),
+        "")
+
+    .def_property("numberof_relocations",
+        static_cast<getter_t<uint32_t>>(&Section::numberof_relocations),
+        static_cast<setter_t<uint32_t>>(&Section::numberof_relocations),
+        "")
+
+    .def_property("type",
+        static_cast<getter_t<SECTION_TYPES>>(&Section::type),
+        static_cast<setter_t<SECTION_TYPES>>(&Section::type),
+        "")
+
+
+    .def("__eq__", &Section::operator==)
+    .def("__ne__", &Section::operator!=)
+    .def("__hash__",
+        [] (const Section& section) {
+          return LIEF::Hash::hash(section);
+        })
+
+
+    .def("__str__",
+        [] (const Section& section)
+        {
+          std::ostringstream stream;
+          stream << section;
+          std::string str =  stream.str();
+          return str;
+        });
+
+}
+
+
+
diff --git a/api/python/MachO/objects/pySegmentCommand.cpp b/api/python/MachO/objects/pySegmentCommand.cpp
new file mode 100644
index 0000000..3df7239
--- /dev/null
+++ b/api/python/MachO/objects/pySegmentCommand.cpp
@@ -0,0 +1,125 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyMachO.hpp"
+
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/MachO/SegmentCommand.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (SegmentCommand::*)(void) const;
+
+template<class T>
+using setter_t = void (SegmentCommand::*)(T);
+
+template<class T>
+using no_const_getter = T (SegmentCommand::*)(void);
+
+void init_MachO_SegmentCommand_class(py::module& m) {
+
+  py::class_<SegmentCommand, LoadCommand>(m, "SegmentCommand")
+    .def(py::init<>())
+
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&SegmentCommand::name),
+        static_cast<setter_t<const std::string&>>(&SegmentCommand::name),
+        "Segment's name"
+        )
+
+    .def_property("virtual_address",
+        static_cast<getter_t<uint64_t>>(&SegmentCommand::virtual_address),
+        static_cast<setter_t<uint64_t>>(&SegmentCommand::virtual_address),
+        "Segment's virtual address"
+        )
+
+    .def_property("virtual_size",
+        static_cast<getter_t<uint64_t>>(&SegmentCommand::virtual_size),
+        static_cast<setter_t<uint64_t>>(&SegmentCommand::virtual_size),
+        "Segment's virtual size"
+        )
+
+    .def_property("virtual_size",
+        static_cast<getter_t<uint64_t>>(&SegmentCommand::virtual_size),
+        static_cast<setter_t<uint64_t>>(&SegmentCommand::virtual_size),
+        "Segment's virtual size"
+        )
+
+    .def_property("file_size",
+        static_cast<getter_t<uint64_t>>(&SegmentCommand::file_size),
+        static_cast<setter_t<uint64_t>>(&SegmentCommand::file_size),
+        "Segment's file size"
+        )
+
+    .def_property("file_offset",
+        static_cast<getter_t<uint64_t>>(&SegmentCommand::file_offset),
+        static_cast<setter_t<uint64_t>>(&SegmentCommand::file_offset),
+        "Segment's file offset"
+        )
+
+    .def_property("max_protection",
+        static_cast<getter_t<uint32_t>>(&SegmentCommand::max_protection),
+        static_cast<setter_t<uint32_t>>(&SegmentCommand::max_protection),
+        "Segment's max protection"
+        )
+
+    .def_property("init_protection",
+        static_cast<getter_t<uint32_t>>(&SegmentCommand::init_protection),
+        static_cast<setter_t<uint32_t>>(&SegmentCommand::init_protection),
+        "Segment's initial protection"
+        )
+
+    .def_property("numberof_sections",
+        static_cast<getter_t<uint32_t>>(&SegmentCommand::numberof_sections),
+        static_cast<setter_t<uint32_t>>(&SegmentCommand::numberof_sections),
+        "Number of sections in this segment"
+        )
+
+    .def_property_readonly("sections",
+        static_cast<no_const_getter<it_sections>>(&SegmentCommand::sections),
+        "Segment's sections"
+        )
+
+    .def_property("content",
+        static_cast<getter_t<const std::vector<uint8_t>&>>(&SegmentCommand::content),
+        static_cast<setter_t<const std::vector<uint8_t>&>>(&SegmentCommand::content),
+        "Segment's content"
+        )
+
+
+    .def("__eq__", &SegmentCommand::operator==)
+    .def("__ne__", &SegmentCommand::operator!=)
+    .def("__hash__",
+        [] (const SegmentCommand& segment_command) {
+          return LIEF::Hash::hash(segment_command);
+        })
+
+
+    .def("__str__",
+        [] (const Header& header)
+        {
+          std::ostringstream stream;
+          stream << header;
+          std::string str =  stream.str();
+          return str;
+        });
+
+}
+
+
+
diff --git a/api/python/MachO/objects/pySymbol.cpp b/api/python/MachO/objects/pySymbol.cpp
new file mode 100644
index 0000000..beea42c
--- /dev/null
+++ b/api/python/MachO/objects/pySymbol.cpp
@@ -0,0 +1,72 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/MachO/Section.hpp"
+
+#include "pyMachO.hpp"
+
+
+template<class T>
+using getter_t = T (Symbol::*)(void) const;
+
+template<class T>
+using setter_t = void (Symbol::*)(T);
+
+void init_MachO_Symbol_class(py::module& m) {
+
+  py::class_<Symbol, LIEF::Symbol>(m, "Symbol")
+    .def(py::init<>())
+
+    .def_property("type",
+        static_cast<getter_t<uint8_t>>(&Symbol::type),
+        static_cast<setter_t<uint8_t>>(&Symbol::type))
+
+    .def_property("numberof_sections",
+        static_cast<getter_t<uint8_t>>(&Symbol::numberof_sections),
+        static_cast<setter_t<uint8_t>>(&Symbol::numberof_sections))
+
+    .def_property("description",
+        static_cast<getter_t<uint16_t>>(&Symbol::description),
+        static_cast<setter_t<uint16_t>>(&Symbol::description))
+
+    .def_property("value",
+        static_cast<getter_t<uint64_t>>(&Symbol::value),
+        static_cast<setter_t<uint64_t>>(&Symbol::value))
+
+    .def("__eq__", &Symbol::operator==)
+    .def("__ne__", &Symbol::operator!=)
+    .def("__hash__",
+        [] (const Symbol& symbol) {
+          return LIEF::Hash::hash(symbol);
+        })
+
+
+    .def("__str__",
+        [] (const Symbol& symbol)
+        {
+          std::ostringstream stream;
+          stream << symbol;
+          std::string str =  stream.str();
+          return str;
+        });
+
+}
+
+
+
diff --git a/api/python/MachO/pyMachO.cpp b/api/python/MachO/pyMachO.cpp
new file mode 100644
index 0000000..ec97459
--- /dev/null
+++ b/api/python/MachO/pyMachO.cpp
@@ -0,0 +1,41 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <pybind11/stl_bind.h>
+
+#include "pyMachO.hpp"
+
+//
+// MachO modules
+//
+void init_MachO_module(py::module& m) {
+  py::module LIEF_MachO_module = m.def_submodule("MachO", "Python API for MachO");
+
+  py::bind_vector<std::vector<Binary*>>(m, "macho_list");
+
+  // Objects
+  init_MachO_Parser_class(LIEF_MachO_module);
+  init_MachO_Binary_class(LIEF_MachO_module);
+  init_MachO_Header_class(LIEF_MachO_module);
+  init_MachO_LoadCommand_class(LIEF_MachO_module);
+  init_MachO_DylibCommand_class(LIEF_MachO_module);
+  init_MachO_SegmentCommand_class(LIEF_MachO_module);
+  init_MachO_Section_class(LIEF_MachO_module);
+  init_MachO_Symbol_class(LIEF_MachO_module);
+
+
+  // Enums
+  init_MachO_Structures_enum(LIEF_MachO_module);
+}
diff --git a/api/python/MachO/pyMachO.hpp b/api/python/MachO/pyMachO.hpp
new file mode 100644
index 0000000..38c470d
--- /dev/null
+++ b/api/python/MachO/pyMachO.hpp
@@ -0,0 +1,42 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef PY_LIEF_MACHO_H_
+#define PY_LIEF_MACHO_H_
+
+#include "LIEF/MachO/Parser.hpp"
+#include "LIEF/MachO/Binary.hpp"
+#include "LIEF/MachO/Builder.hpp"
+
+#include "pyLIEF.hpp"
+
+using namespace LIEF::MachO;
+
+PYBIND11_MAKE_OPAQUE(std::vector<Binary*>)
+
+void init_MachO_Parser_class(py::module&);
+void init_MachO_Binary_class(py::module&);
+void init_MachO_Header_class(py::module&);
+void init_MachO_LoadCommand_class(py::module&);
+void init_MachO_DylibCommand_class(py::module&);
+void init_MachO_SegmentCommand_class(py::module&);
+void init_MachO_Section_class(py::module&);
+void init_MachO_Symbol_class(py::module&);
+
+// Enums
+void init_MachO_Structures_enum(py::module&);
+
+
+#endif
diff --git a/api/python/MachO/pyMachOStructures.cpp b/api/python/MachO/pyMachOStructures.cpp
new file mode 100644
index 0000000..2e8f7d8
--- /dev/null
+++ b/api/python/MachO/pyMachOStructures.cpp
@@ -0,0 +1,159 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyMachO.hpp"
+#include "LIEF/MachO/Structures.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+
+#define PY_ENUM(x) LIEF::MachO::to_string(x), x
+
+void init_MachO_Structures_enum(py::module& m) {
+
+  py::enum_<LIEF::MachO::CPU_TYPES>(m, "CPU_TYPES")
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_ANY))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_X86))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_I386))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_X86_64))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_MC98000))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_ARM))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_ARM64))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_SPARC))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_POWERPC))
+    .value(PY_ENUM(LIEF::MachO::CPU_TYPES::CPU_TYPE_POWERPC64))
+    .export_values();
+
+  py::enum_<LIEF::MachO::FILE_TYPES>(m, "FILE_TYPES")
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_OBJECT))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_EXECUTE))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_FVMLIB))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_CORE))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_PRELOAD))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_DYLINKER))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_BUNDLE))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_DYLIB_STUB))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_DSYM))
+    .value(PY_ENUM(LIEF::MachO::FILE_TYPES::MH_KEXT_BUNDLE))
+    .export_values();
+
+  py::enum_<LIEF::MachO::HEADER_FLAGS>(m, "HEADER_FLAGS")
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_NOUNDEFS))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_INCRLINK))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_DYLDLINK))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_BINDATLOAD))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_PREBOUND))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_SPLIT_SEGS))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_LAZY_INIT))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_TWOLEVEL))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_FORCE_FLAT))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_NOMULTIDEFS))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_NOFIXPREBINDING))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_PREBINDABLE))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_ALLMODSBOUND))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_SUBSECTIONS_VIA_SYMBOLS))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_CANONICAL))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_WEAK_DEFINES))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_BINDS_TO_WEAK))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_ALLOW_STACK_EXECUTION))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_ROOT_SAFE))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_SETUID_SAFE))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_NO_REEXPORTED_DYLIBS))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_PIE))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_DEAD_STRIPPABLE_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_HAS_TLV_DESCRIPTORS))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_NO_HEAP_EXECUTION))
+    .value(PY_ENUM(LIEF::MachO::HEADER_FLAGS::MH_APP_EXTENSION_SAFE))
+    .export_values();
+
+
+
+  py::enum_<LIEF::MachO::LOAD_COMMAND_TYPES>(m, "LOAD_COMMAND_TYPES")
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SEGMENT))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SYMTAB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SYMSEG))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_THREAD))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_UNIXTHREAD))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_LOADFVMLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_IDFVMLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_IDENT))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_FVMFILE))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_PREPAGE))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_DYSYMTAB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_LOAD_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_ID_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_LOAD_DYLINKER))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_ID_DYLINKER))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_PREBOUND_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_ROUTINES))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SUB_FRAMEWORK))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SUB_UMBRELLA))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SUB_CLIENT))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SUB_LIBRARY))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_TWOLEVEL_HINTS))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_PREBIND_CKSUM))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_LOAD_WEAK_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SEGMENT_64))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_ROUTINES_64))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_UUID))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_RPATH))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_CODE_SIGNATURE))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SEGMENT_SPLIT_INFO))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_REEXPORT_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_LAZY_LOAD_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_ENCRYPTION_INFO))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_DYLD_INFO))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_DYLD_INFO_ONLY))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_LOAD_UPWARD_DYLIB))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_VERSION_MIN_MACOSX))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_VERSION_MIN_IPHONEOS))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_FUNCTION_STARTS))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_DYLD_ENVIRONMENT))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_MAIN))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_DATA_IN_CODE))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_SOURCE_VERSION))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_DYLIB_CODE_SIGN_DRS))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_ENCRYPTION_INFO_64))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_LINKER_OPTION))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_LINKER_OPTIMIZATION_HINT))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_VERSION_MIN_TVOS))
+    .value(PY_ENUM(LIEF::MachO::LOAD_COMMAND_TYPES::LC_VERSION_MIN_WATCHOS))
+    .export_values();
+
+
+  py::enum_<LIEF::MachO::SECTION_TYPES>(m, "SECTION_TYPES")
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_REGULAR))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_ZEROFILL))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_CSTRING_LITERALS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_4BYTE_LITERALS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_8BYTE_LITERALS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_LITERAL_POINTERS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_NON_LAZY_SYMBOL_POINTERS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_LAZY_SYMBOL_POINTERS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_SYMBOL_STUBS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_MOD_INIT_FUNC_POINTERS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_MOD_TERM_FUNC_POINTERS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_COALESCED))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_GB_ZEROFILL))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_INTERPOSING))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_16BYTE_LITERALS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_DTRACE_DOF))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_LAZY_DYLIB_SYMBOL_POINTERS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_THREAD_LOCAL_REGULAR))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_THREAD_LOCAL_ZEROFILL))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_THREAD_LOCAL_VARIABLES))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_THREAD_LOCAL_VARIABLE_POINTERS))
+    .value(PY_ENUM(LIEF::MachO::SECTION_TYPES::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS))
+    .export_values();
+}
diff --git a/api/python/PE/CMakeLists.txt b/api/python/PE/CMakeLists.txt
new file mode 100644
index 0000000..a618754
--- /dev/null
+++ b/api/python/PE/CMakeLists.txt
@@ -0,0 +1,34 @@
+set(LIEF_PYTHON_PE_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/objects/signature/pySignerInfo.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/signature/pyAuthenticatedAttributes.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/signature/pyx509.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/signature/pyContentInfo.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/signature/pySignature.cpp
+
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDataDirectory.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDosHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyBuilder.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyOptionalHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyRelocationEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyBinary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyResourcesManager.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyDebug.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySection.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyExport.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyImport.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyExportEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyRelocation.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyParser.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyImportEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pySymbol.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/objects/pyTLS.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/pyPEStructures.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/pyPE.cpp
+)
+
+target_include_directories(pyLIEF PUBLIC ${CMAKE_CURRENT_LIST_DIR})
+target_sources(pyLIEF PRIVATE ${LIEF_PYTHON_PE_SRC})
+
+
+
diff --git a/api/python/PE/objects/pyBinary.cpp b/api/python/PE/objects/pyBinary.cpp
new file mode 100644
index 0000000..d4c9e41
--- /dev/null
+++ b/api/python/PE/objects/pyBinary.cpp
@@ -0,0 +1,198 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/PE/Parser.hpp"
+#include "LIEF/PE/Builder.hpp"
+#include "LIEF/PE/Binary.hpp"
+#include "LIEF/Abstract/Binary.hpp"
+
+#include "pyPE.hpp"
+
+
+template<class T, class P>
+using no_const_func = T (Binary::*)(P);
+
+template<class T>
+using no_const_getter = T (Binary::*)(void);
+
+void init_PE_Binary_class(py::module& m) {
+  py::class_<Binary, LIEF::Binary>(m, "Binary")
+    .def(py::init<const std::string &, PE_TYPE>())
+
+    .def_property_readonly("sections",
+        static_cast<no_const_getter<it_sections>>(&Binary::get_sections),
+        "Return binary's " RST_CLASS_REF(lief.PE.Section) " sections",
+        py::return_value_policy::reference)
+
+    .def_property_readonly("dos_header",
+        static_cast<DosHeader& (Binary::*)(void)>(&Binary::dos_header),
+        "Return " RST_CLASS_REF(lief.PE.DosHeader) "",
+        py::return_value_policy::reference)
+
+    .def_property_readonly("header",
+        static_cast<Header& (Binary::*)(void)>(&Binary::header),
+        "Return " RST_CLASS_REF(lief.PE.Header) "",
+        py::return_value_policy::reference)
+
+    .def_property_readonly("optional_header",
+        static_cast<OptionalHeader& (Binary::*)(void)>(&Binary::optional_header),
+        "Return " RST_CLASS_REF(lief.PE.OptionalHeader) "",
+        py::return_value_policy::reference)
+
+    .def_property_readonly("virtual_size",
+        &Binary::get_virtual_size)
+
+    .def_property_readonly("sizeof_headers",
+        &Binary::get_sizeof_headers)
+
+    .def("rva_to_offset",
+        &Binary::rva_to_offset,
+        "Convert a relative virtual address to an offset")
+
+
+    .def("va_to_offset",
+        &Binary::va_to_offset,
+        "Convert a **absolute** virtual address to an offset")
+
+
+    .def("section_from_offset",
+        static_cast<Section& (Binary::*)(uint64_t)>(&Binary::section_from_offset),
+        "Return the " RST_CLASS_REF(lief.PE.Section) " which contains the offset",
+        py::return_value_policy::reference)
+
+
+    .def("section_from_virtual_address",
+        static_cast<Section& (Binary::*)(uint64_t)>(&Binary::section_from_virtual_address),
+        "Return the " RST_CLASS_REF(lief.PE.Section) " which contains the (relative) virtual address",
+        py::return_value_policy::reference)
+
+
+    .def_property("tls",
+      static_cast<TLS& (Binary::*)(void)>(&Binary::tls),
+      static_cast<void (Binary::*)(const TLS&)>(&Binary::tls),
+      py::return_value_policy::reference)
+
+
+    .def_property_readonly("has_debug", &Binary::has_debug,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.Debug) " object")
+
+    .def_property_readonly("has_tls", &Binary::has_tls,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.TLS) " object")
+
+    .def_property_readonly("has_imports", &Binary::has_imports,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.Import) " object")
+
+    .def_property_readonly("has_exports", &Binary::has_exports,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.Export) " object")
+
+    .def_property_readonly("has_resources", &Binary::has_resources,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.Resources) " object")
+
+    .def_property_readonly("has_exceptions", &Binary::has_exceptions,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.Execptions) " object")
+
+    .def_property_readonly("has_relocations", &Binary::has_relocations,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.Relocation) "")
+
+    .def_property_readonly("has_configurations", &Binary::has_configuration,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.Configuration) "")
+
+    .def_property_readonly("has_signature", &Binary::has_signature,
+        "Check if the current binary has a " RST_CLASS_REF(lief.PE.Signature) "")
+
+    .def("predict_function_rva", &Binary::predict_function_rva,
+        "Try to predict the RVA of the function `function` in the import library `library`",
+        py::arg("library"), py::arg("function"))
+
+
+    .def_property_readonly("signature",
+        static_cast<const Signature& (Binary::*)(void) const>(&Binary::signature),
+        py::return_value_policy::reference)
+
+
+    .def_property_readonly("debug",
+        static_cast<Debug& (Binary::*)(void)>(&Binary::get_debug),
+        py::return_value_policy::reference)
+
+    .def("get_export",
+        static_cast<Export& (Binary::*)(void)>(&Binary::get_export),
+        "Return a " RST_CLASS_REF(lief.PE.Export) " object",
+        py::return_value_policy::reference)
+
+    .def_property_readonly("symbols",
+        static_cast<std::vector<Symbol>& (Binary::*)(void)>(&Binary::symbols),
+        "Return binary's " RST_CLASS_REF(lief.PE.Symbol) "",
+        py::return_value_policy::reference)
+
+    .def("get_section",
+        static_cast<no_const_func<Section&, const std::string&>>(&Binary::get_section),
+        py::return_value_policy::reference)
+
+    .def("add_section",
+        &Binary::add_section,
+        py::return_value_policy::reference)
+
+    //.def("delete_section", (void (Binary::*)(const std::string&)) &Binary::delete_section)
+    //.def("get_import_section",
+    //    static_cast<no_const_getter<Section&>>(&Binary::get_import_section),
+    //    py::return_value_policy::reference_internal)
+
+    .def_property_readonly("relocations",
+        static_cast<no_const_getter<it_relocations>>(&Binary::relocations),
+        py::return_value_policy::reference)
+
+    .def("add_relocation", &Binary::add_relocation)
+    .def("remove_all_relocations", &Binary::remove_all_relocations)
+
+    .def_property_readonly("data_directories",
+        static_cast<no_const_getter<it_data_directories>>(&Binary::data_directories),
+        py::return_value_policy::reference)
+
+    .def("data_directory",
+        static_cast<DataDirectory& (Binary::*) (DATA_DIRECTORY)>(&Binary::data_directory),
+        py::return_value_policy::reference)
+
+    .def_property_readonly("imports",
+        static_cast<no_const_getter<it_imports>>(&Binary::imports),
+        py::return_value_policy::reference)
+
+    .def_property_readonly("resources_manager",
+        static_cast<no_const_getter<ResourcesManager>>(&Binary::get_resources_manager))
+
+    .def("add_import_function",
+        &Binary::add_import_function,
+        py::return_value_policy::reference)
+
+    .def("add_library",
+        &Binary::add_library,
+        py::return_value_policy::reference)
+
+    .def("remove_library",            &Binary::remove_library)
+    .def("remove_all_libraries",      &Binary::remove_all_libraries)
+
+    .def("write", &Binary::write)
+
+    .def_property_readonly("entrypoint", &Binary::entrypoint)
+
+    .def("__str__",
+        [] (const Binary& binary)
+        {
+          std::ostringstream stream;
+          stream << binary;
+          std::string str = stream.str();
+          return str;
+        });
+
+}
diff --git a/api/python/PE/objects/pyBuilder.cpp b/api/python/PE/objects/pyBuilder.cpp
new file mode 100644
index 0000000..993fff5
--- /dev/null
+++ b/api/python/PE/objects/pyBuilder.cpp
@@ -0,0 +1,71 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/PE/Builder.hpp"
+
+#include <string>
+#include <sstream>
+
+
+void init_PE_Builder_class(py::module& m) {
+  py::class_<Builder>(m, "Builder")
+    .def(py::init<Binary*>())
+
+    .def("build", &Builder::build)
+    .def("build_imports",
+        &Builder::build_imports,
+        py::return_value_policy::reference)
+
+    .def("patch_imports",
+        &Builder::patch_imports,
+        py::return_value_policy::reference)
+
+    .def("build_relocations",
+        &Builder::build_relocations,
+        py::return_value_policy::reference)
+
+    .def("build_tls",
+        static_cast<Builder& (Builder::*)(bool)>(&Builder::build_tls),
+        py::return_value_policy::reference)
+
+    .def("build_resources",
+        static_cast<Builder& (Builder::*)(bool)>(&Builder::build_resources),
+        py::return_value_policy::reference)
+
+    .def("build_imports",
+        &Builder::build_imports,
+        py::return_value_policy::reference)
+
+    .def("write",
+        &Builder::write)
+
+    .def("get_build",
+        &Builder::get_build,
+        py::return_value_policy::reference_internal)
+
+
+    .def("__str__",
+        [] (const Builder& builder) {
+          std::ostringstream stream;
+          stream << builder;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+
+}
diff --git a/api/python/PE/objects/pyDataDirectory.cpp b/api/python/PE/objects/pyDataDirectory.cpp
new file mode 100644
index 0000000..8c9301b
--- /dev/null
+++ b/api/python/PE/objects/pyDataDirectory.cpp
@@ -0,0 +1,69 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/DataDirectory.hpp"
+
+#include "pyPE.hpp"
+
+template<class T>
+using getter_t = T (DataDirectory::*)(void) const;
+
+template<class T>
+using setter_t = void (DataDirectory::*)(T);
+
+void init_PE_DataDirectory_class(py::module& m) {
+  py::class_<DataDirectory>(m, "DataDirectory")
+    .def(py::init<>())
+    .def_property("rva",
+        static_cast<getter_t<uint32_t>>(&DataDirectory::RVA),
+        static_cast<setter_t<uint32_t>>(&DataDirectory::RVA))
+
+    .def_property("size",
+        static_cast<getter_t<uint32_t>>(&DataDirectory::size),
+        static_cast<setter_t<uint32_t>>(&DataDirectory::size))
+
+    .def_property_readonly("section",
+        static_cast<Section& (DataDirectory::*) (void)>(&DataDirectory::section),
+        py::return_value_policy::reference)
+
+    .def_property_readonly("type",
+        &DataDirectory::type,
+        py::return_value_policy::reference_internal)
+
+    .def_property_readonly("has_section",
+        &DataDirectory::has_section,
+        "Check if the current data directory is tied to a " RST_CLASS_REF(lief.PE.Section) "")
+
+    .def("__eq__", &DataDirectory::operator==)
+    .def("__ne__", &DataDirectory::operator!=)
+    .def("__hash__",
+        [] (const DataDirectory& data_directory) {
+          return LIEF::Hash::hash(data_directory);
+        })
+
+    .def("__str__", [] (const DataDirectory& datadir)
+        {
+          std::ostringstream stream;
+          stream << datadir;
+          std::string str =  stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyDebug.cpp b/api/python/PE/objects/pyDebug.cpp
new file mode 100644
index 0000000..1c33351
--- /dev/null
+++ b/api/python/PE/objects/pyDebug.cpp
@@ -0,0 +1,82 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/Debug.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Debug::*)(void) const;
+
+template<class T>
+using setter_t = void (Debug::*)(T);
+
+void init_PE_Debug_class(py::module& m) {
+  py::class_<Debug>(m, "Debug")
+    .def(py::init<>())
+
+    .def_property("characteristics",
+        static_cast<getter_t<uint32_t>>(&Debug::characteristics),
+        static_cast<setter_t<uint32_t>>(&Debug::characteristics))
+
+    .def_property("timestamp",
+        static_cast<getter_t<uint32_t>>(&Debug::timestamp),
+        static_cast<setter_t<uint32_t>>(&Debug::timestamp))
+
+    .def_property("major_version",
+        static_cast<getter_t<uint16_t>>(&Debug::major_version),
+        static_cast<setter_t<uint16_t>>(&Debug::major_version))
+
+    .def_property("minor_version",
+        static_cast<getter_t<uint16_t>>(&Debug::minor_version),
+        static_cast<setter_t<uint16_t>>(&Debug::minor_version))
+
+    .def_property("type",
+        static_cast<getter_t<DEBUG_TYPES>>(&Debug::type),
+        static_cast<setter_t<DEBUG_TYPES>>(&Debug::type))
+
+    .def_property("sizeof_data",
+        static_cast<getter_t<uint32_t>>(&Debug::sizeof_data),
+        static_cast<setter_t<uint32_t>>(&Debug::sizeof_data))
+
+    .def_property("addressof_rawdata",
+        static_cast<getter_t<uint32_t>>(&Debug::addressof_rawdata),
+        static_cast<setter_t<uint32_t>>(&Debug::addressof_rawdata))
+
+    .def_property("pointerto_rawdata",
+        static_cast<getter_t<uint32_t>>(&Debug::pointerto_rawdata),
+        static_cast<setter_t<uint32_t>>(&Debug::pointerto_rawdata))
+
+    .def("__eq__", &Debug::operator==)
+    .def("__ne__", &Debug::operator!=)
+    .def("__hash__",
+        [] (const Debug& debug) {
+          return LIEF::Hash::hash(debug);
+        })
+
+    .def("__str__", [] (const Debug& debug)
+        {
+          std::ostringstream stream;
+          stream << debug;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyDosHeader.cpp b/api/python/PE/objects/pyDosHeader.cpp
new file mode 100644
index 0000000..f02695a
--- /dev/null
+++ b/api/python/PE/objects/pyDosHeader.cpp
@@ -0,0 +1,122 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/DosHeader.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_abs_t = T (DosHeader::*)(void) const;
+
+template<class T>
+using setter_abs_t = void (DosHeader::*)(T);
+
+using getter_t = getter_abs_t<uint16_t>;
+using setter_t = setter_abs_t<uint16_t>;
+
+void init_PE_DosHeader_class(py::module& m) {
+  py::class_<DosHeader>(m, "DosHeader")
+    .def(py::init<>())
+    .def_property("magic",
+        static_cast<getter_t>(&DosHeader::magic),
+        static_cast<setter_t>(&DosHeader::magic))
+
+    .def_property("used_bytes_in_the_last_page",
+        static_cast<getter_t>(&DosHeader::used_bytes_in_the_last_page),
+        static_cast<setter_t>(&DosHeader::used_bytes_in_the_last_page))
+
+    .def_property("file_size_in_pages",
+        static_cast<getter_t>(&DosHeader::file_size_in_pages),
+        static_cast<setter_t>(&DosHeader::file_size_in_pages))
+
+    .def_property("numberof_relocation",
+        static_cast<getter_t>(&DosHeader::numberof_relocation),
+        static_cast<setter_t>(&DosHeader::numberof_relocation))
+
+    .def_property("header_size_in_paragraphs",
+        static_cast<getter_t>(&DosHeader::header_size_in_paragraphs),
+        static_cast<setter_t>(&DosHeader::header_size_in_paragraphs))
+
+    .def_property("minimum_extra_paragraphs",
+        static_cast<getter_t>(&DosHeader::minimum_extra_paragraphs),
+        static_cast<setter_t>(&DosHeader::minimum_extra_paragraphs))
+
+    .def_property("maximum_extra_paragraphs",
+        static_cast<getter_t>(&DosHeader::maximum_extra_paragraphs),
+        static_cast<setter_t>(&DosHeader::maximum_extra_paragraphs))
+
+    .def_property("initial_relative_ss",
+        static_cast<getter_t>(&DosHeader::initial_relative_ss),
+        static_cast<setter_t>(&DosHeader::initial_relative_ss))
+
+    .def_property("initial_sp",
+        static_cast<getter_t>(&DosHeader::initial_sp),
+        static_cast<setter_t>(&DosHeader::initial_sp))
+
+    .def_property("checksum",
+        static_cast<getter_t>(&DosHeader::checksum),
+        static_cast<setter_t>(&DosHeader::checksum))
+
+    .def_property("initial_ip",
+        static_cast<getter_t>(&DosHeader::initial_ip),
+        static_cast<setter_t>(&DosHeader::initial_ip))
+
+    .def_property("initial_relative_cs",
+        static_cast<getter_t>(&DosHeader::initial_relative_cs),
+        static_cast<setter_t>(&DosHeader::initial_relative_cs))
+
+    .def_property("addressof_relocation_table",
+        static_cast<getter_t>(&DosHeader::addressof_relocation_table),
+        static_cast<setter_t>(&DosHeader::addressof_relocation_table))
+
+    .def_property("overlay_number",
+        static_cast<getter_t>(&DosHeader::overlay_number),
+        static_cast<setter_t>(&DosHeader::overlay_number))
+
+    .def_property("oem_id",
+        static_cast<getter_t>(&DosHeader::oem_id),
+        static_cast<setter_t>(&DosHeader::oem_id))
+
+    .def_property("oem_info",
+        static_cast<getter_t>(&DosHeader::oem_info),
+        static_cast<setter_t>(&DosHeader::oem_info))
+
+    .def_property("addressof_new_exeheader",
+        static_cast<getter_abs_t<uint32_t>>(&DosHeader::addressof_new_exeheader),
+        static_cast<setter_abs_t<uint32_t>>(&DosHeader::addressof_new_exeheader))
+
+
+    .def("__eq__", &DosHeader::operator==)
+    .def("__ne__", &DosHeader::operator!=)
+    .def("__hash__",
+        [] (const DosHeader& dos_header) {
+          return LIEF::Hash::hash(dos_header);
+        })
+
+    .def("__str__", [] (const DosHeader& header)
+        {
+          std::ostringstream stream;
+          stream << header;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+
+}
diff --git a/api/python/PE/objects/pyExport.cpp b/api/python/PE/objects/pyExport.cpp
new file mode 100644
index 0000000..5953671
--- /dev/null
+++ b/api/python/PE/objects/pyExport.cpp
@@ -0,0 +1,82 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/Export.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Export::*)(void) const;
+
+template<class T>
+using setter_t = void (Export::*)(T);
+
+template<class T>
+using no_const_getter = T (Export::*)(void);
+
+void init_PE_Export_class(py::module& m) {
+  py::class_<Export>(m, "Export")
+    .def(py::init<>())
+
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&Export::name),
+        static_cast<setter_t<const std::string&>>(&Export::name))
+
+    .def_property("export_flags",
+        static_cast<getter_t<uint32_t>>(&Export::export_flags),
+        static_cast<setter_t<uint32_t>>(&Export::export_flags))
+
+    .def_property("timestamp",
+        static_cast<getter_t<uint32_t>>(&Export::timestamp),
+        static_cast<setter_t<uint32_t>>(&Export::timestamp))
+
+    .def_property("major_version",
+        static_cast<getter_t<uint16_t>>(&Export::major_version),
+        static_cast<setter_t<uint16_t>>(&Export::major_version))
+
+    .def_property("minor_version",
+        static_cast<getter_t<uint16_t>>(&Export::minor_version),
+        static_cast<setter_t<uint16_t>>(&Export::minor_version))
+
+    .def_property("ordinal_base",
+        static_cast<getter_t<uint32_t>>(&Export::ordinal_base),
+        static_cast<setter_t<uint32_t>>(&Export::ordinal_base))
+
+    .def_property_readonly("entries",
+        static_cast<no_const_getter<it_export_entries>>(&Export::entries),
+        py::return_value_policy::reference_internal)
+
+
+    .def("__eq__", &Export::operator==)
+    .def("__ne__", &Export::operator!=)
+    .def("__hash__",
+        [] (const Export& export_) {
+          return LIEF::Hash::hash(export_);
+        })
+
+    .def("__str__", [] (const Export& export_)
+        {
+          std::ostringstream stream;
+          stream << export_;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyExportEntry.cpp b/api/python/PE/objects/pyExportEntry.cpp
new file mode 100644
index 0000000..03c2f25
--- /dev/null
+++ b/api/python/PE/objects/pyExportEntry.cpp
@@ -0,0 +1,66 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/ExportEntry.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (ExportEntry::*)(void) const;
+
+template<class T>
+using setter_t = void (ExportEntry::*)(T);
+
+void init_PE_ExportEntry_class(py::module& m) {
+  py::class_<ExportEntry>(m, "ExportEntry")
+    .def(py::init<>())
+
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&ExportEntry::name),
+        static_cast<setter_t<const std::string&>>(&ExportEntry::name))
+
+    .def_property("ordinal",
+        static_cast<getter_t<uint16_t>>(&ExportEntry::ordinal),
+        static_cast<setter_t<uint16_t>>(&ExportEntry::ordinal))
+
+    .def_property("address",
+        static_cast<getter_t<uint32_t>>(&ExportEntry::address),
+        static_cast<setter_t<uint32_t>>(&ExportEntry::address))
+
+    .def_property("is_extern",
+        static_cast<getter_t<bool>>(&ExportEntry::is_extern),
+        static_cast<setter_t<bool>>(&ExportEntry::is_extern))
+
+    .def("__eq__", &ExportEntry::operator==)
+    .def("__ne__", &ExportEntry::operator!=)
+    .def("__hash__",
+        [] (const ExportEntry& export_entry) {
+          return LIEF::Hash::hash(export_entry);
+        })
+
+    .def("__str__", [] (const ExportEntry& entry)
+        {
+          std::ostringstream stream;
+          stream << entry;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyHeader.cpp b/api/python/PE/objects/pyHeader.cpp
new file mode 100644
index 0000000..eada0b5
--- /dev/null
+++ b/api/python/PE/objects/pyHeader.cpp
@@ -0,0 +1,97 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/Header.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Header::*)(void) const;
+
+template<class T>
+using setter_t = void (Header::*)(T);
+
+void init_PE_Header_class(py::module& m) {
+  py::class_<Header>(m, "Header")
+    .def(py::init<>())
+
+    .def_property("signature",
+        static_cast<getter_t<const Header::signature_t&>>(&Header::signature),
+        static_cast<setter_t<const Header::signature_t&>>(&Header::signature))
+
+    .def_property("machine",
+        static_cast<getter_t<MACHINE_TYPES>>(&Header::machine),
+        static_cast<setter_t<MACHINE_TYPES>>(&Header::machine))
+
+    .def_property("numberof_sections",
+        static_cast<getter_t<uint16_t>>(&Header::numberof_sections),
+        static_cast<setter_t<uint16_t>>(&Header::numberof_sections),
+        "Number of sections in the binary")
+
+    .def_property("time_date_stamps",
+        static_cast<getter_t<uint32_t>>(&Header::time_date_stamp),
+        static_cast<setter_t<uint32_t>>(&Header::time_date_stamp))
+
+    .def_property("pointerto_symbol_table",
+        static_cast<getter_t<uint32_t>>(&Header::pointerto_symbol_table),
+        static_cast<setter_t<uint32_t>>(&Header::pointerto_symbol_table))
+
+    .def_property("numberof_symbols",
+        static_cast<getter_t<uint32_t>>(&Header::numberof_symbols),
+        static_cast<setter_t<uint32_t>>(&Header::numberof_symbols))
+
+    .def_property("sizeof_optional_header",
+        static_cast<getter_t<uint16_t>>(&Header::sizeof_optional_header),
+        static_cast<setter_t<uint16_t>>(&Header::sizeof_optional_header))
+
+    .def_property("characteristics",
+        static_cast<getter_t<uint16_t>>(&Header::characteristics),
+        static_cast<getter_t<uint16_t>>(&Header::characteristics))
+
+    .def("has_characteristic",
+        &Header::has_characteristic)
+
+    .def("add_characteristic",
+        &Header::add_characteristic)
+
+    .def("remove_characteristic",
+        &Header::remove_characteristic)
+
+    .def_property_readonly("characteristics_list",
+        &Header::characteristics_list)
+
+
+    .def("__eq__", &Header::operator==)
+    .def("__ne__", &Header::operator!=)
+    .def("__hash__",
+        [] (const Header& header) {
+          return LIEF::Hash::hash(header);
+        })
+
+
+    .def("__str__", [] (const Header& header)
+        {
+          std::ostringstream stream;
+          stream << header;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyImport.cpp b/api/python/PE/objects/pyImport.cpp
new file mode 100644
index 0000000..5e4f2f0
--- /dev/null
+++ b/api/python/PE/objects/pyImport.cpp
@@ -0,0 +1,99 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/Import.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Import::*)(void) const;
+
+template<class T>
+using setter_t = void (Import::*)(T);
+
+template<class T>
+using no_const_getter = T (Import::*)(void);
+
+template<class T, class P>
+using no_const_func = T (Import::*)(P);
+
+void init_PE_Import_class(py::module& m) {
+  py::class_<Import>(m, "Import")
+    .def(py::init<>())
+    .def(py::init<const std::string&>())
+
+    .def_property_readonly("entries",
+        static_cast<no_const_getter<it_import_entries>>(&Import::entries),
+        py::return_value_policy::reference)
+
+    .def_property_readonly("name",
+        static_cast<no_const_getter<std::string&>>(&Import::name),
+        py::return_value_policy::reference)
+
+    .def_property_readonly("directory",
+        static_cast<no_const_getter<DataDirectory&>>(&Import::directory),
+        py::return_value_policy::reference)
+
+    .def_property_readonly("iat_directory",
+        static_cast<no_const_getter<DataDirectory&>>(&Import::iat_directory),
+        py::return_value_policy::reference)
+
+    .def_property("import_address_table_rva",
+        static_cast<getter_t<uint32_t>>(&Import::import_address_table_rva),
+        static_cast<setter_t<uint32_t>>(&Import::import_address_table_rva))
+
+    .def_property("import_lookup_table_rva",
+        static_cast<getter_t<uint32_t>>(&Import::import_lookup_table_rva),
+        static_cast<setter_t<uint32_t>>(&Import::import_lookup_table_rva))
+
+    .def("get_function_rva_from_iat",
+        &Import::get_function_rva_from_iat)
+
+    .def("add_entry",
+        static_cast<ImportEntry& (Import::*)(const ImportEntry&)>(&Import::add_entry),
+        py::return_value_policy::reference)
+
+    .def("add_entry",
+        static_cast<ImportEntry& (Import::*)(const std::string&)>(&Import::add_entry),
+        py::return_value_policy::reference)
+
+    .def("get_entry",
+      static_cast<no_const_func<ImportEntry&, const std::string&>>(&Import::get_entry),
+      "Check return " RST_CLASS_REF(lief.PE.ImportEntry) " with the given name",
+      py::return_value_policy::reference)
+
+
+    .def("__eq__", &Import::operator==)
+    .def("__ne__", &Import::operator!=)
+    .def("__hash__",
+        [] (const Import& import) {
+          return LIEF::Hash::hash(import);
+        })
+
+
+    .def("__str__", [] (const Import& import)
+        {
+          std::ostringstream stream;
+          stream << import;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyImportEntry.cpp b/api/python/PE/objects/pyImportEntry.cpp
new file mode 100644
index 0000000..7d7ea74
--- /dev/null
+++ b/api/python/PE/objects/pyImportEntry.cpp
@@ -0,0 +1,82 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/ImportEntry.hpp"
+
+#include "pyPE.hpp"
+
+template<class T>
+using getter_t = T (ImportEntry::*)(void) const;
+
+template<class T>
+using setter_t = void (ImportEntry::*)(T);
+
+void init_PE_ImportEntry_class(py::module& m) {
+  py::class_<ImportEntry>(m, "ImportEntry")
+    .def(py::init<>())
+    .def_property("name",
+        static_cast<getter_t<const std::string&>>(&ImportEntry::name),
+        static_cast<setter_t<const std::string&>>(&ImportEntry::name),
+        "Import name if not ordinal")
+
+    .def_property("data",
+        static_cast<getter_t<uint64_t>>(&ImportEntry::data),
+        static_cast<setter_t<uint64_t>>(&ImportEntry::data),
+        "Raw value")
+
+    .def_property_readonly("is_ordinal",
+        &ImportEntry::is_ordinal,
+        "``True`` if ordinal is used")
+
+    .def_property_readonly("ordinal",
+        &ImportEntry::ordinal,
+        "``True`` if ordinal is used")
+
+    .def_property_readonly("hint",
+        &ImportEntry::hint,
+        "Index into the :attr:`~lief.PE.Export.entries`")
+
+    .def_property_readonly("iat_value",
+        &ImportEntry::iat_value,
+        "Value of the current entry in the Import Address Table")
+
+    .def_property_readonly("iat_address",
+        &ImportEntry::iat_address,
+        "**Original** address of the entry in the Import Address Table")
+
+
+
+    .def("__eq__", &ImportEntry::operator==)
+    .def("__ne__", &ImportEntry::operator!=)
+    .def("__hash__",
+        [] (const ImportEntry& import_entry) {
+          return LIEF::Hash::hash(import_entry);
+        })
+
+    .def("__str__", [] (const ImportEntry& importEntry)
+        {
+          std::ostringstream stream;
+          stream << importEntry;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyOptionalHeader.cpp b/api/python/PE/objects/pyOptionalHeader.cpp
new file mode 100644
index 0000000..414a8c9
--- /dev/null
+++ b/api/python/PE/objects/pyOptionalHeader.cpp
@@ -0,0 +1,176 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/OptionalHeader.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (OptionalHeader::*)(void) const;
+
+template<class T>
+using setter_t = void (OptionalHeader::*)(T);
+
+void init_PE_OptionalHeader_class(py::module& m) {
+  py::class_<OptionalHeader>(m, "OptionalHeader")
+    .def(py::init<>())
+    .def_property("magic",
+        static_cast<getter_t<PE_TYPE>>(&OptionalHeader::magic),
+        static_cast<setter_t<PE_TYPE>>(&OptionalHeader::magic))
+
+    .def_property("major_linker_version",
+        static_cast<getter_t<uint8_t>>(&OptionalHeader::major_linker_version),
+        static_cast<setter_t<uint8_t>>(&OptionalHeader::major_linker_version))
+
+    .def_property("minor_linker_version",
+        static_cast<getter_t<uint8_t>>(&OptionalHeader::minor_linker_version),
+        static_cast<setter_t<uint8_t>>(&OptionalHeader::minor_linker_version))
+
+    .def_property("sizeof_code",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::sizeof_code),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::sizeof_code))
+
+    .def_property("sizeof_initialized_data",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::sizeof_initialized_data),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::sizeof_initialized_data))
+
+    .def_property("sizeof_uninitialized_data",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::sizeof_uninitialized_data),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::sizeof_uninitialized_data))
+
+    .def_property("addressof_entrypoint",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::addressof_entrypoint),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::addressof_entrypoint))
+
+    .def_property("baseof_code",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::baseof_code),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::baseof_code))
+
+    .def_property("baseof_data",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::baseof_data),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::baseof_data))
+
+    .def_property("imagebase",
+        static_cast<getter_t<uint64_t>>(&OptionalHeader::imagebase),
+        static_cast<setter_t<uint64_t>>(&OptionalHeader::imagebase))
+
+    .def_property("section_alignment",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::section_alignment),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::section_alignment))
+
+    .def_property("file_alignment",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::file_alignment),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::file_alignment))
+
+    .def_property("major_operating_system_version",
+        static_cast<getter_t<uint16_t>>(&OptionalHeader::major_operating_system_version),
+        static_cast<setter_t<uint16_t>>(&OptionalHeader::major_operating_system_version))
+
+    .def_property("minor_operating_system_version",
+        static_cast<getter_t<uint16_t>>(&OptionalHeader::minor_operating_system_version),
+        static_cast<setter_t<uint16_t>>(&OptionalHeader::minor_operating_system_version))
+
+    .def_property("major_image_version",
+        static_cast<getter_t<uint16_t>>(&OptionalHeader::major_image_version),
+        static_cast<setter_t<uint16_t>>(&OptionalHeader::major_image_version))
+
+    .def_property("minor_image_version",
+        static_cast<getter_t<uint16_t>>(&OptionalHeader::minor_image_version),
+        static_cast<setter_t<uint16_t>>(&OptionalHeader::minor_image_version))
+
+    .def_property("major_subsystem_version",
+        static_cast<getter_t<uint16_t>>(&OptionalHeader::major_subsystem_version),
+        static_cast<setter_t<uint16_t>>(&OptionalHeader::major_subsystem_version))
+
+    .def_property("minor_subsystem_version",
+        static_cast<getter_t<uint16_t>>(&OptionalHeader::minor_subsystem_version),
+        static_cast<setter_t<uint16_t>>(&OptionalHeader::minor_subsystem_version))
+
+    .def_property("win32_version_value",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::win32_version_value),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::win32_version_value))
+
+    .def_property("sizeof_image",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::sizeof_image),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::sizeof_image))
+
+    .def_property("sizeof_headers",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::sizeof_headers),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::sizeof_headers))
+
+    .def_property("checksum",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::checksum),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::checksum))
+
+    .def_property("subsystem",
+        static_cast<getter_t<SUBSYSTEM>>(&OptionalHeader::subsystem),
+        static_cast<setter_t<SUBSYSTEM>>(&OptionalHeader::subsystem))
+
+    .def_property("dll_characteristics",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::dll_characteristics),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::dll_characteristics))
+
+    .def_property_readonly("dll_characteristics_lists",
+        &OptionalHeader::dll_characteristics_list)
+
+    .def("has_dll_characteristics",
+        &OptionalHeader::has_dll_characteristics)
+
+    .def_property("sizeof_stack_reserve",
+        static_cast<getter_t<uint64_t>>(&OptionalHeader::sizeof_stack_reserve),
+        static_cast<setter_t<uint64_t>>(&OptionalHeader::sizeof_stack_reserve))
+
+    .def_property("sizeof_stack_commit",
+        static_cast<getter_t<uint64_t>>(&OptionalHeader::sizeof_stack_commit),
+        static_cast<setter_t<uint64_t>>(&OptionalHeader::sizeof_stack_commit))
+
+    .def_property("sizeof_heap_reserve",
+        static_cast<getter_t<uint64_t>>(&OptionalHeader::sizeof_heap_reserve),
+        static_cast<setter_t<uint64_t>>(&OptionalHeader::sizeof_heap_reserve))
+
+    .def_property("sizeof_heap_commit",
+        static_cast<getter_t<uint64_t>>(&OptionalHeader::sizeof_heap_commit),
+        static_cast<setter_t<uint64_t>>(&OptionalHeader::sizeof_heap_commit))
+
+    .def_property("loader_flags",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::loader_flags),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::loader_flags))
+
+    .def_property("numberof_rva_and_size",
+        static_cast<getter_t<uint32_t>>(&OptionalHeader::numberof_rva_and_size),
+        static_cast<setter_t<uint32_t>>(&OptionalHeader::numberof_rva_and_size))
+
+
+    .def("__eq__", &OptionalHeader::operator==)
+    .def("__ne__", &OptionalHeader::operator!=)
+    .def("__hash__",
+        [] (const OptionalHeader& optional_header) {
+          return LIEF::Hash::hash(optional_header);
+        })
+
+    .def("__str__", [] (const OptionalHeader& header)
+        {
+          std::ostringstream stream;
+          stream << header;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyParser.cpp b/api/python/PE/objects/pyParser.cpp
new file mode 100644
index 0000000..7b2bc37
--- /dev/null
+++ b/api/python/PE/objects/pyParser.cpp
@@ -0,0 +1,37 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/PE/Parser.hpp"
+
+#include <string>
+
+void init_PE_Parser_class(py::module& m) {
+
+  // Parser (Parser)
+    m.def("parse",
+    static_cast<Binary* (*) (const std::string&)>(&Parser::parse),
+    "Parse the given binary and return a " RST_CLASS_REF(lief.PE.Binary) " object",
+    py::arg("filename"),
+    py::return_value_policy::take_ownership);
+
+
+  m.def("parse_from_raw",
+    static_cast<Binary* (*) (const std::vector<uint8_t>&, const std::string&)>(&Parser::parse),
+    "Parse the given raw data and return a " RST_CLASS_REF(lief.PE.Binary) " object",
+    py::arg("raw"), py::arg("name") = "",
+    py::return_value_policy::take_ownership);
+}
diff --git a/api/python/PE/objects/pyRelocation.cpp b/api/python/PE/objects/pyRelocation.cpp
new file mode 100644
index 0000000..f97263f
--- /dev/null
+++ b/api/python/PE/objects/pyRelocation.cpp
@@ -0,0 +1,62 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/Relocation.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Relocation::*)(void) const;
+
+template<class T>
+using setter_t = void (Relocation::*)(T);
+
+void init_PE_Relocation_class(py::module& m) {
+  py::class_<Relocation>(m, "Relocation")
+    .def(py::init<>())
+
+    .def_property("virtual_address",
+        static_cast<getter_t<uint32_t>>(&Relocation::virtual_address),
+        static_cast<setter_t<uint32_t>>(&Relocation::virtual_address))
+
+    .def_property_readonly("entries",
+        &Relocation::entries,
+        py::return_value_policy::reference)
+
+    .def("add_entry",
+        &Relocation::add_entry)
+
+
+    .def("__eq__", &Relocation::operator==)
+    .def("__ne__", &Relocation::operator!=)
+    .def("__hash__",
+        [] (const Relocation& relocation) {
+          return LIEF::Hash::hash(relocation);
+        })
+
+    .def("__str__", [] (const Relocation& relocation)
+        {
+          std::ostringstream stream;
+          stream << relocation;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyRelocationEntry.cpp b/api/python/PE/objects/pyRelocationEntry.cpp
new file mode 100644
index 0000000..fc9df51
--- /dev/null
+++ b/api/python/PE/objects/pyRelocationEntry.cpp
@@ -0,0 +1,63 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/RelocationEntry.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (RelocationEntry::*)(void) const;
+
+template<class T>
+using setter_t = void (RelocationEntry::*)(T);
+
+void init_PE_RelocationEntry_class(py::module& m) {
+  py::class_<RelocationEntry>(m, "RelocationEntry")
+    .def(py::init<>())
+
+    .def_property("data",
+        static_cast<getter_t<uint16_t>>(&RelocationEntry::data),
+        static_cast<setter_t<uint16_t>>(&RelocationEntry::data))
+
+    .def_property("position",
+        static_cast<getter_t<uint16_t>>(&RelocationEntry::position),
+        static_cast<setter_t<uint16_t>>(&RelocationEntry::position))
+
+    .def_property("type",
+        static_cast<getter_t<RELOCATIONS_BASE_TYPES>>(&RelocationEntry::type),
+        static_cast<setter_t<RELOCATIONS_BASE_TYPES>>(&RelocationEntry::type))
+
+
+    .def("__eq__", &RelocationEntry::operator==)
+    .def("__ne__", &RelocationEntry::operator!=)
+    .def("__hash__",
+        [] (const RelocationEntry& relocation_entry) {
+          return LIEF::Hash::hash(relocation_entry);
+        })
+
+    .def("__str__", [] (const RelocationEntry& relocation)
+        {
+          std::ostringstream stream;
+          stream << relocation;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyResourcesManager.cpp b/api/python/PE/objects/pyResourcesManager.cpp
new file mode 100644
index 0000000..eea4390
--- /dev/null
+++ b/api/python/PE/objects/pyResourcesManager.cpp
@@ -0,0 +1,36 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/ResourcesManager.hpp"
+
+#include <string>
+#include <sstream>
+
+
+void init_PE_ResourcesManager_class(py::module& m) {
+  py::class_<ResourcesManager>(m, "ResourcesManager")
+
+    .def("__str__", [] (const ResourcesManager& manager)
+        {
+          std::ostringstream stream;
+          stream << manager;
+          std::string str = stream.str();
+          return str;
+        });
+}
+
diff --git a/api/python/PE/objects/pySection.cpp b/api/python/PE/objects/pySection.cpp
new file mode 100644
index 0000000..c4a17b4
--- /dev/null
+++ b/api/python/PE/objects/pySection.cpp
@@ -0,0 +1,87 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/Abstract/Section.hpp"
+#include "LIEF/PE/Section.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Section::*)(void) const;
+
+template<class T>
+using setter_t = void (Section::*)(T);
+
+void init_PE_Section_class(py::module& m) {
+  py::class_<Section, LIEF::Section>(m, "Section")
+    .def(py::init<>())
+    .def(py::init<const std::vector<uint8_t>&, const std::string&, uint32_t>())
+    .def(py::init<const std::string&>())
+    .def_property("virtual_size",
+        static_cast<getter_t<uint32_t>>(&Section::virtual_size),
+        static_cast<setter_t<uint32_t>>(&Section::virtual_size))
+
+    .def_property("pointerto_relocation",
+        static_cast<getter_t<uint32_t>>(&Section::pointerto_relocation),
+        static_cast<setter_t<uint32_t>>(&Section::pointerto_relocation))
+
+    .def_property("pointerto_line_numbers",
+        static_cast<getter_t<uint32_t>>(&Section::pointerto_line_numbers),
+        static_cast<setter_t<uint32_t>>(&Section::pointerto_line_numbers))
+
+    .def_property("numberof_relocations",
+        static_cast<getter_t<uint16_t>>(&Section::numberof_relocations),
+        static_cast<setter_t<uint16_t>>(&Section::numberof_relocations))
+
+    .def_property("numberof_line_numbers",
+        static_cast<getter_t<uint16_t>>(&Section::numberof_line_numbers),
+        static_cast<setter_t<uint16_t>>(&Section::numberof_line_numbers))
+
+    .def_property("characteristics",
+        static_cast<getter_t<uint32_t>>(&Section::characteristics),
+        static_cast<setter_t<uint32_t>>(&Section::characteristics))
+
+    .def_property_readonly("characteristics_lists",
+        &Section::characteristics_list)
+
+    .def("has_characteristic",
+        &Section::has_characteristic)
+
+    .def_property("data",
+        static_cast<getter_t<std::vector<uint8_t>>>(&Section::content),
+        static_cast<setter_t<const std::vector<uint8_t>&>>(&Section::content))
+
+
+    .def("__eq__", &Section::operator==)
+    .def("__ne__", &Section::operator!=)
+    .def("__hash__",
+        [] (const Section& section) {
+          return LIEF::Hash::hash(section);
+        })
+
+    .def("__str__",
+        [] (const Section& section) {
+          std::ostringstream stream;
+          stream << section;
+          std::string str =  stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pySymbol.cpp b/api/python/PE/objects/pySymbol.cpp
new file mode 100644
index 0000000..074d83c
--- /dev/null
+++ b/api/python/PE/objects/pySymbol.cpp
@@ -0,0 +1,84 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/Symbol.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (Symbol::*)(void) const;
+
+template<class T>
+using setter_t = void (Symbol::*)(T);
+
+template<class T>
+using no_const_getter = T (Symbol::*)(void);
+
+void init_PE_Symbol_class(py::module& m) {
+  py::class_<Symbol, LIEF::Symbol>(m, "Symbol")
+    .def(py::init<>())
+
+    .def_property("name",
+        static_cast<getter_t<std::wstring>>      (&Symbol::wname),
+        static_cast<setter_t<const std::string&>>(&Symbol::name))
+
+    .def_property_readonly("value",
+        &Symbol::value)
+
+    .def_property_readonly("section_number",
+        &Symbol::section_number)
+
+    .def_property_readonly("type",
+        &Symbol::type)
+
+    .def_property_readonly("base_type",
+        &Symbol::base_type)
+
+    .def_property_readonly("complex_type",
+        &Symbol::complex_type)
+
+    .def_property_readonly("storage_class",
+        &Symbol::storage_class)
+
+    .def_property_readonly("numberof_aux_symbols",
+        &Symbol::numberof_aux_symbols)
+
+    .def_property_readonly("section",
+        static_cast<no_const_getter<Section&>>(&Symbol::section),
+        py::return_value_policy::reference_internal)
+
+
+    .def("__eq__", &Symbol::operator==)
+    .def("__ne__", &Symbol::operator!=)
+    .def("__hash__",
+        [] (const Symbol& symbol) {
+          return LIEF::Hash::hash(symbol);
+        })
+
+
+    .def("__str__", [] (const Symbol& symbol)
+        {
+          std::ostringstream stream;
+          stream << symbol;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/pyTLS.cpp b/api/python/PE/objects/pyTLS.cpp
new file mode 100644
index 0000000..d9cf422
--- /dev/null
+++ b/api/python/PE/objects/pyTLS.cpp
@@ -0,0 +1,90 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/TLS.hpp"
+
+#include <string>
+#include <sstream>
+
+template<class T>
+using getter_t = T (TLS::*)(void) const;
+
+template<class T>
+using setter_t = void (TLS::*)(T);
+
+template<class T>
+using no_const_getter = T (TLS::*)(void);
+
+void init_PE_TLS_class(py::module& m) {
+  py::class_<TLS>(m, "TLS")
+    .def(py::init<>())
+
+    .def_property("callbacks",
+        static_cast<getter_t<const std::vector<uint64_t>&>>(&TLS::callbacks),
+        static_cast<setter_t<const std::vector<uint64_t>&>>(&TLS::callbacks))
+
+    .def_property("addressof_index",
+        static_cast<getter_t<uint64_t>>(&TLS::addressof_index),
+        static_cast<setter_t<uint64_t>>(&TLS::addressof_index))
+
+    .def_property("addressof_callbacks",
+        static_cast<getter_t<uint64_t>>(&TLS::addressof_callbacks),
+        static_cast<setter_t<uint64_t>>(&TLS::addressof_callbacks))
+
+    .def_property("sizeof_zero_fill",
+        static_cast<getter_t<uint32_t>>(&TLS::sizeof_zero_fill),
+        static_cast<setter_t<uint32_t>>(&TLS::sizeof_zero_fill))
+
+    .def_property("characteristics",
+        static_cast<getter_t<uint32_t>>(&TLS::characteristics),
+        static_cast<setter_t<uint32_t>>(&TLS::characteristics))
+
+    .def_property("addressof_raw_data",
+        static_cast<getter_t<std::pair<uint64_t, uint64_t>>>(&TLS::addressof_raw_data),
+        static_cast<setter_t<std::pair<uint64_t, uint64_t>>>(&TLS::addressof_raw_data))
+
+    .def_property("data_template",
+        static_cast<getter_t<const std::vector<uint8_t>&>>(&TLS::data_template),
+        static_cast<setter_t<const std::vector<uint8_t>&>>(&TLS::data_template))
+
+    .def_property_readonly("directory",
+        static_cast<no_const_getter<DataDirectory&>>(&TLS::directory),
+        py::return_value_policy::reference)
+
+    .def_property_readonly("section",
+        static_cast<no_const_getter<Section&>>(&TLS::section),
+        py::return_value_policy::reference)
+
+
+    .def("__eq__", &TLS::operator==)
+    .def("__ne__", &TLS::operator!=)
+    .def("__hash__",
+        [] (const TLS& tls) {
+          return LIEF::Hash::hash(tls);
+        })
+
+    .def("__str__", [] (const TLS& tls)
+        {
+          std::ostringstream stream;
+          stream << tls;
+          std::string str = stream.str();
+          return str;
+        });
+
+
+}
diff --git a/api/python/PE/objects/signature/pyAuthenticatedAttributes.cpp b/api/python/PE/objects/signature/pyAuthenticatedAttributes.cpp
new file mode 100644
index 0000000..a7b729f
--- /dev/null
+++ b/api/python/PE/objects/signature/pyAuthenticatedAttributes.cpp
@@ -0,0 +1,63 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/signature/AuthenticatedAttributes.hpp"
+
+#include "pyPE.hpp"
+
+
+template<class T>
+using getter_t = T (AuthenticatedAttributes::*)(void) const;
+
+template<class T>
+using setter_t = void (AuthenticatedAttributes::*)(T);
+
+
+void init_PE_AuthenticatedAttributes_class(py::module& m) {
+
+  py::class_<AuthenticatedAttributes>(m, "AuthenticatedAttributes")
+
+    .def_property_readonly("content_type",
+        &AuthenticatedAttributes::content_type,
+        "Should return the ``messageDigest`` OID")
+
+    .def_property_readonly("message_digest",
+        &AuthenticatedAttributes::message_digest,
+        "Return an hash of the signed attributes")
+
+    .def_property_readonly("program_name",
+        &AuthenticatedAttributes::program_name,
+        "Return the program description (if any)")
+
+    .def_property_readonly("more_info",
+        &AuthenticatedAttributes::more_info,
+        "Return an URL to website with more information about the signer")
+
+    .def("__str__",
+        [] (const AuthenticatedAttributes& authenticated_attributes)
+        {
+          std::ostringstream stream;
+          stream << authenticated_attributes;
+          std::string str =  stream.str();
+          return str;
+        });
+
+}
+
diff --git a/api/python/PE/objects/signature/pyContentInfo.cpp b/api/python/PE/objects/signature/pyContentInfo.cpp
new file mode 100644
index 0000000..851017b
--- /dev/null
+++ b/api/python/PE/objects/signature/pyContentInfo.cpp
@@ -0,0 +1,63 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/signature/ContentInfo.hpp"
+
+#include "pyPE.hpp"
+
+
+template<class T>
+using getter_t = T (ContentInfo::*)(void) const;
+
+template<class T>
+using setter_t = void (ContentInfo::*)(T);
+
+
+void init_PE_ContentInfo_class(py::module& m) {
+
+  py::class_<ContentInfo>(m, "ContentInfo")
+
+    .def_property_readonly("content_type",
+        &ContentInfo::content_type,
+        "OID of the content type. This value should match ``SPC_INDIRECT_DATA_OBJID``")
+
+    .def_property_readonly("type",
+        &ContentInfo::type)
+
+    .def_property_readonly("digest_algorithm",
+        &ContentInfo::digest_algorithm,
+        "Algorithm (OID) used to hash the file. This value should match SignerInfo.digest_algorithm and Signature.digest_algorithm")
+
+
+    .def_property_readonly("digest",
+        &ContentInfo::digest,
+        "The digest")
+
+
+    .def("__str__",
+        [] (const ContentInfo& content_info)
+        {
+          std::ostringstream stream;
+          stream << content_info;
+          std::string str =  stream.str();
+          return str;
+        });
+
+}
+
diff --git a/api/python/PE/objects/signature/pySignature.cpp b/api/python/PE/objects/signature/pySignature.cpp
new file mode 100644
index 0000000..9c7e8fd
--- /dev/null
+++ b/api/python/PE/objects/signature/pySignature.cpp
@@ -0,0 +1,78 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/signature/Signature.hpp"
+
+#include "pyPE.hpp"
+
+
+template<class T>
+using getter_t = T (Signature::*)(void) const;
+
+template<class T>
+using setter_t = void (Signature::*)(T);
+
+
+void init_PE_Signature_class(py::module& m) {
+
+  py::class_<Signature>(m, "Signature")
+
+    .def_property_readonly("version",
+        &Signature::version,
+        "Should be 1")
+
+    .def_property_readonly("digest_algorithm",
+        &Signature::digest_algorithm,
+        "Return the algorithm (OID) used to sign the content of " RST_CLASS_REF(lief.PE.ContentInfo) "")
+
+
+    .def_property_readonly("content_info",
+        &Signature::content_info,
+        "Return the " RST_CLASS_REF(lief.PE.ContentInfo) "",
+        py::return_value_policy::reference)
+
+
+    .def_property_readonly("certificates",
+        &Signature::certificates,
+        "Return an iterator over " RST_CLASS_REF(lief.PE.x509) " certificates",
+        py::return_value_policy::reference)
+
+
+    .def_property_readonly("signer_info",
+        &Signature::signer_info,
+        "Return the " RST_CLASS_REF(lief.PE.SignerInfo) "",
+        py::return_value_policy::reference)
+
+
+    .def_property_readonly("original_signature",
+        &Signature::original_signature,
+        "Return the raw original signature")
+
+
+    .def("__str__",
+        [] (const Signature& signature)
+        {
+          std::ostringstream stream;
+          stream << signature;
+          std::string str =  stream.str();
+          return str;
+        });
+
+}
+
diff --git a/api/python/PE/objects/signature/pySignerInfo.cpp b/api/python/PE/objects/signature/pySignerInfo.cpp
new file mode 100644
index 0000000..fe97c37
--- /dev/null
+++ b/api/python/PE/objects/signature/pySignerInfo.cpp
@@ -0,0 +1,72 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/signature/SignerInfo.hpp"
+
+#include "pyPE.hpp"
+
+
+template<class T>
+using getter_t = T (SignerInfo::*)(void) const;
+
+template<class T>
+using setter_t = void (SignerInfo::*)(T);
+
+
+void init_PE_SignerInfo_class(py::module& m) {
+
+  py::class_<SignerInfo>(m, "SignerInfo")
+
+    .def_property_readonly("version",
+        &SignerInfo::version,
+        "Should be 1")
+
+    .def_property_readonly("issuer",
+        &SignerInfo::issuer,
+        "Issuer and serial number",
+        py::return_value_policy::reference)
+
+    .def_property_readonly("digest_algorithm",
+        &SignerInfo::digest_algorithm,
+        "Algorithm (OID) used to hash the file. This value should match ContentInfo.digest_algorithm and Signature.digest_algorithm")
+
+    .def_property_readonly("signature_algorithm",
+        &SignerInfo::signature_algorithm,
+        "Return the signature algorithm (OID)")
+
+    .def_property_readonly("encrypted_digest",
+        &SignerInfo::encrypted_digest,
+        "Return the signature created by the signing certificate's private key")
+
+    .def_property_readonly("authenticated_attributes",
+        &SignerInfo::authenticated_attributes,
+        "Return the " RST_CLASS_REF(lief.PE.AuthenticatedAttributes) " object",
+        py::return_value_policy::reference)
+
+    .def("__str__",
+        [] (const SignerInfo& signer_info)
+        {
+          std::ostringstream stream;
+          stream << signer_info;
+          std::string str =  stream.str();
+          return str;
+        });
+
+}
+
diff --git a/api/python/PE/objects/signature/pyx509.cpp b/api/python/PE/objects/signature/pyx509.cpp
new file mode 100644
index 0000000..952433a
--- /dev/null
+++ b/api/python/PE/objects/signature/pyx509.cpp
@@ -0,0 +1,79 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/signature/x509.hpp"
+
+#include "pyPE.hpp"
+
+
+template<class T>
+using getter_t = T (x509::*)(void) const;
+
+template<class T>
+using setter_t = void (x509::*)(T);
+
+
+void init_PE_x509_class(py::module& m) {
+
+  py::class_<x509>(m, "x509")
+
+    .def_property_readonly("version",
+        &x509::version,
+        "X.509 version. (1=v1, 2=v2, 3=v3)")
+
+    .def_property_readonly("serial_number",
+        &x509::serial_number,
+        "Unique id for certificate issued by a specific CA.")
+
+    .def_property_readonly("signature_alogrithm",
+        &x509::signature_alogrithm,
+        "Signature algorithm (OID)")
+
+
+    .def_property_readonly("valid_from",
+        &x509::valid_from,
+        "Start time of certificate validity")
+
+
+    .def_property_readonly("valid_to",
+        &x509::valid_to,
+        "End time of certificate validity")
+
+
+    .def_property_readonly("issuer",
+        &x509::issuer,
+        "Issuer informations")
+
+
+    .def_property_readonly("subject",
+        &x509::subject,
+        "Subject informations")
+
+
+    .def("__str__",
+        [] (const x509& x509_crt)
+        {
+          std::ostringstream stream;
+          stream << x509_crt;
+          std::string str =  stream.str();
+          return str;
+        });
+
+}
+
diff --git a/api/python/PE/pyPE.cpp b/api/python/PE/pyPE.cpp
new file mode 100644
index 0000000..9504979
--- /dev/null
+++ b/api/python/PE/pyPE.cpp
@@ -0,0 +1,59 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/PE/signature/OIDToString.hpp"
+
+#include "pyPE.hpp"
+
+//
+// PE modules
+//
+void init_PE_module(py::module& m) {
+  py::module LIEF_PE_module = m.def_submodule("PE", "Python API for PE");
+
+ LIEF_PE_module.def("oid_to_string",
+      &oid_to_string,
+      "Convert an OID to a human-readable string");
+
+
+  // Objects
+  init_PE_Parser_class(LIEF_PE_module);
+  init_PE_Binary_class(LIEF_PE_module);
+  init_PE_DataDirectory_class(LIEF_PE_module);
+  init_PE_Header_class(LIEF_PE_module);
+  init_PE_DosHeader_class(LIEF_PE_module);
+  init_PE_OptionalHeader_class(LIEF_PE_module);
+  init_PE_Section_class(LIEF_PE_module);
+  init_PE_Import_class(LIEF_PE_module);
+  init_PE_ImportEntry_class(LIEF_PE_module);
+  init_PE_TLS_class(LIEF_PE_module);
+  init_PE_Symbol_class(LIEF_PE_module);
+  init_PE_Relocation_class(LIEF_PE_module);
+  init_PE_RelocationEntry_class(LIEF_PE_module);
+  init_PE_Export_class(LIEF_PE_module);
+  init_PE_ExportEntry_class(LIEF_PE_module);
+  init_PE_Builder_class(LIEF_PE_module);
+  init_PE_Debug_class(LIEF_PE_module);
+  init_PE_ResourcesManager_class(LIEF_PE_module);
+
+  init_PE_Signature_class(LIEF_PE_module);
+  init_PE_ContentInfo_class(LIEF_PE_module);
+  init_PE_x509_class(LIEF_PE_module);
+  init_PE_SignerInfo_class(LIEF_PE_module);
+  init_PE_AuthenticatedAttributes_class(LIEF_PE_module);
+
+  // Enums
+  init_PE_Structures_enum(LIEF_PE_module);
+}
diff --git a/api/python/PE/pyPE.hpp b/api/python/PE/pyPE.hpp
new file mode 100644
index 0000000..782626e
--- /dev/null
+++ b/api/python/PE/pyPE.hpp
@@ -0,0 +1,53 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef PY_LIEF_PE_H_
+#define PY_LIEF_PE_H_
+#include "LIEF/PE.hpp"
+
+#include "pyLIEF.hpp"
+
+using namespace LIEF::PE;
+
+void init_PE_Parser_class(py::module&);
+void init_PE_Binary_class(py::module&);
+void init_PE_DataDirectory_class(py::module&);
+void init_PE_Header_class(py::module&);
+void init_PE_DosHeader_class(py::module&);
+void init_PE_Section_class(py::module&);
+void init_PE_OptionalHeader_class(py::module&);
+void init_PE_Import_class(py::module&);
+void init_PE_ImportEntry_class(py::module&);
+void init_PE_TLS_class(py::module&);
+void init_PE_Symbol_class(py::module&);
+void init_PE_Relocation_class(py::module&);
+void init_PE_RelocationEntry_class(py::module&);
+void init_PE_Export_class(py::module&);
+void init_PE_ExportEntry_class(py::module&);
+void init_PE_Builder_class(py::module&);
+void init_PE_Debug_class(py::module&);
+void init_PE_ResourcesManager_class(py::module&);
+
+void init_PE_Signature_class(py::module&);
+void init_PE_ContentInfo_class(py::module&);
+void init_PE_x509_class(py::module&);
+void init_PE_SignerInfo_class(py::module&);
+void init_PE_AuthenticatedAttributes_class(py::module&);
+
+// Enums
+void init_PE_Structures_enum(py::module&);
+
+
+#endif
diff --git a/api/python/PE/pyPEStructures.cpp b/api/python/PE/pyPEStructures.cpp
new file mode 100644
index 0000000..6738e77
--- /dev/null
+++ b/api/python/PE/pyPEStructures.cpp
@@ -0,0 +1,277 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyPE.hpp"
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+#define PY_ENUM(x) LIEF::PE::to_string(x), x
+
+void init_PE_Structures_enum(py::module& m) {
+
+  py::enum_<LIEF::PE::PE_TYPE>(m, "PE_TYPE")
+    .value(PY_ENUM(LIEF::PE::PE_TYPE::PE32))
+    .value(PY_ENUM(LIEF::PE::PE_TYPE::PE32_PLUS))
+    .export_values();
+
+  py::enum_<LIEF::PE::MACHINE_TYPES>(m, "MACHINE_TYPES")
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::MT_Invalid))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_UNKNOWN))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_AM33))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_AMD64))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_ARM))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_ARMNT))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_EBC))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_I386))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_IA64))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_M32R))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_MIPS16))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_MIPSFPU))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_MIPSFPU16))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_POWERPC))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_POWERPCFP))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_R4000))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_SH3))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_SH3DSP))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_SH4))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_SH5))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_THUMB))
+    .value(PY_ENUM(LIEF::PE::MACHINE_TYPES::IMAGE_FILE_MACHINE_WCEMIPSV2))
+    .export_values();
+
+  py::enum_<LIEF::PE::HEADER_CHARACTERISTICS>(m, "PE_CHARACTERISTICS")
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_RELOCS_STRIPPED))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_EXECUTABLE_IMAGE))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_LINE_NUMS_STRIPPED))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_LOCAL_SYMS_STRIPPED))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_AGGRESSIVE_WS_TRIM))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_LARGE_ADDRESS_AWARE))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_BYTES_REVERSED_LO))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_32BIT_MACHINE))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_DEBUG_STRIPPED))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_NET_RUN_FROM_SWAP))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_SYSTEM))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_DLL))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_UP_SYSTEM_ONLY))
+    .value(PY_ENUM(LIEF::PE::HEADER_CHARACTERISTICS::IMAGE_FILE_BYTES_REVERSED_HI))
+    .export_values();
+
+  py::enum_<LIEF::PE::SUBSYSTEM>(m, "SUBSYSTEM")
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_UNKNOWN))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_NATIVE))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_GUI))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_CUI))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_OS2_CUI))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_POSIX_CUI))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_NATIVE_WINDOWS))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_EFI_APPLICATION))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_EFI_ROM))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_XBOX))
+    .value(PY_ENUM(LIEF::PE::SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION))
+    .export_values();
+
+  py::enum_<LIEF::PE::DATA_DIRECTORY>(m, "DATA_DIRECTORY")
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::EXPORT_TABLE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::IMPORT_TABLE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::RESOURCE_TABLE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::EXCEPTION_TABLE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::CERTIFICATE_TABLE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::BASE_RELOCATION_TABLE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::DEBUG))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::ARCHITECTURE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::GLOBAL_PTR))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::TLS_TABLE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::LOAD_CONFIG_TABLE))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::BOUND_IMPORT))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::IAT))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::DELAY_IMPORT_DESCRIPTOR))
+    .value(PY_ENUM(LIEF::PE::DATA_DIRECTORY::CLR_RUNTIME_HEADER))
+    .export_values();
+
+  py::enum_<LIEF::PE::DLL_CHARACTERISTICS>(m, "DLL_CHARACTERISTICS")
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_NX_COMPAT))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_NO_SEH))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_NO_BIND))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_APPCONTAINER))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_GUARD_CF))
+    .value(PY_ENUM(LIEF::PE::DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE))
+    .export_values();
+
+
+  py::enum_<LIEF::PE::SECTION_CHARACTERISTICS>(m, "SECTION_CHARACTERISTICS")
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_TYPE_NO_PAD))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_CODE))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_INITIALIZED_DATA))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_UNINITIALIZED_DATA))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_OTHER))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_INFO))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_REMOVE))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_COMDAT))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_GPREL))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_PURGEABLE))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_16BIT))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_LOCKED))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_PRELOAD))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_1BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_2BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_4BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_8BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_16BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_32BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_64BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_128BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_256BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_512BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_1024BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_2048BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_4096BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_8192BYTES))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_NRELOC_OVFL))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_DISCARDABLE))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_NOT_CACHED))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_NOT_PAGED))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_SHARED))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_EXECUTE))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_READ))
+    .value(PY_ENUM(LIEF::PE::SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_WRITE))
+    .export_values();
+
+  py::enum_<LIEF::PE::SECTION_TYPES>(m, "SECTION_TYPES")
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::TEXT))
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::TLS))
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::IMPORT))
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::DATA))
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::BSS))
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::RESOURCE))
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::RELOCATION))
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::EXPORT))
+    .value(PY_ENUM(LIEF::PE::SECTION_TYPES::UNKNOWN))
+    .export_values();
+
+
+  py::enum_<LIEF::PE::SYMBOL_BASE_TYPES>(m, "SYMBOL_BASE_TYPES")
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_NULL))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_VOID))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_CHAR))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_SHORT))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_INT))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_LONG))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_FLOAT))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_DOUBLE))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_STRUCT))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_UNION))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_ENUM))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_MOE))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_BYTE))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_WORD))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_UINT))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_DWORD))
+    .export_values();
+
+
+  py::enum_<LIEF::PE::SYMBOL_COMPLEX_TYPES>(m, "SYMBOL_COMPLEX_TYPES")
+    .value(PY_ENUM(LIEF::PE::SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_NULL))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_POINTER))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_FUNCTION))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_ARRAY))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_COMPLEX_TYPES::SCT_COMPLEX_TYPE_SHIFT))
+    .export_values();
+
+
+  py::enum_<LIEF::PE::SYMBOL_SECTION_NUMBER>(m, "SYMBOL_SECTION_NUMBER")
+    .value(PY_ENUM(LIEF::PE::SYMBOL_SECTION_NUMBER::IMAGE_SYM_DEBUG))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_SECTION_NUMBER::IMAGE_SYM_ABSOLUTE))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_SECTION_NUMBER::IMAGE_SYM_UNDEFINED))
+    .export_values();
+
+
+  py::enum_<LIEF::PE::SYMBOL_STORAGE_CLASS>(m, "SYMBOL_STORAGE_CLASS")
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_END_OF_FUNCTION))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_NULL))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_AUTOMATIC))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_EXTERNAL))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_STATIC))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_REGISTER))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_EXTERNAL_DEF))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_LABEL))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_UNDEFINED_LABEL))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_MEMBER_OF_STRUCT))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_UNION_TAG))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_TYPE_DEFINITION))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_UNDEFINED_STATIC))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_ENUM_TAG))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_MEMBER_OF_ENUM))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_REGISTER_PARAM))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_BIT_FIELD))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_BLOCK))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_FUNCTION))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_END_OF_STRUCT))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_FILE))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_SECTION))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_WEAK_EXTERNAL))
+    .value(PY_ENUM(LIEF::PE::SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_CLR_TOKEN))
+    .export_values();
+
+
+  py::enum_<LIEF::PE::RELOCATIONS_BASE_TYPES>(m, "RELOCATIONS_BASE_TYPES")
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_ABSOLUTE))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGH))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_LOW))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGHLOW))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGHADJ))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_MIPS_JMPADDR))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_SECTION))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_REL))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_MIPS_JMPADDR16))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_IA64_IMM64))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_DIR64))
+    .value(PY_ENUM(LIEF::PE::RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGH3ADJ))
+    .export_values();
+
+
+  py::enum_<LIEF::PE::DEBUG_TYPES>(m, "DEBUG_TYPES")
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_UNKNOWN))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_COFF))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_CODEVIEW))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_FPO))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_MISC))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_EXCEPTION))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_FIXUP))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_OMAP_TO_SRC))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_OMAP_FROM_SRC))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_BORLAND))
+    .value(PY_ENUM(LIEF::PE::DEBUG_TYPES::IMAGE_DEBUG_TYPE_CLSID))
+    .export_values();
+
+
+
+
+
+
+
+
+
+
+}
+
diff --git a/api/python/README.in b/api/python/README.in
new file mode 100644
index 0000000..501ac01
--- /dev/null
+++ b/api/python/README.in
@@ -0,0 +1,15 @@
+LIEF - Python API
+-----------------
+
+The purpose of this project is to provide a cross platform library which can parse, modify and abstract ELF, PE and MachO formats.
+
+Main features:
+
+  * Parsing: LIEF can parse ELF, PE, MachO and provides an user-friendly API to access to format internals.
+  * Modify: LIEF enables to modify some parts of these formats
+  * Abstract: Three formats have common features like sections, symbols, entry point... LIEF factors them.
+  * API: LIEF can be used in C, C++ and Python
+
+
+
+
diff --git a/api/python/__init__.py.in b/api/python/__init__.py.in
new file mode 100644
index 0000000..e69de29
diff --git a/api/python/pyExceptions.cpp b/api/python/pyExceptions.cpp
new file mode 100644
index 0000000..e2e0386
--- /dev/null
+++ b/api/python/pyExceptions.cpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyLIEF.hpp"
+#include "LIEF/exception.hpp"
+
+void init_LIEF_exceptions(py::module& m) {
+  auto&& exception = py::register_exception<LIEF::exception>(m, "exception");
+  auto&& bad_file  = py::register_exception<LIEF::bad_file>(m, "bad_file", exception.ptr());
+  py::register_exception<LIEF::bad_format>(m, "bad_format", bad_file.ptr());
+  py::register_exception<LIEF::not_implemented>(m, "not_implemented", exception.ptr());
+  py::register_exception<LIEF::not_supported>(m, "not_supported", exception.ptr());
+  py::register_exception<LIEF::read_out_of_bound>(m, "read_out_of_bound", exception.ptr());
+  py::register_exception<LIEF::not_found>(m, "not_found", exception.ptr());
+  py::register_exception<LIEF::corrupted>(m, "corrupted", exception.ptr());
+  py::register_exception<LIEF::conversion_error>(m, "conversion_error", exception.ptr());
+  py::register_exception<LIEF::type_error>(m, "type_error", exception.ptr());
+  py::register_exception<LIEF::builder_error>(m, "builder_error", exception.ptr());
+  py::register_exception<LIEF::parser_error>(m, "parser_error", exception.ptr());
+  auto&& pe_error = py::register_exception<LIEF::pe_error>(m, "pe_error", exception.ptr());
+  py::register_exception<LIEF::pe_bad_section_name>(m, "pe_bad_section_name", pe_error.ptr());
+}
diff --git a/api/python/pyIterators.cpp b/api/python/pyIterators.cpp
new file mode 100644
index 0000000..ae528b2
--- /dev/null
+++ b/api/python/pyIterators.cpp
@@ -0,0 +1,68 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "pyLIEF.hpp"
+#include "pyIterators.hpp"
+
+#include "LIEF/PE/signature/types.hpp"
+
+void init_LIEF_iterators(py::module& m) {
+  // Abstract
+  // ========
+  init_ref_iterator<LIEF::it_sections>(m);
+  init_ref_iterator<LIEF::it_symbols>(m);
+
+  // ELF
+  // ===
+#if defined(LIEF_ELF_MODULE)
+  init_ref_iterator<LIEF::ELF::it_sections>(m);
+  init_ref_iterator<LIEF::ELF::it_segments>(m);
+  init_ref_iterator<LIEF::ELF::it_dynamic_entries>(m);
+  init_ref_iterator<LIEF::ELF::it_symbols>(m);
+  init_ref_iterator<LIEF::ELF::it_relocations>(m);
+  init_ref_iterator<LIEF::ELF::it_symbols_version>(m);
+  init_ref_iterator<LIEF::ELF::it_symbols_version_requirement>(m);
+  init_ref_iterator<LIEF::ELF::it_symbols_version_definition>(m);
+  init_ref_iterator<LIEF::filter_iterator<LIEF::ELF::symbols_t>>(m);
+  init_ref_iterator<LIEF::ELF::it_symbols_version_aux>(m);
+  init_ref_iterator<LIEF::ELF::it_symbols_version_aux_requirement>(m);
+#endif
+
+  // PE
+  // ==
+#if defined(LIEF_PE_MODULE)
+  init_ref_iterator<LIEF::PE::it_sections>(m);
+  init_ref_iterator<LIEF::PE::it_data_directories>(m);
+  init_ref_iterator<LIEF::PE::it_relocations>(m);
+  init_ref_iterator<LIEF::PE::it_imports>(m);
+  init_ref_iterator<LIEF::PE::it_import_entries>(m);
+  init_ref_iterator<LIEF::PE::it_export_entries>(m);
+  init_ref_iterator<LIEF::PE::it_symbols>(m);
+  init_ref_iterator<LIEF::PE::it_const_crt>(m);
+#endif
+
+
+  // MachO
+  // =====
+#if defined(LIEF_MACHO_MODULE)
+  init_ref_iterator<LIEF::MachO::it_commands>(m);
+  init_ref_iterator<LIEF::MachO::it_symbols>(m);
+  init_ref_iterator<LIEF::filter_iterator<LIEF::MachO::symbols_t>>(m);
+  init_ref_iterator<LIEF::MachO::it_libraries>(m);
+  init_ref_iterator<LIEF::MachO::it_segments>(m);
+  init_ref_iterator<LIEF::MachO::it_sections>(m);
+#endif
+
+}
diff --git a/api/python/pyIterators.hpp b/api/python/pyIterators.hpp
new file mode 100644
index 0000000..f412803
--- /dev/null
+++ b/api/python/pyIterators.hpp
@@ -0,0 +1,67 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef PY_LIEF_ITERATORS_H_
+#define PY_LIEF_ITERATORS_H_
+#include <pybind11/pybind11.h>
+
+
+#include "LIEF/LIEF.hpp"
+#include "LIEF/Abstract/type_traits.hpp"
+#include "LIEF/ELF/type_traits.hpp"
+#include "LIEF/PE/type_traits.hpp"
+#include "LIEF/MachO/type_traits.hpp"
+
+
+namespace py = pybind11;
+
+
+void init_LIEF_iterators(py::module&);
+
+template<class T>
+void init_ref_iterator(py::module& m) {
+  py::class_<T>(m, typeid(T).name())
+    .def("__getitem__",
+        [](T& v, size_t i) -> typename T::reference {
+            if (i >= v.size())
+                throw py::index_error();
+            return v[i];
+        },
+        py::return_value_policy::reference)
+
+    .def("__len__",
+        [](T& v) {
+          return  v.size();
+        })
+
+    .def("__iter__",
+        [](T& v) -> T {
+          return std::begin(v);
+        }, py::return_value_policy::reference_internal)
+
+    .def("__next__",
+        [] (T& v) -> typename T::reference {
+          if (v == std::end(v)) {
+            throw py::stop_iteration();
+          }
+          return *(v++);
+
+    }, py::return_value_policy::reference);
+
+
+
+}
+
+#endif
diff --git a/api/python/pyJson.cpp b/api/python/pyJson.cpp
new file mode 100644
index 0000000..d650acc
--- /dev/null
+++ b/api/python/pyJson.cpp
@@ -0,0 +1,51 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/to_json.hpp"
+
+#include "pyLIEF.hpp"
+
+void init_json_functions(py::module& m) {
+
+#if defined(LIEF_ELF_MODULE)
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::Binary,                      LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::Header,                      LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::Section,                     LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::Segment,                     LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::DynamicEntry,                LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::DynamicEntryArray,           LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::DynamicEntryLibrary,         LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::DynamicEntryRpath,           LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::DynamicEntryRunPath,         LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::DynamicSharedObject,         LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::Symbol,                      LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::Relocation,                  LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::SymbolVersion,               LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::SymbolVersionAux,            LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::SymbolVersionAuxRequirement, LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::SymbolVersionRequirement,    LIEF::ELF::JsonVisitor>);
+    m.def("to_json", &LIEF::to_json_str<LIEF::ELF::SymbolVersionDefinition,     LIEF::ELF::JsonVisitor>);
+#endif
+
+    m.def("to_json",          &LIEF::to_json_str<LIEF::Binary>);
+    m.def("abstract_to_json", &LIEF::to_json_str<LIEF::Binary>);
+    m.def("to_json",          &LIEF::to_json_str<LIEF::Header>);
+    m.def("to_json",          &LIEF::to_json_str<LIEF::Section>);
+    m.def("to_json",          &LIEF::to_json_str<LIEF::Symbol>);
+
+
+
+
+}
diff --git a/api/python/pyLIEF.cpp b/api/python/pyLIEF.cpp
new file mode 100644
index 0000000..b768f72
--- /dev/null
+++ b/api/python/pyLIEF.cpp
@@ -0,0 +1,52 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/logging.hpp"
+#include "pyLIEF.hpp"
+
+PYBIND11_PLUGIN(lief) {
+
+  py::module LIEF_module("lief", "Python API for LIEF");
+
+  init_LIEF_iterators(LIEF_module);
+
+  // Init custom LIEF exceptions
+  init_LIEF_exceptions(LIEF_module);
+
+  // Init the LIEF module
+  init_LIEF_module(LIEF_module);
+
+  // Init the ELF module
+#if defined(LIEF_ELF_MODULE)
+  init_ELF_module(LIEF_module);
+#endif
+
+  // Init the PE module
+#if defined(LIEF_PE_MODULE)
+  init_PE_module(LIEF_module);
+#endif
+
+  // Init the MachO  module
+#if defined(LIEF_MACHO_MODULE)
+  init_MachO_module(LIEF_module);
+#endif
+
+  // Init util functions
+  init_utils_functions(LIEF_module);
+
+  init_json_functions(LIEF_module);
+
+  return LIEF_module.ptr();
+}
diff --git a/api/python/pyLIEF.hpp b/api/python/pyLIEF.hpp
new file mode 100644
index 0000000..c89df5a
--- /dev/null
+++ b/api/python/pyLIEF.hpp
@@ -0,0 +1,39 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef PY_LIEF_H_
+#define PY_LIEF_H_
+
+#include <pybind11/pybind11.h>
+#include <pybind11/stl.h>
+#include <functional>
+
+#include "pyIterators.hpp"
+
+namespace py = pybind11;
+
+using namespace pybind11::literals;
+
+void init_LIEF_exceptions(py::module&);
+void init_LIEF_module(py::module&);
+void init_ELF_module(py::module&);
+void init_PE_module(py::module&);
+void init_MachO_module(py::module&);
+void init_utils_functions(py::module&);
+void init_json_functions(py::module&);
+
+#define RST_CLASS_REF(X) ":class:`~"#X"`"
+
+#endif
diff --git a/api/python/pyUtils.cpp b/api/python/pyUtils.cpp
new file mode 100644
index 0000000..dc7ff83
--- /dev/null
+++ b/api/python/pyUtils.cpp
@@ -0,0 +1,36 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/PE/utils.hpp"
+#include "LIEF/MachO/utils.hpp"
+#include "LIEF/ELF/utils.hpp"
+
+#include "pyLIEF.hpp"
+
+void init_utils_functions(py::module& m) {
+
+#if defined(LIEF_PE_MODULE)
+    m.def("is_pe",    static_cast<bool (*)(const std::string&)>(&LIEF::PE::is_pe),       "Check if the given binary is ``PE``");
+#endif
+
+#if defined(LIEF_ELF_MODULE)
+    m.def("is_elf",   &LIEF::ELF::is_elf,     "Check if the given binary is ``ELF``");
+#endif
+
+#if defined(LIEF_MACHO_MODULE)
+    m.def("is_macho", &LIEF::MachO::is_macho, "Check if the given binary is ``MachO``");
+#endif
+
+}
diff --git a/api/python/setup.py.in b/api/python/setup.py.in
new file mode 100644
index 0000000..27576db
--- /dev/null
+++ b/api/python/setup.py.in
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+from   setuptools import setup
+import os
+import site
+
+
+package_description = '''
+LIEF is a library to instrument executable formats
+'''.strip()
+
+setup(
+    name                 = 'lief',
+    version              = '@LIEF_VERSION_MAJOR@.@LIEF_VERSION_MINOR@.@LIEF_VERSION_PATCH@',
+    license              = "Apache 2.0",
+    description          = package_description,
+    url                  = 'http://lief.quarkslab.com',
+    author               = 'Romain Thomas',
+    author_email         = 'rthomas@quarkslab.com',
+    packages             = [''],
+    package_data         = {'': ['@LIEF_LIBRARY_NAME@']},
+    keywords             = 'elf pe macho',
+    classifiers          = [
+        'License :: OSI Approved :: Apache Software License',
+        'Development Status :: 4 - Beta',
+        'Environment :: Console',
+        'Intended Audience :: Developers',
+	'Intended Audience :: Science/Research',
+        'Operating System :: MacOS :: MacOS X',
+        'Operating System :: POSIX :: Linux',
+        'Operating System :: Windows :: Windows',
+        'Programming Language :: C++',
+        'Programming Language :: Python :: @PYTHON_VERSION@',
+        'Topic :: Software Development :: Libraries',
+        'Topic :: Security',
+        'Topic :: Scientific/Engineering :: Information Analysis',
+	'Topic :: Software Development :: Build Tools',
+    ]
+)
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
new file mode 100644
index 0000000..d164a30
--- /dev/null
+++ b/doc/CMakeLists.txt
@@ -0,0 +1,93 @@
+find_package(Doxygen)
+find_program(SPHINX_BUILD_BIN NAMES sphinx-build)
+
+if(NOT DOXYGEN_FOUND)
+    message(STATUS "Doc disabled: doxygen not found")
+elseif(NOT SPHINX_BUILD_BIN)
+    message(STATUS "Doc disabled: sphinx-build not found")
+elseif(${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
+  message(STATUS "You have to build the doc in another directory !")
+else()
+    configure_file(
+      ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/Doxyfile.in
+      ${CMAKE_CURRENT_BINARY_DIR}/doxygen/Doxyfile @ONLY)
+
+    configure_file(
+      ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/conf.py.in
+      ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/conf.py @ONLY)
+
+    file(GLOB PACKER_DOC_RST RELATIVE
+      "${CMAKE_CURRENT_SOURCE_DIR}/sphinx"
+      "${CMAKE_CURRENT_SOURCE_DIR}/sphinx/*.rst")
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src
+      PATTERN "*.in" EXCLUDE)
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/sphinx/_static
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src/_static
+    )
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html
+      PATTERN "*.css")
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html
+      PATTERN "*.js")
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/fonts
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html
+      )
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/js
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html
+      )
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/css
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html
+      )
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/header.html
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen)
+
+
+    file(
+      COPY ${CMAKE_CURRENT_SOURCE_DIR}/doxygen/footer.html
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen)
+
+    file(
+      COPY ${CMAKE_SOURCE_DIR}/README.md
+      DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/doxygen
+    )
+
+  add_custom_target(doc-lief ALL
+      COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxygen/Doxyfile
+      COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PROJECT_BINARY_DIR}/api/python:$ENV{PYTHONPATH}" ${SPHINX_BUILD_BIN} ${CMAKE_CURRENT_BINARY_DIR}/sphinx-src sphinx-doc
+      DEPENDS pyLIEF LIB_LIEF_STATIC
+      WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+      COMMENT "Generating documentation with Doxygen and Sphinx" VERBATIM)
+
+    install(
+      DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR}/doxygen/html/
+      DESTINATION
+      share/doc/lief/doxygen
+      COMPONENT doc)
+
+    install(
+      DIRECTORY
+      ${CMAKE_CURRENT_BINARY_DIR}/sphinx-doc/
+      DESTINATION
+      share/doc/lief/sphinx
+      COMPONENT doc)
+
+endif()
diff --git a/doc/doxygen/Doxyfile.in b/doc/doxygen/Doxyfile.in
new file mode 100644
index 0000000..e810c82
--- /dev/null
+++ b/doc/doxygen/Doxyfile.in
@@ -0,0 +1,2392 @@
+# Doxyfile 1.8.10
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME           = "Library to Instrument Executable Formats (LIEF)"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER         = "version @LIEF_VERSION_MAJOR@.@LIEF_VERSION_MINOR@.@LIEF_VERSION_PATCH@"
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF          =
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO           = @PROJECT_SOURCE_DIR@/doc/doxygen/logo_lief_55.png
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = ./doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS         = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES        = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE               = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
+
+ALIASES                =
+
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
+
+TCL_SUBST              =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT   = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING            = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS  = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC         = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES   = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES       = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING  = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES        = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES             = NO
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE            =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES         =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS               = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED   = NO
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT             = \
+  @PROJECT_SOURCE_DIR@/src \
+  @PROJECT_SOURCE_DIR@/include/LIEF \
+  @PROJECT_SOURCE_DIR@/api/c \
+  @PROJECT_BINARY_DIR@/include/LIEF \
+  @PROJECT_SOURCE_DIR@/doc/doxygen/index.doxygen
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd,
+# *.vhdl, *.ucf, *.qsf, *.as and *.js.
+
+FILE_PATTERNS          = *.cpp *.hpp *.h *.c *.def
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH           = @PROJECT_SOURCE_DIR@/doc/doxygen/welcome.html
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH             =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES    = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+#USE_MDFILE_AS_MAINPAGE = index.md
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION    = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX     = YES
+
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            = @CMAKE_CURRENT_BINARY_DIR@/doxygen/header.html
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            = @CMAKE_CURRENT_BINARY_DIR@/doxygen/footer.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+#HTML_EXTRA_STYLESHEET  = @CMAKE_CURRENT_BINARY_DIR@/doxygen/customdoxygen.css
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE    = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT    = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA  = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP         = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
+# for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET        = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME  = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP      = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE               =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION           =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI           = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING     =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC             = YES
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP           = YES
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE               = lief.qch
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE          = org.lief
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER     = liefdoc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION           = /usr/bin/qhelpgenerator
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP   = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID         = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX          = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW      = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH         = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW    = NO
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE       = 10
+
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT    = YES
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX            = NO
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE           = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH    = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE             = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER           =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES      =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
+# higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX           = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE        = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES     = NO
+
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_SOURCE_CODE      = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE        = plain
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION          = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML           = YES
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT             = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK       = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION        = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF     = YES
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH           = @PROJECT_SOURCE_DIR@/include/LIEF/ELF/Relocations
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+#PREDEFINED             = DISABE_DOX
+
+# Disable protected memebers
+PREDEFINED = protected=private
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS        = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT               = YES
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS        = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME           = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK               = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS     = YES
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH          = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT       = svg
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG        = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS           =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS           =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND        = NO
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_CLEANUP            = YES
diff --git a/doc/doxygen/bootstrap.min.css b/doc/doxygen/bootstrap.min.css
new file mode 100644
index 0000000..2945adc
--- /dev/null
+++ b/doc/doxygen/bootstrap.min.css
@@ -0,0 +1,7523 @@
+@import url("https://fonts.googleapis.com/css?family=Roboto:300,400,500,700");
+/*!
+ * bootswatch v3.3.6
+ * Homepage: http://bootswatch.com
+ * Copyright 2012-2016 Thomas Park
+ * Licensed under MIT
+ * Based on Bootstrap
+*/
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+html {
+  font-family: sans-serif;
+  -ms-text-size-adjust: 100%;
+  -webkit-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+audio,
+canvas,
+progress,
+video {
+  display: inline-block;
+  vertical-align: baseline;
+}
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+[hidden],
+template {
+  display: none;
+}
+a {
+  background-color: transparent;
+}
+a:active,
+a:hover {
+  outline: 0;
+}
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+b,
+strong {
+  font-weight: bold;
+}
+dfn {
+  font-style: italic;
+}
+h1 {
+  font-size: 1em;
+  margin: 0.67em 0;
+}
+mark {
+  background: #ff0;
+  color: #000;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+img {
+  border: 0;
+}
+svg:not(:root) {
+  overflow: hidden;
+}
+figure {
+  margin: 1em 40px;
+}
+hr {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  height: 0;
+}
+pre {
+  overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+  color: inherit;
+  font: inherit;
+  margin: 0;
+}
+button {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+input {
+  line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-appearance: textfield;
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+}
+legend {
+  border: 0;
+  padding: 0;
+}
+textarea {
+  overflow: auto;
+}
+optgroup {
+  font-weight: bold;
+}
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+td,
+th {
+  padding: 0;
+}
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+  *,
+  *:before,
+  *:after {
+    background: transparent !important;
+    color: #000 !important;
+    -webkit-box-shadow: none !important;
+            box-shadow: none !important;
+    text-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  a[href^="#"]:after,
+  a[href^="javascript:"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  .navbar {
+    display: none;
+  }
+  .btn > .caret,
+  .dropup > .btn > .caret {
+    border-top-color: #000 !important;
+  }
+  .label {
+    border: 1px solid #000;
+  }
+  .table {
+    border-collapse: collapse !important;
+  }
+  .table td,
+  .table th {
+    background-color: #fff !important;
+  }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important;
+  }
+}
+@font-face {
+  font-family: 'Glyphicons Halflings';
+  src: url('../fonts/glyphicons-halflings-regular.eot');
+  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+}
+.glyphicon {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-family: 'Glyphicons Halflings';
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+  content: "\002a";
+}
+.glyphicon-plus:before {
+  content: "\002b";
+}
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+  content: "\20ac";
+}
+.glyphicon-minus:before {
+  content: "\2212";
+}
+.glyphicon-cloud:before {
+  content: "\2601";
+}
+.glyphicon-envelope:before {
+  content: "\2709";
+}
+.glyphicon-pencil:before {
+  content: "\270f";
+}
+.glyphicon-glass:before {
+  content: "\e001";
+}
+.glyphicon-music:before {
+  content: "\e002";
+}
+.glyphicon-search:before {
+  content: "\e003";
+}
+.glyphicon-heart:before {
+  content: "\e005";
+}
+.glyphicon-star:before {
+  content: "\e006";
+}
+.glyphicon-star-empty:before {
+  content: "\e007";
+}
+.glyphicon-user:before {
+  content: "\e008";
+}
+.glyphicon-film:before {
+  content: "\e009";
+}
+.glyphicon-th-large:before {
+  content: "\e010";
+}
+.glyphicon-th:before {
+  content: "\e011";
+}
+.glyphicon-th-list:before {
+  content: "\e012";
+}
+.glyphicon-ok:before {
+  content: "\e013";
+}
+.glyphicon-remove:before {
+  content: "\e014";
+}
+.glyphicon-zoom-in:before {
+  content: "\e015";
+}
+.glyphicon-zoom-out:before {
+  content: "\e016";
+}
+.glyphicon-off:before {
+  content: "\e017";
+}
+.glyphicon-signal:before {
+  content: "\e018";
+}
+.glyphicon-cog:before {
+  content: "\e019";
+}
+.glyphicon-trash:before {
+  content: "\e020";
+}
+.glyphicon-home:before {
+  content: "\e021";
+}
+.glyphicon-file:before {
+  content: "\e022";
+}
+.glyphicon-time:before {
+  content: "\e023";
+}
+.glyphicon-road:before {
+  content: "\e024";
+}
+.glyphicon-download-alt:before {
+  content: "\e025";
+}
+.glyphicon-download:before {
+  content: "\e026";
+}
+.glyphicon-upload:before {
+  content: "\e027";
+}
+.glyphicon-inbox:before {
+  content: "\e028";
+}
+.glyphicon-play-circle:before {
+  content: "\e029";
+}
+.glyphicon-repeat:before {
+  content: "\e030";
+}
+.glyphicon-refresh:before {
+  content: "\e031";
+}
+.glyphicon-list-alt:before {
+  content: "\e032";
+}
+.glyphicon-lock:before {
+  content: "\e033";
+}
+.glyphicon-flag:before {
+  content: "\e034";
+}
+.glyphicon-headphones:before {
+  content: "\e035";
+}
+.glyphicon-volume-off:before {
+  content: "\e036";
+}
+.glyphicon-volume-down:before {
+  content: "\e037";
+}
+.glyphicon-volume-up:before {
+  content: "\e038";
+}
+.glyphicon-qrcode:before {
+  content: "\e039";
+}
+.glyphicon-barcode:before {
+  content: "\e040";
+}
+.glyphicon-tag:before {
+  content: "\e041";
+}
+.glyphicon-tags:before {
+  content: "\e042";
+}
+.glyphicon-book:before {
+  content: "\e043";
+}
+.glyphicon-bookmark:before {
+  content: "\e044";
+}
+.glyphicon-print:before {
+  content: "\e045";
+}
+.glyphicon-camera:before {
+  content: "\e046";
+}
+.glyphicon-font:before {
+  content: "\e047";
+}
+.glyphicon-bold:before {
+  content: "\e048";
+}
+.glyphicon-italic:before {
+  content: "\e049";
+}
+.glyphicon-text-height:before {
+  content: "\e050";
+}
+.glyphicon-text-width:before {
+  content: "\e051";
+}
+.glyphicon-align-left:before {
+  content: "\e052";
+}
+.glyphicon-align-center:before {
+  content: "\e053";
+}
+.glyphicon-align-right:before {
+  content: "\e054";
+}
+.glyphicon-align-justify:before {
+  content: "\e055";
+}
+.glyphicon-list:before {
+  content: "\e056";
+}
+.glyphicon-indent-left:before {
+  content: "\e057";
+}
+.glyphicon-indent-right:before {
+  content: "\e058";
+}
+.glyphicon-facetime-video:before {
+  content: "\e059";
+}
+.glyphicon-picture:before {
+  content: "\e060";
+}
+.glyphicon-map-marker:before {
+  content: "\e062";
+}
+.glyphicon-adjust:before {
+  content: "\e063";
+}
+.glyphicon-tint:before {
+  content: "\e064";
+}
+.glyphicon-edit:before {
+  content: "\e065";
+}
+.glyphicon-share:before {
+  content: "\e066";
+}
+.glyphicon-check:before {
+  content: "\e067";
+}
+.glyphicon-move:before {
+  content: "\e068";
+}
+.glyphicon-step-backward:before {
+  content: "\e069";
+}
+.glyphicon-fast-backward:before {
+  content: "\e070";
+}
+.glyphicon-backward:before {
+  content: "\e071";
+}
+.glyphicon-play:before {
+  content: "\e072";
+}
+.glyphicon-pause:before {
+  content: "\e073";
+}
+.glyphicon-stop:before {
+  content: "\e074";
+}
+.glyphicon-forward:before {
+  content: "\e075";
+}
+.glyphicon-fast-forward:before {
+  content: "\e076";
+}
+.glyphicon-step-forward:before {
+  content: "\e077";
+}
+.glyphicon-eject:before {
+  content: "\e078";
+}
+.glyphicon-chevron-left:before {
+  content: "\e079";
+}
+.glyphicon-chevron-right:before {
+  content: "\e080";
+}
+.glyphicon-plus-sign:before {
+  content: "\e081";
+}
+.glyphicon-minus-sign:before {
+  content: "\e082";
+}
+.glyphicon-remove-sign:before {
+  content: "\e083";
+}
+.glyphicon-ok-sign:before {
+  content: "\e084";
+}
+.glyphicon-question-sign:before {
+  content: "\e085";
+}
+.glyphicon-info-sign:before {
+  content: "\e086";
+}
+.glyphicon-screenshot:before {
+  content: "\e087";
+}
+.glyphicon-remove-circle:before {
+  content: "\e088";
+}
+.glyphicon-ok-circle:before {
+  content: "\e089";
+}
+.glyphicon-ban-circle:before {
+  content: "\e090";
+}
+.glyphicon-arrow-left:before {
+  content: "\e091";
+}
+.glyphicon-arrow-right:before {
+  content: "\e092";
+}
+.glyphicon-arrow-up:before {
+  content: "\e093";
+}
+.glyphicon-arrow-down:before {
+  content: "\e094";
+}
+.glyphicon-share-alt:before {
+  content: "\e095";
+}
+.glyphicon-resize-full:before {
+  content: "\e096";
+}
+.glyphicon-resize-small:before {
+  content: "\e097";
+}
+.glyphicon-exclamation-sign:before {
+  content: "\e101";
+}
+.glyphicon-gift:before {
+  content: "\e102";
+}
+.glyphicon-leaf:before {
+  content: "\e103";
+}
+.glyphicon-fire:before {
+  content: "\e104";
+}
+.glyphicon-eye-open:before {
+  content: "\e105";
+}
+.glyphicon-eye-close:before {
+  content: "\e106";
+}
+.glyphicon-warning-sign:before {
+  content: "\e107";
+}
+.glyphicon-plane:before {
+  content: "\e108";
+}
+.glyphicon-calendar:before {
+  content: "\e109";
+}
+.glyphicon-random:before {
+  content: "\e110";
+}
+.glyphicon-comment:before {
+  content: "\e111";
+}
+.glyphicon-magnet:before {
+  content: "\e112";
+}
+.glyphicon-chevron-up:before {
+  content: "\e113";
+}
+.glyphicon-chevron-down:before {
+  content: "\e114";
+}
+.glyphicon-retweet:before {
+  content: "\e115";
+}
+.glyphicon-shopping-cart:before {
+  content: "\e116";
+}
+.glyphicon-folder-close:before {
+  content: "\e117";
+}
+.glyphicon-folder-open:before {
+  content: "\e118";
+}
+.glyphicon-resize-vertical:before {
+  content: "\e119";
+}
+.glyphicon-resize-horizontal:before {
+  content: "\e120";
+}
+.glyphicon-hdd:before {
+  content: "\e121";
+}
+.glyphicon-bullhorn:before {
+  content: "\e122";
+}
+.glyphicon-bell:before {
+  content: "\e123";
+}
+.glyphicon-certificate:before {
+  content: "\e124";
+}
+.glyphicon-thumbs-up:before {
+  content: "\e125";
+}
+.glyphicon-thumbs-down:before {
+  content: "\e126";
+}
+.glyphicon-hand-right:before {
+  content: "\e127";
+}
+.glyphicon-hand-left:before {
+  content: "\e128";
+}
+.glyphicon-hand-up:before {
+  content: "\e129";
+}
+.glyphicon-hand-down:before {
+  content: "\e130";
+}
+.glyphicon-circle-arrow-right:before {
+  content: "\e131";
+}
+.glyphicon-circle-arrow-left:before {
+  content: "\e132";
+}
+.glyphicon-circle-arrow-up:before {
+  content: "\e133";
+}
+.glyphicon-circle-arrow-down:before {
+  content: "\e134";
+}
+.glyphicon-globe:before {
+  content: "\e135";
+}
+.glyphicon-wrench:before {
+  content: "\e136";
+}
+.glyphicon-tasks:before {
+  content: "\e137";
+}
+.glyphicon-filter:before {
+  content: "\e138";
+}
+.glyphicon-briefcase:before {
+  content: "\e139";
+}
+.glyphicon-fullscreen:before {
+  content: "\e140";
+}
+.glyphicon-dashboard:before {
+  content: "\e141";
+}
+.glyphicon-paperclip:before {
+  content: "\e142";
+}
+.glyphicon-heart-empty:before {
+  content: "\e143";
+}
+.glyphicon-link:before {
+  content: "\e144";
+}
+.glyphicon-phone:before {
+  content: "\e145";
+}
+.glyphicon-pushpin:before {
+  content: "\e146";
+}
+.glyphicon-usd:before {
+  content: "\e148";
+}
+.glyphicon-gbp:before {
+  content: "\e149";
+}
+.glyphicon-sort:before {
+  content: "\e150";
+}
+.glyphicon-sort-by-alphabet:before {
+  content: "\e151";
+}
+.glyphicon-sort-by-alphabet-alt:before {
+  content: "\e152";
+}
+.glyphicon-sort-by-order:before {
+  content: "\e153";
+}
+.glyphicon-sort-by-order-alt:before {
+  content: "\e154";
+}
+.glyphicon-sort-by-attributes:before {
+  content: "\e155";
+}
+.glyphicon-sort-by-attributes-alt:before {
+  content: "\e156";
+}
+.glyphicon-unchecked:before {
+  content: "\e157";
+}
+.glyphicon-expand:before {
+  content: "\e158";
+}
+.glyphicon-collapse-down:before {
+  content: "\e159";
+}
+.glyphicon-collapse-up:before {
+  content: "\e160";
+}
+.glyphicon-log-in:before {
+  content: "\e161";
+}
+.glyphicon-flash:before {
+  content: "\e162";
+}
+.glyphicon-log-out:before {
+  content: "\e163";
+}
+.glyphicon-new-window:before {
+  content: "\e164";
+}
+.glyphicon-record:before {
+  content: "\e165";
+}
+.glyphicon-save:before {
+  content: "\e166";
+}
+.glyphicon-open:before {
+  content: "\e167";
+}
+.glyphicon-saved:before {
+  content: "\e168";
+}
+.glyphicon-import:before {
+  content: "\e169";
+}
+.glyphicon-export:before {
+  content: "\e170";
+}
+.glyphicon-send:before {
+  content: "\e171";
+}
+.glyphicon-floppy-disk:before {
+  content: "\e172";
+}
+.glyphicon-floppy-saved:before {
+  content: "\e173";
+}
+.glyphicon-floppy-remove:before {
+  content: "\e174";
+}
+.glyphicon-floppy-save:before {
+  content: "\e175";
+}
+.glyphicon-floppy-open:before {
+  content: "\e176";
+}
+.glyphicon-credit-card:before {
+  content: "\e177";
+}
+.glyphicon-transfer:before {
+  content: "\e178";
+}
+.glyphicon-cutlery:before {
+  content: "\e179";
+}
+.glyphicon-header:before {
+  content: "\e180";
+}
+.glyphicon-compressed:before {
+  content: "\e181";
+}
+.glyphicon-earphone:before {
+  content: "\e182";
+}
+.glyphicon-phone-alt:before {
+  content: "\e183";
+}
+.glyphicon-tower:before {
+  content: "\e184";
+}
+.glyphicon-stats:before {
+  content: "\e185";
+}
+.glyphicon-sd-video:before {
+  content: "\e186";
+}
+.glyphicon-hd-video:before {
+  content: "\e187";
+}
+.glyphicon-subtitles:before {
+  content: "\e188";
+}
+.glyphicon-sound-stereo:before {
+  content: "\e189";
+}
+.glyphicon-sound-dolby:before {
+  content: "\e190";
+}
+.glyphicon-sound-5-1:before {
+  content: "\e191";
+}
+.glyphicon-sound-6-1:before {
+  content: "\e192";
+}
+.glyphicon-sound-7-1:before {
+  content: "\e193";
+}
+.glyphicon-copyright-mark:before {
+  content: "\e194";
+}
+.glyphicon-registration-mark:before {
+  content: "\e195";
+}
+.glyphicon-cloud-download:before {
+  content: "\e197";
+}
+.glyphicon-cloud-upload:before {
+  content: "\e198";
+}
+.glyphicon-tree-conifer:before {
+  content: "\e199";
+}
+.glyphicon-tree-deciduous:before {
+  content: "\e200";
+}
+.glyphicon-cd:before {
+  content: "\e201";
+}
+.glyphicon-save-file:before {
+  content: "\e202";
+}
+.glyphicon-open-file:before {
+  content: "\e203";
+}
+.glyphicon-level-up:before {
+  content: "\e204";
+}
+.glyphicon-copy:before {
+  content: "\e205";
+}
+.glyphicon-paste:before {
+  content: "\e206";
+}
+.glyphicon-alert:before {
+  content: "\e209";
+}
+.glyphicon-equalizer:before {
+  content: "\e210";
+}
+.glyphicon-king:before {
+  content: "\e211";
+}
+.glyphicon-queen:before {
+  content: "\e212";
+}
+.glyphicon-pawn:before {
+  content: "\e213";
+}
+.glyphicon-bishop:before {
+  content: "\e214";
+}
+.glyphicon-knight:before {
+  content: "\e215";
+}
+.glyphicon-baby-formula:before {
+  content: "\e216";
+}
+.glyphicon-tent:before {
+  content: "\26fa";
+}
+.glyphicon-blackboard:before {
+  content: "\e218";
+}
+.glyphicon-bed:before {
+  content: "\e219";
+}
+.glyphicon-apple:before {
+  content: "\f8ff";
+}
+.glyphicon-erase:before {
+  content: "\e221";
+}
+.glyphicon-hourglass:before {
+  content: "\231b";
+}
+.glyphicon-lamp:before {
+  content: "\e223";
+}
+.glyphicon-duplicate:before {
+  content: "\e224";
+}
+.glyphicon-piggy-bank:before {
+  content: "\e225";
+}
+.glyphicon-scissors:before {
+  content: "\e226";
+}
+.glyphicon-bitcoin:before {
+  content: "\e227";
+}
+.glyphicon-btc:before {
+  content: "\e227";
+}
+.glyphicon-xbt:before {
+  content: "\e227";
+}
+.glyphicon-yen:before {
+  content: "\00a5";
+}
+.glyphicon-jpy:before {
+  content: "\00a5";
+}
+.glyphicon-ruble:before {
+  content: "\20bd";
+}
+.glyphicon-rub:before {
+  content: "\20bd";
+}
+.glyphicon-scale:before {
+  content: "\e230";
+}
+.glyphicon-ice-lolly:before {
+  content: "\e231";
+}
+.glyphicon-ice-lolly-tasted:before {
+  content: "\e232";
+}
+.glyphicon-education:before {
+  content: "\e233";
+}
+.glyphicon-option-horizontal:before {
+  content: "\e234";
+}
+.glyphicon-option-vertical:before {
+  content: "\e235";
+}
+.glyphicon-menu-hamburger:before {
+  content: "\e236";
+}
+.glyphicon-modal-window:before {
+  content: "\e237";
+}
+.glyphicon-oil:before {
+  content: "\e238";
+}
+.glyphicon-grain:before {
+  content: "\e239";
+}
+.glyphicon-sunglasses:before {
+  content: "\e240";
+}
+.glyphicon-text-size:before {
+  content: "\e241";
+}
+.glyphicon-text-color:before {
+  content: "\e242";
+}
+.glyphicon-text-background:before {
+  content: "\e243";
+}
+.glyphicon-object-align-top:before {
+  content: "\e244";
+}
+.glyphicon-object-align-bottom:before {
+  content: "\e245";
+}
+.glyphicon-object-align-horizontal:before {
+  content: "\e246";
+}
+.glyphicon-object-align-left:before {
+  content: "\e247";
+}
+.glyphicon-object-align-vertical:before {
+  content: "\e248";
+}
+.glyphicon-object-align-right:before {
+  content: "\e249";
+}
+.glyphicon-triangle-right:before {
+  content: "\e250";
+}
+.glyphicon-triangle-left:before {
+  content: "\e251";
+}
+.glyphicon-triangle-bottom:before {
+  content: "\e252";
+}
+.glyphicon-triangle-top:before {
+  content: "\e253";
+}
+.glyphicon-console:before {
+  content: "\e254";
+}
+.glyphicon-superscript:before {
+  content: "\e255";
+}
+.glyphicon-subscript:before {
+  content: "\e256";
+}
+.glyphicon-menu-left:before {
+  content: "\e257";
+}
+.glyphicon-menu-right:before {
+  content: "\e258";
+}
+.glyphicon-menu-down:before {
+  content: "\e259";
+}
+.glyphicon-menu-up:before {
+  content: "\e260";
+}
+* {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+html {
+  font-size: 10px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 16px;
+  line-height: 1.846;
+  color: #666666;
+  background-color: #ffffff;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+a {
+  color: #2196f3;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #0a6ebd;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+figure {
+  margin: 0;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 3px;
+}
+.img-thumbnail {
+  padding: 4px;
+  line-height: 1.846;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-radius: 3px;
+  -webkit-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 23px;
+  margin-bottom: 23px;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  margin: -1px;
+  padding: 0;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+[role="button"] {
+  cursor: pointer;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+  font-family: inherit;
+  font-weight: 400;
+  line-height: 1.1;
+  color: #444444;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+  font-weight: normal;
+  line-height: 1;
+  color: #bbbbbb;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+  margin-top: 23px;
+  margin-bottom: 11.5px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+  font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+  margin-top: 11.5px;
+  margin-bottom: 11.5px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+  font-size: 75%;
+}
+h1,
+.h1 {
+  font-size: 36px;
+}
+h2,
+.h2 {
+  font-size: 45px;
+}
+h3,
+.h3 {
+  font-size: 34px;
+}
+h4,
+.h4 {
+  font-size: 24px;
+}
+h5,
+.h5 {
+  font-size: 20px;
+}
+h6,
+.h6 {
+  font-size: 14px;
+}
+p {
+  margin: 0 0 11.5px;
+}
+.lead {
+  margin-bottom: 23px;
+  font-size: 14px;
+  font-weight: 300;
+  line-height: 1.4;
+}
+@media (min-width: 768px) {
+  .lead {
+    font-size: 19.5px;
+  }
+}
+small,
+.small {
+  font-size: 92%;
+}
+mark,
+.mark {
+  background-color: #ffe0b2;
+  padding: .2em;
+}
+.text-left {
+  text-align: left;
+}
+.text-right {
+  text-align: right;
+}
+.text-center {
+  text-align: center;
+}
+.text-justify {
+  text-align: justify;
+}
+.text-nowrap {
+  white-space: nowrap;
+}
+.text-lowercase {
+  text-transform: lowercase;
+}
+.text-uppercase {
+  text-transform: uppercase;
+}
+.text-capitalize {
+  text-transform: capitalize;
+}
+.text-muted {
+  color: #bbbbbb;
+}
+.text-primary {
+  color: #2196f3;
+}
+a.text-primary:hover,
+a.text-primary:focus {
+  color: #0c7cd5;
+}
+.text-success {
+  color: #4caf50;
+}
+a.text-success:hover,
+a.text-success:focus {
+  color: #3d8b40;
+}
+.text-info {
+  color: #9c27b0;
+}
+a.text-info:hover,
+a.text-info:focus {
+  color: #771e86;
+}
+.text-warning {
+  color: #ff9800;
+}
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #cc7a00;
+}
+.text-danger {
+  color: #e51c23;
+}
+a.text-danger:hover,
+a.text-danger:focus {
+  color: #b9151b;
+}
+.bg-primary {
+  color: #fff;
+  background-color: #2196f3;
+}
+a.bg-primary:hover,
+a.bg-primary:focus {
+  background-color: #0c7cd5;
+}
+.bg-success {
+  background-color: #dff0d8;
+}
+a.bg-success:hover,
+a.bg-success:focus {
+  background-color: #c1e2b3;
+}
+.bg-info {
+  background-color: #e1bee7;
+}
+a.bg-info:hover,
+a.bg-info:focus {
+  background-color: #d099d9;
+}
+.bg-warning {
+  background-color: #ffe0b2;
+}
+a.bg-warning:hover,
+a.bg-warning:focus {
+  background-color: #ffcb7f;
+}
+.bg-danger {
+  background-color: #f9bdbb;
+}
+a.bg-danger:hover,
+a.bg-danger:focus {
+  background-color: #f5908c;
+}
+.page-header {
+  padding-bottom: 10.5px;
+  margin: 46px 0 23px;
+  border-bottom: 1px solid #eeeeee;
+}
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: 11.5px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+  margin-bottom: 0;
+}
+.list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+.list-inline {
+  padding-left: 0;
+  list-style: none;
+  margin-left: -5px;
+}
+.list-inline > li {
+  display: inline-block;
+  padding-left: 5px;
+  padding-right: 5px;
+}
+dl {
+  margin-top: 0;
+  margin-bottom: 23px;
+}
+dt,
+dd {
+  line-height: 1.846;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    clear: left;
+    text-align: right;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .dl-horizontal dd {
+    margin-left: 180px;
+  }
+}
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #bbbbbb;
+}
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 11.5px 23px;
+  margin: 0 0 23px;
+  font-size: 16.25px;
+  border-left: 5px solid #eeeeee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+  margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.846;
+  color: #bbbbbb;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+  content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+  text-align: right;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+  content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+  content: '\00A0 \2014';
+}
+address {
+  margin-bottom: 23px;
+  font-style: normal;
+  line-height: 1.846;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #c7254e;
+  background-color: #f9f2f4;
+  border-radius: 3px;
+}
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #ffffff;
+  background-color: #333333;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  font-weight: bold;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+pre {
+  display: block;
+  padding: 11px;
+  margin: 0 0 11.5px;
+  font-size: 12px;
+  line-height: 1.846;
+  word-break: break-all;
+  word-wrap: break-word;
+  color: #212121;
+  background-color: #f5f5f5;
+  border: 1px solid #cccccc;
+  border-radius: 3px;
+}
+pre code {
+  padding: 0;
+  font-size: inherit;
+  color: inherit;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border-radius: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+@media (min-width: 768px) {
+  .container {
+    width: 750px;
+  }
+}
+@media (min-width: 992px) {
+  .container {
+    width: 970px;
+  }
+}
+@media (min-width: 1200px) {
+  .container {
+    width: 1170px;
+  }
+}
+.container-fluid {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.row {
+  margin-left: -15px;
+  margin-right: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: left;
+}
+.col-xs-12 {
+  width: 100%;
+}
+.col-xs-11 {
+  width: 91.66666667%;
+}
+.col-xs-10 {
+  width: 83.33333333%;
+}
+.col-xs-9 {
+  width: 75%;
+}
+.col-xs-8 {
+  width: 66.66666667%;
+}
+.col-xs-7 {
+  width: 58.33333333%;
+}
+.col-xs-6 {
+  width: 50%;
+}
+.col-xs-5 {
+  width: 41.66666667%;
+}
+.col-xs-4 {
+  width: 33.33333333%;
+}
+.col-xs-3 {
+  width: 25%;
+}
+.col-xs-2 {
+  width: 16.66666667%;
+}
+.col-xs-1 {
+  width: 8.33333333%;
+}
+.col-xs-pull-12 {
+  right: 100%;
+}
+.col-xs-pull-11 {
+  right: 91.66666667%;
+}
+.col-xs-pull-10 {
+  right: 83.33333333%;
+}
+.col-xs-pull-9 {
+  right: 75%;
+}
+.col-xs-pull-8 {
+  right: 66.66666667%;
+}
+.col-xs-pull-7 {
+  right: 58.33333333%;
+}
+.col-xs-pull-6 {
+  right: 50%;
+}
+.col-xs-pull-5 {
+  right: 41.66666667%;
+}
+.col-xs-pull-4 {
+  right: 33.33333333%;
+}
+.col-xs-pull-3 {
+  right: 25%;
+}
+.col-xs-pull-2 {
+  right: 16.66666667%;
+}
+.col-xs-pull-1 {
+  right: 8.33333333%;
+}
+.col-xs-pull-0 {
+  right: auto;
+}
+.col-xs-push-12 {
+  left: 100%;
+}
+.col-xs-push-11 {
+  left: 91.66666667%;
+}
+.col-xs-push-10 {
+  left: 83.33333333%;
+}
+.col-xs-push-9 {
+  left: 75%;
+}
+.col-xs-push-8 {
+  left: 66.66666667%;
+}
+.col-xs-push-7 {
+  left: 58.33333333%;
+}
+.col-xs-push-6 {
+  left: 50%;
+}
+.col-xs-push-5 {
+  left: 41.66666667%;
+}
+.col-xs-push-4 {
+  left: 33.33333333%;
+}
+.col-xs-push-3 {
+  left: 25%;
+}
+.col-xs-push-2 {
+  left: 16.66666667%;
+}
+.col-xs-push-1 {
+  left: 8.33333333%;
+}
+.col-xs-push-0 {
+  left: auto;
+}
+.col-xs-offset-12 {
+  margin-left: 100%;
+}
+.col-xs-offset-11 {
+  margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+  margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+  margin-left: 75%;
+}
+.col-xs-offset-8 {
+  margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+  margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+  margin-left: 50%;
+}
+.col-xs-offset-5 {
+  margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+  margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+  margin-left: 25%;
+}
+.col-xs-offset-2 {
+  margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+  margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+  margin-left: 0%;
+}
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left;
+  }
+  .col-sm-12 {
+    width: 100%;
+  }
+  .col-sm-11 {
+    width: 91.66666667%;
+  }
+  .col-sm-10 {
+    width: 83.33333333%;
+  }
+  .col-sm-9 {
+    width: 75%;
+  }
+  .col-sm-8 {
+    width: 66.66666667%;
+  }
+  .col-sm-7 {
+    width: 58.33333333%;
+  }
+  .col-sm-6 {
+    width: 50%;
+  }
+  .col-sm-5 {
+    width: 41.66666667%;
+  }
+  .col-sm-4 {
+    width: 33.33333333%;
+  }
+  .col-sm-3 {
+    width: 25%;
+  }
+  .col-sm-2 {
+    width: 16.66666667%;
+  }
+  .col-sm-1 {
+    width: 8.33333333%;
+  }
+  .col-sm-pull-12 {
+    right: 100%;
+  }
+  .col-sm-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-sm-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-sm-pull-9 {
+    right: 75%;
+  }
+  .col-sm-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-sm-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-sm-pull-6 {
+    right: 50%;
+  }
+  .col-sm-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-sm-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-sm-pull-3 {
+    right: 25%;
+  }
+  .col-sm-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-sm-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-sm-pull-0 {
+    right: auto;
+  }
+  .col-sm-push-12 {
+    left: 100%;
+  }
+  .col-sm-push-11 {
+    left: 91.66666667%;
+  }
+  .col-sm-push-10 {
+    left: 83.33333333%;
+  }
+  .col-sm-push-9 {
+    left: 75%;
+  }
+  .col-sm-push-8 {
+    left: 66.66666667%;
+  }
+  .col-sm-push-7 {
+    left: 58.33333333%;
+  }
+  .col-sm-push-6 {
+    left: 50%;
+  }
+  .col-sm-push-5 {
+    left: 41.66666667%;
+  }
+  .col-sm-push-4 {
+    left: 33.33333333%;
+  }
+  .col-sm-push-3 {
+    left: 25%;
+  }
+  .col-sm-push-2 {
+    left: 16.66666667%;
+  }
+  .col-sm-push-1 {
+    left: 8.33333333%;
+  }
+  .col-sm-push-0 {
+    left: auto;
+  }
+  .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+  .col-sm-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-sm-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+  .col-sm-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-sm-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+  .col-sm-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-sm-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+  .col-sm-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-sm-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-sm-offset-0 {
+    margin-left: 0%;
+  }
+}
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left;
+  }
+  .col-md-12 {
+    width: 100%;
+  }
+  .col-md-11 {
+    width: 91.66666667%;
+  }
+  .col-md-10 {
+    width: 83.33333333%;
+  }
+  .col-md-9 {
+    width: 75%;
+  }
+  .col-md-8 {
+    width: 66.66666667%;
+  }
+  .col-md-7 {
+    width: 58.33333333%;
+  }
+  .col-md-6 {
+    width: 50%;
+  }
+  .col-md-5 {
+    width: 41.66666667%;
+  }
+  .col-md-4 {
+    width: 33.33333333%;
+  }
+  .col-md-3 {
+    width: 25%;
+  }
+  .col-md-2 {
+    width: 16.66666667%;
+  }
+  .col-md-1 {
+    width: 8.33333333%;
+  }
+  .col-md-pull-12 {
+    right: 100%;
+  }
+  .col-md-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-md-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-md-pull-9 {
+    right: 75%;
+  }
+  .col-md-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-md-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-md-pull-6 {
+    right: 50%;
+  }
+  .col-md-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-md-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-md-pull-3 {
+    right: 25%;
+  }
+  .col-md-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-md-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-md-pull-0 {
+    right: auto;
+  }
+  .col-md-push-12 {
+    left: 100%;
+  }
+  .col-md-push-11 {
+    left: 91.66666667%;
+  }
+  .col-md-push-10 {
+    left: 83.33333333%;
+  }
+  .col-md-push-9 {
+    left: 75%;
+  }
+  .col-md-push-8 {
+    left: 66.66666667%;
+  }
+  .col-md-push-7 {
+    left: 58.33333333%;
+  }
+  .col-md-push-6 {
+    left: 50%;
+  }
+  .col-md-push-5 {
+    left: 41.66666667%;
+  }
+  .col-md-push-4 {
+    left: 33.33333333%;
+  }
+  .col-md-push-3 {
+    left: 25%;
+  }
+  .col-md-push-2 {
+    left: 16.66666667%;
+  }
+  .col-md-push-1 {
+    left: 8.33333333%;
+  }
+  .col-md-push-0 {
+    left: auto;
+  }
+  .col-md-offset-12 {
+    margin-left: 100%;
+  }
+  .col-md-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-md-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-md-offset-9 {
+    margin-left: 75%;
+  }
+  .col-md-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-md-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-md-offset-6 {
+    margin-left: 50%;
+  }
+  .col-md-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-md-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-md-offset-3 {
+    margin-left: 25%;
+  }
+  .col-md-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-md-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-md-offset-0 {
+    margin-left: 0%;
+  }
+}
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left;
+  }
+  .col-lg-12 {
+    width: 100%;
+  }
+  .col-lg-11 {
+    width: 91.66666667%;
+  }
+  .col-lg-10 {
+    width: 83.33333333%;
+  }
+  .col-lg-9 {
+    width: 75%;
+  }
+  .col-lg-8 {
+    width: 66.66666667%;
+  }
+  .col-lg-7 {
+    width: 58.33333333%;
+  }
+  .col-lg-6 {
+    width: 50%;
+  }
+  .col-lg-5 {
+    width: 41.66666667%;
+  }
+  .col-lg-4 {
+    width: 33.33333333%;
+  }
+  .col-lg-3 {
+    width: 25%;
+  }
+  .col-lg-2 {
+    width: 16.66666667%;
+  }
+  .col-lg-1 {
+    width: 8.33333333%;
+  }
+  .col-lg-pull-12 {
+    right: 100%;
+  }
+  .col-lg-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-lg-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-lg-pull-9 {
+    right: 75%;
+  }
+  .col-lg-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-lg-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-lg-pull-6 {
+    right: 50%;
+  }
+  .col-lg-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-lg-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-lg-pull-3 {
+    right: 25%;
+  }
+  .col-lg-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-lg-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-lg-pull-0 {
+    right: auto;
+  }
+  .col-lg-push-12 {
+    left: 100%;
+  }
+  .col-lg-push-11 {
+    left: 91.66666667%;
+  }
+  .col-lg-push-10 {
+    left: 83.33333333%;
+  }
+  .col-lg-push-9 {
+    left: 75%;
+  }
+  .col-lg-push-8 {
+    left: 66.66666667%;
+  }
+  .col-lg-push-7 {
+    left: 58.33333333%;
+  }
+  .col-lg-push-6 {
+    left: 50%;
+  }
+  .col-lg-push-5 {
+    left: 41.66666667%;
+  }
+  .col-lg-push-4 {
+    left: 33.33333333%;
+  }
+  .col-lg-push-3 {
+    left: 25%;
+  }
+  .col-lg-push-2 {
+    left: 16.66666667%;
+  }
+  .col-lg-push-1 {
+    left: 8.33333333%;
+  }
+  .col-lg-push-0 {
+    left: auto;
+  }
+  .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+  .col-lg-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-lg-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+  .col-lg-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-lg-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+  .col-lg-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-lg-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+  .col-lg-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-lg-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-lg-offset-0 {
+    margin-left: 0%;
+  }
+}
+table {
+  background-color: transparent;
+}
+caption {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  color: #bbbbbb;
+  text-align: left;
+}
+th {
+  text-align: left;
+}
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 23px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+  padding: 8px;
+  line-height: 1.846;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+.table > thead > tr > th {
+  vertical-align: bottom;
+  border-bottom: 2px solid #dddddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+  border-top: 0;
+}
+.table > tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+.table .table {
+  background-color: #ffffff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+  padding: 5px;
+}
+.table-bordered {
+  border: 1px solid #dddddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+  border: 1px solid #dddddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+  border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-of-type(odd) {
+  background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover {
+  background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+  position: static;
+  float: none;
+  display: table-column;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+  position: static;
+  float: none;
+  display: table-cell;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+  background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+  background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+  background-color: #e1bee7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+  background-color: #d8abe0;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+  background-color: #ffe0b2;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+  background-color: #ffd699;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+  background-color: #f9bdbb;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+  background-color: #f7a6a4;
+}
+.table-responsive {
+  overflow-x: auto;
+  min-height: 0.01%;
+}
+@media screen and (max-width: 767px) {
+  .table-responsive {
+    width: 100%;
+    margin-bottom: 17.25px;
+    overflow-y: hidden;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    border: 1px solid #dddddd;
+  }
+  .table-responsive > .table {
+    margin-bottom: 0;
+  }
+  .table-responsive > .table > thead > tr > th,
+  .table-responsive > .table > tbody > tr > th,
+  .table-responsive > .table > tfoot > tr > th,
+  .table-responsive > .table > thead > tr > td,
+  .table-responsive > .table > tbody > tr > td,
+  .table-responsive > .table > tfoot > tr > td {
+    white-space: nowrap;
+  }
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
+}
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+  min-width: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 23px;
+  font-size: 19.5px;
+  line-height: inherit;
+  color: #212121;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal;
+}
+input[type="file"] {
+  display: block;
+}
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 13px;
+  line-height: 1.846;
+  color: #666666;
+}
+.form-control {
+  display: block;
+  width: 100%;
+  height: 37px;
+  padding: 6px 16px;
+  font-size: 13px;
+  line-height: 1.846;
+  color: #666666;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.form-control:focus {
+  border-color: #66afe9;
+  outline: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+.form-control::-moz-placeholder {
+  color: #bbbbbb;
+  opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+  color: #bbbbbb;
+}
+.form-control::-webkit-input-placeholder {
+  color: #bbbbbb;
+}
+.form-control::-ms-expand {
+  border: 0;
+  background-color: transparent;
+}
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+  background-color: transparent;
+  opacity: 1;
+}
+.form-control[disabled],
+fieldset[disabled] .form-control {
+  cursor: not-allowed;
+}
+textarea.form-control {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-appearance: none;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"].form-control,
+  input[type="time"].form-control,
+  input[type="datetime-local"].form-control,
+  input[type="month"].form-control {
+    line-height: 37px;
+  }
+  input[type="date"].input-sm,
+  input[type="time"].input-sm,
+  input[type="datetime-local"].input-sm,
+  input[type="month"].input-sm,
+  .input-group-sm input[type="date"],
+  .input-group-sm input[type="time"],
+  .input-group-sm input[type="datetime-local"],
+  .input-group-sm input[type="month"] {
+    line-height: 30px;
+  }
+  input[type="date"].input-lg,
+  input[type="time"].input-lg,
+  input[type="datetime-local"].input-lg,
+  input[type="month"].input-lg,
+  .input-group-lg input[type="date"],
+  .input-group-lg input[type="time"],
+  .input-group-lg input[type="datetime-local"],
+  .input-group-lg input[type="month"] {
+    line-height: 45px;
+  }
+}
+.form-group {
+  margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+  min-height: 23px;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-left: -20px;
+  margin-top: 4px \9;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+  position: relative;
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  vertical-align: middle;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+  cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+  cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+  cursor: not-allowed;
+}
+.form-control-static {
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0;
+  min-height: 36px;
+}
+.form-control-static.input-lg,
+.form-control-static.input-sm {
+  padding-left: 0;
+  padding-right: 0;
+}
+.input-sm {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-sm {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+  height: auto;
+}
+.form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.form-group-sm select.form-control {
+  height: 30px;
+  line-height: 30px;
+}
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+  height: auto;
+}
+.form-group-sm .form-control-static {
+  height: 30px;
+  min-height: 35px;
+  padding: 6px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.input-lg {
+  height: 45px;
+  padding: 10px 16px;
+  font-size: 17px;
+  line-height: 1.3333333;
+  border-radius: 3px;
+}
+select.input-lg {
+  height: 45px;
+  line-height: 45px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+  height: auto;
+}
+.form-group-lg .form-control {
+  height: 45px;
+  padding: 10px 16px;
+  font-size: 17px;
+  line-height: 1.3333333;
+  border-radius: 3px;
+}
+.form-group-lg select.form-control {
+  height: 45px;
+  line-height: 45px;
+}
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+  height: auto;
+}
+.form-group-lg .form-control-static {
+  height: 45px;
+  min-height: 40px;
+  padding: 11px 16px;
+  font-size: 17px;
+  line-height: 1.3333333;
+}
+.has-feedback {
+  position: relative;
+}
+.has-feedback .form-control {
+  padding-right: 46.25px;
+}
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 37px;
+  height: 37px;
+  line-height: 37px;
+  text-align: center;
+  pointer-events: none;
+}
+.input-lg + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+  width: 45px;
+  height: 45px;
+  line-height: 45px;
+}
+.input-sm + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+  color: #4caf50;
+}
+.has-success .form-control {
+  border-color: #4caf50;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-success .form-control:focus {
+  border-color: #3d8b40;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #92cf94;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #92cf94;
+}
+.has-success .input-group-addon {
+  color: #4caf50;
+  border-color: #4caf50;
+  background-color: #dff0d8;
+}
+.has-success .form-control-feedback {
+  color: #4caf50;
+}
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+  color: #ff9800;
+}
+.has-warning .form-control {
+  border-color: #ff9800;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-warning .form-control:focus {
+  border-color: #cc7a00;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffc166;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ffc166;
+}
+.has-warning .input-group-addon {
+  color: #ff9800;
+  border-color: #ff9800;
+  background-color: #ffe0b2;
+}
+.has-warning .form-control-feedback {
+  color: #ff9800;
+}
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+  color: #e51c23;
+}
+.has-error .form-control {
+  border-color: #e51c23;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.has-error .form-control:focus {
+  border-color: #b9151b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ef787c;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ef787c;
+}
+.has-error .input-group-addon {
+  color: #e51c23;
+  border-color: #e51c23;
+  background-color: #f9bdbb;
+}
+.has-error .form-control-feedback {
+  color: #e51c23;
+}
+.has-feedback label ~ .form-control-feedback {
+  top: 28px;
+}
+.has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0;
+}
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #a6a6a6;
+}
+@media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .form-control-static {
+    display: inline-block;
+  }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .form-inline .input-group .input-group-addon,
+  .form-inline .input-group .input-group-btn,
+  .form-inline .input-group .form-control {
+    width: auto;
+  }
+  .form-inline .input-group > .form-control {
+    width: 100%;
+  }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio,
+  .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio label,
+  .form-inline .checkbox label {
+    padding-left: 0;
+  }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  margin-top: 0;
+  margin-bottom: 0;
+  padding-top: 7px;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+  min-height: 30px;
+}
+.form-horizontal .form-group {
+  margin-left: -15px;
+  margin-right: -15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    text-align: right;
+    margin-bottom: 0;
+    padding-top: 7px;
+  }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+  right: 15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 11px;
+    font-size: 17px;
+  }
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+    font-size: 12px;
+  }
+}
+.btn {
+  display: inline-block;
+  margin-bottom: 0;
+  font-weight: normal;
+  text-align: center;
+  vertical-align: middle;
+  -ms-touch-action: manipulation;
+      touch-action: manipulation;
+  cursor: pointer;
+  background-image: none;
+  border: 1px solid transparent;
+  white-space: nowrap;
+  padding: 6px 16px;
+  font-size: 13px;
+  line-height: 1.846;
+  border-radius: 3px;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus,
+.btn.focus {
+  color: #444444;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  outline: 0;
+  background-image: none;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+a.btn.disabled,
+fieldset[disabled] a.btn {
+  pointer-events: none;
+}
+.btn-default {
+  color: #444444;
+  background-color: #ffffff;
+  border-color: transparent;
+}
+.btn-default:focus,
+.btn-default.focus {
+  color: #444444;
+  background-color: #e6e6e6;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-default:hover {
+  color: #444444;
+  background-color: #e6e6e6;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  color: #444444;
+  background-color: #e6e6e6;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-default:active:hover,
+.btn-default.active:hover,
+.open > .dropdown-toggle.btn-default:hover,
+.btn-default:active:focus,
+.btn-default.active:focus,
+.open > .dropdown-toggle.btn-default:focus,
+.btn-default:active.focus,
+.btn-default.active.focus,
+.open > .dropdown-toggle.btn-default.focus {
+  color: #444444;
+  background-color: #d4d4d4;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus {
+  background-color: #ffffff;
+  border-color: transparent;
+}
+.btn-default .badge {
+  color: #ffffff;
+  background-color: #444444;
+}
+.btn-primary {
+  color: #ffffff;
+  background-color: #2196f3;
+  border-color: transparent;
+}
+.btn-primary:focus,
+.btn-primary.focus {
+  color: #ffffff;
+  background-color: #0c7cd5;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-primary:hover {
+  color: #ffffff;
+  background-color: #0c7cd5;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  color: #ffffff;
+  background-color: #0c7cd5;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.open > .dropdown-toggle.btn-primary:hover,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.open > .dropdown-toggle.btn-primary:focus,
+.btn-primary:active.focus,
+.btn-primary.active.focus,
+.open > .dropdown-toggle.btn-primary.focus {
+  color: #ffffff;
+  background-color: #0a68b4;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus {
+  background-color: #2196f3;
+  border-color: transparent;
+}
+.btn-primary .badge {
+  color: #2196f3;
+  background-color: #ffffff;
+}
+.btn-success {
+  color: #ffffff;
+  background-color: #4caf50;
+  border-color: transparent;
+}
+.btn-success:focus,
+.btn-success.focus {
+  color: #ffffff;
+  background-color: #3d8b40;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-success:hover {
+  color: #ffffff;
+  background-color: #3d8b40;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  color: #ffffff;
+  background-color: #3d8b40;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-success:active:hover,
+.btn-success.active:hover,
+.open > .dropdown-toggle.btn-success:hover,
+.btn-success:active:focus,
+.btn-success.active:focus,
+.open > .dropdown-toggle.btn-success:focus,
+.btn-success:active.focus,
+.btn-success.active.focus,
+.open > .dropdown-toggle.btn-success.focus {
+  color: #ffffff;
+  background-color: #327334;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus {
+  background-color: #4caf50;
+  border-color: transparent;
+}
+.btn-success .badge {
+  color: #4caf50;
+  background-color: #ffffff;
+}
+.btn-info {
+  color: #ffffff;
+  background-color: #9c27b0;
+  border-color: transparent;
+}
+.btn-info:focus,
+.btn-info.focus {
+  color: #ffffff;
+  background-color: #771e86;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-info:hover {
+  color: #ffffff;
+  background-color: #771e86;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  color: #ffffff;
+  background-color: #771e86;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-info:active:hover,
+.btn-info.active:hover,
+.open > .dropdown-toggle.btn-info:hover,
+.btn-info:active:focus,
+.btn-info.active:focus,
+.open > .dropdown-toggle.btn-info:focus,
+.btn-info:active.focus,
+.btn-info.active.focus,
+.open > .dropdown-toggle.btn-info.focus {
+  color: #ffffff;
+  background-color: #5d1769;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus {
+  background-color: #9c27b0;
+  border-color: transparent;
+}
+.btn-info .badge {
+  color: #9c27b0;
+  background-color: #ffffff;
+}
+.btn-warning {
+  color: #ffffff;
+  background-color: #ff9800;
+  border-color: transparent;
+}
+.btn-warning:focus,
+.btn-warning.focus {
+  color: #ffffff;
+  background-color: #cc7a00;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-warning:hover {
+  color: #ffffff;
+  background-color: #cc7a00;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  color: #ffffff;
+  background-color: #cc7a00;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-warning:active:hover,
+.btn-warning.active:hover,
+.open > .dropdown-toggle.btn-warning:hover,
+.btn-warning:active:focus,
+.btn-warning.active:focus,
+.open > .dropdown-toggle.btn-warning:focus,
+.btn-warning:active.focus,
+.btn-warning.active.focus,
+.open > .dropdown-toggle.btn-warning.focus {
+  color: #ffffff;
+  background-color: #a86400;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus {
+  background-color: #ff9800;
+  border-color: transparent;
+}
+.btn-warning .badge {
+  color: #ff9800;
+  background-color: #ffffff;
+}
+.btn-danger {
+  color: #ffffff;
+  background-color: #e51c23;
+  border-color: transparent;
+}
+.btn-danger:focus,
+.btn-danger.focus {
+  color: #ffffff;
+  background-color: #b9151b;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-danger:hover {
+  color: #ffffff;
+  background-color: #b9151b;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  color: #ffffff;
+  background-color: #b9151b;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-danger:active:hover,
+.btn-danger.active:hover,
+.open > .dropdown-toggle.btn-danger:hover,
+.btn-danger:active:focus,
+.btn-danger.active:focus,
+.open > .dropdown-toggle.btn-danger:focus,
+.btn-danger:active.focus,
+.btn-danger.active.focus,
+.open > .dropdown-toggle.btn-danger.focus {
+  color: #ffffff;
+  background-color: #991216;
+  border-color: rgba(0, 0, 0, 0);
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus {
+  background-color: #e51c23;
+  border-color: transparent;
+}
+.btn-danger .badge {
+  color: #e51c23;
+  background-color: #ffffff;
+}
+.btn-link {
+  color: #2196f3;
+  font-weight: normal;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #0a6ebd;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #bbbbbb;
+  text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 17px;
+  line-height: 1.3333333;
+  border-radius: 3px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+  padding: 1px 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  display: none;
+}
+.collapse.in {
+  display: block;
+}
+tr.collapse.in {
+  display: table-row;
+}
+tbody.collapse.in {
+  display: table-row-group;
+}
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition-property: height, visibility;
+  -o-transition-property: height, visibility;
+     transition-property: height, visibility;
+  -webkit-transition-duration: 0.35s;
+  -o-transition-duration: 0.35s;
+     transition-duration: 0.35s;
+  -webkit-transition-timing-function: ease;
+  -o-transition-timing-function: ease;
+     transition-timing-function: ease;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px dashed;
+  border-top: 4px solid \9;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+}
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle:focus {
+  outline: 0;
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  font-size: 13px;
+  text-align: left;
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  border-radius: 3px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 10.5px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 1.846;
+  color: #666666;
+  white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  text-decoration: none;
+  color: #141414;
+  background-color: #eeeeee;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #ffffff;
+  text-decoration: none;
+  outline: 0;
+  background-color: #2196f3;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #bbbbbb;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  cursor: not-allowed;
+}
+.open > .dropdown-menu {
+  display: block;
+}
+.open > a {
+  outline: 0;
+}
+.dropdown-menu-right {
+  left: auto;
+  right: 0;
+}
+.dropdown-menu-left {
+  left: 0;
+  right: auto;
+}
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: 12px;
+  line-height: 1.846;
+  color: #bbbbbb;
+  white-space: nowrap;
+}
+.dropdown-backdrop {
+  position: fixed;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  top: 0;
+  z-index: 990;
+}
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px dashed;
+  border-bottom: 4px solid \9;
+  content: "";
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
+}
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    left: auto;
+    right: 0;
+  }
+  .navbar-right .dropdown-menu-left {
+    left: 0;
+    right: auto;
+  }
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar {
+  margin-left: -5px;
+}
+.btn-toolbar .btn,
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+  float: none;
+  display: table-cell;
+  width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+  width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+  left: auto;
+}
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+.input-group[class*="col-"] {
+  float: none;
+  padding-left: 0;
+  padding-right: 0;
+}
+.input-group .form-control {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+.input-group .form-control:focus {
+  z-index: 3;
+}
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  height: 45px;
+  padding: 10px 16px;
+  font-size: 17px;
+  line-height: 1.3333333;
+  border-radius: 3px;
+}
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+  height: 45px;
+  line-height: 45px;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.input-group-addon {
+  padding: 6px 16px;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  color: #666666;
+  text-align: center;
+  background-color: transparent;
+  border: 1px solid transparent;
+  border-radius: 3px;
+}
+.input-group-addon.input-sm {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+.input-group-addon.input-lg {
+  padding: 10px 16px;
+  font-size: 17px;
+  border-radius: 3px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-bottom-right-radius: 0;
+  border-top-right-radius: 0;
+}
+.input-group-addon:first-child {
+  border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-bottom-left-radius: 0;
+  border-top-left-radius: 0;
+}
+.input-group-addon:last-child {
+  border-left: 0;
+}
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-group-btn > .btn {
+  position: relative;
+}
+.input-group-btn > .btn + .btn {
+  margin-left: -1px;
+}
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+  z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  z-index: 2;
+  margin-left: -1px;
+}
+.nav {
+  margin-bottom: 0;
+  padding-left: 0;
+  list-style: none;
+}
+.nav > li {
+  position: relative;
+  display: block;
+}
+.nav > li > a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.nav > li.disabled > a {
+  color: #bbbbbb;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+  color: #bbbbbb;
+  text-decoration: none;
+  background-color: transparent;
+  cursor: not-allowed;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+  background-color: #eeeeee;
+  border-color: #2196f3;
+}
+.nav .nav-divider {
+  height: 1px;
+  margin: 10.5px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.nav > li > a > img {
+  max-width: none;
+}
+.nav-tabs {
+  border-bottom: 1px solid transparent;
+}
+.nav-tabs > li {
+  float: left;
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  margin-right: 2px;
+  line-height: 1.846;
+  border: 1px solid transparent;
+  border-radius: 3px 3px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee transparent;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+  color: #666666;
+  background-color: transparent;
+  border: 1px solid transparent;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+.nav-tabs.nav-justified {
+  width: 100%;
+  border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+  float: none;
+}
+.nav-tabs.nav-justified > li > a {
+  text-align: center;
+  margin-bottom: 5px;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-tabs.nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 3px;
+}
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li > a {
+    border-bottom: 1px solid transparent;
+    border-radius: 3px 3px 0 0;
+  }
+  .nav-tabs.nav-justified > .active > a,
+  .nav-tabs.nav-justified > .active > a:hover,
+  .nav-tabs.nav-justified > .active > a:focus {
+    border-bottom-color: #ffffff;
+  }
+}
+.nav-pills > li {
+  float: left;
+}
+.nav-pills > li > a {
+  border-radius: 3px;
+}
+.nav-pills > li + li {
+  margin-left: 2px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+  color: #ffffff;
+  background-color: #2196f3;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li + li {
+  margin-top: 2px;
+  margin-left: 0;
+}
+.nav-justified {
+  width: 100%;
+}
+.nav-justified > li {
+  float: none;
+}
+.nav-justified > li > a {
+  text-align: center;
+  margin-bottom: 5px;
+}
+.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs-justified {
+  border-bottom: 0;
+}
+.nav-tabs-justified > li > a {
+  margin-right: 0;
+  border-radius: 3px;
+}
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+  border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+  .nav-tabs-justified > li > a {
+    border-bottom: 1px solid transparent;
+    border-radius: 3px 3px 0 0;
+  }
+  .nav-tabs-justified > .active > a,
+  .nav-tabs-justified > .active > a:hover,
+  .nav-tabs-justified > .active > a:focus {
+    border-bottom-color: #ffffff;
+  }
+}
+.tab-content > .tab-pane {
+  display: none;
+}
+.tab-content > .active {
+  display: block;
+}
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.navbar {
+  position: relative;
+  min-height: 64px;
+  margin-bottom: 23px;
+  border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+  .navbar {
+    border-radius: 3px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-header {
+    float: left;
+  }
+}
+.navbar-collapse {
+  overflow-x: visible;
+  padding-right: 15px;
+  padding-left: 15px;
+  border-top: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+  -webkit-overflow-scrolling: touch;
+}
+.navbar-collapse.in {
+  overflow-y: auto;
+}
+@media (min-width: 768px) {
+  .navbar-collapse {
+    width: auto;
+    border-top: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-collapse.collapse {
+    display: block !important;
+    height: auto !important;
+    padding-bottom: 0;
+    overflow: visible !important;
+  }
+  .navbar-collapse.in {
+    overflow-y: visible;
+  }
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-static-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    padding-left: 0;
+    padding-right: 0;
+  }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+@media (max-device-width: 480px) and (orientation: landscape) {
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .container > .navbar-header,
+  .container-fluid > .navbar-header,
+  .container > .navbar-collapse,
+  .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
+}
+.navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+  .navbar-static-top {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+@media (min-width: 768px) {
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0;
+  border-width: 1px 0 0;
+}
+.navbar-brand {
+  float: left;
+  padding: 20.5px 15px;
+  font-size: 17px;
+  line-height: 23px;
+  height: 64px;
+}
+.navbar-brand:hover,
+.navbar-brand:focus {
+  text-decoration: none;
+}
+.navbar-brand > img {
+  display: block;
+}
+@media (min-width: 768px) {
+  .navbar > .container .navbar-brand,
+  .navbar > .container-fluid .navbar-brand {
+    margin-left: -15px;
+  }
+}
+.navbar-toggle {
+  position: relative;
+  float: right;
+  margin-right: 15px;
+  padding: 9px 10px;
+  margin-top: 15px;
+  margin-bottom: 15px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 3px;
+}
+.navbar-toggle:focus {
+  outline: 0;
+}
+.navbar-toggle .icon-bar {
+  display: block;
+  width: 22px;
+  height: 2px;
+  border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+  margin-top: 4px;
+}
+@media (min-width: 768px) {
+  .navbar-toggle {
+    display: none;
+  }
+}
+.navbar-nav {
+  margin: 10.25px -15px;
+}
+.navbar-nav > li > a {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  line-height: 23px;
+}
+@media (max-width: 767px) {
+  .navbar-nav .open .dropdown-menu {
+    position: static;
+    float: none;
+    width: auto;
+    margin-top: 0;
+    background-color: transparent;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-nav .open .dropdown-menu > li > a,
+  .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 5px 15px 5px 25px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a {
+    line-height: 23px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-nav .open .dropdown-menu > li > a:focus {
+    background-image: none;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-nav {
+    float: left;
+    margin: 0;
+  }
+  .navbar-nav > li {
+    float: left;
+  }
+  .navbar-nav > li > a {
+    padding-top: 20.5px;
+    padding-bottom: 20.5px;
+  }
+}
+.navbar-form {
+  margin-left: -15px;
+  margin-right: -15px;
+  padding: 10px 15px;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  margin-top: 13.5px;
+  margin-bottom: 13.5px;
+}
+@media (min-width: 768px) {
+  .navbar-form .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control-static {
+    display: inline-block;
+  }
+  .navbar-form .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .navbar-form .input-group .input-group-addon,
+  .navbar-form .input-group .input-group-btn,
+  .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio,
+  .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio label,
+  .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  .navbar-form .radio input[type="radio"],
+  .navbar-form .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+@media (max-width: 767px) {
+  .navbar-form .form-group {
+    margin-bottom: 5px;
+  }
+  .navbar-form .form-group:last-child {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-form {
+    width: auto;
+    border: 0;
+    margin-left: 0;
+    margin-right: 0;
+    padding-top: 0;
+    padding-bottom: 0;
+    -webkit-box-shadow: none;
+    box-shadow: none;
+  }
+}
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.navbar-btn {
+  margin-top: 13.5px;
+  margin-bottom: 13.5px;
+}
+.navbar-btn.btn-sm {
+  margin-top: 17px;
+  margin-bottom: 17px;
+}
+.navbar-btn.btn-xs {
+  margin-top: 21px;
+  margin-bottom: 21px;
+}
+.navbar-text {
+  margin-top: 20.5px;
+  margin-bottom: 20.5px;
+}
+@media (min-width: 768px) {
+  .navbar-text {
+    float: left;
+    margin-left: 15px;
+    margin-right: 15px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-left {
+    float: left !important;
+  }
+  .navbar-right {
+    float: right !important;
+    margin-right: -15px;
+  }
+  .navbar-right ~ .navbar-right {
+    margin-right: 0;
+  }
+}
+.navbar-default {
+  background-color: #ffffff;
+  border-color: transparent;
+}
+.navbar-default .navbar-brand {
+  color: #666666;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+  color: #212121;
+  background-color: transparent;
+}
+.navbar-default .navbar-text {
+  color: #bbbbbb;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #666666;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+  color: #212121;
+  background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+  color: #212121;
+  background-color: #eeeeee;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+  color: #cccccc;
+  background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+  border-color: transparent;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+  background-color: transparent;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: rgba(0, 0, 0, 0.5);
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: transparent;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+  background-color: #eeeeee;
+  color: #212121;
+}
+@media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #666666;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #212121;
+    background-color: transparent;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #212121;
+    background-color: #eeeeee;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #cccccc;
+    background-color: transparent;
+  }
+}
+.navbar-default .navbar-link {
+  color: #666666;
+}
+.navbar-default .navbar-link:hover {
+  color: #212121;
+}
+.navbar-default .btn-link {
+  color: #666666;
+}
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+  color: #212121;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+  color: #cccccc;
+}
+.navbar-inverse {
+  background-color: #2196f3;
+  border-color: transparent;
+}
+.navbar-inverse .navbar-brand {
+  color: #b2dbfb;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+  color: #ffffff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+  color: #bbbbbb;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #b2dbfb;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+  color: #ffffff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+  color: #ffffff;
+  background-color: #0c7cd5;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+  color: #444444;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+  border-color: transparent;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+  background-color: transparent;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+  background-color: rgba(0, 0, 0, 0.5);
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+  border-color: #0c84e4;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+  background-color: #0c7cd5;
+  color: #ffffff;
+}
+@media (max-width: 767px) {
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+    border-color: transparent;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+    background-color: transparent;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+    color: #b2dbfb;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #ffffff;
+    background-color: transparent;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #ffffff;
+    background-color: #0c7cd5;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #444444;
+    background-color: transparent;
+  }
+}
+.navbar-inverse .navbar-link {
+  color: #b2dbfb;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #ffffff;
+}
+.navbar-inverse .btn-link {
+  color: #b2dbfb;
+}
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+  color: #ffffff;
+}
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+  color: #444444;
+}
+.breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 23px;
+  list-style: none;
+  background-color: #f5f5f5;
+  border-radius: 3px;
+}
+.breadcrumb > li {
+  display: inline-block;
+}
+.breadcrumb > li + li:before {
+  content: "/\00a0";
+  padding: 0 5px;
+  color: #cccccc;
+}
+.breadcrumb > .active {
+  color: #bbbbbb;
+}
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: 23px 0;
+  border-radius: 3px;
+}
+.pagination > li {
+  display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+  position: relative;
+  float: left;
+  padding: 6px 16px;
+  line-height: 1.846;
+  text-decoration: none;
+  color: #2196f3;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  margin-left: -1px;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+  margin-left: 0;
+  border-bottom-left-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+  border-bottom-right-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+  z-index: 2;
+  color: #0a6ebd;
+  background-color: #eeeeee;
+  border-color: #dddddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+  z-index: 3;
+  color: #ffffff;
+  background-color: #2196f3;
+  border-color: #2196f3;
+  cursor: default;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+  color: #bbbbbb;
+  background-color: #ffffff;
+  border-color: #dddddd;
+  cursor: not-allowed;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+  padding: 10px 16px;
+  font-size: 17px;
+  line-height: 1.3333333;
+}
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+  border-bottom-left-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+  border-bottom-right-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+  border-bottom-left-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+  border-bottom-right-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.pager {
+  padding-left: 0;
+  margin: 23px 0;
+  list-style: none;
+  text-align: center;
+}
+.pager li {
+  display: inline;
+}
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #bbbbbb;
+  background-color: #ffffff;
+  cursor: not-allowed;
+}
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: #ffffff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+}
+a.label:hover,
+a.label:focus {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label:empty {
+  display: none;
+}
+.btn .label {
+  position: relative;
+  top: -1px;
+}
+.label-default {
+  background-color: #bbbbbb;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+  background-color: #a2a2a2;
+}
+.label-primary {
+  background-color: #2196f3;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+  background-color: #0c7cd5;
+}
+.label-success {
+  background-color: #4caf50;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+  background-color: #3d8b40;
+}
+.label-info {
+  background-color: #9c27b0;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+  background-color: #771e86;
+}
+.label-warning {
+  background-color: #ff9800;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+  background-color: #cc7a00;
+}
+.label-danger {
+  background-color: #e51c23;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+  background-color: #b9151b;
+}
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: 12px;
+  font-weight: normal;
+  color: #ffffff;
+  line-height: 1;
+  vertical-align: middle;
+  white-space: nowrap;
+  text-align: center;
+  background-color: #bbbbbb;
+  border-radius: 10px;
+}
+.badge:empty {
+  display: none;
+}
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-xs .badge,
+.btn-group-xs > .btn .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+  color: #2196f3;
+  background-color: #ffffff;
+}
+.list-group-item > .badge {
+  float: right;
+}
+.list-group-item > .badge + .badge {
+  margin-right: 5px;
+}
+.nav-pills > li > a > .badge {
+  margin-left: 3px;
+}
+.jumbotron {
+  padding-top: 30px;
+  padding-bottom: 30px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: #f9f9f9;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+  color: #444444;
+}
+.jumbotron p {
+  margin-bottom: 15px;
+  font-size: 20px;
+  font-weight: 200;
+}
+.jumbotron > hr {
+  border-top-color: #e0e0e0;
+}
+.container .jumbotron,
+.container-fluid .jumbotron {
+  border-radius: 3px;
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.jumbotron .container {
+  max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+  .jumbotron {
+    padding-top: 48px;
+    padding-bottom: 48px;
+  }
+  .container .jumbotron,
+  .container-fluid .jumbotron {
+    padding-left: 60px;
+    padding-right: 60px;
+  }
+  .jumbotron h1,
+  .jumbotron .h1 {
+    font-size: 59px;
+  }
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  margin-bottom: 23px;
+  line-height: 1.846;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-radius: 3px;
+  -webkit-transition: border 0.2s ease-in-out;
+  -o-transition: border 0.2s ease-in-out;
+  transition: border 0.2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+  margin-left: auto;
+  margin-right: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: #2196f3;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #666666;
+}
+.alert {
+  padding: 15px;
+  margin-bottom: 23px;
+  border: 1px solid transparent;
+  border-radius: 3px;
+}
+.alert h4 {
+  margin-top: 0;
+  color: inherit;
+}
+.alert .alert-link {
+  font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+  margin-bottom: 0;
+}
+.alert > p + p {
+  margin-top: 5px;
+}
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
+}
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+  color: #4caf50;
+}
+.alert-success hr {
+  border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+  color: #3d8b40;
+}
+.alert-info {
+  background-color: #e1bee7;
+  border-color: #cba4dd;
+  color: #9c27b0;
+}
+.alert-info hr {
+  border-top-color: #c191d6;
+}
+.alert-info .alert-link {
+  color: #771e86;
+}
+.alert-warning {
+  background-color: #ffe0b2;
+  border-color: #ffc599;
+  color: #ff9800;
+}
+.alert-warning hr {
+  border-top-color: #ffb67f;
+}
+.alert-warning .alert-link {
+  color: #cc7a00;
+}
+.alert-danger {
+  background-color: #f9bdbb;
+  border-color: #f7a4af;
+  color: #e51c23;
+}
+.alert-danger hr {
+  border-top-color: #f58c9a;
+}
+.alert-danger .alert-link {
+  color: #b9151b;
+}
+@-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;
+  }
+}
+.progress {
+  overflow: hidden;
+  height: 23px;
+  margin-bottom: 23px;
+  background-color: #f5f5f5;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+.progress-bar {
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: 12px;
+  line-height: 23px;
+  color: #ffffff;
+  text-align: center;
+  background-color: #2196f3;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-transition: width 0.6s ease;
+  -o-transition: width 0.6s ease;
+  transition: width 0.6s ease;
+}
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+.progress.active .progress-bar,
+.progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+  -o-animation: progress-bar-stripes 2s linear infinite;
+  animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar-success {
+  background-color: #4caf50;
+}
+.progress-striped .progress-bar-success {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-info {
+  background-color: #9c27b0;
+}
+.progress-striped .progress-bar-info {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-warning {
+  background-color: #ff9800;
+}
+.progress-striped .progress-bar-warning {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-danger {
+  background-color: #e51c23;
+}
+.progress-striped .progress-bar-danger {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.media {
+  margin-top: 15px;
+}
+.media:first-child {
+  margin-top: 0;
+}
+.media,
+.media-body {
+  zoom: 1;
+  overflow: hidden;
+}
+.media-body {
+  width: 10000px;
+}
+.media-object {
+  display: block;
+}
+.media-object.img-thumbnail {
+  max-width: none;
+}
+.media-right,
+.media > .pull-right {
+  padding-left: 10px;
+}
+.media-left,
+.media > .pull-left {
+  padding-right: 10px;
+}
+.media-left,
+.media-right,
+.media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+.media-middle {
+  vertical-align: middle;
+}
+.media-bottom {
+  vertical-align: bottom;
+}
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.media-list {
+  padding-left: 0;
+  list-style: none;
+}
+.list-group {
+  margin-bottom: 20px;
+  padding-left: 0;
+}
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+}
+.list-group-item:first-child {
+  border-top-right-radius: 3px;
+  border-top-left-radius: 3px;
+}
+.list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+a.list-group-item,
+button.list-group-item {
+  color: #555555;
+}
+a.list-group-item .list-group-item-heading,
+button.list-group-item .list-group-item-heading {
+  color: #333333;
+}
+a.list-group-item:hover,
+button.list-group-item:hover,
+a.list-group-item:focus,
+button.list-group-item:focus {
+  text-decoration: none;
+  color: #555555;
+  background-color: #f5f5f5;
+}
+button.list-group-item {
+  width: 100%;
+  text-align: left;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+  background-color: #eeeeee;
+  color: #bbbbbb;
+  cursor: not-allowed;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+  color: #bbbbbb;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  z-index: 2;
+  color: #ffffff;
+  background-color: #2196f3;
+  border-color: #2196f3;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+  color: #e3f2fd;
+}
+.list-group-item-success {
+  color: #4caf50;
+  background-color: #dff0d8;
+}
+a.list-group-item-success,
+button.list-group-item-success {
+  color: #4caf50;
+}
+a.list-group-item-success .list-group-item-heading,
+button.list-group-item-success .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-success:hover,
+button.list-group-item-success:hover,
+a.list-group-item-success:focus,
+button.list-group-item-success:focus {
+  color: #4caf50;
+  background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+button.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+button.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus,
+button.list-group-item-success.active:focus {
+  color: #fff;
+  background-color: #4caf50;
+  border-color: #4caf50;
+}
+.list-group-item-info {
+  color: #9c27b0;
+  background-color: #e1bee7;
+}
+a.list-group-item-info,
+button.list-group-item-info {
+  color: #9c27b0;
+}
+a.list-group-item-info .list-group-item-heading,
+button.list-group-item-info .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-info:hover,
+button.list-group-item-info:hover,
+a.list-group-item-info:focus,
+button.list-group-item-info:focus {
+  color: #9c27b0;
+  background-color: #d8abe0;
+}
+a.list-group-item-info.active,
+button.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+button.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus,
+button.list-group-item-info.active:focus {
+  color: #fff;
+  background-color: #9c27b0;
+  border-color: #9c27b0;
+}
+.list-group-item-warning {
+  color: #ff9800;
+  background-color: #ffe0b2;
+}
+a.list-group-item-warning,
+button.list-group-item-warning {
+  color: #ff9800;
+}
+a.list-group-item-warning .list-group-item-heading,
+button.list-group-item-warning .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-warning:hover,
+button.list-group-item-warning:hover,
+a.list-group-item-warning:focus,
+button.list-group-item-warning:focus {
+  color: #ff9800;
+  background-color: #ffd699;
+}
+a.list-group-item-warning.active,
+button.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+button.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus,
+button.list-group-item-warning.active:focus {
+  color: #fff;
+  background-color: #ff9800;
+  border-color: #ff9800;
+}
+.list-group-item-danger {
+  color: #e51c23;
+  background-color: #f9bdbb;
+}
+a.list-group-item-danger,
+button.list-group-item-danger {
+  color: #e51c23;
+}
+a.list-group-item-danger .list-group-item-heading,
+button.list-group-item-danger .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-danger:hover,
+button.list-group-item-danger:hover,
+a.list-group-item-danger:focus,
+button.list-group-item-danger:focus {
+  color: #e51c23;
+  background-color: #f7a6a4;
+}
+a.list-group-item-danger.active,
+button.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+button.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus,
+button.list-group-item-danger.active:focus {
+  color: #fff;
+  background-color: #e51c23;
+  border-color: #e51c23;
+}
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
+.panel {
+  margin-bottom: 23px;
+  background-color: #ffffff;
+  border: 1px solid transparent;
+  border-radius: 3px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.panel-body {
+  padding: 15px;
+}
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-right-radius: 2px;
+  border-top-left-radius: 2px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 15px;
+  color: inherit;
+}
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+  color: inherit;
+}
+.panel-footer {
+  padding: 10px 15px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #dddddd;
+  border-bottom-right-radius: 2px;
+  border-bottom-left-radius: 2px;
+}
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+  margin-bottom: 0;
+}
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+  border-width: 1px 0;
+  border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+  border-top: 0;
+  border-top-right-radius: 2px;
+  border-top-left-radius: 2px;
+}
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 2px;
+  border-bottom-left-radius: 2px;
+}
+.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
+  border-top-right-radius: 0;
+  border-top-left-radius: 0;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+  padding-left: 15px;
+  padding-right: 15px;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+  border-top-right-radius: 2px;
+  border-top-left-radius: 2px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+  border-top-left-radius: 2px;
+  border-top-right-radius: 2px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 2px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 2px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 2px;
+  border-bottom-left-radius: 2px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+  border-bottom-left-radius: 2px;
+  border-bottom-right-radius: 2px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 2px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 2px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+  border-top: 1px solid #dddddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+  border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+  border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+.panel > .table-responsive {
+  border: 0;
+  margin-bottom: 0;
+}
+.panel-group {
+  margin-bottom: 23px;
+}
+.panel-group .panel {
+  margin-bottom: 0;
+  border-radius: 3px;
+}
+.panel-group .panel + .panel {
+  margin-top: 5px;
+}
+.panel-group .panel-heading {
+  border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+  border-top: 1px solid #dddddd;
+}
+.panel-group .panel-footer {
+  border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+  border-bottom: 1px solid #dddddd;
+}
+.panel-default {
+  border-color: #dddddd;
+}
+.panel-default > .panel-heading {
+  color: #212121;
+  background-color: #f5f5f5;
+  border-color: #dddddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #dddddd;
+}
+.panel-default > .panel-heading .badge {
+  color: #f5f5f5;
+  background-color: #212121;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #dddddd;
+}
+.panel-primary {
+  border-color: #2196f3;
+}
+.panel-primary > .panel-heading {
+  color: #ffffff;
+  background-color: #2196f3;
+  border-color: #2196f3;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #2196f3;
+}
+.panel-primary > .panel-heading .badge {
+  color: #2196f3;
+  background-color: #ffffff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #2196f3;
+}
+.panel-success {
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+  color: #ffffff;
+  background-color: #4caf50;
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+  color: #4caf50;
+  background-color: #ffffff;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #d6e9c6;
+}
+.panel-info {
+  border-color: #cba4dd;
+}
+.panel-info > .panel-heading {
+  color: #ffffff;
+  background-color: #9c27b0;
+  border-color: #cba4dd;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #cba4dd;
+}
+.panel-info > .panel-heading .badge {
+  color: #9c27b0;
+  background-color: #ffffff;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #cba4dd;
+}
+.panel-warning {
+  border-color: #ffc599;
+}
+.panel-warning > .panel-heading {
+  color: #ffffff;
+  background-color: #ff9800;
+  border-color: #ffc599;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ffc599;
+}
+.panel-warning > .panel-heading .badge {
+  color: #ff9800;
+  background-color: #ffffff;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ffc599;
+}
+.panel-danger {
+  border-color: #f7a4af;
+}
+.panel-danger > .panel-heading {
+  color: #ffffff;
+  background-color: #e51c23;
+  border-color: #f7a4af;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #f7a4af;
+}
+.panel-danger > .panel-heading .badge {
+  color: #e51c23;
+  background-color: #ffffff;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #f7a4af;
+}
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  height: 100%;
+  width: 100%;
+  border: 0;
+}
+.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f9f9f9;
+  border: 1px solid transparent;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+.well-lg {
+  padding: 24px;
+  border-radius: 3px;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: 3px;
+}
+.close {
+  float: right;
+  font-size: 19.5px;
+  font-weight: normal;
+  line-height: 1;
+  color: #000000;
+  text-shadow: none;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+.close:hover,
+.close:focus {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+.modal-open {
+  overflow: hidden;
+}
+.modal {
+  display: none;
+  overflow: hidden;
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.modal.fade .modal-dialog {
+  -webkit-transform: translate(0, -25%);
+  -ms-transform: translate(0, -25%);
+  -o-transform: translate(0, -25%);
+  transform: translate(0, -25%);
+  -webkit-transition: -webkit-transform 0.3s ease-out;
+  -o-transition: -o-transform 0.3s ease-out;
+  transition: transform 0.3s ease-out;
+}
+.modal.in .modal-dialog {
+  -webkit-transform: translate(0, 0);
+  -ms-transform: translate(0, 0);
+  -o-transform: translate(0, 0);
+  transform: translate(0, 0);
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+.modal-content {
+  position: relative;
+  background-color: #ffffff;
+  border: 1px solid #999999;
+  border: 1px solid transparent;
+  border-radius: 3px;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  outline: 0;
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+.modal-backdrop.fade {
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.modal-backdrop.in {
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.modal-header {
+  padding: 15px;
+  border-bottom: 1px solid transparent;
+}
+.modal-header .close {
+  margin-top: -2px;
+}
+.modal-title {
+  margin: 0;
+  line-height: 1.846;
+}
+.modal-body {
+  position: relative;
+  padding: 15px;
+}
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid transparent;
+}
+.modal-footer .btn + .btn {
+  margin-left: 5px;
+  margin-bottom: 0;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
+  }
+  .modal-sm {
+    width: 300px;
+  }
+}
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px;
+  }
+}
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-style: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  line-break: auto;
+  line-height: 1.846;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  white-space: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  font-size: 12px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.tooltip.in {
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.tooltip.top {
+  margin-top: -3px;
+  padding: 5px 0;
+}
+.tooltip.right {
+  margin-left: 3px;
+  padding: 0 5px;
+}
+.tooltip.bottom {
+  margin-top: 3px;
+  padding: 5px 0;
+}
+.tooltip.left {
+  margin-left: -3px;
+  padding: 0 5px;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #ffffff;
+  text-align: center;
+  background-color: #727272;
+  border-radius: 3px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #727272;
+}
+.tooltip.top-left .tooltip-arrow {
+  bottom: 0;
+  right: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #727272;
+}
+.tooltip.top-right .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #727272;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #727272;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #727272;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #727272;
+}
+.tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #727272;
+}
+.tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #727272;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-family: "Roboto", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-style: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  line-break: auto;
+  line-height: 1.846;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  white-space: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  font-size: 13px;
+  background-color: #ffffff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid transparent;
+  border-radius: 3px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+.popover.top {
+  margin-top: -10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-left: -10px;
+}
+.popover-title {
+  margin: 0;
+  padding: 8px 14px;
+  font-size: 13px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: 2px 2px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover > .arrow {
+  border-width: 11px;
+}
+.popover > .arrow:after {
+  border-width: 10px;
+  content: "";
+}
+.popover.top > .arrow {
+  left: 50%;
+  margin-left: -11px;
+  border-bottom-width: 0;
+  border-top-color: rgba(0, 0, 0, 0);
+  border-top-color: rgba(0, 0, 0, 0.075);
+  bottom: -11px;
+}
+.popover.top > .arrow:after {
+  content: " ";
+  bottom: 1px;
+  margin-left: -10px;
+  border-bottom-width: 0;
+  border-top-color: #ffffff;
+}
+.popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-left-width: 0;
+  border-right-color: rgba(0, 0, 0, 0);
+  border-right-color: rgba(0, 0, 0, 0.075);
+}
+.popover.right > .arrow:after {
+  content: " ";
+  left: 1px;
+  bottom: -10px;
+  border-left-width: 0;
+  border-right-color: #ffffff;
+}
+.popover.bottom > .arrow {
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: rgba(0, 0, 0, 0);
+  border-bottom-color: rgba(0, 0, 0, 0.075);
+  top: -11px;
+}
+.popover.bottom > .arrow:after {
+  content: " ";
+  top: 1px;
+  margin-left: -10px;
+  border-top-width: 0;
+  border-bottom-color: #ffffff;
+}
+.popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: rgba(0, 0, 0, 0);
+  border-left-color: rgba(0, 0, 0, 0.075);
+}
+.popover.left > .arrow:after {
+  content: " ";
+  right: 1px;
+  border-right-width: 0;
+  border-left-color: #ffffff;
+  bottom: -10px;
+}
+.carousel {
+  position: relative;
+}
+.carousel-inner {
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+}
+.carousel-inner > .item {
+  display: none;
+  position: relative;
+  -webkit-transition: 0.6s ease-in-out left;
+  -o-transition: 0.6s ease-in-out left;
+  transition: 0.6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  line-height: 1;
+}
+@media all and (transform-3d), (-webkit-transform-3d) {
+  .carousel-inner > .item {
+    -webkit-transition: -webkit-transform 0.6s ease-in-out;
+    -o-transition: -o-transform 0.6s ease-in-out;
+    transition: transform 0.6s ease-in-out;
+    -webkit-backface-visibility: hidden;
+    backface-visibility: hidden;
+    -webkit-perspective: 1000px;
+    perspective: 1000px;
+  }
+  .carousel-inner > .item.next,
+  .carousel-inner > .item.active.right {
+    -webkit-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+    left: 0;
+  }
+  .carousel-inner > .item.prev,
+  .carousel-inner > .item.active.left {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+    left: 0;
+  }
+  .carousel-inner > .item.next.left,
+  .carousel-inner > .item.prev.right,
+  .carousel-inner > .item.active {
+    -webkit-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+    left: 0;
+  }
+}
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+.carousel-inner > .active {
+  left: 0;
+}
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel-inner > .next {
+  left: 100%;
+}
+.carousel-inner > .prev {
+  left: -100%;
+}
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+.carousel-inner > .active.left {
+  left: -100%;
+}
+.carousel-inner > .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  width: 15%;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+  font-size: 20px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+  background-color: rgba(0, 0, 0, 0);
+}
+.carousel-control.left {
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+}
+.carousel-control.right {
+  left: auto;
+  right: 0;
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));
+  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+}
+.carousel-control:hover,
+.carousel-control:focus {
+  outline: 0;
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+  position: absolute;
+  top: 50%;
+  margin-top: -10px;
+  z-index: 5;
+  display: inline-block;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+  width: 20px;
+  height: 20px;
+  line-height: 1;
+  font-family: serif;
+}
+.carousel-control .icon-prev:before {
+  content: '\2039';
+}
+.carousel-control .icon-next:before {
+  content: '\203a';
+}
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  margin-left: -30%;
+  padding-left: 0;
+  list-style: none;
+  text-align: center;
+}
+.carousel-indicators li {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  margin: 1px;
+  text-indent: -999px;
+  border: 1px solid #ffffff;
+  border-radius: 10px;
+  cursor: pointer;
+  background-color: #000 \9;
+  background-color: rgba(0, 0, 0, 0);
+}
+.carousel-indicators .active {
+  margin: 0;
+  width: 12px;
+  height: 12px;
+  background-color: #ffffff;
+}
+.carousel-caption {
+  position: absolute;
+  left: 15%;
+  right: 15%;
+  bottom: 20px;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+.carousel-caption .btn {
+  text-shadow: none;
+}
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-prev,
+  .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -10px;
+    font-size: 30px;
+  }
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: -10px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-right: -10px;
+  }
+  .carousel-caption {
+    left: 20%;
+    right: 20%;
+    padding-bottom: 30px;
+  }
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-header:before,
+.modal-header:after,
+.modal-footer:before,
+.modal-footer:after {
+  content: " ";
+  display: table;
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-header:after,
+.modal-footer:after {
+  clear: both;
+}
+.center-block {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
+.hide {
+  display: none !important;
+}
+.show {
+  display: block !important;
+}
+.invisible {
+  visibility: hidden;
+}
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.hidden {
+  display: none !important;
+}
+.affix {
+  position: fixed;
+}
+@-ms-viewport {
+  width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+  display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important;
+  }
+  table.visible-xs {
+    display: table !important;
+  }
+  tr.visible-xs {
+    display: table-row !important;
+  }
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important;
+  }
+  table.visible-sm {
+    display: table !important;
+  }
+  tr.visible-sm {
+    display: table-row !important;
+  }
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important;
+  }
+  table.visible-md {
+    display: table !important;
+  }
+  tr.visible-md {
+    display: table-row !important;
+  }
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important;
+  }
+  table.visible-lg {
+    display: table !important;
+  }
+  tr.visible-lg {
+    display: table-row !important;
+  }
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important;
+  }
+}
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+@media print {
+  .visible-print {
+    display: block !important;
+  }
+  table.visible-print {
+    display: table !important;
+  }
+  tr.visible-print {
+    display: table-row !important;
+  }
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important;
+  }
+}
+.visible-print-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-block {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+@media print {
+  .hidden-print {
+    display: none !important;
+  }
+}
+.navbar {
+  border: none;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
+}
+.navbar-brand {
+  font-size: 24px;
+}
+.navbar-inverse .navbar-form input[type=text],
+.navbar-inverse .navbar-form input[type=password] {
+  color: #fff;
+  -webkit-box-shadow: inset 0 -1px 0 #b2dbfb;
+  box-shadow: inset 0 -1px 0 #b2dbfb;
+}
+.navbar-inverse .navbar-form input[type=text]::-moz-placeholder,
+.navbar-inverse .navbar-form input[type=password]::-moz-placeholder {
+  color: #b2dbfb;
+  opacity: 1;
+}
+.navbar-inverse .navbar-form input[type=text]:-ms-input-placeholder,
+.navbar-inverse .navbar-form input[type=password]:-ms-input-placeholder {
+  color: #b2dbfb;
+}
+.navbar-inverse .navbar-form input[type=text]::-webkit-input-placeholder,
+.navbar-inverse .navbar-form input[type=password]::-webkit-input-placeholder {
+  color: #b2dbfb;
+}
+.navbar-inverse .navbar-form input[type=text]:focus,
+.navbar-inverse .navbar-form input[type=password]:focus {
+  -webkit-box-shadow: inset 0 -2px 0 #ffffff;
+  box-shadow: inset 0 -2px 0 #ffffff;
+}
+.btn-default {
+  -webkit-background-size: 200% 200%;
+          background-size: 200%;
+  background-position: 50%;
+}
+.btn-default:focus {
+  background-color: #ffffff;
+}
+.btn-default:hover,
+.btn-default:active:hover {
+  background-color: #f0f0f0;
+}
+.btn-default:active {
+  background-color: #e0e0e0;
+  background-image: -webkit-radial-gradient(circle, #e0e0e0 10%, #ffffff 11%);
+  background-image: -o-radial-gradient(circle, #e0e0e0 10%, #ffffff 11%);
+  background-image: radial-gradient(circle, #e0e0e0 10%, #ffffff 11%);
+  background-repeat: no-repeat;
+  -webkit-background-size: 1000% 1000%;
+          background-size: 1000%;
+  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+}
+.btn-primary {
+  -webkit-background-size: 200% 200%;
+          background-size: 200%;
+  background-position: 50%;
+}
+.btn-primary:focus {
+  background-color: #2196f3;
+}
+.btn-primary:hover,
+.btn-primary:active:hover {
+  background-color: #0d87e9;
+}
+.btn-primary:active {
+  background-color: #0b76cc;
+  background-image: -webkit-radial-gradient(circle, #0b76cc 10%, #2196f3 11%);
+  background-image: -o-radial-gradient(circle, #0b76cc 10%, #2196f3 11%);
+  background-image: radial-gradient(circle, #0b76cc 10%, #2196f3 11%);
+  background-repeat: no-repeat;
+  -webkit-background-size: 1000% 1000%;
+          background-size: 1000%;
+  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+}
+.btn-success {
+  -webkit-background-size: 200% 200%;
+          background-size: 200%;
+  background-position: 50%;
+}
+.btn-success:focus {
+  background-color: #4caf50;
+}
+.btn-success:hover,
+.btn-success:active:hover {
+  background-color: #439a46;
+}
+.btn-success:active {
+  background-color: #39843c;
+  background-image: -webkit-radial-gradient(circle, #39843c 10%, #4caf50 11%);
+  background-image: -o-radial-gradient(circle, #39843c 10%, #4caf50 11%);
+  background-image: radial-gradient(circle, #39843c 10%, #4caf50 11%);
+  background-repeat: no-repeat;
+  -webkit-background-size: 1000% 1000%;
+          background-size: 1000%;
+  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+}
+.btn-info {
+  -webkit-background-size: 200% 200%;
+          background-size: 200%;
+  background-position: 50%;
+}
+.btn-info:focus {
+  background-color: #9c27b0;
+}
+.btn-info:hover,
+.btn-info:active:hover {
+  background-color: #862197;
+}
+.btn-info:active {
+  background-color: #701c7e;
+  background-image: -webkit-radial-gradient(circle, #701c7e 10%, #9c27b0 11%);
+  background-image: -o-radial-gradient(circle, #701c7e 10%, #9c27b0 11%);
+  background-image: radial-gradient(circle, #701c7e 10%, #9c27b0 11%);
+  background-repeat: no-repeat;
+  -webkit-background-size: 1000% 1000%;
+          background-size: 1000%;
+  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+}
+.btn-warning {
+  -webkit-background-size: 200% 200%;
+          background-size: 200%;
+  background-position: 50%;
+}
+.btn-warning:focus {
+  background-color: #ff9800;
+}
+.btn-warning:hover,
+.btn-warning:active:hover {
+  background-color: #e08600;
+}
+.btn-warning:active {
+  background-color: #c27400;
+  background-image: -webkit-radial-gradient(circle, #c27400 10%, #ff9800 11%);
+  background-image: -o-radial-gradient(circle, #c27400 10%, #ff9800 11%);
+  background-image: radial-gradient(circle, #c27400 10%, #ff9800 11%);
+  background-repeat: no-repeat;
+  -webkit-background-size: 1000% 1000%;
+          background-size: 1000%;
+  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+}
+.btn-danger {
+  -webkit-background-size: 200% 200%;
+          background-size: 200%;
+  background-position: 50%;
+}
+.btn-danger:focus {
+  background-color: #e51c23;
+}
+.btn-danger:hover,
+.btn-danger:active:hover {
+  background-color: #cb171e;
+}
+.btn-danger:active {
+  background-color: #b0141a;
+  background-image: -webkit-radial-gradient(circle, #b0141a 10%, #e51c23 11%);
+  background-image: -o-radial-gradient(circle, #b0141a 10%, #e51c23 11%);
+  background-image: radial-gradient(circle, #b0141a 10%, #e51c23 11%);
+  background-repeat: no-repeat;
+  -webkit-background-size: 1000% 1000%;
+          background-size: 1000%;
+  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+}
+.btn-link {
+  -webkit-background-size: 200% 200%;
+          background-size: 200%;
+  background-position: 50%;
+}
+.btn-link:focus {
+  background-color: #ffffff;
+}
+.btn-link:hover,
+.btn-link:active:hover {
+  background-color: #f0f0f0;
+}
+.btn-link:active {
+  background-color: #e0e0e0;
+  background-image: -webkit-radial-gradient(circle, #e0e0e0 10%, #ffffff 11%);
+  background-image: -o-radial-gradient(circle, #e0e0e0 10%, #ffffff 11%);
+  background-image: radial-gradient(circle, #e0e0e0 10%, #ffffff 11%);
+  background-repeat: no-repeat;
+  -webkit-background-size: 1000% 1000%;
+          background-size: 1000%;
+  -webkit-box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+  box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.4);
+}
+.btn {
+  text-transform: uppercase;
+  border: none;
+  -webkit-box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4);
+  box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.4);
+  -webkit-transition: all 0.4s;
+  -o-transition: all 0.4s;
+  transition: all 0.4s;
+}
+.btn-link {
+  border-radius: 3px;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  color: #444444;
+}
+.btn-link:hover,
+.btn-link:focus {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  color: #444444;
+  text-decoration: none;
+}
+.btn-default.disabled {
+  background-color: rgba(0, 0, 0, 0.1);
+  color: rgba(0, 0, 0, 0.4);
+  opacity: 1;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: 0;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: 0;
+}
+body {
+  -webkit-font-smoothing: antialiased;
+  letter-spacing: .1px;
+}
+p {
+  margin: 0 0 1em;
+}
+input,
+button {
+  -webkit-font-smoothing: antialiased;
+  letter-spacing: .1px;
+}
+a {
+  -webkit-transition: all 0.2s;
+  -o-transition: all 0.2s;
+  transition: all 0.2s;
+}
+.table-hover > tbody > tr,
+.table-hover > tbody > tr > th,
+.table-hover > tbody > tr > td {
+  -webkit-transition: all 0.2s;
+  -o-transition: all 0.2s;
+  transition: all 0.2s;
+}
+label {
+  font-weight: normal;
+}
+textarea,
+textarea.form-control,
+input.form-control,
+input[type=text],
+input[type=password],
+input[type=email],
+input[type=number],
+[type=text].form-control,
+[type=password].form-control,
+[type=email].form-control,
+[type=tel].form-control,
+[contenteditable].form-control {
+  padding: 0;
+  border: none;
+  border-radius: 0;
+  -webkit-appearance: none;
+  -webkit-box-shadow: inset 0 -1px 0 #dddddd;
+  box-shadow: inset 0 -1px 0 #dddddd;
+  font-size: 16px;
+}
+textarea:focus,
+textarea.form-control:focus,
+input.form-control:focus,
+input[type=text]:focus,
+input[type=password]:focus,
+input[type=email]:focus,
+input[type=number]:focus,
+[type=text].form-control:focus,
+[type=password].form-control:focus,
+[type=email].form-control:focus,
+[type=tel].form-control:focus,
+[contenteditable].form-control:focus {
+  -webkit-box-shadow: inset 0 -2px 0 #2196f3;
+  box-shadow: inset 0 -2px 0 #2196f3;
+}
+textarea[disabled],
+textarea.form-control[disabled],
+input.form-control[disabled],
+input[type=text][disabled],
+input[type=password][disabled],
+input[type=email][disabled],
+input[type=number][disabled],
+[type=text].form-control[disabled],
+[type=password].form-control[disabled],
+[type=email].form-control[disabled],
+[type=tel].form-control[disabled],
+[contenteditable].form-control[disabled],
+textarea[readonly],
+textarea.form-control[readonly],
+input.form-control[readonly],
+input[type=text][readonly],
+input[type=password][readonly],
+input[type=email][readonly],
+input[type=number][readonly],
+[type=text].form-control[readonly],
+[type=password].form-control[readonly],
+[type=email].form-control[readonly],
+[type=tel].form-control[readonly],
+[contenteditable].form-control[readonly] {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+  border-bottom: 1px dotted #ddd;
+}
+textarea.input-sm,
+textarea.form-control.input-sm,
+input.form-control.input-sm,
+input[type=text].input-sm,
+input[type=password].input-sm,
+input[type=email].input-sm,
+input[type=number].input-sm,
+[type=text].form-control.input-sm,
+[type=password].form-control.input-sm,
+[type=email].form-control.input-sm,
+[type=tel].form-control.input-sm,
+[contenteditable].form-control.input-sm {
+  font-size: 12px;
+}
+textarea.input-lg,
+textarea.form-control.input-lg,
+input.form-control.input-lg,
+input[type=text].input-lg,
+input[type=password].input-lg,
+input[type=email].input-lg,
+input[type=number].input-lg,
+[type=text].form-control.input-lg,
+[type=password].form-control.input-lg,
+[type=email].form-control.input-lg,
+[type=tel].form-control.input-lg,
+[contenteditable].form-control.input-lg {
+  font-size: 17px;
+}
+select,
+select.form-control {
+  border: 0;
+  border-radius: 0;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+  padding-left: 0;
+  padding-right: 0\9;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=);
+  -webkit-background-size: 13px 13px;
+          background-size: 13px;
+  background-repeat: no-repeat;
+  background-position: right center;
+  -webkit-box-shadow: inset 0 -1px 0 #dddddd;
+  box-shadow: inset 0 -1px 0 #dddddd;
+  font-size: 16px;
+  line-height: 1.5;
+}
+select::-ms-expand,
+select.form-control::-ms-expand {
+  display: none;
+}
+select.input-sm,
+select.form-control.input-sm {
+  font-size: 12px;
+}
+select.input-lg,
+select.form-control.input-lg {
+  font-size: 17px;
+}
+select:focus,
+select.form-control:focus {
+  -webkit-box-shadow: inset 0 -2px 0 #2196f3;
+  box-shadow: inset 0 -2px 0 #2196f3;
+  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=);
+}
+select[multiple],
+select.form-control[multiple] {
+  background: none;
+}
+.radio label,
+.radio-inline label,
+.checkbox label,
+.checkbox-inline label {
+  padding-left: 25px;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="radio"],
+.checkbox-inline input[type="radio"],
+.radio input[type="checkbox"],
+.radio-inline input[type="checkbox"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  margin-left: -25px;
+}
+input[type="radio"],
+.radio input[type="radio"],
+.radio-inline input[type="radio"] {
+  position: relative;
+  margin-top: 6px;
+  margin-right: 4px;
+  vertical-align: top;
+  border: none;
+  background-color: transparent;
+  -webkit-appearance: none;
+  appearance: none;
+  cursor: pointer;
+}
+input[type="radio"]:focus,
+.radio input[type="radio"]:focus,
+.radio-inline input[type="radio"]:focus {
+  outline: none;
+}
+input[type="radio"]:before,
+.radio input[type="radio"]:before,
+.radio-inline input[type="radio"]:before,
+input[type="radio"]:after,
+.radio input[type="radio"]:after,
+.radio-inline input[type="radio"]:after {
+  content: "";
+  display: block;
+  width: 18px;
+  height: 18px;
+  border-radius: 50%;
+  -webkit-transition: 240ms;
+  -o-transition: 240ms;
+  transition: 240ms;
+}
+input[type="radio"]:before,
+.radio input[type="radio"]:before,
+.radio-inline input[type="radio"]:before {
+  position: absolute;
+  left: 0;
+  top: -3px;
+  background-color: #2196f3;
+  -webkit-transform: scale(0);
+  -ms-transform: scale(0);
+  -o-transform: scale(0);
+  transform: scale(0);
+}
+input[type="radio"]:after,
+.radio input[type="radio"]:after,
+.radio-inline input[type="radio"]:after {
+  position: relative;
+  top: -3px;
+  border: 2px solid #666666;
+}
+input[type="radio"]:checked:before,
+.radio input[type="radio"]:checked:before,
+.radio-inline input[type="radio"]:checked:before {
+  -webkit-transform: scale(0.5);
+  -ms-transform: scale(0.5);
+  -o-transform: scale(0.5);
+  transform: scale(0.5);
+}
+input[type="radio"]:disabled:checked:before,
+.radio input[type="radio"]:disabled:checked:before,
+.radio-inline input[type="radio"]:disabled:checked:before {
+  background-color: #bbbbbb;
+}
+input[type="radio"]:checked:after,
+.radio input[type="radio"]:checked:after,
+.radio-inline input[type="radio"]:checked:after {
+  border-color: #2196f3;
+}
+input[type="radio"]:disabled:after,
+.radio input[type="radio"]:disabled:after,
+.radio-inline input[type="radio"]:disabled:after,
+input[type="radio"]:disabled:checked:after,
+.radio input[type="radio"]:disabled:checked:after,
+.radio-inline input[type="radio"]:disabled:checked:after {
+  border-color: #bbbbbb;
+}
+input[type="checkbox"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: relative;
+  border: none;
+  margin-bottom: -4px;
+  -webkit-appearance: none;
+  appearance: none;
+  cursor: pointer;
+}
+input[type="checkbox"]:focus,
+.checkbox input[type="checkbox"]:focus,
+.checkbox-inline input[type="checkbox"]:focus {
+  outline: none;
+}
+input[type="checkbox"]:focus:after,
+.checkbox input[type="checkbox"]:focus:after,
+.checkbox-inline input[type="checkbox"]:focus:after {
+  border-color: #2196f3;
+}
+input[type="checkbox"]:after,
+.checkbox input[type="checkbox"]:after,
+.checkbox-inline input[type="checkbox"]:after {
+  content: "";
+  display: block;
+  width: 18px;
+  height: 18px;
+  margin-top: -2px;
+  margin-right: 5px;
+  border: 2px solid #666666;
+  border-radius: 2px;
+  -webkit-transition: 240ms;
+  -o-transition: 240ms;
+  transition: 240ms;
+}
+input[type="checkbox"]:checked:before,
+.checkbox input[type="checkbox"]:checked:before,
+.checkbox-inline input[type="checkbox"]:checked:before {
+  content: "";
+  position: absolute;
+  top: 0;
+  left: 6px;
+  display: table;
+  width: 6px;
+  height: 12px;
+  border: 2px solid #fff;
+  border-top-width: 0;
+  border-left-width: 0;
+  -webkit-transform: rotate(45deg);
+  -ms-transform: rotate(45deg);
+  -o-transform: rotate(45deg);
+  transform: rotate(45deg);
+}
+input[type="checkbox"]:checked:after,
+.checkbox input[type="checkbox"]:checked:after,
+.checkbox-inline input[type="checkbox"]:checked:after {
+  background-color: #2196f3;
+  border-color: #2196f3;
+}
+input[type="checkbox"]:disabled:after,
+.checkbox input[type="checkbox"]:disabled:after,
+.checkbox-inline input[type="checkbox"]:disabled:after {
+  border-color: #bbbbbb;
+}
+input[type="checkbox"]:disabled:checked:after,
+.checkbox input[type="checkbox"]:disabled:checked:after,
+.checkbox-inline input[type="checkbox"]:disabled:checked:after {
+  background-color: #bbbbbb;
+  border-color: transparent;
+}
+.has-warning input:not([type=checkbox]),
+.has-warning .form-control,
+.has-warning input.form-control[readonly],
+.has-warning input[type=text][readonly],
+.has-warning [type=text].form-control[readonly],
+.has-warning input:not([type=checkbox]):focus,
+.has-warning .form-control:focus {
+  border-bottom: none;
+  -webkit-box-shadow: inset 0 -2px 0 #ff9800;
+  box-shadow: inset 0 -2px 0 #ff9800;
+}
+.has-error input:not([type=checkbox]),
+.has-error .form-control,
+.has-error input.form-control[readonly],
+.has-error input[type=text][readonly],
+.has-error [type=text].form-control[readonly],
+.has-error input:not([type=checkbox]):focus,
+.has-error .form-control:focus {
+  border-bottom: none;
+  -webkit-box-shadow: inset 0 -2px 0 #e51c23;
+  box-shadow: inset 0 -2px 0 #e51c23;
+}
+.has-success input:not([type=checkbox]),
+.has-success .form-control,
+.has-success input.form-control[readonly],
+.has-success input[type=text][readonly],
+.has-success [type=text].form-control[readonly],
+.has-success input:not([type=checkbox]):focus,
+.has-success .form-control:focus {
+  border-bottom: none;
+  -webkit-box-shadow: inset 0 -2px 0 #4caf50;
+  box-shadow: inset 0 -2px 0 #4caf50;
+}
+.has-warning .input-group-addon,
+.has-error .input-group-addon,
+.has-success .input-group-addon {
+  color: #666666;
+  border-color: transparent;
+  background-color: transparent;
+}
+.form-group-lg select,
+.form-group-lg select.form-control {
+  line-height: 1.5;
+}
+.nav-tabs > li > a,
+.nav-tabs > li > a:focus {
+  margin-right: 0;
+  background-color: transparent;
+  border: none;
+  color: #666666;
+  -webkit-box-shadow: inset 0 -1px 0 #dddddd;
+  box-shadow: inset 0 -1px 0 #dddddd;
+  -webkit-transition: all 0.2s;
+  -o-transition: all 0.2s;
+  transition: all 0.2s;
+}
+.nav-tabs > li > a:hover,
+.nav-tabs > li > a:focus:hover {
+  background-color: transparent;
+  -webkit-box-shadow: inset 0 -2px 0 #2196f3;
+  box-shadow: inset 0 -2px 0 #2196f3;
+  color: #2196f3;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:focus {
+  border: none;
+  -webkit-box-shadow: inset 0 -2px 0 #2196f3;
+  box-shadow: inset 0 -2px 0 #2196f3;
+  color: #2196f3;
+}
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus:hover {
+  border: none;
+  color: #2196f3;
+}
+.nav-tabs > li.disabled > a {
+  -webkit-box-shadow: inset 0 -1px 0 #dddddd;
+  box-shadow: inset 0 -1px 0 #dddddd;
+}
+.nav-tabs.nav-justified > li > a,
+.nav-tabs.nav-justified > li > a:hover,
+.nav-tabs.nav-justified > li > a:focus,
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: none;
+}
+.nav-tabs .dropdown-menu {
+  margin-top: 0;
+}
+.dropdown-menu {
+  margin-top: 0;
+  border: none;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+.alert {
+  border: none;
+  color: #fff;
+}
+.alert-success {
+  background-color: #4caf50;
+}
+.alert-info {
+  background-color: #9c27b0;
+}
+.alert-warning {
+  background-color: #ff9800;
+}
+.alert-danger {
+  background-color: #e51c23;
+}
+.alert a:not(.close):not(.btn),
+.alert .alert-link {
+  color: #fff;
+  font-weight: bold;
+}
+.alert .close {
+  color: #fff;
+}
+.badge {
+  padding: 4px 6px 4px;
+}
+.progress {
+  position: relative;
+  z-index: 1;
+  height: 6px;
+  border-radius: 0;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.progress-bar {
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.progress-bar:last-child {
+  border-radius: 0 3px 3px 0;
+}
+.progress-bar:last-child:before {
+  display: block;
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  left: 0;
+  right: 0;
+  z-index: -1;
+  background-color: #cae6fc;
+}
+.progress-bar-success:last-child.progress-bar:before {
+  background-color: #c7e7c8;
+}
+.progress-bar-info:last-child.progress-bar:before {
+  background-color: #edc9f3;
+}
+.progress-bar-warning:last-child.progress-bar:before {
+  background-color: #ffe0b3;
+}
+.progress-bar-danger:last-child.progress-bar:before {
+  background-color: #f28e92;
+}
+.close {
+  font-size: 34px;
+  font-weight: 300;
+  line-height: 24px;
+  opacity: 0.6;
+  -webkit-transition: all 0.2s;
+  -o-transition: all 0.2s;
+  transition: all 0.2s;
+}
+.close:hover {
+  opacity: 1;
+}
+.list-group-item {
+  padding: 15px;
+}
+.list-group-item-text {
+  color: #bbbbbb;
+}
+.well {
+  border-radius: 0;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+.panel {
+  border: none;
+  border-radius: 2px;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+.panel-heading {
+  border-bottom: none;
+}
+.panel-footer {
+  border-top: none;
+}
+.popover {
+  border: none;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+.carousel-caption h1,
+.carousel-caption h2,
+.carousel-caption h3,
+.carousel-caption h4,
+.carousel-caption h5,
+.carousel-caption h6 {
+  color: inherit;
+}
diff --git a/doc/doxygen/css/bootstrap-theme.css b/doc/doxygen/css/bootstrap-theme.css
new file mode 100644
index 0000000..ebe57fb
--- /dev/null
+++ b/doc/doxygen/css/bootstrap-theme.css
@@ -0,0 +1,587 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+}
+.btn-default:active,
+.btn-primary:active,
+.btn-success:active,
+.btn-info:active,
+.btn-warning:active,
+.btn-danger:active,
+.btn-default.active,
+.btn-primary.active,
+.btn-success.active,
+.btn-info.active,
+.btn-warning.active,
+.btn-danger.active {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-default.disabled,
+.btn-primary.disabled,
+.btn-success.disabled,
+.btn-info.disabled,
+.btn-warning.disabled,
+.btn-danger.disabled,
+.btn-default[disabled],
+.btn-primary[disabled],
+.btn-success[disabled],
+.btn-info[disabled],
+.btn-warning[disabled],
+.btn-danger[disabled],
+fieldset[disabled] .btn-default,
+fieldset[disabled] .btn-primary,
+fieldset[disabled] .btn-success,
+fieldset[disabled] .btn-info,
+fieldset[disabled] .btn-warning,
+fieldset[disabled] .btn-danger {
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn-default .badge,
+.btn-primary .badge,
+.btn-success .badge,
+.btn-info .badge,
+.btn-warning .badge,
+.btn-danger .badge {
+  text-shadow: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+}
+.btn-default {
+  text-shadow: 0 1px 0 #fff;
+  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
+  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #dbdbdb;
+  border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus {
+  background-color: #e0e0e0;
+  background-position: 0 -15px;
+}
+.btn-default:active,
+.btn-default.active {
+  background-color: #e0e0e0;
+  border-color: #dbdbdb;
+}
+.btn-default.disabled,
+.btn-default[disabled],
+fieldset[disabled] .btn-default,
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus,
+.btn-default.disabled:active,
+.btn-default[disabled]:active,
+fieldset[disabled] .btn-default:active,
+.btn-default.disabled.active,
+.btn-default[disabled].active,
+fieldset[disabled] .btn-default.active {
+  background-color: #e0e0e0;
+  background-image: none;
+}
+.btn-primary {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #245580;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+  background-color: #265a88;
+  background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #265a88;
+  border-color: #245580;
+}
+.btn-primary.disabled,
+.btn-primary[disabled],
+fieldset[disabled] .btn-primary,
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus,
+.btn-primary.disabled:active,
+.btn-primary[disabled]:active,
+fieldset[disabled] .btn-primary:active,
+.btn-primary.disabled.active,
+.btn-primary[disabled].active,
+fieldset[disabled] .btn-primary.active {
+  background-color: #265a88;
+  background-image: none;
+}
+.btn-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #3e8f3e;
+}
+.btn-success:hover,
+.btn-success:focus {
+  background-color: #419641;
+  background-position: 0 -15px;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #419641;
+  border-color: #3e8f3e;
+}
+.btn-success.disabled,
+.btn-success[disabled],
+fieldset[disabled] .btn-success,
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus,
+.btn-success.disabled:active,
+.btn-success[disabled]:active,
+fieldset[disabled] .btn-success:active,
+.btn-success.disabled.active,
+.btn-success[disabled].active,
+fieldset[disabled] .btn-success.active {
+  background-color: #419641;
+  background-image: none;
+}
+.btn-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #28a4c9;
+}
+.btn-info:hover,
+.btn-info:focus {
+  background-color: #2aabd2;
+  background-position: 0 -15px;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #2aabd2;
+  border-color: #28a4c9;
+}
+.btn-info.disabled,
+.btn-info[disabled],
+fieldset[disabled] .btn-info,
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus,
+.btn-info.disabled:active,
+.btn-info[disabled]:active,
+fieldset[disabled] .btn-info:active,
+.btn-info.disabled.active,
+.btn-info[disabled].active,
+fieldset[disabled] .btn-info.active {
+  background-color: #2aabd2;
+  background-image: none;
+}
+.btn-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #e38d13;
+}
+.btn-warning:hover,
+.btn-warning:focus {
+  background-color: #eb9316;
+  background-position: 0 -15px;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #eb9316;
+  border-color: #e38d13;
+}
+.btn-warning.disabled,
+.btn-warning[disabled],
+fieldset[disabled] .btn-warning,
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus,
+.btn-warning.disabled:active,
+.btn-warning[disabled]:active,
+fieldset[disabled] .btn-warning:active,
+.btn-warning.disabled.active,
+.btn-warning[disabled].active,
+fieldset[disabled] .btn-warning.active {
+  background-color: #eb9316;
+  background-image: none;
+}
+.btn-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-color: #b92c28;
+}
+.btn-danger:hover,
+.btn-danger:focus {
+  background-color: #c12e2a;
+  background-position: 0 -15px;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #c12e2a;
+  border-color: #b92c28;
+}
+.btn-danger.disabled,
+.btn-danger[disabled],
+fieldset[disabled] .btn-danger,
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus,
+.btn-danger.disabled:active,
+.btn-danger[disabled]:active,
+fieldset[disabled] .btn-danger:active,
+.btn-danger.disabled.active,
+.btn-danger[disabled].active,
+fieldset[disabled] .btn-danger.active {
+  background-color: #c12e2a;
+  background-image: none;
+}
+.thumbnail,
+.img-thumbnail {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  background-color: #e8e8e8;
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  background-color: #2e6da4;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.navbar-default {
+  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
+  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
+  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+.navbar-inverse {
+  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
+  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  background-repeat: repeat-x;
+  border-radius: 4px;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .active > a {
+  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
+  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
+  background-repeat: repeat-x;
+  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+}
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+@media (max-width: 767px) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+    background-repeat: repeat-x;
+  }
+}
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+}
+.alert-success {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #b2dba1;
+}
+.alert-info {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #9acfea;
+}
+.alert-warning {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #f5e79e;
+}
+.alert-danger {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dca7a7;
+}
+.progress {
+  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-success {
+  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
+  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-info {
+  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
+  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-warning {
+  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
+  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-danger {
+  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
+  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+  background-repeat: repeat-x;
+}
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.list-group {
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 #286090;
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #2b669a;
+}
+.list-group-item.active .badge,
+.list-group-item.active:hover .badge,
+.list-group-item.active:focus .badge {
+  text-shadow: none;
+}
+.panel {
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
+}
+.panel-default > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
+  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-primary > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
+  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-success > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
+  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-info > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
+  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-warning > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
+  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.panel-danger > .panel-heading {
+  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
+  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
+  background-repeat: repeat-x;
+}
+.well {
+  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
+  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
+  background-repeat: repeat-x;
+  border-color: #dcdcdc;
+  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+}
+/*# sourceMappingURL=bootstrap-theme.css.map */
diff --git a/doc/doxygen/css/bootstrap-theme.css.map b/doc/doxygen/css/bootstrap-theme.css.map
new file mode 100644
index 0000000..21e1910
--- /dev/null
+++ b/doc/doxygen/css/bootstrap-theme.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n  text-shadow: none;\n}\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n.btn-default {\n  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n  background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #dbdbdb;\n  text-shadow: 0 1px 0 #fff;\n  border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n  background-color: #e0e0e0;\n  background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n  background-color: #e0e0e0;\n  border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #e0e0e0;\n  background-image: none;\n}\n.btn-primary {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n  background-color: #265a88;\n  background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #265a88;\n  border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #265a88;\n  background-image: none;\n}\n.btn-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n  background-color: #419641;\n  background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n  background-color: #419641;\n  border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #419641;\n  background-image: none;\n}\n.btn-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n  background-color: #2aabd2;\n  background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n  background-color: #2aabd2;\n  border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #2aabd2;\n  background-image: none;\n}\n.btn-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n  background-color: #eb9316;\n  background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #eb9316;\n  border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #eb9316;\n  background-image: none;\n}\n.btn-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  background-repeat: repeat-x;\n  border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n  background-color: #c12e2a;\n  background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c12e2a;\n  border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #c12e2a;\n  background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n  background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  background-color: #2e6da4;\n}\n.navbar-default {\n  background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n  background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n  background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n  box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n@media (max-width: 767px) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n    background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n    background-repeat: repeat-x;\n    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n  }\n}\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n  border-color: #b2dba1;\n}\n.alert-info {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n  border-color: #9acfea;\n}\n.alert-warning {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n  border-color: #f5e79e;\n}\n.alert-danger {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n  border-color: #dca7a7;\n}\n.progress {\n  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #286090;\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n  border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n  text-shadow: none;\n}\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n  background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  border-color: #dcdcdc;\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    .box-shadow(none);\n  }\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n  background-repeat: repeat-x;\n  border-color: darken(@btn-color, 14%);\n\n  &:hover,\n  &:focus  {\n    background-color: darken(@btn-color, 12%);\n    background-position: 0 -15px;\n  }\n\n  &:active,\n  &.active {\n    background-color: darken(@btn-color, 12%);\n    border-color: darken(@btn-color, 14%);\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &.focus,\n    &:active,\n    &.active {\n      background-color: darken(@btn-color, 12%);\n      background-image: none;\n    }\n  }\n}\n\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n  background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n  background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n  border-radius: @navbar-border-radius;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n  }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n  border-radius: @navbar-border-radius;\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n  }\n\n  .navbar-brand,\n  .navbar-nav > li > a {\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a {\n    &,\n    &:hover,\n    &:focus {\n      color: #fff;\n      #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n    }\n  }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n  #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
\ No newline at end of file
diff --git a/doc/doxygen/css/bootstrap-theme.min.css b/doc/doxygen/css/bootstrap-theme.min.css
new file mode 100644
index 0000000..dc95d8e
--- /dev/null
+++ b/doc/doxygen/css/bootstrap-theme.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
+/*# sourceMappingURL=bootstrap-theme.min.css.map */
\ No newline at end of file
diff --git a/doc/doxygen/css/bootstrap-theme.min.css.map b/doc/doxygen/css/bootstrap-theme.min.css.map
new file mode 100644
index 0000000..2c6b65a
--- /dev/null
+++ b/doc/doxygen/css/bootstrap-theme.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA"}
\ No newline at end of file
diff --git a/doc/doxygen/css/bootstrap.css b/doc/doxygen/css/bootstrap.css
new file mode 100644
index 0000000..42c79d6
--- /dev/null
+++ b/doc/doxygen/css/bootstrap.css
@@ -0,0 +1,6760 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+html {
+  font-family: sans-serif;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+body {
+  margin: 0;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+audio,
+canvas,
+progress,
+video {
+  display: inline-block;
+  vertical-align: baseline;
+}
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+[hidden],
+template {
+  display: none;
+}
+a {
+  background-color: transparent;
+}
+a:active,
+a:hover {
+  outline: 0;
+}
+abbr[title] {
+  border-bottom: 1px dotted;
+}
+b,
+strong {
+  font-weight: bold;
+}
+dfn {
+  font-style: italic;
+}
+h1 {
+  margin: .67em 0;
+  font-size: 2em;
+}
+mark {
+  color: #000;
+  background: #ff0;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -.5em;
+}
+sub {
+  bottom: -.25em;
+}
+img {
+  border: 0;
+}
+svg:not(:root) {
+  overflow: hidden;
+}
+figure {
+  margin: 1em 40px;
+}
+hr {
+  height: 0;
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+}
+pre {
+  overflow: auto;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+button,
+input,
+optgroup,
+select,
+textarea {
+  margin: 0;
+  font: inherit;
+  color: inherit;
+}
+button {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button;
+  cursor: pointer;
+}
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+input {
+  line-height: normal;
+}
+input[type="checkbox"],
+input[type="radio"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  padding: 0;
+}
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+fieldset {
+  padding: .35em .625em .75em;
+  margin: 0 2px;
+  border: 1px solid #c0c0c0;
+}
+legend {
+  padding: 0;
+  border: 0;
+}
+textarea {
+  overflow: auto;
+}
+optgroup {
+  font-weight: bold;
+}
+table {
+  border-spacing: 0;
+  border-collapse: collapse;
+}
+td,
+th {
+  padding: 0;
+}
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+@media print {
+  *,
+  *:before,
+  *:after {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    -webkit-box-shadow: none !important;
+            box-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  a[href^="#"]:after,
+  a[href^="javascript:"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+  .navbar {
+    display: none;
+  }
+  .btn > .caret,
+  .dropup > .btn > .caret {
+    border-top-color: #000 !important;
+  }
+  .label {
+    border: 1px solid #000;
+  }
+  .table {
+    border-collapse: collapse !important;
+  }
+  .table td,
+  .table th {
+    background-color: #fff !important;
+  }
+  .table-bordered th,
+  .table-bordered td {
+    border: 1px solid #ddd !important;
+  }
+}
+@font-face {
+  font-family: 'Glyphicons Halflings';
+
+  src: url('../fonts/glyphicons-halflings-regular.eot');
+  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
+}
+.glyphicon {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-family: 'Glyphicons Halflings';
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1;
+
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+  content: "\002a";
+}
+.glyphicon-plus:before {
+  content: "\002b";
+}
+.glyphicon-euro:before,
+.glyphicon-eur:before {
+  content: "\20ac";
+}
+.glyphicon-minus:before {
+  content: "\2212";
+}
+.glyphicon-cloud:before {
+  content: "\2601";
+}
+.glyphicon-envelope:before {
+  content: "\2709";
+}
+.glyphicon-pencil:before {
+  content: "\270f";
+}
+.glyphicon-glass:before {
+  content: "\e001";
+}
+.glyphicon-music:before {
+  content: "\e002";
+}
+.glyphicon-search:before {
+  content: "\e003";
+}
+.glyphicon-heart:before {
+  content: "\e005";
+}
+.glyphicon-star:before {
+  content: "\e006";
+}
+.glyphicon-star-empty:before {
+  content: "\e007";
+}
+.glyphicon-user:before {
+  content: "\e008";
+}
+.glyphicon-film:before {
+  content: "\e009";
+}
+.glyphicon-th-large:before {
+  content: "\e010";
+}
+.glyphicon-th:before {
+  content: "\e011";
+}
+.glyphicon-th-list:before {
+  content: "\e012";
+}
+.glyphicon-ok:before {
+  content: "\e013";
+}
+.glyphicon-remove:before {
+  content: "\e014";
+}
+.glyphicon-zoom-in:before {
+  content: "\e015";
+}
+.glyphicon-zoom-out:before {
+  content: "\e016";
+}
+.glyphicon-off:before {
+  content: "\e017";
+}
+.glyphicon-signal:before {
+  content: "\e018";
+}
+.glyphicon-cog:before {
+  content: "\e019";
+}
+.glyphicon-trash:before {
+  content: "\e020";
+}
+.glyphicon-home:before {
+  content: "\e021";
+}
+.glyphicon-file:before {
+  content: "\e022";
+}
+.glyphicon-time:before {
+  content: "\e023";
+}
+.glyphicon-road:before {
+  content: "\e024";
+}
+.glyphicon-download-alt:before {
+  content: "\e025";
+}
+.glyphicon-download:before {
+  content: "\e026";
+}
+.glyphicon-upload:before {
+  content: "\e027";
+}
+.glyphicon-inbox:before {
+  content: "\e028";
+}
+.glyphicon-play-circle:before {
+  content: "\e029";
+}
+.glyphicon-repeat:before {
+  content: "\e030";
+}
+.glyphicon-refresh:before {
+  content: "\e031";
+}
+.glyphicon-list-alt:before {
+  content: "\e032";
+}
+.glyphicon-lock:before {
+  content: "\e033";
+}
+.glyphicon-flag:before {
+  content: "\e034";
+}
+.glyphicon-headphones:before {
+  content: "\e035";
+}
+.glyphicon-volume-off:before {
+  content: "\e036";
+}
+.glyphicon-volume-down:before {
+  content: "\e037";
+}
+.glyphicon-volume-up:before {
+  content: "\e038";
+}
+.glyphicon-qrcode:before {
+  content: "\e039";
+}
+.glyphicon-barcode:before {
+  content: "\e040";
+}
+.glyphicon-tag:before {
+  content: "\e041";
+}
+.glyphicon-tags:before {
+  content: "\e042";
+}
+.glyphicon-book:before {
+  content: "\e043";
+}
+.glyphicon-bookmark:before {
+  content: "\e044";
+}
+.glyphicon-print:before {
+  content: "\e045";
+}
+.glyphicon-camera:before {
+  content: "\e046";
+}
+.glyphicon-font:before {
+  content: "\e047";
+}
+.glyphicon-bold:before {
+  content: "\e048";
+}
+.glyphicon-italic:before {
+  content: "\e049";
+}
+.glyphicon-text-height:before {
+  content: "\e050";
+}
+.glyphicon-text-width:before {
+  content: "\e051";
+}
+.glyphicon-align-left:before {
+  content: "\e052";
+}
+.glyphicon-align-center:before {
+  content: "\e053";
+}
+.glyphicon-align-right:before {
+  content: "\e054";
+}
+.glyphicon-align-justify:before {
+  content: "\e055";
+}
+.glyphicon-list:before {
+  content: "\e056";
+}
+.glyphicon-indent-left:before {
+  content: "\e057";
+}
+.glyphicon-indent-right:before {
+  content: "\e058";
+}
+.glyphicon-facetime-video:before {
+  content: "\e059";
+}
+.glyphicon-picture:before {
+  content: "\e060";
+}
+.glyphicon-map-marker:before {
+  content: "\e062";
+}
+.glyphicon-adjust:before {
+  content: "\e063";
+}
+.glyphicon-tint:before {
+  content: "\e064";
+}
+.glyphicon-edit:before {
+  content: "\e065";
+}
+.glyphicon-share:before {
+  content: "\e066";
+}
+.glyphicon-check:before {
+  content: "\e067";
+}
+.glyphicon-move:before {
+  content: "\e068";
+}
+.glyphicon-step-backward:before {
+  content: "\e069";
+}
+.glyphicon-fast-backward:before {
+  content: "\e070";
+}
+.glyphicon-backward:before {
+  content: "\e071";
+}
+.glyphicon-play:before {
+  content: "\e072";
+}
+.glyphicon-pause:before {
+  content: "\e073";
+}
+.glyphicon-stop:before {
+  content: "\e074";
+}
+.glyphicon-forward:before {
+  content: "\e075";
+}
+.glyphicon-fast-forward:before {
+  content: "\e076";
+}
+.glyphicon-step-forward:before {
+  content: "\e077";
+}
+.glyphicon-eject:before {
+  content: "\e078";
+}
+.glyphicon-chevron-left:before {
+  content: "\e079";
+}
+.glyphicon-chevron-right:before {
+  content: "\e080";
+}
+.glyphicon-plus-sign:before {
+  content: "\e081";
+}
+.glyphicon-minus-sign:before {
+  content: "\e082";
+}
+.glyphicon-remove-sign:before {
+  content: "\e083";
+}
+.glyphicon-ok-sign:before {
+  content: "\e084";
+}
+.glyphicon-question-sign:before {
+  content: "\e085";
+}
+.glyphicon-info-sign:before {
+  content: "\e086";
+}
+.glyphicon-screenshot:before {
+  content: "\e087";
+}
+.glyphicon-remove-circle:before {
+  content: "\e088";
+}
+.glyphicon-ok-circle:before {
+  content: "\e089";
+}
+.glyphicon-ban-circle:before {
+  content: "\e090";
+}
+.glyphicon-arrow-left:before {
+  content: "\e091";
+}
+.glyphicon-arrow-right:before {
+  content: "\e092";
+}
+.glyphicon-arrow-up:before {
+  content: "\e093";
+}
+.glyphicon-arrow-down:before {
+  content: "\e094";
+}
+.glyphicon-share-alt:before {
+  content: "\e095";
+}
+.glyphicon-resize-full:before {
+  content: "\e096";
+}
+.glyphicon-resize-small:before {
+  content: "\e097";
+}
+.glyphicon-exclamation-sign:before {
+  content: "\e101";
+}
+.glyphicon-gift:before {
+  content: "\e102";
+}
+.glyphicon-leaf:before {
+  content: "\e103";
+}
+.glyphicon-fire:before {
+  content: "\e104";
+}
+.glyphicon-eye-open:before {
+  content: "\e105";
+}
+.glyphicon-eye-close:before {
+  content: "\e106";
+}
+.glyphicon-warning-sign:before {
+  content: "\e107";
+}
+.glyphicon-plane:before {
+  content: "\e108";
+}
+.glyphicon-calendar:before {
+  content: "\e109";
+}
+.glyphicon-random:before {
+  content: "\e110";
+}
+.glyphicon-comment:before {
+  content: "\e111";
+}
+.glyphicon-magnet:before {
+  content: "\e112";
+}
+.glyphicon-chevron-up:before {
+  content: "\e113";
+}
+.glyphicon-chevron-down:before {
+  content: "\e114";
+}
+.glyphicon-retweet:before {
+  content: "\e115";
+}
+.glyphicon-shopping-cart:before {
+  content: "\e116";
+}
+.glyphicon-folder-close:before {
+  content: "\e117";
+}
+.glyphicon-folder-open:before {
+  content: "\e118";
+}
+.glyphicon-resize-vertical:before {
+  content: "\e119";
+}
+.glyphicon-resize-horizontal:before {
+  content: "\e120";
+}
+.glyphicon-hdd:before {
+  content: "\e121";
+}
+.glyphicon-bullhorn:before {
+  content: "\e122";
+}
+.glyphicon-bell:before {
+  content: "\e123";
+}
+.glyphicon-certificate:before {
+  content: "\e124";
+}
+.glyphicon-thumbs-up:before {
+  content: "\e125";
+}
+.glyphicon-thumbs-down:before {
+  content: "\e126";
+}
+.glyphicon-hand-right:before {
+  content: "\e127";
+}
+.glyphicon-hand-left:before {
+  content: "\e128";
+}
+.glyphicon-hand-up:before {
+  content: "\e129";
+}
+.glyphicon-hand-down:before {
+  content: "\e130";
+}
+.glyphicon-circle-arrow-right:before {
+  content: "\e131";
+}
+.glyphicon-circle-arrow-left:before {
+  content: "\e132";
+}
+.glyphicon-circle-arrow-up:before {
+  content: "\e133";
+}
+.glyphicon-circle-arrow-down:before {
+  content: "\e134";
+}
+.glyphicon-globe:before {
+  content: "\e135";
+}
+.glyphicon-wrench:before {
+  content: "\e136";
+}
+.glyphicon-tasks:before {
+  content: "\e137";
+}
+.glyphicon-filter:before {
+  content: "\e138";
+}
+.glyphicon-briefcase:before {
+  content: "\e139";
+}
+.glyphicon-fullscreen:before {
+  content: "\e140";
+}
+.glyphicon-dashboard:before {
+  content: "\e141";
+}
+.glyphicon-paperclip:before {
+  content: "\e142";
+}
+.glyphicon-heart-empty:before {
+  content: "\e143";
+}
+.glyphicon-link:before {
+  content: "\e144";
+}
+.glyphicon-phone:before {
+  content: "\e145";
+}
+.glyphicon-pushpin:before {
+  content: "\e146";
+}
+.glyphicon-usd:before {
+  content: "\e148";
+}
+.glyphicon-gbp:before {
+  content: "\e149";
+}
+.glyphicon-sort:before {
+  content: "\e150";
+}
+.glyphicon-sort-by-alphabet:before {
+  content: "\e151";
+}
+.glyphicon-sort-by-alphabet-alt:before {
+  content: "\e152";
+}
+.glyphicon-sort-by-order:before {
+  content: "\e153";
+}
+.glyphicon-sort-by-order-alt:before {
+  content: "\e154";
+}
+.glyphicon-sort-by-attributes:before {
+  content: "\e155";
+}
+.glyphicon-sort-by-attributes-alt:before {
+  content: "\e156";
+}
+.glyphicon-unchecked:before {
+  content: "\e157";
+}
+.glyphicon-expand:before {
+  content: "\e158";
+}
+.glyphicon-collapse-down:before {
+  content: "\e159";
+}
+.glyphicon-collapse-up:before {
+  content: "\e160";
+}
+.glyphicon-log-in:before {
+  content: "\e161";
+}
+.glyphicon-flash:before {
+  content: "\e162";
+}
+.glyphicon-log-out:before {
+  content: "\e163";
+}
+.glyphicon-new-window:before {
+  content: "\e164";
+}
+.glyphicon-record:before {
+  content: "\e165";
+}
+.glyphicon-save:before {
+  content: "\e166";
+}
+.glyphicon-open:before {
+  content: "\e167";
+}
+.glyphicon-saved:before {
+  content: "\e168";
+}
+.glyphicon-import:before {
+  content: "\e169";
+}
+.glyphicon-export:before {
+  content: "\e170";
+}
+.glyphicon-send:before {
+  content: "\e171";
+}
+.glyphicon-floppy-disk:before {
+  content: "\e172";
+}
+.glyphicon-floppy-saved:before {
+  content: "\e173";
+}
+.glyphicon-floppy-remove:before {
+  content: "\e174";
+}
+.glyphicon-floppy-save:before {
+  content: "\e175";
+}
+.glyphicon-floppy-open:before {
+  content: "\e176";
+}
+.glyphicon-credit-card:before {
+  content: "\e177";
+}
+.glyphicon-transfer:before {
+  content: "\e178";
+}
+.glyphicon-cutlery:before {
+  content: "\e179";
+}
+.glyphicon-header:before {
+  content: "\e180";
+}
+.glyphicon-compressed:before {
+  content: "\e181";
+}
+.glyphicon-earphone:before {
+  content: "\e182";
+}
+.glyphicon-phone-alt:before {
+  content: "\e183";
+}
+.glyphicon-tower:before {
+  content: "\e184";
+}
+.glyphicon-stats:before {
+  content: "\e185";
+}
+.glyphicon-sd-video:before {
+  content: "\e186";
+}
+.glyphicon-hd-video:before {
+  content: "\e187";
+}
+.glyphicon-subtitles:before {
+  content: "\e188";
+}
+.glyphicon-sound-stereo:before {
+  content: "\e189";
+}
+.glyphicon-sound-dolby:before {
+  content: "\e190";
+}
+.glyphicon-sound-5-1:before {
+  content: "\e191";
+}
+.glyphicon-sound-6-1:before {
+  content: "\e192";
+}
+.glyphicon-sound-7-1:before {
+  content: "\e193";
+}
+.glyphicon-copyright-mark:before {
+  content: "\e194";
+}
+.glyphicon-registration-mark:before {
+  content: "\e195";
+}
+.glyphicon-cloud-download:before {
+  content: "\e197";
+}
+.glyphicon-cloud-upload:before {
+  content: "\e198";
+}
+.glyphicon-tree-conifer:before {
+  content: "\e199";
+}
+.glyphicon-tree-deciduous:before {
+  content: "\e200";
+}
+.glyphicon-cd:before {
+  content: "\e201";
+}
+.glyphicon-save-file:before {
+  content: "\e202";
+}
+.glyphicon-open-file:before {
+  content: "\e203";
+}
+.glyphicon-level-up:before {
+  content: "\e204";
+}
+.glyphicon-copy:before {
+  content: "\e205";
+}
+.glyphicon-paste:before {
+  content: "\e206";
+}
+.glyphicon-alert:before {
+  content: "\e209";
+}
+.glyphicon-equalizer:before {
+  content: "\e210";
+}
+.glyphicon-king:before {
+  content: "\e211";
+}
+.glyphicon-queen:before {
+  content: "\e212";
+}
+.glyphicon-pawn:before {
+  content: "\e213";
+}
+.glyphicon-bishop:before {
+  content: "\e214";
+}
+.glyphicon-knight:before {
+  content: "\e215";
+}
+.glyphicon-baby-formula:before {
+  content: "\e216";
+}
+.glyphicon-tent:before {
+  content: "\26fa";
+}
+.glyphicon-blackboard:before {
+  content: "\e218";
+}
+.glyphicon-bed:before {
+  content: "\e219";
+}
+.glyphicon-apple:before {
+  content: "\f8ff";
+}
+.glyphicon-erase:before {
+  content: "\e221";
+}
+.glyphicon-hourglass:before {
+  content: "\231b";
+}
+.glyphicon-lamp:before {
+  content: "\e223";
+}
+.glyphicon-duplicate:before {
+  content: "\e224";
+}
+.glyphicon-piggy-bank:before {
+  content: "\e225";
+}
+.glyphicon-scissors:before {
+  content: "\e226";
+}
+.glyphicon-bitcoin:before {
+  content: "\e227";
+}
+.glyphicon-btc:before {
+  content: "\e227";
+}
+.glyphicon-xbt:before {
+  content: "\e227";
+}
+.glyphicon-yen:before {
+  content: "\00a5";
+}
+.glyphicon-jpy:before {
+  content: "\00a5";
+}
+.glyphicon-ruble:before {
+  content: "\20bd";
+}
+.glyphicon-rub:before {
+  content: "\20bd";
+}
+.glyphicon-scale:before {
+  content: "\e230";
+}
+.glyphicon-ice-lolly:before {
+  content: "\e231";
+}
+.glyphicon-ice-lolly-tasted:before {
+  content: "\e232";
+}
+.glyphicon-education:before {
+  content: "\e233";
+}
+.glyphicon-option-horizontal:before {
+  content: "\e234";
+}
+.glyphicon-option-vertical:before {
+  content: "\e235";
+}
+.glyphicon-menu-hamburger:before {
+  content: "\e236";
+}
+.glyphicon-modal-window:before {
+  content: "\e237";
+}
+.glyphicon-oil:before {
+  content: "\e238";
+}
+.glyphicon-grain:before {
+  content: "\e239";
+}
+.glyphicon-sunglasses:before {
+  content: "\e240";
+}
+.glyphicon-text-size:before {
+  content: "\e241";
+}
+.glyphicon-text-color:before {
+  content: "\e242";
+}
+.glyphicon-text-background:before {
+  content: "\e243";
+}
+.glyphicon-object-align-top:before {
+  content: "\e244";
+}
+.glyphicon-object-align-bottom:before {
+  content: "\e245";
+}
+.glyphicon-object-align-horizontal:before {
+  content: "\e246";
+}
+.glyphicon-object-align-left:before {
+  content: "\e247";
+}
+.glyphicon-object-align-vertical:before {
+  content: "\e248";
+}
+.glyphicon-object-align-right:before {
+  content: "\e249";
+}
+.glyphicon-triangle-right:before {
+  content: "\e250";
+}
+.glyphicon-triangle-left:before {
+  content: "\e251";
+}
+.glyphicon-triangle-bottom:before {
+  content: "\e252";
+}
+.glyphicon-triangle-top:before {
+  content: "\e253";
+}
+.glyphicon-console:before {
+  content: "\e254";
+}
+.glyphicon-superscript:before {
+  content: "\e255";
+}
+.glyphicon-subscript:before {
+  content: "\e256";
+}
+.glyphicon-menu-left:before {
+  content: "\e257";
+}
+.glyphicon-menu-right:before {
+  content: "\e258";
+}
+.glyphicon-menu-down:before {
+  content: "\e259";
+}
+.glyphicon-menu-up:before {
+  content: "\e260";
+}
+* {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+*:before,
+*:after {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+html {
+  font-size: 10px;
+
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+body {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #333;
+  background-color: #fff;
+}
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+a {
+  color: #337ab7;
+  text-decoration: none;
+}
+a:hover,
+a:focus {
+  color: #23527c;
+  text-decoration: underline;
+}
+a:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+figure {
+  margin: 0;
+}
+img {
+  vertical-align: middle;
+}
+.img-responsive,
+.thumbnail > img,
+.thumbnail a > img,
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  max-width: 100%;
+  height: auto;
+}
+.img-rounded {
+  border-radius: 6px;
+}
+.img-thumbnail {
+  display: inline-block;
+  max-width: 100%;
+  height: auto;
+  padding: 4px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: all .2s ease-in-out;
+       -o-transition: all .2s ease-in-out;
+          transition: all .2s ease-in-out;
+}
+.img-circle {
+  border-radius: 50%;
+}
+hr {
+  margin-top: 20px;
+  margin-bottom: 20px;
+  border: 0;
+  border-top: 1px solid #eee;
+}
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+.sr-only-focusable:active,
+.sr-only-focusable:focus {
+  position: static;
+  width: auto;
+  height: auto;
+  margin: 0;
+  overflow: visible;
+  clip: auto;
+}
+[role="button"] {
+  cursor: pointer;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+  font-family: inherit;
+  font-weight: 500;
+  line-height: 1.1;
+  color: inherit;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small,
+.h1 small,
+.h2 small,
+.h3 small,
+.h4 small,
+.h5 small,
+.h6 small,
+h1 .small,
+h2 .small,
+h3 .small,
+h4 .small,
+h5 .small,
+h6 .small,
+.h1 .small,
+.h2 .small,
+.h3 .small,
+.h4 .small,
+.h5 .small,
+.h6 .small {
+  font-weight: normal;
+  line-height: 1;
+  color: #777;
+}
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3 {
+  margin-top: 20px;
+  margin-bottom: 10px;
+}
+h1 small,
+.h1 small,
+h2 small,
+.h2 small,
+h3 small,
+.h3 small,
+h1 .small,
+.h1 .small,
+h2 .small,
+.h2 .small,
+h3 .small,
+.h3 .small {
+  font-size: 65%;
+}
+h4,
+.h4,
+h5,
+.h5,
+h6,
+.h6 {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+h4 small,
+.h4 small,
+h5 small,
+.h5 small,
+h6 small,
+.h6 small,
+h4 .small,
+.h4 .small,
+h5 .small,
+.h5 .small,
+h6 .small,
+.h6 .small {
+  font-size: 75%;
+}
+h1,
+.h1 {
+  font-size: 36px;
+}
+h2,
+.h2 {
+  font-size: 30px;
+}
+h3,
+.h3 {
+  font-size: 24px;
+}
+h4,
+.h4 {
+  font-size: 18px;
+}
+h5,
+.h5 {
+  font-size: 14px;
+}
+h6,
+.h6 {
+  font-size: 12px;
+}
+p {
+  margin: 0 0 10px;
+}
+.lead {
+  margin-bottom: 20px;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 1.4;
+}
+@media (min-width: 768px) {
+  .lead {
+    font-size: 21px;
+  }
+}
+small,
+.small {
+  font-size: 85%;
+}
+mark,
+.mark {
+  padding: .2em;
+  background-color: #fcf8e3;
+}
+.text-left {
+  text-align: left;
+}
+.text-right {
+  text-align: right;
+}
+.text-center {
+  text-align: center;
+}
+.text-justify {
+  text-align: justify;
+}
+.text-nowrap {
+  white-space: nowrap;
+}
+.text-lowercase {
+  text-transform: lowercase;
+}
+.text-uppercase {
+  text-transform: uppercase;
+}
+.text-capitalize {
+  text-transform: capitalize;
+}
+.text-muted {
+  color: #777;
+}
+.text-primary {
+  color: #337ab7;
+}
+a.text-primary:hover,
+a.text-primary:focus {
+  color: #286090;
+}
+.text-success {
+  color: #3c763d;
+}
+a.text-success:hover,
+a.text-success:focus {
+  color: #2b542c;
+}
+.text-info {
+  color: #31708f;
+}
+a.text-info:hover,
+a.text-info:focus {
+  color: #245269;
+}
+.text-warning {
+  color: #8a6d3b;
+}
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #66512c;
+}
+.text-danger {
+  color: #a94442;
+}
+a.text-danger:hover,
+a.text-danger:focus {
+  color: #843534;
+}
+.bg-primary {
+  color: #fff;
+  background-color: #337ab7;
+}
+a.bg-primary:hover,
+a.bg-primary:focus {
+  background-color: #286090;
+}
+.bg-success {
+  background-color: #dff0d8;
+}
+a.bg-success:hover,
+a.bg-success:focus {
+  background-color: #c1e2b3;
+}
+.bg-info {
+  background-color: #d9edf7;
+}
+a.bg-info:hover,
+a.bg-info:focus {
+  background-color: #afd9ee;
+}
+.bg-warning {
+  background-color: #fcf8e3;
+}
+a.bg-warning:hover,
+a.bg-warning:focus {
+  background-color: #f7ecb5;
+}
+.bg-danger {
+  background-color: #f2dede;
+}
+a.bg-danger:hover,
+a.bg-danger:focus {
+  background-color: #e4b9b9;
+}
+.page-header {
+  padding-bottom: 9px;
+  margin: 40px 0 20px;
+  border-bottom: 1px solid #eee;
+}
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: 10px;
+}
+ul ul,
+ol ul,
+ul ol,
+ol ol {
+  margin-bottom: 0;
+}
+.list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+.list-inline {
+  padding-left: 0;
+  margin-left: -5px;
+  list-style: none;
+}
+.list-inline > li {
+  display: inline-block;
+  padding-right: 5px;
+  padding-left: 5px;
+}
+dl {
+  margin-top: 0;
+  margin-bottom: 20px;
+}
+dt,
+dd {
+  line-height: 1.42857143;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .dl-horizontal dt {
+    float: left;
+    width: 160px;
+    overflow: hidden;
+    clear: left;
+    text-align: right;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+  .dl-horizontal dd {
+    margin-left: 180px;
+  }
+}
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #777;
+}
+.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 10px 20px;
+  margin: 0 0 20px;
+  font-size: 17.5px;
+  border-left: 5px solid #eee;
+}
+blockquote p:last-child,
+blockquote ul:last-child,
+blockquote ol:last-child {
+  margin-bottom: 0;
+}
+blockquote footer,
+blockquote small,
+blockquote .small {
+  display: block;
+  font-size: 80%;
+  line-height: 1.42857143;
+  color: #777;
+}
+blockquote footer:before,
+blockquote small:before,
+blockquote .small:before {
+  content: '\2014 \00A0';
+}
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  text-align: right;
+  border-right: 5px solid #eee;
+  border-left: 0;
+}
+.blockquote-reverse footer:before,
+blockquote.pull-right footer:before,
+.blockquote-reverse small:before,
+blockquote.pull-right small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right .small:before {
+  content: '';
+}
+.blockquote-reverse footer:after,
+blockquote.pull-right footer:after,
+.blockquote-reverse small:after,
+blockquote.pull-right small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right .small:after {
+  content: '\00A0 \2014';
+}
+address {
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 1.42857143;
+}
+code,
+kbd,
+pre,
+samp {
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #c7254e;
+  background-color: #f9f2f4;
+  border-radius: 4px;
+}
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: #fff;
+  background-color: #333;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+kbd kbd {
+  padding: 0;
+  font-size: 100%;
+  font-weight: bold;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 1.42857143;
+  color: #333;
+  word-break: break-all;
+  word-wrap: break-word;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+pre code {
+  padding: 0;
+  font-size: inherit;
+  color: inherit;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border-radius: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+.container {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+@media (min-width: 768px) {
+  .container {
+    width: 750px;
+  }
+}
+@media (min-width: 992px) {
+  .container {
+    width: 970px;
+  }
+}
+@media (min-width: 1200px) {
+  .container {
+    width: 1170px;
+  }
+}
+.container-fluid {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-right: auto;
+  margin-left: auto;
+}
+.row {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
+  position: relative;
+  min-height: 1px;
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
+  float: left;
+}
+.col-xs-12 {
+  width: 100%;
+}
+.col-xs-11 {
+  width: 91.66666667%;
+}
+.col-xs-10 {
+  width: 83.33333333%;
+}
+.col-xs-9 {
+  width: 75%;
+}
+.col-xs-8 {
+  width: 66.66666667%;
+}
+.col-xs-7 {
+  width: 58.33333333%;
+}
+.col-xs-6 {
+  width: 50%;
+}
+.col-xs-5 {
+  width: 41.66666667%;
+}
+.col-xs-4 {
+  width: 33.33333333%;
+}
+.col-xs-3 {
+  width: 25%;
+}
+.col-xs-2 {
+  width: 16.66666667%;
+}
+.col-xs-1 {
+  width: 8.33333333%;
+}
+.col-xs-pull-12 {
+  right: 100%;
+}
+.col-xs-pull-11 {
+  right: 91.66666667%;
+}
+.col-xs-pull-10 {
+  right: 83.33333333%;
+}
+.col-xs-pull-9 {
+  right: 75%;
+}
+.col-xs-pull-8 {
+  right: 66.66666667%;
+}
+.col-xs-pull-7 {
+  right: 58.33333333%;
+}
+.col-xs-pull-6 {
+  right: 50%;
+}
+.col-xs-pull-5 {
+  right: 41.66666667%;
+}
+.col-xs-pull-4 {
+  right: 33.33333333%;
+}
+.col-xs-pull-3 {
+  right: 25%;
+}
+.col-xs-pull-2 {
+  right: 16.66666667%;
+}
+.col-xs-pull-1 {
+  right: 8.33333333%;
+}
+.col-xs-pull-0 {
+  right: auto;
+}
+.col-xs-push-12 {
+  left: 100%;
+}
+.col-xs-push-11 {
+  left: 91.66666667%;
+}
+.col-xs-push-10 {
+  left: 83.33333333%;
+}
+.col-xs-push-9 {
+  left: 75%;
+}
+.col-xs-push-8 {
+  left: 66.66666667%;
+}
+.col-xs-push-7 {
+  left: 58.33333333%;
+}
+.col-xs-push-6 {
+  left: 50%;
+}
+.col-xs-push-5 {
+  left: 41.66666667%;
+}
+.col-xs-push-4 {
+  left: 33.33333333%;
+}
+.col-xs-push-3 {
+  left: 25%;
+}
+.col-xs-push-2 {
+  left: 16.66666667%;
+}
+.col-xs-push-1 {
+  left: 8.33333333%;
+}
+.col-xs-push-0 {
+  left: auto;
+}
+.col-xs-offset-12 {
+  margin-left: 100%;
+}
+.col-xs-offset-11 {
+  margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+  margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+  margin-left: 75%;
+}
+.col-xs-offset-8 {
+  margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+  margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+  margin-left: 50%;
+}
+.col-xs-offset-5 {
+  margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+  margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+  margin-left: 25%;
+}
+.col-xs-offset-2 {
+  margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+  margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+  margin-left: 0;
+}
+@media (min-width: 768px) {
+  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
+    float: left;
+  }
+  .col-sm-12 {
+    width: 100%;
+  }
+  .col-sm-11 {
+    width: 91.66666667%;
+  }
+  .col-sm-10 {
+    width: 83.33333333%;
+  }
+  .col-sm-9 {
+    width: 75%;
+  }
+  .col-sm-8 {
+    width: 66.66666667%;
+  }
+  .col-sm-7 {
+    width: 58.33333333%;
+  }
+  .col-sm-6 {
+    width: 50%;
+  }
+  .col-sm-5 {
+    width: 41.66666667%;
+  }
+  .col-sm-4 {
+    width: 33.33333333%;
+  }
+  .col-sm-3 {
+    width: 25%;
+  }
+  .col-sm-2 {
+    width: 16.66666667%;
+  }
+  .col-sm-1 {
+    width: 8.33333333%;
+  }
+  .col-sm-pull-12 {
+    right: 100%;
+  }
+  .col-sm-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-sm-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-sm-pull-9 {
+    right: 75%;
+  }
+  .col-sm-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-sm-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-sm-pull-6 {
+    right: 50%;
+  }
+  .col-sm-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-sm-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-sm-pull-3 {
+    right: 25%;
+  }
+  .col-sm-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-sm-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-sm-pull-0 {
+    right: auto;
+  }
+  .col-sm-push-12 {
+    left: 100%;
+  }
+  .col-sm-push-11 {
+    left: 91.66666667%;
+  }
+  .col-sm-push-10 {
+    left: 83.33333333%;
+  }
+  .col-sm-push-9 {
+    left: 75%;
+  }
+  .col-sm-push-8 {
+    left: 66.66666667%;
+  }
+  .col-sm-push-7 {
+    left: 58.33333333%;
+  }
+  .col-sm-push-6 {
+    left: 50%;
+  }
+  .col-sm-push-5 {
+    left: 41.66666667%;
+  }
+  .col-sm-push-4 {
+    left: 33.33333333%;
+  }
+  .col-sm-push-3 {
+    left: 25%;
+  }
+  .col-sm-push-2 {
+    left: 16.66666667%;
+  }
+  .col-sm-push-1 {
+    left: 8.33333333%;
+  }
+  .col-sm-push-0 {
+    left: auto;
+  }
+  .col-sm-offset-12 {
+    margin-left: 100%;
+  }
+  .col-sm-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-sm-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-sm-offset-9 {
+    margin-left: 75%;
+  }
+  .col-sm-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-sm-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-sm-offset-6 {
+    margin-left: 50%;
+  }
+  .col-sm-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-sm-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-sm-offset-3 {
+    margin-left: 25%;
+  }
+  .col-sm-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-sm-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-sm-offset-0 {
+    margin-left: 0;
+  }
+}
+@media (min-width: 992px) {
+  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
+    float: left;
+  }
+  .col-md-12 {
+    width: 100%;
+  }
+  .col-md-11 {
+    width: 91.66666667%;
+  }
+  .col-md-10 {
+    width: 83.33333333%;
+  }
+  .col-md-9 {
+    width: 75%;
+  }
+  .col-md-8 {
+    width: 66.66666667%;
+  }
+  .col-md-7 {
+    width: 58.33333333%;
+  }
+  .col-md-6 {
+    width: 50%;
+  }
+  .col-md-5 {
+    width: 41.66666667%;
+  }
+  .col-md-4 {
+    width: 33.33333333%;
+  }
+  .col-md-3 {
+    width: 25%;
+  }
+  .col-md-2 {
+    width: 16.66666667%;
+  }
+  .col-md-1 {
+    width: 8.33333333%;
+  }
+  .col-md-pull-12 {
+    right: 100%;
+  }
+  .col-md-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-md-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-md-pull-9 {
+    right: 75%;
+  }
+  .col-md-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-md-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-md-pull-6 {
+    right: 50%;
+  }
+  .col-md-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-md-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-md-pull-3 {
+    right: 25%;
+  }
+  .col-md-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-md-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-md-pull-0 {
+    right: auto;
+  }
+  .col-md-push-12 {
+    left: 100%;
+  }
+  .col-md-push-11 {
+    left: 91.66666667%;
+  }
+  .col-md-push-10 {
+    left: 83.33333333%;
+  }
+  .col-md-push-9 {
+    left: 75%;
+  }
+  .col-md-push-8 {
+    left: 66.66666667%;
+  }
+  .col-md-push-7 {
+    left: 58.33333333%;
+  }
+  .col-md-push-6 {
+    left: 50%;
+  }
+  .col-md-push-5 {
+    left: 41.66666667%;
+  }
+  .col-md-push-4 {
+    left: 33.33333333%;
+  }
+  .col-md-push-3 {
+    left: 25%;
+  }
+  .col-md-push-2 {
+    left: 16.66666667%;
+  }
+  .col-md-push-1 {
+    left: 8.33333333%;
+  }
+  .col-md-push-0 {
+    left: auto;
+  }
+  .col-md-offset-12 {
+    margin-left: 100%;
+  }
+  .col-md-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-md-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-md-offset-9 {
+    margin-left: 75%;
+  }
+  .col-md-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-md-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-md-offset-6 {
+    margin-left: 50%;
+  }
+  .col-md-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-md-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-md-offset-3 {
+    margin-left: 25%;
+  }
+  .col-md-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-md-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-md-offset-0 {
+    margin-left: 0;
+  }
+}
+@media (min-width: 1200px) {
+  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
+    float: left;
+  }
+  .col-lg-12 {
+    width: 100%;
+  }
+  .col-lg-11 {
+    width: 91.66666667%;
+  }
+  .col-lg-10 {
+    width: 83.33333333%;
+  }
+  .col-lg-9 {
+    width: 75%;
+  }
+  .col-lg-8 {
+    width: 66.66666667%;
+  }
+  .col-lg-7 {
+    width: 58.33333333%;
+  }
+  .col-lg-6 {
+    width: 50%;
+  }
+  .col-lg-5 {
+    width: 41.66666667%;
+  }
+  .col-lg-4 {
+    width: 33.33333333%;
+  }
+  .col-lg-3 {
+    width: 25%;
+  }
+  .col-lg-2 {
+    width: 16.66666667%;
+  }
+  .col-lg-1 {
+    width: 8.33333333%;
+  }
+  .col-lg-pull-12 {
+    right: 100%;
+  }
+  .col-lg-pull-11 {
+    right: 91.66666667%;
+  }
+  .col-lg-pull-10 {
+    right: 83.33333333%;
+  }
+  .col-lg-pull-9 {
+    right: 75%;
+  }
+  .col-lg-pull-8 {
+    right: 66.66666667%;
+  }
+  .col-lg-pull-7 {
+    right: 58.33333333%;
+  }
+  .col-lg-pull-6 {
+    right: 50%;
+  }
+  .col-lg-pull-5 {
+    right: 41.66666667%;
+  }
+  .col-lg-pull-4 {
+    right: 33.33333333%;
+  }
+  .col-lg-pull-3 {
+    right: 25%;
+  }
+  .col-lg-pull-2 {
+    right: 16.66666667%;
+  }
+  .col-lg-pull-1 {
+    right: 8.33333333%;
+  }
+  .col-lg-pull-0 {
+    right: auto;
+  }
+  .col-lg-push-12 {
+    left: 100%;
+  }
+  .col-lg-push-11 {
+    left: 91.66666667%;
+  }
+  .col-lg-push-10 {
+    left: 83.33333333%;
+  }
+  .col-lg-push-9 {
+    left: 75%;
+  }
+  .col-lg-push-8 {
+    left: 66.66666667%;
+  }
+  .col-lg-push-7 {
+    left: 58.33333333%;
+  }
+  .col-lg-push-6 {
+    left: 50%;
+  }
+  .col-lg-push-5 {
+    left: 41.66666667%;
+  }
+  .col-lg-push-4 {
+    left: 33.33333333%;
+  }
+  .col-lg-push-3 {
+    left: 25%;
+  }
+  .col-lg-push-2 {
+    left: 16.66666667%;
+  }
+  .col-lg-push-1 {
+    left: 8.33333333%;
+  }
+  .col-lg-push-0 {
+    left: auto;
+  }
+  .col-lg-offset-12 {
+    margin-left: 100%;
+  }
+  .col-lg-offset-11 {
+    margin-left: 91.66666667%;
+  }
+  .col-lg-offset-10 {
+    margin-left: 83.33333333%;
+  }
+  .col-lg-offset-9 {
+    margin-left: 75%;
+  }
+  .col-lg-offset-8 {
+    margin-left: 66.66666667%;
+  }
+  .col-lg-offset-7 {
+    margin-left: 58.33333333%;
+  }
+  .col-lg-offset-6 {
+    margin-left: 50%;
+  }
+  .col-lg-offset-5 {
+    margin-left: 41.66666667%;
+  }
+  .col-lg-offset-4 {
+    margin-left: 33.33333333%;
+  }
+  .col-lg-offset-3 {
+    margin-left: 25%;
+  }
+  .col-lg-offset-2 {
+    margin-left: 16.66666667%;
+  }
+  .col-lg-offset-1 {
+    margin-left: 8.33333333%;
+  }
+  .col-lg-offset-0 {
+    margin-left: 0;
+  }
+}
+table {
+  background-color: transparent;
+}
+caption {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  color: #777;
+  text-align: left;
+}
+th {
+  text-align: left;
+}
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+  padding: 8px;
+  line-height: 1.42857143;
+  vertical-align: top;
+  border-top: 1px solid #ddd;
+}
+.table > thead > tr > th {
+  vertical-align: bottom;
+  border-bottom: 2px solid #ddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > th,
+.table > thead:first-child > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > td {
+  border-top: 0;
+}
+.table > tbody + tbody {
+  border-top: 2px solid #ddd;
+}
+.table .table {
+  background-color: #fff;
+}
+.table-condensed > thead > tr > th,
+.table-condensed > tbody > tr > th,
+.table-condensed > tfoot > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > td {
+  padding: 5px;
+}
+.table-bordered {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+  border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+  border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-of-type(odd) {
+  background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover {
+  background-color: #f5f5f5;
+}
+table col[class*="col-"] {
+  position: static;
+  display: table-column;
+  float: none;
+}
+table td[class*="col-"],
+table th[class*="col-"] {
+  position: static;
+  display: table-cell;
+  float: none;
+}
+.table > thead > tr > td.active,
+.table > tbody > tr > td.active,
+.table > tfoot > tr > td.active,
+.table > thead > tr > th.active,
+.table > tbody > tr > th.active,
+.table > tfoot > tr > th.active,
+.table > thead > tr.active > td,
+.table > tbody > tr.active > td,
+.table > tfoot > tr.active > td,
+.table > thead > tr.active > th,
+.table > tbody > tr.active > th,
+.table > tfoot > tr.active > th {
+  background-color: #f5f5f5;
+}
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover,
+.table-hover > tbody > tr.active:hover > td,
+.table-hover > tbody > tr:hover > .active,
+.table-hover > tbody > tr.active:hover > th {
+  background-color: #e8e8e8;
+}
+.table > thead > tr > td.success,
+.table > tbody > tr > td.success,
+.table > tfoot > tr > td.success,
+.table > thead > tr > th.success,
+.table > tbody > tr > th.success,
+.table > tfoot > tr > th.success,
+.table > thead > tr.success > td,
+.table > tbody > tr.success > td,
+.table > tfoot > tr.success > td,
+.table > thead > tr.success > th,
+.table > tbody > tr.success > th,
+.table > tfoot > tr.success > th {
+  background-color: #dff0d8;
+}
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover,
+.table-hover > tbody > tr.success:hover > td,
+.table-hover > tbody > tr:hover > .success,
+.table-hover > tbody > tr.success:hover > th {
+  background-color: #d0e9c6;
+}
+.table > thead > tr > td.info,
+.table > tbody > tr > td.info,
+.table > tfoot > tr > td.info,
+.table > thead > tr > th.info,
+.table > tbody > tr > th.info,
+.table > tfoot > tr > th.info,
+.table > thead > tr.info > td,
+.table > tbody > tr.info > td,
+.table > tfoot > tr.info > td,
+.table > thead > tr.info > th,
+.table > tbody > tr.info > th,
+.table > tfoot > tr.info > th {
+  background-color: #d9edf7;
+}
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover,
+.table-hover > tbody > tr.info:hover > td,
+.table-hover > tbody > tr:hover > .info,
+.table-hover > tbody > tr.info:hover > th {
+  background-color: #c4e3f3;
+}
+.table > thead > tr > td.warning,
+.table > tbody > tr > td.warning,
+.table > tfoot > tr > td.warning,
+.table > thead > tr > th.warning,
+.table > tbody > tr > th.warning,
+.table > tfoot > tr > th.warning,
+.table > thead > tr.warning > td,
+.table > tbody > tr.warning > td,
+.table > tfoot > tr.warning > td,
+.table > thead > tr.warning > th,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr.warning > th {
+  background-color: #fcf8e3;
+}
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover,
+.table-hover > tbody > tr.warning:hover > td,
+.table-hover > tbody > tr:hover > .warning,
+.table-hover > tbody > tr.warning:hover > th {
+  background-color: #faf2cc;
+}
+.table > thead > tr > td.danger,
+.table > tbody > tr > td.danger,
+.table > tfoot > tr > td.danger,
+.table > thead > tr > th.danger,
+.table > tbody > tr > th.danger,
+.table > tfoot > tr > th.danger,
+.table > thead > tr.danger > td,
+.table > tbody > tr.danger > td,
+.table > tfoot > tr.danger > td,
+.table > thead > tr.danger > th,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr.danger > th {
+  background-color: #f2dede;
+}
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover,
+.table-hover > tbody > tr.danger:hover > td,
+.table-hover > tbody > tr:hover > .danger,
+.table-hover > tbody > tr.danger:hover > th {
+  background-color: #ebcccc;
+}
+.table-responsive {
+  min-height: .01%;
+  overflow-x: auto;
+}
+@media screen and (max-width: 767px) {
+  .table-responsive {
+    width: 100%;
+    margin-bottom: 15px;
+    overflow-y: hidden;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    border: 1px solid #ddd;
+  }
+  .table-responsive > .table {
+    margin-bottom: 0;
+  }
+  .table-responsive > .table > thead > tr > th,
+  .table-responsive > .table > tbody > tr > th,
+  .table-responsive > .table > tfoot > tr > th,
+  .table-responsive > .table > thead > tr > td,
+  .table-responsive > .table > tbody > tr > td,
+  .table-responsive > .table > tfoot > tr > td {
+    white-space: nowrap;
+  }
+  .table-responsive > .table-bordered {
+    border: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:first-child,
+  .table-responsive > .table-bordered > tbody > tr > th:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+  .table-responsive > .table-bordered > thead > tr > td:first-child,
+  .table-responsive > .table-bordered > tbody > tr > td:first-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+    border-left: 0;
+  }
+  .table-responsive > .table-bordered > thead > tr > th:last-child,
+  .table-responsive > .table-bordered > tbody > tr > th:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+  .table-responsive > .table-bordered > thead > tr > td:last-child,
+  .table-responsive > .table-bordered > tbody > tr > td:last-child,
+  .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+    border-right: 0;
+  }
+  .table-responsive > .table-bordered > tbody > tr:last-child > th,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+  .table-responsive > .table-bordered > tbody > tr:last-child > td,
+  .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+    border-bottom: 0;
+  }
+}
+fieldset {
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: inherit;
+  color: #333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+label {
+  display: inline-block;
+  max-width: 100%;
+  margin-bottom: 5px;
+  font-weight: bold;
+}
+input[type="search"] {
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  line-height: normal;
+}
+input[type="file"] {
+  display: block;
+}
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+output {
+  display: block;
+  padding-top: 7px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+}
+.form-control {
+  display: block;
+  width: 100%;
+  height: 34px;
+  padding: 6px 12px;
+  font-size: 14px;
+  line-height: 1.42857143;
+  color: #555;
+  background-color: #fff;
+  background-image: none;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
+       -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+          transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+.form-control:focus {
+  border-color: #66afe9;
+  outline: 0;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+          box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
+}
+.form-control::-moz-placeholder {
+  color: #999;
+  opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+  color: #999;
+}
+.form-control::-webkit-input-placeholder {
+  color: #999;
+}
+.form-control::-ms-expand {
+  background-color: transparent;
+  border: 0;
+}
+.form-control[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+  background-color: #eee;
+  opacity: 1;
+}
+.form-control[disabled],
+fieldset[disabled] .form-control {
+  cursor: not-allowed;
+}
+textarea.form-control {
+  height: auto;
+}
+input[type="search"] {
+  -webkit-appearance: none;
+}
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"].form-control,
+  input[type="time"].form-control,
+  input[type="datetime-local"].form-control,
+  input[type="month"].form-control {
+    line-height: 34px;
+  }
+  input[type="date"].input-sm,
+  input[type="time"].input-sm,
+  input[type="datetime-local"].input-sm,
+  input[type="month"].input-sm,
+  .input-group-sm input[type="date"],
+  .input-group-sm input[type="time"],
+  .input-group-sm input[type="datetime-local"],
+  .input-group-sm input[type="month"] {
+    line-height: 30px;
+  }
+  input[type="date"].input-lg,
+  input[type="time"].input-lg,
+  input[type="datetime-local"].input-lg,
+  input[type="month"].input-lg,
+  .input-group-lg input[type="date"],
+  .input-group-lg input[type="time"],
+  .input-group-lg input[type="datetime-local"],
+  .input-group-lg input[type="month"] {
+    line-height: 46px;
+  }
+}
+.form-group {
+  margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+  min-height: 20px;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-top: 4px \9;
+  margin-left: -20px;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+  position: relative;
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: normal;
+  vertical-align: middle;
+  cursor: pointer;
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"].disabled,
+input[type="checkbox"].disabled,
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"] {
+  cursor: not-allowed;
+}
+.radio-inline.disabled,
+.checkbox-inline.disabled,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox-inline {
+  cursor: not-allowed;
+}
+.radio.disabled label,
+.checkbox.disabled label,
+fieldset[disabled] .radio label,
+fieldset[disabled] .checkbox label {
+  cursor: not-allowed;
+}
+.form-control-static {
+  min-height: 34px;
+  padding-top: 7px;
+  padding-bottom: 7px;
+  margin-bottom: 0;
+}
+.form-control-static.input-lg,
+.form-control-static.input-sm {
+  padding-right: 0;
+  padding-left: 0;
+}
+.input-sm {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-sm {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+  height: auto;
+}
+.form-group-sm .form-control {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.form-group-sm select.form-control {
+  height: 30px;
+  line-height: 30px;
+}
+.form-group-sm textarea.form-control,
+.form-group-sm select[multiple].form-control {
+  height: auto;
+}
+.form-group-sm .form-control-static {
+  height: 30px;
+  min-height: 32px;
+  padding: 6px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.input-lg {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-lg {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+  height: auto;
+}
+.form-group-lg .form-control {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.form-group-lg select.form-control {
+  height: 46px;
+  line-height: 46px;
+}
+.form-group-lg textarea.form-control,
+.form-group-lg select[multiple].form-control {
+  height: auto;
+}
+.form-group-lg .form-control-static {
+  height: 46px;
+  min-height: 38px;
+  padding: 11px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+.has-feedback {
+  position: relative;
+}
+.has-feedback .form-control {
+  padding-right: 42.5px;
+}
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2;
+  display: block;
+  width: 34px;
+  height: 34px;
+  line-height: 34px;
+  text-align: center;
+  pointer-events: none;
+}
+.input-lg + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+  width: 46px;
+  height: 46px;
+  line-height: 46px;
+}
+.input-sm + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+  width: 30px;
+  height: 30px;
+  line-height: 30px;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline,
+.has-success.radio label,
+.has-success.checkbox label,
+.has-success.radio-inline label,
+.has-success.checkbox-inline label {
+  color: #3c763d;
+}
+.has-success .form-control {
+  border-color: #3c763d;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-success .form-control:focus {
+  border-color: #2b542c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #3c763d;
+}
+.has-success .form-control-feedback {
+  color: #3c763d;
+}
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline,
+.has-warning.radio label,
+.has-warning.checkbox label,
+.has-warning.radio-inline label,
+.has-warning.checkbox-inline label {
+  color: #8a6d3b;
+}
+.has-warning .form-control {
+  border-color: #8a6d3b;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-warning .form-control:focus {
+  border-color: #66512c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
+}
+.has-warning .input-group-addon {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #8a6d3b;
+}
+.has-warning .form-control-feedback {
+  color: #8a6d3b;
+}
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline,
+.has-error.radio label,
+.has-error.checkbox label,
+.has-error.radio-inline label,
+.has-error.checkbox-inline label {
+  color: #a94442;
+}
+.has-error .form-control {
+  border-color: #a94442;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+.has-error .form-control:focus {
+  border-color: #843534;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #a94442;
+}
+.has-error .form-control-feedback {
+  color: #a94442;
+}
+.has-feedback label ~ .form-control-feedback {
+  top: 25px;
+}
+.has-feedback label.sr-only ~ .form-control-feedback {
+  top: 0;
+}
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: #737373;
+}
+@media (min-width: 768px) {
+  .form-inline .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .form-inline .form-control-static {
+    display: inline-block;
+  }
+  .form-inline .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .form-inline .input-group .input-group-addon,
+  .form-inline .input-group .input-group-btn,
+  .form-inline .input-group .form-control {
+    width: auto;
+  }
+  .form-inline .input-group > .form-control {
+    width: 100%;
+  }
+  .form-inline .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio,
+  .form-inline .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .form-inline .radio label,
+  .form-inline .checkbox label {
+    padding-left: 0;
+  }
+  .form-inline .radio input[type="radio"],
+  .form-inline .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .form-inline .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox,
+.form-horizontal .radio-inline,
+.form-horizontal .checkbox-inline {
+  padding-top: 7px;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+  min-height: 27px;
+}
+.form-horizontal .form-group {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .control-label {
+    padding-top: 7px;
+    margin-bottom: 0;
+    text-align: right;
+  }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+  right: 15px;
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-lg .control-label {
+    padding-top: 11px;
+    font-size: 18px;
+  }
+}
+@media (min-width: 768px) {
+  .form-horizontal .form-group-sm .control-label {
+    padding-top: 6px;
+    font-size: 12px;
+  }
+}
+.btn {
+  display: inline-block;
+  padding: 6px 12px;
+  margin-bottom: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  -ms-touch-action: manipulation;
+      touch-action: manipulation;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.btn:focus,
+.btn:active:focus,
+.btn.active:focus,
+.btn.focus,
+.btn:active.focus,
+.btn.active.focus {
+  outline: thin dotted;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus,
+.btn.focus {
+  color: #333;
+  text-decoration: none;
+}
+.btn:active,
+.btn.active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn.disabled,
+.btn[disabled],
+fieldset[disabled] .btn {
+  cursor: not-allowed;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+          box-shadow: none;
+  opacity: .65;
+}
+a.btn.disabled,
+fieldset[disabled] a.btn {
+  pointer-events: none;
+}
+.btn-default {
+  color: #333;
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default:focus,
+.btn-default.focus {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #8c8c8c;
+}
+.btn-default:hover {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  color: #333;
+  background-color: #e6e6e6;
+  border-color: #adadad;
+}
+.btn-default:active:hover,
+.btn-default.active:hover,
+.open > .dropdown-toggle.btn-default:hover,
+.btn-default:active:focus,
+.btn-default.active:focus,
+.open > .dropdown-toggle.btn-default:focus,
+.btn-default:active.focus,
+.btn-default.active.focus,
+.open > .dropdown-toggle.btn-default.focus {
+  color: #333;
+  background-color: #d4d4d4;
+  border-color: #8c8c8c;
+}
+.btn-default:active,
+.btn-default.active,
+.open > .dropdown-toggle.btn-default {
+  background-image: none;
+}
+.btn-default.disabled:hover,
+.btn-default[disabled]:hover,
+fieldset[disabled] .btn-default:hover,
+.btn-default.disabled:focus,
+.btn-default[disabled]:focus,
+fieldset[disabled] .btn-default:focus,
+.btn-default.disabled.focus,
+.btn-default[disabled].focus,
+fieldset[disabled] .btn-default.focus {
+  background-color: #fff;
+  border-color: #ccc;
+}
+.btn-default .badge {
+  color: #fff;
+  background-color: #333;
+}
+.btn-primary {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.btn-primary:focus,
+.btn-primary.focus {
+  color: #fff;
+  background-color: #286090;
+  border-color: #122b40;
+}
+.btn-primary:hover {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  color: #fff;
+  background-color: #286090;
+  border-color: #204d74;
+}
+.btn-primary:active:hover,
+.btn-primary.active:hover,
+.open > .dropdown-toggle.btn-primary:hover,
+.btn-primary:active:focus,
+.btn-primary.active:focus,
+.open > .dropdown-toggle.btn-primary:focus,
+.btn-primary:active.focus,
+.btn-primary.active.focus,
+.open > .dropdown-toggle.btn-primary.focus {
+  color: #fff;
+  background-color: #204d74;
+  border-color: #122b40;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open > .dropdown-toggle.btn-primary {
+  background-image: none;
+}
+.btn-primary.disabled:hover,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary:hover,
+.btn-primary.disabled:focus,
+.btn-primary[disabled]:focus,
+fieldset[disabled] .btn-primary:focus,
+.btn-primary.disabled.focus,
+.btn-primary[disabled].focus,
+fieldset[disabled] .btn-primary.focus {
+  background-color: #337ab7;
+  border-color: #2e6da4;
+}
+.btn-primary .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.btn-success {
+  color: #fff;
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success:focus,
+.btn-success.focus {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #255625;
+}
+.btn-success:hover {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  color: #fff;
+  background-color: #449d44;
+  border-color: #398439;
+}
+.btn-success:active:hover,
+.btn-success.active:hover,
+.open > .dropdown-toggle.btn-success:hover,
+.btn-success:active:focus,
+.btn-success.active:focus,
+.open > .dropdown-toggle.btn-success:focus,
+.btn-success:active.focus,
+.btn-success.active.focus,
+.open > .dropdown-toggle.btn-success.focus {
+  color: #fff;
+  background-color: #398439;
+  border-color: #255625;
+}
+.btn-success:active,
+.btn-success.active,
+.open > .dropdown-toggle.btn-success {
+  background-image: none;
+}
+.btn-success.disabled:hover,
+.btn-success[disabled]:hover,
+fieldset[disabled] .btn-success:hover,
+.btn-success.disabled:focus,
+.btn-success[disabled]:focus,
+fieldset[disabled] .btn-success:focus,
+.btn-success.disabled.focus,
+.btn-success[disabled].focus,
+fieldset[disabled] .btn-success.focus {
+  background-color: #5cb85c;
+  border-color: #4cae4c;
+}
+.btn-success .badge {
+  color: #5cb85c;
+  background-color: #fff;
+}
+.btn-info {
+  color: #fff;
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info:focus,
+.btn-info.focus {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #1b6d85;
+}
+.btn-info:hover {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  color: #fff;
+  background-color: #31b0d5;
+  border-color: #269abc;
+}
+.btn-info:active:hover,
+.btn-info.active:hover,
+.open > .dropdown-toggle.btn-info:hover,
+.btn-info:active:focus,
+.btn-info.active:focus,
+.open > .dropdown-toggle.btn-info:focus,
+.btn-info:active.focus,
+.btn-info.active.focus,
+.open > .dropdown-toggle.btn-info.focus {
+  color: #fff;
+  background-color: #269abc;
+  border-color: #1b6d85;
+}
+.btn-info:active,
+.btn-info.active,
+.open > .dropdown-toggle.btn-info {
+  background-image: none;
+}
+.btn-info.disabled:hover,
+.btn-info[disabled]:hover,
+fieldset[disabled] .btn-info:hover,
+.btn-info.disabled:focus,
+.btn-info[disabled]:focus,
+fieldset[disabled] .btn-info:focus,
+.btn-info.disabled.focus,
+.btn-info[disabled].focus,
+fieldset[disabled] .btn-info.focus {
+  background-color: #5bc0de;
+  border-color: #46b8da;
+}
+.btn-info .badge {
+  color: #5bc0de;
+  background-color: #fff;
+}
+.btn-warning {
+  color: #fff;
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning:focus,
+.btn-warning.focus {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #985f0d;
+}
+.btn-warning:hover {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  color: #fff;
+  background-color: #ec971f;
+  border-color: #d58512;
+}
+.btn-warning:active:hover,
+.btn-warning.active:hover,
+.open > .dropdown-toggle.btn-warning:hover,
+.btn-warning:active:focus,
+.btn-warning.active:focus,
+.open > .dropdown-toggle.btn-warning:focus,
+.btn-warning:active.focus,
+.btn-warning.active.focus,
+.open > .dropdown-toggle.btn-warning.focus {
+  color: #fff;
+  background-color: #d58512;
+  border-color: #985f0d;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open > .dropdown-toggle.btn-warning {
+  background-image: none;
+}
+.btn-warning.disabled:hover,
+.btn-warning[disabled]:hover,
+fieldset[disabled] .btn-warning:hover,
+.btn-warning.disabled:focus,
+.btn-warning[disabled]:focus,
+fieldset[disabled] .btn-warning:focus,
+.btn-warning.disabled.focus,
+.btn-warning[disabled].focus,
+fieldset[disabled] .btn-warning.focus {
+  background-color: #f0ad4e;
+  border-color: #eea236;
+}
+.btn-warning .badge {
+  color: #f0ad4e;
+  background-color: #fff;
+}
+.btn-danger {
+  color: #fff;
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger:focus,
+.btn-danger.focus {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #761c19;
+}
+.btn-danger:hover {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  color: #fff;
+  background-color: #c9302c;
+  border-color: #ac2925;
+}
+.btn-danger:active:hover,
+.btn-danger.active:hover,
+.open > .dropdown-toggle.btn-danger:hover,
+.btn-danger:active:focus,
+.btn-danger.active:focus,
+.open > .dropdown-toggle.btn-danger:focus,
+.btn-danger:active.focus,
+.btn-danger.active.focus,
+.open > .dropdown-toggle.btn-danger.focus {
+  color: #fff;
+  background-color: #ac2925;
+  border-color: #761c19;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open > .dropdown-toggle.btn-danger {
+  background-image: none;
+}
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover,
+fieldset[disabled] .btn-danger:hover,
+.btn-danger.disabled:focus,
+.btn-danger[disabled]:focus,
+fieldset[disabled] .btn-danger:focus,
+.btn-danger.disabled.focus,
+.btn-danger[disabled].focus,
+fieldset[disabled] .btn-danger.focus {
+  background-color: #d9534f;
+  border-color: #d43f3a;
+}
+.btn-danger .badge {
+  color: #d9534f;
+  background-color: #fff;
+}
+.btn-link {
+  font-weight: normal;
+  color: #337ab7;
+  border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link.active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+  background-color: transparent;
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+  border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+  color: #23527c;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-link[disabled]:hover,
+fieldset[disabled] .btn-link:hover,
+.btn-link[disabled]:focus,
+fieldset[disabled] .btn-link:focus {
+  color: #777;
+  text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+  padding: 1px 5px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity .15s linear;
+       -o-transition: opacity .15s linear;
+          transition: opacity .15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  display: none;
+}
+.collapse.in {
+  display: block;
+}
+tr.collapse.in {
+  display: table-row;
+}
+tbody.collapse.in {
+  display: table-row-group;
+}
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition-timing-function: ease;
+       -o-transition-timing-function: ease;
+          transition-timing-function: ease;
+  -webkit-transition-duration: .35s;
+       -o-transition-duration: .35s;
+          transition-duration: .35s;
+  -webkit-transition-property: height, visibility;
+       -o-transition-property: height, visibility;
+          transition-property: height, visibility;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: 4px dashed;
+  border-top: 4px solid \9;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+}
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle:focus {
+  outline: 0;
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  font-size: 14px;
+  text-align: left;
+  list-style: none;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .15);
+  border-radius: 4px;
+  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+          box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 1.42857143;
+  color: #333;
+  white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  color: #262626;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #fff;
+  text-decoration: none;
+  background-color: #337ab7;
+  outline: 0;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #777;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.open > .dropdown-menu {
+  display: block;
+}
+.open > a {
+  outline: 0;
+}
+.dropdown-menu-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu-left {
+  right: auto;
+  left: 0;
+}
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: 12px;
+  line-height: 1.42857143;
+  color: #777;
+  white-space: nowrap;
+}
+.dropdown-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 990;
+}
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  content: "";
+  border-top: 0;
+  border-bottom: 4px dashed;
+  border-bottom: 4px solid \9;
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
+}
+@media (min-width: 768px) {
+  .navbar-right .dropdown-menu {
+    right: 0;
+    left: auto;
+  }
+  .navbar-right .dropdown-menu-left {
+    right: auto;
+    left: 0;
+  }
+}
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle;
+}
+.btn-group > .btn,
+.btn-group-vertical > .btn {
+  position: relative;
+  float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus,
+.btn-group > .btn:active,
+.btn-group-vertical > .btn:active,
+.btn-group > .btn.active,
+.btn-group-vertical > .btn.active {
+  z-index: 2;
+}
+.btn-group .btn + .btn,
+.btn-group .btn + .btn-group,
+.btn-group .btn-group + .btn,
+.btn-group .btn-group + .btn-group {
+  margin-left: -1px;
+}
+.btn-toolbar {
+  margin-left: -5px;
+}
+.btn-toolbar .btn,
+.btn-toolbar .btn-group,
+.btn-toolbar .input-group {
+  float: left;
+}
+.btn-toolbar > .btn,
+.btn-toolbar > .btn-group,
+.btn-toolbar > .input-group {
+  margin-left: 5px;
+}
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+}
+.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-right: 8px;
+  padding-left: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-right: 12px;
+  padding-left: 12px;
+}
+.btn-group.open .dropdown-toggle {
+  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+.btn-group.open .dropdown-toggle.btn-link {
+  -webkit-box-shadow: none;
+          box-shadow: none;
+}
+.btn .caret {
+  margin-left: 0;
+}
+.btn-lg .caret {
+  border-width: 5px 5px 0;
+  border-bottom-width: 0;
+}
+.dropup .btn-lg .caret {
+  border-width: 0 5px 5px;
+}
+.btn-group-vertical > .btn,
+.btn-group-vertical > .btn-group,
+.btn-group-vertical > .btn-group > .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  max-width: 100%;
+}
+.btn-group-vertical > .btn-group > .btn {
+  float: none;
+}
+.btn-group-vertical > .btn + .btn,
+.btn-group-vertical > .btn + .btn-group,
+.btn-group-vertical > .btn-group + .btn,
+.btn-group-vertical > .btn-group + .btn-group {
+  margin-top: -1px;
+  margin-left: 0;
+}
+.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn:first-child:not(:last-child) {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+}
+.btn-group-justified > .btn,
+.btn-group-justified > .btn-group {
+  display: table-cell;
+  float: none;
+  width: 1%;
+}
+.btn-group-justified > .btn-group .btn {
+  width: 100%;
+}
+.btn-group-justified > .btn-group .dropdown-menu {
+  left: auto;
+}
+[data-toggle="buttons"] > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
+[data-toggle="buttons"] > .btn input[type="checkbox"],
+[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+  position: absolute;
+  clip: rect(0, 0, 0, 0);
+  pointer-events: none;
+}
+.input-group {
+  position: relative;
+  display: table;
+  border-collapse: separate;
+}
+.input-group[class*="col-"] {
+  float: none;
+  padding-right: 0;
+  padding-left: 0;
+}
+.input-group .form-control {
+  position: relative;
+  z-index: 2;
+  float: left;
+  width: 100%;
+  margin-bottom: 0;
+}
+.input-group .form-control:focus {
+  z-index: 3;
+}
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+  border-radius: 6px;
+}
+select.input-group-lg > .form-control,
+select.input-group-lg > .input-group-addon,
+select.input-group-lg > .input-group-btn > .btn {
+  height: 46px;
+  line-height: 46px;
+}
+textarea.input-group-lg > .form-control,
+textarea.input-group-lg > .input-group-addon,
+textarea.input-group-lg > .input-group-btn > .btn,
+select[multiple].input-group-lg > .form-control,
+select[multiple].input-group-lg > .input-group-addon,
+select[multiple].input-group-lg > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+  border-radius: 3px;
+}
+select.input-group-sm > .form-control,
+select.input-group-sm > .input-group-addon,
+select.input-group-sm > .input-group-btn > .btn {
+  height: 30px;
+  line-height: 30px;
+}
+textarea.input-group-sm > .form-control,
+textarea.input-group-sm > .input-group-addon,
+textarea.input-group-sm > .input-group-btn > .btn,
+select[multiple].input-group-sm > .form-control,
+select[multiple].input-group-sm > .input-group-addon,
+select[multiple].input-group-sm > .input-group-btn > .btn {
+  height: auto;
+}
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+  border-radius: 0;
+}
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+.input-group-addon {
+  padding: 6px 12px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 1;
+  color: #555;
+  text-align: center;
+  background-color: #eee;
+  border: 1px solid #ccc;
+  border-radius: 4px;
+}
+.input-group-addon.input-sm {
+  padding: 5px 10px;
+  font-size: 12px;
+  border-radius: 3px;
+}
+.input-group-addon.input-lg {
+  padding: 10px 16px;
+  font-size: 18px;
+  border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+  margin-top: 0;
+}
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+}
+.input-group-addon:first-child {
+  border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.input-group-addon:last-child {
+  border-left: 0;
+}
+.input-group-btn {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-group-btn > .btn {
+  position: relative;
+}
+.input-group-btn > .btn + .btn {
+  margin-left: -1px;
+}
+.input-group-btn > .btn:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+  z-index: 2;
+}
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group {
+  margin-right: -1px;
+}
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group {
+  z-index: 2;
+  margin-left: -1px;
+}
+.nav {
+  padding-left: 0;
+  margin-bottom: 0;
+  list-style: none;
+}
+.nav > li {
+  position: relative;
+  display: block;
+}
+.nav > li > a {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.nav > li.disabled > a {
+  color: #777;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+  color: #777;
+  text-decoration: none;
+  cursor: not-allowed;
+  background-color: transparent;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+  background-color: #eee;
+  border-color: #337ab7;
+}
+.nav .nav-divider {
+  height: 1px;
+  margin: 9px 0;
+  overflow: hidden;
+  background-color: #e5e5e5;
+}
+.nav > li > a > img {
+  max-width: none;
+}
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+  float: left;
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  margin-right: 2px;
+  line-height: 1.42857143;
+  border: 1px solid transparent;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eee #eee #ddd;
+}
+.nav-tabs > li.active > a,
+.nav-tabs > li.active > a:hover,
+.nav-tabs > li.active > a:focus {
+  color: #555;
+  cursor: default;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+.nav-tabs.nav-justified {
+  width: 100%;
+  border-bottom: 0;
+}
+.nav-tabs.nav-justified > li {
+  float: none;
+}
+.nav-tabs.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-tabs.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-tabs.nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs.nav-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs.nav-justified > .active > a,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs.nav-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs.nav-justified > .active > a,
+  .nav-tabs.nav-justified > .active > a:hover,
+  .nav-tabs.nav-justified > .active > a:focus {
+    border-bottom-color: #fff;
+  }
+}
+.nav-pills > li {
+  float: left;
+}
+.nav-pills > li > a {
+  border-radius: 4px;
+}
+.nav-pills > li + li {
+  margin-left: 2px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+  color: #fff;
+  background-color: #337ab7;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li + li {
+  margin-top: 2px;
+  margin-left: 0;
+}
+.nav-justified {
+  width: 100%;
+}
+.nav-justified > li {
+  float: none;
+}
+.nav-justified > li > a {
+  margin-bottom: 5px;
+  text-align: center;
+}
+.nav-justified > .dropdown .dropdown-menu {
+  top: auto;
+  left: auto;
+}
+@media (min-width: 768px) {
+  .nav-justified > li {
+    display: table-cell;
+    width: 1%;
+  }
+  .nav-justified > li > a {
+    margin-bottom: 0;
+  }
+}
+.nav-tabs-justified {
+  border-bottom: 0;
+}
+.nav-tabs-justified > li > a {
+  margin-right: 0;
+  border-radius: 4px;
+}
+.nav-tabs-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus {
+  border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+  .nav-tabs-justified > li > a {
+    border-bottom: 1px solid #ddd;
+    border-radius: 4px 4px 0 0;
+  }
+  .nav-tabs-justified > .active > a,
+  .nav-tabs-justified > .active > a:hover,
+  .nav-tabs-justified > .active > a:focus {
+    border-bottom-color: #fff;
+  }
+}
+.tab-content > .tab-pane {
+  display: none;
+}
+.tab-content > .active {
+  display: block;
+}
+.nav-tabs .dropdown-menu {
+  margin-top: -1px;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.navbar {
+  position: relative;
+  min-height: 50px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+}
+@media (min-width: 768px) {
+  .navbar {
+    border-radius: 4px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-header {
+    float: left;
+  }
+}
+.navbar-collapse {
+  padding-right: 15px;
+  padding-left: 15px;
+  overflow-x: visible;
+  -webkit-overflow-scrolling: touch;
+  border-top: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+}
+.navbar-collapse.in {
+  overflow-y: auto;
+}
+@media (min-width: 768px) {
+  .navbar-collapse {
+    width: auto;
+    border-top: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-collapse.collapse {
+    display: block !important;
+    height: auto !important;
+    padding-bottom: 0;
+    overflow: visible !important;
+  }
+  .navbar-collapse.in {
+    overflow-y: visible;
+  }
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-static-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+.navbar-fixed-top .navbar-collapse,
+.navbar-fixed-bottom .navbar-collapse {
+  max-height: 340px;
+}
+@media (max-device-width: 480px) and (orientation: landscape) {
+  .navbar-fixed-top .navbar-collapse,
+  .navbar-fixed-bottom .navbar-collapse {
+    max-height: 200px;
+  }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+  margin-right: -15px;
+  margin-left: -15px;
+}
+@media (min-width: 768px) {
+  .container > .navbar-header,
+  .container-fluid > .navbar-header,
+  .container > .navbar-collapse,
+  .container-fluid > .navbar-collapse {
+    margin-right: 0;
+    margin-left: 0;
+  }
+}
+.navbar-static-top {
+  z-index: 1000;
+  border-width: 0 0 1px;
+}
+@media (min-width: 768px) {
+  .navbar-static-top {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+@media (min-width: 768px) {
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    border-radius: 0;
+  }
+}
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0;
+  border-width: 1px 0 0;
+}
+.navbar-brand {
+  float: left;
+  height: 50px;
+  padding: 15px 15px;
+  font-size: 18px;
+  line-height: 20px;
+}
+.navbar-brand:hover,
+.navbar-brand:focus {
+  text-decoration: none;
+}
+.navbar-brand > img {
+  display: block;
+}
+@media (min-width: 768px) {
+  .navbar > .container .navbar-brand,
+  .navbar > .container-fluid .navbar-brand {
+    margin-left: -15px;
+  }
+}
+.navbar-toggle {
+  position: relative;
+  float: right;
+  padding: 9px 10px;
+  margin-top: 8px;
+  margin-right: 15px;
+  margin-bottom: 8px;
+  background-color: transparent;
+  background-image: none;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.navbar-toggle:focus {
+  outline: 0;
+}
+.navbar-toggle .icon-bar {
+  display: block;
+  width: 22px;
+  height: 2px;
+  border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+  margin-top: 4px;
+}
+@media (min-width: 768px) {
+  .navbar-toggle {
+    display: none;
+  }
+}
+.navbar-nav {
+  margin: 7.5px -15px;
+}
+.navbar-nav > li > a {
+  padding-top: 10px;
+  padding-bottom: 10px;
+  line-height: 20px;
+}
+@media (max-width: 767px) {
+  .navbar-nav .open .dropdown-menu {
+    position: static;
+    float: none;
+    width: auto;
+    margin-top: 0;
+    background-color: transparent;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+  .navbar-nav .open .dropdown-menu > li > a,
+  .navbar-nav .open .dropdown-menu .dropdown-header {
+    padding: 5px 15px 5px 25px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a {
+    line-height: 20px;
+  }
+  .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-nav .open .dropdown-menu > li > a:focus {
+    background-image: none;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-nav {
+    float: left;
+    margin: 0;
+  }
+  .navbar-nav > li {
+    float: left;
+  }
+  .navbar-nav > li > a {
+    padding-top: 15px;
+    padding-bottom: 15px;
+  }
+}
+.navbar-form {
+  padding: 10px 15px;
+  margin-top: 8px;
+  margin-right: -15px;
+  margin-bottom: 8px;
+  margin-left: -15px;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+}
+@media (min-width: 768px) {
+  .navbar-form .form-group {
+    display: inline-block;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control {
+    display: inline-block;
+    width: auto;
+    vertical-align: middle;
+  }
+  .navbar-form .form-control-static {
+    display: inline-block;
+  }
+  .navbar-form .input-group {
+    display: inline-table;
+    vertical-align: middle;
+  }
+  .navbar-form .input-group .input-group-addon,
+  .navbar-form .input-group .input-group-btn,
+  .navbar-form .input-group .form-control {
+    width: auto;
+  }
+  .navbar-form .input-group > .form-control {
+    width: 100%;
+  }
+  .navbar-form .control-label {
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio,
+  .navbar-form .checkbox {
+    display: inline-block;
+    margin-top: 0;
+    margin-bottom: 0;
+    vertical-align: middle;
+  }
+  .navbar-form .radio label,
+  .navbar-form .checkbox label {
+    padding-left: 0;
+  }
+  .navbar-form .radio input[type="radio"],
+  .navbar-form .checkbox input[type="checkbox"] {
+    position: relative;
+    margin-left: 0;
+  }
+  .navbar-form .has-feedback .form-control-feedback {
+    top: 0;
+  }
+}
+@media (max-width: 767px) {
+  .navbar-form .form-group {
+    margin-bottom: 5px;
+  }
+  .navbar-form .form-group:last-child {
+    margin-bottom: 0;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-form {
+    width: auto;
+    padding-top: 0;
+    padding-bottom: 0;
+    margin-right: 0;
+    margin-left: 0;
+    border: 0;
+    -webkit-box-shadow: none;
+            box-shadow: none;
+  }
+}
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 0;
+  border-bottom-left-radius: 0;
+}
+.navbar-btn {
+  margin-top: 8px;
+  margin-bottom: 8px;
+}
+.navbar-btn.btn-sm {
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.navbar-btn.btn-xs {
+  margin-top: 14px;
+  margin-bottom: 14px;
+}
+.navbar-text {
+  margin-top: 15px;
+  margin-bottom: 15px;
+}
+@media (min-width: 768px) {
+  .navbar-text {
+    float: left;
+    margin-right: 15px;
+    margin-left: 15px;
+  }
+}
+@media (min-width: 768px) {
+  .navbar-left {
+    float: left !important;
+  }
+  .navbar-right {
+    float: right !important;
+    margin-right: -15px;
+  }
+  .navbar-right ~ .navbar-right {
+    margin-right: 0;
+  }
+}
+.navbar-default {
+  background-color: #f8f8f8;
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+  color: #777;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+  color: #5e5e5e;
+  background-color: transparent;
+}
+.navbar-default .navbar-text {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a {
+  color: #777;
+}
+.navbar-default .navbar-nav > li > a:hover,
+.navbar-default .navbar-nav > li > a:focus {
+  color: #333;
+  background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a,
+.navbar-default .navbar-nav > .active > a:hover,
+.navbar-default .navbar-nav > .active > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+  color: #ccc;
+  background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+  border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+  background-color: #ddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+  background-color: #888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+  border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a,
+.navbar-default .navbar-nav > .open > a:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+  color: #555;
+  background-color: #e7e7e7;
+}
+@media (max-width: 767px) {
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+    color: #777;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #333;
+    background-color: transparent;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #555;
+    background-color: #e7e7e7;
+  }
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #ccc;
+    background-color: transparent;
+  }
+}
+.navbar-default .navbar-link {
+  color: #777;
+}
+.navbar-default .navbar-link:hover {
+  color: #333;
+}
+.navbar-default .btn-link {
+  color: #777;
+}
+.navbar-default .btn-link:hover,
+.navbar-default .btn-link:focus {
+  color: #333;
+}
+.navbar-default .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-default .btn-link:hover,
+.navbar-default .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-default .btn-link:focus {
+  color: #ccc;
+}
+.navbar-inverse {
+  background-color: #222;
+  border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+  color: #fff;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a,
+.navbar-inverse .navbar-nav > .active > a:hover,
+.navbar-inverse .navbar-nav > .active > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+.navbar-inverse .navbar-nav > .disabled > a,
+.navbar-inverse .navbar-nav > .disabled > a:hover,
+.navbar-inverse .navbar-nav > .disabled > a:focus {
+  color: #444;
+  background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+  border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+  background-color: #333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+  background-color: #fff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+  border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a,
+.navbar-inverse .navbar-nav > .open > a:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+  color: #fff;
+  background-color: #080808;
+}
+@media (max-width: 767px) {
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+    border-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+    color: #9d9d9d;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+    color: #fff;
+    background-color: transparent;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+    color: #fff;
+    background-color: #080808;
+  }
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
+  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+    color: #444;
+    background-color: transparent;
+  }
+}
+.navbar-inverse .navbar-link {
+  color: #9d9d9d;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #fff;
+}
+.navbar-inverse .btn-link {
+  color: #9d9d9d;
+}
+.navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link:focus {
+  color: #fff;
+}
+.navbar-inverse .btn-link[disabled]:hover,
+fieldset[disabled] .navbar-inverse .btn-link:hover,
+.navbar-inverse .btn-link[disabled]:focus,
+fieldset[disabled] .navbar-inverse .btn-link:focus {
+  color: #444;
+}
+.breadcrumb {
+  padding: 8px 15px;
+  margin-bottom: 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+}
+.breadcrumb > li {
+  display: inline-block;
+}
+.breadcrumb > li + li:before {
+  padding: 0 5px;
+  color: #ccc;
+  content: "/\00a0";
+}
+.breadcrumb > .active {
+  color: #777;
+}
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: 20px 0;
+  border-radius: 4px;
+}
+.pagination > li {
+  display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+  position: relative;
+  float: left;
+  padding: 6px 12px;
+  margin-left: -1px;
+  line-height: 1.42857143;
+  color: #337ab7;
+  text-decoration: none;
+  background-color: #fff;
+  border: 1px solid #ddd;
+}
+.pagination > li:first-child > a,
+.pagination > li:first-child > span {
+  margin-left: 0;
+  border-top-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+.pagination > li:last-child > a,
+.pagination > li:last-child > span {
+  border-top-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+}
+.pagination > li > a:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+  z-index: 2;
+  color: #23527c;
+  background-color: #eee;
+  border-color: #ddd;
+}
+.pagination > .active > a,
+.pagination > .active > span,
+.pagination > .active > a:hover,
+.pagination > .active > span:hover,
+.pagination > .active > a:focus,
+.pagination > .active > span:focus {
+  z-index: 3;
+  color: #fff;
+  cursor: default;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+  border-color: #ddd;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+  padding: 10px 16px;
+  font-size: 18px;
+  line-height: 1.3333333;
+}
+.pagination-lg > li:first-child > a,
+.pagination-lg > li:first-child > span {
+  border-top-left-radius: 6px;
+  border-bottom-left-radius: 6px;
+}
+.pagination-lg > li:last-child > a,
+.pagination-lg > li:last-child > span {
+  border-top-right-radius: 6px;
+  border-bottom-right-radius: 6px;
+}
+.pagination-sm > li > a,
+.pagination-sm > li > span {
+  padding: 5px 10px;
+  font-size: 12px;
+  line-height: 1.5;
+}
+.pagination-sm > li:first-child > a,
+.pagination-sm > li:first-child > span {
+  border-top-left-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.pagination-sm > li:last-child > a,
+.pagination-sm > li:last-child > span {
+  border-top-right-radius: 3px;
+  border-bottom-right-radius: 3px;
+}
+.pager {
+  padding-left: 0;
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+}
+.pager li {
+  display: inline;
+}
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #eee;
+}
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #fff;
+}
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+}
+a.label:hover,
+a.label:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label:empty {
+  display: none;
+}
+.btn .label {
+  position: relative;
+  top: -1px;
+}
+.label-default {
+  background-color: #777;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+  background-color: #5e5e5e;
+}
+.label-primary {
+  background-color: #337ab7;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+  background-color: #286090;
+}
+.label-success {
+  background-color: #5cb85c;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+  background-color: #449d44;
+}
+.label-info {
+  background-color: #5bc0de;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+  background-color: #31b0d5;
+}
+.label-warning {
+  background-color: #f0ad4e;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+  background-color: #ec971f;
+}
+.label-danger {
+  background-color: #d9534f;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+  background-color: #c9302c;
+}
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: 12px;
+  font-weight: bold;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  background-color: #777;
+  border-radius: 10px;
+}
+.badge:empty {
+  display: none;
+}
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-xs .badge,
+.btn-group-xs > .btn .badge {
+  top: 0;
+  padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+  color: #fff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.list-group-item > .badge {
+  float: right;
+}
+.list-group-item > .badge + .badge {
+  margin-right: 5px;
+}
+.nav-pills > li > a > .badge {
+  margin-left: 3px;
+}
+.jumbotron {
+  padding-top: 30px;
+  padding-bottom: 30px;
+  margin-bottom: 30px;
+  color: inherit;
+  background-color: #eee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+  color: inherit;
+}
+.jumbotron p {
+  margin-bottom: 15px;
+  font-size: 21px;
+  font-weight: 200;
+}
+.jumbotron > hr {
+  border-top-color: #d5d5d5;
+}
+.container .jumbotron,
+.container-fluid .jumbotron {
+  padding-right: 15px;
+  padding-left: 15px;
+  border-radius: 6px;
+}
+.jumbotron .container {
+  max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+  .jumbotron {
+    padding-top: 48px;
+    padding-bottom: 48px;
+  }
+  .container .jumbotron,
+  .container-fluid .jumbotron {
+    padding-right: 60px;
+    padding-left: 60px;
+  }
+  .jumbotron h1,
+  .jumbotron .h1 {
+    font-size: 63px;
+  }
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  margin-bottom: 20px;
+  line-height: 1.42857143;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  border-radius: 4px;
+  -webkit-transition: border .2s ease-in-out;
+       -o-transition: border .2s ease-in-out;
+          transition: border .2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+  margin-right: auto;
+  margin-left: auto;
+}
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: #337ab7;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #333;
+}
+.alert {
+  padding: 15px;
+  margin-bottom: 20px;
+  border: 1px solid transparent;
+  border-radius: 4px;
+}
+.alert h4 {
+  margin-top: 0;
+  color: inherit;
+}
+.alert .alert-link {
+  font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+  margin-bottom: 0;
+}
+.alert > p + p {
+  margin-top: 5px;
+}
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  color: inherit;
+}
+.alert-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.alert-success hr {
+  border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+  color: #2b542c;
+}
+.alert-info {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.alert-info hr {
+  border-top-color: #a6e1ec;
+}
+.alert-info .alert-link {
+  color: #245269;
+}
+.alert-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.alert-warning hr {
+  border-top-color: #f7e1b5;
+}
+.alert-warning .alert-link {
+  color: #66512c;
+}
+.alert-danger {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.alert-danger hr {
+  border-top-color: #e4b9c0;
+}
+.alert-danger .alert-link {
+  color: #843534;
+}
+@-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;
+  }
+}
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f5f5f5;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+}
+.progress-bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  line-height: 20px;
+  color: #fff;
+  text-align: center;
+  background-color: #337ab7;
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+  -webkit-transition: width .6s ease;
+       -o-transition: width .6s ease;
+          transition: width .6s ease;
+}
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+.progress.active .progress-bar,
+.progress-bar.active {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-bar-success {
+  background-color: #5cb85c;
+}
+.progress-striped .progress-bar-success {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-info {
+  background-color: #5bc0de;
+}
+.progress-striped .progress-bar-info {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-warning {
+  background-color: #f0ad4e;
+}
+.progress-striped .progress-bar-warning {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.progress-bar-danger {
+  background-color: #d9534f;
+}
+.progress-striped .progress-bar-danger {
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+.media {
+  margin-top: 15px;
+}
+.media:first-child {
+  margin-top: 0;
+}
+.media,
+.media-body {
+  overflow: hidden;
+  zoom: 1;
+}
+.media-body {
+  width: 10000px;
+}
+.media-object {
+  display: block;
+}
+.media-object.img-thumbnail {
+  max-width: none;
+}
+.media-right,
+.media > .pull-right {
+  padding-left: 10px;
+}
+.media-left,
+.media > .pull-left {
+  padding-right: 10px;
+}
+.media-left,
+.media-right,
+.media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+.media-middle {
+  vertical-align: middle;
+}
+.media-bottom {
+  vertical-align: bottom;
+}
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.media-list {
+  padding-left: 0;
+  list-style: none;
+}
+.list-group {
+  padding-left: 0;
+  margin-bottom: 20px;
+}
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  margin-bottom: -1px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+}
+.list-group-item:first-child {
+  border-top-left-radius: 4px;
+  border-top-right-radius: 4px;
+}
+.list-group-item:last-child {
+  margin-bottom: 0;
+  border-bottom-right-radius: 4px;
+  border-bottom-left-radius: 4px;
+}
+a.list-group-item,
+button.list-group-item {
+  color: #555;
+}
+a.list-group-item .list-group-item-heading,
+button.list-group-item .list-group-item-heading {
+  color: #333;
+}
+a.list-group-item:hover,
+button.list-group-item:hover,
+a.list-group-item:focus,
+button.list-group-item:focus {
+  color: #555;
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+button.list-group-item {
+  width: 100%;
+  text-align: left;
+}
+.list-group-item.disabled,
+.list-group-item.disabled:hover,
+.list-group-item.disabled:focus {
+  color: #777;
+  cursor: not-allowed;
+  background-color: #eee;
+}
+.list-group-item.disabled .list-group-item-heading,
+.list-group-item.disabled:hover .list-group-item-heading,
+.list-group-item.disabled:focus .list-group-item-heading {
+  color: inherit;
+}
+.list-group-item.disabled .list-group-item-text,
+.list-group-item.disabled:hover .list-group-item-text,
+.list-group-item.disabled:focus .list-group-item-text {
+  color: #777;
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  z-index: 2;
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small,
+.list-group-item.active:hover .list-group-item-heading > .small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+  color: inherit;
+}
+.list-group-item.active .list-group-item-text,
+.list-group-item.active:hover .list-group-item-text,
+.list-group-item.active:focus .list-group-item-text {
+  color: #c7ddef;
+}
+.list-group-item-success {
+  color: #3c763d;
+  background-color: #dff0d8;
+}
+a.list-group-item-success,
+button.list-group-item-success {
+  color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading,
+button.list-group-item-success .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-success:hover,
+button.list-group-item-success:hover,
+a.list-group-item-success:focus,
+button.list-group-item-success:focus {
+  color: #3c763d;
+  background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+button.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+button.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus,
+button.list-group-item-success.active:focus {
+  color: #fff;
+  background-color: #3c763d;
+  border-color: #3c763d;
+}
+.list-group-item-info {
+  color: #31708f;
+  background-color: #d9edf7;
+}
+a.list-group-item-info,
+button.list-group-item-info {
+  color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading,
+button.list-group-item-info .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-info:hover,
+button.list-group-item-info:hover,
+a.list-group-item-info:focus,
+button.list-group-item-info:focus {
+  color: #31708f;
+  background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+button.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+button.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus,
+button.list-group-item-info.active:focus {
+  color: #fff;
+  background-color: #31708f;
+  border-color: #31708f;
+}
+.list-group-item-warning {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+}
+a.list-group-item-warning,
+button.list-group-item-warning {
+  color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading,
+button.list-group-item-warning .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-warning:hover,
+button.list-group-item-warning:hover,
+a.list-group-item-warning:focus,
+button.list-group-item-warning:focus {
+  color: #8a6d3b;
+  background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+button.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+button.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus,
+button.list-group-item-warning.active:focus {
+  color: #fff;
+  background-color: #8a6d3b;
+  border-color: #8a6d3b;
+}
+.list-group-item-danger {
+  color: #a94442;
+  background-color: #f2dede;
+}
+a.list-group-item-danger,
+button.list-group-item-danger {
+  color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading,
+button.list-group-item-danger .list-group-item-heading {
+  color: inherit;
+}
+a.list-group-item-danger:hover,
+button.list-group-item-danger:hover,
+a.list-group-item-danger:focus,
+button.list-group-item-danger:focus {
+  color: #a94442;
+  background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+button.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+button.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus,
+button.list-group-item-danger.active:focus {
+  color: #fff;
+  background-color: #a94442;
+  border-color: #a94442;
+}
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
+.panel {
+  margin-bottom: 20px;
+  background-color: #fff;
+  border: 1px solid transparent;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+.panel-body {
+  padding: 15px;
+}
+.panel-heading {
+  padding: 10px 15px;
+  border-bottom: 1px solid transparent;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel-heading > .dropdown .dropdown-toggle {
+  color: inherit;
+}
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: 16px;
+  color: inherit;
+}
+.panel-title > a,
+.panel-title > small,
+.panel-title > .small,
+.panel-title > small > a,
+.panel-title > .small > a {
+  color: inherit;
+}
+.panel-footer {
+  padding: 10px 15px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .list-group,
+.panel > .panel-collapse > .list-group {
+  margin-bottom: 0;
+}
+.panel > .list-group .list-group-item,
+.panel > .panel-collapse > .list-group .list-group-item {
+  border-width: 1px 0;
+  border-radius: 0;
+}
+.panel > .list-group:first-child .list-group-item:first-child,
+.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+  border-top: 0;
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .list-group:last-child .list-group-item:last-child,
+.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+  border-bottom: 0;
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+  border-top-width: 0;
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table,
+.panel > .panel-collapse > .table {
+  margin-bottom: 0;
+}
+.panel > .table caption,
+.panel > .table-responsive > .table caption,
+.panel > .panel-collapse > .table caption {
+  padding-right: 15px;
+  padding-left: 15px;
+}
+.panel > .table:first-child,
+.panel > .table-responsive:first-child > .table:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+  border-top-left-radius: 3px;
+  border-top-right-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+  border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+  border-top-right-radius: 3px;
+}
+.panel > .table:last-child,
+.panel > .table-responsive:last-child > .table:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+  border-bottom-right-radius: 3px;
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+  border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+  border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive,
+.panel > .table + .panel-body,
+.panel > .table-responsive + .panel-body {
+  border-top: 1px solid #ddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+  border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+  border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+  border-left: 0;
+}
+.panel > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+  border-right: 0;
+}
+.panel > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+  border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+  border-bottom: 0;
+}
+.panel > .table-responsive {
+  margin-bottom: 0;
+  border: 0;
+}
+.panel-group {
+  margin-bottom: 20px;
+}
+.panel-group .panel {
+  margin-bottom: 0;
+  border-radius: 4px;
+}
+.panel-group .panel + .panel {
+  margin-top: 5px;
+}
+.panel-group .panel-heading {
+  border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body,
+.panel-group .panel-heading + .panel-collapse > .list-group {
+  border-top: 1px solid #ddd;
+}
+.panel-group .panel-footer {
+  border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+  border-bottom: 1px solid #ddd;
+}
+.panel-default {
+  border-color: #ddd;
+}
+.panel-default > .panel-heading {
+  color: #333;
+  background-color: #f5f5f5;
+  border-color: #ddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ddd;
+}
+.panel-default > .panel-heading .badge {
+  color: #f5f5f5;
+  background-color: #333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ddd;
+}
+.panel-primary {
+  border-color: #337ab7;
+}
+.panel-primary > .panel-heading {
+  color: #fff;
+  background-color: #337ab7;
+  border-color: #337ab7;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #337ab7;
+}
+.panel-primary > .panel-heading .badge {
+  color: #337ab7;
+  background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #337ab7;
+}
+.panel-success {
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+  color: #3c763d;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+  color: #dff0d8;
+  background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #d6e9c6;
+}
+.panel-info {
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+  color: #31708f;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #bce8f1;
+}
+.panel-info > .panel-heading .badge {
+  color: #d9edf7;
+  background-color: #31708f;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #bce8f1;
+}
+.panel-warning {
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+  color: #8a6d3b;
+  background-color: #fcf8e3;
+  border-color: #faebcc;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #faebcc;
+}
+.panel-warning > .panel-heading .badge {
+  color: #fcf8e3;
+  background-color: #8a6d3b;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #faebcc;
+}
+.panel-danger {
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+  color: #a94442;
+  background-color: #f2dede;
+  border-color: #ebccd1;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+  border-top-color: #ebccd1;
+}
+.panel-danger > .panel-heading .badge {
+  color: #f2dede;
+  background-color: #a94442;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+  border-bottom-color: #ebccd1;
+}
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object,
+.embed-responsive video {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border: 0;
+}
+.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, .15);
+}
+.well-lg {
+  padding: 24px;
+  border-radius: 6px;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: 3px;
+}
+.close {
+  float: right;
+  font-size: 21px;
+  font-weight: bold;
+  line-height: 1;
+  color: #000;
+  text-shadow: 0 1px 0 #fff;
+  filter: alpha(opacity=20);
+  opacity: .2;
+}
+.close:hover,
+.close:focus {
+  color: #000;
+  text-decoration: none;
+  cursor: pointer;
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+button.close {
+  -webkit-appearance: none;
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+}
+.modal-open {
+  overflow: hidden;
+}
+.modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1050;
+  display: none;
+  overflow: hidden;
+  -webkit-overflow-scrolling: touch;
+  outline: 0;
+}
+.modal.fade .modal-dialog {
+  -webkit-transition: -webkit-transform .3s ease-out;
+       -o-transition:      -o-transform .3s ease-out;
+          transition:         transform .3s ease-out;
+  -webkit-transform: translate(0, -25%);
+      -ms-transform: translate(0, -25%);
+       -o-transform: translate(0, -25%);
+          transform: translate(0, -25%);
+}
+.modal.in .modal-dialog {
+  -webkit-transform: translate(0, 0);
+      -ms-transform: translate(0, 0);
+       -o-transform: translate(0, 0);
+          transform: translate(0, 0);
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+.modal-content {
+  position: relative;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  outline: 0;
+  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+          box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000;
+}
+.modal-backdrop.fade {
+  filter: alpha(opacity=0);
+  opacity: 0;
+}
+.modal-backdrop.in {
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.modal-header {
+  padding: 15px;
+  border-bottom: 1px solid #e5e5e5;
+}
+.modal-header .close {
+  margin-top: -2px;
+}
+.modal-title {
+  margin: 0;
+  line-height: 1.42857143;
+}
+.modal-body {
+  position: relative;
+  padding: 15px;
+}
+.modal-footer {
+  padding: 15px;
+  text-align: right;
+  border-top: 1px solid #e5e5e5;
+}
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+@media (min-width: 768px) {
+  .modal-dialog {
+    width: 600px;
+    margin: 30px auto;
+  }
+  .modal-content {
+    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+            box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+  }
+  .modal-sm {
+    width: 300px;
+  }
+}
+@media (min-width: 992px) {
+  .modal-lg {
+    width: 900px;
+  }
+}
+.tooltip {
+  position: absolute;
+  z-index: 1070;
+  display: block;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 12px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  filter: alpha(opacity=0);
+  opacity: 0;
+
+  line-break: auto;
+}
+.tooltip.in {
+  filter: alpha(opacity=90);
+  opacity: .9;
+}
+.tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+.tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+.tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+.tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #fff;
+  text-align: center;
+  background-color: #000;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-left .tooltip-arrow {
+  right: 5px;
+  bottom: 0;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+  bottom: 0;
+  left: 5px;
+  margin-bottom: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+  top: 0;
+  right: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+  top: 0;
+  left: 5px;
+  margin-top: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1060;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  font-style: normal;
+  font-weight: normal;
+  line-height: 1.42857143;
+  text-align: left;
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+  background-color: #fff;
+  -webkit-background-clip: padding-box;
+          background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, .2);
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+
+  line-break: auto;
+}
+.popover.top {
+  margin-top: -10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-left: -10px;
+}
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  border-radius: 5px 5px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover > .arrow,
+.popover > .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover > .arrow {
+  border-width: 11px;
+}
+.popover > .arrow:after {
+  content: "";
+  border-width: 10px;
+}
+.popover.top > .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, .25);
+  border-bottom-width: 0;
+}
+.popover.top > .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-color: #fff;
+  border-bottom-width: 0;
+}
+.popover.right > .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, .25);
+  border-left-width: 0;
+}
+.popover.right > .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  content: " ";
+  border-right-color: #fff;
+  border-left-width: 0;
+}
+.popover.bottom > .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-width: 0;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, .25);
+}
+.popover.bottom > .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  content: " ";
+  border-top-width: 0;
+  border-bottom-color: #fff;
+}
+.popover.left > .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-right-width: 0;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, .25);
+}
+.popover.left > .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  content: " ";
+  border-right-width: 0;
+  border-left-color: #fff;
+}
+.carousel {
+  position: relative;
+}
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+.carousel-inner > .item {
+  position: relative;
+  display: none;
+  -webkit-transition: .6s ease-in-out left;
+       -o-transition: .6s ease-in-out left;
+          transition: .6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  line-height: 1;
+}
+@media all and (transform-3d), (-webkit-transform-3d) {
+  .carousel-inner > .item {
+    -webkit-transition: -webkit-transform .6s ease-in-out;
+         -o-transition:      -o-transform .6s ease-in-out;
+            transition:         transform .6s ease-in-out;
+
+    -webkit-backface-visibility: hidden;
+            backface-visibility: hidden;
+    -webkit-perspective: 1000px;
+            perspective: 1000px;
+  }
+  .carousel-inner > .item.next,
+  .carousel-inner > .item.active.right {
+    left: 0;
+    -webkit-transform: translate3d(100%, 0, 0);
+            transform: translate3d(100%, 0, 0);
+  }
+  .carousel-inner > .item.prev,
+  .carousel-inner > .item.active.left {
+    left: 0;
+    -webkit-transform: translate3d(-100%, 0, 0);
+            transform: translate3d(-100%, 0, 0);
+  }
+  .carousel-inner > .item.next.left,
+  .carousel-inner > .item.prev.right,
+  .carousel-inner > .item.active {
+    left: 0;
+    -webkit-transform: translate3d(0, 0, 0);
+            transform: translate3d(0, 0, 0);
+  }
+}
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+.carousel-inner > .active {
+  left: 0;
+}
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel-inner > .next {
+  left: 100%;
+}
+.carousel-inner > .prev {
+  left: -100%;
+}
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+.carousel-inner > .active.left {
+  left: -100%;
+}
+.carousel-inner > .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: 15%;
+  font-size: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+  background-color: rgba(0, 0, 0, 0);
+  filter: alpha(opacity=50);
+  opacity: .5;
+}
+.carousel-control.left {
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control.right {
+  right: 0;
+  left: auto;
+  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image:      -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
+  background-image:         linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
+  background-repeat: repeat-x;
+}
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #fff;
+  text-decoration: none;
+  filter: alpha(opacity=90);
+  outline: 0;
+  opacity: .9;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-left,
+.carousel-control .glyphicon-chevron-right {
+  position: absolute;
+  top: 50%;
+  z-index: 5;
+  display: inline-block;
+  margin-top: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+  left: 50%;
+  margin-left: -10px;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+  right: 50%;
+  margin-right: -10px;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+  width: 20px;
+  height: 20px;
+  font-family: serif;
+  line-height: 1;
+}
+.carousel-control .icon-prev:before {
+  content: '\2039';
+}
+.carousel-control .icon-next:before {
+  content: '\203a';
+}
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  padding-left: 0;
+  margin-left: -30%;
+  text-align: center;
+  list-style: none;
+}
+.carousel-indicators li {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  margin: 1px;
+  text-indent: -999px;
+  cursor: pointer;
+  background-color: #000 \9;
+  background-color: rgba(0, 0, 0, 0);
+  border: 1px solid #fff;
+  border-radius: 10px;
+}
+.carousel-indicators .active {
+  width: 12px;
+  height: 12px;
+  margin: 0;
+  background-color: #fff;
+}
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: #fff;
+  text-align: center;
+  text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+}
+.carousel-caption .btn {
+  text-shadow: none;
+}
+@media screen and (min-width: 768px) {
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-prev,
+  .carousel-control .icon-next {
+    width: 30px;
+    height: 30px;
+    margin-top: -10px;
+    font-size: 30px;
+  }
+  .carousel-control .glyphicon-chevron-left,
+  .carousel-control .icon-prev {
+    margin-left: -10px;
+  }
+  .carousel-control .glyphicon-chevron-right,
+  .carousel-control .icon-next {
+    margin-right: -10px;
+  }
+  .carousel-caption {
+    right: 20%;
+    left: 20%;
+    padding-bottom: 30px;
+  }
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
+.clearfix:before,
+.clearfix:after,
+.dl-horizontal dd:before,
+.dl-horizontal dd:after,
+.container:before,
+.container:after,
+.container-fluid:before,
+.container-fluid:after,
+.row:before,
+.row:after,
+.form-horizontal .form-group:before,
+.form-horizontal .form-group:after,
+.btn-toolbar:before,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:before,
+.btn-group-vertical > .btn-group:after,
+.nav:before,
+.nav:after,
+.navbar:before,
+.navbar:after,
+.navbar-header:before,
+.navbar-header:after,
+.navbar-collapse:before,
+.navbar-collapse:after,
+.pager:before,
+.pager:after,
+.panel-body:before,
+.panel-body:after,
+.modal-header:before,
+.modal-header:after,
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: " ";
+}
+.clearfix:after,
+.dl-horizontal dd:after,
+.container:after,
+.container-fluid:after,
+.row:after,
+.form-horizontal .form-group:after,
+.btn-toolbar:after,
+.btn-group-vertical > .btn-group:after,
+.nav:after,
+.navbar:after,
+.navbar-header:after,
+.navbar-collapse:after,
+.pager:after,
+.panel-body:after,
+.modal-header:after,
+.modal-footer:after {
+  clear: both;
+}
+.center-block {
+  display: block;
+  margin-right: auto;
+  margin-left: auto;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
+.hide {
+  display: none !important;
+}
+.show {
+  display: block !important;
+}
+.invisible {
+  visibility: hidden;
+}
+.text-hide {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.hidden {
+  display: none !important;
+}
+.affix {
+  position: fixed;
+}
+@-ms-viewport {
+  width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+  display: none !important;
+}
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+@media (max-width: 767px) {
+  .visible-xs {
+    display: block !important;
+  }
+  table.visible-xs {
+    display: table !important;
+  }
+  tr.visible-xs {
+    display: table-row !important;
+  }
+  th.visible-xs,
+  td.visible-xs {
+    display: table-cell !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-block {
+    display: block !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline {
+    display: inline !important;
+  }
+}
+@media (max-width: 767px) {
+  .visible-xs-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm {
+    display: block !important;
+  }
+  table.visible-sm {
+    display: table !important;
+  }
+  tr.visible-sm {
+    display: table-row !important;
+  }
+  th.visible-sm,
+  td.visible-sm {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-block {
+    display: block !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .visible-sm-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md {
+    display: block !important;
+  }
+  table.visible-md {
+    display: table !important;
+  }
+  tr.visible-md {
+    display: table-row !important;
+  }
+  th.visible-md,
+  td.visible-md {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-block {
+    display: block !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .visible-md-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg {
+    display: block !important;
+  }
+  table.visible-lg {
+    display: table !important;
+  }
+  tr.visible-lg {
+    display: table-row !important;
+  }
+  th.visible-lg,
+  td.visible-lg {
+    display: table-cell !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-block {
+    display: block !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline {
+    display: inline !important;
+  }
+}
+@media (min-width: 1200px) {
+  .visible-lg-inline-block {
+    display: inline-block !important;
+  }
+}
+@media (max-width: 767px) {
+  .hidden-xs {
+    display: none !important;
+  }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+  .hidden-sm {
+    display: none !important;
+  }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+  .hidden-md {
+    display: none !important;
+  }
+}
+@media (min-width: 1200px) {
+  .hidden-lg {
+    display: none !important;
+  }
+}
+.visible-print {
+  display: none !important;
+}
+@media print {
+  .visible-print {
+    display: block !important;
+  }
+  table.visible-print {
+    display: table !important;
+  }
+  tr.visible-print {
+    display: table-row !important;
+  }
+  th.visible-print,
+  td.visible-print {
+    display: table-cell !important;
+  }
+}
+.visible-print-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-block {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+}
+@media print {
+  .visible-print-inline-block {
+    display: inline-block !important;
+  }
+}
+@media print {
+  .hidden-print {
+    display: none !important;
+  }
+}
+/*# sourceMappingURL=bootstrap.css.map */
diff --git a/doc/doxygen/css/bootstrap.css.map b/doc/doxygen/css/bootstrap.css.map
new file mode 100644
index 0000000..09f8cda
--- /dev/null
+++ b/doc/doxygen/css/bootstrap.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,iBAAA;CH8O9C;AG7OmC;EAAW,iBAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EErDA,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNqkCD;AIxgCD;EACE,UAAA;CJ0gCD;AIpgCD;EACE,uBAAA;CJsgCD;AIlgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CPglCD;AItgCD;EACE,mBAAA;CJwgCD;AIlgCD;EACE,aAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CPgmCD;AIlgCD;EACE,mBAAA;CJogCD;AI9/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJggCD;AIx/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJ0/BD;AIl/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJo/BH;AIz+BD;EACE,gBAAA;CJ2+BD;AQloCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR8oCD;AQnpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRoqCH;AQhqCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRqqCD;AQzqCD;;;;;;;;;;;;EAQI,eAAA;CR+qCH;AQ5qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRirCD;AQrrCD;;;;;;;;;;;;EAQI,eAAA;CR2rCH;AQvrCD;;EAAU,gBAAA;CR2rCT;AQ1rCD;;EAAU,gBAAA;CR8rCT;AQ7rCD;;EAAU,gBAAA;CRisCT;AQhsCD;;EAAU,gBAAA;CRosCT;AQnsCD;;EAAU,gBAAA;CRusCT;AQtsCD;;EAAU,gBAAA;CR0sCT;AQpsCD;EACE,iBAAA;CRssCD;AQnsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRqsCD;AQhsCD;EAwOA;IA1OI,gBAAA;GRssCD;CACF;AQ9rCD;;EAEE,eAAA;CRgsCD;AQ7rCD;;EAEE,0BAAA;EACA,cAAA;CR+rCD;AQ3rCD;EAAuB,iBAAA;CR8rCtB;AQ7rCD;EAAuB,kBAAA;CRgsCtB;AQ/rCD;EAAuB,mBAAA;CRksCtB;AQjsCD;EAAuB,oBAAA;CRosCtB;AQnsCD;EAAuB,oBAAA;CRssCtB;AQnsCD;EAAuB,0BAAA;CRssCtB;AQrsCD;EAAuB,0BAAA;CRwsCtB;AQvsCD;EAAuB,2BAAA;CR0sCtB;AQvsCD;EACE,eAAA;CRysCD;AQvsCD;ECrGE,eAAA;CT+yCD;AS9yCC;;EAEE,eAAA;CTgzCH;AQ3sCD;ECxGE,eAAA;CTszCD;ASrzCC;;EAEE,eAAA;CTuzCH;AQ/sCD;EC3GE,eAAA;CT6zCD;AS5zCC;;EAEE,eAAA;CT8zCH;AQntCD;EC9GE,eAAA;CTo0CD;ASn0CC;;EAEE,eAAA;CTq0CH;AQvtCD;ECjHE,eAAA;CT20CD;AS10CC;;EAEE,eAAA;CT40CH;AQvtCD;EAGE,YAAA;EE3HA,0BAAA;CVm1CD;AUl1CC;;EAEE,0BAAA;CVo1CH;AQztCD;EE9HE,0BAAA;CV01CD;AUz1CC;;EAEE,0BAAA;CV21CH;AQ7tCD;EEjIE,0BAAA;CVi2CD;AUh2CC;;EAEE,0BAAA;CVk2CH;AQjuCD;EEpIE,0BAAA;CVw2CD;AUv2CC;;EAEE,0BAAA;CVy2CH;AQruCD;EEvIE,0BAAA;CV+2CD;AU92CC;;EAEE,0BAAA;CVg3CH;AQpuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRsuCD;AQ9tCD;;EAEE,cAAA;EACA,oBAAA;CRguCD;AQnuCD;;;;EAMI,iBAAA;CRmuCH;AQ5tCD;EACE,gBAAA;EACA,iBAAA;CR8tCD;AQ1tCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR6tCD;AQ/tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR6tCH;AQxtCD;EACE,cAAA;EACA,oBAAA;CR0tCD;AQxtCD;;EAEE,wBAAA;CR0tCD;AQxtCD;EACE,kBAAA;CR0tCD;AQxtCD;EACE,eAAA;CR0tCD;AQjsCD;EA6EA;IAvFM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXs6CC;EQ9nCH;IAhFM,mBAAA;GRitCH;CACF;AQxsCD;;EAGE,aAAA;EACA,kCAAA;CRysCD;AQvsCD;EACE,eAAA;EA9IqB,0BAAA;CRw1CtB;AQrsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRusCD;AQlsCG;;;EACE,iBAAA;CRssCL;AQhtCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRksCH;AQhsCG;;;EACE,uBAAA;CRosCL;AQ5rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR8rCD;AQxrCG;;;;;;EAAW,YAAA;CRgsCd;AQ/rCG;;;;;;EACE,uBAAA;CRssCL;AQhsCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRksCD;AYx+CD;;;;EAIE,+DAAA;CZ0+CD;AYt+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZw+CD;AYp+CD;EACE,iBAAA;EACA,eAAA;EACA,YAAA;EACA,uBAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZs+CD;AY5+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZs+CH;AYj+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;CZm+CD;AY9+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZk+CH;AY79CD;EACE,kBAAA;EACA,mBAAA;CZ+9CD;AazhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd+hDD;AazhDC;EAqEF;IAvEI,aAAA;Gb+hDD;CACF;Aa3hDC;EAkEF;IApEI,aAAA;GbiiDD;CACF;Aa7hDD;EA+DA;IAjEI,cAAA;GbmiDD;CACF;Aa1hDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdojDD;AavhDD;ECvBE,mBAAA;EACA,oBAAA;CdijDD;AejjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfijDL;AejiDG;EACE,YAAA;CfmiDL;Ae5hDC;EACE,YAAA;Cf8hDH;Ae/hDC;EACE,oBAAA;CfiiDH;AeliDC;EACE,oBAAA;CfoiDH;AeriDC;EACE,WAAA;CfuiDH;AexiDC;EACE,oBAAA;Cf0iDH;Ae3iDC;EACE,oBAAA;Cf6iDH;Ae9iDC;EACE,WAAA;CfgjDH;AejjDC;EACE,oBAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,WAAA;CfyjDH;Ae1jDC;EACE,oBAAA;Cf4jDH;Ae7jDC;EACE,mBAAA;Cf+jDH;AejjDC;EACE,YAAA;CfmjDH;AepjDC;EACE,oBAAA;CfsjDH;AevjDC;EACE,oBAAA;CfyjDH;Ae1jDC;EACE,WAAA;Cf4jDH;Ae7jDC;EACE,oBAAA;Cf+jDH;AehkDC;EACE,oBAAA;CfkkDH;AenkDC;EACE,WAAA;CfqkDH;AetkDC;EACE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBsrED;AgBzrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,2BAAA;ChBsrEP;AgBpsED;EAoBI,uBAAA;EACA,8BAAA;ChBmrEH;AgBxsED;;;;;;EA8BQ,cAAA;ChBkrEP;AgBhtED;EAoCI,2BAAA;ChB+qEH;AgBntED;EAyCI,uBAAA;ChB6qEH;AgBtqED;;;;;;EAOQ,aAAA;ChBuqEP;AgB5pED;EACE,uBAAA;ChB8pED;AgB/pED;;;;;;EAQQ,uBAAA;ChB+pEP;AgBvqED;;EAeM,yBAAA;ChB4pEL;AgBlpED;EAEI,0BAAA;ChBmpEH;AgB1oED;EAEI,0BAAA;ChB2oEH;AgBloED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBooED;AgB/nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBkoEL;AiB9wEC;;;;;;;;;;;;EAOI,0BAAA;CjBqxEL;AiB/wEC;;;;;EAMI,0BAAA;CjBgxEL;AiBnyEC;;;;;;;;;;;;EAOI,0BAAA;CjB0yEL;AiBpyEC;;;;;EAMI,0BAAA;CjBqyEL;AiBxzEC;;;;;;;;;;;;EAOI,0BAAA;CjB+zEL;AiBzzEC;;;;;EAMI,0BAAA;CjB0zEL;AiB70EC;;;;;;;;;;;;EAOI,0BAAA;CjBo1EL;AiB90EC;;;;;EAMI,0BAAA;CjB+0EL;AiBl2EC;;;;;;;;;;;;EAOI,0BAAA;CjBy2EL;AiBn2EC;;;;;EAMI,0BAAA;CjBo2EL;AgBltED;EACE,iBAAA;EACA,kBAAA;ChBotED;AgBvpED;EACA;IA3DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,uBAAA;GhBqtED;EgB9pEH;IAnDM,iBAAA;GhBotEH;EgBjqEH;;;;;;IA1CY,oBAAA;GhBmtET;EgBzqEH;IAlCM,UAAA;GhB8sEH;EgB5qEH;;;;;;IAzBY,eAAA;GhB6sET;EgBprEH;;;;;;IArBY,gBAAA;GhBitET;EgB5rEH;;;;IARY,iBAAA;GhB0sET;CACF;AkBp6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBm6ED;AkBh6ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBk6ED;AkB/5ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBi6ED;AkBt5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL63ET;AkBt5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBw5ED;AkBr5ED;EACE,eAAA;ClBu5ED;AkBn5ED;EACE,eAAA;EACA,YAAA;ClBq5ED;AkBj5ED;;EAEE,aAAA;ClBm5ED;AkB/4ED;;;EZvEE,qBAAA;EAEA,2CAAA;EACA,qBAAA;CN09ED;AkB/4ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClBi5ED;AkBv3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CL0zET;AmBl8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CL27ET;AK15EC;EACE,YAAA;EACA,WAAA;CL45EH;AK15EC;EAA0B,YAAA;CL65E3B;AK55EC;EAAgC,YAAA;CL+5EjC;AkBn4EC;EACE,UAAA;EACA,8BAAA;ClBq4EH;AkB73EC;;;EAGE,0BAAA;EACA,WAAA;ClB+3EH;AkB53EC;;EAEE,oBAAA;ClB83EH;AkB13EC;EACE,aAAA;ClB43EH;AkBh3ED;EACE,yBAAA;ClBk3ED;AkB10ED;EAtBI;;;;IACE,kBAAA;GlBs2EH;EkBn2EC;;;;;;;;IAEE,kBAAA;GlB22EH;EkBx2EC;;;;;;;;IAEE,kBAAA;GlBg3EH;CACF;AkBt2ED;EACE,oBAAA;ClBw2ED;AkBh2ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBk2ED;AkBv2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBm2EH;AkBh2ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBk2ED;AkB/1ED;;EAEE,iBAAA;ClBi2ED;AkB71ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClB+1ED;AkB71ED;;EAEE,cAAA;EACA,kBAAA;ClB+1ED;AkBt1EC;;;;;;EAGE,oBAAA;ClB21EH;AkBr1EC;;;;EAEE,oBAAA;ClBy1EH;AkBn1EC;;;;EAGI,oBAAA;ClBs1EL;AkB30ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClB20ED;AkBz0EC;;EAEE,gBAAA;EACA,iBAAA;ClB20EH;AkB9zED;ECnQE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBokFD;AmBlkFC;EACE,aAAA;EACA,kBAAA;CnBokFH;AmBjkFC;;EAEE,aAAA;CnBmkFH;AkB10ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClB20EH;AkBj1ED;EASI,aAAA;EACA,kBAAA;ClB20EH;AkBr1ED;;EAcI,aAAA;ClB20EH;AkBz1ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClB20EH;AkBv0ED;EC/RE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBymFD;AmBvmFC;EACE,aAAA;EACA,kBAAA;CnBymFH;AmBtmFC;;EAEE,aAAA;CnBwmFH;AkBn1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBo1EH;AkB11ED;EASI,aAAA;EACA,kBAAA;ClBo1EH;AkB91ED;;EAcI,aAAA;ClBo1EH;AkBl2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBo1EH;AkB30ED;EAEE,mBAAA;ClB40ED;AkB90ED;EAMI,sBAAA;ClB20EH;AkBv0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClBy0ED;AkBv0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBy0ED;AkBv0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBy0ED;AkBr0ED;;;;;;;;;;EC1ZI,eAAA;CnB2uFH;AkBj1ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL4rFT;AmB1uFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CLisFT;AkB31ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnB0uFH;AkBh2ED;ECtYI,eAAA;CnByuFH;AkBh2ED;;;;;;;;;;EC7ZI,eAAA;CnBywFH;AkB52ED;ECzZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL0tFT;AmBxwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL+tFT;AkBt3ED;EC/YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBwwFH;AkB33ED;ECzYI,eAAA;CnBuwFH;AkB33ED;;;;;;;;;;EChaI,eAAA;CnBuyFH;AkBv4ED;EC5ZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwvFT;AmBtyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6vFT;AkBj5ED;EClZI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBsyFH;AkBt5ED;EC5YI,eAAA;CnBqyFH;AkBl5EC;EACE,UAAA;ClBo5EH;AkBl5EC;EACE,OAAA;ClBo5EH;AkB14ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB44ED;AkBzzED;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB23EH;EkBvvEH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBy3EH;EkB5vEH;IAxHM,sBAAA;GlBu3EH;EkB/vEH;IApHM,sBAAA;IACA,uBAAA;GlBs3EH;EkBnwEH;;;IA9GQ,YAAA;GlBs3EL;EkBxwEH;IAxGM,YAAA;GlBm3EH;EkB3wEH;IApGM,iBAAA;IACA,uBAAA;GlBk3EH;EkB/wEH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB+2EH;EkBtxEH;;IAtFQ,gBAAA;GlBg3EL;EkB1xEH;;IAjFM,mBAAA;IACA,eAAA;GlB+2EH;EkB/xEH;IA3EM,OAAA;GlB62EH;CACF;AkBn2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClBg2EH;AkB32ED;;EAiBI,iBAAA;ClB81EH;AkB/2ED;EJthBE,mBAAA;EACA,oBAAA;Cdw4FD;AkB50EC;EAyBF;IAnCM,kBAAA;IACA,iBAAA;IACA,iBAAA;GlB01EH;CACF;AkB13ED;EAwCI,YAAA;ClBq1EH;AkBv0EC;EAUF;IAdQ,kBAAA;IACA,gBAAA;GlB+0EL;CACF;AkBr0EC;EAEF;IANQ,iBAAA;IACA,gBAAA;GlB60EL;CACF;AoBt6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC0CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB+JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CLiuFT;AoBz6FG;;;;;;EdrBF,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNq8FD;AoB76FC;;;EAGE,YAAA;EACA,sBAAA;CpB+6FH;AoB56FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLo5FT;AoB56FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CL65FT;AoB56FG;;EAEE,qBAAA;CpB86FL;AoBr6FD;EC3DE,YAAA;EACA,uBAAA;EACA,mBAAA;CrBm+FD;AqBj+FC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBm+FP;AqBj+FC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBm+FP;AqBj+FC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBm+FP;AqBj+FG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBy+FT;AqBt+FC;;;EAGE,uBAAA;CrBw+FH;AqBn+FG;;;;;;;;;EAGE,uBAAA;EACI,mBAAA;CrB2+FT;AoB19FD;ECZI,YAAA;EACA,uBAAA;CrBy+FH;AoB39FD;EC9DE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB4hGD;AqB1hGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB4hGP;AqB1hGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB4hGP;AqB1hGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB4hGP;AqB1hGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBkiGT;AqB/hGC;;;EAGE,uBAAA;CrBiiGH;AqB5hGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBoiGT;AoBhhGD;ECfI,eAAA;EACA,uBAAA;CrBkiGH;AoBhhGD;EClEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBqlGD;AqBnlGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBqlGP;AqBnlGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBqlGP;AqBnlGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBqlGP;AqBnlGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2lGT;AqBxlGC;;;EAGE,uBAAA;CrB0lGH;AqBrlGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB6lGT;AoBrkGD;ECnBI,eAAA;EACA,uBAAA;CrB2lGH;AoBrkGD;ECtEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB8oGD;AqB5oGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB8oGP;AqB5oGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB8oGP;AqB5oGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB8oGP;AqB5oGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBopGT;AqBjpGC;;;EAGE,uBAAA;CrBmpGH;AqB9oGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBspGT;AoB1nGD;ECvBI,eAAA;EACA,uBAAA;CrBopGH;AoB1nGD;EC1EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBusGD;AqBrsGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBusGP;AqBrsGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBusGP;AqBrsGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBusGP;AqBrsGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6sGT;AqB1sGC;;;EAGE,uBAAA;CrB4sGH;AqBvsGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB+sGT;AoB/qGD;EC3BI,eAAA;EACA,uBAAA;CrB6sGH;AoB/qGD;EC9EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBgwGD;AqB9vGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBgwGP;AqB9vGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBgwGP;AqB9vGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBgwGP;AqB9vGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBswGT;AqBnwGC;;;EAGE,uBAAA;CrBqwGH;AqBhwGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBwwGT;AoBpuGD;EC/BI,eAAA;EACA,uBAAA;CrBswGH;AoB/tGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpBiuGD;AoB/tGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLqwGT;AoBhuGC;;;;EAIE,0BAAA;CpBkuGH;AoBhuGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpBkuGH;AoB9tGG;;;;EAEE,eAAA;EACA,sBAAA;CpBkuGL;AoBztGD;;ECxEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBqyGD;AoB5tGD;;EC5EE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrB4yGD;AoB/tGD;;EChFE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBmzGD;AoB9tGD;EACE,eAAA;EACA,YAAA;CpBguGD;AoB5tGD;EACE,gBAAA;CpB8tGD;AoBvtGC;;;EACE,YAAA;CpB2tGH;AuBr3GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLosGT;AuBx3GC;EACE,WAAA;CvB03GH;AuBt3GD;EACE,cAAA;CvBw3GD;AuBt3GC;EAAY,eAAA;CvBy3Gb;AuBx3GC;EAAY,mBAAA;CvB23Gb;AuB13GC;EAAY,yBAAA;CvB63Gb;AuB13GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CL8sGT;AwBx5GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxB05GD;AwBt5GD;;EAEE,mBAAA;CxBw5GD;AwBp5GD;EACE,WAAA;CxBs5GD;AwBl5GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBq5GD;AwBh5GC;EACE,SAAA;EACA,WAAA;CxBk5GH;AwB36GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBu8GD;AwBj7GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBi5GH;AwB34GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB64GH;AwBv4GC;;;EAGE,YAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxBy4GH;AwBh4GC;;;EAGE,eAAA;CxBk4GH;AwB93GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxBg4GH;AwB33GD;EAGI,eAAA;CxB23GH;AwB93GD;EAQI,WAAA;CxBy3GH;AwBj3GD;EACE,WAAA;EACA,SAAA;CxBm3GD;AwB32GD;EACE,QAAA;EACA,YAAA;CxB62GD;AwBz2GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB22GD;AwBv2GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxBy2GD;AwBr2GD;EACE,SAAA;EACA,WAAA;CxBu2GD;AwB/1GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxB+1GH;AwBt2GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxB+1GH;AwB10GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB65GC;EwB11GD;IA1DA,QAAA;IACA,YAAA;GxBu5GC;CACF;A2BviHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3ByiHD;A2B7iHD;;EAMI,mBAAA;EACA,YAAA;C3B2iHH;A2BziHG;;;;;;;;EAIE,WAAA;C3B+iHL;A2BziHD;;;;EAKI,kBAAA;C3B0iHH;A2BriHD;EACE,kBAAA;C3BuiHD;A2BxiHD;;;EAOI,YAAA;C3BsiHH;A2B7iHD;;;EAYI,iBAAA;C3BsiHH;A2BliHD;EACE,iBAAA;C3BoiHD;A2BhiHD;EACE,eAAA;C3BkiHD;A2BjiHC;EClDA,8BAAA;EACG,2BAAA;C5BslHJ;A2BhiHD;;EC/CE,6BAAA;EACG,0BAAA;C5BmlHJ;A2B/hHD;EACE,YAAA;C3BiiHD;A2B/hHD;EACE,iBAAA;C3BiiHD;A2B/hHD;;ECnEE,8BAAA;EACG,2BAAA;C5BsmHJ;A2B9hHD;ECjEE,6BAAA;EACG,0BAAA;C5BkmHJ;A2B7hHD;;EAEE,WAAA;C3B+hHD;A2B9gHD;EACE,kBAAA;EACA,mBAAA;C3BghHD;A2B9gHD;EACE,mBAAA;EACA,oBAAA;C3BghHD;A2B3gHD;EtB/CE,yDAAA;EACQ,iDAAA;CL6jHT;A2B3gHC;EtBnDA,yBAAA;EACQ,iBAAA;CLikHT;A2BxgHD;EACE,eAAA;C3B0gHD;A2BvgHD;EACE,wBAAA;EACA,uBAAA;C3BygHD;A2BtgHD;EACE,wBAAA;C3BwgHD;A2BjgHD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3BkgHH;A2BzgHD;EAcM,YAAA;C3B8/GL;A2B5gHD;;;;EAsBI,iBAAA;EACA,eAAA;C3B4/GH;A2Bv/GC;EACE,iBAAA;C3By/GH;A2Bv/GC;EC3KA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B+pHF;A2Bz/GC;EC/KA,2BAAA;EACC,0BAAA;EAOD,gCAAA;EACC,+BAAA;C5BqqHF;A2B1/GD;EACE,iBAAA;C3B4/GD;A2B1/GD;;EC/KE,8BAAA;EACC,6BAAA;C5B6qHF;A2Bz/GD;EC7LE,2BAAA;EACC,0BAAA;C5ByrHF;A2Br/GD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3Bu/GD;A2B3/GD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3Bw/GH;A2BjgHD;EAYI,YAAA;C3Bw/GH;A2BpgHD;EAgBI,WAAA;C3Bu/GH;A2Bt+GD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3Bu+GL;A6BjtHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BmtHD;A6BhtHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7BktHH;A6B3tHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7B0sHH;A6BxsHG;EACE,WAAA;C7B0sHL;A6BhsHD;;;EV0BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnB2qHD;AmBzqHC;;;EACE,aAAA;EACA,kBAAA;CnB6qHH;AmB1qHC;;;;;;EAEE,aAAA;CnBgrHH;A6BltHD;;;EVqBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBksHD;AmBhsHC;;;EACE,aAAA;EACA,kBAAA;CnBosHH;AmBjsHC;;;;;;EAEE,aAAA;CnBusHH;A6BhuHD;;;EAGE,oBAAA;C7BkuHD;A6BhuHC;;;EACE,iBAAA;C7BouHH;A6BhuHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7BkuHD;A6B7tHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;C7B+tHD;A6B5tHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B8tHH;A6B5tHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B8tHH;A6BlvHD;;EA0BI,cAAA;C7B4tHH;A6BvtHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;C5Bo0HJ;A6BxtHD;EACE,gBAAA;C7B0tHD;A6BxtHD;;;;;;;EDxGE,6BAAA;EACG,0BAAA;C5By0HJ;A6BztHD;EACE,eAAA;C7B2tHD;A6BttHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BstHD;A6B3tHD;EAUI,mBAAA;C7BotHH;A6B9tHD;EAYM,kBAAA;C7BqtHL;A6BltHG;;;EAGE,WAAA;C7BotHL;A6B/sHC;;EAGI,mBAAA;C7BgtHL;A6B7sHC;;EAGI,WAAA;EACA,kBAAA;C7B8sHL;A8B72HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B+2HD;A8Bl3HD;EAOI,mBAAA;EACA,eAAA;C9B82HH;A8Bt3HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B82HL;A8B72HK;;EAEE,sBAAA;EACA,0BAAA;C9B+2HP;A8B12HG;EACE,eAAA;C9B42HL;A8B12HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9B42HP;A8Br2HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bu2HL;A8Bh5HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBs5HD;A8Bt5HD;EA0DI,gBAAA;C9B+1HH;A8Bt1HD;EACE,8BAAA;C9Bw1HD;A8Bz1HD;EAGI,YAAA;EAEA,oBAAA;C9Bw1HH;A8B71HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bu1HL;A8Bt1HK;EACE,mCAAA;C9Bw1HP;A8Bl1HK;;;EAGE,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,iCAAA;EACA,gBAAA;C9Bo1HP;A8B/0HC;EAqDA,YAAA;EA8BA,iBAAA;C9BgwHD;A8Bn1HC;EAwDE,YAAA;C9B8xHH;A8Bt1HC;EA0DI,mBAAA;EACA,mBAAA;C9B+xHL;A8B11HC;EAgEE,UAAA;EACA,WAAA;C9B6xHH;A8BjxHD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B4xHH;E8B5tHH;IA9DQ,iBAAA;G9B6xHL;CACF;A8Bv2HC;EAuFE,gBAAA;EACA,mBAAA;C9BmxHH;A8B32HC;;;EA8FE,uBAAA;C9BkxHH;A8BpwHD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9BixHH;E8B9uHH;;;IA9BM,0BAAA;G9BixHH;CACF;A8Bl3HD;EAEI,YAAA;C9Bm3HH;A8Br3HD;EAMM,mBAAA;C9Bk3HL;A8Bx3HD;EASM,iBAAA;C9Bk3HL;A8B72HK;;;EAGE,YAAA;EACA,0BAAA;C9B+2HP;A8Bv2HD;EAEI,YAAA;C9Bw2HH;A8B12HD;EAIM,gBAAA;EACA,eAAA;C9By2HL;A8B71HD;EACE,YAAA;C9B+1HD;A8Bh2HD;EAII,YAAA;C9B+1HH;A8Bn2HD;EAMM,mBAAA;EACA,mBAAA;C9Bg2HL;A8Bv2HD;EAYI,UAAA;EACA,WAAA;C9B81HH;A8Bl1HD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B61HH;E8B7xHH;IA9DQ,iBAAA;G9B81HL;CACF;A8Bt1HD;EACE,iBAAA;C9Bw1HD;A8Bz1HD;EAKI,gBAAA;EACA,mBAAA;C9Bu1HH;A8B71HD;;;EAYI,uBAAA;C9Bs1HH;A8Bx0HD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9Bq1HH;E8BlzHH;;;IA9BM,0BAAA;G9Bq1HH;CACF;A8B50HD;EAEI,cAAA;C9B60HH;A8B/0HD;EAKI,eAAA;C9B60HH;A8Bp0HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5BijIF;A+B3iID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B6iID;A+BriID;EA8nBA;IAhoBI,mBAAA;G/B2iID;CACF;A+B5hID;EAgnBA;IAlnBI,YAAA;G/BkiID;CACF;A+BphID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BqhID;A+BnhIC;EACE,iBAAA;C/BqhIH;A+Bz/HD;EA6jBA;IArlBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BqhID;E+BnhIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BqhIH;E+BlhIC;IACE,oBAAA;G/BohIH;E+B/gIC;;;IAGE,gBAAA;IACA,iBAAA;G/BihIH;CACF;A+B7gID;;EAGI,kBAAA;C/B8gIH;A+BzgIC;EAmjBF;;IArjBM,kBAAA;G/BghIH;CACF;A+BvgID;;;;EAII,oBAAA;EACA,mBAAA;C/BygIH;A+BngIC;EAgiBF;;;;IAniBM,gBAAA;IACA,eAAA;G/B6gIH;CACF;A+BjgID;EACE,cAAA;EACA,sBAAA;C/BmgID;A+B9/HD;EA8gBA;IAhhBI,iBAAA;G/BogID;CACF;A+BhgID;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/BkgID;A+B5/HD;EAggBA;;IAlgBI,iBAAA;G/BmgID;CACF;A+BjgID;EACE,OAAA;EACA,sBAAA;C/BmgID;A+BjgID;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BmgID;A+B7/HD;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B+/HD;A+B7/HC;;EAEE,sBAAA;C/B+/HH;A+BxgID;EAaI,eAAA;C/B8/HH;A+Br/HD;EALI;;IAEE,mBAAA;G/B6/HH;CACF;A+Bn/HD;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/Bs/HD;A+Bl/HC;EACE,WAAA;C/Bo/HH;A+BlgID;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/Bk/HH;A+BxgID;EAyBI,gBAAA;C/Bk/HH;A+B5+HD;EAqbA;IAvbI,cAAA;G/Bk/HD;CACF;A+Bz+HD;EACE,oBAAA;C/B2+HD;A+B5+HD;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/B2+HH;A+B/8HC;EA2YF;IAjaM,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/By+HH;E+B9kHH;;IAxZQ,2BAAA;G/B0+HL;E+BllHH;IArZQ,kBAAA;G/B0+HL;E+Bz+HK;;IAEE,uBAAA;G/B2+HP;CACF;A+Bz9HD;EA+XA;IA1YI,YAAA;IACA,UAAA;G/Bw+HD;E+B/lHH;IAtYM,YAAA;G/Bw+HH;E+BlmHH;IApYQ,kBAAA;IACA,qBAAA;G/By+HL;CACF;A+B99HD;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC+vID;AkBzuHD;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB2yHH;EkBvqHH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlByyHH;EkB5qHH;IAxHM,sBAAA;GlBuyHH;EkB/qHH;IApHM,sBAAA;IACA,uBAAA;GlBsyHH;EkBnrHH;;;IA9GQ,YAAA;GlBsyHL;EkBxrHH;IAxGM,YAAA;GlBmyHH;EkB3rHH;IApGM,iBAAA;IACA,uBAAA;GlBkyHH;EkB/rHH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB+xHH;EkBtsHH;;IAtFQ,gBAAA;GlBgyHL;EkB1sHH;;IAjFM,mBAAA;IACA,eAAA;GlB+xHH;EkB/sHH;IA3EM,OAAA;GlB6xHH;CACF;A+BvgIC;EAmWF;IAzWM,mBAAA;G/BihIH;E+B/gIG;IACE,iBAAA;G/BihIL;CACF;A+BhgID;EAoVA;IA5VI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLswIP;CACF;A+BtgID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B60IF;A+BtgID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B40IF;A+BlgID;EChVE,gBAAA;EACA,mBAAA;ChCq1ID;A+BngIC;ECnVA,iBAAA;EACA,oBAAA;ChCy1ID;A+BpgIC;ECtVA,iBAAA;EACA,oBAAA;ChC61ID;A+B9/HD;EChWE,iBAAA;EACA,oBAAA;ChCi2ID;A+B1/HD;EAsSA;IA1SI,YAAA;IACA,kBAAA;IACA,mBAAA;G/BkgID;CACF;A+Br+HD;EAhBE;IExWA,uBAAA;GjCi2IC;E+Bx/HD;IE5WA,wBAAA;IF8WE,oBAAA;G/B0/HD;E+B5/HD;IAKI,gBAAA;G/B0/HH;CACF;A+Bj/HD;EACE,0BAAA;EACA,sBAAA;C/Bm/HD;A+Br/HD;EAKI,YAAA;C/Bm/HH;A+Bl/HG;;EAEE,eAAA;EACA,8BAAA;C/Bo/HL;A+B7/HD;EAcI,YAAA;C/Bk/HH;A+BhgID;EAmBM,YAAA;C/Bg/HL;A+B9+HK;;EAEE,YAAA;EACA,8BAAA;C/Bg/HP;A+B5+HK;;;EAGE,YAAA;EACA,0BAAA;C/B8+HP;A+B1+HK;;;EAGE,YAAA;EACA,8BAAA;C/B4+HP;A+BphID;EA8CI,mBAAA;C/By+HH;A+Bx+HG;;EAEE,uBAAA;C/B0+HL;A+B3hID;EAoDM,uBAAA;C/B0+HL;A+B9hID;;EA0DI,sBAAA;C/Bw+HH;A+Bj+HK;;;EAGE,0BAAA;EACA,YAAA;C/Bm+HP;A+Bl8HC;EAoKF;IA7LU,YAAA;G/B+9HP;E+B99HO;;IAEE,YAAA;IACA,8BAAA;G/Bg+HT;E+B59HO;;;IAGE,YAAA;IACA,0BAAA;G/B89HT;E+B19HO;;;IAGE,YAAA;IACA,8BAAA;G/B49HT;CACF;A+B9jID;EA8GI,YAAA;C/Bm9HH;A+Bl9HG;EACE,YAAA;C/Bo9HL;A+BpkID;EAqHI,YAAA;C/Bk9HH;A+Bj9HG;;EAEE,YAAA;C/Bm9HL;A+B/8HK;;;;EAEE,YAAA;C/Bm9HP;A+B38HD;EACE,uBAAA;EACA,sBAAA;C/B68HD;A+B/8HD;EAKI,eAAA;C/B68HH;A+B58HG;;EAEE,YAAA;EACA,8BAAA;C/B88HL;A+Bv9HD;EAcI,eAAA;C/B48HH;A+B19HD;EAmBM,eAAA;C/B08HL;A+Bx8HK;;EAEE,YAAA;EACA,8BAAA;C/B08HP;A+Bt8HK;;;EAGE,YAAA;EACA,0BAAA;C/Bw8HP;A+Bp8HK;;;EAGE,YAAA;EACA,8BAAA;C/Bs8HP;A+B9+HD;EA+CI,mBAAA;C/Bk8HH;A+Bj8HG;;EAEE,uBAAA;C/Bm8HL;A+Br/HD;EAqDM,uBAAA;C/Bm8HL;A+Bx/HD;;EA2DI,sBAAA;C/Bi8HH;A+B37HK;;;EAGE,0BAAA;EACA,YAAA;C/B67HP;A+Bt5HC;EAwBF;IAvDU,sBAAA;G/By7HP;E+Bl4HH;IApDU,0BAAA;G/By7HP;E+Br4HH;IAjDU,eAAA;G/By7HP;E+Bx7HO;;IAEE,YAAA;IACA,8BAAA;G/B07HT;E+Bt7HO;;;IAGE,YAAA;IACA,0BAAA;G/Bw7HT;E+Bp7HO;;;IAGE,YAAA;IACA,8BAAA;G/Bs7HT;CACF;A+B9hID;EA+GI,eAAA;C/Bk7HH;A+Bj7HG;EACE,YAAA;C/Bm7HL;A+BpiID;EAsHI,eAAA;C/Bi7HH;A+Bh7HG;;EAEE,YAAA;C/Bk7HL;A+B96HK;;;;EAEE,YAAA;C/Bk7HP;AkC5jJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC8jJD;AkCnkJD;EAQI,sBAAA;ClC8jJH;AkCtkJD;EAWM,kBAAA;EACA,eAAA;EACA,YAAA;ClC8jJL;AkC3kJD;EAkBI,eAAA;ClC4jJH;AmChlJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnCklJD;AmCtlJD;EAOI,gBAAA;CnCklJH;AmCzlJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,kBAAA;CnCmlJL;AmCjlJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B8lJJ;AmChlJG;;EPvBF,gCAAA;EACG,6BAAA;C5B2mJJ;AmC3kJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CnC+kJL;AmCzkJG;;;;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC8kJL;AmCroJD;;;;;;EAkEM,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,oBAAA;CnC2kJL;AmClkJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpCipJL;AoC/oJG;;ERKF,+BAAA;EACG,4BAAA;C5B8oJJ;AoC9oJG;;ERTF,gCAAA;EACG,6BAAA;C5B2pJJ;AmC7kJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpCiqJL;AoC/pJG;;ERKF,+BAAA;EACG,4BAAA;C5B8pJJ;AoC9pJG;;ERTF,gCAAA;EACG,6BAAA;C5B2qJJ;AqC9qJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrCgrJD;AqCprJD;EAOI,gBAAA;CrCgrJH;AqCvrJD;;EAUM,sBAAA;EACA,kBAAA;EACA,uBAAA;EACA,uBAAA;EACA,oBAAA;CrCirJL;AqC/rJD;;EAmBM,sBAAA;EACA,0BAAA;CrCgrJL;AqCpsJD;;EA2BM,aAAA;CrC6qJL;AqCxsJD;;EAkCM,YAAA;CrC0qJL;AqC5sJD;;;;EA2CM,eAAA;EACA,uBAAA;EACA,oBAAA;CrCuqJL;AsCrtJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCutJD;AsCntJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CtCqtJL;AsChtJC;EACE,cAAA;CtCktJH;AsC9sJC;EACE,mBAAA;EACA,UAAA;CtCgtJH;AsCzsJD;ECtCE,0BAAA;CvCkvJD;AuC/uJG;;EAEE,0BAAA;CvCivJL;AsC5sJD;EC1CE,0BAAA;CvCyvJD;AuCtvJG;;EAEE,0BAAA;CvCwvJL;AsC/sJD;EC9CE,0BAAA;CvCgwJD;AuC7vJG;;EAEE,0BAAA;CvC+vJL;AsCltJD;EClDE,0BAAA;CvCuwJD;AuCpwJG;;EAEE,0BAAA;CvCswJL;AsCrtJD;ECtDE,0BAAA;CvC8wJD;AuC3wJG;;EAEE,0BAAA;CvC6wJL;AsCxtJD;EC1DE,0BAAA;CvCqxJD;AuClxJG;;EAEE,0BAAA;CvCoxJL;AwCtxJD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCwxJD;AwCrxJC;EACE,cAAA;CxCuxJH;AwCnxJC;EACE,mBAAA;EACA,UAAA;CxCqxJH;AwClxJC;;EAEE,OAAA;EACA,iBAAA;CxCoxJH;AwC/wJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CxCixJL;AwC5wJC;;EAEE,eAAA;EACA,uBAAA;CxC8wJH;AwC3wJC;EACE,aAAA;CxC6wJH;AwC1wJC;EACE,kBAAA;CxC4wJH;AwCzwJC;EACE,iBAAA;CxC2wJH;AyCr0JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCu0JD;AyC50JD;;EASI,eAAA;CzCu0JH;AyCh1JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCs0JH;AyCr1JD;EAmBI,0BAAA;CzCq0JH;AyCl0JC;;EAEE,mBAAA;EACA,mBAAA;EACA,oBAAA;CzCo0JH;AyC91JD;EA8BI,gBAAA;CzCm0JH;AyCjzJD;EACA;IAfI,kBAAA;IACA,qBAAA;GzCm0JD;EyCj0JC;;IAEE,mBAAA;IACA,oBAAA;GzCm0JH;EyC1zJH;;IAJM,gBAAA;GzCk0JH;CACF;A0C/2JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CLisJT;A0C33JD;;EAaI,kBAAA;EACA,mBAAA;C1Ck3JH;A0C92JC;;;EAGE,sBAAA;C1Cg3JH;A0Cr4JD;EA0BI,aAAA;EACA,eAAA;C1C82JH;A2Cv4JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Cy4JD;A2C74JD;EAQI,cAAA;EAEA,eAAA;C3Cu4JH;A2Cj5JD;EAeI,kBAAA;C3Cq4JH;A2Cp5JD;;EAqBI,iBAAA;C3Cm4JH;A2Cx5JD;EAyBI,gBAAA;C3Ck4JH;A2C13JD;;EAEE,oBAAA;C3C43JD;A2C93JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3C43JH;A2Cp3JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C86JD;A2Cz3JD;EClDI,0BAAA;C5C86JH;A2C53JD;EC/CI,eAAA;C5C86JH;A2C33JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cy7JD;A2Ch4JD;ECtDI,0BAAA;C5Cy7JH;A2Cn4JD;ECnDI,eAAA;C5Cy7JH;A2Cl4JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Co8JD;A2Cv4JD;EC1DI,0BAAA;C5Co8JH;A2C14JD;ECvDI,eAAA;C5Co8JH;A2Cz4JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C+8JD;A2C94JD;EC9DI,0BAAA;C5C+8JH;A2Cj5JD;EC3DI,eAAA;C5C+8JH;A6Cj9JD;EACE;IAAQ,4BAAA;G7Co9JP;E6Cn9JD;IAAQ,yBAAA;G7Cs9JP;CACF;A6Cn9JD;EACE;IAAQ,4BAAA;G7Cs9JP;E6Cr9JD;IAAQ,yBAAA;G7Cw9JP;CACF;A6C39JD;EACE;IAAQ,4BAAA;G7Cs9JP;E6Cr9JD;IAAQ,yBAAA;G7Cw9JP;CACF;A6Cj9JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CL86JT;A6Ch9JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CLk0JT;A6C78JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7Ci9JD;A6C18JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CL0/JT;A6Cv8JD;EErEE,0BAAA;C/C+gKD;A+C5gKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C+9JH;A6C38JD;EEzEE,0BAAA;C/CuhKD;A+CphKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Cu+JH;A6C/8JD;EE7EE,0BAAA;C/C+hKD;A+C5hKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C++JH;A6Cn9JD;EEjFE,0BAAA;C/CuiKD;A+CpiKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Cu/JH;AgD/iKD;EAEE,iBAAA;ChDgjKD;AgD9iKC;EACE,cAAA;ChDgjKH;AgD5iKD;;EAEE,QAAA;EACA,iBAAA;ChD8iKD;AgD3iKD;EACE,eAAA;ChD6iKD;AgD1iKD;EACE,eAAA;ChD4iKD;AgDziKC;EACE,gBAAA;ChD2iKH;AgDviKD;;EAEE,mBAAA;ChDyiKD;AgDtiKD;;EAEE,oBAAA;ChDwiKD;AgDriKD;;;EAGE,oBAAA;EACA,oBAAA;ChDuiKD;AgDpiKD;EACE,uBAAA;ChDsiKD;AgDniKD;EACE,uBAAA;ChDqiKD;AgDjiKD;EACE,cAAA;EACA,mBAAA;ChDmiKD;AgD7hKD;EACE,gBAAA;EACA,iBAAA;ChD+hKD;AiDtlKD;EAEE,oBAAA;EACA,gBAAA;CjDulKD;AiD/kKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,uBAAA;EACA,uBAAA;CjDglKD;AiD7kKC;ErB3BA,6BAAA;EACC,4BAAA;C5B2mKF;AiD9kKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BwmKF;AiDvkKD;;EAEE,YAAA;CjDykKD;AiD3kKD;;EAKI,YAAA;CjD0kKH;AiDtkKC;;;;EAEE,sBAAA;EACA,YAAA;EACA,0BAAA;CjD0kKH;AiDtkKD;EACE,YAAA;EACA,iBAAA;CjDwkKD;AiDnkKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDqkKH;AiD1kKC;;;EASI,eAAA;CjDskKL;AiD/kKC;;;EAYI,eAAA;CjDwkKL;AiDnkKC;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;CjDqkKH;AiD3kKC;;;;;;;;;EAYI,eAAA;CjD0kKL;AiDtlKC;;;EAeI,eAAA;CjD4kKL;AkD9qKC;EACE,eAAA;EACA,0BAAA;ClDgrKH;AkD9qKG;;EAEE,eAAA;ClDgrKL;AkDlrKG;;EAKI,eAAA;ClDirKP;AkD9qKK;;;;EAEE,eAAA;EACA,0BAAA;ClDkrKP;AkDhrKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDqrKP;AkD3sKC;EACE,eAAA;EACA,0BAAA;ClD6sKH;AkD3sKG;;EAEE,eAAA;ClD6sKL;AkD/sKG;;EAKI,eAAA;ClD8sKP;AkD3sKK;;;;EAEE,eAAA;EACA,0BAAA;ClD+sKP;AkD7sKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDktKP;AkDxuKC;EACE,eAAA;EACA,0BAAA;ClD0uKH;AkDxuKG;;EAEE,eAAA;ClD0uKL;AkD5uKG;;EAKI,eAAA;ClD2uKP;AkDxuKK;;;;EAEE,eAAA;EACA,0BAAA;ClD4uKP;AkD1uKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD+uKP;AkDrwKC;EACE,eAAA;EACA,0BAAA;ClDuwKH;AkDrwKG;;EAEE,eAAA;ClDuwKL;AkDzwKG;;EAKI,eAAA;ClDwwKP;AkDrwKK;;;;EAEE,eAAA;EACA,0BAAA;ClDywKP;AkDvwKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD4wKP;AiD3qKD;EACE,cAAA;EACA,mBAAA;CjD6qKD;AiD3qKD;EACE,iBAAA;EACA,iBAAA;CjD6qKD;AmDvyKD;EACE,oBAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CLgvKT;AmDtyKD;EACE,cAAA;CnDwyKD;AmDnyKD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5B0zKF;AmDzyKD;EAMI,eAAA;CnDsyKH;AmDjyKD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnDmyKD;AmDvyKD;;;;;EAWI,eAAA;CnDmyKH;AmD9xKD;EACE,mBAAA;EACA,0BAAA;EACA,2BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5By0KF;AmDxxKD;;EAGI,iBAAA;CnDyxKH;AmD5xKD;;EAMM,oBAAA;EACA,iBAAA;CnD0xKL;AmDtxKG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5Bg2KF;AmDpxKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5B81KF;AmD7yKD;EvB1DE,2BAAA;EACC,0BAAA;C5B02KF;AmDhxKD;EAEI,oBAAA;CnDixKH;AmD9wKD;EACE,oBAAA;CnDgxKD;AmDxwKD;;;EAII,iBAAA;CnDywKH;AmD7wKD;;;EAOM,mBAAA;EACA,oBAAA;CnD2wKL;AmDnxKD;;EvBzGE,6BAAA;EACC,4BAAA;C5Bg4KF;AmDxxKD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnD2wKP;AmD/xKD;;;;;;;;EAwBU,4BAAA;CnDixKT;AmDzyKD;;;;;;;;EA4BU,6BAAA;CnDuxKT;AmDnzKD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bw5KF;AmDxzKD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDqxKP;AmD/zKD;;;;;;;;EA8CU,+BAAA;CnD2xKT;AmDz0KD;;;;;;;;EAkDU,gCAAA;CnDiyKT;AmDn1KD;;;;EA2DI,2BAAA;CnD8xKH;AmDz1KD;;EA+DI,cAAA;CnD8xKH;AmD71KD;;EAmEI,UAAA;CnD8xKH;AmDj2KD;;;;;;;;;;;;EA0EU,eAAA;CnDqyKT;AmD/2KD;;;;;;;;;;;;EA8EU,gBAAA;CnD+yKT;AmD73KD;;;;;;;;EAuFU,iBAAA;CnDgzKT;AmDv4KD;;;;;;;;EAgGU,iBAAA;CnDizKT;AmDj5KD;EAsGI,UAAA;EACA,iBAAA;CnD8yKH;AmDpyKD;EACE,oBAAA;CnDsyKD;AmDvyKD;EAKI,iBAAA;EACA,mBAAA;CnDqyKH;AmD3yKD;EASM,gBAAA;CnDqyKL;AmD9yKD;EAcI,iBAAA;CnDmyKH;AmDjzKD;;EAkBM,2BAAA;CnDmyKL;AmDrzKD;EAuBI,cAAA;CnDiyKH;AmDxzKD;EAyBM,8BAAA;CnDkyKL;AmD3xKD;EC1PE,mBAAA;CpDwhLD;AoDthLC;EACE,eAAA;EACA,0BAAA;EACA,mBAAA;CpDwhLH;AoD3hLC;EAMI,uBAAA;CpDwhLL;AoD9hLC;EASI,eAAA;EACA,0BAAA;CpDwhLL;AoDrhLC;EAEI,0BAAA;CpDshLL;AmD1yKD;EC7PE,sBAAA;CpD0iLD;AoDxiLC;EACE,YAAA;EACA,0BAAA;EACA,sBAAA;CpD0iLH;AoD7iLC;EAMI,0BAAA;CpD0iLL;AoDhjLC;EASI,eAAA;EACA,uBAAA;CpD0iLL;AoDviLC;EAEI,6BAAA;CpDwiLL;AmDzzKD;EChQE,sBAAA;CpD4jLD;AoD1jLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD4jLH;AoD/jLC;EAMI,0BAAA;CpD4jLL;AoDlkLC;EASI,eAAA;EACA,0BAAA;CpD4jLL;AoDzjLC;EAEI,6BAAA;CpD0jLL;AmDx0KD;ECnQE,sBAAA;CpD8kLD;AoD5kLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD8kLH;AoDjlLC;EAMI,0BAAA;CpD8kLL;AoDplLC;EASI,eAAA;EACA,0BAAA;CpD8kLL;AoD3kLC;EAEI,6BAAA;CpD4kLL;AmDv1KD;ECtQE,sBAAA;CpDgmLD;AoD9lLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDgmLH;AoDnmLC;EAMI,0BAAA;CpDgmLL;AoDtmLC;EASI,eAAA;EACA,0BAAA;CpDgmLL;AoD7lLC;EAEI,6BAAA;CpD8lLL;AmDt2KD;ECzQE,sBAAA;CpDknLD;AoDhnLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDknLH;AoDrnLC;EAMI,0BAAA;CpDknLL;AoDxnLC;EASI,eAAA;EACA,0BAAA;CpDknLL;AoD/mLC;EAEI,6BAAA;CpDgnLL;AqDhoLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrDkoLD;AqDvoLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrDkoLH;AqD7nLD;EACE,uBAAA;CrD+nLD;AqD3nLD;EACE,oBAAA;CrD6nLD;AsDxpLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CLmmLT;AsDlqLD;EASI,mBAAA;EACA,kCAAA;CtD4pLH;AsDvpLD;EACE,cAAA;EACA,mBAAA;CtDypLD;AsDvpLD;EACE,aAAA;EACA,mBAAA;CtDypLD;AuD/qLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,0BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBwrLD;AuDhrLC;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtBgsLD;AuD5qLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvD8qLH;AwDnsLD;EACE,iBAAA;CxDqsLD;AwDjsLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxDgsLD;AwD7rLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CLghLT;AwDnsLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CL2lLT;AwDvsLD;EACE,mBAAA;EACA,iBAAA;CxDysLD;AwDrsLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDusLD;AwDnsLD;EACE,mBAAA;EACA,uBAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDqsLD;AwDjsLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,uBAAA;CxDmsLD;AwDjsLC;ElCrEA,WAAA;EAGA,yBAAA;CtBuwLD;AwDpsLC;ElCtEA,aAAA;EAGA,0BAAA;CtB2wLD;AwDnsLD;EACE,cAAA;EACA,iCAAA;CxDqsLD;AwDjsLD;EACE,iBAAA;CxDmsLD;AwD/rLD;EACE,UAAA;EACA,wBAAA;CxDisLD;AwD5rLD;EACE,mBAAA;EACA,cAAA;CxD8rLD;AwD1rLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxD4rLD;AwD/rLD;EAQI,iBAAA;EACA,iBAAA;CxD0rLH;AwDnsLD;EAaI,kBAAA;CxDyrLH;AwDtsLD;EAiBI,eAAA;CxDwrLH;AwDnrLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDqrLD;AwDnqLD;EAZE;IACE,aAAA;IACA,kBAAA;GxDkrLD;EwDhrLD;InDvEA,kDAAA;IACQ,0CAAA;GL0vLP;EwD/qLD;IAAY,aAAA;GxDkrLX;CACF;AwD7qLD;EAFE;IAAY,aAAA;GxDmrLX;CACF;AyDl0LD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBy1LD;AyD90LC;EnCdA,aAAA;EAGA,0BAAA;CtB61LD;AyDj1LC;EAAW,iBAAA;EAAmB,eAAA;CzDq1L/B;AyDp1LC;EAAW,iBAAA;EAAmB,eAAA;CzDw1L/B;AyDv1LC;EAAW,gBAAA;EAAmB,eAAA;CzD21L/B;AyD11LC;EAAW,kBAAA;EAAmB,eAAA;CzD81L/B;AyD11LD;EACE,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;CzD41LD;AyDx1LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzD01LD;AyDt1LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;CzDw1LH;AyDt1LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDw1LH;AyDt1LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDw1LH;AyDt1LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,yBAAA;CzDw1LH;AyDt1LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,wBAAA;CzDw1LH;AyDt1LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDw1LH;AyDt1LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDw1LH;AyDt1LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDw1LH;A2Dr7LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,uBAAA;EACA,qCAAA;UAAA,6BAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLq5LT;A2Dh8LC;EAAY,kBAAA;C3Dm8Lb;A2Dl8LC;EAAY,kBAAA;C3Dq8Lb;A2Dp8LC;EAAY,iBAAA;C3Du8Lb;A2Dt8LC;EAAY,mBAAA;C3Dy8Lb;A2Dt8LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Dw8LD;A2Dr8LD;EACE,kBAAA;C3Du8LD;A2D/7LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3Di8LH;A2D97LD;EACE,mBAAA;C3Dg8LD;A2D97LD;EACE,mBAAA;EACA,YAAA;C3Dg8LD;A2D57LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D87LH;A2D77LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,uBAAA;C3D+7LL;A2D57LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D87LH;A2D77LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;C3D+7LL;A2D57LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D87LH;A2D77LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,0BAAA;C3D+7LL;A2D37LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3D67LH;A2D57LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,wBAAA;EACA,cAAA;C3D87LL;A4DvjMD;EACE,mBAAA;C5DyjMD;A4DtjMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DwjMD;A4D3jMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CL44LT;A4DlkMD;;EAcM,eAAA;C5DwjML;A4D9hMC;EA4NF;IvD3DE,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GLi7LP;E4D5jMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D+jML;E4D7jMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5DgkML;E4D9jMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5DikML;CACF;A4DvmMD;;;EA6CI,eAAA;C5D+jMH;A4D5mMD;EAiDI,QAAA;C5D8jMH;A4D/mMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5D6jMH;A4DrnMD;EA4DI,WAAA;C5D4jMH;A4DxnMD;EA+DI,YAAA;C5D4jMH;A4D3nMD;;EAmEI,QAAA;C5D4jMH;A4D/nMD;EAuEI,YAAA;C5D2jMH;A4DloMD;EA0EI,WAAA;C5D2jMH;A4DnjMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;EACA,mCAAA;C5DsjMD;A4DjjMC;EdnGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CupMH;A4DrjMC;EACE,WAAA;EACA,SAAA;EdxGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CgqMH;A4DvjMC;;EAEE,WAAA;EACA,YAAA;EACA,sBAAA;EtCvHF,aAAA;EAGA,0BAAA;CtB+qMD;A4DzlMD;;;;EAuCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DwjMH;A4DnmMD;;EA+CI,UAAA;EACA,mBAAA;C5DwjMH;A4DxmMD;;EAoDI,WAAA;EACA,oBAAA;C5DwjMH;A4D7mMD;;EAyDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DwjMH;A4DnjMG;EACE,iBAAA;C5DqjML;A4DjjMG;EACE,iBAAA;C5DmjML;A4DziMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5D2iMD;A4DpjMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5DiiMH;A4DhkMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,uBAAA;C5DiiMH;A4D1hMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;C5D4hMD;A4D3hMC;EACE,kBAAA;C5D6hMH;A4Dp/LD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DshMH;E4D9hMD;;IAYI,mBAAA;G5DshMH;E4DliMD;;IAgBI,oBAAA;G5DshMH;E4DjhMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5DmhMD;E4D/gMD;IACE,aAAA;G5DihMD;CACF;A6DhxMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7DgzMH;A6D9yMC;;;;;;;;;;;;;;;;EACE,YAAA;C7D+zMH;AiCv0MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9Dk1MD;AiCz0MD;EACE,wBAAA;CjC20MD;AiCz0MD;EACE,uBAAA;CjC20MD;AiCn0MD;EACE,yBAAA;CjCq0MD;AiCn0MD;EACE,0BAAA;CjCq0MD;AiCn0MD;EACE,mBAAA;CjCq0MD;AiCn0MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/D+1MD;AiCj0MD;EACE,yBAAA;CjCm0MD;AiC5zMD;EACE,gBAAA;CjC8zMD;AgE/1MD;EACE,oBAAA;ChEi2MD;AgE31MD;;;;ECdE,yBAAA;CjE+2MD;AgE11MD;;;;;;;;;;;;EAYE,yBAAA;ChE41MD;AgEr1MD;EA6IA;IC7LE,0BAAA;GjEy4MC;EiEx4MD;IAAU,0BAAA;GjE24MT;EiE14MD;IAAU,8BAAA;GjE64MT;EiE54MD;;IACU,+BAAA;GjE+4MT;CACF;AgE/1MD;EAwIA;IA1II,0BAAA;GhEq2MD;CACF;AgE/1MD;EAmIA;IArII,2BAAA;GhEq2MD;CACF;AgE/1MD;EA8HA;IAhII,iCAAA;GhEq2MD;CACF;AgE91MD;EAwHA;IC7LE,0BAAA;GjEu6MC;EiEt6MD;IAAU,0BAAA;GjEy6MT;EiEx6MD;IAAU,8BAAA;GjE26MT;EiE16MD;;IACU,+BAAA;GjE66MT;CACF;AgEx2MD;EAmHA;IArHI,0BAAA;GhE82MD;CACF;AgEx2MD;EA8GA;IAhHI,2BAAA;GhE82MD;CACF;AgEx2MD;EAyGA;IA3GI,iCAAA;GhE82MD;CACF;AgEv2MD;EAmGA;IC7LE,0BAAA;GjEq8MC;EiEp8MD;IAAU,0BAAA;GjEu8MT;EiEt8MD;IAAU,8BAAA;GjEy8MT;EiEx8MD;;IACU,+BAAA;GjE28MT;CACF;AgEj3MD;EA8FA;IAhGI,0BAAA;GhEu3MD;CACF;AgEj3MD;EAyFA;IA3FI,2BAAA;GhEu3MD;CACF;AgEj3MD;EAoFA;IAtFI,iCAAA;GhEu3MD;CACF;AgEh3MD;EA8EA;IC7LE,0BAAA;GjEm+MC;EiEl+MD;IAAU,0BAAA;GjEq+MT;EiEp+MD;IAAU,8BAAA;GjEu+MT;EiEt+MD;;IACU,+BAAA;GjEy+MT;CACF;AgE13MD;EAyEA;IA3EI,0BAAA;GhEg4MD;CACF;AgE13MD;EAoEA;IAtEI,2BAAA;GhEg4MD;CACF;AgE13MD;EA+DA;IAjEI,iCAAA;GhEg4MD;CACF;AgEz3MD;EAyDA;ICrLE,yBAAA;GjEy/MC;CACF;AgEz3MD;EAoDA;ICrLE,yBAAA;GjE8/MC;CACF;AgEz3MD;EA+CA;ICrLE,yBAAA;GjEmgNC;CACF;AgEz3MD;EA0CA;ICrLE,yBAAA;GjEwgNC;CACF;AgEt3MD;ECnJE,yBAAA;CjE4gND;AgEn3MD;EA4BA;IC7LE,0BAAA;GjEwhNC;EiEvhND;IAAU,0BAAA;GjE0hNT;EiEzhND;IAAU,8BAAA;GjE4hNT;EiE3hND;;IACU,+BAAA;GjE8hNT;CACF;AgEj4MD;EACE,yBAAA;ChEm4MD;AgE93MD;EAqBA;IAvBI,0BAAA;GhEo4MD;CACF;AgEl4MD;EACE,yBAAA;ChEo4MD;AgE/3MD;EAcA;IAhBI,2BAAA;GhEq4MD;CACF;AgEn4MD;EACE,yBAAA;ChEq4MD;AgEh4MD;EAOA;IATI,iCAAA;GhEs4MD;CACF;AgE/3MD;EACA;ICrLE,yBAAA;GjEujNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n  font-family: sans-serif;\n  -ms-text-size-adjust: 100%;\n  -webkit-text-size-adjust: 100%;\n}\nbody {\n  margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block;\n  vertical-align: baseline;\n}\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n[hidden],\ntemplate {\n  display: none;\n}\na {\n  background-color: transparent;\n}\na:active,\na:hover {\n  outline: 0;\n}\nabbr[title] {\n  border-bottom: 1px dotted;\n}\nb,\nstrong {\n  font-weight: bold;\n}\ndfn {\n  font-style: italic;\n}\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\nmark {\n  background: #ff0;\n  color: #000;\n}\nsmall {\n  font-size: 80%;\n}\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\nsup {\n  top: -0.5em;\n}\nsub {\n  bottom: -0.25em;\n}\nimg {\n  border: 0;\n}\nsvg:not(:root) {\n  overflow: hidden;\n}\nfigure {\n  margin: 1em 40px;\n}\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\npre {\n  overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit;\n  font: inherit;\n  margin: 0;\n}\nbutton {\n  overflow: visible;\n}\nbutton,\nselect {\n  text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button;\n  cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\ninput {\n  line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: textfield;\n  box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n  border: 0;\n  padding: 0;\n}\ntextarea {\n  overflow: auto;\n}\noptgroup {\n  font-weight: bold;\n}\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\ntd,\nth {\n  padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n  *,\n  *:before,\n  *:after {\n    background: transparent !important;\n    color: #000 !important;\n    box-shadow: none !important;\n    text-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  a[href^=\"#\"]:after,\n  a[href^=\"javascript:\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n  content: \"\\002a\";\n}\n.glyphicon-plus:before {\n  content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n  content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n.glyphicon-lock:before {\n  content: \"\\e033\";\n}\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n  content: \"\\e044\";\n}\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n.glyphicon-camera:before {\n  content: \"\\e046\";\n}\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n.glyphicon-fire:before {\n  content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n  content: \"\\e109\";\n}\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n.glyphicon-bell:before {\n  content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n  content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n  content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n  content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n  content: \"\\e146\";\n}\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n.glyphicon-cd:before {\n  content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n  content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n  content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n  content: \"\\e204\";\n}\n.glyphicon-copy:before {\n  content: \"\\e205\";\n}\n.glyphicon-paste:before {\n  content: \"\\e206\";\n}\n.glyphicon-alert:before {\n  content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n  content: \"\\e210\";\n}\n.glyphicon-king:before {\n  content: \"\\e211\";\n}\n.glyphicon-queen:before {\n  content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n  content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n  content: \"\\e214\";\n}\n.glyphicon-knight:before {\n  content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n  content: \"\\e216\";\n}\n.glyphicon-tent:before {\n  content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n  content: \"\\e218\";\n}\n.glyphicon-bed:before {\n  content: \"\\e219\";\n}\n.glyphicon-apple:before {\n  content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n  content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n  content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n  content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n  content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n  content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n  content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n  content: \"\\e227\";\n}\n.glyphicon-btc:before {\n  content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n  content: \"\\e227\";\n}\n.glyphicon-yen:before {\n  content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n  content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n  content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n  content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n  content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n  content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n  content: \"\\e232\";\n}\n.glyphicon-education:before {\n  content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n  content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n  content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n  content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n  content: \"\\e237\";\n}\n.glyphicon-oil:before {\n  content: \"\\e238\";\n}\n.glyphicon-grain:before {\n  content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n  content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n  content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n  content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n  content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n  content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n  content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n  content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n  content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n  content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n  content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n  content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n  content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n  content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n  content: \"\\e253\";\n}\n.glyphicon-console:before {\n  content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n  content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n  content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n  content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n  content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n  content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n  content: \"\\e260\";\n}\n* {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #333333;\n  background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\na {\n  color: #337ab7;\n  text-decoration: none;\n}\na:hover,\na:focus {\n  color: #23527c;\n  text-decoration: underline;\n}\na:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\nfigure {\n  margin: 0;\n}\nimg {\n  vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  max-width: 100%;\n  height: auto;\n}\n.img-rounded {\n  border-radius: 6px;\n}\n.img-thumbnail {\n  padding: 4px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n  -o-transition: all 0.2s ease-in-out;\n  transition: all 0.2s ease-in-out;\n  display: inline-block;\n  max-width: 100%;\n  height: auto;\n}\n.img-circle {\n  border-radius: 50%;\n}\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  clip: auto;\n}\n[role=\"button\"] {\n  cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: inherit;\n  font-weight: 500;\n  line-height: 1.1;\n  color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n  font-weight: normal;\n  line-height: 1;\n  color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n  font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n  font-size: 75%;\n}\nh1,\n.h1 {\n  font-size: 36px;\n}\nh2,\n.h2 {\n  font-size: 30px;\n}\nh3,\n.h3 {\n  font-size: 24px;\n}\nh4,\n.h4 {\n  font-size: 18px;\n}\nh5,\n.h5 {\n  font-size: 14px;\n}\nh6,\n.h6 {\n  font-size: 12px;\n}\np {\n  margin: 0 0 10px;\n}\n.lead {\n  margin-bottom: 20px;\n  font-size: 16px;\n  font-weight: 300;\n  line-height: 1.4;\n}\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\nsmall,\n.small {\n  font-size: 85%;\n}\nmark,\n.mark {\n  background-color: #fcf8e3;\n  padding: .2em;\n}\n.text-left {\n  text-align: left;\n}\n.text-right {\n  text-align: right;\n}\n.text-center {\n  text-align: center;\n}\n.text-justify {\n  text-align: justify;\n}\n.text-nowrap {\n  white-space: nowrap;\n}\n.text-lowercase {\n  text-transform: lowercase;\n}\n.text-uppercase {\n  text-transform: uppercase;\n}\n.text-capitalize {\n  text-transform: capitalize;\n}\n.text-muted {\n  color: #777777;\n}\n.text-primary {\n  color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n  color: #286090;\n}\n.text-success {\n  color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n  color: #2b542c;\n}\n.text-info {\n  color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n  color: #245269;\n}\n.text-warning {\n  color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n  color: #66512c;\n}\n.text-danger {\n  color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n  color: #843534;\n}\n.bg-primary {\n  color: #fff;\n  background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n  background-color: #286090;\n}\n.bg-success {\n  background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n  background-color: #c1e2b3;\n}\n.bg-info {\n  background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n  background-color: #afd9ee;\n}\n.bg-warning {\n  background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n  background-color: #f7ecb5;\n}\n.bg-danger {\n  background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n  background-color: #e4b9b9;\n}\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n  margin-left: -5px;\n}\n.list-inline > li {\n  display: inline-block;\n  padding-left: 5px;\n  padding-right: 5px;\n}\ndl {\n  margin-top: 0;\n  margin-bottom: 20px;\n}\ndt,\ndd {\n  line-height: 1.42857143;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0;\n}\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    clear: left;\n    text-align: right;\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n}\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #777777;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  font-size: 17.5px;\n  border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n  margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n  display: block;\n  font-size: 80%;\n  line-height: 1.42857143;\n  color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n  content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n  text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n  content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n  content: '\\00A0 \\2014';\n}\naddress {\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #fff;\n  background-color: #333;\n  border-radius: 3px;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: bold;\n  box-shadow: none;\n}\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.42857143;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: #333333;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border-radius: 0;\n}\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n@media (min-width: 768px) {\n  .container {\n    width: 750px;\n  }\n}\n@media (min-width: 992px) {\n  .container {\n    width: 970px;\n  }\n}\n@media (min-width: 1200px) {\n  .container {\n    width: 1170px;\n  }\n}\n.container-fluid {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.row {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n  float: left;\n}\n.col-xs-12 {\n  width: 100%;\n}\n.col-xs-11 {\n  width: 91.66666667%;\n}\n.col-xs-10 {\n  width: 83.33333333%;\n}\n.col-xs-9 {\n  width: 75%;\n}\n.col-xs-8 {\n  width: 66.66666667%;\n}\n.col-xs-7 {\n  width: 58.33333333%;\n}\n.col-xs-6 {\n  width: 50%;\n}\n.col-xs-5 {\n  width: 41.66666667%;\n}\n.col-xs-4 {\n  width: 33.33333333%;\n}\n.col-xs-3 {\n  width: 25%;\n}\n.col-xs-2 {\n  width: 16.66666667%;\n}\n.col-xs-1 {\n  width: 8.33333333%;\n}\n.col-xs-pull-12 {\n  right: 100%;\n}\n.col-xs-pull-11 {\n  right: 91.66666667%;\n}\n.col-xs-pull-10 {\n  right: 83.33333333%;\n}\n.col-xs-pull-9 {\n  right: 75%;\n}\n.col-xs-pull-8 {\n  right: 66.66666667%;\n}\n.col-xs-pull-7 {\n  right: 58.33333333%;\n}\n.col-xs-pull-6 {\n  right: 50%;\n}\n.col-xs-pull-5 {\n  right: 41.66666667%;\n}\n.col-xs-pull-4 {\n  right: 33.33333333%;\n}\n.col-xs-pull-3 {\n  right: 25%;\n}\n.col-xs-pull-2 {\n  right: 16.66666667%;\n}\n.col-xs-pull-1 {\n  right: 8.33333333%;\n}\n.col-xs-pull-0 {\n  right: auto;\n}\n.col-xs-push-12 {\n  left: 100%;\n}\n.col-xs-push-11 {\n  left: 91.66666667%;\n}\n.col-xs-push-10 {\n  left: 83.33333333%;\n}\n.col-xs-push-9 {\n  left: 75%;\n}\n.col-xs-push-8 {\n  left: 66.66666667%;\n}\n.col-xs-push-7 {\n  left: 58.33333333%;\n}\n.col-xs-push-6 {\n  left: 50%;\n}\n.col-xs-push-5 {\n  left: 41.66666667%;\n}\n.col-xs-push-4 {\n  left: 33.33333333%;\n}\n.col-xs-push-3 {\n  left: 25%;\n}\n.col-xs-push-2 {\n  left: 16.66666667%;\n}\n.col-xs-push-1 {\n  left: 8.33333333%;\n}\n.col-xs-push-0 {\n  left: auto;\n}\n.col-xs-offset-12 {\n  margin-left: 100%;\n}\n.col-xs-offset-11 {\n  margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n  margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n  margin-left: 75%;\n}\n.col-xs-offset-8 {\n  margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n  margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n  margin-left: 50%;\n}\n.col-xs-offset-5 {\n  margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n  margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n  margin-left: 25%;\n}\n.col-xs-offset-2 {\n  margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n  margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n  margin-left: 0%;\n}\n@media (min-width: 768px) {\n  .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n    float: left;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-11 {\n    width: 91.66666667%;\n  }\n  .col-sm-10 {\n    width: 83.33333333%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-8 {\n    width: 66.66666667%;\n  }\n  .col-sm-7 {\n    width: 58.33333333%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-5 {\n    width: 41.66666667%;\n  }\n  .col-sm-4 {\n    width: 33.33333333%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-2 {\n    width: 16.66666667%;\n  }\n  .col-sm-1 {\n    width: 8.33333333%;\n  }\n  .col-sm-pull-12 {\n    right: 100%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-sm-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-sm-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-sm-pull-0 {\n    right: auto;\n  }\n  .col-sm-push-12 {\n    left: 100%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666667%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666667%;\n  }\n  .col-sm-push-7 {\n    left: 58.33333333%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666667%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-2 {\n    left: 16.66666667%;\n  }\n  .col-sm-push-1 {\n    left: 8.33333333%;\n  }\n  .col-sm-push-0 {\n    left: auto;\n  }\n  .col-sm-offset-12 {\n    margin-left: 100%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-sm-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 992px) {\n  .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n    float: left;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-11 {\n    width: 91.66666667%;\n  }\n  .col-md-10 {\n    width: 83.33333333%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-8 {\n    width: 66.66666667%;\n  }\n  .col-md-7 {\n    width: 58.33333333%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-5 {\n    width: 41.66666667%;\n  }\n  .col-md-4 {\n    width: 33.33333333%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-2 {\n    width: 16.66666667%;\n  }\n  .col-md-1 {\n    width: 8.33333333%;\n  }\n  .col-md-pull-12 {\n    right: 100%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-md-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-md-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-push-12 {\n    left: 100%;\n  }\n  .col-md-push-11 {\n    left: 91.66666667%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-8 {\n    left: 66.66666667%;\n  }\n  .col-md-push-7 {\n    left: 58.33333333%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-5 {\n    left: 41.66666667%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-2 {\n    left: 16.66666667%;\n  }\n  .col-md-push-1 {\n    left: 8.33333333%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-offset-12 {\n    margin-left: 100%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0%;\n  }\n}\n@media (min-width: 1200px) {\n  .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n    float: left;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-11 {\n    width: 91.66666667%;\n  }\n  .col-lg-10 {\n    width: 83.33333333%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-8 {\n    width: 66.66666667%;\n  }\n  .col-lg-7 {\n    width: 58.33333333%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-5 {\n    width: 41.66666667%;\n  }\n  .col-lg-4 {\n    width: 33.33333333%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-2 {\n    width: 16.66666667%;\n  }\n  .col-lg-1 {\n    width: 8.33333333%;\n  }\n  .col-lg-pull-12 {\n    right: 100%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666667%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666667%;\n  }\n  .col-lg-pull-7 {\n    right: 58.33333333%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666667%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-2 {\n    right: 16.66666667%;\n  }\n  .col-lg-pull-1 {\n    right: 8.33333333%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-push-12 {\n    left: 100%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666667%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666667%;\n  }\n  .col-lg-push-7 {\n    left: 58.33333333%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666667%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-2 {\n    left: 16.66666667%;\n  }\n  .col-lg-push-1 {\n    left: 8.33333333%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-offset-12 {\n    margin-left: 100%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666667%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666667%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.33333333%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666667%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.66666667%;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.33333333%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0%;\n  }\n}\ntable {\n  background-color: transparent;\n}\ncaption {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  color: #777777;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.42857143;\n  vertical-align: top;\n  border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n  border-top: 0;\n}\n.table > tbody + tbody {\n  border-top: 2px solid #ddd;\n}\n.table .table {\n  background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n  padding: 5px;\n}\n.table-bordered {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n  background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n  background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  position: static;\n  float: none;\n  display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n  background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n  background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n  background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n  background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n  background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n  background-color: #ebcccc;\n}\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid #ddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  min-width: 0;\n}\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n  -moz-box-sizing: border-box;\n  box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  line-height: normal;\n}\ninput[type=\"file\"] {\n  display: block;\n}\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\nselect[multiple],\nselect[size] {\n  height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\noutput {\n  display: block;\n  padding-top: 7px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n}\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  color: #555555;\n  background-color: #fff;\n  background-image: none;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n  color: #999;\n  opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n  color: #999;\n}\n.form-control::-webkit-input-placeholder {\n  color: #999;\n}\n.form-control::-ms-expand {\n  border: 0;\n  background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  background-color: #eeeeee;\n  opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n}\ntextarea.form-control {\n  height: auto;\n}\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"].form-control,\n  input[type=\"time\"].form-control,\n  input[type=\"datetime-local\"].form-control,\n  input[type=\"month\"].form-control {\n    line-height: 34px;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm,\n  .input-group-sm input[type=\"date\"],\n  .input-group-sm input[type=\"time\"],\n  .input-group-sm input[type=\"datetime-local\"],\n  .input-group-sm input[type=\"month\"] {\n    line-height: 30px;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg,\n  .input-group-lg input[type=\"date\"],\n  .input-group-lg input[type=\"time\"],\n  .input-group-lg input[type=\"datetime-local\"],\n  .input-group-lg input[type=\"month\"] {\n    line-height: 46px;\n  }\n}\n.form-group {\n  margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n  min-height: 20px;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n  cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n  cursor: not-allowed;\n}\n.form-control-static {\n  padding-top: 7px;\n  padding-bottom: 7px;\n  margin-bottom: 0;\n  min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n  height: auto;\n}\n.form-group-sm .form-control {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.form-group-sm select.form-control {\n  height: 30px;\n  line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n  height: auto;\n}\n.form-group-sm .form-control-static {\n  height: 30px;\n  min-height: 32px;\n  padding: 6px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.input-lg {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-lg {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n  height: auto;\n}\n.form-group-lg .form-control {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.form-group-lg select.form-control {\n  height: 46px;\n  line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n  height: auto;\n}\n.form-group-lg .form-control-static {\n  height: 46px;\n  min-height: 38px;\n  padding: 11px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.has-feedback {\n  position: relative;\n}\n.has-feedback .form-control {\n  padding-right: 42.5px;\n}\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  display: block;\n  width: 34px;\n  height: 34px;\n  line-height: 34px;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: 46px;\n  height: 46px;\n  line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: 30px;\n  height: 30px;\n  line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n  color: #3c763d;\n}\n.has-success .form-control {\n  border-color: #3c763d;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n  border-color: #2b542c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n  color: #3c763d;\n  border-color: #3c763d;\n  background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n  color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n  color: #8a6d3b;\n}\n.has-warning .form-control {\n  border-color: #8a6d3b;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n  border-color: #66512c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n  color: #8a6d3b;\n  border-color: #8a6d3b;\n  background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n  color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n  color: #a94442;\n}\n.has-error .form-control {\n  border-color: #a94442;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n  border-color: #843534;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n  color: #a94442;\n  border-color: #a94442;\n  background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n  color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n  top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n  top: 0;\n}\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-static {\n    display: inline-block;\n  }\n  .form-inline .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .form-inline .input-group .input-group-addon,\n  .form-inline .input-group .input-group-btn,\n  .form-inline .input-group .form-control {\n    width: auto;\n  }\n  .form-inline .input-group > .form-control {\n    width: 100%;\n  }\n  .form-inline .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .radio label,\n  .form-inline .checkbox label {\n    padding-left: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .form-inline .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  margin-top: 0;\n  margin-bottom: 0;\n  padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n  min-height: 27px;\n}\n.form-horizontal .form-group {\n  margin-left: -15px;\n  margin-right: -15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n    margin-bottom: 0;\n    padding-top: 7px;\n  }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n  right: 15px;\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-lg .control-label {\n    padding-top: 11px;\n    font-size: 18px;\n  }\n}\n@media (min-width: 768px) {\n  .form-horizontal .form-group-sm .control-label {\n    padding-top: 6px;\n    font-size: 12px;\n  }\n}\n.btn {\n  display: inline-block;\n  margin-bottom: 0;\n  font-weight: normal;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none;\n  border: 1px solid transparent;\n  white-space: nowrap;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.42857143;\n  border-radius: 4px;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n  outline: thin dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n  color: #333;\n  text-decoration: none;\n}\n.btn:active,\n.btn.active {\n  outline: 0;\n  background-image: none;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n  pointer-events: none;\n}\n.btn-default {\n  color: #333;\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #8c8c8c;\n}\n.btn-default:hover {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  color: #333;\n  background-color: #e6e6e6;\n  border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n  color: #333;\n  background-color: #d4d4d4;\n  border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n  background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n  background-color: #fff;\n  border-color: #ccc;\n}\n.btn-default .badge {\n  color: #fff;\n  background-color: #333;\n}\n.btn-primary {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n  color: #fff;\n  background-color: #286090;\n  border-color: #122b40;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  color: #fff;\n  background-color: #286090;\n  border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n  color: #fff;\n  background-color: #204d74;\n  border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n  background-color: #337ab7;\n  border-color: #2e6da4;\n}\n.btn-primary .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.btn-success {\n  color: #fff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #255625;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  color: #fff;\n  background-color: #449d44;\n  border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n  color: #fff;\n  background-color: #398439;\n  border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n  background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n.btn-success .badge {\n  color: #5cb85c;\n  background-color: #fff;\n}\n.btn-info {\n  color: #fff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #1b6d85;\n}\n.btn-info:hover {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  color: #fff;\n  background-color: #31b0d5;\n  border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n  color: #fff;\n  background-color: #269abc;\n  border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n  background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n.btn-info .badge {\n  color: #5bc0de;\n  background-color: #fff;\n}\n.btn-warning {\n  color: #fff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #985f0d;\n}\n.btn-warning:hover {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  color: #fff;\n  background-color: #ec971f;\n  border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n  color: #fff;\n  background-color: #d58512;\n  border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n.btn-warning .badge {\n  color: #f0ad4e;\n  background-color: #fff;\n}\n.btn-danger {\n  color: #fff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #761c19;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  color: #fff;\n  background-color: #c9302c;\n  border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n  color: #fff;\n  background-color: #ac2925;\n  border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n.btn-danger .badge {\n  color: #d9534f;\n  background-color: #fff;\n}\n.btn-link {\n  color: #337ab7;\n  font-weight: normal;\n  border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n  color: #23527c;\n  text-decoration: underline;\n  background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #777777;\n  text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n.btn-block {\n  display: block;\n  width: 100%;\n}\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n  -o-transition: opacity 0.15s linear;\n  transition: opacity 0.15s linear;\n}\n.fade.in {\n  opacity: 1;\n}\n.collapse {\n  display: none;\n}\n.collapse.in {\n  display: block;\n}\ntr.collapse.in {\n  display: table-row;\n}\ntbody.collapse.in {\n  display: table-row-group;\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition-property: height, visibility;\n  transition-property: height, visibility;\n  -webkit-transition-duration: 0.35s;\n  transition-duration: 0.35s;\n  -webkit-transition-timing-function: ease;\n  transition-timing-function: ease;\n}\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px dashed;\n  border-top: 4px solid \\9;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n  position: relative;\n}\n.dropdown-toggle:focus {\n  outline: 0;\n}\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  font-size: 14px;\n  text-align: left;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.42857143;\n  color: #333333;\n  white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  text-decoration: none;\n  color: #262626;\n  background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n  cursor: not-allowed;\n}\n.open > .dropdown-menu {\n  display: block;\n}\n.open > a {\n  outline: 0;\n}\n.dropdown-menu-right {\n  left: auto;\n  right: 0;\n}\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.42857143;\n  color: #777777;\n  white-space: nowrap;\n}\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: 990;\n}\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px dashed;\n  border-bottom: 4px solid \\9;\n  content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    left: auto;\n    right: 0;\n  }\n  .navbar-right .dropdown-menu-left {\n    left: 0;\n    right: auto;\n  }\n}\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n.btn-toolbar {\n  margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n  float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n  margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n  box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n  -webkit-box-shadow: none;\n  box-shadow: none;\n}\n.btn .caret {\n  margin-left: 0;\n}\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n  float: none;\n  display: table-cell;\n  width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n  width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n  left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n  float: none;\n  padding-left: 0;\n  padding-right: 0;\n}\n.input-group .form-control {\n  position: relative;\n  z-index: 2;\n  float: left;\n  width: 100%;\n  margin-bottom: 0;\n}\n.input-group .form-control:focus {\n  z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n  border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 46px;\n  line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  color: #555555;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n.input-group-btn {\n  position: relative;\n  font-size: 0;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n}\n.input-group-btn > .btn + .btn {\n  margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n  margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n  z-index: 2;\n  margin-left: -1px;\n}\n.nav {\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.nav > li {\n  position: relative;\n  display: block;\n}\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n  color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #777777;\n  text-decoration: none;\n  background-color: transparent;\n  cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #337ab7;\n}\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n.nav > li > a > img {\n  max-width: none;\n}\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.42857143;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n  cursor: default;\n}\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-tabs.nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs.nav-justified > .active > a,\n  .nav-tabs.nav-justified > .active > a:hover,\n  .nav-tabs.nav-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.nav-pills > li {\n  float: left;\n}\n.nav-pills > li > a {\n  border-radius: 4px;\n}\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #fff;\n  background-color: #337ab7;\n}\n.nav-stacked > li {\n  float: none;\n}\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n.nav-justified {\n  width: 100%;\n}\n.nav-justified > li {\n  float: none;\n}\n.nav-justified > li > a {\n  text-align: center;\n  margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n  top: auto;\n  left: auto;\n}\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n  .nav-justified > li > a {\n    margin-bottom: 0;\n  }\n}\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n  border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n  .nav-tabs-justified > li > a {\n    border-bottom: 1px solid #ddd;\n    border-radius: 4px 4px 0 0;\n  }\n  .nav-tabs-justified > .active > a,\n  .nav-tabs-justified > .active > a:hover,\n  .nav-tabs-justified > .active > a:focus {\n    border-bottom-color: #fff;\n  }\n}\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar {\n  position: relative;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: 15px;\n  padding-left: 15px;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-static-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n  max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n  .navbar-fixed-top .navbar-collapse,\n  .navbar-fixed-bottom .navbar-collapse {\n    max-height: 200px;\n  }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container-fluid > .navbar-header,\n  .container > .navbar-collapse,\n  .container-fluid > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.navbar-static-top {\n  z-index: 1000;\n  border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n  border-width: 1px 0 0;\n}\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n  height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n.navbar-brand > img {\n  display: block;\n}\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand,\n  .navbar > .container-fluid .navbar-brand {\n    margin-left: -15px;\n  }\n}\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: 15px;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  background-image: none;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.navbar-toggle:focus {\n  outline: 0;\n}\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n.navbar-form {\n  margin-left: -15px;\n  margin-right: -15px;\n  padding: 10px 15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control-static {\n    display: inline-block;\n  }\n  .navbar-form .input-group {\n    display: inline-table;\n    vertical-align: middle;\n  }\n  .navbar-form .input-group .input-group-addon,\n  .navbar-form .input-group .input-group-btn,\n  .navbar-form .input-group .form-control {\n    width: auto;\n  }\n  .navbar-form .input-group > .form-control {\n    width: 100%;\n  }\n  .navbar-form .control-label {\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    margin-top: 0;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .radio label,\n  .navbar-form .checkbox label {\n    padding-left: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    position: relative;\n    margin-left: 0;\n  }\n  .navbar-form .has-feedback .form-control-feedback {\n    top: 0;\n  }\n}\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n  .navbar-form .form-group:last-child {\n    margin-bottom: 0;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    -webkit-box-shadow: none;\n    box-shadow: none;\n  }\n}\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n  margin-top: 14px;\n  margin-bottom: 14px;\n}\n.navbar-text {\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n  .navbar-text {\n    float: left;\n    margin-left: 15px;\n    margin-right: 15px;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n    margin-right: -15px;\n  }\n  .navbar-right ~ .navbar-right {\n    margin-right: 0;\n  }\n}\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n  color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n.navbar-default .navbar-text {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n  color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333;\n  background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555;\n  background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #ccc;\n  background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n  border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  background-color: #e7e7e7;\n  color: #555;\n}\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #ccc;\n    background-color: transparent;\n  }\n}\n.navbar-default .navbar-link {\n  color: #777;\n}\n.navbar-default .navbar-link:hover {\n  color: #333;\n}\n.navbar-default .btn-link {\n  color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n  color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n  color: #ccc;\n}\n.navbar-inverse {\n  background-color: #222;\n  border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #fff;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #fff;\n  background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444;\n  background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n  border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  background-color: #080808;\n  color: #fff;\n}\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #9d9d9d;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #fff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #fff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444;\n    background-color: transparent;\n  }\n}\n.navbar-inverse .navbar-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n  color: #fff;\n}\n.navbar-inverse .btn-link {\n  color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n  color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n  color: #444;\n}\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n.breadcrumb > li {\n  display: inline-block;\n}\n.breadcrumb > li + li:before {\n  content: \"/\\00a0\";\n  padding: 0 5px;\n  color: #ccc;\n}\n.breadcrumb > .active {\n  color: #777777;\n}\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n.pagination > li {\n  display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  line-height: 1.42857143;\n  text-decoration: none;\n  color: #337ab7;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-bottom-right-radius: 4px;\n  border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  z-index: 2;\n  color: #23527c;\n  background-color: #eeeeee;\n  border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 3;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n  cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #777777;\n  background-color: #fff;\n  border-color: #ddd;\n  cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-bottom-right-radius: 6px;\n  border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-bottom-right-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  list-style: none;\n  text-align: center;\n}\n.pager li {\n  display: inline;\n}\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #777777;\n  background-color: #fff;\n  cursor: not-allowed;\n}\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.label:empty {\n  display: none;\n}\n.btn .label {\n  position: relative;\n  top: -1px;\n}\n.label-default {\n  background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #5e5e5e;\n}\n.label-primary {\n  background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #286090;\n}\n.label-success {\n  background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n.label-info {\n  background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n.label-warning {\n  background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n.label-danger {\n  background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #fff;\n  line-height: 1;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: #777777;\n  border-radius: 10px;\n}\n.badge:empty {\n  display: none;\n}\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n  top: 0;\n  padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n  color: #fff;\n  text-decoration: none;\n  cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.list-group-item > .badge {\n  float: right;\n}\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n.jumbotron {\n  padding-top: 30px;\n  padding-bottom: 30px;\n  margin-bottom: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n  color: inherit;\n}\n.jumbotron p {\n  margin-bottom: 15px;\n  font-size: 21px;\n  font-weight: 200;\n}\n.jumbotron > hr {\n  border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n  border-radius: 6px;\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.jumbotron .container {\n  max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron,\n  .container-fluid .jumbotron {\n    padding-left: 60px;\n    padding-right: 60px;\n  }\n  .jumbotron h1,\n  .jumbotron .h1 {\n    font-size: 63px;\n  }\n}\n.thumbnail {\n  display: block;\n  padding: 4px;\n  margin-bottom: 20px;\n  line-height: 1.42857143;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n  -webkit-transition: border 0.2s ease-in-out;\n  -o-transition: border 0.2s ease-in-out;\n  transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n  margin-left: auto;\n  margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n  border-color: #337ab7;\n}\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n.alert .alert-link {\n  font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n.alert > p + p {\n  margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n  padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n.alert-success {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n  color: #3c763d;\n}\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n  color: #2b542c;\n}\n.alert-info {\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n  color: #31708f;\n}\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n  color: #245269;\n}\n.alert-warning {\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n  color: #8a6d3b;\n}\n.alert-warning hr {\n  border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n  color: #66512c;\n}\n.alert-danger {\n  background-color: #f2dede;\n  border-color: #ebccd1;\n  color: #a94442;\n}\n.alert-danger hr {\n  border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n  color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n.progress {\n  overflow: hidden;\n  height: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: 12px;\n  line-height: 20px;\n  color: #fff;\n  text-align: center;\n  background-color: #337ab7;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n  -o-transition: width 0.6s ease;\n  transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n  -o-animation: progress-bar-stripes 2s linear infinite;\n  animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n.media-body {\n  width: 10000px;\n}\n.media-object {\n  display: block;\n}\n.media-object.img-thumbnail {\n  max-width: none;\n}\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n.media-middle {\n  vertical-align: middle;\n}\n.media-bottom {\n  vertical-align: bottom;\n}\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n.list-group {\n  margin-bottom: 20px;\n  padding-left: 0;\n}\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n  color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n  color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n  text-decoration: none;\n  color: #555;\n  background-color: #f5f5f5;\n}\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n  background-color: #eeeeee;\n  color: #777777;\n  cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n  color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n  color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n  color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #c7ddef;\n}\n.list-group-item-success {\n  color: #3c763d;\n  background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n  color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n  color: #3c763d;\n  background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n  color: #fff;\n  background-color: #3c763d;\n  border-color: #3c763d;\n}\n.list-group-item-info {\n  color: #31708f;\n  background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n  color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n  color: #31708f;\n  background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n  color: #fff;\n  background-color: #31708f;\n  border-color: #31708f;\n}\n.list-group-item-warning {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n  color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n  color: #8a6d3b;\n  background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n  color: #fff;\n  background-color: #8a6d3b;\n  border-color: #8a6d3b;\n}\n.list-group-item-danger {\n  color: #a94442;\n  background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n  color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n  color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n  color: #a94442;\n  background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n  color: #fff;\n  background-color: #a94442;\n  border-color: #a94442;\n}\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n.panel {\n  margin-bottom: 20px;\n  background-color: #fff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n  padding: 15px;\n}\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n  color: inherit;\n}\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n  color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n  color: inherit;\n}\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n  margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n  border-width: 1px 0;\n  border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n  border-top: 0;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n  border-bottom: 0;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n  margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n  border-top-left-radius: 3px;\n  border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n  border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n  border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n  border-bottom-left-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n  border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n  border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n  border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n  border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n  border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n  border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n  border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n  border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n  border-bottom: 0;\n}\n.panel > .table-responsive {\n  border: 0;\n  margin-bottom: 0;\n}\n.panel-group {\n  margin-bottom: 20px;\n}\n.panel-group .panel {\n  margin-bottom: 0;\n  border-radius: 4px;\n}\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n  border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n  border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #ddd;\n}\n.panel-default {\n  border-color: #ddd;\n}\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n  color: #f5f5f5;\n  background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ddd;\n}\n.panel-primary {\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n  color: #fff;\n  background-color: #337ab7;\n  border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n  color: #337ab7;\n  background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #337ab7;\n}\n.panel-success {\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n  color: #3c763d;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n  color: #dff0d8;\n  background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n.panel-info {\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n  color: #31708f;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n  color: #d9edf7;\n  background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #bce8f1;\n}\n.panel-warning {\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n  color: #8a6d3b;\n  background-color: #fcf8e3;\n  border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n  color: #fcf8e3;\n  background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #faebcc;\n}\n.panel-danger {\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n  color: #a94442;\n  background-color: #f2dede;\n  border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n  border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n  color: #f2dede;\n  background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n  border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  height: 100%;\n  width: 100%;\n  border: 0;\n}\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n  color: #000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n.modal-open {\n  overflow: hidden;\n}\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1050;\n  -webkit-overflow-scrolling: touch;\n  outline: 0;\n}\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n  -ms-transform: translate(0, -25%);\n  -o-transform: translate(0, -25%);\n  transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n  -moz-transition: -moz-transform 0.3s ease-out;\n  -o-transition: -o-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n  -ms-transform: translate(0, 0);\n  -o-transform: translate(0, 0);\n  transform: translate(0, 0);\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n.modal-content {\n  position: relative;\n  background-color: #fff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n  outline: 0;\n}\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n.modal-header {\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n  margin-top: -2px;\n}\n.modal-title {\n  margin: 0;\n  line-height: 1.42857143;\n}\n.modal-body {\n  position: relative;\n  padding: 15px;\n}\n.modal-footer {\n  padding: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n  margin-left: 5px;\n  margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n@media (min-width: 768px) {\n  .modal-dialog {\n    width: 600px;\n    margin: 30px auto;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n    box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n  .modal-sm {\n    width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg {\n    width: 900px;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 12px;\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.tooltip.top {\n  margin-top: -3px;\n  padding: 5px 0;\n}\n.tooltip.right {\n  margin-left: 3px;\n  padding: 0 5px;\n}\n.tooltip.bottom {\n  margin-top: 3px;\n  padding: 5px 0;\n}\n.tooltip.left {\n  margin-left: -3px;\n  padding: 0 5px;\n}\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 4px;\n}\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  right: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  margin-bottom: -5px;\n  border-width: 5px 5px 0;\n  border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-width: 5px 0 5px 5px;\n  border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  margin-top: -5px;\n  border-width: 0 5px 5px;\n  border-bottom-color: #000;\n}\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: 1.42857143;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n  font-size: 14px;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n  margin-top: -10px;\n}\n.popover.right {\n  margin-left: 10px;\n}\n.popover.bottom {\n  margin-top: 10px;\n}\n.popover.left {\n  margin-left: -10px;\n}\n.popover-title {\n  margin: 0;\n  padding: 8px 14px;\n  font-size: 14px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n.popover-content {\n  padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.popover > .arrow {\n  border-width: 11px;\n}\n.popover > .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n.popover.top > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-width: 0;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  bottom: -11px;\n}\n.popover.top > .arrow:after {\n  content: \" \";\n  bottom: 1px;\n  margin-left: -10px;\n  border-bottom-width: 0;\n  border-top-color: #fff;\n}\n.popover.right > .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-left-width: 0;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n  content: \" \";\n  left: 1px;\n  bottom: -10px;\n  border-left-width: 0;\n  border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n  left: 50%;\n  margin-left: -11px;\n  border-top-width: 0;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  top: -11px;\n}\n.popover.bottom > .arrow:after {\n  content: \" \";\n  top: 1px;\n  margin-left: -10px;\n  border-top-width: 0;\n  border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-right-width: 0;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n  content: \" \";\n  right: 1px;\n  border-right-width: 0;\n  border-left-color: #fff;\n  bottom: -10px;\n}\n.carousel {\n  position: relative;\n}\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n}\n.carousel-inner > .item {\n  display: none;\n  position: relative;\n  -webkit-transition: 0.6s ease-in-out left;\n  -o-transition: 0.6s ease-in-out left;\n  transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n  .carousel-inner > .item {\n    -webkit-transition: -webkit-transform 0.6s ease-in-out;\n    -moz-transition: -moz-transform 0.6s ease-in-out;\n    -o-transition: -o-transform 0.6s ease-in-out;\n    transition: transform 0.6s ease-in-out;\n    -webkit-backface-visibility: hidden;\n    -moz-backface-visibility: hidden;\n    backface-visibility: hidden;\n    -webkit-perspective: 1000px;\n    -moz-perspective: 1000px;\n    perspective: 1000px;\n  }\n  .carousel-inner > .item.next,\n  .carousel-inner > .item.active.right {\n    -webkit-transform: translate3d(100%, 0, 0);\n    transform: translate3d(100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.prev,\n  .carousel-inner > .item.active.left {\n    -webkit-transform: translate3d(-100%, 0, 0);\n    transform: translate3d(-100%, 0, 0);\n    left: 0;\n  }\n  .carousel-inner > .item.next.left,\n  .carousel-inner > .item.prev.right,\n  .carousel-inner > .item.active {\n    -webkit-transform: translate3d(0, 0, 0);\n    transform: translate3d(0, 0, 0);\n    left: 0;\n  }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n.carousel-inner > .active {\n  left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n.carousel-inner > .next {\n  left: 100%;\n}\n.carousel-inner > .prev {\n  left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n.carousel-inner > .active.left {\n  left: -100%;\n}\n.carousel-inner > .active.right {\n  left: 100%;\n}\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: 15%;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n  font-size: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n  left: auto;\n  right: 0;\n  background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n  outline: 0;\n  color: #fff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  margin-top: -10px;\n  z-index: 5;\n  display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n  left: 50%;\n  margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n  right: 50%;\n  margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  line-height: 1;\n  font-family: serif;\n}\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n}\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  border: 1px solid #fff;\n  border-radius: 10px;\n  cursor: pointer;\n  background-color: #000 \\9;\n  background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n  margin: 0;\n  width: 12px;\n  height: 12px;\n  background-color: #fff;\n}\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n  text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -10px;\n    font-size: 30px;\n  }\n  .carousel-control .glyphicon-chevron-left,\n  .carousel-control .icon-prev {\n    margin-left: -10px;\n  }\n  .carousel-control .glyphicon-chevron-right,\n  .carousel-control .icon-next {\n    margin-right: -10px;\n  }\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n  content: \" \";\n  display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n  clear: both;\n}\n.center-block {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n.hidden {\n  display: none !important;\n}\n.affix {\n  position: fixed;\n}\n@-ms-viewport {\n  width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  table.visible-xs {\n    display: table !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-block {\n    display: block !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline {\n    display: inline !important;\n  }\n}\n@media (max-width: 767px) {\n  .visible-xs-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  table.visible-sm {\n    display: table !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-block {\n    display: block !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  table.visible-md {\n    display: table !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-block {\n    display: block !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  table.visible-lg {\n    display: table !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-block {\n    display: block !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline {\n    display: inline !important;\n  }\n}\n@media (min-width: 1200px) {\n  .visible-lg-inline-block {\n    display: inline-block !important;\n  }\n}\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n}\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n}\n.visible-print {\n  display: none !important;\n}\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  table.visible-print {\n    display: table !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n}\n.visible-print-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-block {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n}\n@media print {\n  .visible-print-inline-block {\n    display: inline-block !important;\n  }\n}\n@media print {\n  .hidden-print {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n//    without disabling user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n       url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\002a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-cd                     { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file              { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file              { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up               { &:before { content: \"\\e204\"; } }\n.glyphicon-copy                   { &:before { content: \"\\e205\"; } }\n.glyphicon-paste                  { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door                   { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key                    { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert                  { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer              { &:before { content: \"\\e210\"; } }\n.glyphicon-king                   { &:before { content: \"\\e211\"; } }\n.glyphicon-queen                  { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn                   { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop                 { &:before { content: \"\\e214\"; } }\n.glyphicon-knight                 { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula           { &:before { content: \"\\e216\"; } }\n.glyphicon-tent                   { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard             { &:before { content: \"\\e218\"; } }\n.glyphicon-bed                    { &:before { content: \"\\e219\"; } }\n.glyphicon-apple                  { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase                  { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass              { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp                   { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate              { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank             { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors               { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin                { &:before { content: \"\\e227\"; } }\n.glyphicon-btc                    { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt                    { &:before { content: \"\\e227\"; } }\n.glyphicon-yen                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy                    { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble                  { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub                    { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale                  { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly              { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted       { &:before { content: \"\\e232\"; } }\n.glyphicon-education              { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal      { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical        { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger         { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window           { &:before { content: \"\\e237\"; } }\n.glyphicon-oil                    { &:before { content: \"\\e238\"; } }\n.glyphicon-grain                  { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses             { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size              { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color             { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background        { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top       { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom    { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left      { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical  { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right     { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right         { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left          { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom        { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top           { &:before { content: \"\\e253\"; } }\n.glyphicon-console                { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript            { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript              { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left              { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right             { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down              { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up                { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  .box-sizing(border-box);\n}\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n  cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n  background-color: @state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: @dl-horizontal-breakpoint) {\n    dt {\n      float: left;\n      width: (@dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n  color: @color;\n  a&:hover,\n  a&:focus {\n    color: darken(@color, 10%);\n  }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n  background-color: @color;\n  a&:hover,\n  a&:focus {\n    background-color: darken(@color, 10%);\n  }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  floor((@gutter / 2));\n  padding-right: ceil((@gutter / 2));\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  ceil((@gutter / -2));\n  margin-right: floor((@gutter / -2));\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  ceil((@grid-gutter-width / 2));\n      padding-right: floor((@grid-gutter-width / 2));\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n  .col-@{class}-push-0 {\n    left: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n  .col-@{class}-pull-0 {\n    right: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: @table-bg;\n}\ncaption {\n  padding-top: @table-cell-padding;\n  padding-bottom: @table-cell-padding;\n  color: @text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-of-type(odd) {\n    background-color: @table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: @table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: @screen-xs-max) {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &:hover > .@{state},\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Unstyle the caret on `<select>`s in IE10+.\n  &::-ms-expand {\n    border: 0;\n    background-color: transparent;\n  }\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n  }\n\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848\n//\n// Note that as of 8.3, iOS doesn't support `datetime` or `week`.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    &.form-control {\n      line-height: @input-height-base;\n    }\n\n    &.input-sm,\n    .input-group-sm & {\n      line-height: @input-height-small;\n    }\n\n    &.input-lg,\n    .input-group-lg & {\n      line-height: @input-height-large;\n    }\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  position: relative;\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: (@padding-base-vertical + 1);\n  padding-bottom: (@padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n  min-height: (@line-height-computed + @font-size-base);\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n  .form-control {\n    height: @input-height-small;\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    line-height: @line-height-small;\n    border-radius: @input-border-radius-small;\n  }\n  select.form-control {\n    height: @input-height-small;\n    line-height: @input-height-small;\n  }\n  textarea.form-control,\n  select[multiple].form-control {\n    height: auto;\n  }\n  .form-control-static {\n    height: @input-height-small;\n    min-height: (@line-height-computed + @font-size-small);\n    padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n    font-size: @font-size-small;\n    line-height: @line-height-small;\n  }\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n  .form-control {\n    height: @input-height-large;\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    line-height: @line-height-large;\n    border-radius: @input-border-radius-large;\n  }\n  select.form-control {\n    height: @input-height-large;\n    line-height: @input-height-large;\n  }\n  textarea.form-control,\n  select[multiple].form-control {\n    height: auto;\n  }\n  .form-control-static {\n    height: @input-height-large;\n    min-height: (@line-height-computed + @font-size-large);\n    padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n    font-size: @font-size-large;\n    line-height: @line-height-large;\n  }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: @input-height-base;\n  height: @input-height-base;\n  line-height: @input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n  width: @input-height-large;\n  height: @input-height-large;\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n  width: @input-height-small;\n  height: @input-height-small;\n  line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n    top: (@line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n    top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match.\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: floor((@grid-gutter-width / 2));\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: (@padding-large-vertical + 1);\n        font-size: @font-size-large;\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: (@padding-small-vertical + 1);\n        font-size: @font-size-small;\n      }\n    }\n  }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: @text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea&,\n  select[multiple]& {\n    height: auto;\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    .opacity(.65);\n    .box-shadow(none);\n  }\n\n  a& {\n    &.disabled,\n    fieldset[disabled] & {\n      pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n    }\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:focus,\n  &.focus {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 25%);\n  }\n  &:hover {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n\n    &:hover,\n    &:focus,\n    &.focus {\n      color: @color;\n      background-color: darken(@background, 17%);\n          border-color: darken(@border, 25%);\n    }\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus,\n    &.focus {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n\n  &.in      { display: block; }\n  tr&.in    { display: table-row; }\n  tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition-property(~\"height, visibility\");\n  .transition-duration(.35s);\n  .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base dashed;\n  border-top:   @caret-width-base solid ~\"\\9\"; // IE8\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: @cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base dashed;\n    border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 2px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn,\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    .border-top-radius(@btn-border-radius-base);\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    .border-top-radius(0);\n    .border-bottom-radius(@btn-border-radius-base);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n    \n    &:focus {\n      z-index: 3;\n    }\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @input-border-radius;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @input-border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @input-border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      z-index: 2;\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: @cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: @navbar-collapse-max-height;\n\n    @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  margin-bottom: 0;\n  .border-top-radius(@navbar-border-radius);\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right {\n    .pull-right();\n    margin-right: -@navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 3;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n      line-height: @line-height;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n  background-color: @color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: middle;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n\n  .btn-xs &,\n  .btn-group-xs > .btn & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // Hover state, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @badge-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: @badge-active-color;\n    background-color: @badge-active-bg;\n  }\n\n  .list-group-item > & {\n    float: right;\n  }\n\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding-top:    @jumbotron-padding;\n  padding-bottom: @jumbotron-padding;\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken(@jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n    padding-left:  (@grid-gutter-width / 2);\n    padding-right: (@grid-gutter-width / 2);\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding-top:    (@jumbotron-padding * 1.6);\n    padding-bottom: (@jumbotron-padding * 1.6);\n\n    .container &,\n    .container-fluid & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: @jumbotron-heading-font-size;\n    }\n  }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @progress-border-radius;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n",".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media,\n.media-body {\n  zoom: 1;\n  overflow: hidden;\n}\n\n.media-body {\n  width: 10000px;\n}\n\n.media-object {\n  display: block;\n\n  // Fix collapse in webkit from max-width: 100% and display: table-cell.\n  &.img-thumbnail {\n    max-width: none;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n  color: @list-group-link-color;\n\n  .list-group-item-heading {\n    color: @list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @list-group-link-hover-color;\n    background-color: @list-group-hover-bg;\n  }\n}\n\nbutton.list-group-item {\n  width: 100%;\n  text-align: left;\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: @list-group-disabled-bg;\n    color: @list-group-disabled-color;\n    cursor: @cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n  .list-group-item-@{state} {\n    color: @color;\n    background-color: @background;\n\n    a&,\n    button& {\n      color: @color;\n\n      .list-group-item-heading {\n        color: inherit;\n      }\n\n      &:hover,\n      &:focus {\n        color: @color;\n        background-color: darken(@background, 5%);\n      }\n      &.active,\n      &.active:hover,\n      &.active:focus {\n        color: #fff;\n        background-color: @color;\n        border-color: @color;\n      }\n    }\n  }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: @panel-body-padding;\n  &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n  padding: @panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  .border-top-radius((@panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  color: inherit;\n\n  > a,\n  > small,\n  > .small,\n  > small > a,\n  > .small > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: @panel-footer-padding;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        .border-top-radius((@panel-border-radius - 1));\n      }\n    }\n\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        .border-bottom-radius((@panel-border-radius - 1));\n      }\n    }\n  }\n  > .panel-heading + .panel-collapse > .list-group {\n    .list-group-item:first-child {\n      .border-top-radius(0);\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: @panel-body-padding;\n      padding-right: @panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    .border-top-radius((@panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: (@panel-border-radius - 1);\n        border-top-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    .border-bottom-radius((@panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: (@panel-border-radius - 1);\n        border-bottom-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid @table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: @line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: @border;\n    }\n    .badge {\n      color: @heading-bg-color;\n      background-color: @heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n  padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n  padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid @well-border;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal-background;\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: @modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n  .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  .reset-text();\n  font-size: @font-size-small;\n\n  .opacity(0);\n\n  &.in     { .opacity(@tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    right: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    left: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    right: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    left: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n",".reset-text() {\n  font-family: @font-family-base;\n  // We deliberately do NOT reset font-size.\n  font-style: normal;\n  font-weight: normal;\n  letter-spacing: normal;\n  line-break: auto;\n  line-height: @line-height-base;\n  text-align: left; // Fallback for where `start` is not supported\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  white-space: normal;\n  word-break: normal;\n  word-spacing: normal;\n  word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n  // So reset our font and text properties to avoid inheriting weird values.\n  .reset-text();\n  font-size: @font-size-base;\n\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -@popover-arrow-width; }\n  &.right   { margin-left: @popover-arrow-width; }\n  &.bottom  { margin-top: @popover-arrow-width; }\n  &.left    { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      .transition-transform(~'0.6s ease-in-out');\n      .backface-visibility(~'hidden');\n      .perspective(1000px);\n\n      &.next,\n      &.active.right {\n        .translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        .translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        .translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    margin-top: -10px;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    line-height: 1;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: (@carousel-control-font-size * 1.5);\n      height: (@carousel-control-font-size * 1.5);\n      margin-top: (@carousel-control-font-size / -2);\n      font-size: (@carousel-control-font-size * 1.5);\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: (@carousel-control-font-size / -2);\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: (@carousel-control-font-size / -2);\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n","// Center-align a block level element\n\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n  width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n.visible-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n}\n.visible-xs-block {\n  @media (max-width: @screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: @screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: @screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n}\n.visible-sm-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n}\n.visible-md-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n.visible-lg-block {\n  @media (min-width: @screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: @screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: @screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n.hidden-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n  .responsive-invisibility();\n\n  @media print {\n    .responsive-visibility();\n  }\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n.hidden-print {\n  @media print {\n    .responsive-invisibility();\n  }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table !important; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n}\n"]}
\ No newline at end of file
diff --git a/doc/doxygen/css/bootstrap.min.css b/doc/doxygen/css/bootstrap.min.css
new file mode 100644
index 0000000..4cf729e
--- /dev/null
+++ b/doc/doxygen/css/bootstrap.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-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}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}
+/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/doc/doxygen/css/bootstrap.min.css.map b/doc/doxygen/css/bootstrap.min.css.map
new file mode 100644
index 0000000..5f49bb3
--- /dev/null
+++ b/doc/doxygen/css/bootstrap.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":";;;;4EAQA,KACE,YAAA,WACA,yBAAA,KACA,qBAAA,KAOF,KACE,OAAA,EAaF,QAAA,MAAA,QAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,KAAA,IAAA,QAAA,QAaE,QAAA,MAQF,MAAA,OAAA,SAAA,MAIE,QAAA,aACA,eAAA,SAQF,sBACE,QAAA,KACA,OAAA,EAQF,SAAA,SAEE,QAAA,KAUF,EACE,iBAAA,YAQF,SAAA,QAEE,QAAA,EAUF,YACE,cAAA,IAAA,OAOF,EAAA,OAEE,YAAA,IAOF,IACE,WAAA,OAQF,GACE,OAAA,MAAA,EACA,UAAA,IAOF,KACE,MAAA,KACA,WAAA,KAOF,MACE,UAAA,IAOF,IAAA,IAEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IACE,IAAA,MAGF,IACE,OAAA,OAUF,IACE,OAAA,EAOF,eACE,SAAA,OAUF,OACE,OAAA,IAAA,KAOF,GACE,OAAA,EAAA,mBAAA,YAAA,gBAAA,YACA,WAAA,YAOF,IACE,SAAA,KAOF,KAAA,IAAA,IAAA,KAIE,YAAA,UAAA,UACA,UAAA,IAkBF,OAAA,MAAA,SAAA,OAAA,SAKE,OAAA,EACA,KAAA,QACA,MAAA,QAOF,OACE,SAAA,QAUF,OAAA,OAEE,eAAA,KAWF,OAAA,wBAAA,kBAAA,mBAIE,mBAAA,OACA,OAAA,QAOF,iBAAA,qBAEE,OAAA,QAOF,yBAAA,wBAEE,QAAA,EACA,OAAA,EAQF,MACE,YAAA,OAWF,qBAAA,kBAEE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,EASF,8CAAA,8CAEE,OAAA,KAQF,mBACE,mBAAA,YACA,gBAAA,YAAA,WAAA,YAAA,mBAAA,UASF,iDAAA,8CAEE,mBAAA,KAOF,SACE,QAAA,MAAA,OAAA,MACA,OAAA,EAAA,IACA,OAAA,IAAA,MAAA,OAQF,OACE,QAAA,EACA,OAAA,EAOF,SACE,SAAA,KAQF,SACE,YAAA,IAUF,MACE,eAAA,EACA,gBAAA,SAGF,GAAA,GAEE,QAAA,uFCjUF,aA7FI,EAAA,OAAA,QAGI,MAAA,eACA,YAAA,eACA,WAAA,cAAA,mBAAA,eACA,WAAA,eAGJ,EAAA,UAEI,gBAAA,UAGJ,cACI,QAAA,KAAA,WAAA,IAGJ,kBACI,QAAA,KAAA,YAAA,IAKJ,6BAAA,mBAEI,QAAA,GAGJ,WAAA,IAEI,OAAA,IAAA,MAAA,KC4KL,kBAAA,MDvKK,MC0KL,QAAA,mBDrKK,IE8KN,GDLC,kBAAA,MDrKK,ICwKL,UAAA,eCUD,GF5KM,GE2KN,EF1KM,QAAA,ECuKL,OAAA,ECSD,GF3KM,GCsKL,iBAAA,MD/JK,QCkKL,QAAA,KCSD,YFtKU,oBCiKT,iBAAA,eD7JK,OCgKL,OAAA,IAAA,MAAA,KD5JK,OC+JL,gBAAA,mBCSD,UFpKU,UC+JT,iBAAA,eDzJS,mBEkKV,mBDLC,OAAA,IAAA,MAAA,gBEjPD,WACA,YAAA,uBFsPD,IAAA,+CE7OC,IAAK,sDAAuD,4BAA6B,iDAAkD,gBAAiB,gDAAiD,eAAgB,+CAAgD,mBAAoB,2EAA4E,cAE7W,WACA,SAAA,SACA,IAAA,IACA,QAAA,aACA,YAAA,uBACA,WAAA,OACA,YAAA,IACA,YAAA,EAIkC,uBAAA,YAAW,wBAAA,UACX,2BAAW,QAAA,QAEX,uBDuPlC,QAAS,QCtPyB,sBFiPnC,uBEjP8C,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,qBAAW,QAAA,QACX,0BAAW,QAAA,QACX,qBAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,sBAAW,QAAA,QACX,yBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,+BAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,gCAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,gCAAW,QAAA,QACX,gCAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,0BAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,mCAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,sBAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QACX,4BAAW,QAAA,QACX,qCAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,mCAAW,QAAA,QACX,uCAAW,QAAA,QACX,gCAAW,QAAA,QACX,oCAAW,QAAA,QACX,qCAAW,QAAA,QACX,yCAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,iCAAW,QAAA,QACX,oCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,qBAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QASX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,+BAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,mCAAW,QAAA,QACX,4BAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,kCAAW,QAAA,QACX,mCAAW,QAAA,QACX,sCAAW,QAAA,QACX,0CAAW,QAAA,QACX,oCAAW,QAAA,QACX,wCAAW,QAAA,QACX,qCAAW,QAAA,QACX,iCAAW,QAAA,QACX,gCAAW,QAAA,QACX,kCAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QCtS/C,0BCgEE,QAAA,QHi+BF,EDNC,mBAAA,WGxhCI,gBAAiB,WFiiCZ,WAAY,WGl+BZ,OADL,QJg+BJ,mBAAA,WGthCI,gBAAiB,WACpB,WAAA,WHyhCD,KGrhCC,UAAW,KAEX,4BAAA,cAEA,KACA,YAAA,iBAAA,UAAA,MAAA,WHuhCD,UAAA,KGnhCC,YAAa,WF4hCb,MAAO,KACP,iBAAkB,KExhClB,OADA,MAEA,OHqhCD,SG/gCC,YAAa,QACb,UAAA,QACA,YAAA,QAEA,EFwhCA,MAAO,QEthCL,gBAAA,KAIF,QH8gCD,QKnkCC,MAAA,QAEA,gBAAA,ULskCD,QGxgCC,QAAS,KAAK,OACd,QAAA,IAAA,KAAA,yBH0gCD,eAAA,KGngCC,OHsgCD,OAAA,ECSD,IACE,eAAgB,ODDjB,4BMhlCC,0BLmlCF,gBKplCE,iBADA,eH4EA,QAAS,MACT,UAAA,KHwgCD,OAAA,KGjgCC,aACA,cAAA,IAEA,eACA,QAAA,aC6FA,UAAA,KACK,OAAA,KACG,QAAA,IEvLR,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KNgmCD,cAAA,IGlgCC,mBAAoB,IAAI,IAAI,YAC5B,cAAA,IAAA,IAAA,YHogCD,WAAA,IAAA,IAAA,YG7/BC,YACA,cAAA,IAEA,GHggCD,WAAA,KGx/BC,cAAe,KACf,OAAA,EACA,WAAA,IAAA,MAAA,KAEA,SACA,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EH0/BD,OAAA,KGl/BC,SAAA,OF2/BA,KAAM,cEz/BJ,OAAA,EAEA,0BACA,yBACA,SAAA,OACA,MAAA,KHo/BH,OAAA,KGz+BC,OAAQ,EACR,SAAA,QH2+BD,KAAA,KCSD,cACE,OAAQ,QAQV,IACA,IMnpCE,IACA,IACA,IACA,INyoCF,GACA,GACA,GACA,GACA,GACA,GDAC,YAAA,QOnpCC,YAAa,IN4pCb,YAAa,IACb,MAAO,QAoBT,WAZA,UAaA,WAZA,UM7pCI,WN8pCJ,UM7pCI,WN8pCJ,UM7pCI,WN8pCJ,UDMC,WCLD,UACA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SMrpCE,YAAa,INyqCb,YAAa,EACb,MAAO,KAGT,IMzqCE,IAJF,IN4qCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UM7qCA,WN+qCA,UACA,UANA,SM7qCI,UN+qCJ,SM5qCA,UN8qCA,SAQE,UAAW,IAGb,IMrrCE,IAJF,INwrCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UMxrCA,WN0rCA,UACA,UANA,SMzrCI,UN2rCJ,SMvrCA,UNyrCA,SMzrCU,UAAA,IACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KAOR,IADF,GPusCC,UAAA,KCSD,EM1sCE,OAAA,EAAA,EAAA,KAEA,MPqsCD,cAAA,KOhsCC,UAAW,KAwOX,YAAa,IA1OX,YAAA,IPusCH,yBO9rCC,MNusCE,UAAW,MMlsCf,OAAA,MAEE,UAAA,IAKF,MP2rCC,KO3rCsB,QAAA,KP8rCtB,iBAAA,QO7rCsB,WPgsCtB,WAAA,KO/rCsB,YPksCtB,WAAA,MOjsCsB,aPosCtB,WAAA,OOnsCsB,cPssCtB,WAAA,QOnsCsB,aPssCtB,YAAA,OOrsCsB,gBPwsCtB,eAAA,UOvsCsB,gBP0sCtB,eAAA,UOtsCC,iBPysCD,eAAA,WQ5yCC,YR+yCD,MAAA,KCSD,cOrzCI,MAAA,QAHF,qBDwGF,qBP8sCC,MAAA,QCSD,cO5zCI,MAAA,QAHF,qBD2GF,qBPktCC,MAAA,QCSD,WOn0CI,MAAA,QAHF,kBD8GF,kBPstCC,MAAA,QCSD,cO10CI,MAAA,QAHF,qBDiHF,qBP0tCC,MAAA,QCSD,aOj1CI,MAAA,QDwHF,oBAHF,oBExHE,MAAA,QACA,YR21CA,MAAO,KQz1CL,iBAAA,QAHF,mBF8HF,mBP4tCC,iBAAA,QCSD,YQh2CI,iBAAA,QAHF,mBFiIF,mBPguCC,iBAAA,QCSD,SQv2CI,iBAAA,QAHF,gBFoIF,gBPouCC,iBAAA,QCSD,YQ92CI,iBAAA,QAHF,mBFuIF,mBPwuCC,iBAAA,QCSD,WQr3CI,iBAAA,QF6IF,kBADF,kBAEE,iBAAA,QPuuCD,aO9tCC,eAAgB,INuuChB,OAAQ,KAAK,EAAE,KMruCf,cAAA,IAAA,MAAA,KAFF,GPmuCC,GCSC,WAAY,EACZ,cAAe,KM/tCf,MP2tCD,MO5tCD,MAPI,MASF,cAAA,EAIF,eALE,aAAA,EACA,WAAA,KPmuCD,aO/tCC,aAAc,EAKZ,YAAA,KACA,WAAA,KP8tCH,gBOxtCC,QAAS,aACT,cAAA,IACA,aAAA,IAEF,GNiuCE,WAAY,EM/tCZ,cAAA,KAGA,GADF,GP2tCC,YAAA,WOvtCC,GP0tCD,YAAA,IOpnCD,GAvFM,YAAA,EAEA,yBACA,kBGtNJ,MAAA,KACA,MAAA,MACA,SAAA,OVs6CC,MAAA,KO9nCC,WAAY,MAhFV,cAAA,SPitCH,YAAA,OOvsCD,kBNitCE,YAAa,OM3sCjB,0BPusCC,YOtsCC,OAAA,KA9IqB,cAAA,IAAA,OAAA,KAmJvB,YACE,UAAA,IACA,eAAA,UAEA,WPusCD,QAAA,KAAA,KOlsCG,OAAA,EAAA,EAAA,KN2sCF,UAAW,OACX,YAAa,IAAI,MAAM,KMrtCzB,yBPgtCC,wBOhtCD,yBN0tCE,cAAe,EMpsCb,kBAFA,kBACA,iBPmsCH,QAAA,MOhsCG,UAAA,INysCF,YAAa,WACb,MAAO,KMjsCT,yBP4rCC,yBO5rCD,wBAEE,QAAA,cAEA,oBACA,sBACA,cAAA,KP8rCD,aAAA,EOxrCG,WAAA,MNisCF,aAAc,IAAI,MAAM,KACxB,YAAa,EMjsCX,kCNmsCJ,kCMpsCe,iCACX,oCNosCJ,oCDLC,mCCUC,QAAS,GMlsCX,iCNosCA,iCM1sCM,gCAOJ,mCNosCF,mCDLC,kCO9rCC,QAAA,cPmsCD,QWx+CC,cAAe,KVi/Cf,WAAY,OACZ,YAAa,WU9+Cb,KX0+CD,IWt+CD,IACE,KACA,YAAA,MAAA,OAAA,SAAA,cAAA,UAEA,KACA,QAAA,IAAA,IXw+CD,UAAA,IWp+CC,MAAO,QACP,iBAAA,QACA,cAAA,IAEA,IACA,QAAA,IAAA,IACA,UAAA,IV6+CA,MU7+CA,KXs+CD,iBAAA,KW5+CC,cAAe,IASb,mBAAA,MAAA,EAAA,KAAA,EAAA,gBACA,WAAA,MAAA,EAAA,KAAA,EAAA,gBAEA,QV8+CF,QU9+CE,EXs+CH,UAAA,KWj+CC,YAAa,IACb,mBAAA,KACA,WAAA,KAEA,IACA,QAAA,MACA,QAAA,MACA,OAAA,EAAA,EAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,WAAA,UXm+CD,UAAA,WW9+CC,iBAAkB,QAehB,OAAA,IAAA,MAAA,KACA,cAAA,IAEA,SACA,QAAA,EACA,UAAA,QXk+CH,MAAA,QW79CC,YAAa,SACb,iBAAA,YACA,cAAA,EC1DF,gBCHE,WAAA,MACA,WAAA,OAEA,Wb+hDD,cAAA,KYzhDC,aAAA,KAqEA,aAAc,KAvEZ,YAAA,KZgiDH,yBY3hDC,WAkEE,MAAO,OZ89CV,yBY7hDC,WA+DE,MAAO,OZm+CV,0BY1hDC,WCvBA,MAAA,QAGA,iBbojDD,cAAA,KYvhDC,aAAc,KCvBd,aAAA,KACA,YAAA,KCAE,KACE,aAAA,MAEA,YAAA,MAGA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UdijDL,SAAA,ScjiDG,WAAA,IACE,cAAA,KdmiDL,aAAA,Kc3hDG,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud8hDH,MAAA,Kc9hDG,WdiiDH,MAAA,KcjiDG,WdoiDH,MAAA,acpiDG,WduiDH,MAAA,acviDG,Ud0iDH,MAAA,Ic1iDG,Ud6iDH,MAAA,ac7iDG,UdgjDH,MAAA,achjDG,UdmjDH,MAAA,IcnjDG,UdsjDH,MAAA,actjDG,UdyjDH,MAAA,aczjDG,Ud4jDH,MAAA,Ic5jDG,Ud+jDH,MAAA,achjDG,UdmjDH,MAAA,YcnjDG,gBdsjDH,MAAA,KctjDG,gBdyjDH,MAAA,aczjDG,gBd4jDH,MAAA,ac5jDG,ed+jDH,MAAA,Ic/jDG,edkkDH,MAAA,aclkDG,edqkDH,MAAA,acrkDG,edwkDH,MAAA,IcxkDG,ed2kDH,MAAA,ac3kDG,ed8kDH,MAAA,ac9kDG,edilDH,MAAA,IcjlDG,edolDH,MAAA,ac/kDG,edklDH,MAAA,YcjmDG,edomDH,MAAA,KcpmDG,gBdumDH,KAAA,KcvmDG,gBd0mDH,KAAA,ac1mDG,gBd6mDH,KAAA,ac7mDG,edgnDH,KAAA,IchnDG,edmnDH,KAAA,acnnDG,edsnDH,KAAA,actnDG,edynDH,KAAA,IcznDG,ed4nDH,KAAA,ac5nDG,ed+nDH,KAAA,ac/nDG,edkoDH,KAAA,IcloDG,edqoDH,KAAA,achoDG,edmoDH,KAAA,YcpnDG,edunDH,KAAA,KcvnDG,kBd0nDH,YAAA,Kc1nDG,kBd6nDH,YAAA,ac7nDG,kBdgoDH,YAAA,achoDG,iBdmoDH,YAAA,IcnoDG,iBdsoDH,YAAA,actoDG,iBdyoDH,YAAA,aczoDG,iBd4oDH,YAAA,Ic5oDG,iBd+oDH,YAAA,ac/oDG,iBdkpDH,YAAA,aclpDG,iBdqpDH,YAAA,IcrpDG,iBdwpDH,YAAA,acxpDG,iBd2pDH,YAAA,Yc7rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud2rDD,MAAA,Kc3rDC,Wd8rDD,MAAA,Kc9rDC,WdisDD,MAAA,acjsDC,WdosDD,MAAA,acpsDC,UdusDD,MAAA,IcvsDC,Ud0sDD,MAAA,ac1sDC,Ud6sDD,MAAA,ac7sDC,UdgtDD,MAAA,IchtDC,UdmtDD,MAAA,acntDC,UdstDD,MAAA,acttDC,UdytDD,MAAA,IcztDC,Ud4tDD,MAAA,ac7sDC,UdgtDD,MAAA,YchtDC,gBdmtDD,MAAA,KcntDC,gBdstDD,MAAA,acttDC,gBdytDD,MAAA,acztDC,ed4tDD,MAAA,Ic5tDC,ed+tDD,MAAA,ac/tDC,edkuDD,MAAA,acluDC,edquDD,MAAA,IcruDC,edwuDD,MAAA,acxuDC,ed2uDD,MAAA,ac3uDC,ed8uDD,MAAA,Ic9uDC,edivDD,MAAA,ac5uDC,ed+uDD,MAAA,Yc9vDC,ediwDD,MAAA,KcjwDC,gBdowDD,KAAA,KcpwDC,gBduwDD,KAAA,acvwDC,gBd0wDD,KAAA,ac1wDC,ed6wDD,KAAA,Ic7wDC,edgxDD,KAAA,achxDC,edmxDD,KAAA,acnxDC,edsxDD,KAAA,IctxDC,edyxDD,KAAA,aczxDC,ed4xDD,KAAA,ac5xDC,ed+xDD,KAAA,Ic/xDC,edkyDD,KAAA,ac7xDC,edgyDD,KAAA,YcjxDC,edoxDD,KAAA,KcpxDC,kBduxDD,YAAA,KcvxDC,kBd0xDD,YAAA,ac1xDC,kBd6xDD,YAAA,ac7xDC,iBdgyDD,YAAA,IchyDC,iBdmyDD,YAAA,acnyDC,iBdsyDD,YAAA,actyDC,iBdyyDD,YAAA,IczyDC,iBd4yDD,YAAA,ac5yDC,iBd+yDD,YAAA,ac/yDC,iBdkzDD,YAAA,IclzDC,iBdqzDD,YAAA,acrzDC,iBdwzDD,YAAA,YY/yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udy1DD,MAAA,Kcz1DC,Wd41DD,MAAA,Kc51DC,Wd+1DD,MAAA,ac/1DC,Wdk2DD,MAAA,acl2DC,Udq2DD,MAAA,Icr2DC,Udw2DD,MAAA,acx2DC,Ud22DD,MAAA,ac32DC,Ud82DD,MAAA,Ic92DC,Udi3DD,MAAA,acj3DC,Udo3DD,MAAA,acp3DC,Udu3DD,MAAA,Icv3DC,Ud03DD,MAAA,ac32DC,Ud82DD,MAAA,Yc92DC,gBdi3DD,MAAA,Kcj3DC,gBdo3DD,MAAA,acp3DC,gBdu3DD,MAAA,acv3DC,ed03DD,MAAA,Ic13DC,ed63DD,MAAA,ac73DC,edg4DD,MAAA,ach4DC,edm4DD,MAAA,Icn4DC,eds4DD,MAAA,act4DC,edy4DD,MAAA,acz4DC,ed44DD,MAAA,Ic54DC,ed+4DD,MAAA,ac14DC,ed64DD,MAAA,Yc55DC,ed+5DD,MAAA,Kc/5DC,gBdk6DD,KAAA,Kcl6DC,gBdq6DD,KAAA,acr6DC,gBdw6DD,KAAA,acx6DC,ed26DD,KAAA,Ic36DC,ed86DD,KAAA,ac96DC,edi7DD,KAAA,acj7DC,edo7DD,KAAA,Icp7DC,edu7DD,KAAA,acv7DC,ed07DD,KAAA,ac17DC,ed67DD,KAAA,Ic77DC,edg8DD,KAAA,ac37DC,ed87DD,KAAA,Yc/6DC,edk7DD,KAAA,Kcl7DC,kBdq7DD,YAAA,Kcr7DC,kBdw7DD,YAAA,acx7DC,kBd27DD,YAAA,ac37DC,iBd87DD,YAAA,Ic97DC,iBdi8DD,YAAA,acj8DC,iBdo8DD,YAAA,acp8DC,iBdu8DD,YAAA,Icv8DC,iBd08DD,YAAA,ac18DC,iBd68DD,YAAA,ac78DC,iBdg9DD,YAAA,Ich9DC,iBdm9DD,YAAA,acn9DC,iBds9DD,YAAA,YY18DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udu/DD,MAAA,Kcv/DC,Wd0/DD,MAAA,Kc1/DC,Wd6/DD,MAAA,ac7/DC,WdggED,MAAA,achgEC,UdmgED,MAAA,IcngEC,UdsgED,MAAA,actgEC,UdygED,MAAA,aczgEC,Ud4gED,MAAA,Ic5gEC,Ud+gED,MAAA,ac/gEC,UdkhED,MAAA,aclhEC,UdqhED,MAAA,IcrhEC,UdwhED,MAAA,aczgEC,Ud4gED,MAAA,Yc5gEC,gBd+gED,MAAA,Kc/gEC,gBdkhED,MAAA,aclhEC,gBdqhED,MAAA,acrhEC,edwhED,MAAA,IcxhEC,ed2hED,MAAA,ac3hEC,ed8hED,MAAA,ac9hEC,ediiED,MAAA,IcjiEC,edoiED,MAAA,acpiEC,eduiED,MAAA,acviEC,ed0iED,MAAA,Ic1iEC,ed6iED,MAAA,acxiEC,ed2iED,MAAA,Yc1jEC,ed6jED,MAAA,Kc7jEC,gBdgkED,KAAA,KchkEC,gBdmkED,KAAA,acnkEC,gBdskED,KAAA,actkEC,edykED,KAAA,IczkEC,ed4kED,KAAA,ac5kEC,ed+kED,KAAA,ac/kEC,edklED,KAAA,IcllEC,edqlED,KAAA,acrlEC,edwlED,KAAA,acxlEC,ed2lED,KAAA,Ic3lEC,ed8lED,KAAA,aczlEC,ed4lED,KAAA,Yc7kEC,edglED,KAAA,KchlEC,kBdmlED,YAAA,KcnlEC,kBdslED,YAAA,actlEC,kBdylED,YAAA,aczlEC,iBd4lED,YAAA,Ic5lEC,iBd+lED,YAAA,ac/lEC,iBdkmED,YAAA,aclmEC,iBdqmED,YAAA,IcrmEC,iBdwmED,YAAA,acxmEC,iBd2mED,YAAA,ac3mEC,iBd8mED,YAAA,Ic9mEC,iBdinED,YAAA,acjnEC,iBdonED,YAAA,YevrED,iBACA,YAAA,GAGA,MACA,iBAAA,YAEA,Qf0rED,YAAA,IexrEC,eAAgB,IAChB,MAAA,Kf0rED,WAAA,KenrEC,GACA,WAAA,KfurED,OezrEC,MAAO,KdosEP,UAAW,KACX,cAAe,KcxrET,mBd2rER,mBc1rEQ,mBAHA,mBACA,mBd2rER,mBDHC,QAAA,IepsEC,YAAa,WAoBX,eAAA,IACA,WAAA,IAAA,MAAA,KArBJ,mBdmtEE,eAAgB,OAChB,cAAe,IAAI,MAAM,KDJ1B,uCCMD,uCcttEA,wCdutEA,wCcnrEI,2CANI,2CfqrEP,WAAA,Ee1qEG,mBf6qEH,WAAA,IAAA,MAAA,KCWD,cACE,iBAAkB,KchqEpB,6BdmqEA,6BclqEE,6BAZM,6BfuqEP,6BCMD,6BDHC,QAAA,ICWD,gBACE,OAAQ,IAAI,MAAM,Kc3qEpB,4Bd8qEA,4Bc9qEA,4BAQQ,4Bf+pEP,4BCMD,4Bc9pEM,OAAA,IAAA,MAAA,KAYF,4BAFJ,4BfqpEC,oBAAA,IexoEG,yCf2oEH,iBAAA,QejoEC,4BACA,iBAAA,QfqoED,uBe/nEG,SAAA,Od0oEF,QAAS,aczoEL,MAAA,KAEA,sBfkoEL,sBgB9wEC,SAAA,OfyxEA,QAAS,WACT,MAAO,KAST,0BetxEE,0BfgxEF,0BAGA,0BezxEM,0BAMJ,0BfixEF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCgBnyEC,sCAAA,oCf0yEF,sCevxEM,sCf4xEJ,iBAAkB,QASpB,2Be3yEE,2BfqyEF,2BAGA,2Be9yEM,2BAMJ,2BfsyEF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBxzEC,uCAAA,qCf+zEF,uCe5yEM,uCfizEJ,iBAAkB,QASpB,wBeh0EE,wBf0zEF,wBAGA,wBen0EM,wBAMJ,wBf2zEF,wBAGA,wBACA,wBDNC,wBCAD,wBAGA,wBASE,iBAAkB,QDLnB,oCgB70EC,oCAAA,kCfo1EF,oCej0EM,oCfs0EJ,iBAAkB,QASpB,2Ber1EE,2Bf+0EF,2BAGA,2Bex1EM,2BAMJ,2Bfg1EF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBl2EC,uCAAA,qCfy2EF,uCet1EM,uCf21EJ,iBAAkB,QASpB,0Be12EE,0Bfo2EF,0BAGA,0Be72EM,0BAMJ,0Bfq2EF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCejtEC,sCADF,oCdytEA,sCe32EM,sCDoJJ,iBAAA,QA6DF,kBACE,WAAY,KA3DV,WAAA,KAEA,oCACA,kBACA,MAAA,KfqtED,cAAA,Ke9pEC,WAAY,OAnDV,mBAAA,yBfotEH,OAAA,IAAA,MAAA,KCWD,yBACE,cAAe,Ec7qEjB,qCdgrEA,qCcltEI,qCARM,qCfmtET,qCCMD,qCDHC,YAAA,OCWD,kCACE,OAAQ,EcxrEV,0Dd2rEA,0Dc3rEA,0DAzBU,0Df6sET,0DCMD,0DAME,YAAa,EchsEf,yDdmsEA,yDcnsEA,yDArBU,yDfitET,yDCMD,yDAME,aAAc,EDLjB,yDe3sEW,yDEzNV,yDjBm6EC,yDiBl6ED,cAAA,GAMA,SjBm6ED,UAAA,EiBh6EC,QAAS,EACT,OAAA,EACA,OAAA,EAEA,OACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,KACA,UAAA,KjBk6ED,YAAA,QiB/5EC,MAAO,KACP,OAAA,EACA,cAAA,IAAA,MAAA,QAEA,MjBi6ED,QAAA,aiBt5EC,UAAW,Kb4BX,cAAA,IACG,YAAA,IJ83EJ,mBiBt5EC,mBAAoB,WhBi6EjB,gBAAiB,WgB/5EpB,WAAA,WjB05ED,qBiBx5EC,kBAGA,OAAQ,IAAI,EAAE,EACd,WAAA,MjBu5ED,YAAA,OiBl5EC,iBACA,QAAA,MAIF,kBhB45EE,QAAS,MgB15ET,MAAA,KAIF,iBAAA,ahB25EE,OAAQ,KIh+ER,uBL29ED,2BK19EC,wBY2EA,QAAS,KAAK,OACd,QAAA,IAAA,KAAA,yBACA,eAAA,KAEA,OACA,QAAA,MjBi5ED,YAAA,IiBv3EC,UAAW,KACX,YAAA,WACA,MAAA,KAEA,cACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KbxDA,iBAAA,KACQ,iBAAA,KAyHR,OAAA,IAAA,MAAA,KACK,cAAA,IACG,mBAAA,MAAA,EAAA,IAAA,IAAA,iBJ0zET,WAAA,MAAA,EAAA,IAAA,IAAA,iBkBl8EC,mBAAA,aAAA,YAAA,KAAA,mBAAA,YAAA,KACE,cAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KACA,WAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KdWM,oBJ27ET,aAAA,QI15EC,QAAA,EACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBAEF,gCAA0B,MAAA,KJ65E3B,QAAA,EI55EiC,oCJ+5EjC,MAAA,KiBl4EG,yCACA,MAAA,KAQF,0BhBw4EA,iBAAkB,YAClB,OAAQ,EgBr4EN,wBjB+3EH,wBiB53EC,iChBu4EA,iBAAkB,KgBr4EhB,QAAA,EAIF,wBACE,iCjB43EH,OAAA,YiB/2EC,sBjBk3ED,OAAA,KiBh2EG,mBhB42EF,mBAAoB,KAEtB,qDgB72EM,8BjBs2EH,8BiBn2EC,wCAAA,+BhB+2EA,YAAa,KgB72EX,iCjB22EH,iCiBx2EC,2CAAA,kChB42EF,0BACA,0BACA,oCACA,2BAKE,YAAa,KgBl3EX,iCjBg3EH,iCACF,2CiBt2EC,kChBy2EA,0BACA,0BACA,oCACA,2BgB32EA,YAAA,MhBm3EF,YgBz2EE,cAAA,KAGA,UADA,OjBm2ED,SAAA,SiBv2EC,QAAS,MhBk3ET,WAAY,KgB12EV,cAAA,KAGA,gBADA,aAEA,WAAA,KjBm2EH,aAAA,KiBh2EC,cAAe,EhB22Ef,YAAa,IACb,OAAQ,QgBt2ER,+BjBk2ED,sCiBp2EC,yBACA,gCAIA,SAAU,ShB02EV,WAAY,MgBx2EZ,YAAA,MAIF,oBAAA,cAEE,WAAA,KAGA,iBADA,cAEA,SAAA,SACA,QAAA,aACA,aAAA,KjB+1ED,cAAA,EiB71EC,YAAa,IhBw2Eb,eAAgB,OgBt2EhB,OAAA,QAUA,kCjBs1ED,4BCWC,WAAY,EACZ,YAAa,KgBz1Eb,wCAAA,qCjBq1ED,8BCOD,+BgBl2EI,2BhBi2EJ,4BAME,OAAQ,YDNT,0BiBz1EG,uBAMF,oCAAA,iChB+1EA,OAAQ,YDNT,yBiBt1EK,sBAaJ,mCAFF,gCAGE,OAAA,YAGA,qBjB20ED,WAAA,KiBz0EC,YAAA,IhBo1EA,eAAgB,IgBl1Ed,cAAA,EjB40EH,8BiB9zED,8BCnQE,cAAA,EACA,aAAA,EAEA,UACA,OAAA,KlBokFD,QAAA,IAAA,KkBlkFC,UAAA,KACE,YAAA,IACA,cAAA,IAGF,gBjB4kFA,OAAQ,KiB1kFN,YAAA,KD2PA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjB20EH,QAAA,IAAA,KiBj1EC,UAAW,KAST,YAAA,IACA,cAAA,IAVJ,mChBg2EE,OAAQ,KgBl1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjB20EH,WAAA,KiBv0EC,QAAS,IAAI,KC/Rb,UAAA,KACA,YAAA,IAEA,UACA,OAAA,KlBymFD,QAAA,KAAA,KkBvmFC,UAAA,KACE,YAAA,UACA,cAAA,IAGF,gBjBinFA,OAAQ,KiB/mFN,YAAA,KDuRA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBo1EH,QAAA,KAAA,KiB11EC,UAAW,KAST,YAAA,UACA,cAAA,IAVJ,mChBy2EE,OAAQ,KgB31EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBo1EH,WAAA,KiB30EC,QAAS,KAAK,KAEd,UAAA,KjB40ED,YAAA,UiBx0EG,cjB20EH,SAAA,SiBt0EC,4BACA,cAAA,OAEA,uBACA,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,MACA,MAAA,KjBy0ED,OAAA,KiBv0EC,YAAa,KhBk1Eb,WAAY,OACZ,eAAgB,KDLjB,oDiBz0EC,uCADA,iCAGA,MAAO,KhBk1EP,OAAQ,KACR,YAAa,KDLd,oDiBz0EC,uCADA,iCAKA,MAAO,KhBg1EP,OAAQ,KACR,YAAa,KAKf,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBvuFG,mCAJA,yBD0ZJ,gCbvWE,MAAA,QJ6rFD,2BkB1uFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJksFD,iCiB31EC,aAAc,QC5YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlB2uFH,gCiBh2EC,MAAO,QCtYL,iBAAA,QlByuFH,aAAA,QCWD,oCACE,MAAO,QAKT,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBrwFG,mCAJA,yBD6ZJ,gCb1WE,MAAA,QJ2tFD,2BkBxwFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJguFD,iCiBt3EC,aAAc,QC/YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBywFH,gCiB33EC,MAAO,QCzYL,iBAAA,QlBuwFH,aAAA,QCWD,oCACE,MAAO,QAKT,qBAEA,4BAJA,0BADA,uBAEA,kBAEA,yBDNC,0BkBnyFG,iCAJA,uBDgaJ,8Bb7WE,MAAA,QJyvFD,yBkBtyFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ8vFD,+BiBj5EC,aAAc,QClZZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBuyFH,8BiBt5EC,MAAO,QC5YL,iBAAA,QlBqyFH,aAAA,QiBj5EG,kCjBo5EH,MAAA,QiBj5EG,2CjBo5EH,IAAA,KiBz4EC,mDACA,IAAA,EAEA,YjB44ED,QAAA,MiBzzEC,WAAY,IAwEZ,cAAe,KAtIX,MAAA,QAEA,yBjB23EH,yBiBvvEC,QAAS,aA/HP,cAAA,EACA,eAAA,OjB03EH,2BiB5vEC,QAAS,aAxHP,MAAA,KjBu3EH,eAAA,OiBn3EG,kCACA,QAAA,aAmHJ,0BhB8wEE,QAAS,aACT,eAAgB,OgBv3Ed,wCjBg3EH,6CiBxwED,2CjB2wEC,MAAA,KiB/2EG,wCACA,MAAA,KAmGJ,4BhB0xEE,cAAe,EgBt3Eb,eAAA,OAGA,uBADA,oBjBg3EH,QAAA,aiBtxEC,WAAY,EhBiyEZ,cAAe,EgBv3EX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB+xEC,sCiB12EG,SAAA,SjB62EH,YAAA,EiBl2ED,kDhB82EE,IAAK,GgBp2EL,2BjBi2EH,kCiBl2EG,wBAEA,+BAXF,YAAa,IhBs3Eb,WAAY,EgBr2EV,cAAA,EJviBF,2BIshBF,wBJrhBE,WAAA,KI4jBA,6BAyBA,aAAc,MAnCV,YAAA,MAEA,yBjB01EH,gCACF,YAAA,IiB13EG,cAAe,EAwCf,WAAA,OAwBJ,sDAdQ,MAAA,KjBg1EL,yBACF,+CiBr0EC,YAAA,KAEE,UAAW,MjBw0EZ,yBACF,+CmBt6FG,YAAa,IACf,UAAA,MAGA,KACA,QAAA,aACA,QAAA,IAAA,KAAA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,WACA,WAAA,OC0CA,YAAA,OACA,eAAA,OACA,iBAAA,aACA,aAAA,ahB+JA,OAAA,QACG,oBAAA,KACC,iBAAA,KACI,gBAAA,KJiuFT,YAAA,KmBz6FG,iBAAA,KlBq7FF,OAAQ,IAAI,MAAM,YAClB,cAAe,IDHhB,kBKx8FC,kBAEA,WACA,kBJ28FF,kBADA,WkBl7FE,QAAA,KAAA,OlBy7FA,QAAS,IAAI,KAAK,yBAClB,eAAgB,KkBn7FhB,WnB46FD,WmB/6FG,WlB27FF,MAAO,KkBt7FL,gBAAA,Kf6BM,YADR,YJq5FD,iBAAA,KmB56FC,QAAA,ElBw7FA,mBAAoB,MAAM,EAAE,IAAI,IAAI,iBAC5B,WAAY,MAAM,EAAE,IAAI,IAAI,iBoBn+FpC,cAGA,ejB8DA,wBACQ,OAAA,YJ65FT,OAAA,kBmB56FG,mBAAA,KlBw7FM,WAAY,KkBt7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBo+FD,aoBj+FC,MAAA,KnB6+FA,iBAAkB,KmB3+FhB,aAAA,KpBq+FH,mBoBn+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBo+FH,mBoBj+FC,MAAA,KnB6+FA,iBAAkB,QAClB,aAAc,QmBz+FR,oBADJ,oBpBo+FH,mCoBj+FG,MAAA,KnB6+FF,iBAAkB,QAClB,aAAc,QmBz+FN,0BnB++FV,0BAHA,0BmB7+FM,0BnB++FN,0BAHA,0BDFC,yCoB3+FK,yCnB++FN,yCmB1+FE,MAAA,KnBk/FA,iBAAkB,QAClB,aAAc,QmB3+FZ,oBpBm+FH,oBoBn+FG,mCnBg/FF,iBAAkB,KmB5+FV,4BnBi/FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB99FA,sCClBM,sCnBi/FN,sCmB3+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB6hGD,aoB1hGC,MAAA,KnBsiGA,iBAAkB,QmBpiGhB,aAAA,QpB8hGH,mBoB5hGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB6hGH,mBoB1hGC,MAAA,KnBsiGA,iBAAkB,QAClB,aAAc,QmBliGR,oBADJ,oBpB6hGH,mCoB1hGG,MAAA,KnBsiGF,iBAAkB,QAClB,aAAc,QmBliGN,0BnBwiGV,0BAHA,0BmBtiGM,0BnBwiGN,0BAHA,0BDFC,yCoBpiGK,yCnBwiGN,yCmBniGE,MAAA,KnB2iGA,iBAAkB,QAClB,aAAc,QmBpiGZ,oBpB4hGH,oBoB5hGG,mCnByiGF,iBAAkB,KmBriGV,4BnB0iGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBphGA,sCCrBM,sCnB0iGN,sCmBpiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBslGD,aoBnlGC,MAAA,KnB+lGA,iBAAkB,QmB7lGhB,aAAA,QpBulGH,mBoBrlGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBslGH,mBoBnlGC,MAAA,KnB+lGA,iBAAkB,QAClB,aAAc,QmB3lGR,oBADJ,oBpBslGH,mCoBnlGG,MAAA,KnB+lGF,iBAAkB,QAClB,aAAc,QmB3lGN,0BnBimGV,0BAHA,0BmB/lGM,0BnBimGN,0BAHA,0BDFC,yCoB7lGK,yCnBimGN,yCmB5lGE,MAAA,KnBomGA,iBAAkB,QAClB,aAAc,QmB7lGZ,oBpBqlGH,oBoBrlGG,mCnBkmGF,iBAAkB,KmB9lGV,4BnBmmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBzkGA,sCCzBM,sCnBmmGN,sCmB7lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB+oGD,UoB5oGC,MAAA,KnBwpGA,iBAAkB,QmBtpGhB,aAAA,QpBgpGH,gBoB9oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB+oGH,gBoB5oGC,MAAA,KnBwpGA,iBAAkB,QAClB,aAAc,QmBppGR,iBADJ,iBpB+oGH,gCoB5oGG,MAAA,KnBwpGF,iBAAkB,QAClB,aAAc,QmBppGN,uBnB0pGV,uBAHA,uBmBxpGM,uBnB0pGN,uBAHA,uBDFC,sCoBtpGK,sCnB0pGN,sCmBrpGE,MAAA,KnB6pGA,iBAAkB,QAClB,aAAc,QmBtpGZ,iBpB8oGH,iBoB9oGG,gCnB2pGF,iBAAkB,KmBvpGV,yBnB4pGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB9nGA,mCC7BM,mCnB4pGN,mCmBtpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBwsGD,aoBrsGC,MAAA,KnBitGA,iBAAkB,QmB/sGhB,aAAA,QpBysGH,mBoBvsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBwsGH,mBoBrsGC,MAAA,KnBitGA,iBAAkB,QAClB,aAAc,QmB7sGR,oBADJ,oBpBwsGH,mCoBrsGG,MAAA,KnBitGF,iBAAkB,QAClB,aAAc,QmB7sGN,0BnBmtGV,0BAHA,0BmBjtGM,0BnBmtGN,0BAHA,0BDFC,yCoB/sGK,yCnBmtGN,yCmB9sGE,MAAA,KnBstGA,iBAAkB,QAClB,aAAc,QmB/sGZ,oBpBusGH,oBoBvsGG,mCnBotGF,iBAAkB,KmBhtGV,4BnBqtGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBnrGA,sCCjCM,sCnBqtGN,sCmB/sGI,iBAAA,QACA,aAAA,QD8BJ,oBC9EE,MAAA,QACA,iBAAA,KpBiwGD,YoB9vGC,MAAA,KnB0wGA,iBAAkB,QmBxwGhB,aAAA,QpBkwGH,kBoBhwGO,kBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBiwGH,kBoB9vGC,MAAA,KnB0wGA,iBAAkB,QAClB,aAAc,QmBtwGR,mBADJ,mBpBiwGH,kCoB9vGG,MAAA,KnB0wGF,iBAAkB,QAClB,aAAc,QmBtwGN,yBnB4wGV,yBAHA,yBmB1wGM,yBnB4wGN,yBAHA,yBDFC,wCoBxwGK,wCnB4wGN,wCmBvwGE,MAAA,KnB+wGA,iBAAkB,QAClB,aAAc,QmBxwGZ,mBpBgwGH,mBoBhwGG,kCnB6wGF,iBAAkB,KmBzwGV,2BnB8wGV,2BAHA,2BDHC,4BCOD,4BAHA,4BkBxuGA,qCCrCM,qCnB8wGN,qCmBxwGI,iBAAA,QACA,aAAA,QDuCJ,mBACE,MAAA,QACA,iBAAA,KnBkuGD,UmB/tGC,YAAA,IlB2uGA,MAAO,QACP,cAAe,EAEjB,UG5wGE,iBemCE,iBflCM,oBJqwGT,6BmBhuGC,iBAAA,YlB4uGA,mBAAoB,KACZ,WAAY,KkBzuGlB,UAEF,iBAAA,gBnBguGD,gBmB9tGG,aAAA,YnBouGH,gBmBluGG,gBAIA,MAAA,QlB0uGF,gBAAiB,UACjB,iBAAkB,YDNnB,0BmBnuGK,0BAUN,mCATM,mClB8uGJ,MAAO,KmB7yGP,gBAAA,KAGA,mBADA,QpBsyGD,QAAA,KAAA,KmB5tGC,UAAW,KlBwuGX,YAAa,UmBpzGb,cAAA,IAGA,mBADA,QpB6yGD,QAAA,IAAA,KmB/tGC,UAAW,KlB2uGX,YAAa,ImB3zGb,cAAA,IAGA,mBADA,QpBozGD,QAAA,IAAA,ImB9tGC,UAAW,KACX,YAAA,IACA,cAAA,IAIF,WACE,QAAA,MnB8tGD,MAAA,KCYD,sBACE,WAAY,IqB53GZ,6BADF,4BtBq3GC,6BIhsGC,MAAA,KAEQ,MJosGT,QAAA,EsBx3GC,mBAAA,QAAA,KAAA,OACE,cAAA,QAAA,KAAA,OtB03GH,WAAA,QAAA,KAAA,OsBr3GC,StBw3GD,QAAA,EsBt3Ga,UtBy3Gb,QAAA,KsBx3Ga,atB23Gb,QAAA,MsB13Ga,etB63Gb,QAAA,UsBz3GC,kBACA,QAAA,gBlBwKA,YACQ,SAAA,SAAA,OAAA,EAOR,SAAA,OACQ,mCAAA,KAAA,8BAAA,KAGR,2BAAA,KACQ,4BAAA,KAAA,uBAAA,KJ8sGT,oBAAA,KuBx5GC,4BAA6B,OAAQ,WACrC,uBAAA,OAAA,WACA,oBAAA,OAAA,WAEA,OACA,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OvB05GD,WAAA,IAAA,OuBt5GC,WAAY,IAAI,QtBq6GhB,aAAc,IAAI,MAAM,YsBn6GxB,YAAA,IAAA,MAAA,YAKA,UADF,QvBu5GC,SAAA,SuBj5GC,uBACA,QAAA,EAEA,eACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KnBsBA,iBAAA,KACQ,wBAAA,YmBrBR,gBAAA,YtBk6GA,OsBl6GA,IAAA,MAAA,KvBq5GD,OAAA,IAAA,MAAA,gBuBh5GC,cAAA,IACE,mBAAA,EAAA,IAAA,KAAA,iBACA,WAAA,EAAA,IAAA,KAAA,iBAzBJ,0BCzBE,MAAA,EACA,KAAA,KAEA,wBxBu8GD,OAAA,IuBj7GC,OAAQ,IAAI,EAmCV,SAAA,OACA,iBAAA,QAEA,oBACA,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KvBi5GH,YAAA,IuB34GC,YAAA,WtB25GA,MAAO,KsBz5GL,YAAA,OvB+4GH,0BuB74GG,0BAMF,MAAA,QtBu5GA,gBAAiB,KACjB,iBAAkB,QsBp5GhB,yBAEA,+BADA,+BvB04GH,MAAA,KuBh4GC,gBAAA,KtBg5GA,iBAAkB,QAClB,QAAS,EDZV,2BuB93GC,iCAAA,iCAEE,MAAA,KEzGF,iCF2GE,iCAEA,gBAAA,KvBg4GH,OAAA,YuB33GC,iBAAkB,YAGhB,iBAAA,KvB23GH,OAAA,0DuBt3GG,qBvBy3GH,QAAA,MuBh3GC,QACA,QAAA,EAQF,qBACE,MAAA,EACA,KAAA,KAIF,oBACE,MAAA,KACA,KAAA,EAEA,iBACA,QAAA,MACA,QAAA,IAAA,KvB22GD,UAAA,KuBv2GC,YAAa,WACb,MAAA,KACA,YAAA,OAEA,mBACA,SAAA,MACA,IAAA,EvBy2GD,MAAA,EuBr2GC,OAAQ,EACR,KAAA,EACA,QAAA,IAQF,2BtB+2GE,MAAO,EsB32GL,KAAA,KAEA,eACA,sCvB+1GH,QAAA,GuBt2GC,WAAY,EtBs3GZ,cAAe,IAAI,OsB32GjB,cAAA,IAAA,QAEA,uBvB+1GH,8CuB10GC,IAAK,KAXL,OAAA,KApEA,cAAA,IvB85GC,yBuB11GD,6BA1DA,MAAA,EACA,KAAA,KvBw5GD,kC0BviHG,MAAO,KzBujHP,KAAM,GyBnjHR,W1ByiHD,oB0B7iHC,SAAU,SzB6jHV,QAAS,ayBvjHP,eAAA,OAGA,yB1ByiHH,gBCgBC,SAAU,SACV,MAAO,KyBhjHT,gC1ByiHC,gCCYD,+BAFA,+ByBnjHA,uBANM,uBzB0jHN,sBAFA,sBAQE,QAAS,EyBrjHP,qB1B0iHH,2B0BriHD,2BACE,iC1BuiHD,YAAA,KCgBD,aACE,YAAa,KDZd,kB0B7iHD,wBAAA,0BzB8jHE,MAAO,KDZR,kB0BliHD,wBACE,0B1BoiHD,YAAA,I0B/hHC,yE1BkiHD,cAAA,E2BnlHC,4BACG,YAAA,EDsDL,mEzBgjHE,wBAAyB,E0B/lHzB,2BAAA,E3BolHD,6C0B/hHD,8CACE,uBAAA,E1BiiHD,0BAAA,E0B9hHC,sB1BiiHD,MAAA,KCgBD,8D0BlnHE,cAAA,E3BumHD,mE0B9hHD,oECjEE,wBAAA,EACG,2BAAA,EDqEL,oEzB6iHE,uBAAwB,EyB3iHxB,0BAAA,EAiBF,mCACE,iCACA,QAAA,EAEF,iCACE,cAAA,IACA,aAAA,IAKF,oCtB/CE,cAAA,KACQ,aAAA,KsBkDR,iCtBnDA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsByDV,0CACE,mBAAA,K1B0gHD,WAAA,K0BtgHC,YACA,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,E1BwgHD,oBAAA,ECgBD,uBACE,aAAc,EAAE,IAAI,IyB7gHlB,yBACA,+BACA,oC1BkgHH,QAAA,M0BzgHC,MAAO,KAcH,MAAA,K1B8/GL,UAAA,KCgBD,oCACE,MAAO,KyBvgHL,8BACA,oC1B4/GH,oC0Bv/GC,0CACE,WAAA,K1By/GH,YAAA,E2BlqHC,4DACC,cAAA,EAQA,sD3B+pHF,uBAAA,I0Bz/GC,wBAAA,IC/KA,2BAAA,EACC,0BAAA,EAQA,sD3BqqHF,uBAAA,E0B1/GC,wBAAyB,EACzB,2BAAA,I1B4/GD,0BAAA,ICgBD,uE0BzrHE,cAAA,E3B8qHD,4E0Bz/GD,6EC7LE,2BAAA,EACC,0BAAA,EDoMH,6EACE,uBAAA,EACA,wBAAA,EAEA,qB1Bu/GD,QAAA,M0B3/GC,MAAO,KzB2gHP,aAAc,MyBpgHZ,gBAAA,SAEA,0B1Bw/GH,gC0BjgHC,QAAS,WAYP,MAAA,K1Bw/GH,MAAA,G0Bp/GG,qC1Bu/GH,MAAA,KCgBD,+CACE,KAAM,KyBh/GF,gDAFA,6C1By+GL,2D0Bx+GK,wDEzOJ,SAAU,SACV,KAAA,cACA,eAAA,K5BotHD,a4BhtHC,SAAA,SACE,QAAA,MACA,gBAAA,S5BmtHH,0B4B3tHC,MAAO,KAeL,cAAA,EACA,aAAA,EAOA,2BACA,SAAA,S5B0sHH,QAAA,E4BxsHG,MAAA,KACE,MAAA,K5B0sHL,cAAA,ECgBD,iCACE,QAAS,EiBtrHT,8BACA,mCACA,sCACA,OAAA,KlB2qHD,QAAA,KAAA,KkBzqHC,UAAA,KjByrHA,YAAa,UACb,cAAe,IiBxrHb,oClB6qHH,yCkB1qHC,4CjB0rHA,OAAQ,KACR,YAAa,KDTd,8C4BltHD,mDAAA,sD3B6tHA,sCACA,2CiB5rHI,8CjBisHF,OAAQ,KiB7sHR,8BACA,mCACA,sCACA,OAAA,KlBksHD,QAAA,IAAA,KkBhsHC,UAAA,KjBgtHA,YAAa,IACb,cAAe,IiB/sHb,oClBosHH,yCkBjsHC,4CjBitHA,OAAQ,KACR,YAAa,KDTd,8C4BhuHD,mDAAA,sD3B2uHA,sCACA,2CiBntHI,8CjBwtHF,OAAQ,K2B5uHR,2B5BguHD,mB4BhuHC,iB3BivHA,QAAS,W2B5uHX,8D5BguHC,sD4BhuHD,oDAEE,cAAA,EAEA,mB5BkuHD,iB4B7tHC,MAAO,GACP,YAAA,OACA,eAAA,OAEA,mBACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,K5B+tHD,WAAA,O4B5tHC,iBAAA,KACE,OAAA,IAAA,MAAA,KACA,cAAA,I5B+tHH,4B4B5tHC,QAAA,IAAA,KACE,UAAA,KACA,cAAA,I5B+tHH,4B4BlvHC,QAAS,KAAK,K3BkwHd,UAAW,K2BxuHT,cAAA,IAKJ,wCAAA,qC3BwuHE,WAAY,EAEd,uCACA,+BACA,kC0Bh1HE,6CACG,8CC4GL,6D5BwtHC,wE4BvtHC,wBAAA,E5B0tHD,2BAAA,ECgBD,+BACE,aAAc,EAEhB,sCACA,8B2BnuHA,+D5BytHC,oDCWD,iC0Br1HE,4CACG,6CCiHH,uBAAA,E5B2tHD,0BAAA,E4BrtHC,8BAGA,YAAA,E5ButHD,iB4B3tHC,SAAU,SAUR,UAAA,E5BotHH,YAAA,O4BltHK,sB5BqtHL,SAAA,SCgBD,2BACE,YAAa,K2B3tHb,6BAAA,4B5B+sHD,4B4B5sHK,QAAA,EAGJ,kCAAA,wCAGI,aAAA,K5B+sHL,iC6B72HD,uCACE,QAAA,EACA,YAAA,K7Bg3HD,K6Bl3HC,aAAc,EAOZ,cAAA,EACA,WAAA,KARJ,QAWM,SAAA,SACA,QAAA,M7B+2HL,U6B72HK,SAAA,S5B63HJ,QAAS,M4B33HH,QAAA,KAAA,KAMJ,gB7B02HH,gB6Bz2HK,gBAAA,K7B42HL,iBAAA,KCgBD,mB4Bx3HQ,MAAA,KAGA,yBADA,yB7B62HP,MAAA,K6Br2HG,gBAAA,K5Bq3HF,OAAQ,YACR,iBAAkB,Y4Bl3Hd,aAzCN,mB7Bg5HC,mBwBn5HC,iBAAA,KACA,aAAA,QAEA,kBxBs5HD,OAAA,I6Bt5HC,OAAQ,IAAI,EA0DV,SAAA,O7B+1HH,iBAAA,Q6Br1HC,c7Bw1HD,UAAA,K6Bt1HG,UAEA,cAAA,IAAA,MAAA,KALJ,aASM,MAAA,KACA,cAAA,KAEA,e7Bu1HL,aAAA,I6Bt1HK,YAAA,WACE,OAAA,IAAA,MAAA,Y7Bw1HP,cAAA,IAAA,IAAA,EAAA,ECgBD,qBACE,aAAc,KAAK,KAAK,K4B/1HlB,sBAEA,4BADA,4BAEA,MAAA,K7Bo1HP,OAAA,Q6B/0HC,iBAAA,KAqDA,OAAA,IAAA,MAAA,KA8BA,oBAAA,YAnFA,wBAwDE,MAAA,K7B8xHH,cAAA,E6B5xHK,2BACA,MAAA,KA3DJ,6BAgEE,cAAA,IACA,WAAA,OAYJ,iDA0DE,IAAK,KAjED,KAAA,K7B6xHH,yB6B5tHD,2BA9DM,QAAA,W7B6xHL,MAAA,G6Bt2HD,6BAuFE,cAAA,GAvFF,6B5B23HA,aAAc,EACd,cAAe,IDZhB,kC6BzuHD,wCA3BA,wCATM,OAAA,IAAA,MAAA,K7BkxHH,yB6B9uHD,6B5B8vHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,kC6Bj3HD,wC7Bk3HD,wC6Bh3HG,oBAAA,MAIE,c7Bk3HL,MAAA,K6B/2HK,gB7Bk3HL,cAAA,ICgBD,iBACE,YAAa,I4B13HP,uBAQR,6B7Bu2HC,6B6Br2HG,MAAA,K7Bw2HH,iBAAA,Q6Bt2HK,gBACA,MAAA,KAYN,mBACE,WAAA,I7B+1HD,YAAA,E6B51HG,e7B+1HH,MAAA,K6B71HK,kBACA,MAAA,KAPN,oBAYI,cAAA,IACA,WAAA,OAYJ,wCA0DE,IAAK,KAjED,KAAA,K7B81HH,yB6B7xHD,kBA9DM,QAAA,W7B81HL,MAAA,G6Br1HD,oBACA,cAAA,GAIE,oBACA,cAAA,EANJ,yB5B62HE,aAAc,EACd,cAAe,IDZhB,8B6B7yHD,oCA3BA,oCATM,OAAA,IAAA,MAAA,K7Bs1HH,yB6BlzHD,yB5Bk0HE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,8B6B30HD,oC7B40HD,oC6B10HG,oBAAA,MAGA,uB7B60HH,QAAA,K6Bl0HC,qBF3OA,QAAA,M3BkjID,yB8B3iIC,WAAY,KACZ,uBAAA,EACA,wBAAA,EAEA,Q9B6iID,SAAA,S8BriIC,WAAY,KA8nBZ,cAAe,KAhoBb,OAAA,IAAA,MAAA,Y9B4iIH,yB8B5hIC,QAgnBE,cAAe,K9Bi7GlB,yB8BphIC,eACA,MAAA,MAGA,iBACA,cAAA,KAAA,aAAA,KAEA,WAAA,Q9BqhID,2BAAA,M8BnhIC,WAAA,IAAA,MAAA,YACE,mBAAA,MAAA,EAAA,IAAA,EAAA,qB9BqhIH,WAAA,MAAA,EAAA,IAAA,EAAA,qB8B57GD,oBArlBI,WAAA,KAEA,yBAAA,iB9BqhID,MAAA,K8BnhIC,WAAA,EACE,mBAAA,KACA,WAAA,KAEA,0B9BqhIH,QAAA,gB8BlhIC,OAAA,eACE,eAAA,E9BohIH,SAAA,kBCkBD,oBACE,WAAY,QDZf,sC8BlhIK,mC9BihIH,oC8B5gIC,cAAe,E7B+hIf,aAAc,G6Bp+GlB,sCAnjBE,mC7B4hIA,WAAY,MDdX,4D8BtgID,sC9BugID,mCCkBG,WAAY,O6B9gId,kCANE,gC9BygIH,4B8B1gIG,0BAuiBF,aAAc,M7Bs/Gd,YAAa,MAEf,yBDZC,kC8B9gIK,gC9B6gIH,4B8B9gIG,0BAcF,aAAc,EAChB,YAAA,GAMF,mBA8gBE,QAAS,KAhhBP,aAAA,EAAA,EAAA,I9BqgIH,yB8BhgIC,mB7BkhIE,cAAe,G6B7gIjB,qBADA,kB9BmgID,SAAA,M8B5/HC,MAAO,EAggBP,KAAM,E7B+gHN,QAAS,KDdR,yB8BhgID,qB9BigID,kB8BhgIC,cAAA,GAGF,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,I9BogID,qB8B7/HC,OAAQ,EACR,cAAA,EACA,aAAA,IAAA,EAAA,EAEA,cACA,MAAA,K9B+/HD,OAAA,K8B7/HC,QAAA,KAAA,K7B+gIA,UAAW,K6B7gIT,YAAA,KAIA,oBAbJ,oB9B2gIC,gBAAA,K8B1/HG,kB7B6gIF,QAAS,MDdR,yBACF,iC8Bn/HC,uCACA,YAAA,OAGA,eC9LA,SAAA,SACA,MAAA,MD+LA,QAAA,IAAA,KACA,WAAA,IACA,aAAA,KACA,cAAA,I9Bs/HD,iBAAA,Y8Bl/HC,iBAAA,KACE,OAAA,IAAA,MAAA,Y9Bo/HH,cAAA,I8B/+HG,qBACA,QAAA,EAEA,yB9Bk/HH,QAAA,M8BxgIC,MAAO,KAyBL,OAAA,I9Bk/HH,cAAA,I8BvjHD,mCAvbI,WAAA,I9Bm/HH,yB8Bz+HC,eACA,QAAA,MAGE,YACA,OAAA,MAAA,M9B4+HH,iB8B/8HC,YAAA,KA2YA,eAAgB,KAjaZ,YAAA,KAEA,yBACA,iCACA,SAAA,OACA,MAAA,KACA,MAAA,KAAA,WAAA,E9By+HH,iBAAA,Y8B9kHC,OAAQ,E7BimHR,mBAAoB,K6Bz/HhB,WAAA,KAGA,kDAqZN,sC9BqlHC,QAAA,IAAA,KAAA,IAAA,KCmBD,sC6B1/HQ,YAAA,KAmBR,4C9By9HD,4C8B1lHG,iBAAkB,M9B+lHnB,yB8B/lHD,YAtYI,MAAA,K9Bw+HH,OAAA,E8Bt+HK,eACA,MAAA,K9B0+HP,iB8B99HG,YAAa,KACf,eAAA,MAGA,aACA,QAAA,KAAA,K1B9NA,WAAA,IACQ,aAAA,M2B/DR,cAAA,IACA,YAAA,M/B+vID,WAAA,IAAA,MAAA,YiBzuHC,cAAe,IAAI,MAAM,YAwEzB,mBAAoB,MAAM,EAAE,IAAI,EAAE,qBAAyB,EAAE,IAAI,EAAE,qBAtI/D,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,qBAEA,yBjB2yHH,yBiBvqHC,QAAS,aA/HP,cAAA,EACA,eAAA,OjB0yHH,2BiB5qHC,QAAS,aAxHP,MAAA,KjBuyHH,eAAA,OiBnyHG,kCACA,QAAA,aAmHJ,0BhBssHE,QAAS,aACT,eAAgB,OgB/yHd,wCjBgyHH,6CiBxrHD,2CjB2rHC,MAAA,KiB/xHG,wCACA,MAAA,KAmGJ,4BhBktHE,cAAe,EgB9yHb,eAAA,OAGA,uBADA,oBjBgyHH,QAAA,aiBtsHC,WAAY,EhBytHZ,cAAe,EgB/yHX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB+sHC,sCiB1xHG,SAAA,SjB6xHH,YAAA,E8BtgID,kDAmWE,IAAK,GAvWH,yBACE,yB9BihIL,cAAA,I8B//HD,oCAoVE,cAAe,GA1Vf,yBACA,aACA,MAAA,KACA,YAAA,E1BzPF,eAAA,EACQ,aAAA,EJswIP,YAAA,EACF,OAAA,E8BtgIG,mBAAoB,KACtB,WAAA,M9B0gID,8B8BtgIC,WAAY,EACZ,uBAAA,EHzUA,wBAAA,EAQA,mDACC,cAAA,E3B40IF,uBAAA,I8BlgIC,wBAAyB,IChVzB,2BAAA,EACA,0BAAA,EDkVA,YCnVA,WAAA,IACA,cAAA,IDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,mBChWE,WAAA,KACA,cAAA,KDuWF,aAsSE,WAAY,KA1SV,cAAA,KAEA,yB9BkgID,aACF,MAAA,K8Br+HG,aAAc,KAhBhB,YAAA,MACA,yBE5WA,aF8WE,MAAA,eAFF,cAKI,MAAA,gB9B0/HH,aAAA,M8Bh/HD,4BACA,aAAA,GADF,gBAKI,iBAAA,Q9Bm/HH,aAAA,QCmBD,8B6BngIM,MAAA,KARN,oC9B6/HC,oC8B/+HG,MAAA,Q9Bk/HH,iBAAA,Y8B7+HK,6B9Bg/HL,MAAA,KCmBD,iC6B//HQ,MAAA,KAKF,uC9B4+HL,uCCmBC,MAAO,KACP,iBAAkB,Y6B5/HZ,sCAIF,4C9B0+HL,4CCmBC,MAAO,KACP,iBAAkB,Q6B1/HZ,wCAxCR,8C9BohIC,8C8Bt+HG,MAAA,K9By+HH,iBAAA,YCmBD,+B6Bz/HM,aAAA,KAGA,qCApDN,qC9B8hIC,iBAAA,KCmBD,yC6Bv/HI,iBAAA,KAOE,iCAAA,6B7Bq/HJ,aAAc,Q6Bj/HR,oCAiCN,0C9Bk8HD,0C8B9xHC,MAAO,KA7LC,iBAAA,QACA,yB7Bi/HR,sD6B/+HU,MAAA,KAKF,4D9B49HP,4DCmBC,MAAO,KACP,iBAAkB,Y6B5+HV,2DAIF,iE9B09HP,iECmBC,MAAO,KACP,iBAAkB,Q6B1+HV,6D9B69HX,mEADE,mE8B7jIC,MAAO,KA8GP,iBAAA,aAEE,6B9Bo9HL,MAAA,K8B/8HG,mC9Bk9HH,MAAA,KCmBD,0B6Bl+HM,MAAA,KAIA,gCAAA,gC7Bm+HJ,MAAO,K6Bz9HT,0CARQ,0CASN,mD9B08HD,mD8Bz8HC,MAAA,KAFF,gBAKI,iBAAA,K9B68HH,aAAA,QCmBD,8B6B79HM,MAAA,QARN,oC9Bu9HC,oC8Bz8HG,MAAA,K9B48HH,iBAAA,Y8Bv8HK,6B9B08HL,MAAA,QCmBD,iC6Bz9HQ,MAAA,QAKF,uC9Bs8HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bt9HZ,sCAIF,4C9Bo8HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bp9HZ,wCAxCR,8C9B8+HC,8C8B/7HG,MAAA,K9Bk8HH,iBAAA,YCmBD,+B6Bl9HM,aAAA,KAGA,qCArDN,qC9Bw/HC,iBAAA,KCmBD,yC6Bh9HI,iBAAA,KAME,iCAAA,6B7B+8HJ,aAAc,Q6B38HR,oCAuCN,0C9Bs5HD,0C8B93HC,MAAO,KAvDC,iBAAA,QAuDV,yBApDU,kE9By7HP,aAAA,Q8Bt7HO,0D9By7HP,iBAAA,QCmBD,sD6Bz8HU,MAAA,QAKF,4D9Bs7HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bt8HV,2DAIF,iE9Bo7HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bp8HV,6D9Bu7HX,mEADE,mE8B7hIC,MAAO,KA+GP,iBAAA,aAEE,6B9Bm7HL,MAAA,Q8B96HG,mC9Bi7HH,MAAA,KCmBD,0B6Bj8HM,MAAA,QAIA,gCAAA,gC7Bk8HJ,MAAO,KgC1kJT,0CH0oBQ,0CGzoBN,mDjC2jJD,mDiC1jJC,MAAA,KAEA,YACA,QAAA,IAAA,KjC8jJD,cAAA,KiCnkJC,WAAY,KAQV,iBAAA,QjC8jJH,cAAA,IiC3jJK,eACA,QAAA,ajC+jJL,yBiC3kJC,QAAS,EAAE,IAkBT,MAAA,KjC4jJH,QAAA,SkC/kJC,oBACA,MAAA,KAEA,YlCklJD,QAAA,akCtlJC,aAAc,EAOZ,OAAA,KAAA,ElCklJH,cAAA,ICmBD,eiClmJM,QAAA,OAEA,iBACA,oBACA,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WlCmlJL,MAAA,QkCjlJG,gBAAA,KjComJF,iBAAkB,KiCjmJZ,OAAA,IAAA,MAAA,KPVH,6B3B8lJJ,gCkChlJG,YAAA,EjCmmJF,uBAAwB,I0B1nJxB,0BAAA,I3B4mJD,4BkC3kJG,+BjC8lJF,wBAAyB,IACzB,2BAA4B,IiC3lJxB,uBAFA,uBAGA,0BAFA,0BlCilJL,QAAA,EkCzkJG,MAAA,QjC4lJF,iBAAkB,KAClB,aAAc,KAEhB,sBiC1lJM,4BAFA,4BjC6lJN,yBiC1lJM,+BAFA,+BAGA,QAAA,ElC8kJL,MAAA,KkCroJC,OAAQ,QjCwpJR,iBAAkB,QAClB,aAAc,QiCtlJV,wBAEA,8BADA,8BjCulJN,2BiCzlJM,iCjC0lJN,iCDZC,MAAA,KkClkJC,OAAQ,YjCqlJR,iBAAkB,KkChqJd,aAAA,KAEA,oBnCipJL,uBmC/oJG,QAAA,KAAA,KlCkqJF,UAAW,K0B7pJX,YAAA,U3B+oJD,gCmC9oJG,mClCiqJF,uBAAwB,I0B1qJxB,0BAAA,I3B4pJD,+BkC7kJD,kCjCgmJE,wBAAyB,IkChrJrB,2BAAA,IAEA,oBnCiqJL,uBmC/pJG,QAAA,IAAA,KlCkrJF,UAAW,K0B7qJX,YAAA,I3B+pJD,gCmC9pJG,mClCirJF,uBAAwB,I0B1rJxB,0BAAA,I3B4qJD,+BoC9qJD,kCACE,wBAAA,IACA,2BAAA,IAEA,OpCgrJD,aAAA,EoCprJC,OAAQ,KAAK,EAOX,WAAA,OpCgrJH,WAAA,KCmBD,UmChsJM,QAAA,OAEA,YACA,eACA,QAAA,apCirJL,QAAA,IAAA,KoC/rJC,iBAAkB,KnCktJlB,OAAQ,IAAI,MAAM,KmC/rJd,cAAA,KAnBN,kBpCosJC,kBCmBC,gBAAiB,KmC5rJb,iBAAA,KA3BN,eAAA,kBAkCM,MAAA,MAlCN,mBAAA,sBnCguJE,MAAO,KmCrrJH,mBAEA,yBADA,yBpCwqJL,sBqCrtJC,MAAO,KACP,OAAA,YACA,iBAAA,KAEA,OACA,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KrCutJD,WAAA,OqCntJG,YAAA,OpCsuJF,eAAgB,SoCpuJZ,cAAA,MrCutJL,cqCrtJK,cAKJ,MAAA,KACE,gBAAA,KrCktJH,OAAA,QqC7sJG,aACA,QAAA,KAOJ,YCtCE,SAAA,StCkvJD,IAAA,KCmBD,eqChwJM,iBAAA,KALJ,2BD0CF,2BrC+sJC,iBAAA,QCmBD,eqCvwJM,iBAAA,QALJ,2BD8CF,2BrCktJC,iBAAA,QCmBD,eqC9wJM,iBAAA,QALJ,2BDkDF,2BrCqtJC,iBAAA,QCmBD,YqCrxJM,iBAAA,QALJ,wBDsDF,wBrCwtJC,iBAAA,QCmBD,eqC5xJM,iBAAA,QALJ,2BD0DF,2BrC2tJC,iBAAA,QCmBD,cqCnyJM,iBAAA,QCDJ,0BADF,0BAEE,iBAAA,QAEA,OACA,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OvCwxJD,YAAA,OuCrxJC,eAAA,OACE,iBAAA,KvCuxJH,cAAA,KuClxJG,aACA,QAAA,KAGF,YtCqyJA,SAAU,SsCnyJR,IAAA,KAMA,0BvC+wJH,eCmBC,IAAK,EsChyJD,QAAA,IAAA,IvCmxJL,cuCjxJK,cAKJ,MAAA,KtC+xJA,gBAAiB,KsC7xJf,OAAA,QvC+wJH,+BuC3wJC,4BACE,MAAA,QvC6wJH,iBAAA,KuCzwJG,wBvC4wJH,MAAA,MuCxwJG,+BvC2wJH,aAAA,IwCp0JC,uBACA,YAAA,IAEA,WACA,YAAA,KxCu0JD,eAAA,KwC50JC,cAAe,KvC+1Jf,MAAO,QuCt1JL,iBAAA,KAIA,eAbJ,cAcI,MAAA,QxCu0JH,awCr1JC,cAAe,KAmBb,UAAA,KxCq0JH,YAAA,ICmBD,cuCn1JI,iBAAA,QAEA,sBxCo0JH,4BwC91JC,cAAe,KA8Bb,aAAA,KxCm0JH,cAAA,IwChzJD,sBAfI,UAAA,KxCo0JD,oCwCj0JC,WvCo1JA,YAAa,KuCl1JX,eAAA,KxCo0JH,sBwC1zJD,4BvC60JE,cAAe,KuCj1Jb,aAAA,KC5CJ,ezC+2JD,cyC92JC,UAAA,MAGA,WACA,QAAA,MACA,QAAA,IACA,cAAA,KrCiLA,YAAA,WACK,iBAAA,KACG,OAAA,IAAA,MAAA,KJisJT,cAAA,IyC33JC,mBAAoB,OAAO,IAAI,YxC84J1B,cAAe,OAAO,IAAI,YwCj4J7B,WAAA,OAAA,IAAA,YAKF,iBzC82JD,eCmBC,aAAc,KACd,YAAa,KwC13JX,mBA1BJ,kBzCq4JC,kByC12JG,aAAA,QCzBJ,oBACE,QAAA,IACA,MAAA,KAEA,O1Cy4JD,QAAA,K0C74JC,cAAe,KAQb,OAAA,IAAA,MAAA,YAEA,cAAA,IAVJ,UAeI,WAAA,E1Cq4JH,MAAA,QCmBD,mByCl5JI,YAAA,IArBJ,SAyBI,U1Ck4JH,cAAA,ECmBD,WyC34JE,WAAA,IAFF,mBAAA,mBAMI,cAAA,KAEA,0BACA,0B1C43JH,SAAA,S0Cp3JC,IAAK,KCvDL,MAAA,MACA,MAAA,Q3C+6JD,e0Cz3JC,MAAO,QClDL,iBAAA,Q3C86JH,aAAA,Q2C36JG,kB3C86JH,iBAAA,Q2Ct7JC,2BACA,MAAA,Q3C07JD,Y0Ch4JC,MAAO,QCtDL,iBAAA,Q3Cy7JH,aAAA,Q2Ct7JG,e3Cy7JH,iBAAA,Q2Cj8JC,wBACA,MAAA,Q3Cq8JD,e0Cv4JC,MAAO,QC1DL,iBAAA,Q3Co8JH,aAAA,Q2Cj8JG,kB3Co8JH,iBAAA,Q2C58JC,2BACA,MAAA,Q3Cg9JD,c0C94JC,MAAO,QC9DL,iBAAA,Q3C+8JH,aAAA,Q2C58JG,iB3C+8JH,iBAAA,Q4Ch9JC,0BAAQ,MAAA,QACR,wCAAQ,K5Cs9JP,oBAAA,KAAA,E4Cl9JD,GACA,oBAAA,EAAA,GACA,mCAAQ,K5Cw9JP,oBAAA,KAAA,E4C19JD,GACA,oBAAA,EAAA,GACA,gCAAQ,K5Cw9JP,oBAAA,KAAA,E4Ch9JD,GACA,oBAAA,EAAA,GAGA,UACA,OAAA,KxCsCA,cAAA,KACQ,SAAA,OJ86JT,iBAAA,Q4Ch9JC,cAAe,IACf,mBAAA,MAAA,EAAA,IAAA,IAAA,eACA,WAAA,MAAA,EAAA,IAAA,IAAA,eAEA,cACA,MAAA,KACA,MAAA,EACA,OAAA,KACA,UAAA,KxCyBA,YAAA,KACQ,MAAA,KAyHR,WAAA,OACK,iBAAA,QACG,mBAAA,MAAA,EAAA,KAAA,EAAA,gBJk0JT,WAAA,MAAA,EAAA,KAAA,EAAA,gB4C78JC,mBAAoB,MAAM,IAAI,K3Cw+JzB,cAAe,MAAM,IAAI,K4Cv+J5B,WAAA,MAAA,IAAA,KDEF,sBCAE,gCDAF,iBAAA,yK5Ci9JD,iBAAA,oK4C18JC,iBAAiB,iK3Cs+JjB,wBAAyB,KAAK,KGlhK9B,gBAAA,KAAA,KJ4/JD,qBI1/JS,+BwCmDR,kBAAmB,qBAAqB,GAAG,OAAO,SErElD,aAAA,qBAAA,GAAA,OAAA,S9C+gKD,UAAA,qBAAA,GAAA,OAAA,S6C59JG,sBACA,iBAAA,Q7Cg+JH,wC4C38JC,iBAAkB,yKEzElB,iBAAA,oK9CuhKD,iBAAA,iK6Cp+JG,mBACA,iBAAA,Q7Cw+JH,qC4C/8JC,iBAAkB,yKE7ElB,iBAAA,oK9C+hKD,iBAAA,iK6C5+JG,sBACA,iBAAA,Q7Cg/JH,wC4Cn9JC,iBAAkB,yKEjFlB,iBAAA,oK9CuiKD,iBAAA,iK6Cp/JG,qBACA,iBAAA,Q7Cw/JH,uC+C/iKC,iBAAkB,yKAElB,iBAAA,oK/CgjKD,iBAAA,iK+C7iKG,O/CgjKH,WAAA,KC4BD,mB8CtkKE,WAAA,E/C+iKD,O+C3iKD,YACE,SAAA,O/C6iKD,KAAA,E+CziKC,Y/C4iKD,MAAA,Q+CxiKG,c/C2iKH,QAAA,MC4BD,4B8CjkKE,UAAA,KAGF,aAAA,mBAEE,aAAA,KAGF,YAAA,kB9CkkKE,cAAe,K8C3jKjB,YAHE,Y/CuiKD,a+CniKC,QAAA,W/CsiKD,eAAA,I+CliKC,c/CqiKD,eAAA,O+ChiKC,cACA,eAAA,OAMF,eACE,WAAA,EACA,cAAA,ICvDF,YAEE,aAAA,EACA,WAAA,KAQF,YACE,aAAA,EACA,cAAA,KAGA,iBACA,SAAA,SACA,QAAA,MhDglKD,QAAA,KAAA,KgD7kKC,cAAA,KrB3BA,iBAAA,KACC,OAAA,IAAA,MAAA,KqB6BD,6BACE,uBAAA,IrBvBF,wBAAA,I3BymKD,4BgDvkKC,cAAe,E/CmmKf,2BAA4B,I+CjmK5B,0BAAA,IAFF,kBAAA,uBAKI,MAAA,KAIF,2CAAA,gD/CmmKA,MAAO,K+C/lKL,wBAFA,wBhD4kKH,6BgD3kKG,6BAKF,MAAO,KACP,gBAAA,KACA,iBAAA,QAKA,uB/C+lKA,MAAO,KACP,WAAY,K+C5lKV,0BhDskKH,gCgDrkKG,gCALF,MAAA,K/CsmKA,OAAQ,YACR,iBAAkB,KDxBnB,mDgD/kKC,yDAAA,yD/C4mKA,MAAO,QDxBR,gDgDnkKC,sDAAA,sD/CgmKA,MAAO,K+C5lKL,wBAEA,8BADA,8BhDskKH,QAAA,EgD3kKC,MAAA,K/CumKA,iBAAkB,QAClB,aAAc,QAEhB,iDDpBC,wDCuBD,uDADA,uD+C5mKE,8DAYI,6D/C+lKN,uD+C3mKE,8D/C8mKF,6DAKE,MAAO,QDxBR,8CiD7qKG,oDADF,oDAEE,MAAA,QAEA,yBhD0sKF,MAAO,QgDxsKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhD2sKJ,MAAO,QDtBR,gCiDnrKO,gCAGF,qCAFE,qChD8sKN,MAAO,QACP,iBAAkB,QAEpB,iCgD1sKQ,uCAFA,uChD6sKR,sCDtBC,4CiDtrKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,sBhDuuKF,MAAO,QgDruKH,iBAAA,QAFF,uBAAA,4BAKI,MAAA,QAGF,gDAAA,qDhDwuKJ,MAAO,QDtBR,6BiDhtKO,6BAGF,kCAFE,kChD2uKN,MAAO,QACP,iBAAkB,QAEpB,8BgDvuKQ,oCAFA,oChD0uKR,mCDtBC,yCiDntKO,yCArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,yBhDowKF,MAAO,QgDlwKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDqwKJ,MAAO,QDtBR,gCiD7uKO,gCAGF,qCAFE,qChDwwKN,MAAO,QACP,iBAAkB,QAEpB,iCgDpwKQ,uCAFA,uChDuwKR,sCDtBC,4CiDhvKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,wBhDiyKF,MAAO,QgD/xKH,iBAAA,QAFF,yBAAA,8BAKI,MAAA,QAGF,kDAAA,uDhDkyKJ,MAAO,QDtBR,+BiD1wKO,+BAGF,oCAFE,oChDqyKN,MAAO,QACP,iBAAkB,QAEpB,gCgDjyKQ,sCAFA,sChDoyKR,qCDtBC,2CiD7wKO,2CDkGN,MAAO,KACP,iBAAA,QACA,aAAA,QAEF,yBACE,WAAA,EACA,cAAA,IE1HF,sBACE,cAAA,EACA,YAAA,IAEA,O9C0DA,cAAA,KACQ,iBAAA,KJgvKT,OAAA,IAAA,MAAA,YkDtyKC,cAAe,IACf,mBAAA,EAAA,IAAA,IAAA,gBlDwyKD,WAAA,EAAA,IAAA,IAAA,gBkDlyKC,YACA,QAAA,KvBnBC,e3B0zKF,QAAA,KAAA,KkDzyKC,cAAe,IAAI,MAAM,YAMvB,uBAAA,IlDsyKH,wBAAA,IkDhyKC,0CACA,MAAA,QAEA,alDmyKD,WAAA,EkDvyKC,cAAe,EjDm0Kf,UAAW,KACX,MAAO,QDtBR,oBkD7xKC,sBjDqzKF,eiD3zKI,mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3By0KF,iBAAA,QkDxxKC,WAAY,IAAI,MAAM,KjDozKtB,2BAA4B,IiDjzK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElD2xKL,oCkDtxKG,oDjDkzKF,aAAc,IAAI,EiDhzKZ,cAAA,EvBtEL,4D3Bg2KF,4EkDpxKG,WAAA,EjDgzKF,uBAAwB,IiD9yKlB,wBAAA,IvBtEL,0D3B81KF,0EkD7yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElDixKH,wBAAA,EkD7wKC,wDlDgxKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDryKpB,8BlD6wKC,ckD7wKD,gCjD0yKE,cAAe,EiD1yKjB,sCAQM,sBlD2wKL,wCC4BC,cAAe,K0Bx5Kf,aAAA,KuByGF,wDlDwxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDrzK3B,yFAoBQ,yFlD2wKP,2DkD5wKO,2DjDwyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiDj0KA,wGjD+zKA,wGDtBC,wGCuBD,0EiDh0KA,0EjD8zKA,0EiDtyKU,0EjD8yKR,uBAAwB,IAK1B,uGiD30KA,uGjDy0KA,uGDtBC,uGCuBD,yEiD10KA,yEjDw0KA,yEiD5yKU,yEvB7HR,wBAAA,IuBiGF,sDlDwzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiD3yKrB,qFA1CR,qFAyCQ,wDlDsxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiDj2KA,oGjD81KA,uEiDhzKU,uEjDkzKV,uEiDh2KA,uEjDs2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiD32KA,mGjDw2KA,sEiDtzKU,sEjDwzKV,sEiD12KA,sEjDg3KE,2BAA4B,IiDrzK1B,0BlD8xKH,qCkDz1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD83KE,OAAQ,EiDpzKA,+CjDwzKV,+CiDl4KA,+CjDo4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDn4KA,iEjDq4KA,iEAEA,iEANA,iEAWE,YAAa,EiD9zKL,8CjDk0KV,8CiDh5KA,8CjDk5KA,8CAEA,8CANA,8CDjBC,gECoBD,gEiDj5KA,gEjDm5KA,gEAEA,gEANA,gEAWE,aAAc,EAIhB,+CiD95KA,+CjD45KA,+CiDr0KU,+CjDw0KV,iEiD/5KA,iEjD65KA,iEDtBC,iEC6BC,cAAe,EAEjB,8CiDt0KU,8CjDw0KV,8CiDx6KA,8CjDu6KA,gEDtBC,gECwBD,gEiDn0KI,gEACA,cAAA,EAUJ,yBACE,cAAA,ElDsyKD,OAAA,EkDlyKG,aACA,cAAA,KANJ,oBASM,cAAA,ElDqyKL,cAAA,IkDhyKG,2BlDmyKH,WAAA,IC4BD,4BiD3zKM,cAAA,EAKF,wDAvBJ,wDlDwzKC,WAAA,IAAA,MAAA,KkD/xKK,2BlDkyKL,WAAA,EmDrhLC,uDnDwhLD,cAAA,IAAA,MAAA,KmDrhLG,eACA,aAAA,KnDyhLH,8BmD3hLC,MAAA,KAMI,iBAAA,QnDwhLL,aAAA,KmDrhLK,0DACA,iBAAA,KAGJ,qCAEI,MAAA,QnDshLL,iBAAA,KmDviLC,yDnD0iLD,oBAAA,KmDviLG,eACA,aAAA,QnD2iLH,8BmD7iLC,MAAA,KAMI,iBAAA,QnD0iLL,aAAA,QmDviLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDwiLL,iBAAA,KmDzjLC,yDnD4jLD,oBAAA,QmDzjLG,eACA,aAAA,QnD6jLH,8BmD/jLC,MAAA,QAMI,iBAAA,QnD4jLL,aAAA,QmDzjLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD0jLL,iBAAA,QmD3kLC,yDnD8kLD,oBAAA,QmD3kLG,YACA,aAAA,QnD+kLH,2BmDjlLC,MAAA,QAMI,iBAAA,QnD8kLL,aAAA,QmD3kLK,uDACA,iBAAA,QAGJ,kCAEI,MAAA,QnD4kLL,iBAAA,QmD7lLC,sDnDgmLD,oBAAA,QmD7lLG,eACA,aAAA,QnDimLH,8BmDnmLC,MAAA,QAMI,iBAAA,QnDgmLL,aAAA,QmD7lLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD8lLL,iBAAA,QmD/mLC,yDnDknLD,oBAAA,QmD/mLG,cACA,aAAA,QnDmnLH,6BmDrnLC,MAAA,QAMI,iBAAA,QnDknLL,aAAA,QmD/mLK,yDACA,iBAAA,QAGJ,oCAEI,MAAA,QnDgnLL,iBAAA,QoD/nLC,wDACA,oBAAA,QAEA,kBACA,SAAA,SpDkoLD,QAAA,MoDvoLC,OAAQ,EnDmqLR,QAAS,EACT,SAAU,OAEZ,yCmDzpLI,wBADA,yBAEA,yBACA,wBACA,SAAA,SACA,IAAA,EACA,OAAA,EpDkoLH,KAAA,EoD7nLC,MAAO,KACP,OAAA,KpD+nLD,OAAA,EoD1nLC,wBpD6nLD,eAAA,OqDvpLC,uBACA,eAAA,IAEA,MACA,WAAA,KACA,QAAA,KjDwDA,cAAA,KACQ,iBAAA,QJmmLT,OAAA,IAAA,MAAA,QqDlqLC,cAAe,IASb,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACA,WAAA,MAAA,EAAA,IAAA,IAAA,gBAKJ,iBACE,aAAA,KACA,aAAA,gBAEF,SACE,QAAA,KACA,cAAA,ICtBF,SACE,QAAA,IACA,cAAA,IAEA,OACA,MAAA,MACA,UAAA,KjCRA,YAAA,IAGA,YAAA,ErBwrLD,MAAA,KsDhrLC,YAAA,EAAA,IAAA,EAAA,KrD4sLA,OAAQ,kBqD1sLN,QAAA,GjCbF,aiCeE,ajCZF,MAAA,KrBgsLD,gBAAA,KsD5qLC,OAAA,QACE,OAAA,kBACA,QAAA,GAEA,aACA,mBAAA,KtD8qLH,QAAA,EuDnsLC,OAAQ,QACR,WAAA,IvDqsLD,OAAA,EuDhsLC,YACA,SAAA,OAEA,OACA,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EAIA,QAAA,KvDgsLD,QAAA,KuD7rLC,SAAA,OnD+GA,2BAAA,MACI,QAAA,EAEI,0BAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,UAAA,IAAA,SJghLT,kBAAA,kBuDnsLC,cAAA,kBnD2GA,aAAA,kBACI,UAAA,kBAEI,wBJ2lLT,kBAAA,euDvsLK,cAAe,eACnB,aAAA,eACA,UAAA,eAIF,mBACE,WAAA,OACA,WAAA,KvDwsLD,cuDnsLC,SAAU,SACV,MAAA,KACA,OAAA,KAEA,eACA,SAAA,SnDaA,iBAAA,KACQ,wBAAA,YmDZR,gBAAA,YtD+tLA,OsD/tLA,IAAA,MAAA,KAEA,OAAA,IAAA,MAAA,evDqsLD,cAAA,IuDjsLC,QAAS,EACT,mBAAA,EAAA,IAAA,IAAA,eACA,WAAA,EAAA,IAAA,IAAA,eAEA,gBACA,SAAA,MACA,IAAA,EACA,MAAA,EvDmsLD,OAAA,EuDjsLC,KAAA,ElCrEA,QAAA,KAGA,iBAAA,KkCmEA,qBlCtEA,OAAA,iBAGA,QAAA,EkCwEF,mBACE,OAAA,kBACA,QAAA,GAIF,cACE,QAAA,KvDmsLD,cAAA,IAAA,MAAA,QuD9rLC,qBACA,WAAA,KAKF,aACE,OAAA,EACA,YAAA,WAIF,YACE,SAAA,SACA,QAAA,KvD6rLD,cuD/rLC,QAAS,KAQP,WAAA,MACA,WAAA,IAAA,MAAA,QATJ,wBAaI,cAAA,EvDyrLH,YAAA,IuDrrLG,mCvDwrLH,YAAA,KuDlrLC,oCACA,YAAA,EAEA,yBACA,SAAA,SvDqrLD,IAAA,QuDnqLC,MAAO,KAZP,OAAA,KACE,SAAA,OvDmrLD,yBuDhrLD,cnDvEA,MAAA,MACQ,OAAA,KAAA,KmD2ER,eAAY,mBAAA,EAAA,IAAA,KAAA,evDkrLX,WAAA,EAAA,IAAA,KAAA,euD5qLD,UAFA,MAAA,OvDorLD,yBwDl0LC,UACA,MAAA,OCNA,SAEA,SAAA,SACA,QAAA,KACA,QAAA,MACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,ODHA,WAAA,OnCVA,aAAA,OAGA,UAAA,OrBy1LD,YAAA,OwD90LC,OAAA,iBnCdA,QAAA,ErBg2LD,WAAA,KwDj1LY,YAAmB,OAAA,kBxDq1L/B,QAAA,GwDp1LY,aAAmB,QAAA,IAAA,ExDw1L/B,WAAA,KwDv1LY,eAAmB,QAAA,EAAA,IxD21L/B,YAAA,IwD11LY,gBAAmB,QAAA,IAAA,ExD81L/B,WAAA,IwDz1LC,cACA,QAAA,EAAA,IACA,YAAA,KAEA,eACA,UAAA,MxD41LD,QAAA,IAAA,IwDx1LC,MAAO,KACP,WAAA,OACA,iBAAA,KACA,cAAA,IAEA,exD01LD,SAAA,SwDt1LC,MAAA,EACE,OAAA,EACA,aAAA,YACA,aAAA,MAEA,4BxDw1LH,OAAA,EwDt1LC,KAAA,IACE,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,iCxDw1LH,MAAA,IwDt1LC,OAAA,EACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,kCxDw1LH,OAAA,EwDt1LC,KAAA,IACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,8BxDw1LH,IAAA,IwDt1LC,KAAA,EACE,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEA,6BxDw1LH,IAAA,IwDt1LC,MAAA,EACE,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEA,+BxDw1LH,IAAA,EwDt1LC,KAAA,IACE,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,oCxDw1LH,IAAA,EwDt1LC,MAAA,IACE,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,qCxDw1LH,IAAA,E0Dr7LC,KAAM,IACN,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,SACA,SAAA,SACA,IAAA,EDXA,KAAA,EAEA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KCAA,eAAA,OAEA,WAAA,OACA,aAAA,OAAA,UAAA,OACA,YAAA,OACA,iBAAA,KACA,wBAAA,YtD8CA,gBAAA,YACQ,OAAA,IAAA,MAAA,KJq5LT,OAAA,IAAA,MAAA,e0Dh8LC,cAAA,IAAY,mBAAA,EAAA,IAAA,KAAA,e1Dm8Lb,WAAA,EAAA,IAAA,KAAA,e0Dl8La,WAAA,KACZ,aAAY,WAAA,MACZ,eAAY,YAAA,KAGd,gBACE,WAAA,KAEA,cACA,YAAA,MAEA,e1Dw8LD,QAAA,IAAA,K0Dr8LC,OAAQ,EACR,UAAA,K1Du8LD,iBAAA,Q0D/7LC,cAAA,IAAA,MAAA,QzD49LA,cAAe,IAAI,IAAI,EAAE,EyDz9LvB,iBACA,QAAA,IAAA,KAEA,gBACA,sB1Di8LH,SAAA,S0D97LC,QAAS,MACT,MAAA,E1Dg8LD,OAAA,E0D97LC,aAAc,YACd,aAAA,M1Di8LD,gB0D57LC,aAAA,KAEE,sBACA,QAAA,GACA,aAAA,KAEA,oB1D87LH,OAAA,M0D77LG,KAAA,IACE,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,E1Dg8LL,0B0D57LC,OAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAEA,sB1D87LH,IAAA,I0D77LG,KAAA,MACE,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,E1Dg8LL,4B0D57LC,OAAA,MACE,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAEA,uB1D87LH,IAAA,M0D77LG,KAAA,IACE,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gB1Dg8LL,6B0D37LC,IAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAEA,qB1D67LH,IAAA,I0D57LG,MAAA,MACE,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gB1D+7LL,2B2DvjMC,MAAO,IACP,OAAA,M3DyjMD,QAAA,I2DtjMC,mBAAoB,EACpB,kBAAA,KAEA,U3DwjMD,SAAA,S2DrjMG,gBACA,SAAA,SvD6KF,MAAA,KACK,SAAA,OJ64LN,sB2DlkMC,SAAU,S1D+lMV,QAAS,K0DjlML,mBAAA,IAAA,YAAA,K3DwjML,cAAA,IAAA,YAAA,K2D9hMC,WAAA,IAAA,YAAA,KvDmKK,4BAFL,0BAGQ,YAAA,EA3JA,qDA+GR,sBAEQ,mBAAA,kBAAA,IAAA,YJi7LP,cAAA,aAAA,IAAA,Y2D5jMG,WAAA,UAAA,IAAA,YvDmHJ,4BAAA,OACQ,oBAAA,OuDjHF,oBAAA,O3D+jML,YAAA,OI/8LD,mCHy+LA,2BGx+LQ,KAAA,EuD5GF,kBAAA,sB3DgkML,UAAA,sBC2BD,kCADA,2BG/+LA,KAAA,EACQ,kBAAA,uBuDtGF,UAAA,uBArCN,6B3DumMD,gC2DvmMC,iC1DkoME,KAAM,E0DrlMN,kBAAA,mB3D+jMH,UAAA,oBAGA,wB2D/mMD,sBAAA,sBAsDI,QAAA,MAEA,wB3D6jMH,KAAA,E2DzjMG,sB3D4jMH,sB2DxnMC,SAAU,SA+DR,IAAA,E3D4jMH,MAAA,KC0BD,sB0DllMI,KAAA,KAnEJ,sBAuEI,KAAA,MAvEJ,2BA0EI,4B3D2jMH,KAAA,E2DljMC,6BACA,KAAA,MAEA,8BACA,KAAA,KtC3FA,kBsC6FA,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,I3DsjMD,UAAA,K2DjjMC,MAAA,KdnGE,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,cAAA,OAAA,kBACA,QAAA,G7CwpMH,uB2DrjMC,iBAAA,sEACE,iBAAA,iEACA,iBAAA,uFdxGA,iBAAA,kEACA,OAAA,+GACA,kBAAA,SACA,wBACA,MAAA,E7CgqMH,KAAA,K2DvjMC,iBAAA,sE1DmlMA,iBAAiB,iE0DjlMf,iBAAA,uFACA,iBAAA,kEACA,OAAA,+GtCvHF,kBAAA,SsCyFF,wB3DylMC,wBC4BC,MAAO,KACP,gBAAiB,KACjB,OAAQ,kB0DhlMN,QAAA,EACA,QAAA,G3D2jMH,0C2DnmMD,2CA2CI,6BADA,6B1DqlMF,SAAU,S0DhlMR,IAAA,IACA,QAAA,E3DwjMH,QAAA,a2DxmMC,WAAY,MAqDV,0CADA,6B3DyjMH,KAAA,I2D7mMC,YAAa,MA0DX,2CADA,6BAEA,MAAA,IACA,aAAA,MAME,6BADF,6B3DsjMH,MAAA,K2DjjMG,OAAA,KACE,YAAA,M3DmjML,YAAA,E2DxiMC,oCACA,QAAA,QAEA,oCACA,QAAA,QAEA,qBACA,SAAA,SACA,OAAA,K3D2iMD,KAAA,I2DpjMC,QAAS,GAYP,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KAEA,wBACA,QAAA,aAWA,MAAA,KACA,OAAA,K3DiiMH,OAAA,I2DhkMC,YAAa,OAkCX,OAAA,QACA,iBAAA,OACA,iBAAA,cACA,OAAA,IAAA,MAAA,K3DiiMH,cAAA,K2DzhMC,6BACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAEA,kBACA,SAAA,SACA,MAAA,IACA,OAAA,K3D4hMD,KAAA,I2D3hMC,QAAA,GACE,YAAA,K3D6hMH,eAAA,K2Dp/LC,MAAO,KAhCP,WAAA,O1DijMA,YAAa,EAAE,IAAI,IAAI,eAEzB,uB0D9iMM,YAAA,KAEA,oCACA,0C3DshMH,2C2D9hMD,6BAAA,6BAYI,MAAA,K3DshMH,OAAA,K2DliMD,WAAA,M1D8jME,UAAW,KDxBZ,0C2DjhMD,6BACE,YAAA,MAEA,2C3DmhMD,6B2D/gMD,aAAA,M3DkhMC,kBACF,MAAA,I4DhxMC,KAAA,I3D4yME,eAAgB,KAElB,qBACE,OAAQ,MAkBZ,qCADA,sCADA,mBADA,oBAXA,gBADA,iBAOA,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oC2DvzME,oBAAA,qBAAA,oBAAA,qB3D8zMF,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,e2Dl0MI,a3Dw0MJ,cDvBC,kB4DhzMG,mB3DwzMJ,WADA,YAwBE,QAAS,MACT,QAAS,IASX,qCADA,mBANA,gBAGA,uBADA,iBADA,wBAIA,mCDhBC,oB6Dl1MC,oB5Dq2MF,W+B/1MA,uBhCu0MC,qB4D/zMG,cChBF,aACA,kB5Dk2MF,W+Bx1ME,MAAO,KhC40MR,cgCz0MC,QAAS,MACT,aAAA,KhC20MD,YAAA,KgCl0MC,YhCq0MD,MAAA,gBgCl0MC,WhCq0MD,MAAA,egCl0MC,MhCq0MD,QAAA,e8D51MC,MACA,QAAA,gBAEA,WACA,WAAA,O9B8BF,WACE,KAAA,EAAA,EAAA,EhCm0MD,MAAA,YgC5zMC,YAAa,KACb,iBAAA,YhC8zMD,OAAA,E+D91MC,Q/Di2MD,QAAA,eC4BD,OACE,SAAU,M+Dt4MV,chE+2MD,MAAA,aC+BD,YADA,YADA,YADA,YAIE,QAAS,e+Dv5MT,kBhEy4MC,mBgEx4MD,yBhEo4MD,kB+Dr1MD,mBA6IA,yB9D+tMA,kBACA,mB8Dp3ME,yB9Dg3MF,kBACA,mBACA,yB+D15MY,QAAA,eACV,yBAAU,YhE64MT,QAAA,gBC4BD,iB+Dv6MU,QAAA,gBhEg5MX,c+D/1MG,QAAS,oB/Dm2MV,c+Dr2MC,c/Ds2MH,QAAA,sB+Dj2MG,yB/Dq2MD,kBACF,QAAA,iB+Dj2MG,yB/Dq2MD,mBACF,QAAA,kBgEn6MC,yBhEu6MC,yBgEt6MD,QAAA,wBACA,+CAAU,YhE26MT,QAAA,gBC4BD,iB+Dr8MU,QAAA,gBhE86MX,c+Dx2MG,QAAS,oB/D42MV,c+D92MC,c/D+2MH,QAAA,sB+D12MG,+C/D82MD,kBACF,QAAA,iB+D12MG,+C/D82MD,mBACF,QAAA,kBgEj8MC,+ChEq8MC,yBgEp8MD,QAAA,wBACA,gDAAU,YhEy8MT,QAAA,gBC4BD,iB+Dn+MU,QAAA,gBhE48MX,c+Dj3MG,QAAS,oB/Dq3MV,c+Dv3MC,c/Dw3MH,QAAA,sB+Dn3MG,gD/Du3MD,kBACF,QAAA,iB+Dn3MG,gD/Du3MD,mBACF,QAAA,kBgE/9MC,gDhEm+MC,yBgEl+MD,QAAA,wBACA,0BAAU,YhEu+MT,QAAA,gBC4BD,iB+DjgNU,QAAA,gBhE0+MX,c+D13MG,QAAS,oB/D83MV,c+Dh4MC,c/Di4MH,QAAA,sB+D53MG,0B/Dg4MD,kBACF,QAAA,iB+D53MG,0B/Dg4MD,mBACF,QAAA,kBgEr/MC,0BhEy/MC,yBACF,QAAA,wBgE1/MC,yBhE8/MC,WACF,QAAA,gBgE//MC,+ChEmgNC,WACF,QAAA,gBgEpgNC,gDhEwgNC,WACF,QAAA,gBAGA,0B+Dn3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehE4hNT,QAAA,gBC4BD,oB+DtjNU,QAAA,gBhE+hNX,iB+Dj4MG,QAAS,oBAMX,iB/D83MD,iB+Dz2MG,QAAS,sB/D82MZ,qB+Dl4MC,QAAS,e/Dq4MV,a+D/3MC,qBAcE,QAAS,iB/Ds3MZ,sB+Dn4MC,QAAS,e/Ds4MV,a+Dh4MC,sBAOE,QAAS,kB/D83MZ,4B+D/3MC,QAAS,eCpLT,ahEujNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS"}
\ No newline at end of file
diff --git a/doc/doxygen/css/font-awesome.min.css b/doc/doxygen/css/font-awesome.min.css
new file mode 100644
index 0000000..d0603cb
--- /dev/null
+++ b/doc/doxygen/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ *  Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
+ *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.5.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}
diff --git a/doc/doxygen/css/style.css b/doc/doxygen/css/style.css
new file mode 100644
index 0000000..746df07
--- /dev/null
+++ b/doc/doxygen/css/style.css
@@ -0,0 +1,64 @@
+
+.post_image {
+	width: 100%; 
+	display: block; 
+	margin-left: auto; 
+	margin-right: auto;
+}
+
+.post_image_tall {
+	width: 50%; 
+	display: block; 
+	margin-left: auto; 
+	margin-right: auto;
+}
+
+.post_image_home {
+  width: 20%; 
+  display: block; 
+  margin-left: auto; 
+  margin-right: auto;
+}
+
+.post_equation {
+	width: 50%; 
+	display: block; 
+	margin-left: auto; 
+	margin-right: auto;
+}
+
+.anchor{
+	padding-top: 50px; 
+	margin-top: -50px;
+}
+
+.flex-video {
+  position: relative;
+  padding-top: 25px;
+  padding-bottom: 67.5%;
+  height: 0;
+  margin-bottom: 16px;
+  overflow: hidden;
+}
+ 
+.flex-video.widescreen { padding-bottom: 57.25%; }
+.flex-video.vimeo { padding-top: 0; }
+ 
+.flex-video iframe,
+.flex-video object,
+.flex-video embed {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+@media only screen and (max-device-width: 800px), only screen and (device-width: 1024px) and (device-height: 600px), only screen and (width: 1280px) and (orientation: landscape), only screen and (device-width: 800px), only screen and (max-width: 767px) {
+  .flex-video { padding-top: 0; }
+}
+
+  table.center {
+    margin-left:auto; 
+    margin-right:auto;
+    width: 75%;
+  }
diff --git a/doc/doxygen/css/syntax.css b/doc/doxygen/css/syntax.css
new file mode 100644
index 0000000..1e651cf
--- /dev/null
+++ b/doc/doxygen/css/syntax.css
@@ -0,0 +1,60 @@
+.highlight  { background: #ffffff; }
+.highlight .c { color: #999988; font-style: italic } /* Comment */
+.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
+.highlight .k { font-weight: bold } /* Keyword */
+.highlight .o { font-weight: bold } /* Operator */
+.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
+.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
+.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #aa0000 } /* Generic.Error */
+.highlight .gh { color: #999999 } /* Generic.Heading */
+.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
+.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
+.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gp { color: #555555 } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #aaaaaa } /* Generic.Subheading */
+.highlight .gt { color: #aa0000 } /* Generic.Traceback */
+.highlight .kc { font-weight: bold } /* Keyword.Constant */
+.highlight .kd { font-weight: bold } /* Keyword.Declaration */
+.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
+.highlight .m { color: #009999 } /* Literal.Number */
+.highlight .s { color: #d14 } /* Literal.String */
+.highlight .na { color: #008080 } /* Name.Attribute */
+.highlight .nb { color: #0086B3 } /* Name.Builtin */
+.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
+.highlight .no { color: #008080 } /* Name.Constant */
+.highlight .ni { color: #800080 } /* Name.Entity */
+.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
+.highlight .nn { color: #555555 } /* Name.Namespace */
+.highlight .nt { color: #000080 } /* Name.Tag */
+.highlight .nv { color: #008080 } /* Name.Variable */
+.highlight .ow { font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mf { color: #009999 } /* Literal.Number.Float */
+.highlight .mh { color: #009999 } /* Literal.Number.Hex */
+.highlight .mi { color: #009999 } /* Literal.Number.Integer */
+.highlight .mo { color: #009999 } /* Literal.Number.Oct */
+.highlight .sb { color: #d14 } /* Literal.String.Backtick */
+.highlight .sc { color: #d14 } /* Literal.String.Char */
+.highlight .sd { color: #d14 } /* Literal.String.Doc */
+.highlight .s2 { color: #d14 } /* Literal.String.Double */
+.highlight .se { color: #d14 } /* Literal.String.Escape */
+.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
+.highlight .si { color: #d14 } /* Literal.String.Interpol */
+.highlight .sx { color: #d14 } /* Literal.String.Other */
+.highlight .sr { color: #009926 } /* Literal.String.Regex */
+.highlight .s1 { color: #d14 } /* Literal.String.Single */
+.highlight .ss { color: #990073 } /* Literal.String.Symbol */
+.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #008080 } /* Name.Variable.Class */
+.highlight .vg { color: #008080 } /* Name.Variable.Global */
+.highlight .vi { color: #008080 } /* Name.Variable.Instance */
+.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
\ No newline at end of file
diff --git a/doc/doxygen/customdoxygen.css b/doc/doxygen/customdoxygen.css
new file mode 100644
index 0000000..6f21522
--- /dev/null
+++ b/doc/doxygen/customdoxygen.css
@@ -0,0 +1,173 @@
+/* The standard CSS for doxygen */
+
+pre.fragment {
+        padding: 4px 6px;
+        margin: 4px 8px 4px 2px;
+        overflow: auto;
+        word-wrap: break-word;
+        font-size:  12pt;
+        line-height: 125%;
+        font-family: monospace, fixed;
+        font-size: 110%;
+}
+
+div.fragment {
+        padding: 4px;
+        margin: 4px;
+}
+
+div.line {
+	font-family: monospace, fixed;
+        font-size: 16px;
+	min-height: 13px;
+	line-height: 1.0;
+	text-wrap: unrestricted;
+	white-space: -moz-pre-wrap; /* Moz */
+	white-space: -pre-wrap;     /* Opera 4-6 */
+	white-space: -o-pre-wrap;   /* Opera 7 */
+	white-space: pre-wrap;      /* CSS3  */
+	word-wrap: break-word;      /* IE 5.5+ */
+	text-indent: -53px;
+	padding-left: 53px;
+	padding-bottom: 0px;
+	margin: 0px;
+	-webkit-transition-property: background-color, box-shadow;
+	-webkit-transition-duration: 0.5s;
+	-moz-transition-property: background-color, box-shadow;
+	-moz-transition-duration: 0.5s;
+	-ms-transition-property: background-color, box-shadow;
+	-ms-transition-duration: 0.5s;
+	-o-transition-property: background-color, box-shadow;
+	-o-transition-duration: 0.5s;
+	transition-property: background-color, box-shadow;
+	transition-duration: 0.5s;
+}
+
+div.line.glow {
+	background-color: cyan;
+	box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+	padding-right: 4px;
+	text-align: right;
+	border-right: 2px solid #0F0;
+        white-space: pre;
+}
+
+div.groupHeader {
+	margin-left: 16px;
+	margin-top: 12px;
+	font-weight: bold;
+}
+
+div.groupText {
+	margin-left: 16px;
+	font-style: italic;
+}
+
+
+td.indexkey {
+	background-color: #EBEFF6;
+	font-weight: bold;
+	border: 1px solid #C4CFE5;
+	margin: 2px 0px 2px 0;
+	padding: 2px 10px;
+        white-space: nowrap;
+        vertical-align: top;
+}
+
+td.indexvalue {
+	background-color: #EBEFF6;
+	border: 1px solid #C4CFE5;
+	padding: 2px 10px;
+	margin: 2px 0px;
+}
+
+tr.memlist {
+	background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+	text-align: center;
+}
+
+img.formulaDsp {
+	
+}
+
+img.formulaInl {
+	vertical-align: middle;
+}
+
+div.center {
+	text-align: center;
+        margin-top: 0px;
+        margin-bottom: 0px;
+        padding: 0px;
+}
+
+div.center img {
+	border: 0px;
+}
+
+address.footer {
+	text-align: right;
+	padding-right: 12px;
+}
+
+img.footer {
+	border: 0px;
+	vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+	color: #008000
+}
+
+span.keywordtype {
+	color: #604020
+}
+
+span.keywordflow {
+	color: #e08000
+}
+
+span.comment {
+	color: #800000
+}
+
+span.preprocessor {
+	color: #806020
+}
+
+span.stringliteral {
+	color: #002080
+}
+
+span.charliteral {
+	color: #008080
+}
+
+span.vhdldigit { 
+	color: #ff00ff 
+}
+
+span.vhdlchar { 
+	color: #000000 
+}
+
+span.vhdlkeyword { 
+	color: #700070 
+}
+
+span.vhdllogic { 
+	color: #ff0000 
+}
+
+
+/* @end */
+
diff --git a/doc/doxygen/doxy-boot.js b/doc/doxygen/doxy-boot.js
new file mode 100644
index 0000000..4bc496d
--- /dev/null
+++ b/doc/doxygen/doxy-boot.js
@@ -0,0 +1,135 @@
+$( document ).ready(function() {
+
+    $("div.headertitle").addClass("page-header");
+    $("div.title").addClass("h1");
+
+    $('li > a[href="index.html"] > span').before("<i class='fa fa-cog'></i> ");
+    $('li > a[href="modules.html"] > span').before("<i class='fa fa-square'></i> ");
+    $('li > a[href="namespaces.html"] > span').before("<i class='fa fa-bars'></i> ");
+    $('li > a[href="annotated.html"] > span').before("<i class='fa fa-list-ul'></i> ");
+    $('li > a[href="classes.html"] > span').before("<i class='fa fa-book'></i> ");
+    $('li > a[href="inherits.html"] > span').before("<i class='fa fa-sitemap'></i> ");
+    $('li > a[href="functions.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_func.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_vars.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_enum.html"] > span').before("<i class='fa fa-list'></i> ");
+    $('li > a[href="functions_eval.html"] > span').before("<i class='fa fa-list'></i> ");
+
+  $(".icona .icon").addClass("label label-danger");
+	$(".icona .icon").after(" ");
+
+	$('img[src="closed.png"]').before("<i class='fa fa-chevron-right'></i> ");
+	$('img[src="closed.png"]').hide();
+
+	$("div.qindex").css("margin-bottom", "3em");
+	$("div.textblock").css("margin-bottom", "3em");
+	$("table.memberdecls").css("margin-bottom", "3em");
+	$("table.memberdecls").css("margin-top", "3em");
+
+
+
+	$("ul.tablist").addClass("nav nav-pills");
+	$("ul.tablist").css("margin-top", "0.5em");
+	$("ul.tablist").css("margin-bottom", "0.5em");
+	$("li.current").addClass("active");
+	$("iframe").attr("scrolling", "yes");
+
+	$("#nav-path > ul").addClass("breadcrumb");
+
+	$("table.params").addClass("table");
+	$("div.ingroups").wrapInner("<small></small>");
+	$("div.levels").css("margin", "0.5em");
+	$("div.levels > span").addClass("btn btn-default btn-xs");
+	$("div.levels > span").css("margin-right", "0.25em");
+
+	$("table.directory").addClass("table table-striped table-bordered");
+	$("[class^=separator]").remove();
+
+	$("div.summary > a").addClass("btn btn-default btn-xs");
+	$("table.fieldtable").addClass("table");
+	$(".fragment").addClass("well");
+	$(".memitem").addClass("panel panel-default");
+	$(".memproto").addClass("panel-heading");
+	$(".memdoc").addClass("panel-body");
+	$("span.mlabel").addClass("label label-info");
+
+	$("table.memberdecls").addClass("table table-bordered");
+	//$("[class^=memitem]").addClass("active");
+
+	$("div.ah").addClass("btn btn-default");
+	$("span.mlabels").addClass("pull-right");
+	$("table.mlabels").css("width", "100%")
+	$("td.mlabels-right").addClass("pull-right");
+
+	$("div.ttc").addClass("panel panel-info");
+	$("div.ttname").addClass("panel-heading");
+	$("div.ttdef,div.ttdoc,div.ttdeci").addClass("panel-body");
+
+
+    $('#MSearchBox').parent().remove();
+
+    $('div.fragment.well div.line:first').css('margin-top', '15px');
+    $('div.fragment.well div.line:last').css('margin-bottom', '15px');
+
+	$('table.doxtable').removeClass('doxtable').addClass('table table-striped table-bordered').each(function(){
+		$(this).prepend('<thead></thead>');
+		$(this).find('tbody > tr:first').prependTo($(this).find('thead'));
+
+		$(this).find('td > span.success').parent().addClass('success');
+		$(this).find('td > span.warning').parent().addClass('warning');
+		$(this).find('td > span.danger').parent().addClass('danger');
+	});
+
+
+
+//    if($('div.fragment.well div.ttc').length > 0)
+//    {
+//        $('div.fragment.well div.line:first').parent().removeClass('fragment well');
+//    }
+
+//    $('table.memberdecls').find('.memItemRight').each(function(){
+//        $(this).contents().appendTo($(this).siblings('.memItemLeft'));
+//        $(this).siblings('.memItemLeft').attr('align', 'left');
+//    });
+//
+  function getOriginalWidthOfImg(img_element) {
+    var t = new Image();
+		t.src = (img_element.getAttribute ? img_element.getAttribute("src") : false) || img_element.src;
+		return t.width;
+	}
+
+	$('div.dyncontent').find('img').each(function(){
+		if(getOriginalWidthOfImg($(this)[0]) > $('#content>div.container').width())
+			$(this).css('width', '100%');
+	});
+
+	$(".memitem").removeClass('memitem');
+  $(".memproto").removeClass('memproto');
+  $(".memdoc").removeClass('memdoc');
+	$("span.mlabel").removeClass('mlabel');
+	$("table.memberdecls").removeClass('memberdecls');
+  $("[class^=memitem]").removeClass('memitem');
+  $("span.mlabels").removeClass('mlabels');
+  $("table.mlabels").removeClass('mlabels');
+  $("td.mlabels-right").removeClass('mlabels-right');
+	$(".navpath").removeClass('navpath');
+	$("li.navelem").removeClass('navelem');
+	$("a.el").removeClass('el');
+	$("div.ah").removeClass('ah');
+	$("div.header").removeClass("header");
+
+//	$('.mdescLeft').each(function(){
+//		if($(this).html()=="&nbsp;") {
+//			$(this).siblings('.mdescRight').attr('colspan', 2);
+//			$(this).remove();
+//		}
+//	});
+//	$('td.memItemLeft').each(function(){
+//		if($(this).siblings('.memItemRight').html()=="") {
+//			$(this).attr('colspan', 2);
+//			$(this).siblings('.memItemRight').remove();
+//		}
+//	});
+
+  toggleLevel(1);
+});
diff --git a/doc/doxygen/fonts/fontawesome-webfont.eot b/doc/doxygen/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..c7b00d2
Binary files /dev/null and b/doc/doxygen/fonts/fontawesome-webfont.eot differ
diff --git a/doc/doxygen/fonts/fontawesome-webfont.svg b/doc/doxygen/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..8b66187
--- /dev/null
+++ b/doc/doxygen/fonts/fontawesome-webfont.svg
@@ -0,0 +1,685 @@
+<?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></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" "  horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#xd8;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" horiz-adv-x="1537" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" horiz-adv-x="1537" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M519 336q4 6 -3 13q-9 7 -14 2q-4 -6 3 -13q9 -7 14 -2zM491 377q-5 7 -12 4q-6 -4 0 -12q7 -8 12 -5q6 4 0 13zM450 417q2 4 -5 8q-7 2 -8 -2q-3 -5 4 -8q8 -2 9 2zM471 394q2 1 1.5 4.5t-3.5 5.5q-6 7 -10 3t1 -11q6 -6 11 -2zM557 319q2 7 -9 11q-9 3 -13 -4 q-2 -7 9 -11q9 -3 13 4zM599 316q0 8 -12 8q-10 0 -10 -8t11 -8t11 8zM638 323q-2 7 -13 5t-9 -9q2 -8 12 -6t10 10zM1280 640q0 212 -150 362t-362 150t-362 -150t-150 -362q0 -167 98 -300.5t252 -185.5q18 -3 26.5 5t8.5 20q0 52 -1 95q-6 -1 -15.5 -2.5t-35.5 -2t-48 4 t-43.5 20t-29.5 41.5q-23 59 -57 74q-2 1 -4.5 3.5l-8 8t-7 9.5t4 7.5t19.5 3.5q6 0 15 -2t30 -15.5t33 -35.5q16 -28 37.5 -42t43.5 -14t38 3.5t30 9.5q7 47 33 69q-49 6 -86 18.5t-73 39t-55.5 76t-19.5 119.5q0 79 53 137q-24 62 5 136q19 6 54.5 -7.5t60.5 -29.5l26 -16 q58 17 128 17t128 -17q11 7 28.5 18t55.5 26t57 9q29 -74 5 -136q53 -58 53 -137q0 -57 -14 -100.5t-35.5 -70t-53.5 -44.5t-62.5 -26t-68.5 -12q35 -31 35 -95q0 -40 -0.5 -89t-0.5 -51q0 -12 8.5 -20t26.5 -5q154 52 252 185.5t98 300.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="&#xf09b;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -40 7t-13 30q0 3 0.5 76.5t0.5 134.5q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 119 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24 q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-85 13.5q-45 -113 -8 -204q-79 -87 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-39 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5 t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -88.5t0.5 -54.5q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103zM291 305q3 7 -7 12 q-10 3 -13 -2q-3 -7 7 -12q9 -6 13 2zM322 271q7 5 -2 16q-10 9 -16 3q-7 -5 2 -16q10 -10 16 -3zM352 226q9 7 0 19q-8 13 -17 6q-9 -5 0 -18t17 -7zM394 184q8 8 -4 19q-12 12 -20 3q-9 -8 4 -19q12 -12 20 -3zM451 159q3 11 -13 16q-15 4 -19 -7t13 -15q15 -6 19 6z M514 154q0 13 -17 11q-16 0 -16 -11q0 -13 17 -11q16 0 16 11zM572 164q-2 11 -18 9q-16 -3 -14 -15t18 -8t14 14z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585 h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="2304" d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62 q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1792" />
+<glyph unicode="&#xf117;" horiz-adv-x="1792" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" />
+<glyph unicode="&#xf16d;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1162 640q0 -164 -115 -279t-279 -115t-279 115t-115 279t115 279t279 115t279 -115t115 -279zM1270 1050q0 -38 -27 -65t-65 -27t-65 27t-27 65t27 65t65 27t65 -27t27 -65zM768 1270 q-7 0 -76.5 0.5t-105.5 0t-96.5 -3t-103 -10t-71.5 -18.5q-50 -20 -88 -58t-58 -88q-11 -29 -18.5 -71.5t-10 -103t-3 -96.5t0 -105.5t0.5 -76.5t-0.5 -76.5t0 -105.5t3 -96.5t10 -103t18.5 -71.5q20 -50 58 -88t88 -58q29 -11 71.5 -18.5t103 -10t96.5 -3t105.5 0t76.5 0.5 t76.5 -0.5t105.5 0t96.5 3t103 10t71.5 18.5q50 20 88 58t58 88q11 29 18.5 71.5t10 103t3 96.5t0 105.5t-0.5 76.5t0.5 76.5t0 105.5t-3 96.5t-10 103t-18.5 71.5q-20 50 -58 88t-88 58q-29 11 -71.5 18.5t-103 10t-96.5 3t-105.5 0t-76.5 -0.5zM1536 640q0 -229 -5 -317 q-10 -208 -124 -322t-322 -124q-88 -5 -317 -5t-317 5q-208 10 -322 124t-124 322q-5 88 -5 317t5 317q10 208 124 322t322 124q88 5 317 5t317 -5q208 -10 322 -124t124 -322q5 -88 5 -317z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="&#xf194;" d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+<glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+<glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+<glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
+<glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="&#xf1a0;" d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5 t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" />
+<glyph unicode="&#xf1a1;" horiz-adv-x="1792" d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1a2;" d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+<glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+<glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
+<glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
+<glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+<glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+<glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
+<glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
+<glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+<glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+<glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+<glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
+<glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+<glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+<glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1bd;" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+<glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+<glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+<glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+<glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
+<glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
+<glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+<glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+<glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+<glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+<glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
+<glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5 t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" />
+<glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+<glyph unicode="&#xf1d4;" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+<glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+<glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+<glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
+<glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+<glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+<glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+<glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+<glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+<glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+<glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1ed;" d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
+<glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M441 864q32 0 52 -26q266 -364 362 -774h-446q-127 441 -367 749q-12 16 -3 33.5t29 17.5h373zM1000 507q-49 -199 -125 -393q-79 310 -256 594q40 221 44 449q211 -340 337 -650zM1099 1216q235 -324 384.5 -698.5t184.5 -773.5h-451q-41 665 -553 1472h435zM1792 640 q0 -424 -101 -812q-67 560 -359 1083q-25 301 -106 584q-4 16 5.5 28.5t25.5 12.5h359q21 0 38.5 -13t22.5 -33q115 -409 115 -850z" />
+<glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+<glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+<glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+<glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+<glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+<glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+<glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+<glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+<glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+<glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+<glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+<glyph unicode="&#xf20d;" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+<glyph unicode="&#xf20e;" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360q2 0 4.5 -1t5.5 -2.5l5 -2.5l188 199v347l-187 194 q-13 -8 -29 -10zM986 1438h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13 zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224 l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196 l-48 -227l130 227h-82zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
+<glyph unicode="&#xf210;" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+<glyph unicode="&#xf211;" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+<glyph unicode="&#xf212;" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" />
+<glyph unicode="&#xf213;" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
+<glyph unicode="&#xf214;" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" />
+<glyph unicode="&#xf215;" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+<glyph unicode="&#xf216;" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
+<glyph unicode="&#xf217;" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf218;" horiz-adv-x="1664" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf219;" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+<glyph unicode="&#xf21a;" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+<glyph unicode="&#xf21b;" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
+<glyph unicode="&#xf21c;" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
+<glyph unicode="&#xf21d;" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf21e;" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" />
+<glyph unicode="&#xf221;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="&#xf222;" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf223;" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf224;" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf225;" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf226;" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" />
+<glyph unicode="&#xf227;" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -29 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
+<glyph unicode="&#xf228;" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
+<glyph unicode="&#xf229;" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22a;" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22b;" horiz-adv-x="2048" d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22c;" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf22d;" horiz-adv-x="1280" d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
+<glyph unicode="&#xf22e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf22f;" horiz-adv-x="1792" />
+<glyph unicode="&#xf230;" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+<glyph unicode="&#xf231;" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
+<glyph unicode="&#xf232;" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
+<glyph unicode="&#xf233;" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+<glyph unicode="&#xf234;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
+<glyph unicode="&#xf235;" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
+<glyph unicode="&#xf236;" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" />
+<glyph unicode="&#xf237;" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+<glyph unicode="&#xf238;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+<glyph unicode="&#xf239;" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+<glyph unicode="&#xf23a;" horiz-adv-x="1792" d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116 q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" />
+<glyph unicode="&#xf23b;" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
+<glyph unicode="&#xf23c;" horiz-adv-x="2296" d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 4 5 8q16 18 60 23h13q5 18 19 30t33 8 t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-106 2 -211 0v1q-1 -27 2.5 -86 t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34l3 9v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4l-10 -2.5t-12 -2 l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-2 0 -3 -0.5t-3 -0.5h-3q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130t-73 70 q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -2 -1 -5t-1 -4q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
+<glyph unicode="&#xf23d;" horiz-adv-x="2304" d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
+<glyph unicode="&#xf23e;" horiz-adv-x="1792" d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
+<glyph unicode="&#xf240;" horiz-adv-x="2304" d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf241;" horiz-adv-x="2304" d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf242;" horiz-adv-x="2304" d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf243;" horiz-adv-x="2304" d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf244;" horiz-adv-x="2304" d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="&#xf245;" horiz-adv-x="1280" d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
+<glyph unicode="&#xf246;" horiz-adv-x="1024" d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
+<glyph unicode="&#xf247;" horiz-adv-x="2048" d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
+<glyph unicode="&#xf248;" horiz-adv-x="2304" d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
+<glyph unicode="&#xf249;" d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
+<glyph unicode="&#xf24a;" d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf24b;" horiz-adv-x="2304" d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf24c;" horiz-adv-x="2304" d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf24d;" horiz-adv-x="1792" d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf24e;" horiz-adv-x="2304" d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
+<glyph unicode="&#xf250;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+<glyph unicode="&#xf251;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
+<glyph unicode="&#xf252;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
+<glyph unicode="&#xf253;" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+<glyph unicode="&#xf254;" d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
+<glyph unicode="&#xf255;" d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 q72 69 174 69z" />
+<glyph unicode="&#xf256;" horiz-adv-x="1792" d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
+<glyph unicode="&#xf257;" horiz-adv-x="1792" d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 q0 -42 -23 -78t-61 -53l-310 -141h91z" />
+<glyph unicode="&#xf258;" horiz-adv-x="2048" d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
+<glyph unicode="&#xf259;" horiz-adv-x="2048" d="M816 1408q-48 0 -79.5 -34t-31.5 -82q0 -14 3 -28l150 -624h-26l-116 482q-9 38 -39.5 62t-69.5 24q-47 0 -79 -34t-32 -81q0 -11 4 -29q3 -13 39 -161t68 -282t32 -138v-227l-307 230q-34 26 -77 26q-52 0 -89.5 -36.5t-37.5 -88.5q0 -67 56 -110l507 -379 q34 -26 76 -26h694q33 0 59 20.5t34 52.5l100 401q8 30 10 88t9 86l116 478q3 12 3 26q0 46 -33 79t-80 33q-38 0 -69 -25.5t-40 -62.5l-99 -408h-26l132 547q3 14 3 28q0 47 -32 80t-80 33q-38 0 -68.5 -24t-39.5 -62l-145 -602h-127l-164 682q-9 38 -39.5 62t-68.5 24z M1461 -256h-694q-85 0 -153 51l-507 380q-50 38 -78.5 94t-28.5 118q0 105 75 179t180 74q25 0 49.5 -5.5t41.5 -11t41 -20.5t35 -23t38.5 -29.5t37.5 -28.5l-123 512q-7 35 -7 59q0 93 60 162t152 79q14 87 80.5 144.5t155.5 57.5q83 0 148 -51.5t85 -132.5l103 -428 l83 348q20 81 85 132.5t148 51.5q87 0 152.5 -54t82.5 -139q93 -10 155 -78t62 -161q0 -30 -7 -57l-116 -477q-5 -22 -5 -67q0 -51 -13 -108l-101 -401q-19 -75 -79.5 -122.5t-137.5 -47.5z" />
+<glyph unicode="&#xf25a;" horiz-adv-x="1792" d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 v-384h32z" />
+<glyph unicode="&#xf25b;" d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 q0 -53 37.5 -90.5t90.5 -37.5h668z" />
+<glyph unicode="&#xf25c;" horiz-adv-x="1973" d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 q13 0 22 -8.5t10 -20.5z" />
+<glyph unicode="&#xf25d;" horiz-adv-x="1792" d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf25e;" horiz-adv-x="1792" d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5 t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
+<glyph unicode="&#xf260;" horiz-adv-x="2048" d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
+<glyph unicode="&#xf261;" horiz-adv-x="1792" d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf262;" horiz-adv-x="2304" d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
+<glyph unicode="&#xf263;" horiz-adv-x="1280" d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
+<glyph unicode="&#xf264;" d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf265;" horiz-adv-x="1720" d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
+<glyph unicode="&#xf266;" horiz-adv-x="2304" d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
+<glyph unicode="&#xf267;" horiz-adv-x="1792" d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 t191 -286t71 -348z" />
+<glyph unicode="&#xf268;" horiz-adv-x="1792" d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
+<glyph unicode="&#xf269;" horiz-adv-x="1792" d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
+<glyph unicode="&#xf26a;" horiz-adv-x="1792" d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339 q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z " />
+<glyph unicode="&#xf26b;" horiz-adv-x="1792" d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606 q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" />
+<glyph unicode="&#xf26c;" horiz-adv-x="2048" d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf26d;" horiz-adv-x="1792" d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 q-68 175 -180 287z" />
+<glyph unicode="&#xf26e;" d="M1401 -11l-6 -6q-113 -114 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6 q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13 q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 32 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249 q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 32.5 -6t30.5 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183 q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46 t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" />
+<glyph unicode="&#xf270;" horiz-adv-x="1792" d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
+<glyph unicode="&#xf271;" horiz-adv-x="1792" d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
+<glyph unicode="&#xf272;" horiz-adv-x="1792" d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf273;" horiz-adv-x="1792" d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf274;" horiz-adv-x="1792" d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf275;" horiz-adv-x="1792" d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
+<glyph unicode="&#xf276;" horiz-adv-x="1024" d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q61 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
+<glyph unicode="&#xf277;" horiz-adv-x="1792" d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
+<glyph unicode="&#xf278;" horiz-adv-x="2048" d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
+<glyph unicode="&#xf279;" horiz-adv-x="1792" d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
+<glyph unicode="&#xf27a;" horiz-adv-x="1792" d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf27b;" horiz-adv-x="1792" d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
+<glyph unicode="&#xf27c;" horiz-adv-x="1024" d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
+<glyph unicode="&#xf27d;" horiz-adv-x="1792" d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
+<glyph unicode="&#xf27e;" d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
+<glyph unicode="&#xf280;" d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
+<glyph unicode="&#xf281;" horiz-adv-x="1792" d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5 l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44 t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106 q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" />
+<glyph unicode="&#xf282;" horiz-adv-x="1792" d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53 q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" />
+<glyph unicode="&#xf283;" horiz-adv-x="2304" d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" />
+<glyph unicode="&#xf284;" horiz-adv-x="1792" d="M1549 857q55 0 85.5 -28.5t30.5 -83.5t-34 -82t-91 -27h-136v-177h-25v398h170zM1710 267l-4 -11l-5 -10q-113 -230 -330.5 -366t-474.5 -136q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q244 0 454.5 -124t329.5 -338l2 -4l8 -16 q-30 -15 -136.5 -68.5t-163.5 -84.5q-6 -3 -479 -268q384 -183 799 -366zM896 -234q250 0 462.5 132.5t322.5 357.5l-287 129q-72 -140 -206 -222t-292 -82q-151 0 -280 75t-204 204t-75 280t75 280t204 204t280 75t280 -73.5t204 -204.5l280 143q-116 208 -321 329 t-443 121q-119 0 -232.5 -31.5t-209 -87.5t-176.5 -137t-137 -176.5t-87.5 -209t-31.5 -232.5t31.5 -232.5t87.5 -209t137 -176.5t176.5 -137t209 -87.5t232.5 -31.5z" />
+<glyph unicode="&#xf285;" horiz-adv-x="1792" d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" />
+<glyph unicode="&#xf286;" horiz-adv-x="1792" d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96 q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 6 2.5 9.5t8.5 5t9.5 2t11.5 0t9 -0.5v391q-32 15 -32 50q0 23 16.5 39t38.5 16t38.5 -16t16.5 -39q0 -35 -32 -50v-17q45 10 83 10q21 0 59.5 -7.5t54.5 -7.5 q17 0 47 7.5t37 7.5q16 0 16 -16v-210q0 -15 -35 -21.5t-62 -6.5q-18 0 -54.5 7.5t-55.5 7.5q-40 0 -90 -12v-133q1 0 9 0.5t11.5 0t9.5 -2t8.5 -5t2.5 -9.5v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96 q16 0 16 -16z" />
+<glyph unicode="&#xf287;" horiz-adv-x="2304" d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96 q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5 t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" />
+<glyph unicode="&#xf288;" horiz-adv-x="1792" d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348 t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf289;" horiz-adv-x="2304" d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22 q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5 q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13 q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" />
+<glyph unicode="&#xf28a;" d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83 t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20 q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5 t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" />
+<glyph unicode="&#xf28b;" d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103 t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf28c;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" />
+<glyph unicode="&#xf28d;" d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf28e;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" />
+<glyph unicode="&#xf290;" horiz-adv-x="1792" d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf291;" horiz-adv-x="2048" d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5 t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416 q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441 h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" />
+<glyph unicode="&#xf292;" horiz-adv-x="1792" d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12 q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311 q15 0 25 -12q9 -12 6 -28z" />
+<glyph unicode="&#xf293;" d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5 t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" />
+<glyph unicode="&#xf294;" horiz-adv-x="1024" d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
+<glyph unicode="&#xf295;" d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5 t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf296;" horiz-adv-x="1792" d="M104 830l792 -1015l-868 630q-18 13 -25 34.5t0 42.5l101 308v0zM566 830h660l-330 -1015v0zM368 1442l198 -612h-462l198 612q8 23 33 23t33 -23zM1688 830l101 -308q7 -21 0 -42.5t-25 -34.5l-868 -630l792 1015v0zM1688 830h-462l198 612q8 23 33 23t33 -23z" />
+<glyph unicode="&#xf297;" horiz-adv-x="1792" d="M384 704h160v224h-160v-224zM1221 372v92q-104 -36 -243 -38q-135 -1 -259.5 46.5t-220.5 122.5l1 -96q88 -80 212 -128.5t272 -47.5q129 0 238 49zM640 704h640v224h-640v-224zM1792 736q0 -187 -99 -352q89 -102 89 -229q0 -157 -129.5 -268t-313.5 -111 q-122 0 -225 52.5t-161 140.5q-19 -1 -57 -1t-57 1q-58 -88 -161 -140.5t-225 -52.5q-184 0 -313.5 111t-129.5 268q0 127 89 229q-99 165 -99 352q0 209 120 385.5t326.5 279.5t449.5 103t449.5 -103t326.5 -279.5t120 -385.5z" />
+<glyph unicode="&#xf298;" d="M515 625v-128h-252v128h252zM515 880v-127h-252v127h252zM1273 369v-128h-341v128h341zM1273 625v-128h-672v128h672zM1273 880v-127h-672v127h672zM1408 20v1240q0 8 -6 14t-14 6h-32l-378 -256l-210 171l-210 -171l-378 256h-32q-8 0 -14 -6t-6 -14v-1240q0 -8 6 -14 t14 -6h1240q8 0 14 6t6 14zM553 1130l185 150h-406zM983 1130l221 150h-406zM1536 1260v-1240q0 -62 -43 -105t-105 -43h-1240q-62 0 -105 43t-43 105v1240q0 62 43 105t105 43h1240q62 0 105 -43t43 -105z" />
+<glyph unicode="&#xf299;" horiz-adv-x="1792" d="M896 720q-104 196 -160 278q-139 202 -347 318q-34 19 -70 36q-89 40 -94 32t34 -38l39 -31q62 -43 112.5 -93.5t94.5 -116.5t70.5 -113t70.5 -131q9 -17 13 -25q44 -84 84 -153t98 -154t115.5 -150t131 -123.5t148.5 -90.5q153 -66 154 -60q1 3 -49 37q-53 36 -81 57 q-77 58 -179 211t-185 310zM549 177q-76 60 -132.5 125t-98 143.5t-71 154.5t-58.5 186t-52 209t-60.5 252t-76.5 289q273 0 497.5 -36t379 -92t271 -144.5t185.5 -172.5t110 -198.5t56 -199.5t12.5 -198.5t-9.5 -173t-20 -143.5t-13 -107l323 -327h-104l-281 285 q-22 -2 -91.5 -14t-121.5 -19t-138 -6t-160.5 17t-167.5 59t-179 111z" />
+<glyph unicode="&#xf29a;" horiz-adv-x="1792" d="M1374 879q-6 26 -28.5 39.5t-48.5 7.5q-261 -62 -401 -62t-401 62q-26 6 -48.5 -7.5t-28.5 -39.5t7.5 -48.5t39.5 -28.5q194 -46 303 -58q-2 -158 -15.5 -269t-26.5 -155.5t-41 -115.5l-9 -21q-10 -25 1 -49t36 -34q9 -4 23 -4q44 0 60 41l8 20q54 139 71 259h42 q17 -120 71 -259l8 -20q16 -41 60 -41q14 0 23 4q25 10 36 34t1 49l-9 21q-28 71 -41 115.5t-26.5 155.5t-15.5 269q109 12 303 58q26 6 39.5 28.5t7.5 48.5zM1024 1024q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1600 640q0 -143 -55.5 -273.5t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5zM896 1408q-156 0 -298 -61t-245 -164t-164 -245t-61 -298t61 -298 t164 -245t245 -164t298 -61t298 61t245 164t164 245t61 298t-61 298t-164 245t-245 164t-298 61zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf29b;" d="M1438 723q34 -35 29 -82l-44 -551q-4 -42 -34.5 -70t-71.5 -28q-6 0 -9 1q-44 3 -72.5 36.5t-25.5 77.5l35 429l-143 -8q55 -113 55 -240q0 -216 -148 -372l-137 137q91 101 91 235q0 145 -102.5 248t-247.5 103q-134 0 -236 -92l-137 138q120 114 284 141l264 300 l-149 87l-181 -161q-33 -30 -77 -27.5t-73 35.5t-26.5 77t34.5 73l239 213q26 23 60 26.5t64 -14.5l488 -283q36 -21 48 -68q17 -67 -26 -117l-205 -232l371 20q49 3 83 -32zM1240 1180q-74 0 -126 52t-52 126t52 126t126 52t126.5 -52t52.5 -126t-52.5 -126t-126.5 -52z M613 -62q106 0 196 61l139 -139q-146 -116 -335 -116q-148 0 -273.5 73t-198.5 198t-73 273q0 188 116 336l139 -139q-60 -88 -60 -197q0 -145 102.5 -247.5t247.5 -102.5z" />
+<glyph unicode="&#xf29c;" d="M880 336v-160q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h160q14 0 23 -9t9 -23zM1136 832q0 -50 -15 -90t-45.5 -69t-52 -44t-59.5 -36q-32 -18 -46.5 -28t-26 -24t-11.5 -29v-32q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v68q0 35 10.5 64.5 t24 47.5t39 35.5t41 25.5t44.5 21q53 25 75 43t22 49q0 42 -43.5 71.5t-95.5 29.5q-56 0 -95 -27q-29 -20 -80 -83q-9 -12 -25 -12q-11 0 -19 6l-108 82q-10 7 -12 20t5 23q122 192 349 192q129 0 238.5 -89.5t109.5 -214.5zM768 1280q-130 0 -248.5 -51t-204 -136.5 t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5 t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf29d;" horiz-adv-x="1408" d="M366 1225q-64 0 -110 45.5t-46 110.5q0 64 46 109.5t110 45.5t109.5 -45.5t45.5 -109.5q0 -65 -45.5 -110.5t-109.5 -45.5zM917 583q0 -50 -30 -67.5t-63.5 -6.5t-47.5 34l-367 438q-7 12 -14 15.5t-11 1.5l-3 -3q-7 -8 4 -21l122 -139l1 -354l-161 -457 q-67 -192 -92 -234q-16 -26 -28 -32q-50 -26 -103 -1q-29 13 -41.5 43t-9.5 57q2 17 197 618l5 416l-85 -164l35 -222q4 -24 -1 -42t-14 -27.5t-19 -16t-17 -7.5l-7 -2q-19 -3 -34.5 3t-24 16t-14 22t-7.5 19.5t-2 9.5l-46 299l211 381q23 34 113 34q75 0 107 -40l424 -521 q7 -5 14 -17l3 -3l-1 -1q7 -13 7 -29zM514 433q43 -113 88.5 -225t69.5 -168l24 -55q36 -93 42 -125q11 -70 -36 -97q-35 -22 -66 -16t-51 22t-29 35h-1q-6 16 -8 25l-124 351zM1338 -159q31 -49 31 -57q0 -5 -3 -7q-9 -5 -14.5 0.5t-15.5 26t-16 30.5q-114 172 -423 661 q3 -1 7 1t7 4l3 2q11 9 11 17z" />
+<glyph unicode="&#xf29e;" horiz-adv-x="2304" d="M504 542h171l-1 265zM1530 641q0 87 -50.5 140t-146.5 53h-54v-388h52q91 0 145 57t54 138zM956 1018l1 -756q0 -14 -9.5 -24t-23.5 -10h-216q-14 0 -23.5 10t-9.5 24v62h-291l-55 -81q-10 -15 -28 -15h-267q-21 0 -30.5 18t3.5 35l556 757q9 14 27 14h332q14 0 24 -10 t10 -24zM1783 641q0 -193 -125.5 -303t-324.5 -110h-270q-14 0 -24 10t-10 24v756q0 14 10 24t24 10h268q200 0 326 -109t126 -302zM1939 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5 t-7.5 60t-20 91.5t-41 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2123 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-45 -108t-74 -102.5h-51q38 45 66.5 104.5t41.5 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5 h43q41 -47 72 -107t45.5 -111.5t23 -96t10.5 -70.5zM2304 640q0 -11 -0.5 -29t-8 -71.5t-21.5 -102t-44.5 -108t-73.5 -102.5h-51q38 45 66 104.5t41 112t21 98t9 72.5l1 27q0 8 -0.5 22.5t-7.5 60t-19.5 91.5t-40.5 111.5t-66 124.5h43q41 -47 72 -107t45.5 -111.5t23 -96 t9.5 -70.5z" />
+<glyph unicode="&#xf2a0;" horiz-adv-x="1408" d="M617 -153q0 11 -13 58t-31 107t-20 69q-1 4 -5 26.5t-8.5 36t-13.5 21.5q-15 14 -51 14q-23 0 -70 -5.5t-71 -5.5q-34 0 -47 11q-6 5 -11 15.5t-7.5 20t-6.5 24t-5 18.5q-37 128 -37 255t37 255q1 4 5 18.5t6.5 24t7.5 20t11 15.5q13 11 47 11q24 0 71 -5.5t70 -5.5 q36 0 51 14q9 8 13.5 21.5t8.5 36t5 26.5q2 9 20 69t31 107t13 58q0 22 -43.5 52.5t-75.5 42.5q-20 8 -45 8q-34 0 -98 -18q-57 -17 -96.5 -40.5t-71 -66t-46 -70t-45.5 -94.5q-6 -12 -9 -19q-49 -107 -68 -216t-19 -244t19 -244t68 -216q56 -122 83 -161q63 -91 179 -127 l6 -2q64 -18 98 -18q25 0 45 8q32 12 75.5 42.5t43.5 52.5zM776 760q-26 0 -45 19t-19 45.5t19 45.5q37 37 37 90q0 52 -37 91q-19 19 -19 45t19 45t45 19t45 -19q75 -75 75 -181t-75 -181q-21 -19 -45 -19zM957 579q-27 0 -45 19q-19 19 -19 45t19 45q112 114 112 272 t-112 272q-19 19 -19 45t19 45t45 19t45 -19q150 -150 150 -362t-150 -362q-18 -19 -45 -19zM1138 398q-27 0 -45 19q-19 19 -19 45t19 45q90 91 138.5 208t48.5 245t-48.5 245t-138.5 208q-19 19 -19 45t19 45t45 19t45 -19q109 -109 167 -249t58 -294t-58 -294t-167 -249 q-18 -19 -45 -19z" />
+<glyph unicode="&#xf2a1;" horiz-adv-x="2176" d="M192 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM704 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 352 q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 352q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1472 864q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 864 q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM1984 1376q-66 0 -113 -47t-47 -113t47 -113t113 -47t113 47t47 113t-47 113t-113 47zM384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 192q0 -80 -56 -136 t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 1216q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 192q0 -80 -56 -136t-136 -56t-136 56 t-56 136t56 136t136 56t136 -56t56 -136zM1664 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM2176 704q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136 t56 136t136 56t136 -56t56 -136zM2176 1216q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf2a2;" horiz-adv-x="1792" d="M128 -192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM320 0q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM365 365l256 -256l-90 -90l-256 256zM704 384q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45z M1411 704q0 -59 -11.5 -108.5t-37.5 -93.5t-44 -67.5t-53 -64.5q-31 -35 -45.5 -54t-33.5 -50t-26.5 -64t-7.5 -74q0 -159 -112.5 -271.5t-271.5 -112.5q-26 0 -45 19t-19 45t19 45t45 19q106 0 181 75t75 181q0 57 11.5 105.5t37 91t43.5 66.5t52 63q40 46 59.5 72 t37.5 74.5t18 103.5q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM896 576q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45 t45 19t45 -19t19 -45zM1184 704q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 93 -65.5 158.5t-158.5 65.5q-92 0 -158 -65.5t-66 -158.5q0 -26 -19 -45t-45 -19t-45 19t-19 45q0 146 103 249t249 103t249 -103t103 -249zM1578 993q10 -25 -1 -49t-36 -34q-9 -4 -23 -4 q-19 0 -35.5 11t-23.5 30q-68 178 -224 295q-21 16 -25 42t12 47q17 21 43 25t47 -12q183 -137 266 -351zM1788 1074q9 -25 -1.5 -49t-35.5 -34q-11 -4 -23 -4q-44 0 -60 41q-92 238 -297 393q-22 16 -25.5 42t12.5 47q16 22 42 25.5t47 -12.5q235 -175 341 -449z" />
+<glyph unicode="&#xf2a3;" horiz-adv-x="2304" d="M1032 576q-59 2 -84 55q-17 34 -48 53.5t-68 19.5q-53 0 -90.5 -37.5t-37.5 -90.5q0 -56 36 -89l10 -8q34 -31 82 -31q37 0 68 19.5t48 53.5q25 53 84 55zM1600 704q0 56 -36 89l-10 8q-34 31 -82 31q-37 0 -68 -19.5t-48 -53.5q-25 -53 -84 -55q59 -2 84 -55 q17 -34 48 -53.5t68 -19.5q53 0 90.5 37.5t37.5 90.5zM1174 925q-17 -35 -55 -48t-73 4q-62 31 -134 31q-51 0 -99 -17q3 0 9.5 0.5t9.5 0.5q92 0 170.5 -50t118.5 -133q17 -36 3.5 -73.5t-49.5 -54.5q-18 -9 -39 -9q21 0 39 -9q36 -17 49.5 -54.5t-3.5 -73.5 q-40 -83 -118.5 -133t-170.5 -50h-6q-16 2 -44 4l-290 27l-239 -120q-14 -7 -29 -7q-40 0 -57 35l-160 320q-11 23 -4 47.5t29 37.5l209 119l148 267q17 155 91.5 291.5t195.5 236.5q31 25 70.5 21.5t64.5 -34.5t21.5 -70t-34.5 -65q-70 -59 -117 -128q123 84 267 101 q40 5 71.5 -19t35.5 -64q5 -40 -19 -71.5t-64 -35.5q-84 -10 -159 -55q46 10 99 10q115 0 218 -50q36 -18 49 -55.5t-5 -73.5zM2137 1085l160 -320q11 -23 4 -47.5t-29 -37.5l-209 -119l-148 -267q-17 -155 -91.5 -291.5t-195.5 -236.5q-26 -22 -61 -22q-45 0 -74 35 q-25 31 -21.5 70t34.5 65q70 59 117 128q-123 -84 -267 -101q-4 -1 -12 -1q-36 0 -63.5 24t-31.5 60q-5 40 19 71.5t64 35.5q84 10 159 55q-46 -10 -99 -10q-115 0 -218 50q-36 18 -49 55.5t5 73.5q17 35 55 48t73 -4q62 -31 134 -31q51 0 99 17q-3 0 -9.5 -0.5t-9.5 -0.5 q-92 0 -170.5 50t-118.5 133q-17 36 -3.5 73.5t49.5 54.5q18 9 39 9q-21 0 -39 9q-36 17 -49.5 54.5t3.5 73.5q40 83 118.5 133t170.5 50h6h1q14 -2 42 -4l291 -27l239 120q14 7 29 7q40 0 57 -35z" />
+<glyph unicode="&#xf2a4;" horiz-adv-x="1792" d="M1056 704q0 -26 19 -45t45 -19t45 19t19 45q0 146 -103 249t-249 103t-249 -103t-103 -249q0 -26 19 -45t45 -19t45 19t19 45q0 93 66 158.5t158 65.5t158 -65.5t66 -158.5zM835 1280q-117 0 -223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5q0 -26 19 -45t45 -19t45 19 t19 45q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -55 -18 -103.5t-37.5 -74.5t-59.5 -72q-34 -39 -52 -63t-43.5 -66.5t-37 -91t-11.5 -105.5q0 -106 -75 -181t-181 -75q-26 0 -45 -19t-19 -45t19 -45t45 -19q159 0 271.5 112.5t112.5 271.5q0 41 7.5 74 t26.5 64t33.5 50t45.5 54q35 41 53 64.5t44 67.5t37.5 93.5t11.5 108.5q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5zM591 561l226 -226l-579 -579q-12 -12 -29 -12t-29 12l-168 168q-12 12 -12 29t12 29zM1612 1524l168 -168q12 -12 12 -29t-12 -30l-233 -233 l-26 -25l-71 -71q-66 153 -195 258l91 91l207 207q13 12 30 12t29 -12z" />
+<glyph unicode="&#xf2a5;" d="M866 1021q0 -27 -13 -94q-11 -50 -31.5 -150t-30.5 -150q-2 -11 -4.5 -12.5t-13.5 -2.5q-20 -2 -31 -2q-58 0 -84 49.5t-26 113.5q0 88 35 174t103 124q28 14 51 14q28 0 36.5 -16.5t8.5 -47.5zM1352 597q0 14 -39 75.5t-52 66.5q-21 8 -34 8q-91 0 -226 -77l-2 2 q3 22 27.5 135t24.5 178q0 233 -242 233q-24 0 -68 -6q-94 -17 -168.5 -89.5t-111.5 -166.5t-37 -189q0 -146 80.5 -225t227.5 -79q25 0 25 -3t-1 -5q-4 -34 -26 -117q-14 -52 -51.5 -101t-82.5 -49q-42 0 -42 47q0 24 10.5 47.5t25 39.5t29.5 28.5t26 20t11 8.5q0 3 -7 10 q-24 22 -58.5 36.5t-65.5 14.5q-35 0 -63.5 -34t-41 -75t-12.5 -75q0 -88 51.5 -142t138.5 -54q82 0 155 53t117.5 126t65.5 153q6 22 15.5 66.5t14.5 66.5q3 12 14 18q118 60 227 60q48 0 127 -18q1 -1 4 -1q5 0 9.5 4.5t4.5 8.5zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf2a6;" horiz-adv-x="1535" d="M744 1231q0 24 -2 38.5t-8.5 30t-21 23t-37.5 7.5q-39 0 -78 -23q-105 -58 -159 -190.5t-54 -269.5q0 -44 8.5 -85.5t26.5 -80.5t52.5 -62.5t81.5 -23.5q4 0 18 -0.5t20 0t16 3t15 8.5t7 16q16 77 48 231.5t48 231.5q19 91 19 146zM1498 575q0 -7 -7.5 -13.5t-15.5 -6.5 l-6 1q-22 3 -62 11t-72 12.5t-63 4.5q-167 0 -351 -93q-15 -8 -21 -27q-10 -36 -24.5 -105.5t-22.5 -100.5q-23 -91 -70 -179.5t-112.5 -164.5t-154.5 -123t-185 -47q-135 0 -214.5 83.5t-79.5 219.5q0 53 19.5 117t63 116.5t97.5 52.5q38 0 120 -33.5t83 -61.5 q0 -1 -16.5 -12.5t-39.5 -31t-46 -44.5t-39 -61t-16 -74q0 -33 16.5 -53t48.5 -20q45 0 85 31.5t66.5 78t48 105.5t32.5 107t16 90v9q0 2 -3.5 3.5t-8.5 1.5h-10t-10 -0.5t-6 -0.5q-227 0 -352 122.5t-125 348.5q0 108 34.5 221t96 210t156 167.5t204.5 89.5q52 9 106 9 q374 0 374 -360q0 -98 -38 -273t-43 -211l3 -3q101 57 182.5 88t167.5 31q22 0 53 -13q19 -7 80 -102.5t61 -116.5z" />
+<glyph unicode="&#xf2a7;" horiz-adv-x="1664" d="M831 863q32 0 59 -18l222 -148q61 -40 110 -97l146 -170q40 -46 29 -106l-72 -413q-6 -32 -29.5 -53.5t-55.5 -25.5l-527 -56l-352 -32h-9q-39 0 -67.5 28t-28.5 68q0 37 27 64t65 32l260 32h-448q-41 0 -69.5 30t-26.5 71q2 39 32 65t69 26l442 1l-521 64q-41 5 -66 37 t-19 73q6 35 34.5 57.5t65.5 22.5h10l481 -60l-351 94q-38 10 -62 41.5t-18 68.5q6 36 33 58.5t62 22.5q6 0 20 -2l448 -96l217 -37q1 0 3 -0.5t3 -0.5q23 0 30.5 23t-12.5 36l-186 125q-35 23 -42 63.5t18 73.5q27 38 76 38zM761 661l186 -125l-218 37l-5 2l-36 38 l-238 262q-1 1 -2.5 3.5t-2.5 3.5q-24 31 -18.5 70t37.5 64q31 23 68 17.5t64 -33.5l142 -147l-4 -4t-5 -4q-32 -45 -23 -99t55 -85zM1648 1115l15 -266q4 -73 -11 -147l-48 -219q-12 -59 -67 -87l-106 -54q2 62 -39 109l-146 170q-53 61 -117 103l-222 148q-34 23 -76 23 q-51 0 -88 -37l-235 312q-25 33 -18 73.5t41 63.5q33 22 71.5 14t62.5 -40l266 -352l-262 455q-21 35 -10.5 75t47.5 59q35 18 72.5 6t57.5 -46l241 -420l-136 337q-15 35 -4.5 74t44.5 56q37 19 76 6t56 -51l193 -415l101 -196q8 -15 23 -17.5t27 7.5t11 26l-12 224 q-2 41 26 71t69 31q39 0 67 -28.5t30 -67.5z" />
+<glyph unicode="&#xf2a8;" horiz-adv-x="1792" d="M335 180q-2 0 -6 2q-86 57 -168.5 145t-139.5 180q-21 30 -21 69q0 9 2 19t4 18t7 18t8.5 16t10.5 17t10 15t12 15.5t11 14.5q184 251 452 365q-110 198 -110 211q0 19 17 29q116 64 128 64q18 0 28 -16l124 -229q92 19 192 19q266 0 497.5 -137.5t378.5 -369.5 q20 -31 20 -69t-20 -69q-91 -142 -218.5 -253.5t-278.5 -175.5q110 -198 110 -211q0 -20 -17 -29q-116 -64 -127 -64q-19 0 -29 16l-124 229l-64 119l-444 820l7 7q-58 -24 -99 -47q3 -5 127 -234t243 -449t119 -223q0 -7 -9 -9q-13 -3 -72 -3q-57 0 -60 7l-456 841 q-39 -28 -82 -68q24 -43 214 -393.5t190 -354.5q0 -10 -11 -10q-14 0 -82.5 22t-72.5 28l-106 197l-224 413q-44 -53 -78 -106q2 -3 18 -25t23 -34l176 -327q0 -10 -10 -10zM1165 282l49 -91q273 111 450 385q-180 277 -459 389q67 -64 103 -148.5t36 -176.5 q0 -106 -47 -200.5t-132 -157.5zM848 896q0 -20 14 -34t34 -14q86 0 147 -61t61 -147q0 -20 14 -34t34 -14t34 14t14 34q0 126 -89 215t-215 89q-20 0 -34 -14t-14 -34zM1214 961l-9 4l7 -7z" />
+<glyph unicode="&#xf2a9;" horiz-adv-x="1280" d="M1050 430q0 -215 -147 -374q-148 -161 -378 -161q-232 0 -378 161q-147 159 -147 374q0 147 68 270.5t189 196.5t268 73q96 0 182 -31q-32 -62 -39 -126q-66 28 -143 28q-167 0 -280.5 -123t-113.5 -291q0 -170 112.5 -288.5t281.5 -118.5t281 118.5t112 288.5 q0 89 -32 166q66 13 123 49q41 -98 41 -212zM846 619q0 -192 -79.5 -345t-238.5 -253l-14 -1q-29 0 -62 5q83 32 146.5 102.5t99.5 154.5t58.5 189t30 192.5t7.5 178.5q0 69 -3 103q55 -160 55 -326zM791 947v-2q-73 214 -206 440q88 -59 142.5 -186.5t63.5 -251.5z M1035 744q-83 0 -160 75q218 120 290 247q19 37 21 56q-42 -94 -139.5 -166.5t-204.5 -97.5q-35 54 -35 113q0 37 17 79t43 68q46 44 157 74q59 16 106 58.5t74 100.5q74 -105 74 -253q0 -109 -24 -170q-32 -77 -88.5 -130.5t-130.5 -53.5z" />
+<glyph unicode="&#xf2aa;" d="M1050 495q0 78 -28 147q-41 -25 -85 -34q22 -50 22 -114q0 -117 -77 -198.5t-193 -81.5t-193.5 81.5t-77.5 198.5q0 115 78 199.5t193 84.5q53 0 98 -19q4 43 27 87q-60 21 -125 21q-154 0 -257.5 -108.5t-103.5 -263.5t103.5 -261t257.5 -106t257.5 106.5t103.5 260.5z M872 850q2 -24 2 -71q0 -63 -5 -123t-20.5 -132.5t-40.5 -130t-68.5 -106t-100.5 -70.5q21 -3 42 -3h10q219 139 219 411q0 116 -38 225zM872 850q-4 80 -44 171.5t-98 130.5q92 -156 142 -302zM1207 955q0 102 -51 174q-41 -86 -124 -109q-69 -19 -109 -53.5t-40 -99.5 q0 -40 24 -77q74 17 140.5 67t95.5 115q-4 -52 -74.5 -111.5t-138.5 -97.5q52 -52 110 -52q51 0 90 37t60 90q17 43 17 117zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf2ab;" d="M1279 388q0 22 -22 27q-67 15 -118 59t-80 108q-7 19 -7 25q0 15 19.5 26t43 17t43 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-12 0 -32 -8t-31 -8q-4 0 -12 2q5 95 5 114q0 79 -17 114q-36 78 -103 121.5t-152 43.5q-199 0 -275 -165q-17 -35 -17 -114q0 -19 5 -114 q-4 -2 -14 -2q-12 0 -32 7.5t-30 7.5q-21 0 -38.5 -12t-17.5 -32q0 -21 19.5 -35.5t43 -20.5t43 -17t19.5 -26q0 -6 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -46 137 -68q2 -5 6 -26t11.5 -30.5t23.5 -9.5q12 0 37.5 4.5t39.5 4.5q35 0 67 -15t54 -32.5t57.5 -32.5 t76.5 -15q43 0 79 15t57.5 32.5t53.5 32.5t67 15q14 0 39.5 -4t38.5 -4q16 0 23 10t11 30t6 25q137 22 137 68zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf2ac;" horiz-adv-x="1664" d="M848 1408q134 1 240.5 -68.5t163.5 -192.5q27 -58 27 -179q0 -47 -9 -191q14 -7 28 -7q18 0 51 13.5t51 13.5q29 0 56 -18t27 -46q0 -32 -31.5 -54t-69 -31.5t-69 -29t-31.5 -47.5q0 -15 12 -43q37 -82 102.5 -150t144.5 -101q28 -12 80 -23q28 -6 28 -35 q0 -70 -219 -103q-7 -11 -11 -39t-14 -46.5t-33 -18.5q-20 0 -62 6.5t-64 6.5q-37 0 -62 -5q-32 -5 -63 -22.5t-58 -38t-58 -40.5t-76 -33.5t-99 -13.5q-52 0 -96.5 13.5t-75 33.5t-57.5 40.5t-58 38t-62 22.5q-26 5 -63 5q-24 0 -65.5 -7.5t-58.5 -7.5q-25 0 -35 18.5 t-14 47.5t-11 40q-219 33 -219 103q0 29 28 35q52 11 80 23q78 32 144.5 101t102.5 150q12 28 12 43q0 28 -31.5 47.5t-69.5 29.5t-69.5 31.5t-31.5 52.5q0 27 26 45.5t55 18.5q15 0 48 -13t53 -13q18 0 32 7q-9 142 -9 190q0 122 27 180q64 137 172 198t264 63z" />
+<glyph unicode="&#xf2ad;" d="M1280 388q0 22 -22 27q-67 14 -118 58t-80 109q-7 14 -7 25q0 15 19.5 26t42.5 17t42.5 20.5t19.5 36.5q0 19 -18.5 31.5t-38.5 12.5q-11 0 -31 -8t-32 -8q-4 0 -12 2q5 63 5 115q0 78 -17 114q-36 78 -102.5 121.5t-152.5 43.5q-198 0 -275 -165q-18 -38 -18 -115 q0 -38 6 -114q-10 -2 -15 -2q-11 0 -31.5 8t-30.5 8q-20 0 -37.5 -12.5t-17.5 -32.5q0 -21 19.5 -35.5t42.5 -20.5t42.5 -17t19.5 -26q0 -11 -7 -25q-64 -138 -198 -167q-22 -5 -22 -27q0 -47 138 -69q2 -5 6 -26t11 -30.5t23 -9.5q13 0 38.5 5t38.5 5q35 0 67.5 -15 t54.5 -32.5t57.5 -32.5t76.5 -15q43 0 79 15t57.5 32.5t54 32.5t67.5 15q13 0 39 -4.5t39 -4.5q15 0 22.5 9.5t11.5 31t5 24.5q138 22 138 69zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf2ae;" horiz-adv-x="2304" d="M2304 1536q-69 -46 -125 -92t-89 -81t-59.5 -71.5t-37.5 -57.5t-22 -44.5t-14 -29.5q-10 -18 -35.5 -136.5t-48.5 -164.5q-15 -29 -50 -60.5t-67.5 -50.5t-72.5 -41t-48 -28q-47 -31 -151 -231q-341 14 -630 -158q-92 -53 -303 -179q47 16 86 31t55 22l15 7 q71 27 163 64.5t133.5 53.5t108 34.5t142.5 31.5q186 31 465 -7q1 0 10 -3q11 -6 14 -17t-3 -22l-194 -345q-15 -29 -47 -22q-128 24 -354 24q-146 0 -402 -44.5t-392 -46.5q-82 -1 -149 13t-107 37t-61 40t-33 34l-1 1v2q0 6 6 6q138 0 371 55q192 366 374.5 524t383.5 158 q5 0 14.5 -0.5t38 -5t55 -12t61.5 -24.5t63 -39.5t54 -59t40 -82.5l102 177q2 4 21 42.5t44.5 86.5t61 109.5t84 133.5t100.5 137q66 82 128 141.5t121.5 96.5t92.5 53.5t88 39.5z" />
+<glyph unicode="&#xf2b0;" d="M1322 640q0 -45 -5 -76l-236 14l224 -78q-19 -73 -58 -141l-214 103l177 -158q-44 -61 -107 -108l-157 178l103 -215q-61 -37 -140 -59l-79 228l14 -240q-38 -6 -76 -6t-76 6l14 238l-78 -226q-74 19 -140 59l103 215l-157 -178q-59 43 -108 108l178 158l-214 -104 q-39 69 -58 141l224 79l-237 -14q-5 42 -5 76q0 35 5 77l238 -14l-225 79q19 73 58 140l214 -104l-177 159q46 61 107 108l158 -178l-103 215q67 39 140 58l77 -224l-13 236q36 6 75 6q38 0 76 -6l-14 -237l78 225q74 -19 140 -59l-103 -214l158 178q61 -47 107 -108 l-177 -159l213 104q37 -62 58 -141l-224 -78l237 14q5 -31 5 -77zM1352 640q0 160 -78.5 295.5t-213 214t-292.5 78.5q-119 0 -227 -46.5t-186.5 -125t-124.5 -187.5t-46 -229q0 -119 46 -228t124.5 -187.5t186.5 -125t227 -46.5q158 0 292.5 78.5t213 214t78.5 294.5z M1425 1023v-766l-657 -383l-657 383v766l657 383zM768 -183l708 412v823l-708 411l-708 -411v-823zM1536 1088v-896l-768 -448l-768 448v896l768 448z" />
+<glyph unicode="&#xf2b1;" horiz-adv-x="1664" d="M339 1318h691l-26 -72h-665q-110 0 -188.5 -79t-78.5 -189v-771q0 -95 60.5 -169.5t153.5 -93.5q23 -5 98 -5v-72h-45q-140 0 -239.5 100t-99.5 240v771q0 140 99.5 240t239.5 100zM1190 1536h247l-482 -1294q-23 -61 -40.5 -103.5t-45 -98t-54 -93.5t-64.5 -78.5 t-79.5 -65t-95.5 -41t-116 -18.5v195q163 26 220 182q20 52 20 105q0 54 -20 106l-285 733h228l187 -585zM1664 978v-1111h-795q37 55 45 73h678v1038q0 85 -49.5 155t-129.5 99l25 67q101 -34 163.5 -123.5t62.5 -197.5z" />
+<glyph unicode="&#xf2b2;" horiz-adv-x="1792" d="M852 1227q0 -29 -17 -52.5t-45 -23.5t-45 23.5t-17 52.5t17 52.5t45 23.5t45 -23.5t17 -52.5zM688 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50 -21.5t-20 -51.5v-114q0 -30 20.5 -52t49.5 -22q30 0 50.5 22t20.5 52zM860 -149v114q0 30 -20 51.5t-50 21.5t-50.5 -21.5 t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22q29 0 49.5 22t20.5 52zM1034 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1208 -149v114q0 30 -20.5 51.5t-50.5 21.5t-50.5 -21.5t-20.5 -51.5v-114 q0 -30 20.5 -52t50.5 -22t50.5 22t20.5 52zM1476 535q-84 -160 -232 -259.5t-323 -99.5q-123 0 -229.5 51.5t-178.5 137t-113 197.5t-41 232q0 88 21 174q-104 -175 -104 -390q0 -162 65 -312t185 -251q30 57 91 57q56 0 86 -50q32 50 87 50q56 0 86 -50q32 50 87 50t87 -50 q30 50 86 50q28 0 52.5 -15.5t37.5 -40.5q112 94 177 231.5t73 287.5zM1326 564q0 75 -72 75q-17 0 -47 -6q-95 -19 -149 -19q-226 0 -226 243q0 86 30 204q-83 -127 -83 -275q0 -150 89 -260.5t235 -110.5q111 0 210 70q13 48 13 79zM884 1223q0 50 -32 89.5t-81 39.5 t-81 -39.5t-32 -89.5q0 -51 31.5 -90.5t81.5 -39.5t81.5 39.5t31.5 90.5zM1513 884q0 96 -37.5 179t-113 137t-173.5 54q-77 0 -149 -35t-127 -94q-48 -159 -48 -268q0 -104 45.5 -157t147.5 -53q53 0 142 19q36 6 53 6q51 0 77.5 -28t26.5 -80q0 -26 -4 -46 q75 68 117.5 165.5t42.5 200.5zM1792 667q0 -111 -33.5 -249.5t-93.5 -204.5q-58 -64 -195 -142.5t-228 -104.5l-4 -1v-114q0 -43 -29.5 -75t-72.5 -32q-56 0 -86 50q-32 -50 -87 -50t-87 50q-30 -50 -86 -50q-55 0 -87 50q-30 -50 -86 -50q-47 0 -75 33.5t-28 81.5 q-90 -68 -198 -68q-118 0 -211 80q54 1 106 20q-113 31 -182 127q32 -7 71 -7q89 0 164 46q-192 192 -240 306q-24 56 -24 160q0 57 9 125.5t31.5 146.5t55 141t86.5 105t120 42q59 0 81 -52q19 29 42 54q2 3 12 13t13 16q10 15 23 38t25 42t28 39q87 111 211.5 177 t260.5 66q35 0 62 -4q59 64 146 64q83 0 140 -57q5 -5 5 -12q0 -5 -6 -13.5t-12.5 -16t-16 -17l-10.5 -10.5q17 -6 36 -18t19 -24q0 -6 -16 -25q157 -138 197 -378q25 30 60 30q45 0 100 -49q90 -80 90 -279z" />
+<glyph unicode="&#xf2b3;" d="M917 631q0 33 -6 64h-362v-132h217q-12 -76 -74.5 -120.5t-142.5 -44.5q-99 0 -169 71.5t-70 170.5t70 170.5t169 71.5q93 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585h109v110 h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf2b4;" d="M1536 1024v-839q0 -48 -49 -62q-174 -52 -338 -52q-73 0 -215.5 29.5t-227.5 29.5q-164 0 -370 -48v-338h-160v1368q-63 25 -101 81t-38 124q0 91 64 155t155 64t155 -64t64 -155q0 -68 -38 -124t-101 -81v-68q190 44 343 44q99 0 198 -15q14 -2 111.5 -22.5t149.5 -20.5 q77 0 165 18q11 2 80 21t89 19q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf2b5;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2b6;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2b7;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2b8;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2b9;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2ba;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2bb;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2bc;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2bd;" horiz-adv-x="1792" />
+<glyph unicode="&#xf2be;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/doc/doxygen/fonts/fontawesome-webfont.ttf b/doc/doxygen/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..f221e50
Binary files /dev/null and b/doc/doxygen/fonts/fontawesome-webfont.ttf differ
diff --git a/doc/doxygen/fonts/fontawesome-webfont.woff b/doc/doxygen/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..6e7483c
Binary files /dev/null and b/doc/doxygen/fonts/fontawesome-webfont.woff differ
diff --git a/doc/doxygen/fonts/fontawesome-webfont.woff2 b/doc/doxygen/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..7eb74fd
Binary files /dev/null and b/doc/doxygen/fonts/fontawesome-webfont.woff2 differ
diff --git a/doc/doxygen/fonts/glyphicons-halflings-regular.eot b/doc/doxygen/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..b93a495
Binary files /dev/null and b/doc/doxygen/fonts/glyphicons-halflings-regular.eot differ
diff --git a/doc/doxygen/fonts/glyphicons-halflings-regular.svg b/doc/doxygen/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..94fb549
--- /dev/null
+++ b/doc/doxygen/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?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></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/doc/doxygen/fonts/glyphicons-halflings-regular.ttf b/doc/doxygen/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..1413fc6
Binary files /dev/null and b/doc/doxygen/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/doc/doxygen/fonts/glyphicons-halflings-regular.woff b/doc/doxygen/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..9e61285
Binary files /dev/null and b/doc/doxygen/fonts/glyphicons-halflings-regular.woff differ
diff --git a/doc/doxygen/fonts/glyphicons-halflings-regular.woff2 b/doc/doxygen/fonts/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000..64539b5
Binary files /dev/null and b/doc/doxygen/fonts/glyphicons-halflings-regular.woff2 differ
diff --git a/doc/doxygen/footer.html b/doc/doxygen/footer.html
new file mode 100644
index 0000000..94393d6
--- /dev/null
+++ b/doc/doxygen/footer.html
@@ -0,0 +1,17 @@
+<!-- HTML footer for doxygen 1.8.8-->
+<!-- start footer part -->
+<!--BEGIN GENERATE_TREEVIEW-->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+
+</div>
+<!--END GENERATE_TREEVIEW-->
+</div>
+</div>
+</div>
+</div>
+</div>
+<!--BEGIN !GENERATE_TREEVIEW-->
+
+<!--END !GENERATE_TREEVIEW-->
+</body>
+</html>
diff --git a/doc/doxygen/header.html b/doc/doxygen/header.html
new file mode 100644
index 0000000..6457a60
--- /dev/null
+++ b/doc/doxygen/header.html
@@ -0,0 +1,47 @@
+<!-- HTML header for doxygen 1.8.8-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <!-- For Mobile Devices -->
+        <meta name="viewport" content="width=device-width, initial-scale=1">
+
+        <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+        <meta name="generator" content="Doxygen $doxygenversion"/>
+        <link href="$relpath^bootstrap.min.css" rel="stylesheet">
+        <!--<link href="http://stratifylabs.co/assets/themes/twitter/bootstrap3/css/bootstrap.min.css" rel="stylesheet">-->
+        <script src="$relpath^js/jquery-3.0.0.min.js"></script>
+        <script src="$relpath^js/bootstrap.min.js"></script>
+        <link href="$relpath^css/font-awesome.min.css" rel="stylesheet">
+        <link href="$relpath^css/style.css" rel="stylesheet">
+        <link href="$relpath^css/syntax.css" rel="stylesheet">
+        <script src="$relpath^js/application.js"></script>
+
+
+        <!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->
+        <!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->
+        <!--<link href="$relpath^tabs.css" rel="stylesheet" type="text/css"/>-->
+        <script type="text/javascript" src="$relpath^dynsections.js"></script>
+
+        $treeview
+        $search
+        $mathjax
+
+        <link href="$relpath^customdoxygen.css" rel="stylesheet" type="text/css" />
+        <script type="text/javascript" src="$relpath^doxy-boot.js"></script>
+    </head>
+    <body>
+        <nav class="navbar navbar-default" role="navigation">
+            <div class="container">
+                <div class="navbar-header">
+                    <a class="navbar-brand">$projectname $projectnumber</a>
+                </div>
+            </div>
+        </nav>
+        <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+            <div class="content" id="content">
+                <div class="container">
+                    <div class="row">
+                        <div class="col-sm-12 panel panel-default" style="padding-bottom: 15px;">
+                            <div style="margin-bottom: 15px;">
+<!-- end header part -->
diff --git a/doc/doxygen/index.doxygen b/doc/doxygen/index.doxygen
new file mode 100644
index 0000000..75357e7
--- /dev/null
+++ b/doc/doxygen/index.doxygen
@@ -0,0 +1,3 @@
+/*! \mainpage
+\htmlinclude welcome.html
+*/
diff --git a/doc/doxygen/js/application.js b/doc/doxygen/js/application.js
new file mode 100644
index 0000000..243fcc7
--- /dev/null
+++ b/doc/doxygen/js/application.js
@@ -0,0 +1,4 @@
+
+$(function () {
+	$('a').tooltip();
+});
diff --git a/doc/doxygen/js/bootstrap.js b/doc/doxygen/js/bootstrap.js
new file mode 100644
index 0000000..01fbbcb
--- /dev/null
+++ b/doc/doxygen/js/bootstrap.js
@@ -0,0 +1,2363 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+
+if (typeof jQuery === 'undefined') {
+  throw new Error('Bootstrap\'s JavaScript requires jQuery')
+}
+
++function ($) {
+  'use strict';
+  var version = $.fn.jquery.split(' ')[0].split('.')
+  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {
+    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')
+  }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.3.6
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // http://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.3.6
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.3.6'
+
+  Alert.TRANSITION_DURATION = 150
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = $(selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.closest('.alert')
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.3.6
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.3.6'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state += 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      $el[val](data[state] == null ? this.options[state] : data[state])
+
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked')) changed = false
+        $parent.find('.active').removeClass('active')
+        this.$element.addClass('active')
+      } else if ($input.prop('type') == 'checkbox') {
+        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
+        this.$element.toggleClass('active')
+      }
+      $input.prop('checked', this.$element.hasClass('active'))
+      if (changed) $input.trigger('change')
+    } else {
+      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+      this.$element.toggleClass('active')
+    }
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document)
+    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      var $btn = $(e.target)
+      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+      Plugin.call($btn, 'toggle')
+      if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
+    })
+    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+    })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.3.6
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      = null
+    this.sliding     = null
+    this.interval    = null
+    this.$active     = null
+    this.$items      = null
+
+    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.3.6'
+
+  Carousel.TRANSITION_DURATION = 600
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true,
+    keyboard: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    if (/input|textarea/i.test(e.target.tagName)) return
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.getItemForDirection = function (direction, active) {
+    var activeIndex = this.getItemIndex(active)
+    var willWrap = (direction == 'prev' && activeIndex === 0)
+                || (direction == 'next' && activeIndex == (this.$items.length - 1))
+    if (willWrap && !this.options.wrap) return active
+    var delta = direction == 'prev' ? -1 : 1
+    var itemIndex = (activeIndex + delta) % this.$items.length
+    return this.$items.eq(itemIndex)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || this.getItemForDirection(type, $active)
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var that      = this
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      $next[0].offsetWidth // force reflow
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  var clickHandler = function (e) {
+    var href
+    var $this   = $(this)
+    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+    if (!$target.hasClass('carousel')) return
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  }
+
+  $(document)
+    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.3.6
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
+                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
+    this.transitioning = null
+
+    if (this.options.parent) {
+      this.$parent = this.getParent()
+    } else {
+      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+    }
+
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.3.6'
+
+  Collapse.TRANSITION_DURATION = 350
+
+  Collapse.DEFAULTS = {
+    toggle: true
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var activesData
+    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    if (actives && actives.length) {
+      Plugin.call(actives, 'hide')
+      activesData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+      .attr('aria-expanded', true)
+
+    this.$trigger
+      .removeClass('collapsed')
+      .attr('aria-expanded', true)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse in')
+      .attr('aria-expanded', false)
+
+    this.$trigger
+      .addClass('collapsed')
+      .attr('aria-expanded', false)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse')
+        .trigger('hidden.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+  Collapse.prototype.getParent = function () {
+    return $(this.options.parent)
+      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+      .each($.proxy(function (i, element) {
+        var $element = $(element)
+        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+      }, this))
+      .end()
+  }
+
+  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+    var isOpen = $element.hasClass('in')
+
+    $element.attr('aria-expanded', isOpen)
+    $trigger
+      .toggleClass('collapsed', !isOpen)
+      .attr('aria-expanded', isOpen)
+  }
+
+  function getTargetFromTrigger($trigger) {
+    var href
+    var target = $trigger.attr('data-target')
+      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+    return $(target)
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var $this   = $(this)
+
+    if (!$this.attr('data-target')) e.preventDefault()
+
+    var $target = getTargetFromTrigger($this)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $this.data()
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.3.6
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.3.6'
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector && $(selector)
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $this         = $(this)
+      var $parent       = getParent($this)
+      var relatedTarget = { relatedTarget: this }
+
+      if (!$parent.hasClass('open')) return
+
+      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
+
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.attr('aria-expanded', 'false')
+      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
+    })
+  }
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $(document.createElement('div'))
+          .addClass('dropdown-backdrop')
+          .insertAfter($(this))
+          .on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this
+        .trigger('focus')
+        .attr('aria-expanded', 'true')
+
+      $parent
+        .toggleClass('open')
+        .trigger($.Event('shown.bs.dropdown', relatedTarget))
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if (!isActive && e.which != 27 || isActive && e.which == 27) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.disabled):visible a'
+    var $items = $parent.find('.dropdown-menu' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index(e.target)
+
+    if (e.which == 38 && index > 0)                 index--         // up
+    if (e.which == 40 && index < $items.length - 1) index++         // down
+    if (!~index)                                    index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.3.6
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options             = options
+    this.$body               = $(document.body)
+    this.$element            = $(element)
+    this.$dialog             = this.$element.find('.modal-dialog')
+    this.$backdrop           = null
+    this.isShown             = null
+    this.originalBodyPad     = null
+    this.scrollbarWidth      = 0
+    this.ignoreBackdropClick = false
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION  = '3.3.6'
+
+  Modal.TRANSITION_DURATION = 300
+  Modal.BACKDROP_TRANSITION_DURATION = 150
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.setScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.escape()
+    this.resize()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
+      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
+        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
+      })
+    })
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      that.adjustDialog()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element.addClass('in')
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$dialog // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+    this.resize()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .off('click.dismiss.bs.modal')
+      .off('mouseup.dismiss.bs.modal')
+
+    this.$dialog.off('mousedown.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keydown.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.resize = function () {
+    if (this.isShown) {
+      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+    } else {
+      $(window).off('resize.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$body.removeClass('modal-open')
+      that.resetAdjustments()
+      that.resetScrollbar()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $(document.createElement('div'))
+        .addClass('modal-backdrop ' + animate)
+        .appendTo(this.$body)
+
+      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+        if (this.ignoreBackdropClick) {
+          this.ignoreBackdropClick = false
+          return
+        }
+        if (e.target !== e.currentTarget) return
+        this.options.backdrop == 'static'
+          ? this.$element[0].focus()
+          : this.hide()
+      }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  // these following methods are used to handle overflowing modals
+
+  Modal.prototype.handleUpdate = function () {
+    this.adjustDialog()
+  }
+
+  Modal.prototype.adjustDialog = function () {
+    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+    this.$element.css({
+      paddingLeft:  !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+    })
+  }
+
+  Modal.prototype.resetAdjustments = function () {
+    this.$element.css({
+      paddingLeft: '',
+      paddingRight: ''
+    })
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    var fullWindowWidth = window.innerWidth
+    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
+      var documentElementRect = document.documentElement.getBoundingClientRect()
+      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
+    }
+    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
+    this.scrollbarWidth = this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    this.originalBodyPad = document.body.style.paddingRight || ''
+    if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', this.originalBodyPad)
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal             = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
+    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.3.6
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       = null
+    this.options    = null
+    this.enabled    = null
+    this.timeout    = null
+    this.hoverState = null
+    this.$element   = null
+    this.inState    = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.3.6'
+
+  Tooltip.TRANSITION_DURATION = 150
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    }
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
+    this.inState   = { click: false, hover: false, focus: false }
+
+    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
+      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
+    }
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
+    }
+
+    if (self.tip().hasClass('in') || self.hoverState == 'in') {
+      self.hoverState = 'in'
+      return
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.isInStateTrue = function () {
+    for (var key in this.inState) {
+      if (this.inState[key]) return true
+    }
+
+    return false
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
+    }
+
+    if (self.isInStateTrue()) return
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+      this.$element.trigger('inserted.bs.' + this.type)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var viewportDim = this.getPosition(this.$viewport)
+
+        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
+                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
+                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
+                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        var prevHoverState = that.hoverState
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+
+        if (prevHoverState == 'out') that.leave(that)
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  += marginTop
+    offset.left += marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var isVertical          = /top|bottom/.test(placement)
+    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
+    this.arrow()
+      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+      .css(isVertical ? 'top' : 'left', '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function (callback) {
+    var that = this
+    var $tip = $(this.$tip)
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      that.$element
+        .removeAttr('aria-describedby')
+        .trigger('hidden.bs.' + that.type)
+      callback && callback()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && $tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+
+    var elRect    = el.getBoundingClientRect()
+    if (elRect.width == null) {
+      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+    }
+    var elOffset  = isBody ? { top: 0, left: 0 } : $element.offset()
+    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+    return $.extend({}, elRect, scroll, outerDims, elOffset)
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    if (!this.$tip) {
+      this.$tip = $(this.options.template)
+      if (this.$tip.length != 1) {
+        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
+      }
+    }
+    return this.$tip
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    if (e) {
+      self.inState.click = !self.inState.click
+      if (self.isInStateTrue()) self.enter(self)
+      else self.leave(self)
+    } else {
+      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+    }
+  }
+
+  Tooltip.prototype.destroy = function () {
+    var that = this
+    clearTimeout(this.timeout)
+    this.hide(function () {
+      that.$element.off('.' + that.type).removeData('bs.' + that.type)
+      if (that.$tip) {
+        that.$tip.detach()
+      }
+      that.$tip = null
+      that.$arrow = null
+      that.$viewport = null
+    })
+  }
+
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.3.6
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.3.6'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+    $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
+      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+    ](content)
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+            o.content.call($e[0]) :
+            o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.3.6
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    this.$body          = $(document.body)
+    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.3.6'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var that          = this
+    var offsetMethod  = 'offset'
+    var offsetBase    = 0
+
+    this.offsets      = []
+    this.targets      = []
+    this.scrollHeight = this.getScrollHeight()
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        that.offsets.push(this[0])
+        that.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop < offsets[0]) {
+      this.activeTarget = null
+      return this.clear()
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    this.clear()
+
+    var selector = this.selector +
+      '[data-target="' + target + '"],' +
+      this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+  ScrollSpy.prototype.clear = function () {
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.3.6
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    // jscs:disable requireDollarBeforejQueryAssignment
+    this.element = $(element)
+    // jscs:enable requireDollarBeforejQueryAssignment
+  }
+
+  Tab.VERSION = '3.3.6'
+
+  Tab.TRANSITION_DURATION = 150
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var $previous = $ul.find('.active:last a')
+    var hideEvent = $.Event('hide.bs.tab', {
+      relatedTarget: $this[0]
+    })
+    var showEvent = $.Event('show.bs.tab', {
+      relatedTarget: $previous[0]
+    })
+
+    $previous.trigger(hideEvent)
+    $this.trigger(showEvent)
+
+    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+    var $target = $(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $previous.trigger({
+        type: 'hidden.bs.tab',
+        relatedTarget: $this[0]
+      })
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: $previous[0]
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+          .removeClass('active')
+        .end()
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', false)
+
+      element
+        .addClass('active')
+        .find('[data-toggle="tab"]')
+          .attr('aria-expanded', true)
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu').length) {
+        element
+          .closest('li.dropdown')
+            .addClass('active')
+          .end()
+          .find('[data-toggle="tab"]')
+            .attr('aria-expanded', true)
+      }
+
+      callback && callback()
+    }
+
+    $active.length && transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  var clickHandler = function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  }
+
+  $(document)
+    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.3.6
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    this.$target = $(this.options.target)
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      = null
+    this.unpin        = null
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.3.6'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var targetHeight = this.$target.height()
+
+    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+    if (this.affixed == 'bottom') {
+      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+    }
+
+    var initializing   = this.affixed == null
+    var colliderTop    = initializing ? scrollTop : position.top
+    var colliderHeight = initializing ? targetHeight : height
+
+    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+    return false
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var height       = this.$element.height()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+    var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+    if (this.affixed != affix) {
+      if (this.unpin != null) this.$element.css('top', '')
+
+      var affixType = 'affix' + (affix ? '-' + affix : '')
+      var e         = $.Event(affixType + '.bs.affix')
+
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      this.affixed = affix
+      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+      this.$element
+        .removeClass(Affix.RESET)
+        .addClass(affixType)
+        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+    }
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - height - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/doc/doxygen/js/bootstrap.min.js b/doc/doxygen/js/bootstrap.min.js
new file mode 100644
index 0000000..e79c065
--- /dev/null
+++ b/doc/doxygen/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");
+d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/doc/doxygen/js/jquery-1.9.1.min.js b/doc/doxygen/js/jquery-1.9.1.min.js
new file mode 100644
index 0000000..006e953
--- /dev/null
+++ b/doc/doxygen/js/jquery-1.9.1.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery.min.map
+*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,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%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},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(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.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(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
\ No newline at end of file
diff --git a/doc/doxygen/js/jquery-2.2.4.min.js b/doc/doxygen/js/jquery-2.2.4.min.js
new file mode 100644
index 0000000..4024b66
--- /dev/null
+++ b/doc/doxygen/js/jquery-2.2.4.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(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 oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(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 ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c;
+}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&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 N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=N.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function W(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&T.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var X=/^(?:checkbox|radio)$/i,Y=/<([\w:-]+)/,Z=/^$|\/(?:java|ecma)script/i,$={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ea.test(f)?this.mouseHooks:da.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=d),3===a.target.nodeType&&(a.target=a.target.parentNode),h.filter?h.filter(a,g):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==ia()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===ia()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&n.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},n.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ga:ha):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:ha,isPropagationStopped:ha,isImmediatePropagationStopped:ha,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ga,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ga,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ga,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),n.fn.extend({on:function(a,b,c,d){return ja(this,a,b,c,d)},one:function(a,b,c,d){return ja(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ha),this.each(function(){n.event.remove(this,a,c,b)})}});var ka=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,la=/<script|<style|<link/i,ma=/checked\s*(?:[^=]|=\s*.checked.)/i,na=/^true\/(.*)/,oa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=wa[0].contentDocument,b.write(),b.close(),c=ya(a,b),wa.detach()),xa[a]=c),c}var Aa=/^margin/,Ba=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ca=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Ea=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ea.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ea.removeChild(g)}n.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f},reliableMarginRight:function(){var b,c=h.appendChild(d.createElement("div"));return c.style.cssText=h.style.cssText="-webkit-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",c.style.marginRight=c.style.width="0",h.style.width="1px",Ea.appendChild(g),b=!parseFloat(a.getComputedStyle(c).marginRight),Ea.removeChild(g),h.removeChild(c),b}})}}();function Fa(a,b,c){var d,e,f,g,h=a.style;return c=c||Ca(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Ba.test(g)&&Aa.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0!==g?g+"":g}function Ga(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ha=/^(none|table(?!-c[ea]).+)/,Ia={position:"absolute",visibility:"hidden",display:"block"},Ja={letterSpacing:"0",fontWeight:"400"},Ka=["Webkit","O","Moz","ms"],La=d.createElement("div").style;function Ma(a){if(a in La)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ka.length;while(c--)if(a=Ka[c]+b,a in La)return a}function Na(a,b,c){var d=T.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Oa(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Pa(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ca(a),g="border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Fa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ba.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Oa(a,b,c||(g?"border":"content"),d,f)+"px"}function Qa(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=N.get(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=N.access(d,"olddisplay",za(d.nodeName)))):(e=V(d),"none"===c&&e||N.set(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Fa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=T.exec(c))&&e[1]&&(c=W(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Ma(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Fa(a,b,d)),"normal"===e&&b in Ja&&(e=Ja[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Ha.test(n.css(a,"display"))&&0===a.offsetWidth?Da(a,Ia,function(){return Pa(a,b,d)}):Pa(a,b,d):void 0},set:function(a,c,d){var e,f=d&&Ca(a),g=d&&Oa(a,b,d,"border-box"===n.css(a,"boxSizing",!1,f),f);return g&&(e=T.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=n.css(a,b)),Na(a,c,g)}}}),n.cssHooks.marginLeft=Ga(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Fa(a,"marginLeft"))||a.getBoundingClientRect().left-Da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),n.cssHooks.marginRight=Ga(l.reliableMarginRight,function(a,b){return b?Da(a,{display:"inline-block"},Fa,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Aa.test(a)||(n.cssHooks[a+b].set=Na)}),n.fn.extend({css:function(a,b){return K(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ca(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return Qa(this,!0)},hide:function(){return Qa(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function Ra(a,b,c,d,e){return new Ra.prototype.init(a,b,c,d,e)}n.Tween=Ra,Ra.prototype={constructor:Ra,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=Ra.propHooks[this.prop];return a&&a.get?a.get(this):Ra.propHooks._default.get(this)},run:function(a){var b,c=Ra.propHooks[this.prop];return this.options.duration?this.pos=b=n.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):Ra.propHooks._default.set(this),this}},Ra.prototype.init.prototype=Ra.prototype,Ra.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},Ra.propHooks.scrollTop=Ra.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=Ra.prototype.init,n.fx.step={};var Sa,Ta,Ua=/^(?:toggle|show|hide)$/,Va=/queueHooks$/;function Wa(){return a.setTimeout(function(){Sa=void 0}),Sa=n.now()}function Xa(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=U[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function Ya(a,b,c){for(var d,e=(_a.tweeners[b]||[]).concat(_a.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function Za(a,b,c){var d,e,f,g,h,i,j,k,l=this,m={},o=a.style,p=a.nodeType&&V(a),q=N.get(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,l.always(function(){l.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=n.css(a,"display"),k="none"===j?N.get(a,"olddisplay")||za(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(o.display="inline-block")),c.overflow&&(o.overflow="hidden",l.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],Ua.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}m[d]=q&&q[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(m))"inline"===("none"===j?za(a.nodeName):j)&&(o.display=j);else{q?"hidden"in q&&(p=q.hidden):q=N.access(a,"fxshow",{}),f&&(q.hidden=!p),p?n(a).show():l.done(function(){n(a).hide()}),l.done(function(){var b;N.remove(a,"fxshow");for(b in m)n.style(a,b,m[b])});for(d in m)g=Ya(p?q[d]:0,d,l),d in q||(q[d]=g.start,p&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function $a(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],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 _a(a,b,c){var d,e,f=0,g=_a.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Sa||Wa(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:Sa||Wa(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for($a(k,j.opts.specialEasing);g>f;f++)if(d=_a.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,Ya,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(_a,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return W(c.elem,a,T.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],_a.tweeners[c]=_a.tweeners[c]||[],_a.tweeners[c].unshift(b)},prefilters:[Za],prefilter:function(a,b){b?_a.prefilters.unshift(a):_a.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=_a(this,n.extend({},a),f);(e||N.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=N.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Va.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=N.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(Xa(b,!0),a,d,e)}}),n.each({slideDown:Xa("show"),slideUp:Xa("hide"),slideToggle:Xa("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=0,c=n.timers;for(Sa=n.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||n.fx.stop(),Sa=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){Ta||(Ta=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(Ta),Ta=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,b.disabled=!0,l.optDisabled=!c.disabled,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var ab,bb=n.expr.attrHandle;n.fn.extend({attr:function(a,b){return K(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ab:void 0)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)}}),ab={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=bb[b]||n.find.attr;bb[b]=function(a,b,d){var e,f;return d||(f=bb[b],bb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,bb[b]=f),e}});var cb=/^(?:input|select|textarea|button)$/i,db=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return K(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[n.propFix[a]||a]})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),
+void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):cb.test(a.nodeName)||db.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this});var eb=/[\t\r\n\f]/g;function fb(a){return a.getAttribute&&a.getAttribute("class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,fb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,fb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=fb(c),d=1===c.nodeType&&(" "+e+" ").replace(eb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,fb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=fb(this),b&&N.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":N.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+fb(c)+" ").replace(eb," ").indexOf(b)>-1)return!0;return!1}});var gb=/\r/g,hb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(gb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(hb," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=n.inArray(n.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var ib=/^(?:focusinfocus|focusoutblur)$/;n.extend(n.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!ib.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},f||!o.trigger||o.trigger.apply(e,c)!==!1)){if(!f&&!o.noBubble&&!n.isWindow(e)){for(j=o.delegateType||q,ib.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:o.bindType||q,m=(N.get(h,"events")||{})[b.type]&&N.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&L(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!L(e)||l&&n.isFunction(e[q])&&!n.isWindow(e)&&(i=e[l],i&&(e[l]=null),n.event.triggered=q,e[q](),n.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b)}}),n.fn.extend({trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}}),n.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){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=N.access(d,b);e||d.addEventListener(a,c,!0),N.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=N.access(d,b)-1;e?N.access(d,b,e):(d.removeEventListener(a,c,!0),N.remove(d,b))}}});var jb=a.location,kb=n.now(),lb=/\?/;n.parseJSON=function(a){return JSON.parse(a+"")},n.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var mb=/#.*$/,nb=/([?&])_=[^&]*/,ob=/^(.*?):[ \t]*([^\r\n]*)$/gm,pb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,qb=/^(?:GET|HEAD)$/,rb=/^\/\//,sb={},tb={},ub="*/".concat("*"),vb=d.createElement("a");vb.href=jb.href;function wb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function xb(a,b,c,d){var e={},f=a===tb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function yb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&n.extend(!0,a,d),a}function zb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Ab(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:jb.href,type:"GET",isLocal:pb.test(jb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":ub,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?yb(yb(a,n.ajaxSettings),b):yb(n.ajaxSettings,a)},ajaxPrefilter:wb(sb),ajaxTransport:wb(tb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m=n.ajaxSetup({},c),o=m.context||m,p=m.context&&(o.nodeType||o.jquery)?n(o):n.event,q=n.Deferred(),r=n.Callbacks("once memory"),s=m.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,getResponseHeader:function(a){var b;if(2===v){if(!h){h={};while(b=ob.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===v?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return v||(a=u[c]=u[c]||a,t[a]=b),this},overrideMimeType:function(a){return v||(m.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>v)for(b in a)s[b]=[s[b],a[b]];else x.always(a[x.status]);return this},abort:function(a){var b=a||w;return e&&e.abort(b),z(0,b),this}};if(q.promise(x).complete=r.add,x.success=x.done,x.error=x.fail,m.url=((b||m.url||jb.href)+"").replace(mb,"").replace(rb,jb.protocol+"//"),m.type=c.method||c.type||m.method||m.type,m.dataTypes=n.trim(m.dataType||"*").toLowerCase().match(G)||[""],null==m.crossDomain){j=d.createElement("a");try{j.href=m.url,j.href=j.href,m.crossDomain=vb.protocol+"//"+vb.host!=j.protocol+"//"+j.host}catch(y){m.crossDomain=!0}}if(m.data&&m.processData&&"string"!=typeof m.data&&(m.data=n.param(m.data,m.traditional)),xb(sb,m,c,x),2===v)return x;k=n.event&&m.global,k&&0===n.active++&&n.event.trigger("ajaxStart"),m.type=m.type.toUpperCase(),m.hasContent=!qb.test(m.type),f=m.url,m.hasContent||(m.data&&(f=m.url+=(lb.test(f)?"&":"?")+m.data,delete m.data),m.cache===!1&&(m.url=nb.test(f)?f.replace(nb,"$1_="+kb++):f+(lb.test(f)?"&":"?")+"_="+kb++)),m.ifModified&&(n.lastModified[f]&&x.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&x.setRequestHeader("If-None-Match",n.etag[f])),(m.data&&m.hasContent&&m.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",m.contentType),x.setRequestHeader("Accept",m.dataTypes[0]&&m.accepts[m.dataTypes[0]]?m.accepts[m.dataTypes[0]]+("*"!==m.dataTypes[0]?", "+ub+"; q=0.01":""):m.accepts["*"]);for(l in m.headers)x.setRequestHeader(l,m.headers[l]);if(m.beforeSend&&(m.beforeSend.call(o,x,m)===!1||2===v))return x.abort();w="abort";for(l in{success:1,error:1,complete:1})x[l](m[l]);if(e=xb(tb,m,c,x)){if(x.readyState=1,k&&p.trigger("ajaxSend",[x,m]),2===v)return x;m.async&&m.timeout>0&&(i=a.setTimeout(function(){x.abort("timeout")},m.timeout));try{v=1,e.send(t,z)}catch(y){if(!(2>v))throw y;z(-1,y)}}else z(-1,"No Transport");function z(b,c,d,h){var j,l,t,u,w,y=c;2!==v&&(v=2,i&&a.clearTimeout(i),e=void 0,g=h||"",x.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(u=zb(m,x,d)),u=Ab(m,u,x,j),j?(m.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(n.lastModified[f]=w),w=x.getResponseHeader("etag"),w&&(n.etag[f]=w)),204===b||"HEAD"===m.type?y="nocontent":304===b?y="notmodified":(y=u.state,l=u.data,t=u.error,j=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),x.status=b,x.statusText=(c||y)+"",j?q.resolveWith(o,[l,y,x]):q.rejectWith(o,[x,y,t]),x.statusCode(s),s=void 0,k&&p.trigger(j?"ajaxSuccess":"ajaxError",[x,m,j?l:t]),r.fireWith(o,[x,y]),k&&(p.trigger("ajaxComplete",[x,m]),--n.active||n.event.trigger("ajaxStop")))}return x},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){var b;return n.isFunction(a)?this.each(function(b){n(this).wrapAll(a.call(this,b))}):(this[0]&&(b=n(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this)},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return!n.expr.filters.visible(a)},n.expr.filters.visible=function(a){return a.offsetWidth>0||a.offsetHeight>0||a.getClientRects().length>0};var Bb=/%20/g,Cb=/\[\]$/,Db=/\r?\n/g,Eb=/^(?:submit|button|image|reset|file)$/i,Fb=/^(?:input|select|textarea|keygen)/i;function Gb(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Cb.test(a)?d(a,e):Gb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Gb(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Gb(c,a[c],b,e);return d.join("&").replace(Bb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Fb.test(this.nodeName)&&!Eb.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Db,"\r\n")}}):{name:b.name,value:c.replace(Db,"\r\n")}}).get()}}),n.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Hb={0:200,1223:204},Ib=n.ajaxSettings.xhr();l.cors=!!Ib&&"withCredentials"in Ib,l.ajax=Ib=!!Ib,n.ajaxTransport(function(b){var c,d;return l.cors||Ib&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Hb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=n("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Jb=[],Kb=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Jb.pop()||n.expando+"_"+kb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Kb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Kb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Kb,"$1"+e):b.jsonp!==!1&&(b.url+=(lb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Jb.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ca([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var Lb=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&Lb)return Lb.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function Mb(a){return n.isWindow(a)?a:9===a.nodeType&&a.defaultView}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d=this[0],e={top:0,left:0},f=d&&d.ownerDocument;if(f)return b=f.documentElement,n.contains(b,d)?(e=d.getBoundingClientRect(),c=Mb(f),{top:e.top+c.pageYOffset-b.clientTop,left:e.left+c.pageXOffset-b.clientLeft}):e},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===n.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(d=a.offset()),d.top+=n.css(a[0],"borderTopWidth",!0),d.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-d.top-n.css(c,"marginTop",!0),left:b.left-d.left-n.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Ea})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;n.fn[a]=function(d){return K(this,function(a,d,e){var f=Mb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ga(l.pixelPosition,function(a,c){return c?(c=Fa(a,b),Ba.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return K(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)},size:function(){return this.length}}),n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var Nb=a.jQuery,Ob=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=Ob),b&&a.jQuery===n&&(a.jQuery=Nb),n},b||(a.jQuery=a.$=n),n});
diff --git a/doc/doxygen/js/jquery-3.0.0.min.js b/doc/doxygen/js/jquery-3.0.0.min.js
new file mode 100644
index 0000000..62d410d
--- /dev/null
+++ b/doc/doxygen/js/jquery-3.0.0.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.0.0 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.0.0",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:f.call(this)},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return a&&"[object Object]"===k.call(a)?(b=e(a))?(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n):!0:!1},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;d>f;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;return"string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a)?(d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e):void 0},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"===c||r.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\x00-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\x00"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(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 qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[0>c?c+b:c]}),even:pa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(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 va(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,e>i&&ya(a.slice(i,e)),f>e&&ya(a=a.slice(e)),f>e&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){if(r.isFunction(b))return r.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return r.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(C.test(b))return r.filter(b,a,c);b=r.filter(b,a)}return r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType})}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;d>b;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;d>b;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/\S+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(f>b)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(1>=b&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){
+return j.call(r(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:X.test(c)?JSON.parse(c):c}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),Z(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=Z(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&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 V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var $=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,_=new RegExp("^(?:([+-])=|)("+$+")([a-z%]*)$","i"),aa=["Top","Right","Bottom","Left"],ba=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},ca=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function da(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&_.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var ea={};function fa(a){var b,c=a.ownerDocument,d=a.nodeName,e=ea[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),ea[d]=e,e)}function ga(a,b){for(var c,d,e=[],f=0,g=a.length;g>f;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ba(d)&&(e[f]=fa(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;g>f;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ga(this,!0)},hide:function(){return ga(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ba(this)?r(this).show():r(this).hide()})}});var ha=/^(?:checkbox|radio)$/i,ia=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ja=/^$|\/(?:java|ecma)script/i,ka={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ka.optgroup=ka.option,ka.tbody=ka.tfoot=ka.colgroup=ka.caption=ka.thead,ka.th=ka.td;function la(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function ma(a,b){for(var c=0,d=a.length;d>c;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var na=/<|&#?\w+;/;function oa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;o>n;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(na.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ia.exec(f)||["",""])[1].toLowerCase(),i=ka[h]||ka._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=la(l.appendChild(f),"script"),j&&ma(g),c){k=0;while(f=g[k++])ja.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var pa=d.documentElement,qa=/^key/,ra=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,sa=/^([^.]*)(?:\.(.+)|)/;function ta(){return!0}function ua(){return!1}function va(){try{return d.activeElement}catch(a){}}function wa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)wa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ua;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(pa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=sa.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?r(e,this).index(i)>-1:r.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){return this.originalEvent?b(this.originalEvent):void 0}:function(){return this.originalEvent?this.originalEvent[a]:void 0},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==va()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===va()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&r.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ta:ua,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:ua,isPropagationStopped:ua,isImmediatePropagationStopped:ua,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ta,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ta,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ta,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&qa.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&ra.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return wa(this,a,b,c,d)},one:function(a,b,c,d){return wa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=ua),this.each(function(){r.event.remove(this,a,c,b)})}});var xa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ya=/<script|<style|<link/i,za=/checked\s*(?:[^=]|=\s*.checked.)/i,Aa=/^true\/(.*)/,Ba=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Ca(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Da(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ea(a){var b=Aa.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ga(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ha.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ha(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&za.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(m&&(e=oa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(la(e,"script"),Da),i=h.length;m>l;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,la(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Ea),l=0;i>l;l++)j=h[l],ja.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ba,""),k))}return a}function Ia(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(la(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&ma(la(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(xa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=la(h),f=la(a),d=0,e=f.length;e>d;d++)Ga(f[d],g[d]);if(b)if(c)for(f=f||la(a),g=g||la(h),d=0,e=f.length;e>d;d++)Fa(f[d],g[d]);else Fa(a,h);return g=la(h,"script"),g.length>0&&ma(g,!i&&la(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(la(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ya.test(a)&&!ka[(ia.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(la(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(la(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;f>=g;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ja=/^margin/,Ka=new RegExp("^("+$+")(?!px)[a-z%]+$","i"),La=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",pa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,pa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Ma(a,b,c){var d,e,f,g,h=a.style;return c=c||La(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&Ka.test(g)&&Ja.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Na(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Oa=/^(none|table(?!-c[ea]).+)/,Pa={position:"absolute",visibility:"hidden",display:"block"},Qa={letterSpacing:"0",fontWeight:"400"},Ra=["Webkit","Moz","ms"],Sa=d.createElement("div").style;function Ta(a){if(a in Sa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Ra.length;while(c--)if(a=Ra[c]+b,a in Sa)return a}function Ua(a,b,c){var d=_.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Va(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=r.css(a,c+aa[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+aa[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+aa[f]+"Width",!0,e))):(g+=r.css(a,"padding"+aa[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+aa[f]+"Width",!0,e)));return g}function Wa(a,b,c){var d,e=!0,f=La(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),0>=d||null==d){if(d=Ma(a,b,f),(0>d||null==d)&&(d=a.style[b]),Ka.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Va(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ma(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=_.exec(c))&&e[1]&&(c=da(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ta(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ma(a,b,d)),"normal"===e&&b in Qa&&(e=Qa[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){return c?!Oa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Wa(a,b,d):ca(a,Pa,function(){return Wa(a,b,d)}):void 0},set:function(a,c,d){var e,f=d&&La(a),g=d&&Va(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=_.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Ua(a,c,g)}}}),r.cssHooks.marginLeft=Na(o.reliableMarginLeft,function(a,b){return b?(parseFloat(Ma(a,"marginLeft"))||a.getBoundingClientRect().left-ca(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+aa[d]+b]=f[d]||f[d-2]||f[0];return e}},Ja.test(a)||(r.cssHooks[a+b].set=Ua)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=La(a),e=b.length;e>g;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Xa(a,b,c,d,e){return new Xa.prototype.init(a,b,c,d,e)}r.Tween=Xa,Xa.prototype={constructor:Xa,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Xa.propHooks[this.prop];return a&&a.get?a.get(this):Xa.propHooks._default.get(this)},run:function(a){var b,c=Xa.propHooks[this.prop];return this.options.duration?this.pos=b=r.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):Xa.propHooks._default.set(this),this}},Xa.prototype.init.prototype=Xa.prototype,Xa.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Xa.propHooks.scrollTop=Xa.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Xa.prototype.init,r.fx.step={};var Ya,Za,$a=/^(?:toggle|show|hide)$/,_a=/queueHooks$/;function ab(){Za&&(a.requestAnimationFrame(ab),r.fx.tick())}function bb(){return a.setTimeout(function(){Ya=void 0}),Ya=r.now()}function cb(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=aa[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function db(a,b,c){for(var d,e=(gb.tweeners[b]||[]).concat(gb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function eb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ba(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],$a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ga([a],!0),j=a.style.display||j,k=r.css(a,"display"),ga([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ga([a],!0),m.done(function(){p||ga([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=db(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function fb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],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 gb(a,b,c){var d,e,f=0,g=gb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ya||bb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ya||bb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(fb(k,j.opts.specialEasing);g>f;f++)if(d=gb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,db,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(gb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return da(c.elem,a,_.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;e>d;d++)c=a[d],gb.tweeners[c]=gb.tweeners[c]||[],gb.tweeners[c].unshift(b)},prefilters:[eb],prefilter:function(a,b){b?gb.prefilters.unshift(a):gb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in r.fx.speeds?r.fx.speeds[e.duration]:r.fx.speeds._default,null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ba).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=gb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&_a.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(cb(b,!0),a,d,e)}}),r.each({slideDown:cb("show"),slideUp:cb("hide"),slideToggle:cb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Ya=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Ya=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){Za||(Za=a.requestAnimationFrame?a.requestAnimationFrame(ab):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Za):a.clearInterval(Za),Za=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var hb,ib=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?hb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c);
+}}),hb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ib[b]||r.find.attr;ib[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=ib[g],ib[g]=e,e=null!=c(a,b,d)?g:null,ib[g]=f),e}});var jb=/^(?:input|select|textarea|button)$/i,kb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):jb.test(a.nodeName)||kb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});var lb=/[\t\r\n\f]/g;function mb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,mb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,mb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=mb(c),d=1===c.nodeType&&(" "+e+" ").replace(lb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=r.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,mb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=mb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(c)+" ").replace(lb," ").indexOf(b)>-1)return!0;return!1}});var nb=/\r/g,ob=/[\x20\t\r\n\f]+/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(nb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:r.trim(r.text(a)).replace(ob," ")}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){return r.isArray(b)?a.checked=r.inArray(r(a).val(),b)>-1:void 0}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?r.event.trigger(a,b,c,!0):void 0}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ha.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,""),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",0>b&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;return o.cors||Pb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=oa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=r.trim(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||pa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Na(o.pixelPosition,function(a,c){return c?(c=Ma(a,b),Ka.test(c)?r(a).position()[b]+"px":c):void 0})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
diff --git a/doc/doxygen/js/npm.js b/doc/doxygen/js/npm.js
new file mode 100644
index 0000000..bf6aa80
--- /dev/null
+++ b/doc/doxygen/js/npm.js
@@ -0,0 +1,13 @@
+// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
+require('../../js/transition.js')
+require('../../js/alert.js')
+require('../../js/button.js')
+require('../../js/carousel.js')
+require('../../js/collapse.js')
+require('../../js/dropdown.js')
+require('../../js/modal.js')
+require('../../js/tooltip.js')
+require('../../js/popover.js')
+require('../../js/scrollspy.js')
+require('../../js/tab.js')
+require('../../js/affix.js')
\ No newline at end of file
diff --git a/doc/doxygen/logo_lief_55.png b/doc/doxygen/logo_lief_55.png
new file mode 100644
index 0000000..2209fd8
Binary files /dev/null and b/doc/doxygen/logo_lief_55.png differ
diff --git a/doc/doxygen/welcome.html b/doc/doxygen/welcome.html
new file mode 100644
index 0000000..3c251a0
--- /dev/null
+++ b/doc/doxygen/welcome.html
@@ -0,0 +1,3 @@
+<p align="center" >
+<img width="40%" src="http://romainthomas.fr/logo_blue_with_name_500.png"/><br />
+</p>
diff --git a/doc/sphinx/Intro.rst b/doc/sphinx/Intro.rst
new file mode 100644
index 0000000..45e2551
--- /dev/null
+++ b/doc/sphinx/Intro.rst
@@ -0,0 +1,37 @@
+
+Introduction
+============
+
+The purpose of this project is to provide a cross platform library which can parse, modify and abstract ``ELF``, ``PE`` and ``MachO`` formats.
+
+Main features:
+
+  * Parser: LIEF can parse ``ELF``, ``PE``, ``MachO``. Moreover it provides an user-friendly API to access to format internals.
+  * Modify: LIEF enables to modify **some** parts of these formats
+  * Abstract: Three formats have common features like sections, symbols, entry point... LIEF factors them.
+  * API: LIEF can be used in C, C++ and Python
+
+The global architecture looks like this:
+
+.. image:: _static/archi.png
+   :height: 500px
+   :alt: alternate text
+   :align: center
+
+|
+
+
+In the architecture, each format has its own *namespace*, parser and builder.
+The parser takes a binary, library... as input and decompose it in LIEF object.
+For instance, the ``ELF``  format has segments, so ``ELF::Parser`` will parse segments to create ``ELF::Segment``. In the ``ELF::Binary`` class we will have a list of ``ELF::Segement`` which can be modified (change type, size, content...). Then the ``ELF::Builder`` will transform ``ELF::Binary`` into a valid executable.
+
+This process can be sum-up in the following figure:
+
+.. image:: _static/archi_elf.png
+   :height: 700px
+   :alt: alternate text
+   :align: center
+
+|
+
+
diff --git a/doc/sphinx/_static/archi.png b/doc/sphinx/_static/archi.png
new file mode 100644
index 0000000..a5f65ee
Binary files /dev/null and b/doc/sphinx/_static/archi.png differ
diff --git a/doc/sphinx/_static/archi_elf.png b/doc/sphinx/_static/archi_elf.png
new file mode 100644
index 0000000..e7fbcd3
Binary files /dev/null and b/doc/sphinx/_static/archi_elf.png differ
diff --git a/doc/sphinx/_static/data_handler.png b/doc/sphinx/_static/data_handler.png
new file mode 100644
index 0000000..bd8f563
Binary files /dev/null and b/doc/sphinx/_static/data_handler.png differ
diff --git a/doc/sphinx/_static/example.cpp b/doc/sphinx/_static/example.cpp
new file mode 100644
index 0000000..1f28f05
--- /dev/null
+++ b/doc/sphinx/_static/example.cpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <string>
+
+class MyClass {
+  public:
+    MyClass(void) : message_{"hello"} {};
+    MyClass(const std::string& message) : message_{message} {};
+    void say_hello(void) { std::cout << this->message_<< std::endl; }
+
+  private:
+    std::string message_;
+};
+
+
+int main(void) {
+  MyClass a{"Bonjour"};
+  a.say_hello();
+}
diff --git a/doc/sphinx/_static/favicon.ico b/doc/sphinx/_static/favicon.ico
new file mode 100644
index 0000000..765bcac
Binary files /dev/null and b/doc/sphinx/_static/favicon.ico differ
diff --git a/doc/sphinx/_static/iat3.png b/doc/sphinx/_static/iat3.png
new file mode 100644
index 0000000..6b96b96
Binary files /dev/null and b/doc/sphinx/_static/iat3.png differ
diff --git a/doc/sphinx/_static/iat4.png b/doc/sphinx/_static/iat4.png
new file mode 100644
index 0000000..f4da332
Binary files /dev/null and b/doc/sphinx/_static/iat4.png differ
diff --git a/doc/sphinx/_static/logo_blue.png b/doc/sphinx/_static/logo_blue.png
new file mode 100644
index 0000000..762cc25
Binary files /dev/null and b/doc/sphinx/_static/logo_blue.png differ
diff --git a/doc/sphinx/_static/logo_blue_412.png b/doc/sphinx/_static/logo_blue_412.png
new file mode 100644
index 0000000..875e33c
Binary files /dev/null and b/doc/sphinx/_static/logo_blue_412.png differ
diff --git a/doc/sphinx/_static/tutorial/03/hashme.png b/doc/sphinx/_static/tutorial/03/hashme.png
new file mode 100644
index 0000000..53d1b4a
Binary files /dev/null and b/doc/sphinx/_static/tutorial/03/hashme.png differ
diff --git a/doc/sphinx/_static/tutorial/03/hashme_obf.png b/doc/sphinx/_static/tutorial/03/hashme_obf.png
new file mode 100644
index 0000000..bf5e898
Binary files /dev/null and b/doc/sphinx/_static/tutorial/03/hashme_obf.png differ
diff --git a/doc/sphinx/_static/tutorial/05/pltgot.png b/doc/sphinx/_static/tutorial/05/pltgot.png
new file mode 100644
index 0000000..8fde6b7
Binary files /dev/null and b/doc/sphinx/_static/tutorial/05/pltgot.png differ
diff --git a/doc/sphinx/_static/tutorial/05/pltgot2.png b/doc/sphinx/_static/tutorial/05/pltgot2.png
new file mode 100644
index 0000000..54a41b9
Binary files /dev/null and b/doc/sphinx/_static/tutorial/05/pltgot2.png differ
diff --git a/doc/sphinx/_static/tutorial/05/pltgot3.png b/doc/sphinx/_static/tutorial/05/pltgot3.png
new file mode 100644
index 0000000..92e2b99
Binary files /dev/null and b/doc/sphinx/_static/tutorial/05/pltgot3.png differ
diff --git a/doc/sphinx/api/c/elf.rst b/doc/sphinx/api/c/elf.rst
new file mode 100644
index 0000000..16ddc3f
--- /dev/null
+++ b/doc/sphinx/api/c/elf.rst
@@ -0,0 +1,95 @@
+ELF
+---
+
+.. doxygenfunction:: elf_parse
+   :project: lief
+
+
+.. doxygenfunction:: elf_binary_destroy
+   :project: lief
+
+
+.. doxygenfunction:: elf_binary_save_header
+   :project: lief
+
+Elf_Binary_t
+************
+
+.. doxygenstruct:: Elf_Binary_t
+   :project: lief
+
+
+----------
+
+Elf_Header_t
+************
+
+.. doxygenstruct:: Elf_Header_t
+   :project: lief
+
+----------
+
+Elf_Section_t
+*************
+
+.. doxygenstruct:: Elf_Section_t
+   :project: lief
+
+----------
+
+Elf_Segment_t
+*************
+
+.. doxygenstruct:: Elf_Segment_t
+   :project: lief
+
+----------
+
+Dynamic Entries
+***************
+
+Elf_DynamicEntry_t
+~~~~~~~~~~~~~~~~~~
+
+.. doxygenstruct:: Elf_DynamicEntry_t
+   :project: lief
+
+----------
+
+Elf_DynamicEntry_Library_t
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. doxygenstruct:: Elf_DynamicEntry_Library_t
+   :project: lief
+
+----------
+
+Elf_DynamicEntry_SharedObject_t
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. doxygenstruct:: Elf_DynamicEntry_SharedObject_t
+   :project: lief
+
+----------
+
+Elf_DynamicEntry_Array_t
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. doxygenstruct:: Elf_DynamicEntry_Array_t
+   :project: lief
+
+----------
+
+Elf_DynamicEntry_Rpath_t
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. doxygenstruct:: Elf_DynamicEntry_Rpath_t
+   :project: lief
+
+----------
+
+Elf_DynamicEntry_RunPath_t
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. doxygenstruct:: Elf_DynamicEntry_RunPath_t
+   :project: lief
diff --git a/doc/sphinx/api/c/index.rst b/doc/sphinx/api/c/index.rst
new file mode 100644
index 0000000..316ba94
--- /dev/null
+++ b/doc/sphinx/api/c/index.rst
@@ -0,0 +1,12 @@
+
+.. _c-api-ref:
+
+C
+==
+
+.. toctree::
+  :maxdepth: 2
+
+  elf.rst
+  pe.rst
+  macho.rst
diff --git a/doc/sphinx/api/c/macho.rst b/doc/sphinx/api/c/macho.rst
new file mode 100644
index 0000000..80bb219
--- /dev/null
+++ b/doc/sphinx/api/c/macho.rst
@@ -0,0 +1,60 @@
+MachO
+-----
+
+.. doxygenfunction:: macho_parse
+   :project: lief
+
+
+.. doxygenfunction:: macho_binaries_destroy
+   :project: lief
+
+
+Macho_Binary_t
+**************
+
+.. doxygenstruct:: Macho_Binary_t
+   :project: lief
+
+
+----------
+
+Macho_Header_t
+**************
+
+.. doxygenstruct:: Macho_Header_t
+   :project: lief
+
+----------
+
+Macho_Section_t
+***************
+
+.. doxygenstruct:: Macho_Section_t
+   :project: lief
+
+----------
+
+Macho_Segment_t
+***************
+
+.. doxygenstruct:: Macho_Segment_t
+   :project: lief
+
+
+----------
+
+Macho_Command_t
+***************
+
+.. doxygenstruct:: Macho_Command_t
+   :project: lief
+
+
+----------
+
+Macho_Symbol_t
+**************
+
+.. doxygenstruct:: Macho_Symbol_t
+   :project: lief
+
diff --git a/doc/sphinx/api/c/pe.rst b/doc/sphinx/api/c/pe.rst
new file mode 100644
index 0000000..f9848dd
--- /dev/null
+++ b/doc/sphinx/api/c/pe.rst
@@ -0,0 +1,34 @@
+PE
+--
+
+Pe_Binary_t
+************
+
+.. doxygenstruct:: Pe_Binary_t
+   :project: lief
+
+
+----------
+
+Pe_DosHeader_t
+**************
+
+.. doxygenstruct:: Pe_DosHeader_t
+   :project: lief
+
+----------
+
+Pe_Header_t
+***********
+
+.. doxygenstruct:: Pe_Header_t
+   :project: lief
+
+----------
+
+Pe_OptionalHeader_t
+*******************
+
+.. doxygenstruct:: Pe_OptionalHeader_t
+   :project: lief
+
diff --git a/doc/sphinx/api/cpp/abstract.rst b/doc/sphinx/api/cpp/abstract.rst
new file mode 100644
index 0000000..2364a0e
--- /dev/null
+++ b/doc/sphinx/api/cpp/abstract.rst
@@ -0,0 +1,62 @@
+Abstract
+--------
+
+Parser
+*******
+
+.. doxygenclass:: LIEF::Parser
+   :project: lief
+
+----------
+
+Header
+******
+
+.. doxygenclass:: LIEF::Header
+   :project: lief
+
+----------
+
+
+Binary
+******
+
+.. doxygenclass:: LIEF::Binary
+   :project: lief
+
+----------
+
+Section
+*******
+
+.. doxygenclass:: LIEF::Section
+   :project: lief
+
+----------
+
+Symbol
+******
+
+.. doxygenclass:: LIEF::Symbol
+   :project: lief
+
+
+Enums
+*****
+
+.. doxygenenum:: LIEF::FILE_FORMATS
+   :project: lief
+
+
+.. doxygenenum:: LIEF::OBJECT_TYPES
+   :project: lief
+
+
+.. doxygenenum:: LIEF::ARCHITECTURES
+   :project: lief
+
+
+.. doxygenenum:: LIEF::MODES
+   :project: lief
+
+
diff --git a/doc/sphinx/api/cpp/elf.rst b/doc/sphinx/api/cpp/elf.rst
new file mode 100644
index 0000000..fd18408
--- /dev/null
+++ b/doc/sphinx/api/cpp/elf.rst
@@ -0,0 +1,154 @@
+ELF
+---
+
+Parser
+*******
+
+.. doxygenclass:: LIEF::ELF::Parser
+   :project: lief
+
+
+
+----------
+
+
+Binary
+******
+
+.. doxygenclass:: LIEF::ELF::Binary
+   :project: lief
+
+----------
+
+Header
+******
+
+.. doxygenclass:: LIEF::ELF::Header
+   :project: lief
+
+----------
+
+Section
+*******
+
+.. doxygenclass:: LIEF::ELF::Section
+   :project: lief
+
+----------
+
+Segment
+*******
+
+.. doxygenclass:: LIEF::ELF::Segment
+  :project: lief
+
+----------
+
+Dynamic Entry
+*************
+
+.. doxygenclass:: LIEF::ELF::DynamicEntry
+   :project: lief
+
+----------
+
+Dynamic Entry Library
+*********************
+
+.. doxygenclass:: LIEF::ELF::DynamicEntryLibrary
+   :project: lief
+
+----------
+
+Dynamic Shared Object
+*********************
+
+.. doxygenclass:: LIEF::ELF::DynamicSharedObject
+   :project: lief
+
+----------
+
+Relocations
+***********
+
+.. doxygenclass:: LIEF::ELF::Relocation
+   :project: lief
+
+----------
+
+Symbol
+******
+
+.. doxygenclass:: LIEF::ELF::Symbol
+   :project: lief
+
+----------
+
+Symbol Version
+**************
+
+.. doxygenclass:: LIEF::ELF::SymbolVersion
+   :project: lief
+
+----------
+
+Symbol Version Auxiliary
+************************
+
+.. doxygenclass:: LIEF::ELF::SymbolVersionAux
+   :project: lief
+
+----------
+
+Enums
+*****
+
+.. doxygenenum:: LIEF::ELF::ARCH
+   :project: lief
+
+
+.. doxygenenum:: LIEF::ELF::IDENTITY
+   :project: lief
+
+
+.. doxygenenum:: LIEF::ELF::E_TYPE
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::VERSION
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::ELF_CLASS
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::ELF_DATA
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::OS_ABI
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::SYMBOL_SECTION_INDEX
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::SECTION_TYPES
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::SECTION_FLAGS
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::SYMBOL_BINDINGS
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::SYMBOL_TYPES
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::SEGMENT_TYPES
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::SEGMENT_FLAGS
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::DYNAMIC_TAGS
+   :project: lief
+
+.. doxygenenum:: LIEF::ELF::DYNAMIC_FLAGS
+   :project: lief
diff --git a/doc/sphinx/api/cpp/index.rst b/doc/sphinx/api/cpp/index.rst
new file mode 100644
index 0000000..e5f5b9a
--- /dev/null
+++ b/doc/sphinx/api/cpp/index.rst
@@ -0,0 +1,116 @@
+.. _cpp-api-ref:
+
+C++
+===
+
+.. toctree::
+  :maxdepth: 2
+
+  abstract.rst
+  elf.rst
+  pe.rst
+  macho.rst
+
+Exceptions
+----------
+
+.. doxygenclass:: LIEF::exception
+   :project: lief
+
+.. doxygenclass:: LIEF::bad_file
+   :project: lief
+
+.. doxygenclass:: LIEF::bad_format
+   :project: lief
+
+.. doxygenclass:: LIEF::not_implemented
+   :project: lief
+
+.. doxygenclass:: LIEF::not_supported
+   :project: lief
+
+.. doxygenclass:: LIEF::integrity_error
+   :project: lief
+
+.. doxygenclass:: LIEF::read_out_of_bound
+   :project: lief
+
+.. doxygenclass:: LIEF::not_found
+   :project: lief
+
+.. doxygenclass:: LIEF::corrupted
+   :project: lief
+
+.. doxygenclass:: LIEF::conversion_error
+   :project: lief
+
+
+.. doxygenclass:: LIEF::type_error
+   :project: lief
+
+
+.. doxygenclass:: LIEF::builder_error
+   :project: lief
+
+
+.. doxygenclass:: LIEF::parser_error
+   :project: lief
+
+
+.. doxygenclass:: LIEF::pe_error
+   :project: lief
+
+.. doxygenclass:: LIEF::pe_bad_section_name
+   :project: lief
+
+
+Iterators
+---------
+
+
+.. doxygenclass:: LIEF::ref_iterator
+   :project: lief
+
+.. doxygenclass:: LIEF::const_ref_iterator
+   :project: lief
+
+.. doxygenclass:: LIEF::filter_iterator
+   :project: lief
+
+.. doxygenclass:: LIEF::const_filter_iterator
+   :project: lief
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/sphinx/api/cpp/macho.rst b/doc/sphinx/api/cpp/macho.rst
new file mode 100644
index 0000000..03f83f8
--- /dev/null
+++ b/doc/sphinx/api/cpp/macho.rst
@@ -0,0 +1,126 @@
+MachO
+-----
+
+Parsers
+*******
+
+.. doxygenclass:: LIEF::MachO::Parser
+   :project: lief
+
+
+.. doxygenclass:: LIEF::MachO::BinaryParser
+   :project: lief
+
+----------
+
+Binary
+******
+
+.. doxygenclass:: LIEF::MachO::Binary
+   :project: lief
+
+----------
+
+Header
+******
+
+.. doxygenclass:: LIEF::MachO::Header
+   :project: lief
+
+
+----------
+
+Builder
+*******
+
+.. doxygenclass:: LIEF::MachO::Builder
+   :project: lief
+
+----------
+
+DylibCommand
+************
+
+.. doxygenclass:: LIEF::MachO::DylibCommand
+   :project: lief
+
+
+----------
+
+DylinkerCommand
+****************
+
+.. doxygenclass:: LIEF::MachO::DylinkerCommand
+   :project: lief
+
+
+----------
+
+DynamicSymbol
+*************
+
+.. doxygenclass:: LIEF::MachO::DynamicSymbol
+   :project: lief
+
+
+----------
+
+DynamicSymbolCommand
+********************
+
+.. doxygenclass:: LIEF::MachO::DynamicSymbolCommand
+   :project: lief
+
+
+----------
+
+LoadCommand
+***********
+
+.. doxygenclass:: LIEF::MachO::LoadCommand
+   :project: lief
+
+
+----------
+
+MainCommand
+***********
+
+.. doxygenclass:: LIEF::MachO::MainCommand
+   :project: lief
+
+
+----------
+
+Section
+*******
+
+.. doxygenclass:: LIEF::MachO::Section
+   :project: lief
+
+
+----------
+
+Symbol
+******
+
+.. doxygenclass:: LIEF::MachO::Symbol
+   :project: lief
+
+
+----------
+
+SymbolCommand
+*************
+
+.. doxygenclass:: LIEF::MachO::SymbolCommand
+   :project: lief
+
+
+----------
+
+UUIDCommand
+***********
+
+.. doxygenclass:: LIEF::MachO::UUIDCommand
+   :project: lief
diff --git a/doc/sphinx/api/cpp/pe.rst b/doc/sphinx/api/cpp/pe.rst
new file mode 100644
index 0000000..3f3f32f
--- /dev/null
+++ b/doc/sphinx/api/cpp/pe.rst
@@ -0,0 +1,163 @@
+PE
+--
+
+Binary
+******
+
+.. doxygenclass:: LIEF::PE::Binary
+  :project: lief
+
+----------
+
+Dos Header
+**********
+
+.. doxygenclass:: LIEF::PE::DosHeader
+  :project: lief
+
+----------
+
+Header
+*******
+
+.. doxygenclass:: LIEF::PE::Header
+  :project: lief
+
+----------
+
+Optional Header
+***************
+
+.. doxygenclass:: LIEF::PE::OptionalHeader
+  :project: lief
+
+----------
+
+Data Directory
+**************
+
+.. doxygenclass:: LIEF::PE::DataDirectory
+  :project: lief
+
+----------
+
+Section
+*******
+
+.. doxygenclass:: LIEF::PE::Section
+  :project: lief
+
+----------
+
+
+Import
+*******
+
+.. doxygenclass:: LIEF::PE::Import
+  :project: lief
+
+----------
+
+
+Import Entry
+************
+
+.. doxygenclass:: LIEF::PE::ImportEntry
+  :project: lief
+
+----------
+
+TLS
+***
+
+.. doxygenclass:: LIEF::PE::TLS
+  :project: lief
+
+----------
+
+Symbol
+*******
+
+.. doxygenclass:: LIEF::PE::Symbol
+  :project: lief
+
+----------
+
+Relocation
+**********
+
+.. doxygenclass:: LIEF::PE::Relocation
+  :project: lief
+
+
+----------
+
+Relocation Entry
+****************
+
+.. doxygenclass:: LIEF::PE::RelocationEntry
+  :project: lief
+
+
+----------
+
+Export
+******
+
+.. doxygenclass:: LIEF::PE::Export
+  :project: lief
+
+
+----------
+
+Export Entry
+************
+
+.. doxygenclass:: LIEF::PE::ExportEntry
+  :project: lief
+
+
+----------
+
+Signature
+*********
+
+.. doxygenclass:: LIEF::PE::Signature
+  :project: lief
+
+
+----------
+
+AuthenticatedAttributes
+***********************
+
+.. doxygenclass:: LIEF::PE::AuthenticatedAttributes
+  :project: lief
+
+
+----------
+
+x509
+****
+
+.. doxygenclass:: LIEF::PE::x509
+  :project: lief
+
+
+----------
+
+ContentInfo
+***********
+
+.. doxygenclass:: LIEF::PE::ContentInfo
+  :project: lief
+
+
+----------
+
+
+SignerInfo
+**********
+
+.. doxygenclass:: LIEF::PE::SignerInfo
+  :project: lief
diff --git a/doc/sphinx/api/index.rst b/doc/sphinx/api/index.rst
new file mode 100644
index 0000000..5591500
--- /dev/null
+++ b/doc/sphinx/api/index.rst
@@ -0,0 +1,12 @@
+API
+===
+
+.. toctree::
+  :maxdepth: 2
+
+  python/index.rst
+  cpp/index.rst
+  c/index.rst
+
+
+
diff --git a/doc/sphinx/api/python/abstract.rst b/doc/sphinx/api/python/abstract.rst
new file mode 100644
index 0000000..e4e5ac2
--- /dev/null
+++ b/doc/sphinx/api/python/abstract.rst
@@ -0,0 +1,40 @@
+Abstract
+--------
+
+
+Parser
+*******
+
+.. autofunction:: lief.parse
+
+----------
+
+Binary
+******
+
+.. autoclass:: lief.Binary
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Section
+*******
+
+.. autoclass:: lief.Section
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Symbol
+******
+
+.. autoclass:: lief.Symbol
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
diff --git a/doc/sphinx/api/python/elf.rst b/doc/sphinx/api/python/elf.rst
new file mode 100644
index 0000000..e76c657
--- /dev/null
+++ b/doc/sphinx/api/python/elf.rst
@@ -0,0 +1,293 @@
+ELF
+---
+
+Parser
+*******
+
+.. autofunction:: lief.ELF.parse
+.. autofunction:: lief.ELF.parse_from_raw
+
+----------
+
+.. _python-elf-binary-api-ref:
+
+Binary
+******
+
+.. autoclass:: lief.ELF.Binary
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Header
+******
+
+.. autoclass:: lief.ELF.Header
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Section
+*******
+
+.. autoclass:: lief.ELF.Section
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Segment
+*******
+
+.. autoclass:: lief.ELF.Segment
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Dynamic Entry
+*************
+
+.. autoclass:: lief.ELF.DynamicEntry
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Dynamic Entry Library
+*********************
+
+.. autoclass:: lief.ELF.DynamicEntryLibrary
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Dynamic Shared Object
+*********************
+
+.. autoclass:: lief.ELF.DynamicSharedObject
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Relocations
+***********
+
+.. autoclass:: lief.ELF.Relocation
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Symbol
+******
+
+.. autoclass:: lief.ELF.Symbol
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Symbol Version
+**************
+
+.. autoclass:: lief.ELF.SymbolVersion
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Symbol Version Auxiliary
+************************
+
+.. autoclass:: lief.ELF.SymbolVersionAux
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Builder
+*******
+
+.. autoclass:: lief.ELF.Builder
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+Enums
+*****
+
+
+ELF Class
+~~~~~~~~~
+
+.. autoclass:: lief.ELF.ELF_CLASS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+ELF Data
+~~~~~~~~
+
+.. autoclass:: lief.ELF.ELF_DATA
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+ELF OS/ABI
+~~~~~~~~~~
+
+.. autoclass:: lief.ELF.OS_ABI
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+Binary types
+~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.E_TYPE
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Section types
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.SECTION_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Section flags
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.SECTION_FLAGS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+Segment types
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.SEGMENT_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Segment flags
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.SEGMENT_FLAGS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+Architectures
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.ARCH
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Version
+~~~~~~~
+
+.. autoclass:: lief.ELF.VERSION
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Dynamic tags
+~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.DYNAMIC_TAGS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+Symbol types
+~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.SYMBOL_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+Symbol bindings
+~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.SYMBOL_BINDINGS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+Relocations x86-64
+~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.RELOCATION_X86_64
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+Relocations x86 (i386)
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.RELOCATION_i386
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+Relocations ARM
+~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.ELF.RELOCATION_ARM
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+
+
+
+
diff --git a/doc/sphinx/api/python/index.rst b/doc/sphinx/api/python/index.rst
new file mode 100644
index 0000000..9865822
--- /dev/null
+++ b/doc/sphinx/api/python/index.rst
@@ -0,0 +1,14 @@
+.. _python-api-ref:
+
+Python
+======
+
+.. toctree::
+  :maxdepth: 2
+
+  abstract.rst
+  elf.rst
+  pe.rst
+  macho.rst
+
+
diff --git a/doc/sphinx/api/python/macho.rst b/doc/sphinx/api/python/macho.rst
new file mode 100644
index 0000000..74bf4dc
--- /dev/null
+++ b/doc/sphinx/api/python/macho.rst
@@ -0,0 +1,152 @@
+MachO
+-----
+
+
+Parser
+*******
+
+.. autofunction:: lief.MachO.parse
+
+
+----------
+
+.. _python-pe-binary-api-ref:
+
+Binary
+******
+
+.. autoclass:: lief.MachO.Binary
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Header
+******
+
+.. autoclass:: lief.MachO.Header
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+Section
+*******
+
+.. autoclass:: lief.MachO.Section
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+SegmentCommand
+**************
+
+.. autoclass:: lief.MachO.SegmentCommand
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+LoadCommand
+***********
+
+.. autoclass:: lief.MachO.LoadCommand
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+DylibCommand
+************
+
+.. autoclass:: lief.MachO.DylibCommand
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+----------
+
+
+Symbol
+******
+
+.. autoclass:: lief.MachO.Symbol
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+
+----------
+
+
+Enum
+****
+
+
+CPU types
+~~~~~~~~~
+
+.. autoclass:: lief.MachO.CPU_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+FILE_TYPES
+~~~~~~~~~~
+
+.. autoclass:: lief.MachO.FILE_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+HEADER_FLAGS
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.MachO.HEADER_FLAGS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+LOAD_COMMAND_TYPES
+~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.MachO.LOAD_COMMAND_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+SECTION_TYPES
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.MachO.SECTION_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+
+
diff --git a/doc/sphinx/api/python/pe.rst b/doc/sphinx/api/python/pe.rst
new file mode 100644
index 0000000..99f5b67
--- /dev/null
+++ b/doc/sphinx/api/python/pe.rst
@@ -0,0 +1,362 @@
+PE
+--
+
+.. autofunction:: lief.PE.oid_to_string
+
+Parser
+*******
+
+.. autofunction:: lief.PE.parse
+.. autofunction:: lief.PE.parse_from_raw
+
+
+Binary
+******
+
+.. autoclass:: lief.PE.Binary
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Dos Header
+**********
+
+.. autoclass:: lief.PE.DosHeader
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Header
+*******
+
+.. autoclass:: lief.PE.Header
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Optional Header
+***************
+
+.. autoclass:: lief.PE.OptionalHeader
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Data Directory
+**************
+
+.. autoclass:: lief.PE.DataDirectory
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Section
+*******
+
+.. autoclass:: lief.PE.Section
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+Import
+*******
+
+.. autoclass:: lief.PE.Import
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+
+Import Entry
+************
+
+.. autoclass:: lief.PE.ImportEntry
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+TLS
+***
+
+.. autoclass:: lief.PE.TLS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Symbol
+*******
+
+.. autoclass:: lief.PE.Symbol
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Relocation
+**********
+
+.. autoclass:: lief.PE.Relocation
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+----------
+
+Relocation Entry
+****************
+
+.. autoclass:: lief.PE.RelocationEntry
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+----------
+
+Export
+******
+
+.. autoclass:: lief.PE.Export
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+----------
+
+Export Entry
+************
+
+.. autoclass:: lief.PE.ExportEntry
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+Signature
+*********
+
+.. autoclass:: lief.PE.Signature
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+AuthenticatedAttributes
+***********************
+
+.. autoclass:: lief.PE.AuthenticatedAttributes
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+x509
+****
+
+.. autoclass:: lief.PE.x509
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+ContentInfo
+***********
+
+.. autoclass:: lief.PE.ContentInfo
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+----------
+
+
+SignerInfo
+**********
+
+.. autoclass:: lief.PE.SignerInfo
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+----------
+
+
+Builder
+*******
+
+.. autoclass:: lief.PE.Builder
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
+Enums
+*****
+
+PE_TYPE
+~~~~~~~
+
+.. autoclass:: lief.PE.PE_TYPE
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+MACHINE_TYPES
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.MACHINE_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+PE_CHARACTERISTICS
+~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.PE_CHARACTERISTICS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+SUBSYSTEM
+~~~~~~~~~
+
+.. autoclass:: lief.PE.SUBSYSTEM
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+DATA_DIRECTORY
+~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.DATA_DIRECTORY
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+DLL_CHARACTERISTICS
+~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.DLL_CHARACTERISTICS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+SECTION_CHARACTERISTICS
+~~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.SECTION_CHARACTERISTICS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+SECTION_TYPES
+~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.SECTION_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+SYMBOL_BASE_TYPES
+~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.SYMBOL_BASE_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+SYMBOL_COMPLEX_TYPES
+~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.SYMBOL_COMPLEX_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+SYMBOL_SECTION_NUMBER
+~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.SYMBOL_SECTION_NUMBER
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+SYMBOL_STORAGE_CLASS
+~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.SYMBOL_STORAGE_CLASS
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+RELOCATIONS_BASE_TYPES
+~~~~~~~~~~~~~~~~~~~~~~
+
+.. autoclass:: lief.PE.RELOCATIONS_BASE_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+----------
+
+DEBUG_TYPES
+~~~~~~~~~~~
+
+.. autoclass:: lief.PE.DEBUG_TYPES
+  :members:
+  :inherited-members:
+  :undoc-members:
+
+
diff --git a/doc/sphinx/compilation.rst b/doc/sphinx/compilation.rst
new file mode 100644
index 0000000..e4fe8db
--- /dev/null
+++ b/doc/sphinx/compilation.rst
@@ -0,0 +1,76 @@
+Compilation
+===========
+
+To be compiled **LIEF** needs at least the following requirements:
+
+ - C++11 compiler (GCC, Clang, MSVC..)
+ - CMake
+ - Python (for bindings)
+
+To build the documentation:
+
+ - Doxygen (= ``1.8.10``)
+ - Sphinx (with ``sphinx_rtd_theme`` module)
+ - breathe (>= ``4.5.0``)
+
+
+Libraries only (SDK)
+--------------------
+
+.. code-block:: console
+
+  $ git clone https://github.com/lief-project/LIEF.git
+  $ cd LIEF
+  $ mkdir build
+  $ cd build
+  $ cmake -DLIEF_PYTHON_API=off -DCMAKE_BUILD_TYPE=Release ..
+  $ cmake --build . --target LIB_LIEF_STATIC --config Release
+  $ cmake --build . --target LIB_LIEF_SHARED --config Release # for the shared one
+
+Library and Python bindings
+---------------------------
+
+.. code-block:: console
+
+  $ git clone https://github.com/lief-project/LIEF.git
+  $ cd LIEF
+  $ mkdir build
+  $ cd build
+  $ cmake -DLIEF_PYTHON_API=on -DPYTHON_VERSION=3.6 -DCMAKE_BUILD_TYPE=Release ..
+  $ cmake --build . --target LIB_LIEF_STATIC --config Release
+  $ cmake --build . --target LIB_LIEF_SHARED --config Release # for the shared one
+  $ cmake --build . --target pyLIEF --config Release
+
+.. warning::
+
+  Depending on your Python version, CMake could not
+  find the right Python library to link against.
+
+  We suggest you to explicitly define path to the Python library,
+  Python include directory and Python executable.
+
+  .. code-block:: console
+
+    $ cmake .. \
+      -DPYTHON_VERSION=3.5 \
+      -DPYTHON_INCLUDE_DIR:PATH=/usr/include/python3.5m \
+      -DPYTHON_LIBRARY:FILEPATH=/usr/lib/libpython3.so \
+      -DPYTHON_BINARY:FILEPATH=/usr/bin/python3.5
+
+
+If you want to enable tests, add ``-DLIEF_TESTS=on`` at CMake configuration step.
+
+The Doxygen documentation will be located at ``build/doc/doxygen/html`` and the sphinx documentation at ``build/doc/sphinx-doc``
+
+Docker
+------
+
+.. code-block:: console
+
+  $ docker build -t lief LIEF
+  $ docker run -i -t lief /bin/bash
+
+
+
+
+
diff --git a/doc/sphinx/conf.py.in b/doc/sphinx/conf.py.in
new file mode 100644
index 0000000..e37f0f3
--- /dev/null
+++ b/doc/sphinx/conf.py.in
@@ -0,0 +1,316 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+#
+# LIEF documentation build configuration file, created by
+# sphinx-quickstart on Wed Mar 23 14:40:38 2016.
+#
+# This file is execfile()d with the current directory set to its
+# containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys
+import os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration ------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+    'sphinx.ext.mathjax',
+    'sphinx.ext.autodoc',
+    'breathe',
+]
+
+breathe_projects = {
+    "lief": "@CMAKE_CURRENT_BINARY_DIR@/doxygen/xml",
+}
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix(es) of source filenames.
+# You can specify multiple suffix as a list of string:
+# source_suffix = ['.rst', '.md']
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project   = u'LIEF'
+copyright = u'2017, Quarkslab'
+author    = 'Romain Thomas'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '@LIEF_VERSION_MAJOR@.@LIEF_VERSION_MINOR@.@LIEF_VERSION_PATCH@'
+# The full version, including alpha/beta/rc tags.
+release = '@LIEF_VERSION_MAJOR@.@LIEF_VERSION_MINOR@.@LIEF_VERSION_PATCH@'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#
+# This is also used if you do content translation via gettext catalogs.
+# Usually you set "language" from the command line for these cases.
+language = None
+autoclass_content = 'both'
+breathe_default_members = ('members', 'protected-members', 'undoc-members')
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all
+# documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+# If true, keep warnings as "system message" paragraphs in the built documents.
+#keep_warnings = False
+
+# If true, `todo` and `todoList` produce output, else they produce nothing.
+todo_include_todos = False
+
+
+# -- Options for HTML output ----------------------------------------------
+
+import sphinx_rtd_theme
+
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = "sphinx_rtd_theme"
+
+html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+#html_theme = 'bootstrap'
+#html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
+#html_sidebars = {'**': ['localtoc.html']}
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {
+#    'navbar_links': [
+#        ("Python API", "python_api"),
+#    ],
+#
+#    'navbar_site_name': "Index",
+#    'bootswatch_theme': "flatly",
+#    'navbar_sidebarrel': False,
+#    'navbar_fixed_top': False,
+#
+#    # Render the current pages TOC in the navbar. (Default: true)
+#    'navbar_pagenav': False,
+#    'source_link_position': "",
+#    'bootstrap_version': "3",
+#}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+html_logo = '_static/logo_blue.png'
+
+# The name of an image file (relative to this directory) to use as a favicon of
+# the docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+html_favicon = '_static/favicon.ico'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# Add any extra paths that contain custom files (such as robots.txt or
+# .htaccess) here, relative to this directory. These files are copied
+# directly to the root of the documentation.
+#html_extra_path = []
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Language to be used for generating the HTML full-text search index.
+# Sphinx supports the following languages:
+#   'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja'
+#   'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr'
+#html_search_language = 'en'
+
+# A dictionary with options for the search language support, empty by default.
+# Now only 'ja' uses this config value
+#html_search_options = {'type': 'default'}
+
+# The name of a javascript file (relative to the configuration directory) that
+# implements a search results scorer. If empty, the default will be used.
+#html_search_scorer = 'scorer.js'
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'LIEFdoc'
+
+# -- Options for LaTeX output ---------------------------------------------
+
+#latex_elements = {
+# The paper size ('letterpaper' or 'a4paper').
+#'papersize': 'letterpaper',
+
+# The font size ('10pt', '11pt' or '12pt').
+#'pointsize': '10pt',
+
+# Additional stuff for the LaTeX preamble.
+#'preamble': '',
+
+# Latex figure (float) alignment
+#'figure_align': 'htbp',
+#}
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title,
+#  author, documentclass [howto, manual, or own class]).
+#latex_documents = [
+#    (master_doc, 'LIEF.tex', 'LIEF Documentation',
+#     'Romain Thomas', 'manual'),
+#]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output ---------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    (master_doc, 'lief', 'LIEF Documentation',
+     [author], 1)
+]
+
+# If true, show URL addresses after external links.
+#man_show_urls = False
+
+
+# -- Options for Texinfo output -------------------------------------------
+
+# Grouping the document tree into Texinfo files. List of tuples
+# (source start file, target name, title, author,
+#  dir menu entry, description, category)
+texinfo_documents = [
+    (master_doc, 'LIEF', 'LIEF Documentation',
+     author, 'LIEF', 'One line description of project.',
+     'Miscellaneous'),
+]
+
+# Documents to append as an appendix to all manuals.
+#texinfo_appendices = []
+
+# If false, no module index is generated.
+#texinfo_domain_indices = True
+
+# How to display URL addresses: 'footnote', 'no', or 'inline'.
+#texinfo_show_urls = 'footnote'
+
+# If true, do not generate a @detailmenu in the "Top" node's menu.
+#texinfo_no_detailmenu = False
diff --git a/doc/sphinx/formats/elf.rst b/doc/sphinx/formats/elf.rst
new file mode 100644
index 0000000..1813d87
--- /dev/null
+++ b/doc/sphinx/formats/elf.rst
@@ -0,0 +1,131 @@
+ELF Format
+==========
+
+Duality sections/segments
+--------------------------
+
+In the ``ELF`` format we have two kinds of containers:
+
+  * Sections
+  * Segments
+
+A first sight it's a bit disturbing because it's two representations of the same data. In fact these two representations are used differently.
+
+**Sections** are usually used at **link** time by the linker (e.g. ``/bin/ld``) whereas **segments** are usually used at **load** time by kernel and loader (e.g. ``/lib/ld-linux.so``).
+
+Sections header table is not mandatory so you can execute an ELF binary without sections header table. Let's take an example:
+
+.. code-block:: console
+
+  $ readelf -Sh /bin/ls
+  ELF Header:
+    Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
+    Class:                             ELF64
+    Data:                              2's complement, little endian
+    Version:                           1 (current)
+    OS/ABI:                            UNIX - System V
+    ABI Version:                       0
+    Type:                              EXEC (Executable file)
+    Machine:                           Advanced Micro Devices X86-64
+    Version:                           0x1
+    Entry point address:               0x4022f0
+    Start of program headers:          64 (bytes into file)
+    Start of section headers:          37840 (bytes into file)
+    Flags:                             0x0
+    Size of this header:               64 (bytes)
+    Size of program headers:           56 (bytes)
+    Number of program headers:         9
+    Size of section headers:           64 (bytes)
+    Number of section headers:         28
+    Section header string table index: 27
+
+  Section Headers:
+    [Nr] Name              Type             Address           Offset
+         Size              EntSize          Flags  Link  Info  Align
+    [ 0]                   NULL             0000000000000000  00000000
+         0000000000000000  0000000000000000           0     0     0
+    [ 1] .interp           PROGBITS         0000000000400238  00000238
+         000000000000001c  0000000000000000   A       0     0     1
+    [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254
+         0000000000000020  0000000000000000   A       0     0     4
+    [ 3] .note.gnu.build-i NOTE             0000000000400274  00000274
+         0000000000000024  0000000000000000   A       0     0     4
+    [ 4] .gnu.hash         GNU_HASH         0000000000400298  00000298
+         0000000000000060  0000000000000000   A       5     0     8
+    [ 5] .dynsym           DYNSYM           00000000004002f8  000002f8
+         00000000000006d8  0000000000000018   A       6     1     8
+    [ 6] .dynstr           STRTAB           00000000004009d0  000009d0
+         00000000000002f1  0000000000000000   A       0     0     1
+    [ 7] .gnu.version      VERSYM           0000000000400cc2  00000cc2
+         0000000000000092  0000000000000002   A       5     0     2
+   ...
+
+    [27] .shstrtab         STRTAB           0000000000000000  000092d6
+         00000000000000f8  0000000000000000           0     0     1
+  Key to Flags:
+    W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
+    I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
+    O (extra OS processing required) o (OS specific), p (processor specific)
+
+Now we remove sections header with **LIEF**:
+
+.. code-block:: python
+
+  from lief import ELF
+  binary  = ELF.Parse("/bin/ls") # Build an ELF binary
+  header = binary.header
+  header.section_header_offset    = 0;
+  header numberof_section_headers = 0;
+  binary.write("out.bin");
+
+Now if we run ``out.bin``:
+
+.. code-block:: console
+
+  $ ./out.bin
+  elf_reader.py	  elf_remove_section_table.py  library_symbols_obfuscation  out.bin
+  elf_rebuilder.py  elf_symbol_obfuscation.py    nm.py			    pe_reader.py
+
+We can check that sections header table has been removed:
+
+.. code-block:: console
+
+  $ readelf -Sh ./out.bin
+  ELF Header:
+    Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
+    Class:                             ELF64
+    Data:                              2's complement, little endian
+    Version:                           1 (current)
+    OS/ABI:                            UNIX - System V
+    ABI Version:                       0
+    Type:                              EXEC (Executable file)
+    Machine:                           Advanced Micro Devices X86-64
+    Version:                           0x1
+    Entry point address:               0x4022f0
+    Start of program headers:          64 (bytes into file)
+    Start of section headers:          0 (bytes into file)
+    Flags:                             0x0
+    Size of this header:               64 (bytes)
+    Size of program headers:           56 (bytes)
+    Number of program headers:         9
+    Size of section headers:           64 (bytes)
+    Number of section headers:         0
+    Section header string table index: 27 <corrupt: out of range>
+
+  There are no sections in this file.
+
+As content can be used and updated by both sections and segments we can't store it in sections/segments. Instead we use an interface to manage content. The manager interface looks like this:
+
+|
+
+.. image:: ../_static/data_handler.png
+  :height: 539 px
+  :width: 1080 px
+  :scale: 40 %
+  :alt: alternate text
+  :align: center
+
+|
+
+The manager is implemented in the ``ELF::DataHandler::Handler`` classe.
+
diff --git a/doc/sphinx/formats/index.rst b/doc/sphinx/formats/index.rst
new file mode 100644
index 0000000..f8de55d
--- /dev/null
+++ b/doc/sphinx/formats/index.rst
@@ -0,0 +1,9 @@
+Formats
+=======
+
+.. toctree::
+  :maxdepth: 2
+
+  elf.rst
+  pe.rst
+
diff --git a/doc/sphinx/formats/pe.rst b/doc/sphinx/formats/pe.rst
new file mode 100644
index 0000000..f06bf85
--- /dev/null
+++ b/doc/sphinx/formats/pe.rst
@@ -0,0 +1,55 @@
+PE Format
+=========
+
+In this part we won't describe PE format totally but some parts that are tricky.
+
+
+Rebuilding Import Table
+-----------------------
+
+When a PE binary uses external library, it usually has an import table stored in the .idata section. This table has the following structure:
+
+|
+
+.. image:: ../_static/iat4.png
+   :width: 465px
+   :height: 800px
+   :scale: 70%
+   :alt: alternate text
+   :align: center
+
+|
+
+The lookup table holds offset to imported function's name. In the example, we import functions `Sleep` and `GetTickCount` from the `kernel32.dll`.
+
+The address table is identical (in most cases) to the lookup table but at runtime it will hold the imported function's address. The first entry will hold the address of `Sleep` and the second one the address of `GetTickCount`.
+
+If the program need to call `Sleep` function the assembly code should look like this:
+
+.. code-block:: nasm
+
+  call address_table[entry1] ; call to sleep
+
+When rebuilding binary in ``LIEF`` we don't patch at any moment the assembly code which is a strong constraint for rebuilding import table. As we don't know exact structure of import table in the original binary (address table could be before lookup table...).
+`
+The reconstructed import table is built in another section named ``.idata``. To keep a consistent binary we patch the original binary in the following way:
+
+Each entry in the address table is replaced with the address of the entry in the trampoline section. (see figure 2)
+
+|
+
+.. image:: ../_static/iat3.png
+   :width: 928px
+   :height: 1835px
+   :scale: 40%
+   :alt: alternate text
+   :align: center
+
+|
+
+So if we have a call to an imported function we will have the following sequence of instructions:
+
+.. code-block:: nasm
+
+  call address_table_original[entry1] ; call to trampoline[0]
+  jmp *address_table[entry1]          ; jump to Sleep address
diff --git a/doc/sphinx/getting_started.rst b/doc/sphinx/getting_started.rst
new file mode 100644
index 0000000..1eb6eba
--- /dev/null
+++ b/doc/sphinx/getting_started.rst
@@ -0,0 +1,99 @@
+Getting started
+===============
+
+Python
+------
+
+.. code-block:: python
+
+  import lief
+  # ELF
+  binary = lief.parse("/usr/bin/ls")
+  print(binary)
+
+  # PE
+  binary = lief.parse("C:\\Windows\\explorer.exe")
+  print(binary)
+
+  # Mach-O
+  binary = lief.parse("/usr/bin/ls")
+  print(binary)
+
+Python API documentation is available here: :ref:`python-api-ref`
+
+C++
+---
+
+.. code-block:: cpp
+
+  #include <LIEF/LIEF.hpp>
+  int main(int argc, const char** argv) {
+    LIEF::ELF::Binary*   elf   = LIEF::ELF::Parser::parse("/usr/bin/ls");
+    LIEF::PE::Binary*    pe    = LIEF::PE::Parser::parse("C:\\Windows\\explorer.exe");
+    LIEF::MachO::Binary* macho = LIEF::MachO::Parser::parse("/usr/bin/ls");
+
+    std::cout << *elf   << std::endl;
+    std::cout << *pe    << std::endl;
+    std::cout << *macho << std::endl;
+
+    delete elf;
+    delete pe;
+    delete macho;
+  }
+
+
+C++ API documentation is available here: :ref:`cpp-api-ref`
+
+C
+--
+
+.. code-block:: c
+
+  #include <LIEF/LIEF.h>
+  int main(int argc, const char** argv) {
+
+    Elf_Binary_t*    elf_binary     = elf_parse("/usr/bin/ls");
+    Pe_Binary_t*     pe_binary      = pe_parse("C:\\Windows\\explorer.exe");
+    Macho_Binary_t** macho_binaries = macho_parse("/usr/bin/ls");
+
+    Pe_Section_t**    pe_sections    = pe_binary->sections;
+    Elf_Section_t**   elf_sections   = elf_binary->sections;
+    Macho_Section_t** macho_sections = macho_binaries[0]->sections;
+
+    for (size_t i = 0; pe_sections[i] != NULL; ++i) {
+      printf("%s\n", pe_sections[i]->name)
+    }
+
+    for (size_t i = 0; elf_sections[i] != NULL; ++i) {
+      printf("%s\n", elf_sections[i]->name)
+    }
+
+    for (size_t i = 0; macho_sections[i] != NULL; ++i) {
+      printf("%s\n", macho_sections[i]->name)
+    }
+
+    elf_binary_destroy(elf_binary);
+    pe_binary_destroy(pe_binary);
+    macho_binaries_destroy(macho_binaries);
+  }
+
+
+C API documentation is available here: :ref:`c-api-ref`
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/sphinx/index.rst b/doc/sphinx/index.rst
new file mode 100644
index 0000000..cf1f64d
--- /dev/null
+++ b/doc/sphinx/index.rst
@@ -0,0 +1,21 @@
+.. lief documentation master file, created by
+   sphinx-quickstart on Thu Jun 11 14:32:14 2015.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to LIEF's documentation!
+================================
+
+.. toctree::
+  :maxdepth: 2
+
+  Intro.rst
+  installation.rst
+  getting_started.rst
+  compilation.rst
+  tutorials/index.rst
+  api/index.rst
+  formats/index.rst
+  references.rst
+
+
diff --git a/doc/sphinx/installation.rst b/doc/sphinx/installation.rst
new file mode 100644
index 0000000..eca227d
--- /dev/null
+++ b/doc/sphinx/installation.rst
@@ -0,0 +1,30 @@
+Installation
+============
+
+SDK
+---
+
+For each platform there is a SDK which contains
+
+  * Static library
+  * Shared library
+  * Headers
+
+To install the static or shared library you have to copy them in the right folder. For instance, on Linux it would be in ``/usr/lib`` and ``/usr/include``.
+
+
+Python
+------
+
+To install the Python API (example with ``Python 3.5``):
+
+.. code-block:: console
+
+  $ pip install lief-XX.YY.ZZ_py35.tar.gz
+
+
+
+
+
+
+
diff --git a/doc/sphinx/references.rst b/doc/sphinx/references.rst
new file mode 100644
index 0000000..0bb4e77
--- /dev/null
+++ b/doc/sphinx/references.rst
@@ -0,0 +1,139 @@
+References
+==========
+
+Similar Projects
+----------------
+
++------------+------------+----------------------------------------------------------------------+
+|    Name    | Language   |   Link                                                               |
++============+============+======================================================================+
+| filebytes  | Python     | https://github.com/sashs/filebytes                                   |
++------------+------------+----------------------------------------------------------------------+
+| angr/cle   | Python     | https://github.com/angr/cle                                          |
++------------+------------+----------------------------------------------------------------------+
+| pypeelf    | Python     | https://github.com/crackinglandia/pypeelf                            |
++------------+------------+----------------------------------------------------------------------+
+
+Parsers/Modifiers
+-----------------
+
+ELF
+~~~
+
++------------+------------+----------------------------------------------------------------------+
+|    Name    | Language   |   Link                                                               |
++============+============+======================================================================+
+| pyelftools | Python     | https://github.com/eliben/pyelftools                                 |
++------------+------------+----------------------------------------------------------------------+
+| pylibelf   | Python     | https://github.com/crackinglandia/pylibelf                           |
++------------+------------+----------------------------------------------------------------------+
+| pydevtools | Python     | https://github.com/arowser/pydevtools                                |
++------------+------------+----------------------------------------------------------------------+
+| elfparser  | C++ ?      | http://elfparser.com/index.html                                      |
++------------+------------+----------------------------------------------------------------------+
+| libelf     | C          | http://www.mr511.de/software/                                        |
++------------+------------+----------------------------------------------------------------------+
+| elfio      | C++        | http://elfio.sourceforge.net/                                        |
++------------+------------+----------------------------------------------------------------------+
+| radare2    | C/Python   | https://github.com/radare/radare2/tree/master/libr/bin/format/elf    |
++------------+------------+----------------------------------------------------------------------+
+| node-elf   | node.js    | https://github.com/sifteo/node-elf                                   |
++------------+------------+----------------------------------------------------------------------+
+| readelf    | C          | https://github.com/bminor/binutils-gdb/blob/master/binutils/readelf.c|
++------------+------------+----------------------------------------------------------------------+
+
+
+PE
+~~
+
++---------------+--------------+----------------------------------------------------------------------+
+|    Name       | Language     |   Link                                                               |
++===============+==============+======================================================================+
+| pefiles       | Python       | https://github.com/erocarrera/pefile                                 |
++---------------+--------------+----------------------------------------------------------------------+
+| radare2       | C            | https://github.com/radare/radare2/tree/master/libr/bin/format/pe     |
++---------------+--------------+----------------------------------------------------------------------+
+| PE.Explorer   | C++/C# ?     | http://www.pe-explorer.com/                                          |
++---------------+--------------+----------------------------------------------------------------------+
+| CFF Explorer  | C++/C# ?     | http://www.ntcore.com/exsuite.php                                    |
++---------------+--------------+----------------------------------------------------------------------+
+| PE Browser 64 | C++/C# ?     | http://www.smidgeonsoft.prohosting.com/pebrowse-pro-file-viewer.html |
++---------------+--------------+----------------------------------------------------------------------+
+| PE View       | C++/C# ?     | http://wjradburn.com/software/                                       |
++---------------+--------------+----------------------------------------------------------------------+
+| FileAlyzer    | C++/C# ?     | http://www.safer-networking.org/products/filealyzer/                 |
++---------------+--------------+----------------------------------------------------------------------+
+| PE Studio     | C++/C# ?     | http://www.winitor.com/                                              |
++---------------+--------------+----------------------------------------------------------------------+
+| PEDumper      | C            | https://github.com/maldevel/PEdumper                                 |
++---------------+--------------+----------------------------------------------------------------------+
+| PE Parse      | C++/Python   | https://github.com/trailofbits/pe-parse/tree/master/parser-library   |
++---------------+--------------+----------------------------------------------------------------------+
+| PEParse       | C#           | https://github.com/DKorablin/PEReader                                |
++---------------+--------------+----------------------------------------------------------------------+
+| PE Bliss      | C++          | https://github.com/BackupGGCode/portable-executable-library          |
++---------------+--------------+----------------------------------------------------------------------+
+| PE Net        | .NET         | https://github.com/secana/PeNet                                      |
++---------------+--------------+----------------------------------------------------------------------+
+| libpe         | C++          | https://github.com/evilsocket/libpe/tree/master/libpe                |
++---------------+--------------+----------------------------------------------------------------------+
+
+
+Mach-O
+~~~~~~
+
++------------+------------+---------------------------------------------------------------------+
+|    Name    | Language   |   Link                                                              |
++============+============+=====================================================================+
+| radare2    | C          | https://github.com/radare/radare2/tree/master/libr/bin/format/mach0 |
++------------+------------+---------------------------------------------------------------------+
+| MachO-Kit  | C/ObjC     | https://github.com/DeVaukz/MachO-Kit                                |
++------------+------------+---------------------------------------------------------------------+
+| optool     | ObjC       | https://github.com/alexzielenski/optool                             |
++------------+------------+---------------------------------------------------------------------+
+| macho_edit | C++        | https://github.com/Tyilo/macho_edit                                 |
++------------+------------+---------------------------------------------------------------------+
+| macholib   | Python     | https://pypi.python.org/pypi/macholib                               |
++------------+------------+---------------------------------------------------------------------+
+
+
+Tools
+-----
+
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+|    Name        | Language   |   Link                                                 | Format          | Summarize               |
++================+============+========================================================+=================+=========================+
+| Dress          | Python     | https://github.com/docileninja/dress                   | ELF             | Add static symbols      |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| objconv        | C++        | http://www.agner.org/optimize/#objconv                 | ELF/PE/MachO    | Format converter        |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| PEDetour       | C++        | https://github.com/chen-charles/PEDetour               | PE              | Hook exported functions |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| python-elf     | Python     | https://github.com/tbursztyka/python-elf               | ELF             | ELF binary format       |
+|                |            |                                                        |                 | manipulation            |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| PEDetour       | C++        | https://github.com/chen-charles/PEDetour               | PE              | Hook exported functions |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| libmaelf       | C          | https://github.com/tiago4orion/libmalelf               | ELF             | Library for Dissect and |
+|                |            |                                                        |                 | Infect ELF Binaries.    |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| peinjector     | C          | https://github.com/JonDoNym/peinjector                 | PE              | MITM PE file infector   |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| backdoor       | C++        | https://github.com/secretsquirrel/the-backdoor-factory | ELF/PE/MachO    | Patch PE, ELF, Mach-O   |
+| factory        |            |                                                        |                 | binaries with shellcode |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| RePEconstruct  | C          | https://github.com/DavidKorczynski/RePEconstruct       | PE              | PE Unpacker             |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| patchkit       | Python     | https://github.com/lunixbochs/patchkit                 | ELF             | Patch binary            |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| unstrip        | Python     | https://github.com/pzread/unstrip                      | ELF             | Unstrip static binary   |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| sym2elf        | Python     | https://github.com/danigargu/syms2elf                  | ELF             | Export IDA's symbols to |
+|                |            |                                                        |                 | the original binary     |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+| elfhash        | C          | https://github.com/cjacker/elfhash                     | ELF             | Manipulate ELF's hash   |
++----------------+------------+--------------------------------------------------------+-----------------+-------------------------+
+
+
+
+
diff --git a/doc/sphinx/tutorials/00_play_with_formats.rst b/doc/sphinx/tutorials/00_play_with_formats.rst
new file mode 100644
index 0000000..5213ff6
--- /dev/null
+++ b/doc/sphinx/tutorials/00_play_with_formats.rst
@@ -0,0 +1,74 @@
+00 - Parse and manipulate formats
+---------------------------------
+
+The objective of this tutorial is to give an overview of the LIEF's API to parse and manipulate formats
+
+-----
+
+ELF
+~~~
+
+We start by the ``ELF`` format. To create an :class:`.ELF.Binary` from a file we just have to give its path to the :func:`lief.parse` or :func:`lief.ELF.parse` functions
+
+.. note::
+
+  With the Python API, these functions have the same behaviour but in C++, :cpp:func:`LIEF::Parser::parse` will
+  return a pointer to a :cpp:class:`LIEF::Binary` object whereas :cpp:func:`LIEF::ELF::Parser::parse` will return
+  a :cpp:class:`LIEF::ELF::Binary` object
+
+.. code-block:: python
+
+  import lief
+  binary = lief.parse("/bin/ls")
+
+Once the ELF file has been parsed, we can access to its :class:`~lief.ELF.Header`:
+
+.. code-block:: python
+
+  header = binary.header
+
+Change the entry point and the target architecture (:class:`~lief.ELF.ARCH`)
+
+.. code-block:: python
+
+  header.entrypoint = 0x123
+  header.machine_type = lief.ELF.ARCH.AARCH64
+
+and then rebuild it:
+
+.. code-block:: python
+
+  binary.write("ls.modified")
+
+We can also iterate over binary :class:`~lief.ELF.Section`\s as follows:
+
+.. code-block:: python
+
+  for section in binary.sections:
+    print(section.name) # section's name
+    print(section.size) # section's size
+    print(len(section.content)) # Should match the previous print
+
+
+To modify the content of the ``.text`` section:
+
+.. code-block:: python
+
+  text = binary.get_section(".text")
+  text.content = bytes([0x33] * text.size)
+
+API of the ELF format is available here:
+
+  * Python
+  * C++
+  * C
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/sphinx/tutorials/02_pe_from_scratch.rst b/doc/sphinx/tutorials/02_pe_from_scratch.rst
new file mode 100644
index 0000000..77ca9d9
--- /dev/null
+++ b/doc/sphinx/tutorials/02_pe_from_scratch.rst
@@ -0,0 +1,155 @@
+02 - Create a PE from scratch
+-----------------------------
+
+In this tutorial we will see how to create a simple PE executable from scratch
+
+Scripts and materials are available here: `materials <https://github.com/lief-project/tutorials/tree/master/02_PE_from_Scratch>`_
+
+----------
+
+LIEF enables to create simple PE from scratch. The aim of this tutorial is to create an executable which pop a ``MessageBoxA`` with "Hello Word"
+
+First we have to create a :class:`~lief.PE.Binary` :
+
+
+.. code-block:: python
+
+  from lief import PE
+
+  binary32 = PE.Binary("pe_from_scratch", PE.PE_TYPE.PE32)
+
+The first parameter is the binary's name and the second one is the type: ``PE32`` or ``PE64`` (see :class:`~lief.PE.PE_TYPE`).
+The :class:`~lief.PE.Binary`'s constructor creates automatically :class:`~lief.PE.DosHeader`, :class:`~lief.PE.Header`, :class:`~lief.PE.OptionalHeader` and empty :class:`~lief.PE.DataDirectory`.
+
+Now that we have a minimal binary, we have to add sections. We will have a first section holding assembly code (``.text``) and a second one containing strings (``.data``):
+
+.. code-block:: python
+
+  section_text                 = PE.Section(".text")
+  section_text.content         = code
+  section_text.virtual_address = 0x1000
+
+  section_data                 = PE.Section(".data")
+  section_data.content         = data
+  section_data.virtual_address = 0x2000
+
+A ``MessageBoxA`` is composed of a title and a message. These two strings will be stored in the ``.data`` as follows:
+
+.. code-block:: python
+
+  title   = "LIEF is awesome\0"
+  message = "Hello World\0"
+
+  data =  list(map(ord, title))
+  data += list(map(ord, message))
+
+The **pseudo** assembly code of the ``.text`` section is given in next listing:
+
+.. code-block:: nasm
+
+    push 0x00              ; uType
+    push "LIEF is awesome" ; Title
+    push "Hello World"     ; Message
+    push 0                 ; hWnd
+    call MessageBoxA       ;
+    push 0                 ; uExitCode
+    call ExitProcess       ;
+
+
+Instead of pushing strings we have to push the **virtual address** of these strings. In the PE format a section's virtual address is in fact a **relative** virtual address (relative to :attr:`.OptionalHeader.imagebase` when the ASLR is not enabled). By default the :class:`~lief.PE.Binary`'s constructor set the :attr:`~lief.PE.OptionalHeader.imagebase` to ``0x400000``.
+
+As a result, the virtual address of the strings are:
+
+  * **title**: :attr:`~lief.PE.OptionalHeader.imagebase` + :attr:`~lief.PE.Section.virtual_address` + 0 = ``0x402000``
+  * **message**: :attr:`~lief.PE.OptionalHeader.imagebase` + :attr:`~lief.PE.Section.virtual_address` + ``len(title)`` = ``0x402010``
+
+.. code-block:: nasm
+
+    push 0x00              ; uType
+    push 0x402000          ; Title
+    push 0x402010          ; Message
+    push 0                 ; hWnd
+    call MessageBoxA       ;
+    push 0                 ; uExitCode
+    call ExitProcess       ;
+
+As the code uses ``MessageBoxA``, we need to import ``user32.dll`` into the binary's :class:`~lief.PE.Import`\s and the ``MessageBoxA`` :class:`~lief.PE.ImportEntry`.
+To do so we can use the :meth:`~lief.PE.Binary.add_library` method combined with :meth:`~lief.PE.Import.add_entry`:
+
+.. code-block:: python
+
+  user32 = binary32.add_library("user32.dll")
+  user32.add_entry("MessageBoxA")
+
+Same for ``ExitProcess`` (``kernel32.dll``):
+
+.. code-block:: python
+
+  kernel32 = binary32.add_library("kernel32.dll")
+  kernel32.add_entry("ExitProcess")
+
+Once needed libraries and functions are added to the binary, we have to determine their addresses (**I**\mport **A**\ddress **T**\able).
+
+For that we can use the :meth:`~lief.PE.Binary.predict_function_rva` method which will return the ``IAT`` address set by the :class:`~lief.PE.Builder`:
+
+
+.. automethod:: lief.PE.Binary.predict_function_rva
+  :noindex:
+
+
+.. code-block:: python
+
+  ExitProcess_addr = binary32.predict_function_rva("kernel32.dll", "ExitProcess")
+  MessageBoxA_addr = binary32.predict_function_rva("user32.dll", "MessageBoxA")
+  print("Address of 'ExitProcess': 0x{:06x} ".format(ExitProcess_addr))
+  print("Address of 'MessageBoxA': 0x{:06x} ".format(MessageBoxA_addr))
+
+
+.. code-block:: console
+
+  Address of 'ExitProcess': 0x00304c
+  Address of 'MessageBoxA': 0x003054
+
+Thus the **absolute** virtual addresses of ``MessageBoxA`` and ``ExitProcess`` are:
+
+  * ``MessageBoxA``: :attr:`~lief.PE.OptionalHeader.imagebase` + ``0x306a`` = ``0x40306a``
+  * ``ExitProcess``: :attr:`~lief.PE.OptionalHeader.imagebase` + ``0x305c`` = ``0x40305c``
+
+And the associated assembly code:
+
+.. code-block:: nasm
+
+    push 0x00              ; uType
+    push 0x402000          ; Title
+    push 0x402010          ; Message
+    push 0                 ; hWnd
+    call 0x40306a          ;
+    push 0                 ; uExitCode
+    call 0x40305c          ;
+
+
+The transformation of the :class:`~lief.PE.Binary` into an executable is performed by the :class:`~lief.PE.Builder` class.
+
+By default the import table is not rebuilt so we have to configure the builder to rebuild it:
+
+.. code-block:: python
+
+  builder = lief.PE.Builder(binary32)
+  builder.build_imports(True)
+  builder.build()
+  builder.write("pe_from_scratch.exe")
+
+
+You can now enjoy the newly binary created.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/sphinx/tutorials/03_elf_change_symbols.rst b/doc/sphinx/tutorials/03_elf_change_symbols.rst
new file mode 100644
index 0000000..2cb609c
--- /dev/null
+++ b/doc/sphinx/tutorials/03_elf_change_symbols.rst
@@ -0,0 +1,172 @@
+03 - Play with ELF symbols
+--------------------------
+
+In this tutorial we will see how to modify dynamic symbols in both a binary and a library.
+
+Scripts and materials are available here: `materials <https://github.com/lief-project/tutorials/tree/master/03_ELF_change_symbols>`_
+
+-----
+
+When a binary in linked against a library, the library needed is stored in a ``DT_NEEDED`` entry from the
+dynamic table and the functions needed are register in the dynamic symbols table with the following attributes:
+
+  * :attr:`~lief.ELF.Symbol.value` set to ``0``
+  * :attr:`~lief.ELF.Symbol.type` set to :attr:`~lief.ELF.SYMBOL_TYPES.FUNC`
+
+Similarly, when a library export functions it has a ``DT_SONAME`` entry in the dynamic table and the functions
+exported are register in the dynamic symbols table with the following attributes:
+
+  * :attr:`~lief.ELF.Symbol.value` set to address of the function in the library
+  * :attr:`~lief.ELF.Symbol.type` set to :attr:`~lief.ELF.SYMBOL_TYPES.FUNC`
+
+Imported and exported functions are abstract by LIEF thus you can iterate over this elements with :attr:`~lief.Binary.exported_functions` and :attr:`~lief.Binary.imported_functions`
+
+.. code-block:: python
+
+  import lief
+  binary  = lief.parse("/usr/bin/ls")
+  library = lief.parse("/usr/lib/libc.so.6")
+
+  print(binary.imported_functions)
+  print(library.exported_functions)
+
+
+When analyzing a binary, imported function name are very helpful for the reverse engineering. One solution is to link statically the binary and the library
+another solution is to blow mind the reverser by swapping this symbols.
+
+Take a look at the following code:
+
+.. code-block:: C
+
+  #include <stdio.h>
+  #include <stdlib.h>
+  #include <math.h>
+
+  double hashme(double input) {
+    return pow(input, 4) + log(input + 3);
+  }
+
+  int main(int argc, char** argv) {
+    if (argc != 2) {
+      printf("Usage: %s N\n", argv[0]);
+      return EXIT_FAILURE;
+    }
+
+    double N = (double)atoi(argv[1]);
+    double hash = hashme(N);
+    printf("%f\n", hash);
+
+    return EXIT_SUCCESS;
+  }
+
+Basically, this program takes an integer as argument and performs some computation on this value.
+
+.. code-block:: console
+
+  $ hasme 123
+  228886645.836282
+
+.. image:: ../_static/tutorial/03/hashme.png
+  :scale: 60 %
+  :align: center
+
+
+
+The ``pow`` and ``log`` functions are located in the ``libm.so.6`` library. One interesting tricks to do with LIEF is
+two swap this function **name** with other functions **name**. In this tutorial we will swap with ``cos`` and ``sin`` functions.
+
+First we have to load both the library and the binary:
+
+.. code-block:: python
+
+  #!/usr/bin/env python3
+  import lief
+
+
+  hasme = lief.parse("hasme")
+  libm  = lief.parse("/usr/lib/libm.so.6")
+
+Then when change the name of the two imported functions in the **binary**:
+
+
+.. code-block:: python
+
+  hashme_pow_sym = next(filter(lambda e : e.name == "pow", my_binary.imported_symbols))
+  hashme_log_sym = next(filter(lambda e : e.name == "log", my_binary.imported_symbols))
+
+  hashme_pow_sym.name = "cos"
+  hashme_log_sym.name = "sin"
+
+
+finally we swap ``log`` with ``sin`` and ``pow`` with ``cos`` in the **library** and we rebuild the two objects:
+
+.. code-block:: python
+
+  #!/usr/bin/env python3
+  import lief
+
+
+  hasme = lief.parse("hasme")
+  libm  = lief.parse("/usr/lib/libm.so.6")
+
+
+  def swap(obj, a, b):
+      symbol_a = next(filter(lambda e : e.name == a, obj.dynamic_symbols))
+      symbol_b = next(filter(lambda e : e.name == b, obj.dynamic_symbols))
+      b_name = symbol_b.name
+      symbol_b.name = symbol_a.name
+      symbol_a.name = b_name
+
+  hashme_pow_sym = next(filter(lambda e : e.name == "pow", my_binary.imported_symbols))
+  hashme_log_sym = next(filter(lambda e : e.name == "log", my_binary.imported_symbols))
+
+  hashme_pow_sym.name = "cos"
+  hashme_log_sym.name = "sin"
+
+
+  swap(libm, "log", "sin")
+  swap(libm, "pow", "cos")
+
+  hashme.write("hashme.obf")
+  libm.write("libm.so.6")
+
+.. image:: ../_static/tutorial/03/hashme_obf.png
+  :scale: 60 %
+  :align: center
+
+
+With this script, we built a modified ``libm`` in our current directory and we have to force the Linux loader to use this one when executing ``binary.obf``.
+To do so we export ``LD_LIBRARY_PATH`` to the current directory:
+
+.. code-block:: console
+
+  $ LD_LIBRARY_PATH=. hashme.obf 123
+  228886645.836282
+
+If we omit it, it will use the default ``libm`` and hash computation will be done witch ``sin`` and ``cos``:
+
+
+.. code-block:: console
+
+  $ hashme.obf 123
+  -0.557978
+
+
+One real use case could be to swap symbols in cryptography like OpenSSL. For example ``EVP_DecryptInit`` and ``EVP_EncryptInit`` have the same prototype so we could swapped.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/sphinx/tutorials/04_elf_hooking.rst b/doc/sphinx/tutorials/04_elf_hooking.rst
new file mode 100644
index 0000000..1f56e50
--- /dev/null
+++ b/doc/sphinx/tutorials/04_elf_hooking.rst
@@ -0,0 +1,70 @@
+04 - Hooking
+------------
+
+The objective of this tutorial is to hook a library function
+
+Scripts and materials are available here: `materials <https://github.com/lief-project/tutorials/tree/master/03_ELF_hooking>`_
+
+------
+
+In the previous tutorial we saw how to swap symbols name from a shared library, we will now see the mechanism to hook a function in a shared library.
+
+The targeted library is the standard math library (``libm.so``) and we will insert a hook on the ``exp`` function so that :math:`exp(x) = x + 1`. The source code of the sample that uses this function is given in the following listing:
+
+.. code-block:: cpp
+
+  #include <stdio.h>
+  #include <stdlib.h>
+  #include <math.h>
+
+  int main(int argc, char **argv) {
+    if (argc != 2) {
+      printf("Usage: %s <a> \n", argv[0]);
+      exit(-1);
+    }
+
+    int a = atoi(argv[1]);
+    printf("exp(%d) = %f\n", a, exp(a));
+    return 0;
+  }
+
+
+The hooking function is as simple as:
+
+.. code-block:: cpp
+
+  double hook(double x) {
+    return x + 1;
+  }
+
+Compiled with :code:`gcc -Os -nostdlib -nodefaultlibs -fPIC -Wl,-shared hook.c -o hook`.
+
+To inject this hook into the library, we use the :meth:`~lief.ELF.Binary.insert_content` method
+
+.. automethod:: lief.ELF.Binary.insert_content
+  :noindex:
+
+This method will insert our stub into the library and returns a tuple ``(offset, size)`` where ``offset`` is the location of the stub in the library and ``size`` the stub's size aligned. As a side effect, assembly code is shifted and various offsets are patched.
+
+Once the stub is injected we just have to change the address of the ``exp`` symbol:
+
+.. code-block:: python
+
+  exp_symbol = next(filter(lambda e : e.name == "exp", libm.exported_symbols))
+  hook_symbol = next(filter(lambda e : e.name == "hook", hook.exported_symbols))
+
+  exp_symbol.value = offset + hook_symbol.value
+
+
+To test the patched library:
+
+.. code-block:: console
+
+  ./do_math.bin 1
+  exp(1) = 2.718282
+  LD_LIBRARY_PATH=. ./do_math.bin 1
+  exp(1) = 2.000000
+
+
+
+
diff --git a/doc/sphinx/tutorials/05_elf_infect_plt_got.rst b/doc/sphinx/tutorials/05_elf_infect_plt_got.rst
new file mode 100644
index 0000000..8b8a2f7
--- /dev/null
+++ b/doc/sphinx/tutorials/05_elf_infect_plt_got.rst
@@ -0,0 +1,189 @@
+05 - Infect plt/got
+-------------------
+
+The objective of this tutorial is to hook an imported function in an ELF binary.
+
+Scripts and materials are available here: `materials <https://github.com/lief-project/tutorials/tree/master/05_ELF_infect_plt-got>`_
+
+-----
+
+Hooking imported functions by infecting the ``.got`` section is a well-known technique [#f1]_ [#f2]_ and this tutorial will be focused
+on its implementation using LIEF.
+
+These figures illustrate the ``plt/got`` mechanism:
+
+.. figure:: ../_static/tutorial/05/pltgot.png
+  :scale: 40 %
+  :align: center
+
+  With lazy binding, the first time that the function is called the ``got`` entry redirects to the plt instruction.
+
+
+.. figure:: ../_static/tutorial/05/pltgot3.png
+  :scale: 40 %
+  :align: center
+
+  The Second time, ``got`` entry holds the address in the shared library.
+
+
+
+Basically the infection is done in two steps:
+
+  * Firstly, we inject our hook
+  * Secondly, we redirect the targeted function to our hook by patching the ``got``
+
+It can be summed up by the following figure:
+
+.. figure:: ../_static/tutorial/05/pltgot2.png
+  :scale: 50 %
+  :align: center
+
+
+As example, we will use a basic *crackme* which performs a :manpage:`memcmp(3)` on the flag and user's input.
+
+.. code-block:: cpp
+
+  #include <stdio.h>
+  #include <stdlib.h>
+  #include <string.h>
+
+  // Damn_YoU_Got_The_Flag
+  char password[] = "\x18\x3d\x31\x32\x03\x05\x33\x09\x03\x1b\x33\x28\x03\x08\x34\x39\x03\x1a\x30\x3d\x3b";
+
+  inline int check(char* input);
+
+  int check(char* input) {
+    for (int i = 0; i < sizeof(password) - 1; ++i) {
+      password[i] ^= 0x5c;
+    }
+    return memcmp(password, input, sizeof(password) - 1);
+  }
+
+  int main(int argc, char **argv) {
+    if (argc != 2) {
+      printf("Usage: %s <password>\n", argv[0]);
+      return EXIT_FAILURE;
+    }
+
+    if (strlen(argv[1]) == (sizeof(password) - 1) && check(argv[1]) == 0) {
+      puts("You got it !!");
+      return EXIT_SUCCESS;
+    }
+
+    puts("Wrong");
+    return EXIT_FAILURE;
+
+  }
+
+The flag is *xored* with ``0x5C`` to validate the *crackme*, the user have to enter ``Damn_YoU_Got_The_Flag``:
+
+.. code-block:: console
+
+  $ crackme.bin foo
+  Wrong
+  $ crackme.bin Damn_YoU_Got_The_Flag
+  You got it !!
+
+The hook will consist to print arguments of ``memcmp`` and to return ``0``:
+
+.. code-block:: cpp
+
+  #include "arch/x86_64/syscall.c"
+  #define stdout 1
+
+  int my_memcmp(const void* lhs, const void* rhs, int n) {
+    const char msg[] = "Hook memcmp\n";
+    _write(stdout, msg, sizeof(msg));
+    _write(stdout, (const char*)lhs, n);
+    _write(stdout, "\n", 2);
+    _write(stdout, (const char*)rhs, n);
+    _write(stdout, "\n", 2);
+    return 0;
+  }
+
+As the hook is going to be injected into the crackme, it must have the following requirements:
+
+  * Assembly code must be *position independant* (compiled with ``-fPIC`` or ``-pie/-fPIE`` flags)
+  * Don't use external libraries such as ``libc.so`` (``-nostdlib -nodefaultlibs`` flags)
+
+
+Due to the requirements, the hook is compiled with: :code:`gcc -nostdlib -nodefaultlibs -fPIC -Wl,-shared hook.c -o hook`.
+
+Injecting the hook
+~~~~~~~~~~~~~~~~~~
+
+The first step is to inject the hook into the binary. To do so we will add a :class:`~lief.ELF.Segment`:
+
+.. code-block:: python
+
+  import lief
+
+  crackme = lief.parse("crackme.bin")
+  hook    = lief.parse("hook")
+
+  segment           = lief.ELF.Segment()
+  segment.type      = lief.ELF.SEGMENT_TYPES.LOAD
+  segment.flag      = lief.ELF.SEGMENT_FLAGS.PF_R | lief.ELF.SEGMENT_FLAGS.PF_W | lief.ELF.SEGMENT_FLAGS.PF_X
+  segment.data      = hook.segments[0].data # First LOAD segment which holds payload
+  segment.alignment = 8
+  segment           = crackme.add_segment(segment, base=0xA0000000, force_note=True)
+
+All assembly code of the hook stands in the first :attr:`~lief.ELF.SEGMENT_TYPES.LOAD` segment. To insert the newly created segment into binary,
+we will replace the :attr:`~lief.ELF.SEGMENT_TYPES.NOTE` entry. If there is not such :attr:`~lief.ELF.SEGMENT_TYPES.NOTE` entry we can use
+:func:`~lief.ELF.Binary.add_section`.
+
+The hook virtual base address is ``0xA0000000`` and we can processed to the ``got`` patching.
+
+Patching the ``got``
+~~~~~~~~~~~~~~~~~~~~
+
+LIEF provides a function to easily patch the ``got`` entry associated with a :class:`~lief.ELF.Symbol`:
+
+
+.. automethod:: lief.ELF.Binary.patch_pltgot
+  :noindex:
+
+The offset of the ``memcmp`` function is stored in the :attr:`~lief.ELF.Symbol.value` attribute of the associated dynamic symbol. Thus its virtual address will be:
+
+  * ``my_memcpy``: :attr:`~lief.ELF.Symbol.value` + ``0xA0000000``
+
+.. code-block:: python
+
+  my_memcmp = next(filter(lambda s : s.name == "my_memcmp", hook.dynamic_symbols))
+  my_memcmp_addr = segment.virtual_address + my_memcmp.value
+
+Finally we can patch the ``memcmp`` from the crakme with this value:
+
+.. code-block:: python
+
+  crackme.patch_pltgot('memcmp', my_memcmp_addr)
+
+And rebuild it:
+
+.. code-block:: python
+
+  crackme.write("crackme.hooked")
+
+
+Run
+~~~
+
+As a check on the input size is perform before checking the flag value, we have to provide an input with the correct length (no matter its content):
+
+.. code-block:: console
+
+  $ crackme.hooked XXXXXXXXXXXXXXXXXXXXX
+  Hook add
+  Damn_YoU_Got_The_Flag
+  XXXXXXXXXXXXXXXXXXXXX
+  You got it !!
+
+
+
+
+.. rubric:: Footnotes
+
+.. [#f1] http://vxheaven.org/lib/vrn00.html
+.. [#f2] Text of the second footnote.
+
+
diff --git a/doc/sphinx/tutorials/index.rst b/doc/sphinx/tutorials/index.rst
new file mode 100644
index 0000000..823f866
--- /dev/null
+++ b/doc/sphinx/tutorials/index.rst
@@ -0,0 +1,14 @@
+Tutorials
+=========
+
+.. toctree::
+  :maxdepth: 2
+
+  00_play_with_formats.rst
+  02_pe_from_scratch.rst
+  03_elf_change_symbols.rst
+  04_elf_hooking.rst
+  05_elf_infect_plt_got.rst
+
+
+
diff --git a/examples/c/CMakeLists.txt b/examples/c/CMakeLists.txt
new file mode 100644
index 0000000..9ee006f
--- /dev/null
+++ b/examples/c/CMakeLists.txt
@@ -0,0 +1,75 @@
+include(CheckCCompilerFlag)
+
+set(LIEF_ELF_C_EXAMPLES
+  elf_reader.c)
+
+set(LIEF_PE_C_EXAMPLES
+  pe_reader.c)
+
+set(LIEF_MACHO_C_EXAMPLES
+  macho_reader.c)
+
+set(LIEF_C_EXAMPLES)
+
+if (LIEF_ELF)
+  set(LIEF_C_EXAMPLES ${LIEF_C_EXAMPLES} ${LIEF_ELF_C_EXAMPLES})
+endif()
+
+if (LIEF_PE)
+  set(LIEF_C_EXAMPLES ${LIEF_C_EXAMPLES} ${LIEF_PE_C_EXAMPLES})
+endif()
+
+if (LIEF_MACHO)
+  set(LIEF_C_EXAMPLES ${LIEF_C_EXAMPLES} ${LIEF_MACHO_C_EXAMPLES})
+endif()
+
+if (LIEF_C_API)
+foreach(example ${LIEF_C_EXAMPLES})
+  string(REGEX REPLACE ".c\$" "" output_target "c_${example}")
+  string(REGEX REPLACE ".c\$" "" output_name "${example}")
+
+  add_executable(${output_target}        ${example})
+  add_executable(${output_target}_shared ${example})
+
+  target_include_directories(${output_target} PUBLIC
+    $<TARGET_PROPERTY:LIB_LIEF_STATIC,INCLUDE_DIRECTORIES>)
+
+  if (MSVC)
+	  set_property(TARGET ${output_target}        PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
+	  set_property(TARGET ${output_target}_shared PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
+
+	  target_compile_options(${output_target}_shared PUBLIC /MT)
+  endif()
+
+  set(LIEF_EXAMPLES_C_FLAGS)
+  CHECK_C_COMPILER_FLAG("-ansi" HAS_ANSI)
+  if (HAS_ANSI)
+    set(LIEF_EXAMPLES_C_FLAGS ${LIEF_EXAMPLES_C_FLAGS} -ansi)
+  endif()
+
+  set_property(TARGET ${output_target} ${output_target}_shared PROPERTY C_STANDARD          99)
+  set_property(TARGET ${output_target} ${output_target}_shared PROPERTY C_STANDARD_REQUIRED ON)
+
+  target_compile_options(${output_target}        PRIVATE ${LIEF_EXAMPLES_C_FLAGS})
+  target_compile_options(${output_target}_shared PRIVATE ${LIEF_EXAMPLES_C_FLAGS})
+
+  if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+    if (UNIX)
+      if (LIEF_FORCE32)
+        target_compile_options(${output_target} PRIVATE -m32)
+        target_compile_options(${output_target}_shared PRIVATE -m32)
+        set_property(TARGET ${output_target} ${output_target}_shared PROPERTY LINK_FLAGS -m32)
+      endif()
+    endif()
+  endif()
+
+
+
+  set_target_properties(${output_target}        PROPERTIES OUTPUT_NAME "${output_name}")
+  set_target_properties(${output_target}_shared PROPERTIES OUTPUT_NAME "${output_name}_shared")
+
+  target_link_libraries (${output_target}        LIB_LIEF_STATIC)
+  target_link_libraries (${output_target}_shared LIB_LIEF_SHARED)
+endforeach()
+endif()
+
diff --git a/examples/c/elf_reader.c b/examples/c/elf_reader.c
new file mode 100644
index 0000000..73082f5
--- /dev/null
+++ b/examples/c/elf_reader.c
@@ -0,0 +1,252 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+#include <LIEF/ELF.h>
+
+
+int main(int argc, char **argv) {
+  size_t i, j;
+
+  if (argc != 2) {
+    fprintf(stderr, "Usage: %s <elf binary>\n", argv[0]);
+    return EXIT_FAILURE ;
+  }
+
+  Elf_Binary_t *elf_binary = elf_parse(argv[1]);
+  fprintf(stdout, "Binary Name: %s\n", elf_binary->name);
+  fprintf(stdout, "Interpreter: %s\n", elf_binary->interpreter);
+
+  Elf_Header_t header = elf_binary->header;
+  uint8_t *identity = header.identity;
+  fprintf(stdout, "Header\n");
+  fprintf(stdout, "======\n");
+  fprintf(stdout, "Magic: %x %x %x %x\n",             identity[0], identity[1], identity[2], identity[3]);
+  fprintf(stdout, "Class: %s\n",                      ELF_CLASS_to_string(identity[EI_CLASS]));
+  fprintf(stdout, "Endianness: %s\n",                 ELF_DATA_to_string(identity[EI_DATA]));
+  fprintf(stdout, "Version: %s\n",                    VERSION_to_string(identity[EI_VERSION]));
+  fprintf(stdout, "OS/ABI: %s\n",                     OS_ABI_to_string(identity[EI_OSABI]));
+  fprintf(stdout, "File type: %s\n",                  E_TYPE_to_string(header.file_type));
+  fprintf(stdout, "Architecture: %s\n",               ARCH_to_string(header.machine_type));
+  fprintf(stdout, "Version: %s\n",                    VERSION_to_string(header.object_file_version));
+  fprintf(stdout, "Segments offset: 0x%" PRIx64 "\n", header.program_headers_offset);
+  fprintf(stdout, "Sections offset: 0x%" PRIx64 "\n", header.section_headers_offset);
+  fprintf(stdout, "Processor flags: %x\n",            header.processor_flags);
+  fprintf(stdout, "Header Size: %x\n",                header.header_size);
+  fprintf(stdout, "Program header size: %x\n",        header.program_header_size);
+  fprintf(stdout, "Nb segments: %d\n",                header.numberof_segments);
+  fprintf(stdout, "Section header size: %x\n",        header.sizeof_section_header);
+  fprintf(stdout, "Section header size: %x\n",        header.sizeof_section_header);
+  fprintf(stdout, "Nb sections: %d\n",                header.numberof_sections);
+  fprintf(stdout, "Name string table idx: %d\n",      header.name_string_table_idx);
+
+  Elf_Section_t** sections = elf_binary->sections;
+  /*for (size_t i = 0; sections[i] != NULL; ++i) {*/
+  for (i = 0; i < header.numberof_sections; ++i) {
+    Elf_Section_t* section = sections[i];
+    fprintf(stdout, ""
+        "%-20s "
+        "%-10s "
+        "0x%010" PRIx64 " "
+        "0x%010" PRIx64 " "
+        "0x%010" PRIx64 " "
+        "%d "
+        "0x%06" PRIx64 " "
+        "0x%06" PRIx64 " "
+        "%.6f "
+        "\n",
+        section->name,
+        SECTION_TYPES_to_string(section->type),
+        section->virtual_address,
+        section->size,
+        section->offset,
+        section->link,
+        section->alignment,
+        section->entry_size,
+        section->entropy
+        );
+    if (section->size > 3) {
+      fprintf(stdout, "content[0..3]: %02x %02x %02x\n",
+          section->content[0], section->content[1], section->content[2]);
+    }
+  }
+
+  /* Dynamic symbols */
+  fprintf(stdout, "Dynamic symbols:\n");
+  Elf_Symbol_t** dynamic_symbols = elf_binary->dynamic_symbols;
+  for (i = 0; dynamic_symbols[i] != NULL; ++i) {
+    Elf_Symbol_t* symbol = dynamic_symbols[i];
+    fprintf(stdout, ""
+        "%-20s "
+        "%-10s "
+        "%-10s "
+        "0x%02x "
+        "0x%02x"
+        "0x%010" PRIx64 " "
+        "0x%06" PRIx64 " "
+        "\n",
+        symbol->name,
+        SYMBOL_TYPES_to_string(symbol->type),
+        SYMBOL_BINDINGS_to_string(symbol->binding),
+        symbol->other,
+        symbol->shndx,
+        symbol->value,
+        symbol->size
+        );
+  }
+
+  /* Static symbols */
+  fprintf(stdout, "Static symbols:\n");
+  Elf_Symbol_t** static_symbols = elf_binary->static_symbols;
+  for (i = 0; static_symbols[i] != NULL; ++i) {
+    Elf_Symbol_t* symbol = static_symbols[i];
+    fprintf(stdout, ""
+        "%-20s "
+        "%-10s "
+        "%-10s "
+        "0x%02x "
+        "0x%02x"
+        "0x%010" PRIx64 " "
+        "0x%06" PRIx64 " "
+        "\n",
+        symbol->name,
+        SYMBOL_TYPES_to_string(symbol->type),
+        SYMBOL_BINDINGS_to_string(symbol->binding),
+        symbol->other,
+        symbol->shndx,
+        symbol->value,
+        symbol->size
+        );
+  }
+
+
+  fprintf(stdout, "Segments:\n");
+  Elf_Segment_t** segments = elf_binary->segments;
+  for (i = 0; segments[i] != NULL; ++i) {
+    Elf_Segment_t* segment = segments[i];
+    fprintf(stdout, ""
+        "%-20s "
+        "0x%06"  PRIx32 " "
+        "0x%010" PRIx64 " "
+        "0x%06"  PRIx64 " "
+        "0x%010" PRIx64 " "
+        "0x%06"  PRIx64 " "
+        "0x%06"  PRIx64 " "
+        "\n",
+        SEGMENT_TYPES_to_string(segment->type),
+        segment->flags,
+        segment->virtual_address,
+        segment->virtual_size,
+        segment->offset,
+        segment->size,
+        segment->alignment
+        );
+    if (segment->size > 3) {
+      fprintf(stdout, "content[0..3]: %02x %02x %02x\n",
+          segment->content[0], segment->content[1], segment->content[2]);
+    }
+  }
+
+  Elf_DynamicEntry_t **dynamic_entries = elf_binary->dynamic_entries;
+  for (i = 0; dynamic_entries[i] != NULL; ++i) {
+    Elf_DynamicEntry_t* entry = dynamic_entries[i];
+    switch(entry->tag) {
+      case DT_NEEDED:
+        {
+          Elf_DynamicEntry_Library_t* e = (Elf_DynamicEntry_Library_t*)entry;
+          fprintf(stdout, ""
+            "%-20s "
+            "0x%010" PRIx64 " "
+            "%-20s "
+            "\n",
+            DYNAMIC_TAGS_to_string(e->tag),
+            e->value,
+            e->name
+            );
+          break;
+        }
+      case DT_SONAME:
+        {
+          Elf_DynamicEntry_SharedObject_t* e = (Elf_DynamicEntry_SharedObject_t*)entry;
+          fprintf(stdout, ""
+            "%-20s "
+            "0x%010" PRIx64 " "
+            "%-20s "
+            "\n",
+            DYNAMIC_TAGS_to_string(e->tag),
+            e->value,
+            e->name
+            );
+          break;
+        }
+
+      case DT_RPATH:
+        {
+          Elf_DynamicEntry_Rpath_t* e = (Elf_DynamicEntry_Rpath_t*)entry;
+          fprintf(stdout, ""
+            "%-20s "
+            "0x%010" PRIx64 " "
+            "%-20s "
+            "\n",
+            DYNAMIC_TAGS_to_string(e->tag),
+            e->value,
+            e->rpath
+            );
+          break;
+        }
+
+      case DT_RUNPATH:
+        {
+          Elf_DynamicEntry_RunPath_t* e = (Elf_DynamicEntry_RunPath_t*)entry;
+          fprintf(stdout, ""
+            "%-20s "
+            "0x%010" PRIx64 " "
+            "%-20s "
+            "\n",
+            DYNAMIC_TAGS_to_string(e->tag),
+            e->value,
+            e->runpath
+            );
+          break;
+        }
+
+      case DT_INIT_ARRAY:
+      case DT_FINI_ARRAY:
+      case DT_PREINIT_ARRAY:
+        {
+          Elf_DynamicEntry_Array_t* e = (Elf_DynamicEntry_Array_t*)entry;
+          fprintf(stdout, ""
+            "%-20s "
+            "0x%010" PRIx64 " ",
+            DYNAMIC_TAGS_to_string(e->tag),
+            e->value
+            );
+          uint64_t* array = e->array;
+          for (j = 0; array[j] != 0; ++j) {
+            fprintf(stdout, "" "0x%06" PRIx64 " ", array[j]);
+          }
+
+          fprintf(stdout, "\n");
+          break;
+        }
+
+      default:
+        {
+          fprintf(stdout, ""
+            "%-20s "
+            "0x%010" PRIx64 " "
+            "\n",
+            DYNAMIC_TAGS_to_string(entry->tag),
+            entry->value
+            );
+          break;
+        }
+    }
+  }
+
+
+
+  elf_binary_destroy(elf_binary);
+
+  return EXIT_SUCCESS;
+}
diff --git a/examples/c/macho_reader.c b/examples/c/macho_reader.c
new file mode 100644
index 0000000..14fd714
--- /dev/null
+++ b/examples/c/macho_reader.c
@@ -0,0 +1,158 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+#include <LIEF/MachO.h>
+
+
+void print_binary(Macho_Binary_t* binary) {
+  fprintf(stdout, "Binary Name: %s\n", binary->name);
+
+  Macho_Header_t header = binary->header;
+  fprintf(stdout, "Header\n");
+  fprintf(stdout, "========\n");
+  fprintf(stdout, "Magic: 0x%" PRIx32 "\n",              header.magic);
+  fprintf(stdout, "CPU Type: %s\n",                      CPU_TYPES_to_string(header.cpu_type));
+  fprintf(stdout, "CPU SubType: 0x%" PRIx32 "\n",        header.cpu_subtype);
+  fprintf(stdout, "File type: %s\n",                     FILE_TYPES_to_string(header.file_type));
+  fprintf(stdout, "Number of commands: 0x%" PRIx32 "\n", header.nb_cmds);
+  fprintf(stdout, "Commands size: 0x%" PRIx32 "\n",      header.sizeof_cmds);
+  fprintf(stdout, "flags: 0x%" PRIx32 "\n",              header.flags);
+  fprintf(stdout, "reserved: 0x%" PRIx32 "\n",           header.reserved);
+
+  fprintf(stdout, "Commands\n");
+  fprintf(stdout, "========\n");
+  Macho_Command_t** commands = binary->commands;
+  for (size_t i = 0; commands[i] != NULL; ++i) {
+    Macho_Command_t* command = commands[i];
+    fprintf(stdout, ""
+        "%-20s "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "\n",
+        LOAD_COMMAND_TYPES_to_string(command->command),
+        command->size,
+        command->offset
+        );
+    if (command->size > 3) {
+      fprintf(stdout, "content[0..3]: %02x %02x %02x\n",
+          command->data[0], command->data[1], command->data[2]);
+    }
+  }
+
+  fprintf(stdout, "Segments\n");
+  fprintf(stdout, "========\n");
+  Macho_Segment_t** segments = binary->segments;
+  for (size_t i = 0; segments[i] != NULL; ++i) {
+    Macho_Segment_t* segment = segments[i];
+    fprintf(stdout, ""
+        "%-20s "
+        "0x%010" PRIx64 " "
+        "0x%010" PRIx64 " "
+        "0x%010" PRIx64 " "
+        "0x%010" PRIx64 " "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "\n",
+        segment->name,
+        segment->virtual_address,
+        segment->virtual_size,
+        segment->file_size,
+        segment->file_offset,
+        segment->max_protection,
+        segment->init_protection,
+        segment->numberof_sections,
+        segment->flags
+        );
+
+    if (segment->file_size > 3) {
+      fprintf(stdout, "content[0..3]: %02x %02x %02x\n",
+          segment->content[0], segment->content[1], segment->content[2]);
+    }
+  }
+
+
+  fprintf(stdout, "Sections\n");
+  fprintf(stdout, "========\n");
+  Macho_Section_t** sections = binary->sections;
+  for (size_t i = 0; sections[i] != NULL; ++i) {
+    Macho_Section_t* section = sections[i];
+    fprintf(stdout, ""
+        "%-20s "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "%-30s "
+        "0x%02" PRIx32 " "
+        "0x%02" PRIx32 " "
+        "0x%02" PRIx32 " "
+        "0x%010" PRIx64 " "
+        "0x%010" PRIx64 " "
+        "0x%010" PRIx64 " "
+        "%.6f "
+        "\n",
+        section->name,
+        section->alignment,
+        section->relocation_offset,
+        section->numberof_relocations,
+        section->flags,
+        MachO_SECTION_TYPES_to_string(section->type),
+        section->reserved1,
+        section->reserved2,
+        section->reserved3,
+        section->virtual_address,
+        section->offset,
+        section->size,
+        section->entropy
+        );
+    if (section->size > 3) {
+      fprintf(stdout, "content[0..3]: %02x %02x %02x\n",
+          section->content[0], section->content[1], section->content[2]);
+    }
+  }
+
+  fprintf(stdout, "Symbols\n");
+  fprintf(stdout, "=======\n");
+  Macho_Symbol_t** symbols = binary->symbols;
+  for (size_t i = 0; symbols[i] != NULL; ++i) {
+    Macho_Symbol_t* symbol = symbols[i];
+    fprintf(stdout, ""
+        "%-30s "
+        "0x%02" PRIx32 " "
+        "0x%02" PRIx32 " "
+        "0x%04" PRIx16 " "
+        "0x%010" PRIx64 " "
+        "\n",
+        symbol->name,
+        (uint32_t)symbol->type,
+        (uint32_t)symbol->numberof_sections,
+        symbol->description,
+        symbol->value
+        );
+  }
+
+
+}
+
+int main(int argc, char **argv) {
+  size_t idx;
+
+  if (argc != 2) {
+    fprintf(stderr, "Usage: %s <MachO binary>\n", argv[0]);
+    return EXIT_FAILURE ;
+  }
+
+  Macho_Binary_t** macho_binaries = macho_parse(argv[1]);
+  for (idx = 0; macho_binaries[idx] != NULL; ++idx) {
+    print_binary(macho_binaries[idx]);
+  }
+
+
+  macho_binaries_destroy(macho_binaries);
+
+  return EXIT_SUCCESS;
+
+}
diff --git a/examples/c/pe_reader.c b/examples/c/pe_reader.c
new file mode 100644
index 0000000..9dd4faa
--- /dev/null
+++ b/examples/c/pe_reader.c
@@ -0,0 +1,143 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+#include <LIEF/PE.h>
+
+
+int main(int argc, char **argv) {
+
+  if (argc != 2) {
+    fprintf(stderr, "Usage: %s <pe binary>\n", argv[0]);
+    return EXIT_FAILURE ;
+  }
+
+  Pe_Binary_t *pe_binary = pe_parse(argv[1]);
+
+  fprintf(stdout, "Binary Name: %s\n", pe_binary->name);
+
+  Pe_DosHeader_t dos_header = pe_binary->dos_header;
+
+  uint16_t *reserved = dos_header.reserved;
+  uint16_t *reserved2 = dos_header.reserved2;
+
+  fprintf(stdout, "DosHeader\n");
+  fprintf(stdout, "=========\n");
+  fprintf(stdout, "Used bytes in the last page: 0x%x\n",   dos_header.used_bytes_in_the_last_page);
+  fprintf(stdout, "File size in pages: 0x%x\n",            dos_header.file_size_in_pages);
+  fprintf(stdout, "Number of relocations: 0x%x\n",         dos_header.numberof_relocation);
+  fprintf(stdout, "Header size in paragraphs: 0x%x\n",     dos_header.header_size_in_paragraphs);
+  fprintf(stdout, "Minimum extra paragraphs: 0x%x\n",      dos_header.minimum_extra_paragraphs);
+  fprintf(stdout, "Maximum extra paragraphs: 0x%x\n",      dos_header.maximum_extra_paragraphs);
+  fprintf(stdout, "Initial relative ss: 0x%x\n",           dos_header.initial_relative_ss);
+  fprintf(stdout, "Initial sp: 0x%x\n",                    dos_header.initial_sp);
+  fprintf(stdout, "Checksum: 0x%x\n",                      dos_header.checksum);
+  fprintf(stdout, "Initial ip: 0x%x\n",                    dos_header.initial_ip);
+  fprintf(stdout, "Initial relative cs: 0x%x\n",           dos_header.initial_relative_cs);
+  fprintf(stdout, "Address of relocation table: 0x%x\n",   dos_header.addressof_relocation_table);
+  fprintf(stdout, "Overlay number: 0x%x\n",                dos_header.overlay_number);
+  fprintf(stdout, "Reserved: %x %x %x %x\n",               reserved[0], reserved[1], reserved[2], reserved[3]);
+  fprintf(stdout, "OEM id: 0x%x\n",                        dos_header.oem_id);
+  fprintf(stdout, "OEM info: 0x%x\n",                      dos_header.oem_info);
+  fprintf(stdout, "Reserved2: %x %x %x %x %x %x %x %x %x %x\n",
+      reserved2[0], reserved2[1], reserved2[2], reserved2[3], reserved2[4],
+      reserved2[5], reserved2[6], reserved2[7], reserved2[8], reserved2[9]);
+  fprintf(stdout, "Address of new exeheader: 0x%x\n",      dos_header.addressof_new_exeheader);
+
+
+  Pe_Header_t header = pe_binary->header;
+  fprintf(stdout, "Header\n");
+  fprintf(stdout, "======\n");
+  fprintf(stdout, "Machine: %s\n",                   MACHINE_TYPES_to_string(header.machine));
+  fprintf(stdout, "Number of sections: %d\n",        header.numberof_sections);
+  fprintf(stdout, "Timestamp: 0x%x\n",               header.time_date_stamp);
+  fprintf(stdout, "Pointer to symbol table: 0x%x\n", header.pointerto_symbol_table);
+  fprintf(stdout, "Number of symbols: %d\n",         header.numberof_symbols);
+  fprintf(stdout, "Sizeof optional header: 0x%x\n",  header.sizeof_optional_header);
+  fprintf(stdout, "Characteristics: 0x%x\n",         header.characteristics);
+
+
+  Pe_OptionalHeader_t optional_header = pe_binary->optional_header;
+  fprintf(stdout, "Optional Header\n");
+  fprintf(stdout, "===============\n");
+  fprintf(stdout, "Magic: %s\n", PE_TYPES_to_string(optional_header.magic));
+  fprintf(stdout, "Major linker version: 0x%x\n",           optional_header.major_linker_version);
+  fprintf(stdout, "Minor linker version: 0x%x\n",           optional_header.minor_linker_version);
+  fprintf(stdout, "Size ofcode: 0x%x\n",                    optional_header.sizeof_code);
+  fprintf(stdout, "Size of initialized data: 0x%x\n",       optional_header.sizeof_initialized_data);
+  fprintf(stdout, "Size of uninitialized data: 0x%x\n",     optional_header.sizeof_uninitialized_data);
+  fprintf(stdout, "Address of entrypoint: 0x%x\n",          optional_header.addressof_entrypoint);
+  fprintf(stdout, "Base of code: 0x%x\n",                   optional_header.baseof_code);
+  fprintf(stdout, "Base of data: 0x%x\n",                   optional_header.baseof_data);
+  fprintf(stdout, "Imagebase: 0x%" PRIx64 "\n",             optional_header.imagebase);
+  fprintf(stdout, "Section alignment: 0x%x\n",              optional_header.section_alignment);
+  fprintf(stdout, "File alignment: 0x%x\n",                 optional_header.file_alignment);
+  fprintf(stdout, "Major operating system version: 0x%x\n", optional_header.major_operating_system_version);
+  fprintf(stdout, "Minor operating system version: 0x%x\n", optional_header.minor_operating_system_version);
+  fprintf(stdout, "Major image version: 0x%x\n",            optional_header.major_image_version);
+  fprintf(stdout, "Minor image version: 0x%x\n",            optional_header.minor_image_version);
+  fprintf(stdout, "Major subsystem version: 0x%x\n",        optional_header.major_subsystem_version);
+  fprintf(stdout, "Minor subsystem version: 0x%x\n",        optional_header.minor_subsystem_version);
+  fprintf(stdout, "Win32 version value: 0x%x\n",            optional_header.win32_version_value);
+  fprintf(stdout, "Size of image: 0x%x\n",                  optional_header.sizeof_image);
+  fprintf(stdout, "Size of headers: 0x%x\n",                optional_header.sizeof_headers);
+  fprintf(stdout, "Checksum: 0x%x\n",                       optional_header.checksum);
+  fprintf(stdout, "subsystem: %s\n",                        SUBSYSTEM_to_string(optional_header.subsystem));
+  fprintf(stdout, "DLL characteristics: 0x%x\n",            optional_header.dll_characteristics);
+  fprintf(stdout, "Size of stack reserve: 0x%" PRIx64 "\n", optional_header.sizeof_stack_reserve);
+  fprintf(stdout, "Size of stack commit: 0x%" PRIx64 "\n",  optional_header.sizeof_stack_commit);
+  fprintf(stdout, "Size of heap reserve: 0x%" PRIx64 "\n",  optional_header.sizeof_heap_reserve);
+  fprintf(stdout, "Size of heap commit: 0x%" PRIx64 "\n",   optional_header.sizeof_heap_commit);
+  fprintf(stdout, "Loader flags: 0x%x\n",                   optional_header.loader_flags);
+  fprintf(stdout, "Number of rva and size: 0x%x\n",         optional_header.numberof_rva_and_size);
+
+
+  fprintf(stdout, "\nDataDirectories\n");
+  fprintf(stdout,   "===============\n");
+  Pe_DataDirectory_t** data_directories = pe_binary->data_directories;
+  for (size_t i = 0; data_directories[i] != NULL; ++i) {
+    fprintf(stdout, "RVA 0x%"  PRIx32 "\n", data_directories[i]->rva);
+    fprintf(stdout, "Size 0x%" PRIx32 "\n", data_directories[i]->size);
+  }
+
+  fprintf(stdout, "\nSections\n");
+  fprintf(stdout,   "========\n");
+
+  Pe_Section_t** sections = pe_binary->sections;
+  for (size_t i = 0; sections[i] != NULL; ++i) {
+    Pe_Section_t* section = sections[i];
+    fprintf(stdout, ""
+        "%-20s "
+        "0x%06" PRIx64 " "
+        "0x%06" PRIx64 " "
+        "0x%06" PRIx64 " "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "0x%06" PRIx32 " "
+        "%.6f "
+        "\n",
+        section->name,
+        section->virtual_address,
+        section->size,
+        section->offset,
+        section->virtual_size,
+        section->pointerto_relocation,
+        section->pointerto_line_numbers,
+        section->characteristics,
+        section->entropy
+        );
+
+    if (section->size > 3) {
+      fprintf(stdout, "content[0..3]: %02x %02x %02x\n",
+          section->content[0], section->content[1], section->content[2]);
+    }
+  }
+
+
+
+  pe_binary_destroy(pe_binary);
+
+  return EXIT_SUCCESS;
+
+}
diff --git a/examples/cpp/CMakeLists.txt b/examples/cpp/CMakeLists.txt
new file mode 100644
index 0000000..8a52816
--- /dev/null
+++ b/examples/cpp/CMakeLists.txt
@@ -0,0 +1,76 @@
+set(LIEF_ELF_CPP_EXAMPLES
+  elf_reader.cpp
+  elf_add_section.cpp
+  elf_builder.cpp
+  elf_section_rename.cpp
+  elf_strip.cpp
+  elf_symbols.cpp
+)
+
+
+set(LIEF_PE_CPP_EXAMPLES
+  pe_builder.cpp
+  pe_reader.cpp
+)
+
+
+set(LIEF_MACHO_CPP_EXAMPLES
+  macho_reader.cpp
+  macho_instrumentation.cpp
+  macho_builder.cpp
+)
+
+set(LIEF_CPP_EXAMPLES
+  abstract_reader.cpp
+)
+
+if (LIEF_ELF)
+  set(LIEF_CPP_EXAMPLES ${LIEF_CPP_EXAMPLES} ${LIEF_ELF_CPP_EXAMPLES})
+endif()
+
+
+if (LIEF_PE)
+  set(LIEF_CPP_EXAMPLES ${LIEF_CPP_EXAMPLES} ${LIEF_PE_CPP_EXAMPLES})
+endif()
+
+
+if (LIEF_MACHO)
+  set(LIEF_CPP_EXAMPLES ${LIEF_CPP_EXAMPLES} ${LIEF_MACHO_CPP_EXAMPLES})
+endif()
+
+
+foreach(example ${LIEF_CPP_EXAMPLES})
+  string(REGEX REPLACE ".cpp\$" "" output_name "${example}")
+  add_executable(${output_name} ${example})
+  add_executable(${output_name}_shared ${example})
+
+  # Don't use default include dir
+  set_property(TARGET ${output_name} ${output_name}_shared PROPERTY INCLUDE_DIRECTORIES "")
+
+  if (MSVC)
+    target_compile_options(${output_name}        PUBLIC /FIiso646.h)
+    target_compile_options(${output_name}_shared PUBLIC /FIiso646.h)
+
+	  target_compile_options(${output_name}_shared PUBLIC /MT)
+	  set_property(TARGET ${output_name} ${output_name}_shared PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
+  endif()
+
+  set_property(TARGET ${output_name} ${output_name}_shared PROPERTY CXX_STANDARD           11)
+  set_property(TARGET ${output_name} ${output_name}_shared PROPERTY CXX_STANDARD_REQUIRED  ON)
+
+  if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+    if (UNIX)
+      if (LIEF_FORCE32)
+        target_compile_options(${output_name} PRIVATE -m32)
+        target_compile_options(${output_name}_shared PRIVATE -m32)
+
+        set_property(TARGET ${output_name} PROPERTY LINK_FLAGS -m32)
+        set_property(TARGET ${output_name}_shared PROPERTY LINK_FLAGS -m32)
+      endif()
+    endif()
+  endif()
+
+  target_link_libraries(${output_name}        PUBLIC LIB_LIEF_STATIC)
+  target_link_libraries(${output_name}_shared PUBLIC LIB_LIEF_SHARED)
+endforeach()
+
diff --git a/examples/cpp/abstract_reader.cpp b/examples/cpp/abstract_reader.cpp
new file mode 100644
index 0000000..1049f88
--- /dev/null
+++ b/examples/cpp/abstract_reader.cpp
@@ -0,0 +1,62 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <memory>
+
+#include <LIEF/Abstract/Binary.hpp>
+#include <LIEF/Abstract/Parser.hpp>
+
+int main(int argc, char **argv) {
+  std::cout << "Abstract Reader" << std::endl;
+  if (argc != 2) {
+    std::cerr << "Usage: " << argv[0] << " <binary>" << std::endl;
+    return -1;
+  }
+
+  std::unique_ptr<const LIEF::Binary> binary{LIEF::Parser::parse(argv[1])};
+
+  std::cout << "== Header ==" << std::endl;
+  std::cout << binary->get_header() << std::endl;
+
+  std::cout << "== Sections ==" << std::endl;
+  for (const LIEF::Section& s : binary->get_sections()) {
+    std::cout << s << std::endl;
+  }
+
+  std::cout << "== Symbols ==" << std::endl;
+  for (const LIEF::Symbol& s : binary->get_symbols()) {
+    std::cout << s << std::endl;
+  }
+
+  std::cout << "== Exported functions ==" << std::endl;
+  for(const std::string& name : binary->get_exported_functions()) {
+    std::cout << name << std::endl;
+  }
+
+  std::cout << "== Imported functions ==" << std::endl;
+  for(const std::string& name : binary->get_imported_functions()) {
+    std::cout << name << std::endl;
+  }
+
+  std::cout << "== Imported Libraries ==" << std::endl;
+  for(const std::string& name : binary->get_imported_libraries()) {
+    std::cout << name << std::endl;
+  }
+
+  return 0;
+
+
+}
diff --git a/examples/cpp/elf_add_section.cpp b/examples/cpp/elf_add_section.cpp
new file mode 100644
index 0000000..6fcad6f
--- /dev/null
+++ b/examples/cpp/elf_add_section.cpp
@@ -0,0 +1,49 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <memory>
+#include <iostream>
+#include <fstream>
+#include <algorithm>
+#include <iterator>
+
+#include <tuple>
+
+#include <LIEF/ELF.hpp>
+
+using namespace LIEF::ELF;
+
+int main(int argc, char **argv) {
+  std::cout << "ELF Section rename" << std::endl;
+  if (argc != 3) {
+    std::cerr << "Usage: " << argv[0] << "<binary> <binary output name>" << std::endl;
+    return -1;
+  }
+
+  std::unique_ptr<Binary> binary{Parser::parse(argv[1])};
+  for (size_t i = 0; i < 2; ++i) {
+    Section new_section;
+    std::vector<uint8_t> d(4096, 0);
+    new_section.name("test");
+    new_section.content(d);
+    binary->add_section(new_section, true);
+  }
+
+
+  binary->write(argv[2]);
+
+  return 0;
+}
diff --git a/examples/cpp/elf_builder.cpp b/examples/cpp/elf_builder.cpp
new file mode 100644
index 0000000..93e11c7
--- /dev/null
+++ b/examples/cpp/elf_builder.cpp
@@ -0,0 +1,47 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+//
+// Description
+// ===========
+// The tool is used to test the rebuilding of a binary.
+// It take a binary as first argument, decompose it, rebuild the binary and then
+// save it (second argument)
+
+#include <iostream>
+#include <memory>
+#include <fstream>
+#include <algorithm>
+#include <iterator>
+
+#include <LIEF/logging.hpp>
+#include <LIEF/ELF.hpp>
+
+int main(int argc, char **argv) {
+  std::cout << "ELF builder" << std::endl;
+  if (argc != 3) {
+    std::cerr << "Usage: " << argv[0] << " <Input Binary> <Output Binary>" << std::endl;
+    return -1;
+  }
+
+  std::unique_ptr<LIEF::ELF::Binary> binary{LIEF::ELF::Parser::parse(argv[1])};
+  //LIEF::ELF::Builder builder{binary.release()};
+  //builder.empties_gnuhash(true);
+  //builder.build();
+  //builder.write(argv[2]);
+  binary->write(argv[2]);
+
+  return 0;
+}
diff --git a/examples/cpp/elf_reader.cpp b/examples/cpp/elf_reader.cpp
new file mode 100644
index 0000000..fa908bd
--- /dev/null
+++ b/examples/cpp/elf_reader.cpp
@@ -0,0 +1,120 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <memory>
+
+#include <LIEF/ELF.hpp>
+
+using namespace LIEF::ELF;
+
+int main(int argc, char **argv) {
+  if (argc != 2) {
+    std::cerr << "Usage: " << argv[0] << " <ELF binary>" << std::endl;
+    return EXIT_FAILURE;
+  }
+
+
+  std::unique_ptr<const Binary> binary;
+  try {
+    binary = std::unique_ptr<const Binary>{Parser::parse(argv[1])};
+  } catch (const LIEF::exception& e) {
+    std::cerr << e.what() << std::endl;
+    return EXIT_FAILURE;
+  }
+
+  std::cout << "Binary: " << binary->name() << std::endl;
+  std::cout << "== Header ==" << std::endl;
+  std::cout << binary->get_header() << std::endl;
+
+  std::cout << "== Sections ==" << std::endl;
+  for (const Section& section : binary->get_sections()) {
+    std::cout << section << std::endl;
+  }
+  std::cout << std::endl;
+
+  std::cout << "== Segments ==" << std::endl;
+  for (const Segment& segment : binary->get_segments()) {
+    std::cout << segment << std::endl;
+  }
+  std::cout << std::endl;
+
+  std::cout << "== Dynamic entries ==" << std::endl;
+  for (const DynamicEntry& entry : binary->get_dynamic_entries()) {
+    std::cout << entry << std::endl;
+  }
+
+  auto&& static_symbols = binary->get_static_symbols();
+  if (static_symbols.size() > 0) {
+    std::cout << "== Static symbols ==" << std::endl;
+    for (const Symbol& symbol : static_symbols) {
+      std::cout << symbol << std::endl;
+    }
+  }
+
+  std::cout << "== Dynamics symbols ==" << std::endl;
+  for (const Symbol& symbol : binary->get_dynamic_symbols()) {
+    std::cout << symbol << std::endl;
+  }
+
+  std::cout << "== Exported symbols ==" << std::endl;
+  for (const Symbol& symbol : binary->get_exported_symbols()) {
+    std::cout << symbol << std::endl;
+  }
+
+
+  std::cout << "== Imported symbols ==" << std::endl;
+  for (const Symbol& symbol : binary->get_imported_symbols()) {
+    std::cout << symbol << std::endl;
+  }
+
+
+  std::cout << "== Dynamic Relocations ==" << std::endl;
+  for (const Relocation& relocation : binary->get_dynamic_relocations()) {
+    std::cout << relocation << std::endl;
+  }
+
+  std::cout << "== PLT/GOT Relocations ==" << std::endl;
+  for (const Relocation& relocation : binary->get_pltgot_relocations()) {
+    std::cout << relocation << std::endl;
+  }
+
+
+  std::cout << "== GNU Hash ==" << std::endl;
+  std::cout << binary->get_gnu_hash() << std::endl;
+
+
+
+  //std::cout << "== Symbol Version ==" << std::endl;
+  //std::vector<SymbolVersion>* symbolsVersion = binary->get_symbol_version();
+  //for (const auto &symVersion : *symbolsVersion) {
+  //  std::cout << symVersion << std::endl;
+  //}
+
+
+  //std::cout << "== Symbols Version Requirement ==" << std::endl;
+  //std::vector<SymbolVersionRequirement> *symR = binary->get_symbol_version_requirement();
+  //for (SymbolVersionRequirement &symbolR : *symR) {
+  //  std::cout << symbolR << std::endl << std::endl;
+  //  auto symAux = symbolR.get_auxiliary_symbols();
+  //  for (auto &symbolAux : symAux) {
+  //    std::cout << *symbolAux << std::endl;
+  //  }
+  //  std::cout << std::endl;
+  //}
+
+  return 0;
+
+}
diff --git a/examples/cpp/elf_section_rename.cpp b/examples/cpp/elf_section_rename.cpp
new file mode 100644
index 0000000..2007fee
--- /dev/null
+++ b/examples/cpp/elf_section_rename.cpp
@@ -0,0 +1,71 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <memory>
+#include <iostream>
+#include <fstream>
+#include <algorithm>
+#include <iterator>
+
+#include <LIEF/ELF.hpp>
+
+//
+// Rename the first section name.
+// Ex: ./tools/ELFSectionRename /bin/ls ./lsRename
+//
+// $ readelf -S /bin/ls
+//
+//  [Nr] Nom               Type             Adresse           Décalage
+//       Taille            TaillEntrée      Fanion Lien  Info  Alignement
+//  [ 0]                   NULL             0000000000000000  00000000
+//       0000000000000000  0000000000000000           0     0     0
+//  [ 1] .interp           PROGBITS         0000000000400238  00000238
+//       000000000000001c  0000000000000000   A       0     0     1
+//  [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254
+//       0000000000000020  0000000000000000   A       0     0     4
+//
+// $ readelf -S ./lsRename
+//
+//  En-têtes de section :
+//  [Nr] Nom               Type             Adresse           Décalage
+//       Taille            TaillEntrée      Fanion Lien  Info  Alignement
+//  [ 0] toto              NULL             0000000000000000  00000000
+//       0000000000000000  0000000000000000           0     0     0
+//  [ 1] .interp           PROGBITS         0000000000400238  00000238
+//       000000000000001c  0000000000000000   A       0     0     1
+//  [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254
+//       0000000000000020  0000000000000000   A       0     0     4
+//  ....
+//
+//
+//
+int main(int argc, char **argv) {
+  std::cout << "ELF Section rename" << std::endl;
+  if (argc != 3) {
+    std::cerr << "Usage: " << argv[0] << " <Original Binary> <Output Binary>" << std::endl;
+    return -1;
+  }
+
+  std::unique_ptr<LIEF::ELF::Binary> binary{LIEF::ELF::Parser::parse(argv[1])};
+
+  LIEF::ELF::Section& section = binary->get_sections()[0];
+  section.name("toto");
+  binary->write(argv[2]);
+
+  return 0;
+
+
+}
diff --git a/examples/cpp/elf_strip.cpp b/examples/cpp/elf_strip.cpp
new file mode 100644
index 0000000..1e7f766
--- /dev/null
+++ b/examples/cpp/elf_strip.cpp
@@ -0,0 +1,36 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <memory>
+#include <fstream>
+#include <algorithm>
+#include <iterator>
+
+#include <LIEF/ELF.hpp>
+
+int main(int argc, char **argv) {
+  std::cout << "ELF Strip" << std::endl;
+  if (argc != 3) {
+    std::cerr << "Usage: " << argv[0] << " <Input Binary> <Output Binary>" << std::endl;
+    return -1;
+  }
+
+  std::unique_ptr<LIEF::ELF::Binary> binary{LIEF::ELF::Parser::parse(argv[1])};
+  binary->strip();
+  binary->write(argv[2]);
+
+  return 0;
+}
diff --git a/examples/cpp/elf_symbols.cpp b/examples/cpp/elf_symbols.cpp
new file mode 100644
index 0000000..5ffeac9
--- /dev/null
+++ b/examples/cpp/elf_symbols.cpp
@@ -0,0 +1,48 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <memory>
+
+#include <LIEF/ELF.hpp>
+
+using namespace LIEF::ELF;
+
+int main(int argc, char **argv) {
+  if (argc != 2) {
+    std::cerr << "Usage: " << argv[0] << " <ELF binary>" << std::endl;
+    return EXIT_FAILURE;
+  }
+
+  if (not is_elf(argv[1])) {
+    std::cerr << argv[1] << " is not a ELF file. Abort !" << std::endl;
+    return EXIT_FAILURE;
+  }
+
+  std::unique_ptr<const Binary> binary{Parser::parse(argv[1])};
+
+  std::cout << "== Exported Symbols ==" << std::endl;
+  for (const Symbol& symbol : binary->get_exported_symbols()) {
+    std::cout << symbol << std::endl;
+  }
+  std::cout << "== Imported Symbols ==" << std::endl;
+  for (const Symbol& symbol : binary->get_imported_symbols()) {
+    std::cout << symbol << std::endl;
+  }
+
+
+  return 0;
+
+}
diff --git a/examples/cpp/macho_builder.cpp b/examples/cpp/macho_builder.cpp
new file mode 100644
index 0000000..33a27c0
--- /dev/null
+++ b/examples/cpp/macho_builder.cpp
@@ -0,0 +1,50 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+//
+// Description
+// ===========
+// The tool is used to test the rebuilding of a binary.
+// It take a binary as first argument, decompose it, rebuild the binary and then
+// save it (second argument)
+//
+
+#include <iostream>
+#include <memory>
+#include <fstream>
+#include <algorithm>
+#include <iterator>
+
+#include <LIEF/MachO.hpp>
+
+using namespace LIEF;
+
+int main(int argc, char **argv) {
+  std::cout << "MachO Rebuilder" << std::endl;
+  if (argc != 3) {
+    std::cerr << "Usage: " << argv[0] << " <Input Binary> <Output Binary>" << std::endl;
+    return -1;
+  }
+
+  std::vector<MachO::Binary*> binaries = MachO::Parser::parse(argv[1]);
+  MachO::Binary*              binary   = binaries.back();
+  binary->write(argv[2]);
+
+  for (MachO::Binary *b : binaries) {
+    delete b;
+  }
+
+  return 0;
+}
diff --git a/examples/cpp/macho_instrumentation.cpp b/examples/cpp/macho_instrumentation.cpp
new file mode 100644
index 0000000..a962e4d
--- /dev/null
+++ b/examples/cpp/macho_instrumentation.cpp
@@ -0,0 +1,92 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <memory>
+#include <fstream>
+#include <algorithm>
+#include <iterator>
+
+#include <LIEF/MachO.hpp>
+
+using namespace LIEF;
+
+int main(int argc, char **argv) {
+  std::cout << "MachO Instrumentation" << std::endl;
+  if (argc != 3) {
+    std::cerr << "Usage: " << argv[0] << " <Input Binary> <Output Binary>" << std::endl;
+    return -1;
+  }
+
+  std::vector<MachO::Binary*> binaries = MachO::Parser::parse(argv[1]);
+  MachO::Binary*              binary   = binaries.back();
+  auto segments = binary->segments();
+  auto itSegment  = std::find_if(
+      std::begin(segments),
+      std::end(segments),
+      [] (const MachO::SegmentCommand& segment) {
+        return segment.name() == "__TEXT";
+      });
+
+  if (itSegment != std::end(segments) and (*itSegment).sections().size() > 0) {
+    MachO::SegmentCommand& segment = (*itSegment);
+    MachO::Section& section        = *segment.sections();
+    //segment.remove_all_sections();
+    //segment.virtual_address(0xdeadbeef);
+    //segment.name("foo");
+    //section.name("bar");
+  }
+
+  // Modify symbol's name
+  //auto symbols = binary->symbols();
+  //for (MachO::Symbol& symbol : symbols) {
+  //  symbol.name("toto");
+  //}
+
+
+  std::string segment_name = "__TEXT";
+  std::vector<uint8_t> payload(0x30, 0x33);
+
+  MachO::segment_command_64 segment_header;
+  std::copy(std::begin(segment_name), std::end(segment_name), segment_header.segname);
+  segment_header.segname[segment_name.size()] = 0;
+  segment_header.vmaddr   = 0x200050000;
+  segment_header.vmsize   = 0x2000;
+  segment_header.fileoff  = binary->original_size();
+  segment_header.filesize = payload.size();
+  segment_header.maxprot  = 7;
+  segment_header.initprot = 3;
+  segment_header.nsects   = 0;
+  segment_header.flags    = 0;
+  segment_header.cmdsize  = sizeof(segment_header);
+  segment_header.cmd      = static_cast<uint32_t>(MachO::LOAD_COMMAND_TYPES::LC_SEGMENT_64);
+
+  std::unique_ptr<MachO::LoadCommand> segment{ new MachO::SegmentCommand{&segment_header}};
+  segment->size(sizeof(segment_header));
+    static_cast<MachO::SegmentCommand*>(segment.get())->content(payload);
+
+  segment->data({
+      reinterpret_cast<uint8_t*>(&segment_header),
+      reinterpret_cast<uint8_t*>(&segment_header) + sizeof(segment_header)
+      });
+  //binary->insert_command(std::move(segment));
+  binary->write(argv[2]);
+
+  for (MachO::Binary *b : binaries) {
+    delete b;
+  }
+
+  return 0;
+}
diff --git a/examples/cpp/macho_reader.cpp b/examples/cpp/macho_reader.cpp
new file mode 100644
index 0000000..808aee7
--- /dev/null
+++ b/examples/cpp/macho_reader.cpp
@@ -0,0 +1,109 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <LIEF/MachO.hpp>
+
+#include <iostream>
+#include <iomanip>
+
+using namespace LIEF::MachO;
+
+void print_binary(const Binary* binary) {
+  std::cout << binary->header() << std::endl;
+
+  std::cout << "== Library ==" << std::endl;
+  for (const DylibCommand& library : binary->libraries()) {
+    std::cout << library << std::endl;
+  }
+  std::cout << std::endl;
+
+  std::cout << "== Sections ==" << std::endl;
+  for (const Section& section : binary->sections()) {
+    std::cout << section << std::endl;
+  }
+
+  //std::cout << "== Segments ==" << std::endl;
+
+  //for (SegmentCommand& segment : binary->segments()) {
+  //  std::cout << segment << std::endl;
+  //  if (segment.sections().size() > 0) {
+  //    //std::cout << std::hex;
+  //    //std::cout << std::left
+  //    // << std::setw(20) << "Name"
+  //    // << std::setw(17) << "Segment Name"
+  //    // << std::setw(10) << "Address"
+  //    // << std::setw(10) << "Size"
+  //    // << std::setw(10) << "Offset"
+  //    // << std::setw(10) << "Alignment"
+  //    // << std::setw(20) << "Relocation offset"
+  //    // << std::setw(20) << "Nb relocations"
+  //    // << std::setw(10) << "Flags"
+  //    // << std::setw(10) << "Reserved 1"
+  //    // << std::setw(10) << "Reserved 2"
+  //    // << std::setw(10) << "Reserved 3" << std::endl;
+  //    for (Section& section : segment.sections()) {
+  //      std::cout << " * " << section << std::endl;
+  //      auto content = section.content();
+  //    }
+  //  }
+  //}
+  //std::cout << std::endl;
+
+  //auto commands = binary->commands();
+  for (const LoadCommand& cmd : binary->commands()) {
+    std::cout << cmd << std::endl;
+    std::cout << "======================" << std::endl;
+  }
+
+  std::cout << "== Symbols ==" << std::endl;
+  for (const Symbol& symbol : binary->symbols()) {
+    std::cout << symbol << std::endl;
+  }
+
+
+  std::cout << "== Exported symbols ==" << std::endl;
+  for (const Symbol& symbol : binary->get_exported_symbols()) {
+    std::cout << symbol << std::endl;
+  }
+
+  std::cout << "== Imported symbols ==" << std::endl;
+  for (const Symbol& symbol : binary->get_imported_symbols()) {
+    std::cout << symbol << std::endl;
+  }
+
+
+
+
+}
+
+int main(int argc, char **argv) {
+  std::cout << "MachO Reader" << std::endl;
+  if (argc != 2) {
+    std::cerr << "Usage: " << argv[0] << " <MachO binary>" << std::endl;
+    return -1;
+  }
+  std::vector<Binary*> binaries = Parser::parse(argv[1]);
+  for (const Binary* binary : binaries) {
+    print_binary(binary);
+    std::cout << std::endl;
+  }
+
+  for (Binary* binary : binaries) {
+    delete binary;
+  }
+
+  return 0;
+}
+
diff --git a/examples/cpp/pe_builder.cpp b/examples/cpp/pe_builder.cpp
new file mode 100644
index 0000000..fad16a3
--- /dev/null
+++ b/examples/cpp/pe_builder.cpp
@@ -0,0 +1,54 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+//
+// Description
+// ===========
+// The tool is used to test the rebuilding of a binary.
+// It take a binary as first argument, decompose it, rebuild the binary and then
+// save it (second argument)
+//
+
+#include <iostream>
+#include <memory>
+#include <fstream>
+#include <algorithm>
+#include <iterator>
+
+#include <LIEF/PE.hpp>
+
+using namespace LIEF::PE;
+int main(int argc, char **argv) {
+  std::cout << "PE Rebuilder" << std::endl;
+  if (argc != 3) {
+    std::cerr << "Usage: " << argv[0] << " <Input Binary> <Output Binary>" << std::endl;
+    return -1;
+  }
+
+  std::unique_ptr<Binary> binary{Parser::parse(argv[1])};
+  Builder builder{binary.get()};
+
+  builder
+    .build_imports(false)
+    .patch_imports(false)
+    .build_tls(false)
+    .build_resources(false);
+
+  builder.build();
+  builder.write(argv[2]);
+  std::cout << binary->name() << std::endl;
+
+  return 0;
+}
diff --git a/examples/cpp/pe_reader.cpp b/examples/cpp/pe_reader.cpp
new file mode 100644
index 0000000..c67a2f2
--- /dev/null
+++ b/examples/cpp/pe_reader.cpp
@@ -0,0 +1,104 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <memory>
+
+#include <LIEF/PE.hpp>
+
+using namespace LIEF::PE;
+
+int main(int argc, char **argv) {
+  std::cout << "PE Reader" << std::endl;
+  if (argc != 2) {
+    std::cerr << "Usage: " << argv[0] << " <PE binary>" << std::endl;
+    return -1;
+  }
+
+  std::unique_ptr<const Binary> binary{Parser::parse(argv[1])};
+
+  std::cout << "== Dos Header ==" << std::endl;
+  std::cout << binary->dos_header() << std::endl;
+
+  std::cout << "== Header ==" << std::endl;
+  std::cout << binary->header() << std::endl;
+
+  std::cout << "== Optional Header ==" << std::endl;
+  std::cout << binary->optional_header() << std::endl;
+
+
+  std::cout << "== Data Directories ==" << std::endl;
+  for (const DataDirectory& directory : binary->data_directories()) {
+    std::cout << directory << std::endl;
+  }
+
+  std::cout << "== Sections ==" << std::endl;
+  for (const Section& section : binary->get_sections()) {
+    std::cout << section << std::endl;
+  }
+
+  if (binary->imports().size() > 0) {
+    std::cout << "== Imports ==" << std::endl;
+    for (const Import& import : binary->imports()) {
+      std::cout << import << std::endl;
+    }
+  }
+
+  if (binary->relocations().size() > 0) {
+    std::cout << "== Relocations ==" << std::endl;
+    for (const Relocation& relocation : binary->relocations()) {
+      std::cout << relocation << std::endl;
+    }
+  }
+
+  if (binary->has_tls()) {
+    std::cout << "== TLS ==" << std::endl;
+    std::cout << binary->tls() << std::endl;
+  }
+
+  if (binary->has_exports()) {
+    std::cout << "== Exports ==" << std::endl;
+    std::cout << binary->get_export() << std::endl;
+  }
+
+  if (binary->symbols().size() > 0) {
+    std::cout << "== Symbols ==" << std::endl;
+    for (const Symbol& symbol : binary->symbols()) {
+      std::cout << symbol << std::endl;
+    }
+  }
+
+
+  if (binary->has_debug()) {
+    std::cout << "== Debug ==" << std::endl;
+    std::cout << binary->get_debug() << std::endl;
+  }
+
+
+  if (binary->has_resources()) {
+    std::cout << "== Resources ==" << std::endl;
+    std::cout << binary->get_resources_manager() << std::endl;
+  }
+
+
+  if (binary->has_signature()) {
+    std::cout << "== Signature ==" << std::endl;
+    std::cout << binary->signature() << std::endl;
+  }
+
+
+
+  return 0;
+}
diff --git a/examples/python/abstract_json.py b/examples/python/abstract_json.py
new file mode 100644
index 0000000..7977c35
--- /dev/null
+++ b/examples/python/abstract_json.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description
+# -----------
+# Dump abstract informations in a JSON format
+# see: abstract_reader.py
+
+import argparse
+import sys
+import lief
+import json
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('binary', help = 'A binary')
+    args = parser.parse_args()
+
+    binary    = lief.parse(args.binary)
+    json_data = json.loads(lief.abstract_to_json(binary))
+    print(json.dumps(json_data, sort_keys = True, indent = 4))
+
+if __name__ == "__main__":
+    sys.exit(main())
+
diff --git a/examples/python/abstract_reader.py b/examples/python/abstract_reader.py
new file mode 100644
index 0000000..2d2a0e3
--- /dev/null
+++ b/examples/python/abstract_reader.py
@@ -0,0 +1,110 @@
+#/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description
+# -----------
+# Universal format reader.
+# Input can be PE, ELF or Mach-O
+
+import lief
+import sys
+
+def print_sections(sections):
+    print("== Sections ==")
+    f_title = "|{:<30} | {:<18}| {:<18}| {:<18}| {:<9}|"
+    f_value = "|{:<30} | 0x{:<16x}| 0x{:<16x}| 0x{:<16x}| {:<9.2f}|"
+    print(f_title.format("Name", "File offset", "Size", "Virtual Address", "Entropy"))
+    for section in sections:
+        print(f_value.format(\
+                section.name,\
+                section.offset,\
+                section.size,\
+                section.virtual_address,\
+                section.entropy))
+    print("")
+
+def print_symbols(symbols):
+
+    print("== Symbols ==")
+
+    f = "|{:<30} |"
+
+    print(f.format("Name"))
+
+    for symbol in symbols:
+        print(f.format(symbol.name))
+    print("")
+
+
+def print_exported_functions(functions):
+
+    print("== Exported functions ==")
+    f = "|{:<30} |"
+    print(f.format("Name"))
+    for func in functions:
+            print(f.format(func))
+    print("")
+
+def print_imported_functions(functions):
+
+    print("== Imported functions ==")
+    f = "|{:<30} |"
+    print(f.format("Name"))
+    for func in functions:
+        print(f.format(func))
+    print("")
+
+
+def print_imported_libraries(libraries):
+
+    print("== Imported Libraries ==")
+    f = "|{:<30} |"
+    print(f.format("Name"))
+    for library in libraries:
+        print(f.format(library))
+    print("")
+
+
+
+def read_binary(path):
+    print("== Abstract Reader ==")
+
+    binary   = lief.parse(path)
+    binary   = super(binary.__class__, binary)
+    try:
+        header        = binary.header
+        print(header)
+    except lief.not_implemented as e:
+        print(e)
+
+    sections      = binary.sections
+    symbols       = binary.symbols
+    func_exported = binary.exported_functions
+    func_imported = binary.imported_functions
+    libraries     = binary.libraries
+
+    if len(sections) > 0:
+        print_sections(sections)
+
+    if len(symbols) > 0:
+        print_symbols(symbols)
+
+    if len(func_exported) > 0:
+        print_exported_functions(func_exported)
+
+    if len(func_imported) > 0:
+        print_imported_functions(func_imported)
+
+    if len(libraries) > 0:
+        print_imported_libraries(libraries)
+
+
+
+if __name__ == "__main__":
+
+    if len(sys.argv) != 2:
+        print("Usage:", sys.argv[0], "<binary>")
+        sys.exit(1)
+
+    read_binary(sys.argv[1])
+
diff --git a/examples/python/elf_json.py b/examples/python/elf_json.py
new file mode 100644
index 0000000..e5df13b
--- /dev/null
+++ b/examples/python/elf_json.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description
+# -----------
+# Print information about a ELF binary in the JSON format
+#
+# python elf_json.py /bin/ls
+#  
+# {
+#   "dynamic_entries": [
+#        {
+#            "library": "libcap.so.2",
+#            "tag": "NEEDED",
+#            "value": 1
+#        },
+#        {
+#            "library": "libc.so.6",
+#            "tag": "NEEDED",
+#            "value": 74
+#        },
+# ...
+
+
+import argparse
+import sys
+import lief
+import json
+
+
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('binary', help='ELF binary')
+    args = parser.parse_args()
+
+    binary    = lief.parse(args.binary)
+    json_data = json.loads(lief.to_json(binary))
+    print(json.dumps(json_data, sort_keys = True, indent = 4))
+
+if __name__ == "__main__":
+    sys.exit(main())
+
diff --git a/examples/python/elf_reader.py b/examples/python/elf_reader.py
new file mode 100644
index 0000000..8ef7401
--- /dev/null
+++ b/examples/python/elf_reader.py
@@ -0,0 +1,392 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description
+# -----------
+# Print information about an ELF binary
+
+import lief
+from lief import ELF
+
+import sys
+import os
+
+from optparse import OptionParser
+terminal_rows, terminal_columns = 100, 100
+try:
+    terminal_rows, terminal_columns = os.popen('stty size', 'r').read().split()
+except ValueError:
+    pass
+
+terminal_columns = int(terminal_columns)
+terminal_rows    = int(terminal_rows)
+
+
+def print_header(binary):
+    header = binary.header
+    identity = header.identity
+
+
+    print("== Header ==\n")
+    format_str = "{:<30} {:<30}"
+    format_hex = "{:<30} 0x{:<28x}"
+    format_dec = "{:<30} {:<30d}"
+    format_ide = "{:<30} {:<02x} {:<02x} {:<02x} {:<02x}"
+    print(format_ide.format("Magic:",                 identity[0], identity[1], identity[2], identity[3]))
+    print(format_str.format("Class:",                 str(header.identity_class).split(".")[-1]))
+    print(format_str.format("Endianness:",            str(header.identity_data).split(".")[-1]))
+    print(format_str.format("Version:",               str(header.identity_version).split(".")[-1]))
+    print(format_str.format("OS/ABI:",                str(header.identity_os_abi).split(".")[-1]))
+    print(format_str.format("File Type:",             str(header.file_type).split(".")[-1]))
+    print(format_str.format("Machine Type:",          str(header.machine_type).split(".")[-1]))
+    print(format_str.format("Object File Version:",   str(header.object_file_version).split(".")[-1]))
+    print(format_hex.format("Entry Point:",           header.entrypoint))
+    print(format_hex.format("Program Header Offset:", header.program_header_offset))
+    print(format_hex.format("Section Header Offset:", header.section_header_offset))
+    print(format_hex.format("Processor flags:",       header.processor_flag))
+    print(format_dec.format("Header Size:",           header.header_size))
+    print(format_dec.format("Program Header Size:",   header.program_header_size))
+    print(format_dec.format("Number of segments:",    header.numberof_segments))
+    print(format_dec.format("Number of sections:",    header.numberof_sections))
+    print("")
+
+
+def print_sections(binary):
+    sections = binary.sections
+    if len(sections) > 0:
+        print("== Sections ==\n")
+        f_title = "|{:<30} | {:<12}| {:<17}| {:<12}| {:<10}| {:<8}| {:<8}|"
+        f_value = "|{:<30} | {:<12}| 0x{:<14x} | 0x{:<10x}| 0x{:<8x}| {:<8.2f}| {:<10}"
+        print(f_title.format("Name", "Type", "Virtual address", "File offset", "Size", "Entropy", "Segment(s)"))
+
+        for section in sections:
+            segments_str = " - ".join([str(s.type).split(".")[-1] for s in section.segments])
+            print(f_value.format(
+                section.name,
+                str(section.type).split(".")[-1],
+                section.virtual_address,
+                section.file_offset,
+                section.size,
+                abs(section.entropy),
+                segments_str))
+        print("")
+    else:
+        print("No sections")
+
+def print_segments(binary):
+    segments = binary.segments
+    # Segments
+    if len(segments) > 0:
+        print("== Segments ==\n")
+        f_title = "|{:<30} | {:<10}| {:<18}| {:<17}| {:<17}| {:<17}| {:<19}|"
+        f_value = "|{:<30} | {:<10}| 0x{:<16x}| 0x{:<15x}| 0x{:<15x}| 0x{:<15x}| {}"
+        print(f_title.format("Type",
+            "Flag", "File offset", "Virtual Address", "Virtual Size", "Size", "Sections"))
+
+        for segment in segments:
+            sections = segment.sections
+            s = ", ".join([section.name for section in sections])
+            print(f_value.format(
+                str(segment.type).split(".")[-1],
+                segment.flag,
+                segment.file_offset,
+                segment.virtual_address,
+                segment.virtual_size,
+                segment.physical_size, s))
+        print("")
+    else:
+        print("No segments")
+
+def print_dynamic_entries(binary):
+    dynamicEntries = binary.dynamic_entries
+    # Dynamic entries
+    if len(dynamicEntries) > 0:
+        print("== Dynamic entries ==\n")
+        f_title = "|{:<12} | {:<10}| {:<20}|"
+        f_value = "|{:<12} | 0x{:<8x}| {:<20}|"
+        print(f_title.format("Tag", "Value", "Info"))
+        for dynEntry in dynamicEntries:
+            if dynEntry.tag == ELF.DYNAMIC_TAGS.NULL:
+                continue
+            if dynEntry.tag in [ELF.DYNAMIC_TAGS.SONAME, ELF.DYNAMIC_TAGS.NEEDED, ELF.DYNAMIC_TAGS.RUNPATH, ELF.DYNAMIC_TAGS.RPATH]:
+                print(f_value.format(str(dynEntry.tag).split(".")[-1], dynEntry.value, dynEntry.name))
+            elif dynEntry.tag in [ELF.DYNAMIC_TAGS.INIT_ARRAY,ELF.DYNAMIC_TAGS.FINI_ARRAY]:
+                print(f_value.format(str(dynEntry.tag).split(".")[-1], dynEntry.value, ", ".join(map(hex, dynEntry.array))))
+            else:
+                print(f_value.format(str(dynEntry.tag).split(".")[-1], dynEntry.value, ""))
+
+        print("")
+
+def print_symbols(binary):
+
+    static_symbols       = binary.static_symbols
+    dynamic_symbols      = binary.dynamic_symbols
+
+    if len(static_symbols) > 0:
+        try:
+            maxsize = max([len(symbol.demangled_name) for symbol in static_symbols])
+        except:
+            maxsize = max([len(symbol.name) for symbol in static_symbols])
+        maxsize = min(maxsize, terminal_columns - 50) if terminal_columns > 50 else terminal_columns
+        f_title = "|{:<" + str(maxsize) + "} | {:<7}| {:<8}|"
+        f_value = "|{:<" + str(maxsize) + "} | {:<7}| {:<8x}|"
+
+        # Static symbols
+        print("== Static symbols ==\n")
+        print(f_title.format("Name", "Type", "Value", "Version"))
+        for symbol in static_symbols:
+            try:
+                symbol_name = symbol.demangled_name
+            except:
+                symbol_name = symbol.name
+            print(f_value.format(symbol_name, str(symbol.type).split(".")[-1], symbol.value))
+
+
+    if len(dynamic_symbols) > 0:
+        try:
+            maxsize = max([len(symbol.demangled_name) for symbol in dynamic_symbols])
+        except:
+            maxsize = max([len(symbol.name) for symbol in dynamic_symbols])
+        maxsize = min(maxsize, terminal_columns - 50) if terminal_columns > 50 else terminal_columns
+
+        f_title = "|{:<" + str(maxsize) + "} | {:<7}| {:<8}|"
+        f_value = "|{:<" + str(maxsize) + "} | {:<7}| {:<8x}|"
+
+        # Dynamic symbols
+        print("== Dynamic symbols ==\n")
+        print(f_title.format("Name", "Type", "Value", "Version"))
+
+        for symbol in dynamic_symbols:
+            symbol_version = symbol.symbol_version if symbol.has_version else ""
+
+            try:
+                symbol_name = symbol.demangled_name
+            except:
+                symbol_name = symbol.name
+            print(f_value.format(
+                symbol_name,
+                str(symbol.type).split(".")[-1],
+                symbol.value,
+                str(symbol_version)))
+
+def print_relocations(binary):
+    dynamicrelocations = binary.dynamic_relocations
+    pltgot_relocations = binary.pltgot_relocations
+
+    ## Dynamic relocations ##
+    if len(dynamicrelocations) > 0:
+        print("== Dynamic Relocations ==\n")
+        f_title = "|{:<10} | {:<10}| {:<30} |"
+        f_value = "|0x{:<8x} | {:<10}| {:<30} |"
+
+        print(f_title.format("Address", "Type", "Symbol"))
+
+        for relocation in dynamicrelocations:
+            type = str(relocation.type)
+            if binary.header.machine_type == ELF.ARCH.x86_64:
+                type = str(ELF.RELOCATION_X86_64(relocation.type))
+            elif binary.header.machine_type == ELF.ARCH.i386:
+                type = str(ELF.RELOCATION_i386(relocation.type))
+            elif binary.header.machine_type == ELF.ARCH.ARM:
+                type = str(ELF.RELOCATION_ARM(relocation.type))
+            s = relocation.symbol
+            print(f_value.format(relocation.address, type.split(".")[-1], str(relocation.symbol.name)))
+
+
+    if len(pltgot_relocations) > 0:
+        print("== PLT/GOT Relocations ==\n")
+        f_title = "|{:<10} | {:<10} |{:<30}|"
+        f_value = "|0x{:<8x} | {:<10} | {:<30}|"
+
+        print(f_title.format("Address", "Type", "Symbol"))
+
+        for relocation in pltgot_relocations:
+            type = str(relocation.type)
+            if binary.header.machine_type == ELF.ARCH.x86_64:
+                type = str(ELF.RELOCATION_X86_64(relocation.type))
+            elif binary.header.machine_type == ELF.ARCH.i386:
+                type = str(ELF.RELOCATION_i386(relocation.type))
+            elif binary.header.machine_type == ELF.ARCH.ARM:
+                type = str(ELF.RELOCATION_ARM(relocation.type))
+
+            symbol_name = str(relocation.symbol.name) if relocation.has_symbol else ""
+            print(f_value.format(relocation.address, type.split(".")[-1], symbol_name))
+
+def print_exported_symbols(binary):
+    symbols = binary.exported_symbols
+    f_title = "|{:<30} | {:<7}| {:<8}| {:<15}|"
+    f_value = "|{:<30} | {:<7}| {:<8x}| {:<15}|"
+    print("== Exported symbols ==\n")
+    print(f_title.format("Name", "Type", "Value", "Version"))
+
+    for symbol in symbols:
+        symbol_version = symbol.symbol_version if symbol.has_version else ""
+
+        print(f_value.format(
+            str(symbol.name),
+            str(symbol.type).split(".")[-1],
+            symbol.value,
+            str(symbol_version)))
+
+def print_imported_symbols(binary):
+    symbols = binary.imported_symbols
+    f_title = "|{:<30} | {:<7}| {:<8}| {:<15}|"
+    f_value = "|{:<30} | {:<7}| {:<8x}| {:<15}|"
+    print("== Imported symbols ==\n")
+    print(f_title.format("Name", "Type", "Value", "Version"))
+
+    for symbol in symbols:
+        symbol_version = symbol.symbol_version if symbol.has_version else ""
+
+        print(f_value.format(
+            str(symbol.name),
+            str(symbol.type).split(".")[-1],
+            symbol.value,
+            str(symbol_version)))
+
+def print_informations(binary):
+    print("== Informations ==\n")
+    format_str = "{:<30} {:<30}"
+    format_hex = "{:<30} 0x{:<28x}"
+    format_dec = "{:<30} {:<30d}"
+    print(format_str.format("Name:",         binary.name))
+    print(format_hex.format("Address base:", binary.imagebase))
+    print(format_hex.format("Virtual size:", binary.virtual_size))
+
+def print_gnu_hash(binary):
+    print("== GNU Hash ==\n")
+
+    gnu_hash = binary.gnu_hash
+
+    format_str = "{:<30} {}"
+    format_hex = "{:<30} 0x{:<28x}"
+    format_dec = "{:<30} {:<30d}"
+
+    print(format_dec.format("Number of buckets:",  gnu_hash.nb_buckets))
+    print(format_dec.format("First symbol index:", gnu_hash.symbol_index))
+    print(format_hex.format("Shift Count:",        gnu_hash.shift2))
+    print(format_str.format("Bloom filters:",      gnu_hash.bloom_filters))
+    print(format_str.format("Buckets:",            gnu_hash.buckets))
+    print(format_str.format("Hash values:",        gnu_hash.hash_values))
+
+
+
+
+
+def main():
+    optparser = OptionParser(
+            usage='Usage: %prog [options] <elf-file>',
+            add_help_option=False, # -h is a real option of readelf
+            prog=sys.argv[0])
+
+    optparser.add_option('-a', '--all',
+            action='store_true', dest='show_all',
+            help='Equivalent to: -h -l -S -s -r -d -V')
+
+    optparser.add_option('-d', '--dynamic',
+            action='store_true', dest='show_dynamic_tags',
+            help='Display the dynamic section')
+
+    optparser.add_option('-H', '--help',
+            action='store_true', dest='help',
+            help='Display this information')
+
+    optparser.add_option('-h', '--file-header',
+            action='store_true', dest='show_file_header',
+            help='Display the ELF file header')
+
+    optparser.add_option('-i', '--imported',
+            action='store_true', dest='show_imported_symbols',
+            help='Display imported symbols')
+
+    optparser.add_option('-l', '--program-headers', '--segments',
+            action='store_true', dest='show_program_header',
+            help='Display the program headers')
+
+    optparser.add_option('-S', '--section-headers', '--sections',
+            action='store_true', dest='show_section_header',
+            help="Display the sections' headers")
+
+    optparser.add_option('-e', '--headers',
+            action='store_true', dest='show_all_headers',
+            help='Equivalent to: -h -l -S')
+
+    optparser.add_option('-s', '--symbols', '--syms',
+            action='store_true', dest='show_symbols',
+            help='Display the symbol table')
+
+    optparser.add_option('-r', '--relocs',
+            action='store_true', dest='show_relocs',
+            help='Display the relocations (if present)')
+
+    optparser.add_option('-V', '--version-info',
+            action='store_true', dest='show_version_info',
+            help='Display the version sections (if present)')
+
+    optparser.add_option('-x', '--exported',
+            action='store_true', dest='show_exported_symbols',
+            help='Display exported symbols')
+
+    optparser.add_option('--gnu-hash',
+            action='store_true', dest='show_gnu_hash',
+            help='Display GNU Hash')
+
+
+    options, args = optparser.parse_args()
+
+    if options.help or len(args) == 0:
+        optparser.print_help()
+        sys.exit(0)
+
+
+    binary = ELF.parse(args[0])
+    print_informations(binary)
+    if options.show_all:
+        do_file_header = do_section_header = do_program_header = True
+
+    if options.show_all_headers:
+        do_file_header = do_section_header = do_program_header = True
+    else:
+        do_file_header    = options.show_file_header
+        do_section_header = options.show_section_header
+        do_program_header = options.show_program_header
+
+    if do_file_header or options.show_all:
+        print_header(binary)
+
+    if do_section_header or options.show_all:
+        print_sections(binary)
+
+    if do_program_header or options.show_all:
+        print_segments(binary)
+
+    if options.show_dynamic_tags or options.show_all:
+        print_dynamic_entries(binary)
+
+    if options.show_symbols or options.show_all:
+        print_symbols(binary)
+
+    if options.show_relocs or options.show_all:
+        print_relocations(binary)
+
+    if options.show_imported_symbols or options.show_all:
+        print_imported_symbols(binary)
+
+    if options.show_exported_symbols or options.show_all:
+        print_exported_symbols(binary)
+
+
+    if options.show_gnu_hash or options.show_all:
+        print_gnu_hash(binary)
+
+
+
+
+if __name__ == "__main__":
+    main()
+
+
+
+
+
+
diff --git a/examples/python/elf_remove_section_table.py b/examples/python/elf_remove_section_table.py
new file mode 100644
index 0000000..439a56c
--- /dev/null
+++ b/examples/python/elf_remove_section_table.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description
+# -----------
+# Remove the section table from an ELF binary
+# so that some tools are blow minded (e.g. gdb)
+#
+# Example:
+# $ python elf_remove_section_table.py /bin/ls ls_without_sections
+# $ ls
+# elf_remove_section_table.py ls_without_sections
+# $ ls_without_sections
+# $ elf_remove_section_table.py ls_without_sections
+# $ readelf -S ls_without_sections
+#
+# Il n'y a pas de section dans ce fichier.
+# $ gdb ls_without_sections
+# "ls_without_sections": not in executable format: File format not recognized
+
+import sys
+import lief
+from lief import ELF
+
+def remove_section_table(filename, output):
+    binary  = lief.parse(filename) # Build an ELF binary
+
+    header = binary.header
+    header.section_header_offset = 0;
+    header.numberof_sections     = 0;
+
+    binary.write(output);
+
+
+if __name__ == "__main__":
+
+    if len(sys.argv) != 3:
+        print("Usage: {} <elf binary> <output>".format(sys.argv[0]))
+        sys.exit(1)
+
+    remove_section_table(sys.argv[1], sys.argv[2])
diff --git a/examples/python/elf_symbol_obfuscation.py b/examples/python/elf_symbol_obfuscation.py
new file mode 100644
index 0000000..8938b53
--- /dev/null
+++ b/examples/python/elf_symbol_obfuscation.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+
+# In this example, we replace all statics symbols in the .symtab
+# with a random name.
+#
+# Example:
+#
+#     >>> readelf -s ./hello_c
+#
+#     28: 0600700 0 OBJECT  LOCAL  DEFAULT 19 __JCR_LIST__
+#     29: 0400420 0 FUNC    LOCAL  DEFAULT 12 deregister_tm_clones
+#     30: 0400460 0 FUNC    LOCAL  DEFAULT 12 register_tm_clones
+#     31: 04004a0 0 FUNC    LOCAL  DEFAULT 12 __do_global_dtors_aux
+#     32: 0600920 1 OBJECT  LOCAL  DEFAULT 24 completed.6940
+#     33: 06006f8 0 OBJECT  LOCAL  DEFAULT 18 __do_global_dtors_aux_fin
+#     ...
+#
+#     >>> python elf_symbol_obfuscation ./hello_c ./hello_c.obf
+#
+#     >>> readelf -s ./hello_c.obf
+#
+#     28: 0600700 0 OBJECT  LOCAL  DEFAULT 19 xnsffdfsryna
+#     29: 0400420 0 FUNC    LOCAL  DEFAULT 12 wsadqwrubbmdugrxzwiv
+#     30: 0400460 0 FUNC    LOCAL  DEFAULT 12 wrgeecrckeskyishte
+#     31: 04004a0 0 FUNC    LOCAL  DEFAULT 12 pqhfpptwtqzuiefrwnwdk
+#     32: 0600920 1 OBJECT  LOCAL  DEFAULT 24 vwevxfvdmcrjdv
+#     33: 06006f8 0 OBJECT  LOCAL  DEFAULT 18 rksefyibghsyhbbnfikknpvzc
+
+
+
+import lief
+import sys
+import random, string
+
+def randomword(length):
+   return ''.join(random.choice(string.ascii_lowercase) for i in range(length))
+
+def randomize(binary, output):
+
+    symbols = binary.static_symbols
+    if len(symbols) == 0:
+        print("No symbols")
+        return
+    for symbol in symbols:
+        symbol.name = randomword(len(symbol.name))
+
+    binary.write(output)
+
+if __name__ == '__main__':
+    if len(sys.argv) != 3:
+        print("Usage:", sys.argv[0], "<elf binary> <output binary>")
+        sys.exit(-1)
+
+    binary = lief.parse(sys.argv[1])
+    randomize(binary, sys.argv[2])
+
+
diff --git a/examples/python/elf_unstrip.py b/examples/python/elf_unstrip.py
new file mode 100644
index 0000000..0f2986e
--- /dev/null
+++ b/examples/python/elf_unstrip.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description
+# -----------
+# In this example, we assume that we found
+# the ``main`` function at address 0x402A00
+# and we add a static symbol to the binary
+# so that we can do:
+#
+# (gdb) break main
+# Breakpoint 1 at 0x402a00
+
+from lief import ELF
+import sys
+
+binary = ELF.parse(sys.argv[1])
+
+symtab_section             = ELF.Section()
+symtab_section.name        = ""
+symtab_section.type        = ELF.SECTION_TYPES.SYMTAB
+symtab_section.entry_size  = 0x18
+symtab_section.alignment   = 8
+symtab_section.link        = len(binary.sections) + 1
+symtab_section.content     = [0] * 100
+
+symstr_section            = ELF.Section()
+symstr_section.name       = ""
+symstr_section.type       = ELF.SECTION_TYPES.STRTAB
+symstr_section.entry_size = 1
+symstr_section.alignment  = 1
+symstr_section.content    = [0] * 100
+
+symtab_section = binary.add_section(symtab_section, False)
+symstr_section = binary.add_section(symstr_section, False)
+
+symbol         = ELF.Symbol()
+symbol.name    = ""
+symbol.type    = ELF.SYMBOL_TYPES.NOTYPE
+symbol.value   = 0
+symbol.binding = ELF.SYMBOL_BINDINGS.LOCAL
+symbol.size    = 0
+symbol.shndx   = 0
+symbol         = binary.add_static_symbol(symbol)
+
+symbol         = ELF.Symbol()
+symbol.name    = "main"
+symbol.type    = ELF.SYMBOL_TYPES.FUNC
+symbol.value   = 0x402A00
+symbol.binding = ELF.SYMBOL_BINDINGS.LOCAL
+symbol.shndx   = 14
+symbol         = binary.add_static_symbol(symbol)
+
+print(symbol)
+
+binary.write(sys.argv[2])
+
diff --git a/examples/python/entropy.py b/examples/python/entropy.py
new file mode 100644
index 0000000..3ded310
--- /dev/null
+++ b/examples/python/entropy.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Inspired from binwalk: https://github.com/devttys0/binwalk/
+#
+# Description:
+# Show show entropy of the differents binary's section
+#
+# Requirement: pyqtgraph
+
+
+import pyqtgraph as pg
+import sys
+import math
+from lief import parse, ELF, PE
+from pyqtgraph.Qt import QtCore, QtGui
+
+
+class Entropy(object):
+
+    DEFAULT_BLOCK_SIZE  = 512
+    DEFAULT_DATA_POINTS = 2048
+    DEFAULT_THRESHOLD   = 9
+
+    def __init__(self, path):
+        self.binary     = parse(path)
+        self.block_size = None
+        self.result     = dict((section, []) for section in self.binary.sections)
+
+
+    def entropy(self, data):
+        entropy = 0
+
+        if data:
+            length = len(data)
+
+            seen = dict(((x, 0) for x in range(0, 256)))
+            for byte in data:
+                seen[byte] += 1
+
+            for x in range(0, 256):
+                p_x = float(seen[x]) / length
+                if p_x > 0:
+                    entropy -= p_x * math.log(p_x, 2)
+
+        return (entropy)
+
+    def compute_entropy_section(self, section):
+        content = section.content
+        size    = len(content)
+
+        if self.block_size is None:
+            block_size = size / self.DEFAULT_DATA_POINTS
+            # Round up to the nearest DEFAULT_BLOCK_SIZE
+            block_size = int(block_size + ((self.DEFAULT_BLOCK_SIZE - block_size) % self.DEFAULT_BLOCK_SIZE))
+        else:
+            block_size = self.block_size
+
+        if block_size <= 0:
+            block_size = self.DEFAULT_BLOCK_SIZE
+
+        i = 0
+        while (i + block_size) < size:
+            entropy = self.entropy(content[i:i + block_size])
+            self.result[section].append((section.offset + i , entropy))
+            i += block_size
+
+
+    def plot(self):
+        plt = pg.plot(title = "Entropy")
+        plt.addLegend()
+
+        for idx, (section, result) in enumerate(self.result.items()):
+            x = []
+            y = []
+            for offset, entropy in result:
+                x.append(offset)
+                y.append(entropy)
+            if len(result) > self.DEFAULT_THRESHOLD:
+                c1 = plt.plot(x, y,\
+                        pen=pg.intColor(idx * 10, 100),\
+                        name=section.name,\
+                        antialias = True,\
+                        fillLevel=0,\
+                        fillBrush=pg.intColor(idx * 10, 100, alpha = 40))
+
+    def run(self):
+
+        for section in self.binary.sections:
+            self.compute_entropy_section(section)
+        self.plot()
+
+        if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
+            QtGui.QApplication.instance().exec_()
+
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        print("Usage: {} <binary>".format(sys.argv[0]))
+        sys.exit(0);
+
+    Entropy(sys.argv[1]).run()
+
diff --git a/examples/python/keygen/KeygenMe b/examples/python/keygen/KeygenMe
new file mode 100644
index 0000000..9c642d0
Binary files /dev/null and b/examples/python/keygen/KeygenMe differ
diff --git a/examples/python/keygen/lief_patch.py b/examples/python/keygen/lief_patch.py
new file mode 100644
index 0000000..c5d0e2d
--- /dev/null
+++ b/examples/python/keygen/lief_patch.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python2
+
+# Description
+# -----------
+# Patch binary to remove anti-debug
+
+import sys
+from lief import ELF
+import distorm3
+
+
+def remove_anti_debug(binary):
+    patch        = [0x83, 0xf8, 0xff, 0x90, 0x90] # cmp eax, 0xFFFFFFFF
+    ep           = binary.header.entrypoint
+    text_section = binary.section_from_virtual_address(ep)
+    code         = "".join(map(chr, text_section.content))
+    iterable     = distorm3.DecodeGenerator(text_section.virtual_address, code, distorm3.Decode32Bits)
+    for (offset, size, instruction, hexdump) in iterable:
+        if "CMP EAX, 0x3000" in instruction:
+            # Patch 3d 00 30 00 00
+            binary.patch_address(offset, patch)
+            print("[PATCH] %.8x: %-32s %s" % (offset, hexdump, instruction))
+
+    # Distorm didn't get this one
+    binary.patch_address(0x804936B, patch)
+
+def crack_it(binary):
+    # user: what you wants
+    # serial: any NUMBER
+
+    patch1 = [0x31, 0xD2] # xor edx, edx
+    patch2 = [0x31, 0xC0] # xor eax, eax
+
+    binary.patch_address(0x8049486, patch1) # xor edx, edi --> xor edx, edx
+    binary.patch_address(0x8049488, patch2) # xor eax, ecx --> xor eax, eax
+
+def main(argv):
+    binary = ELF.parse("./KeygenMe")
+    remove_anti_debug(binary)
+    crack_it(binary)
+    binary.write("./KeygenMe.crack")
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))
+
+
+
+
diff --git a/examples/python/library_symbols_obfuscation/Makefile b/examples/python/library_symbols_obfuscation/Makefile
new file mode 100644
index 0000000..d8f333f
--- /dev/null
+++ b/examples/python/library_symbols_obfuscation/Makefile
@@ -0,0 +1,26 @@
+CC=gcc
+CXX=g++
+
+all: binadd.bin obfu
+
+libadd.so: libadd.c
+	$(CC) -Wl,--hash-style=gnu -fPIC -shared -o $@ $^
+
+binadd.bin: binadd.c libadd.so
+	$(CC) $^ -Wl,--hash-style=gnu -L. -ladd -o $@
+	chmod a+rx $@
+
+run: libadd.so binadd.bin obfu
+	LD_LIBRARY_PATH=. ./binadd.bin 1 2
+	LD_LIBRARY_PATH=. ./binadd_obf.bin 1 2
+
+
+obfu: binadd.bin libadd.so
+	python ./obfu.py
+	chmod a+x *.bin
+	chmod a+x *.so
+
+.PHONY: clean
+
+clean:
+	rm -rf *.o *~ *.so *.bin
diff --git a/examples/python/library_symbols_obfuscation/README.md b/examples/python/library_symbols_obfuscation/README.md
new file mode 100644
index 0000000..7491e39
--- /dev/null
+++ b/examples/python/library_symbols_obfuscation/README.md
@@ -0,0 +1,8 @@
+Presentation
+============
+
+The aim of this example is to show how we can change dynamic symbols in both
+library and binary.
+
+In the example we will change the symbol `add` to `abc` and the library name
+`libadd.so` to `libabc.so`
diff --git a/examples/python/library_symbols_obfuscation/binadd.c b/examples/python/library_symbols_obfuscation/binadd.c
new file mode 100644
index 0000000..d1a0cbb
--- /dev/null
+++ b/examples/python/library_symbols_obfuscation/binadd.c
@@ -0,0 +1,16 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "libadd.h"
+
+int main(int argc, char **argv) {
+  if (argc != 3) {
+    printf("Usage: %s <a> <b>\n", argv[0]);
+    exit(-1);
+  }
+
+  int res = add(atoi(argv[1]), atoi(argv[2]));
+  printf("From myLIb, a + b = %d\n", res);
+  return 0;
+}
+
diff --git a/examples/python/library_symbols_obfuscation/libadd.c b/examples/python/library_symbols_obfuscation/libadd.c
new file mode 100644
index 0000000..6611953
--- /dev/null
+++ b/examples/python/library_symbols_obfuscation/libadd.c
@@ -0,0 +1,9 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include "libadd.h"
+
+int add(int a, int b) {
+  printf("%d + %d = %d\n", a, b, a+b);
+  return a + b;
+}
+
diff --git a/examples/python/library_symbols_obfuscation/libadd.h b/examples/python/library_symbols_obfuscation/libadd.h
new file mode 100644
index 0000000..56eae1b
--- /dev/null
+++ b/examples/python/library_symbols_obfuscation/libadd.h
@@ -0,0 +1,16 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+int add(int a, int b);
diff --git a/examples/python/library_symbols_obfuscation/obfu.py b/examples/python/library_symbols_obfuscation/obfu.py
new file mode 100644
index 0000000..9cacecd
--- /dev/null
+++ b/examples/python/library_symbols_obfuscation/obfu.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+import lief
+
+libadd = lief.ELF.parse("./libadd.so")
+binadd = lief.ELF.parse("./binadd.bin")
+
+libadd_dynsym = libadd.dynamic_symbols
+binadd_dynsym = binadd.dynamic_symbols
+
+# Change add in the libary
+for sym in libadd_dynsym:
+    if sym.name == "add":
+        sym.name = "abc"
+
+# Change "add" in the binary
+for sym in binadd_dynsym:
+    if sym.name == "add":
+        sym.name = "abc"
+
+
+# change library name in the binary
+for entry in binadd.dynamic_entries:
+    if entry.tag == lief.ELF.NEEDED and entry.name == "libadd.so":
+        entry.name = "libabc.so"
+
+
+libadd.write("libabc.so");
+binadd.write("binadd_obf.bin")
+
+
diff --git a/examples/python/macho_reader.py b/examples/python/macho_reader.py
new file mode 100644
index 0000000..d4b5dc4
--- /dev/null
+++ b/examples/python/macho_reader.py
@@ -0,0 +1,91 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description
+# -----------
+# Print informations about a Mach-O binary
+
+from lief import MachO
+
+import sys
+
+def read_fit_binary(binary):
+    header    = binary.header
+    commands  = binary.commands
+    libraries = binary.libraries
+    sections  = binary.sections
+    segments  = binary.segments
+
+    format_str = "{:<33} {:<30}"
+    format_hex = "{:<33} 0x{:<28x}"
+    format_dec = "{:<33} {:<30d}"
+
+    print("== Header ==")
+    flags = ""
+    for flag in header.flags:
+        flag = str(flag).split(".")[-1]
+        flags += (flag if len(flags) == 0 else " - " + flag)
+
+    print(format_hex.format("Magic:",              header.magic))
+    print(format_str.format("CPU Type:",           str(header.cpu_type).split(".")[-1]))
+    print(format_hex.format("CPU sub-type:",       header.cpu_subtype))
+    print(format_str.format("File Type:",          str(header.file_type).split(".")[-1]))
+    print(format_str.format("Flags:",              flags))
+    print(format_dec.format("Number of commands:", header.nb_cmds))
+    print(format_hex.format("Size of commands:",   header.sizeof_cmds))
+    print(format_hex.format("Reserved:",           header.reserved))
+    print(binary.imagebase)
+
+    print("== Commands ==")
+    for command in commands:
+        print(format_str.format("Type:",    str(command.command).split(".")[-1]))
+        print(format_hex.format("Size:",    command.size))
+        print(format_hex.format("Offset:",  command.command_offset))
+        print("")
+
+    print("== Imported Libraries ==")
+    # name timestamp current_version compatibility_version
+    f_title = "|{:<30}|{:<10}|{:<16}|{:<22}|"
+    f_value = "|{:<30}|{:<10d}|{:<16x}|{:<22x}|"
+    print(f_title.format("Name", "Timestamp", "Current Version", "Compatibility Version"))
+    for library in libraries:
+        print(f_value.format(library.name, library.timestamp, library.current_version, library.compatibility_version))
+
+    print("== Segments ==")
+    for segment in segments:
+        print(segment.name)
+        print(len(segment.content))
+
+    print("== Sections ==")
+    for section in sections:
+        print(section.type)
+
+    print("== Exported Symbols ==")
+    for symbol in binary.exported_symbols:
+        print(symbol)
+
+
+    print("== Imported Symbols ==")
+    for symbol in binary.imported_symbols:
+        print(symbol)
+
+
+
+
+
+
+
+def read_macho(path_to_binary):
+    binaries = MachO.parse(path_to_binary)
+    #for binary in binaries:
+    read_fit_binary(binaries[0])
+
+
+
+if __name__ == "__main__":
+
+    if len(sys.argv) != 2:
+        print("Usage:", sys.argv[0], "<Mach-O binary>")
+        sys.exit(-1)
+
+    read_macho(sys.argv[1])
diff --git a/examples/python/nm.py b/examples/python/nm.py
new file mode 100644
index 0000000..a59c6d4
--- /dev/null
+++ b/examples/python/nm.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description
+# -----------
+#
+# This tool is a cross format Linux nm like. It prints all symbols
+# present in the binary. For `PE` it will print symbols in the *symbol section*
+# and for `ELF` it will print *static* symbols **AND** *dynamic* symbols.
+#
+# Example:
+#
+# >>> nm("/usr/bin/ls")
+# >>> nm("C:\\Windows\\explorer.exe")
+
+import sys
+from lief import *
+
+def nm(filename):
+    """ Return symbols from *filename* binary """
+    binary  = parse(filename) # Build an abstract binary
+    symbols = binary.symbols
+
+    if len(symbols) > 0:
+        for symbol in symbols:
+            print(symbol)
+    else:
+        print("No symbols found")
+
+
+if __name__ == "__main__":
+
+    if len(sys.argv) != 2:
+        print("Usage: " + sys.argv[0] + " <binary>")
+        sys.exit(-1)
+
+    nm(sys.argv[1])
+
+
diff --git a/examples/python/pe_authenticode.py b/examples/python/pe_authenticode.py
new file mode 100644
index 0000000..8e79fba
--- /dev/null
+++ b/examples/python/pe_authenticode.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import sys
+import lief
+
+# Description:
+# -----------
+# Print certificates included in a signed PE
+#
+# Example:
+# python pe_authenticode.py driver.sys
+#
+# Version:                      3
+# Serial Number:                61:04:ca:69:00:00:00:00:00:08
+# Signature Alogrithm:          SHA1_WITH_RSA_ENCRYPTION
+# Valid from:                   2007-6-5 22:3:21
+# Valid to:                     2012-6-5 22:13:21
+# Issuer:                       C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Time-Stamp PCA
+# Subject:                      C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, OU=nCipher DSE ESN:A5B0-CDE0-DC94, CN=Microsoft Time-Stamp Service
+#
+# Version:                      3
+# Serial Number:                61:01:c6:c1:00:00:00:00:00:07
+# Signature Alogrithm:          SHA1_WITH_RSA_ENCRYPTION
+# Valid from:                   2008-10-22 20:39:22
+# Valid to:                     2010-1-22 20:49:22
+# Issuer:                       C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, CN=Microsoft Windows Verification PCA
+# Subject:                      C=US, ST=Washington, L=Redmond, O=Microsoft Corporation, OU=MOPR, CN=Microsoft Windows
+# ....
+
+def print_crt(binary):
+    for crt in binary.signature.certificates:
+        print(crt)
+
+if __name__ == '__main__':
+    if len(sys.argv) != 2:
+        print("Usage: {} <pe_binary>".format(sys.argv[0]))
+        sys.exit(1)
+
+    binary = lief.parse(sys.argv[1])
+    print_crt(binary)
+
+
+
diff --git a/examples/python/pe_from_scratch.py b/examples/python/pe_from_scratch.py
new file mode 100644
index 0000000..d9a38d2
--- /dev/null
+++ b/examples/python/pe_from_scratch.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+# Description:
+# Create a PE which pop a MessageBox
+# with the message "Hello World"
+
+from lief import PE
+
+title   = "LIEF is awesome\0"
+message = "Hello World\0"
+
+data =  list(map(ord, title))
+data += list(map(ord, message))
+code = [
+        0x6a, 0x00,                         # push 0x00 uType
+        0x68, 0x00, 0x20, 0x40, 0x00,       # push VA(title)
+        0x68, 0x10, 0x20, 0x40, 0x00,       # push VA(message)
+        0x6a, 0x00,                         # push 0 hWnd
+        0xFF, 0x15, 0x54, 0x30, 0x40, 0x00, # call MessageBoxA
+        0x6A, 0x00,                         # push 0 uExitCode
+        0xFF, 0x15, 0x4C, 0x30, 0x40, 0x00  # call ExitProcess
+        ]
+
+binary32 = PE.Binary("pe_from_scratch", PE.PE_TYPE.PE32)
+
+section_text                 = PE.Section(".text")
+section_text.content         = code
+section_text.virtual_address = 0x1000
+
+section_data                 = PE.Section(".data")
+section_data.content         = data
+section_data.virtual_address = 0x2000
+
+section_text = binary32.add_section(section_text, PE.SECTION_TYPES.TEXT)
+section_data = binary32.add_section(section_data, PE.SECTION_TYPES.DATA)
+
+print(section_text)
+print(section_data)
+
+binary32.optional_header.addressof_entrypoint = section_text.virtual_address
+
+kernel32 = binary32.add_library("kernel32.dll")
+kernel32.add_entry("ExitProcess")
+
+user32 = binary32.add_library("user32.dll")
+user32.add_entry("MessageBoxA")
+
+
+ExitProcess_addr = binary32.predict_function_rva("kernel32.dll", "ExitProcess")
+MessageBoxA_addr = binary32.predict_function_rva("user32.dll", "MessageBoxA")
+print("Address of 'ExitProcess': 0x{:06x} ".format(ExitProcess_addr))
+print("Address of 'MessageBoxA': 0x{:06x} ".format(MessageBoxA_addr))
+
+builder = PE.Builder(binary32)
+builder.build_imports(True)
+builder.build()
+builder.write("pe_from_scratch.exe")
+
+
+
+
+
+
+
+
+
+#builder.write("pe_from_scratch.exe")
+
diff --git a/examples/python/pe_reader.py b/examples/python/pe_reader.py
new file mode 100755
index 0000000..6060f66
--- /dev/null
+++ b/examples/python/pe_reader.py
@@ -0,0 +1,382 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Description
+# -----------
+# Print informations about a PE file
+
+import lief
+from lief import PE
+from lief.PE import oid_to_string
+
+
+from optparse import OptionParser
+import sys
+
+
+def print_header(binary):
+    dos_header       = binary.dos_header
+    header           = binary.header
+    optional_header  = binary.optional_header
+
+    format_str = "{:<33} {:<30}"
+    format_hex = "{:<33} 0x{:<28x}"
+    format_dec = "{:<33} {:<30d}"
+
+    print("== Dos Header ==")
+    print(format_str.format("Magic:",                       str((dos_header.magic))))
+    print(format_dec.format("Used bytes in the last page:", dos_header.used_bytes_in_the_last_page))
+    print(format_dec.format("File size in pages:",          dos_header.file_size_in_pages))
+    print(format_dec.format("Number of relocations:",       dos_header.numberof_relocation))
+    print(format_dec.format("Header size in paragraphs:",   dos_header.header_size_in_paragraphs))
+    print(format_dec.format("Minimum extra paragraphs:",    dos_header.minimum_extra_paragraphs))
+    print(format_dec.format("Maximum extra paragraphs",     dos_header.maximum_extra_paragraphs))
+    print(format_dec.format("Initial relative SS",          dos_header.initial_relative_ss))
+    print(format_hex.format("Initial SP:",                  dos_header.initial_sp))
+    print(format_hex.format("Checksum:",                    dos_header.checksum))
+    print(format_dec.format("Initial IP:",                  dos_header.initial_ip))
+    print(format_dec.format("Initial CS:",                  dos_header.initial_relative_cs))
+    print(format_hex.format("Address of relocation table:", dos_header.addressof_relocation_table))
+    print(format_dec.format("Overlay number:",              dos_header.overlay_number))
+    print(format_dec.format("OEM ID:",                      dos_header.oem_id))
+    print(format_dec.format("OEM information",              dos_header.oem_info))
+    print(format_hex.format("Address of optional header:",  dos_header.addressof_new_exeheader))
+    print("")
+
+    print("== Header ==")
+
+    char_str = " - ".join([str(chara).split(".")[-1] for chara in header.characteristics_list])
+
+    print(format_str.format("Signature:",               "".join(map(chr, header.signature))))
+    print(format_str.format("Machine:",                 str(header.machine)))
+    print(format_dec.format("Number of sections:",      header.numberof_sections))
+    print(format_dec.format("Time Date stamp:",         header.time_date_stamps))
+    print(format_dec.format("Pointer to symbols:",      header.pointerto_symbol_table))
+    print(format_dec.format("Number of symbols:",       header.numberof_symbols))
+    print(format_dec.format("Size of optional header:", header.sizeof_optional_header))
+    print(format_str.format("Characteristics:",         char_str))
+    print("")
+
+
+    dll_char_str = " - ".join([str(chara).split(".")[-1] for chara in optional_header.dll_characteristics_lists])
+    subsystem_str = str(optional_header.subsystem).split(".")[-1]
+    print("== Optional Header ==")
+    magic = "PE32" if optional_header.magic == PE.PE_TYPE.PE32 else "PE64"
+    print(format_str.format("Magic:", magic))
+    print(format_dec.format("Major linker version:",           optional_header.major_linker_version))
+    print(format_dec.format("Minor linker version:",           optional_header.minor_linker_version))
+    print(format_dec.format("Size of code:",                   optional_header.sizeof_code))
+    print(format_dec.format("Size of initialized data:",       optional_header.sizeof_initialized_data))
+    print(format_dec.format("Size of uninitialized data:",     optional_header.sizeof_uninitialized_data))
+    print(format_hex.format("Entry point:",                    optional_header.addressof_entrypoint))
+    print(format_hex.format("Base of code:",                   optional_header.baseof_code))
+    if magic == "PE32":
+        print(format_hex.format("Base of data",                optional_header.baseof_data))
+    print(format_hex.format("Image base:",                     optional_header.imagebase))
+    print(format_hex.format("Section alignment:",              optional_header.section_alignment))
+    print(format_hex.format("File alignment:",                 optional_header.file_alignment))
+    print(format_dec.format("Major operating system version:", optional_header.major_operating_system_version))
+    print(format_dec.format("Minor operating system version:", optional_header.minor_operating_system_version))
+    print(format_dec.format("Major image version:",            optional_header.major_image_version))
+    print(format_dec.format("Minor image version:",            optional_header.minor_image_version))
+    print(format_dec.format("Major subsystem version:",        optional_header.major_subsystem_version))
+    print(format_dec.format("Minor subsystem version:",        optional_header.minor_subsystem_version))
+    print(format_dec.format("WIN32 version value:",            optional_header.win32_version_value))
+    print(format_hex.format("Size of image:",                  optional_header.sizeof_image))
+    print(format_hex.format("Size of headers:",                optional_header.sizeof_headers))
+    print(format_hex.format("Checksum:",                       optional_header.checksum))
+    print(format_str.format("Subsystem:",                      subsystem_str))
+    print(format_str.format("DLL Characteristics:",            dll_char_str))
+    print(format_hex.format("Size of stack reserve:",          optional_header.sizeof_stack_reserve))
+    print(format_hex.format("Size of stack commit:",           optional_header.sizeof_stack_commit))
+    print(format_hex.format("Size of heap reserve:",           optional_header.sizeof_heap_reserve))
+    print(format_hex.format("Size of heap commit:",            optional_header.sizeof_heap_commit))
+    print(format_dec.format("Loader flags:",                   optional_header.loader_flags))
+    print(format_dec.format("Number of RVA and size:",         optional_header.numberof_rva_and_size))
+    print("")
+
+def print_data_directories(binary):
+    data_directories = binary.data_directories
+
+    print("== Data Directories ==")
+    f_title = "|{:<24} | {:<10} | {:<10} | {:<8} |"
+    f_value = "|{:<24} | 0x{:<8x} | 0x{:<8x} | {:<8} |"
+    print(f_title.format("Type", "RVA", "Size", "Section"))
+
+    for directory in data_directories:
+        section_name = directory.section.name if directory.has_section else ""
+        print(f_value.format(str(directory.type).split('.')[-1], directory.rva, directory.size, section_name))
+    print("")
+
+
+def print_sections(binary):
+    sections = binary.sections
+
+    print("== Sections  ==")
+    f_title = "|{:<10} | {:<16} | {:<16} | {:<18} | {:<16} | {:<9} | {:<9}"
+    f_value = "|{:<10} | 0x{:<14x} | 0x{:<14x} | 0x{:<16x} | 0x{:<14x} | {:<9.2f} | {:<9}"
+    print(f_title.format("Name", "Offset", "Size", "Virtual Address", "Virtual size", "Entropy", "Flags"))
+
+    for section in sections:
+        flags = ""
+        for flag in section.characteristics_lists:
+            flags += str(flag).split(".")[-1] + " "
+        print(f_value.format(section.name, section.offset, section.size, section.virtual_address, section.virtual_size, section.entropy, flags))
+    print("")
+
+
+def print_symbols(binary):
+    symbols = binary.symbols
+    if len(symbols) > 0:
+        print("== Symbols ==")
+        f_title = "|{:<20} | {:<10} | {:<8} | {:<8} | {:<8} | {:<13} |"
+        f_value = u"|{:<20} | 0x{:<8x} | {:<14} | {:<10} | {:<12} | {:<13} |"
+
+        print(f_title.format("Name", "Value", "Section number", "Basic type", "Complex type", "Storage class"))
+        for symbol in symbols:
+            section_nb_str = ""
+            if symbol.section_number <= 0:
+                section_nb_str = str(PE.SYMBOL_SECTION_NUMBER(symbol.section_number)).split(".")[-1]
+            else:
+                try:
+                    section_nb_str = symbol.section.name
+                except:
+                    section_nb_str = "section<{:d}>".format(symbol.section_number)
+
+
+            print(f_value.format(
+                symbol.name[:20],
+                symbol.value,
+                section_nb_str,
+                str(symbol.base_type).split(".")[-1],
+                str(symbol.complex_type).split(".")[-1],
+                str(symbol.storage_class).split(".")[-1]))
+
+def print_imports(binary):
+    if binary.has_imports:
+        print("== Imports ==")
+        imports = binary.imports
+
+        for import_ in imports:
+            print(import_.name)
+            entries = import_.entries
+            f_value = "  {:<33} 0x{:<14x} 0x{:<14x} 0x{:<16x}"
+            for entry in entries:
+                print(f_value.format(entry.name, entry.data, entry.iat_value, entry.hint))
+        print("")
+
+def print_tls(binary):
+    format_str = "{:<33} {:<30}"
+    format_hex = "{:<33} 0x{:<28x}"
+    format_dec = "{:<33} {:<30d}"
+    if not binary.has_tls:
+        return
+
+    print("== TLS ==")
+    tls = binary.tls
+    callbacks = tls.callbacks
+    print(format_hex.format("Address of callbacks:", tls.addressof_callbacks))
+    if len(callbacks) > 0:
+        print("Callbacks:")
+        for callback in callbacks:
+            print("  " + hex(callback))
+
+    print(format_hex.format("Address of index:",  tls.addressof_index))
+    print(format_hex.format("Size of zero fill:", tls.sizeof_zero_fill))
+    print("{:<33} 0x{:<10x} 0x{:<10x}".format("Address of raw data:",
+        tls.addressof_raw_data[0], tls.addressof_raw_data[1]))
+    print(format_hex.format("Size of raw data:",  len(tls.data_template)))
+    print(format_hex.format("Characteristics:",   tls.characteristics))
+    print(format_str.format("Section:",           tls.section.name))
+    print(format_str.format("Data directory:",    str(tls.directory.type)))
+    print("")
+
+def print_relocations(binary):
+    if binary.has_relocations:
+        relocations = binary.relocations
+        print("== Relocations ==")
+        for relocation in relocations:
+            entries = relocation.entries
+            print(hex(relocation.virtual_address))
+            for entry in entries:
+                print("  0x{:<8x} {:<8}".format(entry.position, str(entry.type).split(".")[-1]))
+        print("")
+
+def print_export(binary):
+    if binary.has_exports:
+        print("== Exports ==")
+        exports = binary.get_export()
+        entries = exports.entries
+        f_value = "{:<20} 0x{:<10x} 0x{:<10x} 0x{:<6x} 0x{:<6x} 0x{:<10x}"
+        print(f_value.format(exports.name, exports.export_flags, exports.timestamp, exports.major_version, exports.minor_version, exports.ordinal_base))
+        for entry in entries:
+            extern = "[EXTERN]" if entry.is_extern else ""
+            print("  {:<20} 0x{:<6x} 0x{:<10x} {:<13}".format(entry.name[:20], entry.ordinal, entry.address, extern))
+        print("")
+
+
+def print_debug(binary):
+    format_str = "{:<33} {:<30}"
+    format_hex = "{:<33} 0x{:<28x}"
+    format_dec = "{:<33} {:<30d}"
+
+    if binary.has_debug:
+        debug = binary.debug
+        print("== Debug ==")
+        print(format_hex.format("Characteristics:",     debug.characteristics))
+        print(format_hex.format("Timestamp:",           debug.timestamp))
+        print(format_dec.format("Major version:",       debug.major_version))
+        print(format_dec.format("Minor version:",       debug.minor_version))
+        print(format_str.format("type:",                str(debug.type).split(".")[-1]))
+        print(format_hex.format("Size of data:",        debug.sizeof_data))
+        print(format_hex.format("Address of raw data:", debug.addressof_rawdata))
+        print(format_hex.format("Pointer to raw data:", debug.pointerto_rawdata))
+        print("")
+
+def print_signature(binary):
+    format_str = "{:<33} {:<30}"
+    format_hex = "{:<33} 0x{:<28x}"
+    format_dec = "{:<33} {:<30d}"
+
+    if not binary.has_signature:
+        return
+
+    signature = binary.signature
+    print("== Signature ==")
+    print(format_dec.format("Version:",          signature.version))
+    print(format_str.format("Digest Algorithm:", oid_to_string(signature.digest_algorithm)))
+    print("")
+
+    print("-- Content Info --")
+    content_info = signature.content_info
+    print(format_str.format("Content Type:",     oid_to_string(content_info.content_type)))
+    print(format_str.format("Type:",             oid_to_string(content_info.type)))
+    print(format_str.format("Digest Algorithm:", oid_to_string(content_info.digest_algorithm)))
+    print("")
+
+    print("-- Certificates --")
+    certificates = signature.certificates
+
+    for crt in certificates:
+        sn_str = ":".join(map(lambda e : "{:02x}".format(e), crt.serial_number))
+        valid_from_str = "-".join(map(str, crt.valid_from[:3])) + " " + ":".join(map(str, crt.valid_from[3:]))
+        valid_to_str = "-".join(map(str, crt.valid_to[:3])) + " " + ":".join(map(str, crt.valid_to[3:]))
+        print(format_dec.format("Version:",             crt.version))
+        print(format_str.format("Serial Number:",       sn_str))
+        print(format_str.format("Signature Alogrithm:", oid_to_string(crt.signature_alogrithm)))
+        print(format_str.format("Valid from:",          valid_from_str))
+        print(format_str.format("Valid to:",            valid_to_str))
+        print(format_str.format("Issuer:",              crt.issuer))
+        print(format_str.format("Subject:",             crt.subject))
+        print("")
+
+    print("-- Signer Info --")
+    signer_info = signature.signer_info
+    issuer_str = " ".join(map(lambda e : oid_to_string(e[0]) + " = " + e[1], signer_info.issuer[0]))
+    print(format_dec.format("Version:",             signer_info.version))
+    print(format_str.format("Issuer:",              issuer_str))
+    print(format_str.format("Digest Algorithm:",    oid_to_string(signer_info.digest_algorithm)))
+    print(format_str.format("Signature algorithm:", oid_to_string(signer_info.signature_algorithm)))
+    print(format_str.format("Program name:",        signer_info.authenticated_attributes.program_name))
+    print(format_str.format("Url:",                 signer_info.authenticated_attributes.more_info))
+    print("")
+
+
+def main():
+    optparser = OptionParser(
+            usage='Usage: %prog [options] <pe-file>',
+            add_help_option = True,
+            prog=sys.argv[0])
+
+    optparser.add_option('-a', '--all',
+            action='store_true', dest='show_all',
+            help='Show all informations')
+
+    optparser.add_option('-d', '--data-directories',
+            action='store_true', dest='show_data_directories',
+            help='Display data directories')
+
+    optparser.add_option('--debug',
+            action='store_true', dest='show_debug',
+            help='Display debug directory')
+
+    optparser.add_option('-g', '--signature',
+            action='store_true', dest='show_signature',
+            help="Display the binary's signature if any")
+
+    optparser.add_option('-H', '--header',
+            action='store_true', dest='show_headers',
+            help='Display headers')
+
+    optparser.add_option('-i', '--import',
+            action='store_true', dest='show_imports',
+            help='Display imported functions and libraries')
+
+    optparser.add_option('-r', '--relocs',
+            action='store_true', dest='show_relocs',
+            help='Display the relocations (if present)')
+
+    optparser.add_option('-S', '--section-headers', '--sections',
+            action='store_true', dest='show_section_header',
+            help="Display the sections' headers")
+
+    optparser.add_option('-s', '--symbols', '--syms',
+            action='store_true', dest='show_symbols',
+            help='Display symbols')
+
+    optparser.add_option('-t', '--tls',
+            action='store_true', dest='show_tls',
+            help='Display TLS informations')
+
+    optparser.add_option('-x', '--export',
+            action='store_true', dest='show_export',
+            help='Display exported functions/libraries')
+
+
+
+    options, args = optparser.parse_args()
+
+    if len(args) == 0:
+        optparser.print_help()
+        sys.exit(1)
+
+    binary = None
+    try:
+        binary = PE.parse(args[0])
+    except lief.exception as e:
+        print(e)
+        sys.exit(1)
+
+
+    if options.show_data_directories or options.show_all:
+        print_data_directories(binary)
+
+    if options.show_headers or options.show_all:
+        print_header(binary)
+
+    if options.show_imports or options.show_all:
+        print_imports(binary)
+
+    if options.show_relocs or options.show_all:
+        print_relocations(binary)
+
+    if options.show_section_header or options.show_all:
+        print_sections(binary)
+
+    if options.show_symbols or options.show_all:
+        print_symbols(binary)
+
+    if options.show_tls or options.show_all:
+        print_tls(binary)
+
+    if options.show_export or options.show_all:
+        print_export(binary)
+
+    if options.show_debug or options.show_all:
+        print_debug(binary)
+
+    if options.show_signature or options.show_all:
+        print_signature(binary)
+
+if __name__ == "__main__":
+    main()
diff --git a/include/LIEF/Abstract/Abstract.hpp b/include/LIEF/Abstract/Abstract.hpp
new file mode 100644
index 0000000..ab168b8
--- /dev/null
+++ b/include/LIEF/Abstract/Abstract.hpp
@@ -0,0 +1,24 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ABSTRACT_H_
+#define LIEF_ABSTRACT_H_
+
+#include <LIEF/Abstract/Binary.hpp>
+#include <LIEF/Abstract/enums.hpp>
+#include <LIEF/Abstract/EnumToString.hpp>
+#include <LIEF/Abstract/Parser.hpp>
+
+#endif
diff --git a/include/LIEF/Abstract/Binary.hpp b/include/LIEF/Abstract/Binary.hpp
new file mode 100644
index 0000000..b768bfa
--- /dev/null
+++ b/include/LIEF/Abstract/Binary.hpp
@@ -0,0 +1,129 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ABSTRACT_BINARY_H_
+#define LIEF_ABSTRACT_BINARY_H_
+
+#include <vector>
+#include <memory>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+#include "LIEF/Visitable.hpp"
+
+#include "LIEF/Abstract/type_traits.hpp"
+#include "LIEF/Abstract/Header.hpp"
+#include "LIEF/Abstract/Symbol.hpp"
+#include "LIEF/Abstract/Section.hpp"
+
+//! LIEF namespace
+namespace LIEF {
+
+//! @brief Abstract binary
+class DLL_PUBLIC Binary : public Visitable {
+
+  public:
+    Binary(void);
+    virtual ~Binary(void);
+
+    Binary& operator=(const Binary& copy);
+    Binary(const Binary& copy);
+
+    //! @brief Return the abstract header of the binary
+    Header get_header(void) const;
+
+    //! @brief Return list of symbols whose elements **can** be modified
+    it_symbols        get_symbols(void);
+
+    //! @brief Return list of symbols whose elements **can't** be modified
+    it_const_symbols  get_symbols(void) const;
+
+    //! @brief Returns binary's sections
+    it_sections       get_sections(void);
+    it_const_sections get_sections(void) const;
+
+    //! @brief Binary's entrypoint (if any)
+    virtual uint64_t entrypoint(void) const = 0;
+
+    //! @brief Binary's name
+    const std::string& name(void) const;
+
+    //! @brief Binary's original size
+    uint64_t original_size(void) const;
+
+    //! @brief Return functions's name exported by the binary
+    std::vector<std::string> get_exported_functions(void) const;
+
+    //! @brief Return libraries which are imported by the binary
+    std::vector<std::string> get_imported_libraries(void) const;
+
+    //! @brief Return functions's name imported by the binary
+    std::vector<std::string> get_imported_functions(void) const;
+
+    //! @brief Return the address of the given function name
+    virtual uint64_t get_function_address(const std::string& func_name) const;
+
+    //! @brief Method so that a ``visitor`` can visit us
+    virtual void accept(Visitor& visitor) const override;
+
+
+    //! @brief Patch the content at virtual address @p address with @p patch_value
+    //!
+    //! @param[in] address Address to patch
+    //! @param[in] patch_value Patch to apply
+    virtual void patch_address(uint64_t address, const std::vector<uint8_t>& patch_value) = 0;
+
+    //! @brief Patch the address with the given value
+    //!
+    //! @param[in] address Address to patch
+    //! @param[in] patch_value Patch to apply
+    //! @param[in] size Size of the value in **bytes** (1, 2, ... 8)
+    virtual void patch_address(uint64_t address, uint64_t patch_value, size_t size = sizeof(uint64_t)) = 0;
+
+    //! @brief Return the content located at virtual address
+    virtual std::vector<uint8_t> get_content_from_virtual_address(uint64_t virtual_address, uint64_t size) const = 0;
+
+    //! @brief Change binary's name
+    void name(const std::string& name);
+
+    //! @brief Change binary's original size.
+    //!
+    //! @warning
+    //! Should be used carefully because some optimizations can be
+    //! done with this value
+    void original_size(uint64_t size);
+
+    virtual std::ostream& print(std::ostream& os) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Binary& binary);
+
+  protected:
+    std::string name_;
+
+    uint64_t original_size_;
+
+    virtual Header                    get_abstract_header(void) const = 0;
+    virtual symbols_t                 get_abstract_symbols(void)      = 0;
+    virtual sections_t                get_abstract_sections(void)     = 0;
+
+    virtual std::vector<std::string>  get_abstract_exported_functions(void) const = 0;
+    virtual std::vector<std::string>  get_abstract_imported_functions(void) const = 0;
+    virtual std::vector<std::string>  get_abstract_imported_libraries(void) const = 0;
+
+
+};
+}
+
+#endif
diff --git a/include/LIEF/Abstract/EnumToString.hpp b/include/LIEF/Abstract/EnumToString.hpp
new file mode 100644
index 0000000..8907b57
--- /dev/null
+++ b/include/LIEF/Abstract/EnumToString.hpp
@@ -0,0 +1,30 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ENUM_TO_STRING_H
+#define LIEF_ENUM_TO_STRING_H
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/enums.hpp"
+
+namespace LIEF {
+DLL_PUBLIC const char* to_string(FILE_FORMATS e);
+DLL_PUBLIC const char* to_string(ARCHITECTURES e);
+DLL_PUBLIC const char* to_string(OBJECT_TYPES e);
+DLL_PUBLIC const char* to_string(MODES e);
+} // namespace LIEF
+
+#endif
+
diff --git a/include/LIEF/Abstract/Header.hpp b/include/LIEF/Abstract/Header.hpp
new file mode 100644
index 0000000..63d7b68
--- /dev/null
+++ b/include/LIEF/Abstract/Header.hpp
@@ -0,0 +1,62 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ABSTRACT_HEADER_H_
+#define LIEF_ABSTRACT_HEADER_H_
+
+#include <iostream>
+#include <set>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+#include "LIEF/types.hpp"
+
+#include "LIEF/Abstract/enums.hpp"
+
+namespace LIEF {
+class DLL_PUBLIC Header : public Visitable {
+  public:
+  Header(void);
+  Header(const Header&);
+  Header& operator=(const Header&);
+  virtual ~Header(void);
+
+
+  ARCHITECTURES          architecture(void) const;
+  const std::set<MODES>& modes(void)        const;
+  OBJECT_TYPES           object_type(void)  const;
+  uint64_t               entrypoint(void)   const;
+
+  //! @brief Method so that the ``visitor`` can visit us
+  virtual void           accept(Visitor& visitor) const override;
+
+  void architecture(ARCHITECTURES arch);
+  void modes(const std::set<MODES>& m);
+  void object_type(OBJECT_TYPES type);
+  void entrypoint(uint64_t entrypoint);
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Header& hdr);
+
+  protected:
+  ARCHITECTURES   architecture_;
+  std::set<MODES> modes_;
+  OBJECT_TYPES    object_type_;
+  uint64_t        entrypoint_;
+
+
+};
+}
+
+#endif
diff --git a/include/LIEF/Abstract/Parser.hpp b/include/LIEF/Abstract/Parser.hpp
new file mode 100644
index 0000000..a5b93de
--- /dev/null
+++ b/include/LIEF/Abstract/Parser.hpp
@@ -0,0 +1,48 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ABSTRACT_BUILDER_H_
+#define LIEF_ABSTRACT_BUILDER_H_
+
+#include <string>
+#include <memory>
+
+#include "LIEF/Abstract/Binary.hpp"
+
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+class DLL_PUBLIC Parser
+{
+  public:
+    //! @brief Construct an LIEF::Binary from the given filename
+    //!
+    //! @warning If the target file is a FAT Mach0, it will
+    //! return the **last** one
+    //! @see LIEF::MachO::Parser::parse
+    static Binary* parse(const std::string& filename);
+
+  protected:
+    Parser(const std::string& file);
+    uint64_t    binary_size_;
+    std::string binary_name_;
+
+    ~Parser(void);
+    Parser(void);
+
+};
+}
+
+#endif
diff --git a/include/LIEF/Abstract/Section.hpp b/include/LIEF/Abstract/Section.hpp
new file mode 100644
index 0000000..d346eb8
--- /dev/null
+++ b/include/LIEF/Abstract/Section.hpp
@@ -0,0 +1,86 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ABSTRACT_SECTION_H_
+#define LIEF_ABSTRACT_SECTION_H_
+
+#include <string>
+#include <vector>
+#include <memory>
+#include <iostream>
+
+#include "LIEF/types.hpp"
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+class DLL_PUBLIC Section : public Visitable {
+  public:
+    Section(void);
+    virtual ~Section(void);
+
+    Section& operator=(const Section& copy);
+    Section(const Section& copy);
+
+    //! @brief section's name
+    virtual const std::string& name(void) const;
+
+    //! @brief section's content
+    virtual std::vector<uint8_t> content(void) const;
+
+    //! @brief section's size (size in the binary)
+    virtual void size(uint64_t size);
+
+    //! @brief section's size (size in the binary)
+    virtual uint64_t size(void) const;
+
+    //! @brief offset in the binary
+    virtual uint64_t offset(void) const;
+
+    //! @brief Address where the section should be mapped
+    virtual uint64_t virtual_address(void) const;
+
+    virtual void virtual_address(uint64_t virtual_address);
+
+    //! @brief Set the section's name
+    virtual void name(const std::string& name);
+
+    //! @brief Set section content
+    virtual void content(const std::vector<uint8_t>& data);
+
+    virtual void offset(uint64_t offset);
+
+    //! @brief Section's entropy
+    double entropy(void) const;
+
+    //! @brief Method so that the ``visitor`` can visit us
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Section& rhs) const;
+    bool operator!=(const Section& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Section& entry);
+
+  protected:
+    std::string name_;
+    uint64_t    virtual_address_;
+    uint64_t    size_;
+    uint64_t    offset_;
+
+};
+
+}
+
+#endif
diff --git a/include/LIEF/Abstract/Symbol.hpp b/include/LIEF/Abstract/Symbol.hpp
new file mode 100644
index 0000000..dff25b0
--- /dev/null
+++ b/include/LIEF/Abstract/Symbol.hpp
@@ -0,0 +1,50 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ABSTRACT_SYMBOLS_H_
+#define LIEF_ABSTRACT_SYMBOLS_H_
+
+#include <string>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+class DLL_PUBLIC Symbol : public Visitable {
+  public:
+    Symbol(void);
+    Symbol(const std::string& name);
+    Symbol(const Symbol&);
+    Symbol& operator=(const Symbol&);
+    virtual ~Symbol(void);
+
+    //! @brief Return symbol name
+    virtual const std::string& name(void) const;
+
+    //! @brief Set symbol name
+    virtual void name(const std::string& name);
+
+    //! @brief Method so that the ``visitor`` can visit us
+    virtual void accept(Visitor& visitor) const override;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Symbol& entry);
+
+  protected:
+    std::string name_;
+};
+}
+
+#endif
+
diff --git a/include/LIEF/Abstract/enums.hpp b/include/LIEF/Abstract/enums.hpp
new file mode 100644
index 0000000..c4fa11f
--- /dev/null
+++ b/include/LIEF/Abstract/enums.hpp
@@ -0,0 +1,73 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ABSTRACT_ENUMS_H_
+#define LIEF_ABSTRACT_ENUMS_H_
+
+#include "LIEF/types.hpp"
+
+namespace LIEF {
+
+enum FILE_FORMATS {
+  FORMAT_ELF   = 0,
+  FORMAT_PE    = 1,
+  FORMAT_MACHO = 2
+};
+
+enum OBJECT_TYPES {
+  TYPE_NONE       = 0,
+  TYPE_EXECUTABLE = 1,
+  TYPE_LIBRARY    = 2,
+  TYPE_OBJECT     = 3,
+};
+
+// Inspired from capstone
+enum ARCHITECTURES {
+  ARCH_NONE  = 0,
+  ARCH_ARM   = 1,
+  ARCH_ARM64 = 2,
+  ARCH_MIPS  = 3,
+  ARCH_X86   = 4,
+  ARCH_PPC   = 5,
+  ARCH_SPARC = 6,
+  ARCH_SYSZ  = 7,
+  ARCH_XCORE = 8,
+  ARCH_INTEL = 9,
+};
+
+enum MODES {
+  MODE_NONE          = 0,
+  MODE_LITTLE_ENDIAN = 1,
+  MODE_BIG_ENDIAN    = 2,
+  MODE_16            = 3,
+  MODE_32            = 4,
+  MODE_64            = 5,
+  MODE_ARM           = 6,
+  MODE_THUMB         = 7,
+  MODE_MCLASS        = 8,
+  MODE_MICRO         = 9,
+  MODE_MIPS3         = 10,
+  MODE_MIPS32R6      = 11,
+  MODE_MIPSGP64      = 12,
+  MODE_V7            = 13,
+  MODE_V8            = 14,
+  MODE_V9            = 15,
+  MODE_MIPS32        = 16,
+  MODE_MIPS64        = 17,
+};
+
+
+} // namespace LIEF
+#endif
diff --git a/include/LIEF/Abstract/type_traits.hpp b/include/LIEF/Abstract/type_traits.hpp
new file mode 100644
index 0000000..b57f5f3
--- /dev/null
+++ b/include/LIEF/Abstract/type_traits.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEf_TYPE_TRAITS_H_
+#define LIEf_TYPE_TRAITS_H_
+#include <vector>
+#include "LIEF/iterators.hpp"
+namespace LIEF {
+class Symbol;
+class Section;
+
+using sections_t        = std::vector<Section*>;
+using it_sections       = ref_iterator<sections_t>;
+using it_const_sections = const_ref_iterator<sections_t>;
+
+
+using symbols_t         = std::vector<Symbol*>;
+using it_symbols        = ref_iterator<symbols_t>;
+using it_const_symbols  = const_ref_iterator<symbols_t>;
+
+}
+#endif
diff --git a/include/LIEF/BinaryStream/BinaryStream.hpp b/include/LIEF/BinaryStream/BinaryStream.hpp
new file mode 100644
index 0000000..f0dda79
--- /dev/null
+++ b/include/LIEF/BinaryStream/BinaryStream.hpp
@@ -0,0 +1,68 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_BINARY_STREAM_H_
+#define LIEF_BINARY_STREAM_H_
+
+#include <stdint.h>
+#include <climits>
+#include <vector>
+#include <istream>
+
+class BinaryStream {
+  public:
+    virtual ~BinaryStream();
+    virtual uint64_t    size(void)                           const = 0;
+    virtual const void* read(uint64_t offset, uint64_t size) const = 0;
+    virtual const char* read_string(uint64_t offset)         const = 0;
+
+    template<typename T>
+    T read_integer(uint64_t offset, bool swap = false) const;
+
+    template<typename T>
+    static T swap_endian(T u);
+};
+
+
+template<typename T>
+T BinaryStream::read_integer(uint64_t offset, bool swap) const {
+  static_assert(std::is_integral<T>::value, "Interger required");
+  const T* value = reinterpret_cast<const T*>(this->read(offset, sizeof(T)));
+  return swap ? swap_endian(*value) : *value;
+}
+
+
+template<typename T>
+T BinaryStream::swap_endian(T u) {
+  // From http://stackoverflow.com/a/4956493
+  static_assert(CHAR_BIT == 8, "CHAR_BIT != 8");
+  static_assert(std::is_integral<T>::value, "Interger required");
+  union {
+    T u;
+    unsigned char u8[sizeof(T)];
+  } source, dest;
+
+  source.u = u;
+
+  for (size_t k = 0; k < sizeof(T); k++) {
+    dest.u8[k] = source.u8[sizeof(T) - k - 1];
+  }
+
+  return dest.u;
+}
+
+
+
+#endif
diff --git a/include/LIEF/BinaryStream/VectorStream.hpp b/include/LIEF/BinaryStream/VectorStream.hpp
new file mode 100644
index 0000000..aed9269
--- /dev/null
+++ b/include/LIEF/BinaryStream/VectorStream.hpp
@@ -0,0 +1,41 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef VECTOR_BINARY_STREAM_H
+#define VECTOR_BINARY_STREAM_H
+
+#include <vector>
+#include <string>
+
+#include "LIEF/BinaryStream/BinaryStream.hpp"
+
+class VectorStream : public BinaryStream {
+  public:
+    //using BinaryStream::read_integer;
+    VectorStream(const std::string& filename);
+    VectorStream(const std::vector<uint8_t>& data);
+
+    virtual uint64_t    size(void)                           const override;
+    virtual const void* read(uint64_t offset, uint64_t size) const override;
+    virtual const char* read_string(uint64_t offset)         const override;
+
+    const std::vector<uint8_t>& content(void) const;
+
+  private:
+    std::vector<uint8_t> binary_;
+};
+
+
+#endif
diff --git a/include/LIEF/Builder.hpp b/include/LIEF/Builder.hpp
new file mode 100644
index 0000000..02f6077
--- /dev/null
+++ b/include/LIEF/Builder.hpp
@@ -0,0 +1,24 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_BUILDER_H_
+#define LIEF_BUILDER_H_
+
+class Parser {
+  public:
+    virtual Parser(void) = 0;
+};
+
+#endif
diff --git a/include/LIEF/ELF.hpp b/include/LIEF/ELF.hpp
new file mode 100644
index 0000000..678913d
--- /dev/null
+++ b/include/LIEF/ELF.hpp
@@ -0,0 +1,28 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_H_
+#define LIEF_ELF_H_
+
+#include "LIEF/ELF/Parser.hpp"
+#include "LIEF/ELF/Header.hpp"
+#include "LIEF/ELF/Section.hpp"
+#include "LIEF/ELF/Binary.hpp"
+#include "LIEF/ELF/utils.hpp"
+#include "LIEF/ELF/Segment.hpp"
+#include "LIEF/ELF/Builder.hpp"
+#include "LIEF/ELF/EnumToString.hpp"
+
+#endif
diff --git a/include/LIEF/ELF/Binary.hpp b/include/LIEF/ELF/Binary.hpp
new file mode 100644
index 0000000..3997472
--- /dev/null
+++ b/include/LIEF/ELF/Binary.hpp
@@ -0,0 +1,414 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_BINARY_H_
+#define LIEF_ELF_BINARY_H_
+
+#include <vector>
+#include <memory>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/iterators.hpp"
+
+#include "LIEF/Abstract/Binary.hpp"
+
+#include "LIEF/ELF/type_traits.hpp"
+#include "LIEF/ELF/Header.hpp"
+#include "LIEF/ELF/Section.hpp"
+#include "LIEF/ELF/Segment.hpp"
+#include "LIEF/ELF/DynamicEntry.hpp"
+#include "LIEF/ELF/DynamicEntryLibrary.hpp"
+#include "LIEF/ELF/DynamicSharedObject.hpp"
+#include "LIEF/ELF/DynamicEntryRpath.hpp"
+#include "LIEF/ELF/DynamicEntryRunPath.hpp"
+#include "LIEF/ELF/DynamicEntryArray.hpp"
+#include "LIEF/ELF/Symbol.hpp"
+#include "LIEF/ELF/Relocation.hpp"
+#include "LIEF/ELF/SymbolVersion.hpp"
+#include "LIEF/ELF/SymbolVersionRequirement.hpp"
+#include "LIEF/ELF/SymbolVersionDefinition.hpp"
+#include "LIEF/ELF/utils.hpp"
+#include "LIEF/ELF/DataHandler/Handler.hpp"
+#include "LIEF/ELF/GnuHash.hpp"
+
+
+namespace LIEF {
+namespace ELF {
+class Parser;
+class Builder;
+
+//! @brief Class which represent an ELF binary
+class DLL_PUBLIC Binary : public LIEF::Binary {
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    Binary(const std::string& name, ELF_CLASS type);
+
+    Binary& operator=(const Binary& copy) = delete;
+    Binary(const Binary& copy)            = delete;
+
+    //! @brief Check if the given symbol is exported
+    static bool is_exported(const Symbol& symbol);
+
+    //! @brief Check if the given symbol is imported
+    static bool is_imported(const Symbol& symbol);
+
+    //! @brief Return binary's classe (ELF32 or ELF64)
+    ELF_CLASS type(void) const;
+
+    //! @brief Return @link ELF::Header Elf header @endlink
+    Header&       get_header(void);
+    const Header& get_header(void) const;
+
+    //! @brief Return binary's sections
+    //!
+    //! @warning
+    //! This method return a vector of references thus you can
+    //! modify vector's elements (section) but not add elements.
+    it_sections                            get_sections(void);
+    it_const_sections                      get_sections(void) const;
+
+    //! @brief Return binary entrypoint
+    virtual uint64_t                       entrypoint(void) const override;
+
+    //! @brief Return binary's segments
+    it_segments                            get_segments(void);
+    it_const_segments                      get_segments(void) const;
+
+    //! @brief Return binary's dynamic entries
+    it_dynamic_entries                     get_dynamic_entries(void);
+    it_const_dynamic_entries               get_dynamic_entries(void) const;
+
+    //! @brief Return binary's dynamic symbols
+    it_symbols                             get_dynamic_symbols(void);
+    it_const_symbols                       get_dynamic_symbols(void) const;
+
+
+    //! @brief Return symbols which are exported by the binary
+    it_exported_symbols                    get_exported_symbols(void);
+    it_const_exported_symbols              get_exported_symbols(void) const;
+
+    //! @brief Return symbols which are imported by the binary
+    it_imported_symbols                    get_imported_symbols(void);
+    it_const_imported_symbols              get_imported_symbols(void) const;
+
+    //! @brief Return statics symbols
+    it_symbols                             get_static_symbols(void);
+    it_const_symbols                       get_static_symbols(void) const;
+
+    //! @brief Return symbol versions
+    it_symbols_version                     get_symbols_version(void);
+    it_const_symbols_version               get_symbols_version(void) const;
+
+    //! @brief Return symbols version definition
+    it_symbols_version_definition          get_symbols_version_definition(void);
+    it_const_symbols_version_definition    get_symbols_version_definition(void) const;
+
+    //! @brief Return Symbol version requirement
+    it_symbols_version_requirement         get_symbols_version_requirement(void);
+    it_const_symbols_version_requirement   get_symbols_version_requirement(void) const;
+
+    //! @brief Return dynamic relocations
+    it_relocations                         get_dynamic_relocations(void);
+    it_const_relocations                   get_dynamic_relocations(void) const;
+
+    //! @brief Return `plt.got` relocations
+    it_relocations                         get_pltgot_relocations(void);
+    it_const_relocations                   get_pltgot_relocations(void) const;
+
+    //! @brief Return the GnuHash object in **readonly**
+    const GnuHash& get_gnu_hash(void) const;
+
+    //! @brief Check if a section with the given name exists in the binary
+    bool has_section(const std::string& name) const;
+
+    //! @brief Return Section with the given `name`
+    Section&       get_section(const std::string& name);
+    const Section& get_section(const std::string& name) const;
+
+    //! @brief Return `.text` section
+    Section& get_text_section(void);
+
+    //! @brief Return `.dynamic` section
+    Section& get_dynamic_section(void);
+
+    //! @brief Return hash section
+    Section& get_hash_section(void);
+
+    //! @brief Return section which holds static symbols
+    Section& get_static_symbols_section(void);
+
+    //! @brief Return program image base. For instance 0x40000
+    //!
+    //! To compute the image base, we look for the PT_PHDR segment header (phdr),
+    //! and we return phdr->p_vaddr - phdr->p_offset
+    uint64_t get_imagebase(void) const;
+
+    //! @brief Return the size of the mapped binary
+    uint64_t get_virtual_size(void) const;
+
+
+    //! @brief Check if the binary uses a loader
+    //! @see get_interpreter
+    bool has_interpreter(void) const;
+
+    //! @brief Return ELF interprer if any. (e.g. `/lib64/ld-linux-x86-64.so.2`)
+    std::string get_interpreter(void) const;
+
+    //! @brief Return static symbols and dynamic symbols
+    it_symbols       get_symbols(void);
+    it_const_symbols get_symbols(void) const;
+
+    //! @brief Remove symbols with the given name in boths
+    //!   * dynamic symbols
+    //!   * static symbols
+    //! @see remove_static_symbol, remove_dynamic_symbol
+    void remove_symbol(const std::string& name);
+    //void remove_symbol(Symbol* symbol);
+
+    //!@brief Remove static symbols with the given name
+    void remove_static_symbol(const std::string& name);
+    void remove_static_symbol(Symbol* symbol);
+
+    //!@brief Remove dynamic symbols with the given name
+    void remove_dynamic_symbol(const std::string& name);
+
+    //! @brief Remove the given symbol from the dynamic symbol table.
+    //!
+    //! As a side effect, it will remove any ELF::Relocation
+    //! that refer to this symbol and the SymbolVersion (if any)
+    //! associated with this symbol
+    void remove_dynamic_symbol(Symbol* symbol);
+
+    //! @brief Return the address of the given function name
+    virtual uint64_t get_function_address(const std::string& func_name) const override;
+
+    //! @brief Return the address of the given function name
+    //! @param func_name The function's name target
+    //! @param demangled Use the demangled name
+    uint64_t get_function_address(const std::string& func_name, bool demangled) const;
+
+    //! Add a new section in the binary
+    //!
+    //! @param[in] section The section object to insert
+    //! @param[in] loaded  Boolean value to indicate that sections's data must be loaded
+    //!
+    //! @return The section added. The `size` and the `virtual address` may have changed.
+    //!
+    //! @warning
+    //! This function will change the following attributes:
+    //!
+    //! - Header
+    //!   + Header::section_headers_offset
+    //!   + Header::numberof_sections
+    //!   + Header::section_name_table_idx
+    //!
+    //! - Section
+    //!   + Section::file_offset
+    //!   + Section::virtual_address
+    //!   + Section::virtual_size
+    //!
+    //! - Segments
+    //!   + Segment::file_offset
+    //!   + Segment::virtual_address
+    //!   + Segment::virtual_size
+    //!   + Segment::physical_size
+    //!
+    Section& add_section(const Section& section, bool loaded = true);
+
+    //! @brief Add a static symbol
+    Symbol& add_static_symbol(const Symbol& symbol);
+
+    //! @brief Add a new segment in the binary
+    //!
+    //! The segment is inserted at the end
+    //! @warning We assume that the binary is not position independent
+    //!
+    //! @return The segment added. `Virtual address` and `File Offset` may have changed
+    Segment& add_segment(const Segment& segment, uint64_t base = 0x400000, bool force_note = false);
+
+    //! @brief This function insert data in the binary
+    //!
+    //! @warning This function should be use for shared library
+    //! whose the code is position independent (-fPIC).
+    //! There could be some problem for PIE binary
+    //!
+    //! @param[in] content The data ton insert
+    //! @return Return {offset, size} where offset is the content's offset
+    //! in the binary and size the content's aligned.
+    //!
+    //! @todo Deal with all relocations types.
+    //! Suported relocations:
+    //! * ARM
+    //! * x86_64
+    //! * x86
+    std::pair<uint64_t, uint64_t> insert_content(std::vector<uint8_t>& content);
+
+
+    //! @brief Patch the content at virtual address @p address with @p patch_value
+    //!
+    //! @param[in] address Address to patch
+    //! @param[in] patch_value Patch to apply
+    virtual void patch_address(uint64_t address, const std::vector<uint8_t>& patch_value) override;
+
+
+    //! @brief Patch the address with the given value
+    //!
+    //! @param[in] address Address to patch
+    //! @param[in] patch_value Patch to apply
+    //! @param[in] size Size of the value in **bytes** (1, 2, ... 8)
+    virtual void patch_address(uint64_t address, uint64_t patch_value, size_t size = sizeof(uint64_t)) override;
+
+    //! @brief Patch the imported symbol with the ``address``
+    //!
+    //! @param[in] symbol Imported symbol to patch
+    //! @param[in] address New address
+    void patch_pltgot(const Symbol& symbol, uint64_t address);
+
+
+    //! @brief Patch the imported symbol's name with the ``address``
+    //!
+    //! @param[in] symbol_name Imported symbol's name to patch
+    //! @param[in] address New address
+    void patch_pltgot(const std::string& symbol_name, uint64_t address);
+
+
+    //! @brief Strip the binary by removing static symbols
+    void strip(void);
+
+    //! @brief Remove a binary's section.
+    //!
+    //! We clear data used by this section and it's removed from
+    //! section table
+    void remove_section(const std::string& name);
+
+    //! @brief Reconstruct the binary object and write it in `filename`
+    //! @param filename Path to write the reconstructed binary
+    void write(const std::string& filename);
+
+    //! @brief Reconstruct the binary object and return his content as bytes
+    std::vector<uint8_t> raw(void);
+
+    //! @brief Convert a virtual address to an offset in the file
+    uint64_t virtual_address_to_offset(uint64_t virtual_address) const;
+
+    //! @brief Check if the binary has been compiled with `-fpie -pie` flags
+    //!
+    //! To do so we check if there is a `PT_INTERP` segment and if
+    //! the binary type is `ET_DYN` (Shared object)
+    bool is_pie(void) const;
+
+    //! @brief Return the @link ELF::Section Section @endlink
+    //! from the @p offset
+    const Section& section_from_offset(uint64_t offset) const;
+    Section&       section_from_offset(uint64_t offset);
+
+    //! @brief Return the @link ELF::Section Section @endlink
+    //! from the @p address
+    const Section& section_from_virtual_address(uint64_t address) const;
+    Section&       section_from_virtual_address(uint64_t address);
+
+    //! @brief Return the @link ELF::Segment Segment @endlink
+    //! from the @p address
+    const Segment& segment_from_virtual_address(uint64_t address) const;
+    Segment&       segment_from_virtual_address(uint64_t address);
+
+    //! @brief Return the @link ELF::Segment Segment @endlink
+    //! from the @p offset
+    const Segment& segment_from_offset(uint64_t offset) const;
+    Segment&       segment_from_offset(uint64_t offset);
+
+    //! @brief Return the ELF::DynamicEntry associated with the given tag
+    const DynamicEntry& dynamic_entry_from_tag(DYNAMIC_TAGS tag) const;
+    DynamicEntry&       dynamic_entry_from_tag(DYNAMIC_TAGS tag);
+
+    //! @brief Check if ELF::DynamicEntry associated with the given tag
+    //! exists.
+    bool has_dynamic_entry(DYNAMIC_TAGS tag) const;
+
+    //! @brief Return the content located at virtual address
+    virtual std::vector<uint8_t> get_content_from_virtual_address(uint64_t virtual_address, uint64_t size) const override;
+
+    //! @brief Method so that the ``visitor`` can visit us
+    virtual void accept(LIEF::Visitor& visitor) const override;
+
+    size_t hash(const std::string& name);
+
+    virtual ~Binary(void);
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+  private:
+    Binary(void);
+
+    //! @brief Return an abstraction of binary's section: LIEF::Section
+    virtual LIEF::sections_t         get_abstract_sections(void) override;
+
+    virtual LIEF::Header             get_abstract_header(void) const override;
+
+    virtual std::vector<std::string> get_abstract_exported_functions(void) const override;
+    virtual std::vector<std::string> get_abstract_imported_functions(void) const override;
+    virtual std::vector<std::string> get_abstract_imported_libraries(void) const override;
+    virtual LIEF::symbols_t          get_abstract_symbols(void) override;
+
+    //! The binary type
+    //! (i.e. `ELF32` or `ELF64`)
+    ELF_CLASS         type_;
+
+    //! The binary's header as an object
+    Header                        header_;
+
+    //! The binary's sections if any
+    sections_t                    sections_;
+
+    //! The binary's segments if any
+    segments_t                    segments_;
+
+    //! A list of the diffrents dynamic entries.
+    dynamic_entries_t             dynamic_entries_;
+
+    //! A list of dynamic symbols
+    symbols_t                     dynamic_symbols_;
+
+    //! A list of static symbols
+    symbols_t                     static_symbols_;
+
+    //! The binary's dynamic Relocations if any
+    relocations_t                 dynamic_relocations_;
+
+    //! .rela.plt
+    relocations_t                 pltgot_relocations_;
+
+    //! .gnu.version
+    symbols_version_t             symbol_version_table_;
+
+    //! gnu.version_r
+    symbols_version_requirement_t symbol_version_requirements_;
+
+    //! .gnu.version_d
+    symbols_version_definition_t  symbol_version_definition_;
+
+    //! .gnu.hash
+    GnuHash                       gnu_hash_;
+
+    //! object used to manage segments/sections
+    DataHandler::Handler*         datahandler_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/ELF/Builder.hpp b/include/LIEF/ELF/Builder.hpp
new file mode 100644
index 0000000..6098499
--- /dev/null
+++ b/include/LIEF/ELF/Builder.hpp
@@ -0,0 +1,112 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_BUIDLER_H_
+#define LIEF_ELF_BUIDLER_H_
+
+#include <vector>
+#include <memory>
+#include <algorithm>
+#include <string>
+
+#include "LIEF/visibility.h"
+#include "LIEF/iostream.hpp"
+
+#include "LIEF/ELF/Binary.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+//! @brief Class which take a ELF::Binary object and reconstruct a valid binary
+class DLL_PUBLIC Builder {
+  public:
+    Builder(Binary *binary);
+
+    Builder(void) = delete;
+    ~Builder(void);
+
+    void build(void);
+
+    Builder& empties_gnuhash(bool flag = true);
+
+    const std::vector<uint8_t>& get_build(void);
+    void write(const std::string& filename) const;
+
+  protected:
+    template<typename ELF_T>
+    void build(void);
+
+    template<typename ELF_T>
+    void build_header(void);
+
+    template<typename ELF_T>
+    void build_sections(void);
+
+    template<typename ELF_T>
+    void build_segments(void);
+
+    template<typename ELF_T>
+    void build_static_symbols(void);
+
+    template<typename ELF_T>
+    void build_dynamic(void);
+
+    template<typename ELF_T>
+    void build_dynamic_section(void);
+
+    template<typename ELF_T>
+    void build_dynamic_symbols(void);
+
+    template<typename ELF_T>
+    void build_dynamic_relocations(void);
+
+    template<typename ELF_T>
+    void build_pltgot_relocations(void);
+
+    template<typename ELF_T>
+    void build_hash_table(void);
+
+    template<typename ELF_T>
+    void build_symbol_hash(void);
+
+    template<typename ELF_T>
+    void build_symbol_gnuhash(void);
+
+    void build_empty_symbol_gnuhash(void);
+
+    template<typename ELF_T>
+    void build_symbol_requirement(void);
+
+    template<typename ELF_T>
+    void build_symbol_definition(void);
+
+    template<typename T, typename HANDLER>
+    std::vector<std::string> optimize(const HANDLER& e);
+
+    void build_symbol_version(void);
+
+    bool empties_gnuhash_;
+
+    mutable vector_iostream ios_;
+    Binary*           binary_;
+};
+
+} // namespace ELF
+} // namespace LIEF
+
+
+
+
+#endif
diff --git a/include/LIEF/ELF/DataHandler/Handler.hpp b/include/LIEF/ELF/DataHandler/Handler.hpp
new file mode 100644
index 0000000..2c798c1
--- /dev/null
+++ b/include/LIEF/ELF/DataHandler/Handler.hpp
@@ -0,0 +1,52 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef ELF_DATA_HANDLER_HANDLER_H_
+#define ELF_DATA_HANDLER_HANDLER_H_
+
+#include "LIEF/ELF/DataHandler/Node.hpp"
+#include "LIEF/visibility.h"
+#include <vector>
+
+namespace LIEF {
+namespace ELF {
+namespace DataHandler {
+class DLL_PUBLIC Handler {
+  public:
+    Handler(const std::vector<uint8_t>& content);
+    ~Handler(void);
+
+    Handler& operator=(const Handler& copy);
+    Handler(const Handler& copy);
+
+    const std::vector<uint8_t>& content(void) const;
+    std::vector<uint8_t> content(uint64_t offset, uint64_t size, Node::Type type);
+    void add_node(const Node& node);
+    void content(uint64_t offset, std::vector<uint8_t> content, Node::Type type);
+
+    Node& find(uint64_t offset, uint64_t size, bool insert, Node::Type type);
+    void move(Node& node, uint64_t newOffset);
+    void make_hole(uint64_t offset, uint64_t size);
+
+  private:
+    Handler(void);
+    std::vector<uint8_t> data_;
+    std::vector<Node>    nodes_;
+};
+} // namespace DataHandler
+} // namespace ELF
+} // namespace LIEF
+
+#endif
diff --git a/include/LIEF/ELF/DataHandler/Node.hpp b/include/LIEF/ELF/DataHandler/Node.hpp
new file mode 100644
index 0000000..44b6a8e
--- /dev/null
+++ b/include/LIEF/ELF/DataHandler/Node.hpp
@@ -0,0 +1,58 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef ELF_DATA_HANDLER_NODE_H_
+#define ELF_DATA_HANDLER_NODE_H_
+
+#include <vector>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+namespace ELF {
+namespace DataHandler {
+class DLL_PUBLIC Node {
+  public:
+    enum Type : uint8_t {
+      SECTION = 0,
+      SEGMENT = 1,
+      UNKNOWN = 2
+    };
+    Node(void);
+    Node(uint64_t offset, uint64_t size, Type type);
+
+    Node& operator=(const Node& copy);
+    Node(const Node& copy);
+
+    uint64_t size(void) const;
+    uint64_t offset(void) const;
+    Type   type(void) const;
+
+    void size(uint64_t size);
+    void type(Type type);
+    void offset(uint64_t offset);
+
+  private:
+    uint64_t size_;
+    uint64_t offset_;
+    Type     type_;
+};
+
+} // namespace DataHandler
+} // namespace ELF
+} // namespace LIEF
+
+#endif
diff --git a/include/LIEF/ELF/DynamicEntry.hpp b/include/LIEF/ELF/DynamicEntry.hpp
new file mode 100644
index 0000000..b6f928e
--- /dev/null
+++ b/include/LIEF/ELF/DynamicEntry.hpp
@@ -0,0 +1,69 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_DYNAMIC_ENTRY_H_
+#define LIEF_ELF_DYNAMIC_ENTRY_H_
+
+#include <string>
+#include <vector>
+#include <iostream>
+
+#include "LIEF/visibility.h"
+#include "LIEF/Visitable.hpp"
+
+#include "LIEF/ELF/Structures.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+class DLL_PUBLIC DynamicEntry : public Visitable {
+  public:
+
+    DynamicEntry(const Elf64_Dyn* header);
+    DynamicEntry(const Elf32_Dyn* header);
+    DynamicEntry(void);
+
+    DynamicEntry& operator=(const DynamicEntry& copy);
+    DynamicEntry(const DynamicEntry& copy);
+    virtual ~DynamicEntry(void);
+
+    DYNAMIC_TAGS tag(void) const;
+    uint64_t value(void) const;
+
+    void tag(DYNAMIC_TAGS tag);
+    void value(uint64_t value);
+
+    virtual const std::string& name(void) const;
+    virtual void name(const std::string& name);
+
+    virtual std::vector<uint64_t>& array(void);
+    virtual void array(const std::vector<uint64_t>& array);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    virtual std::ostream& print(std::ostream& os) const;
+
+    bool operator==(const DynamicEntry& rhs) const;
+    bool operator!=(const DynamicEntry& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const DynamicEntry& entry);
+
+  protected:
+    DYNAMIC_TAGS tag_;
+    uint64_t                 value_;
+};
+}
+}
+#endif
diff --git a/include/LIEF/ELF/DynamicEntryArray.hpp b/include/LIEF/ELF/DynamicEntryArray.hpp
new file mode 100644
index 0000000..5b41180
--- /dev/null
+++ b/include/LIEF/ELF/DynamicEntryArray.hpp
@@ -0,0 +1,52 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_DYNAMIC_ENTRY_ARRAY_H_
+#define LIEF_ELF_DYNAMIC_ENTRY_ARRAY_H_
+
+#include <string>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+namespace LIEF {
+namespace ELF {
+class DLL_PUBLIC DynamicEntryArray : public DynamicEntry {
+
+  public:
+    DynamicEntryArray(const Elf64_Dyn* header);
+    DynamicEntryArray(const Elf32_Dyn* header);
+    DynamicEntryArray(void);
+
+    DynamicEntryArray& operator=(const DynamicEntryArray& copy);
+    DynamicEntryArray(const DynamicEntryArray& copy);
+
+    virtual std::vector<uint64_t>& array(void) override;
+    const std::vector<uint64_t>& array(void) const;
+    virtual void array(const std::vector<uint64_t>& array) override;
+
+    //! @brief Method so that the ``visitor`` can visit us
+    virtual void accept(Visitor& visitor) const override;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+  private:
+    std::vector<uint64_t> array_;
+};
+}
+}
+
+#endif
diff --git a/include/LIEF/ELF/DynamicEntryLibrary.hpp b/include/LIEF/ELF/DynamicEntryLibrary.hpp
new file mode 100644
index 0000000..5079b02
--- /dev/null
+++ b/include/LIEF/ELF/DynamicEntryLibrary.hpp
@@ -0,0 +1,52 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_DYNAMIC_ENTRY_LIBRARY_H_
+#define LIEF_ELF_DYNAMIC_ENTRY_LIBRARY_H_
+
+#include <string>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+namespace LIEF {
+namespace ELF {
+class DLL_PUBLIC DynamicEntryLibrary : public DynamicEntry {
+
+  public:
+    DynamicEntryLibrary(const Elf64_Dyn* header);
+    DynamicEntryLibrary(const Elf32_Dyn* header);
+    DynamicEntryLibrary(void);
+
+    DynamicEntryLibrary(const std::string& name = "");
+
+    DynamicEntryLibrary& operator=(const DynamicEntryLibrary& copy);
+    DynamicEntryLibrary(const DynamicEntryLibrary& copy);
+
+    virtual const std::string& name(void) const override;
+    virtual void name(const std::string& name) override;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+  private:
+    std::string libname_;
+};
+}
+}
+
+#endif
diff --git a/include/LIEF/ELF/DynamicEntryRpath.hpp b/include/LIEF/ELF/DynamicEntryRpath.hpp
new file mode 100644
index 0000000..28eeedf
--- /dev/null
+++ b/include/LIEF/ELF/DynamicEntryRpath.hpp
@@ -0,0 +1,56 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_DYNAMIC_ENTRY_RPATH_H_
+#define LIEF_ELF_DYNAMIC_ENTRY_RPATH_H_
+
+#include <string>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+
+namespace LIEF {
+namespace ELF {
+class DLL_PUBLIC DynamicEntryRpath : public DynamicEntry {
+
+  public:
+    DynamicEntryRpath(const Elf64_Dyn* header);
+    DynamicEntryRpath(const Elf32_Dyn* header);
+    DynamicEntryRpath(void);
+
+    DynamicEntryRpath(const std::string& name = "");
+
+    DynamicEntryRpath& operator=(const DynamicEntryRpath& copy);
+    DynamicEntryRpath(const DynamicEntryRpath& copy);
+
+    virtual const std::string& name(void) const override;
+    virtual void name(const std::string& name) override;
+
+    const std::string& rpath(void) const;
+    void rpath(const std::string& name);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+  private:
+    std::string rpath_;
+};
+}
+}
+
+#endif
diff --git a/include/LIEF/ELF/DynamicEntryRunPath.hpp b/include/LIEF/ELF/DynamicEntryRunPath.hpp
new file mode 100644
index 0000000..d6a6bcd
--- /dev/null
+++ b/include/LIEF/ELF/DynamicEntryRunPath.hpp
@@ -0,0 +1,54 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_DYNAMIC_ENTRY_RUNPATH_H_
+#define LIEF_ELF_DYNAMIC_ENTRY_RUNPATH_H_
+
+#include <string>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+namespace LIEF {
+namespace ELF {
+class DLL_PUBLIC DynamicEntryRunPath : public DynamicEntry {
+
+  public:
+    DynamicEntryRunPath(const Elf64_Dyn* header);
+    DynamicEntryRunPath(const Elf32_Dyn* header);
+    DynamicEntryRunPath(void);
+
+    DynamicEntryRunPath(const std::string& name = "");
+
+    DynamicEntryRunPath& operator=(const DynamicEntryRunPath& copy);
+    DynamicEntryRunPath(const DynamicEntryRunPath& copy);
+
+    virtual const std::string& name(void) const override;
+    virtual void name(const std::string& name) override;
+
+    const std::string& runpath(void) const;
+    void runpath(const std::string& runpath);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+  private:
+    std::string runpath_;
+};
+}
+}
+#endif
diff --git a/include/LIEF/ELF/DynamicSharedObject.hpp b/include/LIEF/ELF/DynamicSharedObject.hpp
new file mode 100644
index 0000000..d6d558b
--- /dev/null
+++ b/include/LIEF/ELF/DynamicSharedObject.hpp
@@ -0,0 +1,49 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_DYNAMIC_SHARED_OBJECT_H_
+#define LIEF_ELF_DYNAMIC_SHARED_OBJECT_H_
+
+#include <string>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/DynamicEntry.hpp"
+
+namespace LIEF {
+namespace ELF {
+class DLL_PUBLIC DynamicSharedObject : public DynamicEntry {
+
+  public:
+    DynamicSharedObject(const Elf64_Dyn* header);
+    DynamicSharedObject(const Elf32_Dyn* header);
+    DynamicSharedObject(void);
+
+    DynamicSharedObject& operator=(const DynamicSharedObject&);
+    DynamicSharedObject(const DynamicSharedObject&);
+
+    virtual const std::string& name(void) const override;
+    virtual void name(const std::string& name) override;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+  private:
+    std::string name_;
+};
+}
+}
+#endif
diff --git a/include/LIEF/ELF/EnumToString.hpp b/include/LIEF/ELF/EnumToString.hpp
new file mode 100644
index 0000000..c406fd4
--- /dev/null
+++ b/include/LIEF/ELF/EnumToString.hpp
@@ -0,0 +1,43 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef ELF_ENUM_TO_STRING_H_
+#define ELF_ENUM_TO_STRING_H_
+#include "LIEF/visibility.h"
+#include "LIEF/ELF/Structures.hpp"
+
+namespace LIEF {
+namespace ELF {
+DLL_PUBLIC const char* to_string(SYMBOL_BINDINGS e);
+DLL_PUBLIC const char* to_string(E_TYPE e);
+DLL_PUBLIC const char* to_string(VERSION e);
+DLL_PUBLIC const char* to_string(ARCH e);
+DLL_PUBLIC const char* to_string(SEGMENT_TYPES e);
+DLL_PUBLIC const char* to_string(DYNAMIC_TAGS e);
+DLL_PUBLIC const char* to_string(SECTION_TYPES e);
+DLL_PUBLIC const char* to_string(SECTION_FLAGS e);
+DLL_PUBLIC const char* to_string(SYMBOL_TYPES e);
+DLL_PUBLIC const char* to_string(SYMBOL_TYPES e);
+DLL_PUBLIC const char* to_string(RELOC_x86_64 e);
+DLL_PUBLIC const char* to_string(RELOC_ARM e);
+DLL_PUBLIC const char* to_string(RELOC_i386 e);
+DLL_PUBLIC const char* to_string(ELF_CLASS e);
+DLL_PUBLIC const char* to_string(ELF_DATA e);
+DLL_PUBLIC const char* to_string(OS_ABI e);
+} // namespace ELF
+} // namespace LIEF
+
+#endif
+
diff --git a/include/LIEF/ELF/GnuHash.hpp b/include/LIEF/ELF/GnuHash.hpp
new file mode 100644
index 0000000..3305d73
--- /dev/null
+++ b/include/LIEF/ELF/GnuHash.hpp
@@ -0,0 +1,86 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_GNU_HASH_H_
+#define LIEF_ELF_GNU_HASH_H_
+
+#include <vector>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+namespace ELF {
+
+class Parser;
+class Builder;
+class Binary;
+
+class DLL_PUBLIC GnuHash : public Visitable {
+
+  friend class Parser;
+  friend class Builder;
+  friend class Binary;
+
+  public:
+  GnuHash(void);
+  GnuHash& operator=(const GnuHash& copy);
+  GnuHash(const GnuHash& copy);
+  virtual ~GnuHash(void);
+
+  //! @brief Return the number of buckets
+  //! @see GnuHash::buckets
+  uint32_t nb_buckets(void) const;
+
+  //! @brief Index of the first symbol in the dynamic
+  //! symbols table which accessible with the hash table
+  uint32_t symbol_index(void) const;
+
+  //! @brief Shift count used in the bloom filter
+  uint32_t shift2(void) const;
+
+  //! @brief Number of bloom filters used.
+  //! It must be a power of 2
+  uint32_t maskwords(void) const;
+
+  //! @brief Bloom filters
+  const std::vector<uint64_t>& bloom_filters(void) const;
+
+  //! @brief Hash buckets
+  const std::vector<uint32_t>& buckets(void) const;
+
+  //! @brief Hash values
+  const std::vector<uint32_t>& hash_values(void) const;
+
+  virtual void accept(Visitor& visitor) const override;
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const GnuHash& gnuhash);
+
+  private:
+  uint32_t symbol_index_;
+  //uint32_t maskwords_; -> TODO
+  uint32_t shift2_;
+
+  std::vector<uint64_t> bloom_filters_;
+  std::vector<uint32_t> buckets_;
+  std::vector<uint32_t> hash_values_;
+};
+
+
+} // namepsace ELF
+} // namespace LIEF
+
+#endif
diff --git a/include/LIEF/ELF/Header.hpp b/include/LIEF/ELF/Header.hpp
new file mode 100644
index 0000000..a180588
--- /dev/null
+++ b/include/LIEF/ELF/Header.hpp
@@ -0,0 +1,188 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_HEADER_H_
+#define LIEF_ELF_HEADER_H_
+
+#include <iostream>
+#include <array>
+#include <vector>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/enums.hpp"
+
+#include "LIEF/ELF/Structures.hpp"
+
+namespace LIEF {
+namespace ELF {
+class DLL_PUBLIC Header : public Visitable {
+
+  public:
+    using identity_t = std::array<uint8_t, IDENTITY::EI_NIDENT>;
+
+    Header(void);
+    Header(const std::vector<uint8_t>&   header);
+    Header(const Elf32_Ehdr *header);
+    Header(const Elf64_Ehdr *header);
+
+    Header& operator=(const Header& copy);
+    Header(const Header& copy);
+
+    virtual ~Header(void);
+
+    //! @brief Define the object file type. (e.g. executable, library...)
+    E_TYPE    file_type(void) const;
+
+    // @brief LIEF abstract object type
+    OBJECT_TYPES abstract_object_type(void) const;
+
+    //! @brief Target architecture
+    ARCH      machine_type(void) const;
+
+    //! @brief LIEF abstract architecture
+    std::pair<ARCHITECTURES, std::set<MODES>> abstract_architecture(void) const;
+
+    //! @brief Version of the object file format
+    VERSION   object_file_version(void) const;
+    uint64_t  entrypoint(void) const;
+    uint64_t  program_headers_offset(void) const;
+    uint64_t  section_headers_offset(void) const;
+    uint32_t  processor_flag(void) const;
+
+    //! @brief Size of the current header
+    //!
+    //! This size should be 64 for a ``ELF64`` binary and 52 for
+    //! a ``ELF32`` one.
+    uint32_t header_size(void) const;
+
+    //! @brief Return the size of a ``Segment header``
+    //!
+    //! This size should be 56 for a ``ELF64`` binary and 32 for
+    //! a ``ELF32`` one.
+    uint32_t program_header_size(void) const;
+
+    //! @brief Return the the number of segment's headers
+    //! registred in the header
+    uint32_t numberof_segments(void) const;
+
+
+    //! @brief Return the size of a ``Section header``
+    //!
+    //! This size should be 64 for a ``ELF64`` binary and 40 for
+    //! a ``ELF32`` one.
+    uint32_t sizeof_section_header(void) const;
+
+    //! @brief Return the the number of sections's headers
+    //! registred in the header
+    //!
+    //! @warning Could differ from the real number of sections
+    //! present in the binary
+    uint32_t numberof_sections(void) const;
+
+    //! @brief Return the section's index which holds
+    //! section's names
+    uint32_t section_name_table_idx(void) const;
+
+    identity_t&       identity(void);
+    const identity_t& identity(void) const;
+
+    //! @brief Return the object's class. ``ELF64`` or ``ELF32``
+    ELF_CLASS identity_class(void) const;
+
+    //! @brief Specify the data encoding
+    ELF_DATA identity_data(void) const;
+
+    //! @see object_file_version
+    VERSION identity_version(void) const;
+
+    //! @brief Identifies the version of the ABI for which the object is prepared
+    OS_ABI identity_os_abi(void) const;
+
+    void file_type(E_TYPE type);
+    void machine_type(ARCH machineType);
+    void object_file_version(VERSION version);
+    void entrypoint(uint64_t entryPoint);
+    void program_headers_offset(uint64_t programHeaderOffset);
+    void section_headers_offset(uint64_t sectionHeaderOffset);
+    void processor_flag(uint32_t processorFlag);
+    void header_size(uint32_t headerSize);
+    void program_header_size(uint32_t programHeaderSize);
+    void numberof_segments(uint32_t n);
+    void sizeof_section_header(uint32_t sizeOfSectionHeaderEntries);
+    void numberof_sections(uint32_t n);
+    void section_name_table_idx(uint32_t sectionNameStringTableIdx);
+    void identity(const std::string& identity);
+    void identity(const identity_t& identity);
+    void identity_class(ELF_CLASS i_class);
+    void identity_data(ELF_DATA data);
+    void identity_version(VERSION version);
+    void identity_os_abi(OS_ABI osabi);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Header& rhs) const;
+    bool operator!=(const Header& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Header& hdr);
+
+  private:
+    //! Field which represent ElfXX_Ehdr->e_ident
+    identity_t          identity_;
+
+    //! Field which represent ElfXX_Ehdr->e_type
+    E_TYPE  fileType_;
+
+    //! Field which represent ElfXX_Ehdr->e_machine
+    ARCH    machineType_;
+
+    //! Field which represent ElfXX_Ehdr->e_version
+    VERSION objectFileVersion_;
+
+    //! Field which represent ElfXX_Ehdr->e_entry
+    uint64_t            entryPoint_;
+
+    //! Field which represent ElfXX_Ehdr->e_phoff
+    uint64_t            programHeaderOffset_;
+
+    //! Field which represent ElfXX_Ehdr->e_shoff
+    uint64_t            sectionHeaderOffset_;
+
+    //! Field which represent ElfXX_Ehdr->e_flags
+    uint32_t            processorFlag_;
+
+    //! Field which represent ElfXX_Ehdr->e_ehsize
+    uint32_t            headerSize_;
+
+    //! Field which represent ElfXX_Ehdr->e_phentsize
+    uint32_t            programHeaderSize_;
+
+    //! Field which represent ElfXX_Ehdr->e_phnum
+    uint32_t            numberof_segments_;
+
+    //! Field which represent ElfXX_Ehdr->e_shentsize
+    uint32_t            sizeOfSectionHeaderEntries_;
+
+    //! Field which represent ElfXX_Ehdr->e_shnum
+    uint32_t            numberof_sections_;
+
+    //! Field which represent ElfXX_Ehdr->e_shstrndx
+    uint32_t            sectionNameStringTableIdx_;
+
+};
+}
+}
+#endif
diff --git a/include/LIEF/ELF/Parser.hpp b/include/LIEF/ELF/Parser.hpp
new file mode 100644
index 0000000..f4c0ff9
--- /dev/null
+++ b/include/LIEF/ELF/Parser.hpp
@@ -0,0 +1,164 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_PARSER_H_
+#define LIEF_ELF_PARSER_H_
+
+#include <vector>
+#include <string>
+#include <memory>
+#include <fstream>
+#include <iterator>
+#include <iostream>
+#include <algorithm>
+#include <stdexcept>
+#include <functional>
+
+#include "LIEF/visibility.h"
+#include "LIEF/exception.hpp"
+#include "LIEF/BinaryStream/VectorStream.hpp"
+
+#include "LIEF/Abstract/Parser.hpp"
+
+#include "LIEF/ELF/Binary.hpp"
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/DynamicEntryArray.hpp"
+#include "LIEF/ELF/DynamicEntryRpath.hpp"
+#include "LIEF/ELF/DynamicEntryRunPath.hpp"
+#include "LIEF/ELF/GnuHash.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+//! @brief Class which parse an ELF file and transform into a ELF::Binary
+class DLL_PUBLIC Parser : public LIEF::Parser {
+  public:
+    static Binary* parse(const std::string& file);
+    static Binary* parse(const std::vector<uint8_t>& data, const std::string& name = "");
+
+    Parser& operator=(const Parser& copy) = delete;
+    Parser(const Parser& copy)            = delete;
+
+  private:
+    Parser(void);
+    Parser(const std::string& file);
+    Parser(const std::vector<uint8_t>& data, const std::string& name);
+    ~Parser(void);
+
+    void init(const std::string& name = "");
+
+    // map, dynamic_symbol.version <----> symbol_version
+    // symbol_version comes from symbol_version table
+    void link_symbol_version(void);
+
+    template<typename ELF_T>
+    void parse_binary(void);
+
+    template<typename ELF_T>
+    void parse_header(void);
+
+    //! @brief Parse binary's Section
+    //!
+    //! Parse sections by using the ``e_shoff`` field as offset
+    template<typename ELF_T>
+    void parse_sections(void);
+
+    //! @brief Parse binary's segments
+    //!
+    //! Parse segment by using the ``e_phoff`` field as offset
+    template<typename ELF_T>
+    void parse_segments(void);
+
+    //! @brief Return offset of the dynamic string table
+    uint64_t get_dynamic_string_table(void) const;
+
+    uint64_t get_dynamic_string_table_from_segments(void) const;
+
+    uint64_t get_dynamic_string_table_from_sections(void) const;
+
+    template<typename ELF_T>
+    void parse_dynamic_entries(uint64_t offset, uint64_t size);
+
+    template<typename ELF_T>
+    void parse_dynamic_symbols(uint64_t offset, uint64_t size);
+
+    //! @brief Parse static Symbol
+    //!
+    //! Parser find Symbols offset by using the file offset attribute of the
+    //! SECTION_TYPES::SHT_SYMTAB Section.
+    //!
+    //! The number of symbols is taken from the `information` attribute in the section header.
+    //!
+    //! The section containing symbols name is found with the `link` attribute.
+    template<typename ELF_T>
+    void parse_static_symbols(uint64_t offset, uint32_t nbSymbols, const Section* string_section);
+
+    //! @brief Parse Dynamic relocations
+    //!
+    //! It use DT_REL/DT_RELA dynamic entries to parse it
+    template<typename ELF_T>
+    void parse_dynamic_relocations(uint64_t relocations_offset, uint64_t size, bool isRela);
+
+    //! @brief Parse `.plt.got`/`got` relocations
+    //!
+    //! For:
+    //! * ELF32 it uses **DT_JMPREL** and **DT_PLTRELSZ**
+    //! * ELF64 it uses **DT_PLTREL** and **DT_PLTRELSZ**
+    template<typename ELF_T>
+    void parse_pltgot_relocations(uint64_t offset, uint64_t size, bool isRela);
+
+    //! @brief Parse SymbolVersionRequirement
+    //!
+    //! We use the virtual address stored in the
+    //! DYNAMIC_TAGS::DT_VERNEED entry to get the offset.
+    //! and DYNAMIC_TAGS::DT_VERNEEDNUM to get the number of entries
+    template<typename ELF_T>
+    void parse_symbol_version_requirement(uint64_t offset, uint32_t nb_entries);
+
+
+    //! @brief Parse SymbolVersionDefinition.
+    //!
+    //! We use the virtual address stored in
+    //! the DYNAMIC_TAGS::DT_VERDEF DT_VERDEF entry to get the offset.
+    //! DYNAMIC_TAGS::DT_VERDEFNUM gives the number of entries
+    template<typename ELF_T>
+    void parse_symbol_version_definition(uint64_t offset, uint32_t nb_entries);
+
+
+    //! @brief Parse @link SymbolVersion Symbol version @endlink.
+    //!
+    //! We use the virtual address stored in the
+    //! DYNAMIC_TAGS::DT_VERSYM entry to parse it.
+    //!
+    //! @see http://dev.gentoo.org/~solar/elf/symbol-versioning
+    void parse_symbol_version(uint64_t symbol_version_offset);
+
+    //! @brief Parse Symbols's GNU hash
+    //!
+    //! @see https://blogs.oracle.com/ali/entry/gnu_hash_elf_sections
+    template<typename ELF_T>
+    void parse_symbol_gnu_hash(uint64_t offset);
+
+    std::unique_ptr<VectorStream> stream_;
+    Binary*                       binary_;
+    uint32_t                      type_;
+};
+
+
+
+
+} // namespace ELF
+} // namespace LIEF
+#endif
diff --git a/include/LIEF/ELF/Relocation.hpp b/include/LIEF/ELF/Relocation.hpp
new file mode 100644
index 0000000..43b8e25
--- /dev/null
+++ b/include/LIEF/ELF/Relocation.hpp
@@ -0,0 +1,82 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_RELOCATION_H_
+#define LIEF_ELF_RELOCATION_H_
+
+#include <string>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/Symbol.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+class Parser;
+class DLL_PUBLIC Relocation : public Visitable {
+
+  friend class Parser;
+
+  public:
+    Relocation(const Elf32_Rel*  header);
+    Relocation(const Elf32_Rela* header);
+    Relocation(const Elf64_Rel*  header);
+    Relocation(const Elf64_Rela* header);
+    Relocation(uint64_t address, uint32_t type = 0, int64_t addend = 0, bool isRela = false);
+    Relocation(void);
+    virtual ~Relocation(void);
+
+    Relocation& operator=(Relocation other);
+    Relocation(const Relocation& other);
+    void swap(Relocation& other);
+
+    uint64_t address(void) const;
+    int64_t  addend(void) const;
+    uint32_t type(void) const;
+    bool     is_rela(void) const;
+    bool     is_rel(void) const;
+    ARCH architecture(void) const;
+
+    bool          has_symbol(void) const;
+    Symbol&       symbol(void);
+    const Symbol& symbol(void) const;
+
+    void address(uint64_t address);
+    void addend(int64_t addend);
+    void type(uint32_t type);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Relocation& rhs) const;
+    bool operator!=(const Relocation& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Relocation& entry);
+
+  private:
+    uint64_t address_;
+    uint32_t type_;
+    int64_t  addend_;
+    bool     isRela_;
+    Symbol*  symbol_;
+    ARCH     architecture_;
+};
+
+}
+}
+#endif /* _ELF_RELOCATION_H_ */
diff --git a/include/LIEF/ELF/Relocations/AArch64.def b/include/LIEF/ELF/Relocations/AArch64.def
new file mode 100644
index 0000000..a474e85
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/AArch64.def
@@ -0,0 +1,147 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+/* ABI release 1.0 */
+ELF_RELOC(R_AARCH64_NONE,                             0)
+
+ELF_RELOC(R_AARCH64_ABS64,                        0x101)
+ELF_RELOC(R_AARCH64_ABS32,                        0x102)
+ELF_RELOC(R_AARCH64_ABS16,                        0x103)
+ELF_RELOC(R_AARCH64_PREL64,                       0x104)
+ELF_RELOC(R_AARCH64_PREL32,                       0x105)
+ELF_RELOC(R_AARCH64_PREL16,                       0x106)
+
+ELF_RELOC(R_AARCH64_MOVW_UABS_G0,                 0x107)
+ELF_RELOC(R_AARCH64_MOVW_UABS_G0_NC,              0x108)
+ELF_RELOC(R_AARCH64_MOVW_UABS_G1,                 0x109)
+ELF_RELOC(R_AARCH64_MOVW_UABS_G1_NC,              0x10a)
+ELF_RELOC(R_AARCH64_MOVW_UABS_G2,                 0x10b)
+ELF_RELOC(R_AARCH64_MOVW_UABS_G2_NC,              0x10c)
+ELF_RELOC(R_AARCH64_MOVW_UABS_G3,                 0x10d)
+ELF_RELOC(R_AARCH64_MOVW_SABS_G0,                 0x10e)
+ELF_RELOC(R_AARCH64_MOVW_SABS_G1,                 0x10f)
+ELF_RELOC(R_AARCH64_MOVW_SABS_G2,                 0x110)
+
+ELF_RELOC(R_AARCH64_LD_PREL_LO19,                 0x111)
+ELF_RELOC(R_AARCH64_ADR_PREL_LO21,                0x112)
+ELF_RELOC(R_AARCH64_ADR_PREL_PG_HI21,             0x113)
+ELF_RELOC(R_AARCH64_ADR_PREL_PG_HI21_NC,          0x114)
+ELF_RELOC(R_AARCH64_ADD_ABS_LO12_NC,              0x115)
+ELF_RELOC(R_AARCH64_LDST8_ABS_LO12_NC,            0x116)
+
+ELF_RELOC(R_AARCH64_TSTBR14,                      0x117)
+ELF_RELOC(R_AARCH64_CONDBR19,                     0x118)
+ELF_RELOC(R_AARCH64_JUMP26,                       0x11a)
+ELF_RELOC(R_AARCH64_CALL26,                       0x11b)
+
+ELF_RELOC(R_AARCH64_LDST16_ABS_LO12_NC,           0x11c)
+ELF_RELOC(R_AARCH64_LDST32_ABS_LO12_NC,           0x11d)
+ELF_RELOC(R_AARCH64_LDST64_ABS_LO12_NC,           0x11e)
+
+ELF_RELOC(R_AARCH64_MOVW_PREL_G0,                 0x11f)
+ELF_RELOC(R_AARCH64_MOVW_PREL_G0_NC,              0x120)
+ELF_RELOC(R_AARCH64_MOVW_PREL_G1,                 0x121)
+ELF_RELOC(R_AARCH64_MOVW_PREL_G1_NC,              0x122)
+ELF_RELOC(R_AARCH64_MOVW_PREL_G2,                 0x123)
+ELF_RELOC(R_AARCH64_MOVW_PREL_G2_NC,              0x124)
+ELF_RELOC(R_AARCH64_MOVW_PREL_G3,                 0x125)
+
+ELF_RELOC(R_AARCH64_LDST128_ABS_LO12_NC,          0x12b)
+
+ELF_RELOC(R_AARCH64_MOVW_GOTOFF_G0,               0x12c)
+ELF_RELOC(R_AARCH64_MOVW_GOTOFF_G0_NC,            0x12d)
+ELF_RELOC(R_AARCH64_MOVW_GOTOFF_G1,               0x12e)
+ELF_RELOC(R_AARCH64_MOVW_GOTOFF_G1_NC,            0x12f)
+ELF_RELOC(R_AARCH64_MOVW_GOTOFF_G2,               0x130)
+ELF_RELOC(R_AARCH64_MOVW_GOTOFF_G2_NC,            0x131)
+ELF_RELOC(R_AARCH64_MOVW_GOTOFF_G3,               0x132)
+
+ELF_RELOC(R_AARCH64_GOTREL64,                     0x133)
+ELF_RELOC(R_AARCH64_GOTREL32,                     0x134)
+
+ELF_RELOC(R_AARCH64_GOT_LD_PREL19,                0x135)
+ELF_RELOC(R_AARCH64_LD64_GOTOFF_LO15,             0x136)
+ELF_RELOC(R_AARCH64_ADR_GOT_PAGE,                 0x137)
+ELF_RELOC(R_AARCH64_LD64_GOT_LO12_NC,             0x138)
+ELF_RELOC(R_AARCH64_LD64_GOTPAGE_LO15,            0x139)
+
+ELF_RELOC(R_AARCH64_TLSGD_ADR_PREL21,             0x200)
+ELF_RELOC(R_AARCH64_TLSGD_ADR_PAGE21,             0x201)
+ELF_RELOC(R_AARCH64_TLSGD_ADD_LO12_NC,            0x202)
+ELF_RELOC(R_AARCH64_TLSGD_MOVW_G1,                0x203)
+ELF_RELOC(R_AARCH64_TLSGD_MOVW_G0_NC,             0x204)
+
+ELF_RELOC(R_AARCH64_TLSLD_ADR_PREL21,             0x205)
+ELF_RELOC(R_AARCH64_TLSLD_ADR_PAGE21,             0x206)
+ELF_RELOC(R_AARCH64_TLSLD_ADD_LO12_NC,            0x207)
+ELF_RELOC(R_AARCH64_TLSLD_MOVW_G1,                0x208)
+ELF_RELOC(R_AARCH64_TLSLD_MOVW_G0_NC,             0x209)
+ELF_RELOC(R_AARCH64_TLSLD_LD_PREL19,              0x20a)
+ELF_RELOC(R_AARCH64_TLSLD_MOVW_DTPREL_G2,         0x20b)
+ELF_RELOC(R_AARCH64_TLSLD_MOVW_DTPREL_G1,         0x20c)
+ELF_RELOC(R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC,      0x20d)
+ELF_RELOC(R_AARCH64_TLSLD_MOVW_DTPREL_G0,         0x20e)
+ELF_RELOC(R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC,      0x20f)
+ELF_RELOC(R_AARCH64_TLSLD_ADD_DTPREL_HI12,        0x210)
+ELF_RELOC(R_AARCH64_TLSLD_ADD_DTPREL_LO12,        0x211)
+ELF_RELOC(R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC,     0x212)
+ELF_RELOC(R_AARCH64_TLSLD_LDST8_DTPREL_LO12,      0x213)
+ELF_RELOC(R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC,   0x214)
+ELF_RELOC(R_AARCH64_TLSLD_LDST16_DTPREL_LO12,     0x215)
+ELF_RELOC(R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC,  0x216)
+ELF_RELOC(R_AARCH64_TLSLD_LDST32_DTPREL_LO12,     0x217)
+ELF_RELOC(R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC,  0x218)
+ELF_RELOC(R_AARCH64_TLSLD_LDST64_DTPREL_LO12,     0x219)
+ELF_RELOC(R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC,  0x21a)
+
+ELF_RELOC(R_AARCH64_TLSIE_MOVW_GOTTPREL_G1,       0x21b)
+ELF_RELOC(R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC,    0x21c)
+ELF_RELOC(R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21,    0x21d)
+ELF_RELOC(R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC,  0x21e)
+ELF_RELOC(R_AARCH64_TLSIE_LD_GOTTPREL_PREL19,     0x21f)
+
+ELF_RELOC(R_AARCH64_TLSLE_MOVW_TPREL_G2,          0x220)
+ELF_RELOC(R_AARCH64_TLSLE_MOVW_TPREL_G1,          0x221)
+ELF_RELOC(R_AARCH64_TLSLE_MOVW_TPREL_G1_NC,       0x222)
+ELF_RELOC(R_AARCH64_TLSLE_MOVW_TPREL_G0,          0x223)
+ELF_RELOC(R_AARCH64_TLSLE_MOVW_TPREL_G0_NC,       0x224)
+ELF_RELOC(R_AARCH64_TLSLE_ADD_TPREL_HI12,         0x225)
+ELF_RELOC(R_AARCH64_TLSLE_ADD_TPREL_LO12,         0x226)
+ELF_RELOC(R_AARCH64_TLSLE_ADD_TPREL_LO12_NC,      0x227)
+ELF_RELOC(R_AARCH64_TLSLE_LDST8_TPREL_LO12,       0x228)
+ELF_RELOC(R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC,    0x229)
+ELF_RELOC(R_AARCH64_TLSLE_LDST16_TPREL_LO12,      0x22a)
+ELF_RELOC(R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,   0x22b)
+ELF_RELOC(R_AARCH64_TLSLE_LDST32_TPREL_LO12,      0x22c)
+ELF_RELOC(R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,   0x22d)
+ELF_RELOC(R_AARCH64_TLSLE_LDST64_TPREL_LO12,      0x22e)
+ELF_RELOC(R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,   0x22f)
+
+ELF_RELOC(R_AARCH64_TLSDESC_LD_PREL19,            0x230)
+ELF_RELOC(R_AARCH64_TLSDESC_ADR_PREL21,           0x231)
+ELF_RELOC(R_AARCH64_TLSDESC_ADR_PAGE21,           0x232)
+ELF_RELOC(R_AARCH64_TLSDESC_LD64_LO12_NC,         0x233)
+ELF_RELOC(R_AARCH64_TLSDESC_ADD_LO12_NC,          0x234)
+ELF_RELOC(R_AARCH64_TLSDESC_OFF_G1,               0x235)
+ELF_RELOC(R_AARCH64_TLSDESC_OFF_G0_NC,            0x236)
+ELF_RELOC(R_AARCH64_TLSDESC_LDR,                  0x237)
+ELF_RELOC(R_AARCH64_TLSDESC_ADD,                  0x238)
+ELF_RELOC(R_AARCH64_TLSDESC_CALL,                 0x239)
+
+ELF_RELOC(R_AARCH64_TLSLE_LDST128_TPREL_LO12,     0x23a)
+ELF_RELOC(R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC,  0x23b)
+
+ELF_RELOC(R_AARCH64_TLSLD_LDST128_DTPREL_LO12,    0x23c)
+ELF_RELOC(R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC, 0x23d)
+
+ELF_RELOC(R_AARCH64_COPY,                         0x400)
+ELF_RELOC(R_AARCH64_GLOB_DAT,                     0x401)
+ELF_RELOC(R_AARCH64_JUMP_SLOT,                    0x402)
+ELF_RELOC(R_AARCH64_RELATIVE,                     0x403)
+ELF_RELOC(R_AARCH64_TLS_DTPREL64,                 0x404)
+ELF_RELOC(R_AARCH64_TLS_DTPMOD64,                 0x405)
+ELF_RELOC(R_AARCH64_TLS_TPREL64,                  0x406)
+ELF_RELOC(R_AARCH64_TLSDESC,                      0x407)
+ELF_RELOC(R_AARCH64_IRELATIVE,                    0x408)
diff --git a/include/LIEF/ELF/Relocations/ARM.def b/include/LIEF/ELF/Relocations/ARM.def
new file mode 100644
index 0000000..21be8d1
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/ARM.def
@@ -0,0 +1,138 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+/* Meets 2.09 ABI Specs. */
+ELF_RELOC(R_ARM_NONE,                   0x00)
+ELF_RELOC(R_ARM_PC24,                   0x01)
+ELF_RELOC(R_ARM_ABS32,                  0x02)
+ELF_RELOC(R_ARM_REL32,                  0x03)
+ELF_RELOC(R_ARM_LDR_PC_G0,              0x04)
+ELF_RELOC(R_ARM_ABS16,                  0x05)
+ELF_RELOC(R_ARM_ABS12,                  0x06)
+ELF_RELOC(R_ARM_THM_ABS5,               0x07)
+ELF_RELOC(R_ARM_ABS8,                   0x08)
+ELF_RELOC(R_ARM_SBREL32,                0x09)
+ELF_RELOC(R_ARM_THM_CALL,               0x0a)
+ELF_RELOC(R_ARM_THM_PC8,                0x0b)
+ELF_RELOC(R_ARM_BREL_ADJ,               0x0c)
+ELF_RELOC(R_ARM_TLS_DESC,               0x0d)
+ELF_RELOC(R_ARM_THM_SWI8,               0x0e)
+ELF_RELOC(R_ARM_XPC25,                  0x0f)
+ELF_RELOC(R_ARM_THM_XPC22,              0x10)
+ELF_RELOC(R_ARM_TLS_DTPMOD32,           0x11)
+ELF_RELOC(R_ARM_TLS_DTPOFF32,           0x12)
+ELF_RELOC(R_ARM_TLS_TPOFF32,            0x13)
+ELF_RELOC(R_ARM_COPY,                   0x14)
+ELF_RELOC(R_ARM_GLOB_DAT,               0x15)
+ELF_RELOC(R_ARM_JUMP_SLOT,              0x16)
+ELF_RELOC(R_ARM_RELATIVE,               0x17)
+ELF_RELOC(R_ARM_GOTOFF32,               0x18)
+ELF_RELOC(R_ARM_BASE_PREL,              0x19)
+ELF_RELOC(R_ARM_GOT_BREL,               0x1a)
+ELF_RELOC(R_ARM_PLT32,                  0x1b)
+ELF_RELOC(R_ARM_CALL,                   0x1c)
+ELF_RELOC(R_ARM_JUMP24,                 0x1d)
+ELF_RELOC(R_ARM_THM_JUMP24,             0x1e)
+ELF_RELOC(R_ARM_BASE_ABS,               0x1f)
+ELF_RELOC(R_ARM_ALU_PCREL_7_0,          0x20)
+ELF_RELOC(R_ARM_ALU_PCREL_15_8,         0x21)
+ELF_RELOC(R_ARM_ALU_PCREL_23_15,        0x22)
+ELF_RELOC(R_ARM_LDR_SBREL_11_0_NC,      0x23)
+ELF_RELOC(R_ARM_ALU_SBREL_19_12_NC,     0x24)
+ELF_RELOC(R_ARM_ALU_SBREL_27_20_CK,     0x25)
+ELF_RELOC(R_ARM_TARGET1,                0x26)
+ELF_RELOC(R_ARM_SBREL31,                0x27)
+ELF_RELOC(R_ARM_V4BX,                   0x28)
+ELF_RELOC(R_ARM_TARGET2,                0x29)
+ELF_RELOC(R_ARM_PREL31,                 0x2a)
+ELF_RELOC(R_ARM_MOVW_ABS_NC,            0x2b)
+ELF_RELOC(R_ARM_MOVT_ABS,               0x2c)
+ELF_RELOC(R_ARM_MOVW_PREL_NC,           0x2d)
+ELF_RELOC(R_ARM_MOVT_PREL,              0x2e)
+ELF_RELOC(R_ARM_THM_MOVW_ABS_NC,        0x2f)
+ELF_RELOC(R_ARM_THM_MOVT_ABS,           0x30)
+ELF_RELOC(R_ARM_THM_MOVW_PREL_NC,       0x31)
+ELF_RELOC(R_ARM_THM_MOVT_PREL,          0x32)
+ELF_RELOC(R_ARM_THM_JUMP19,             0x33)
+ELF_RELOC(R_ARM_THM_JUMP6,              0x34)
+ELF_RELOC(R_ARM_THM_ALU_PREL_11_0,      0x35)
+ELF_RELOC(R_ARM_THM_PC12,               0x36)
+ELF_RELOC(R_ARM_ABS32_NOI,              0x37)
+ELF_RELOC(R_ARM_REL32_NOI,              0x38)
+ELF_RELOC(R_ARM_ALU_PC_G0_NC,           0x39)
+ELF_RELOC(R_ARM_ALU_PC_G0,              0x3a)
+ELF_RELOC(R_ARM_ALU_PC_G1_NC,           0x3b)
+ELF_RELOC(R_ARM_ALU_PC_G1,              0x3c)
+ELF_RELOC(R_ARM_ALU_PC_G2,              0x3d)
+ELF_RELOC(R_ARM_LDR_PC_G1,              0x3e)
+ELF_RELOC(R_ARM_LDR_PC_G2,              0x3f)
+ELF_RELOC(R_ARM_LDRS_PC_G0,             0x40)
+ELF_RELOC(R_ARM_LDRS_PC_G1,             0x41)
+ELF_RELOC(R_ARM_LDRS_PC_G2,             0x42)
+ELF_RELOC(R_ARM_LDC_PC_G0,              0x43)
+ELF_RELOC(R_ARM_LDC_PC_G1,              0x44)
+ELF_RELOC(R_ARM_LDC_PC_G2,              0x45)
+ELF_RELOC(R_ARM_ALU_SB_G0_NC,           0x46)
+ELF_RELOC(R_ARM_ALU_SB_G0,              0x47)
+ELF_RELOC(R_ARM_ALU_SB_G1_NC,           0x48)
+ELF_RELOC(R_ARM_ALU_SB_G1,              0x49)
+ELF_RELOC(R_ARM_ALU_SB_G2,              0x4a)
+ELF_RELOC(R_ARM_LDR_SB_G0,              0x4b)
+ELF_RELOC(R_ARM_LDR_SB_G1,              0x4c)
+ELF_RELOC(R_ARM_LDR_SB_G2,              0x4d)
+ELF_RELOC(R_ARM_LDRS_SB_G0,             0x4e)
+ELF_RELOC(R_ARM_LDRS_SB_G1,             0x4f)
+ELF_RELOC(R_ARM_LDRS_SB_G2,             0x50)
+ELF_RELOC(R_ARM_LDC_SB_G0,              0x51)
+ELF_RELOC(R_ARM_LDC_SB_G1,              0x52)
+ELF_RELOC(R_ARM_LDC_SB_G2,              0x53)
+ELF_RELOC(R_ARM_MOVW_BREL_NC,           0x54)
+ELF_RELOC(R_ARM_MOVT_BREL,              0x55)
+ELF_RELOC(R_ARM_MOVW_BREL,              0x56)
+ELF_RELOC(R_ARM_THM_MOVW_BREL_NC,       0x57)
+ELF_RELOC(R_ARM_THM_MOVT_BREL,          0x58)
+ELF_RELOC(R_ARM_THM_MOVW_BREL,          0x59)
+ELF_RELOC(R_ARM_TLS_GOTDESC,            0x5a)
+ELF_RELOC(R_ARM_TLS_CALL,               0x5b)
+ELF_RELOC(R_ARM_TLS_DESCSEQ,            0x5c)
+ELF_RELOC(R_ARM_THM_TLS_CALL,           0x5d)
+ELF_RELOC(R_ARM_PLT32_ABS,              0x5e)
+ELF_RELOC(R_ARM_GOT_ABS,                0x5f)
+ELF_RELOC(R_ARM_GOT_PREL,               0x60)
+ELF_RELOC(R_ARM_GOT_BREL12,             0x61)
+ELF_RELOC(R_ARM_GOTOFF12,               0x62)
+ELF_RELOC(R_ARM_GOTRELAX,               0x63)
+ELF_RELOC(R_ARM_GNU_VTENTRY,            0x64)
+ELF_RELOC(R_ARM_GNU_VTINHERIT,          0x65)
+ELF_RELOC(R_ARM_THM_JUMP11,             0x66)
+ELF_RELOC(R_ARM_THM_JUMP8,              0x67)
+ELF_RELOC(R_ARM_TLS_GD32,               0x68)
+ELF_RELOC(R_ARM_TLS_LDM32,              0x69)
+ELF_RELOC(R_ARM_TLS_LDO32,              0x6a)
+ELF_RELOC(R_ARM_TLS_IE32,               0x6b)
+ELF_RELOC(R_ARM_TLS_LE32,               0x6c)
+ELF_RELOC(R_ARM_TLS_LDO12,              0x6d)
+ELF_RELOC(R_ARM_TLS_LE12,               0x6e)
+ELF_RELOC(R_ARM_TLS_IE12GP,             0x6f)
+ELF_RELOC(R_ARM_PRIVATE_0,              0x70)
+ELF_RELOC(R_ARM_PRIVATE_1,              0x71)
+ELF_RELOC(R_ARM_PRIVATE_2,              0x72)
+ELF_RELOC(R_ARM_PRIVATE_3,              0x73)
+ELF_RELOC(R_ARM_PRIVATE_4,              0x74)
+ELF_RELOC(R_ARM_PRIVATE_5,              0x75)
+ELF_RELOC(R_ARM_PRIVATE_6,              0x76)
+ELF_RELOC(R_ARM_PRIVATE_7,              0x77)
+ELF_RELOC(R_ARM_PRIVATE_8,              0x78)
+ELF_RELOC(R_ARM_PRIVATE_9,              0x79)
+ELF_RELOC(R_ARM_PRIVATE_10,             0x7a)
+ELF_RELOC(R_ARM_PRIVATE_11,             0x7b)
+ELF_RELOC(R_ARM_PRIVATE_12,             0x7c)
+ELF_RELOC(R_ARM_PRIVATE_13,             0x7d)
+ELF_RELOC(R_ARM_PRIVATE_14,             0x7e)
+ELF_RELOC(R_ARM_PRIVATE_15,             0x7f)
+ELF_RELOC(R_ARM_ME_TOO,                 0x80)
+ELF_RELOC(R_ARM_THM_TLS_DESCSEQ16,      0x81)
+ELF_RELOC(R_ARM_THM_TLS_DESCSEQ32,      0x82)
+ELF_RELOC(R_ARM_IRELATIVE,              0xa0)
diff --git a/include/LIEF/ELF/Relocations/Hexagon.def b/include/LIEF/ELF/Relocations/Hexagon.def
new file mode 100644
index 0000000..c47cf19
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/Hexagon.def
@@ -0,0 +1,100 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+/* Release 5 ABI */
+ELF_RELOC(R_HEX_NONE,                0)
+ELF_RELOC(R_HEX_B22_PCREL,           1)
+ELF_RELOC(R_HEX_B15_PCREL,           2)
+ELF_RELOC(R_HEX_B7_PCREL,            3)
+ELF_RELOC(R_HEX_LO16,                4)
+ELF_RELOC(R_HEX_HI16,                5)
+ELF_RELOC(R_HEX_32,                  6)
+ELF_RELOC(R_HEX_16,                  7)
+ELF_RELOC(R_HEX_8,                   8)
+ELF_RELOC(R_HEX_GPREL16_0,           9)
+ELF_RELOC(R_HEX_GPREL16_1,           10)
+ELF_RELOC(R_HEX_GPREL16_2,           11)
+ELF_RELOC(R_HEX_GPREL16_3,           12)
+ELF_RELOC(R_HEX_HL16,                13)
+ELF_RELOC(R_HEX_B13_PCREL,           14)
+ELF_RELOC(R_HEX_B9_PCREL,            15)
+ELF_RELOC(R_HEX_B32_PCREL_X,         16)
+ELF_RELOC(R_HEX_32_6_X,              17)
+ELF_RELOC(R_HEX_B22_PCREL_X,         18)
+ELF_RELOC(R_HEX_B15_PCREL_X,         19)
+ELF_RELOC(R_HEX_B13_PCREL_X,         20)
+ELF_RELOC(R_HEX_B9_PCREL_X,          21)
+ELF_RELOC(R_HEX_B7_PCREL_X,          22)
+ELF_RELOC(R_HEX_16_X,                23)
+ELF_RELOC(R_HEX_12_X,                24)
+ELF_RELOC(R_HEX_11_X,                25)
+ELF_RELOC(R_HEX_10_X,                26)
+ELF_RELOC(R_HEX_9_X,                 27)
+ELF_RELOC(R_HEX_8_X,                 28)
+ELF_RELOC(R_HEX_7_X,                 29)
+ELF_RELOC(R_HEX_6_X,                 30)
+ELF_RELOC(R_HEX_32_PCREL,            31)
+ELF_RELOC(R_HEX_COPY,                32)
+ELF_RELOC(R_HEX_GLOB_DAT,            33)
+ELF_RELOC(R_HEX_JMP_SLOT,            34)
+ELF_RELOC(R_HEX_RELATIVE,            35)
+ELF_RELOC(R_HEX_PLT_B22_PCREL,       36)
+ELF_RELOC(R_HEX_GOTREL_LO16,         37)
+ELF_RELOC(R_HEX_GOTREL_HI16,         38)
+ELF_RELOC(R_HEX_GOTREL_32,           39)
+ELF_RELOC(R_HEX_GOT_LO16,            40)
+ELF_RELOC(R_HEX_GOT_HI16,            41)
+ELF_RELOC(R_HEX_GOT_32,              42)
+ELF_RELOC(R_HEX_GOT_16,              43)
+ELF_RELOC(R_HEX_DTPMOD_32,           44)
+ELF_RELOC(R_HEX_DTPREL_LO16,         45)
+ELF_RELOC(R_HEX_DTPREL_HI16,         46)
+ELF_RELOC(R_HEX_DTPREL_32,           47)
+ELF_RELOC(R_HEX_DTPREL_16,           48)
+ELF_RELOC(R_HEX_GD_PLT_B22_PCREL,    49)
+ELF_RELOC(R_HEX_GD_GOT_LO16,         50)
+ELF_RELOC(R_HEX_GD_GOT_HI16,         51)
+ELF_RELOC(R_HEX_GD_GOT_32,           52)
+ELF_RELOC(R_HEX_GD_GOT_16,           53)
+ELF_RELOC(R_HEX_IE_LO16,             54)
+ELF_RELOC(R_HEX_IE_HI16,             55)
+ELF_RELOC(R_HEX_IE_32,               56)
+ELF_RELOC(R_HEX_IE_GOT_LO16,         57)
+ELF_RELOC(R_HEX_IE_GOT_HI16,         58)
+ELF_RELOC(R_HEX_IE_GOT_32,           59)
+ELF_RELOC(R_HEX_IE_GOT_16,           60)
+ELF_RELOC(R_HEX_TPREL_LO16,          61)
+ELF_RELOC(R_HEX_TPREL_HI16,          62)
+ELF_RELOC(R_HEX_TPREL_32,            63)
+ELF_RELOC(R_HEX_TPREL_16,            64)
+ELF_RELOC(R_HEX_6_PCREL_X,           65)
+ELF_RELOC(R_HEX_GOTREL_32_6_X,       66)
+ELF_RELOC(R_HEX_GOTREL_16_X,         67)
+ELF_RELOC(R_HEX_GOTREL_11_X,         68)
+ELF_RELOC(R_HEX_GOT_32_6_X,          69)
+ELF_RELOC(R_HEX_GOT_16_X,            70)
+ELF_RELOC(R_HEX_GOT_11_X,            71)
+ELF_RELOC(R_HEX_DTPREL_32_6_X,       72)
+ELF_RELOC(R_HEX_DTPREL_16_X,         73)
+ELF_RELOC(R_HEX_DTPREL_11_X,         74)
+ELF_RELOC(R_HEX_GD_GOT_32_6_X,       75)
+ELF_RELOC(R_HEX_GD_GOT_16_X,         76)
+ELF_RELOC(R_HEX_GD_GOT_11_X,         77)
+ELF_RELOC(R_HEX_IE_32_6_X,           78)
+ELF_RELOC(R_HEX_IE_16_X,             79)
+ELF_RELOC(R_HEX_IE_GOT_32_6_X,       80)
+ELF_RELOC(R_HEX_IE_GOT_16_X,         81)
+ELF_RELOC(R_HEX_IE_GOT_11_X,         82)
+ELF_RELOC(R_HEX_TPREL_32_6_X,        83)
+ELF_RELOC(R_HEX_TPREL_16_X,          84)
+ELF_RELOC(R_HEX_TPREL_11_X,          85)
+ELF_RELOC(R_HEX_LD_PLT_B22_PCREL,    86)
+ELF_RELOC(R_HEX_LD_GOT_LO16,         87)
+ELF_RELOC(R_HEX_LD_GOT_HI16,         88)
+ELF_RELOC(R_HEX_LD_GOT_32,           89)
+ELF_RELOC(R_HEX_LD_GOT_16,           90)
+ELF_RELOC(R_HEX_LD_GOT_32_6_X,       91)
+ELF_RELOC(R_HEX_LD_GOT_16_X,         92)
+ELF_RELOC(R_HEX_LD_GOT_11_X,         93)
diff --git a/include/LIEF/ELF/Relocations/Mips.def b/include/LIEF/ELF/Relocations/Mips.def
new file mode 100644
index 0000000..77e7f8e
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/Mips.def
@@ -0,0 +1,117 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+ELF_RELOC(R_MIPS_NONE,                0)
+ELF_RELOC(R_MIPS_16,                  1)
+ELF_RELOC(R_MIPS_32,                  2)
+ELF_RELOC(R_MIPS_REL32,               3)
+ELF_RELOC(R_MIPS_26,                  4)
+ELF_RELOC(R_MIPS_HI16,                5)
+ELF_RELOC(R_MIPS_LO16,                6)
+ELF_RELOC(R_MIPS_GPREL16,             7)
+ELF_RELOC(R_MIPS_LITERAL,             8)
+ELF_RELOC(R_MIPS_GOT16,               9)
+ELF_RELOC(R_MIPS_PC16,               10)
+ELF_RELOC(R_MIPS_CALL16,             11)
+ELF_RELOC(R_MIPS_GPREL32,            12)
+ELF_RELOC(R_MIPS_UNUSED1,            13)
+ELF_RELOC(R_MIPS_UNUSED2,            14)
+ELF_RELOC(R_MIPS_UNUSED3,            15)
+ELF_RELOC(R_MIPS_SHIFT5,             16)
+ELF_RELOC(R_MIPS_SHIFT6,             17)
+ELF_RELOC(R_MIPS_64,                 18)
+ELF_RELOC(R_MIPS_GOT_DISP,           19)
+ELF_RELOC(R_MIPS_GOT_PAGE,           20)
+ELF_RELOC(R_MIPS_GOT_OFST,           21)
+ELF_RELOC(R_MIPS_GOT_HI16,           22)
+ELF_RELOC(R_MIPS_GOT_LO16,           23)
+ELF_RELOC(R_MIPS_SUB,                24)
+ELF_RELOC(R_MIPS_INSERT_A,           25)
+ELF_RELOC(R_MIPS_INSERT_B,           26)
+ELF_RELOC(R_MIPS_DELETE,             27)
+ELF_RELOC(R_MIPS_HIGHER,             28)
+ELF_RELOC(R_MIPS_HIGHEST,            29)
+ELF_RELOC(R_MIPS_CALL_HI16,          30)
+ELF_RELOC(R_MIPS_CALL_LO16,          31)
+ELF_RELOC(R_MIPS_SCN_DISP,           32)
+ELF_RELOC(R_MIPS_REL16,              33)
+ELF_RELOC(R_MIPS_ADD_IMMEDIATE,      34)
+ELF_RELOC(R_MIPS_PJUMP,              35)
+ELF_RELOC(R_MIPS_RELGOT,             36)
+ELF_RELOC(R_MIPS_JALR,               37)
+ELF_RELOC(R_MIPS_TLS_DTPMOD32,       38)
+ELF_RELOC(R_MIPS_TLS_DTPREL32,       39)
+ELF_RELOC(R_MIPS_TLS_DTPMOD64,       40)
+ELF_RELOC(R_MIPS_TLS_DTPREL64,       41)
+ELF_RELOC(R_MIPS_TLS_GD,             42)
+ELF_RELOC(R_MIPS_TLS_LDM,            43)
+ELF_RELOC(R_MIPS_TLS_DTPREL_HI16,    44)
+ELF_RELOC(R_MIPS_TLS_DTPREL_LO16,    45)
+ELF_RELOC(R_MIPS_TLS_GOTTPREL,       46)
+ELF_RELOC(R_MIPS_TLS_TPREL32,        47)
+ELF_RELOC(R_MIPS_TLS_TPREL64,        48)
+ELF_RELOC(R_MIPS_TLS_TPREL_HI16,     49)
+ELF_RELOC(R_MIPS_TLS_TPREL_LO16,     50)
+ELF_RELOC(R_MIPS_GLOB_DAT,           51)
+ELF_RELOC(R_MIPS_PC21_S2,            60)
+ELF_RELOC(R_MIPS_PC26_S2,            61)
+ELF_RELOC(R_MIPS_PC18_S3,            62)
+ELF_RELOC(R_MIPS_PC19_S2,            63)
+ELF_RELOC(R_MIPS_PCHI16,             64)
+ELF_RELOC(R_MIPS_PCLO16,             65)
+ELF_RELOC(R_MIPS16_26,               100)
+ELF_RELOC(R_MIPS16_GPREL,            101)
+ELF_RELOC(R_MIPS16_GOT16,            102)
+ELF_RELOC(R_MIPS16_CALL16,           103)
+ELF_RELOC(R_MIPS16_HI16,             104)
+ELF_RELOC(R_MIPS16_LO16,             105)
+ELF_RELOC(R_MIPS16_TLS_GD,           106)
+ELF_RELOC(R_MIPS16_TLS_LDM,          107)
+ELF_RELOC(R_MIPS16_TLS_DTPREL_HI16,  108)
+ELF_RELOC(R_MIPS16_TLS_DTPREL_LO16,  109)
+ELF_RELOC(R_MIPS16_TLS_GOTTPREL,     110)
+ELF_RELOC(R_MIPS16_TLS_TPREL_HI16,   111)
+ELF_RELOC(R_MIPS16_TLS_TPREL_LO16,   112)
+ELF_RELOC(R_MIPS_COPY,               126)
+ELF_RELOC(R_MIPS_JUMP_SLOT,          127)
+ELF_RELOC(R_MICROMIPS_26_S1,         133)
+ELF_RELOC(R_MICROMIPS_HI16,          134)
+ELF_RELOC(R_MICROMIPS_LO16,          135)
+ELF_RELOC(R_MICROMIPS_GPREL16,       136)
+ELF_RELOC(R_MICROMIPS_LITERAL,       137)
+ELF_RELOC(R_MICROMIPS_GOT16,         138)
+ELF_RELOC(R_MICROMIPS_PC7_S1,        139)
+ELF_RELOC(R_MICROMIPS_PC10_S1,       140)
+ELF_RELOC(R_MICROMIPS_PC16_S1,       141)
+ELF_RELOC(R_MICROMIPS_CALL16,        142)
+ELF_RELOC(R_MICROMIPS_GOT_DISP,      145)
+ELF_RELOC(R_MICROMIPS_GOT_PAGE,      146)
+ELF_RELOC(R_MICROMIPS_GOT_OFST,      147)
+ELF_RELOC(R_MICROMIPS_GOT_HI16,      148)
+ELF_RELOC(R_MICROMIPS_GOT_LO16,      149)
+ELF_RELOC(R_MICROMIPS_SUB,           150)
+ELF_RELOC(R_MICROMIPS_HIGHER,        151)
+ELF_RELOC(R_MICROMIPS_HIGHEST,       152)
+ELF_RELOC(R_MICROMIPS_CALL_HI16,     153)
+ELF_RELOC(R_MICROMIPS_CALL_LO16,     154)
+ELF_RELOC(R_MICROMIPS_SCN_DISP,      155)
+ELF_RELOC(R_MICROMIPS_JALR,          156)
+ELF_RELOC(R_MICROMIPS_HI0_LO16,      157)
+ELF_RELOC(R_MICROMIPS_TLS_GD,           162)
+ELF_RELOC(R_MICROMIPS_TLS_LDM,          163)
+ELF_RELOC(R_MICROMIPS_TLS_DTPREL_HI16,  164)
+ELF_RELOC(R_MICROMIPS_TLS_DTPREL_LO16,  165)
+ELF_RELOC(R_MICROMIPS_TLS_GOTTPREL,     166)
+ELF_RELOC(R_MICROMIPS_TLS_TPREL_HI16,   169)
+ELF_RELOC(R_MICROMIPS_TLS_TPREL_LO16,   170)
+ELF_RELOC(R_MICROMIPS_GPREL7_S2,        172)
+ELF_RELOC(R_MICROMIPS_PC23_S2,          173)
+ELF_RELOC(R_MICROMIPS_PC21_S2,          174)
+ELF_RELOC(R_MICROMIPS_PC26_S2,          175)
+ELF_RELOC(R_MICROMIPS_PC18_S3,          176)
+ELF_RELOC(R_MICROMIPS_PC19_S2,          177)
+ELF_RELOC(R_MIPS_NUM,                218)
+ELF_RELOC(R_MIPS_PC32,               248)
+ELF_RELOC(R_MIPS_EH,                 249)
diff --git a/include/LIEF/ELF/Relocations/PowerPC.def b/include/LIEF/ELF/Relocations/PowerPC.def
new file mode 100644
index 0000000..b6c3941
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/PowerPC.def
@@ -0,0 +1,61 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+ELF_RELOC(R_PPC_NONE,                   0)      /* No relocation. */
+ELF_RELOC(R_PPC_ADDR32,                 1)
+ELF_RELOC(R_PPC_ADDR24,                 2)
+ELF_RELOC(R_PPC_ADDR16,                 3)
+ELF_RELOC(R_PPC_ADDR16_LO,              4)
+ELF_RELOC(R_PPC_ADDR16_HI,              5)
+ELF_RELOC(R_PPC_ADDR16_HA,              6)
+ELF_RELOC(R_PPC_ADDR14,                 7)
+ELF_RELOC(R_PPC_ADDR14_BRTAKEN,         8)
+ELF_RELOC(R_PPC_ADDR14_BRNTAKEN,        9)
+ELF_RELOC(R_PPC_REL24,                  10)
+ELF_RELOC(R_PPC_REL14,                  11)
+ELF_RELOC(R_PPC_REL14_BRTAKEN,          12)
+ELF_RELOC(R_PPC_REL14_BRNTAKEN,         13)
+ELF_RELOC(R_PPC_GOT16,                  14)
+ELF_RELOC(R_PPC_GOT16_LO,               15)
+ELF_RELOC(R_PPC_GOT16_HI,               16)
+ELF_RELOC(R_PPC_GOT16_HA,               17)
+ELF_RELOC(R_PPC_PLTREL24,               18)
+ELF_RELOC(R_PPC_JMP_SLOT,               21)
+ELF_RELOC(R_PPC_LOCAL24PC,              23)
+ELF_RELOC(R_PPC_REL32,                  26)
+ELF_RELOC(R_PPC_TLS,                    67)
+ELF_RELOC(R_PPC_DTPMOD32,               68)
+ELF_RELOC(R_PPC_TPREL16,                69)
+ELF_RELOC(R_PPC_TPREL16_LO,             70)
+ELF_RELOC(R_PPC_TPREL16_HI,             71)
+ELF_RELOC(R_PPC_TPREL16_HA,             72)
+ELF_RELOC(R_PPC_TPREL32,                73)
+ELF_RELOC(R_PPC_DTPREL16,               74)
+ELF_RELOC(R_PPC_DTPREL16_LO,            75)
+ELF_RELOC(R_PPC_DTPREL16_HI,            76)
+ELF_RELOC(R_PPC_DTPREL16_HA,            77)
+ELF_RELOC(R_PPC_DTPREL32,               78)
+ELF_RELOC(R_PPC_GOT_TLSGD16,            79)
+ELF_RELOC(R_PPC_GOT_TLSGD16_LO,         80)
+ELF_RELOC(R_PPC_GOT_TLSGD16_HI,         81)
+ELF_RELOC(R_PPC_GOT_TLSGD16_HA,         82)
+ELF_RELOC(R_PPC_GOT_TLSLD16,            83)
+ELF_RELOC(R_PPC_GOT_TLSLD16_LO,         84)
+ELF_RELOC(R_PPC_GOT_TLSLD16_HI,         85)
+ELF_RELOC(R_PPC_GOT_TLSLD16_HA,         86)
+ELF_RELOC(R_PPC_GOT_TPREL16,            87)
+ELF_RELOC(R_PPC_GOT_TPREL16_LO,         88)
+ELF_RELOC(R_PPC_GOT_TPREL16_HI,         89)
+ELF_RELOC(R_PPC_GOT_TPREL16_HA,         90)
+ELF_RELOC(R_PPC_GOT_DTPREL16,           91)
+ELF_RELOC(R_PPC_GOT_DTPREL16_LO,        92)
+ELF_RELOC(R_PPC_GOT_DTPREL16_HI,        93)
+ELF_RELOC(R_PPC_GOT_DTPREL16_HA,        94)
+ELF_RELOC(R_PPC_TLSGD,                  95)
+ELF_RELOC(R_PPC_TLSLD,                  96)
+ELF_RELOC(R_PPC_REL16,                  249)
+ELF_RELOC(R_PPC_REL16_LO,               250)
+ELF_RELOC(R_PPC_REL16_HI,               251)
+ELF_RELOC(R_PPC_REL16_HA,               252)
diff --git a/include/LIEF/ELF/Relocations/PowerPC64.def b/include/LIEF/ELF/Relocations/PowerPC64.def
new file mode 100644
index 0000000..7b2a3cb
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/PowerPC64.def
@@ -0,0 +1,88 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+ELF_RELOC(R_PPC64_NONE,                 0)
+ELF_RELOC(R_PPC64_ADDR32,               1)
+ELF_RELOC(R_PPC64_ADDR24,               2)
+ELF_RELOC(R_PPC64_ADDR16,               3)
+ELF_RELOC(R_PPC64_ADDR16_LO,            4)
+ELF_RELOC(R_PPC64_ADDR16_HI,            5)
+ELF_RELOC(R_PPC64_ADDR16_HA,            6)
+ELF_RELOC(R_PPC64_ADDR14,               7)
+ELF_RELOC(R_PPC64_ADDR14_BRTAKEN,       8)
+ELF_RELOC(R_PPC64_ADDR14_BRNTAKEN,      9)
+ELF_RELOC(R_PPC64_REL24,                10)
+ELF_RELOC(R_PPC64_REL14,                11)
+ELF_RELOC(R_PPC64_REL14_BRTAKEN,        12)
+ELF_RELOC(R_PPC64_REL14_BRNTAKEN,       13)
+ELF_RELOC(R_PPC64_GOT16,                14)
+ELF_RELOC(R_PPC64_GOT16_LO,             15)
+ELF_RELOC(R_PPC64_GOT16_HI,             16)
+ELF_RELOC(R_PPC64_GOT16_HA,             17)
+ELF_RELOC(R_PPC64_JMP_SLOT,             21)
+ELF_RELOC(R_PPC64_REL32,                26)
+ELF_RELOC(R_PPC64_ADDR64,               38)
+ELF_RELOC(R_PPC64_ADDR16_HIGHER,        39)
+ELF_RELOC(R_PPC64_ADDR16_HIGHERA,       40)
+ELF_RELOC(R_PPC64_ADDR16_HIGHEST,       41)
+ELF_RELOC(R_PPC64_ADDR16_HIGHESTA,      42)
+ELF_RELOC(R_PPC64_REL64,                44)
+ELF_RELOC(R_PPC64_TOC16,                47)
+ELF_RELOC(R_PPC64_TOC16_LO,             48)
+ELF_RELOC(R_PPC64_TOC16_HI,             49)
+ELF_RELOC(R_PPC64_TOC16_HA,             50)
+ELF_RELOC(R_PPC64_TOC,                  51)
+ELF_RELOC(R_PPC64_ADDR16_DS,            56)
+ELF_RELOC(R_PPC64_ADDR16_LO_DS,         57)
+ELF_RELOC(R_PPC64_GOT16_DS,             58)
+ELF_RELOC(R_PPC64_GOT16_LO_DS,          59)
+ELF_RELOC(R_PPC64_TOC16_DS,             63)
+ELF_RELOC(R_PPC64_TOC16_LO_DS,          64)
+ELF_RELOC(R_PPC64_TLS,                  67)
+ELF_RELOC(R_PPC64_DTPMOD64,             68)
+ELF_RELOC(R_PPC64_TPREL16,              69)
+ELF_RELOC(R_PPC64_TPREL16_LO,           70)
+ELF_RELOC(R_PPC64_TPREL16_HI,           71)
+ELF_RELOC(R_PPC64_TPREL16_HA,           72)
+ELF_RELOC(R_PPC64_TPREL64,              73)
+ELF_RELOC(R_PPC64_DTPREL16,             74)
+ELF_RELOC(R_PPC64_DTPREL16_LO,          75)
+ELF_RELOC(R_PPC64_DTPREL16_HI,          76)
+ELF_RELOC(R_PPC64_DTPREL16_HA,          77)
+ELF_RELOC(R_PPC64_DTPREL64,             78)
+ELF_RELOC(R_PPC64_GOT_TLSGD16,          79)
+ELF_RELOC(R_PPC64_GOT_TLSGD16_LO,       80)
+ELF_RELOC(R_PPC64_GOT_TLSGD16_HI,       81)
+ELF_RELOC(R_PPC64_GOT_TLSGD16_HA,       82)
+ELF_RELOC(R_PPC64_GOT_TLSLD16,          83)
+ELF_RELOC(R_PPC64_GOT_TLSLD16_LO,       84)
+ELF_RELOC(R_PPC64_GOT_TLSLD16_HI,       85)
+ELF_RELOC(R_PPC64_GOT_TLSLD16_HA,       86)
+ELF_RELOC(R_PPC64_GOT_TPREL16_DS,       87)
+ELF_RELOC(R_PPC64_GOT_TPREL16_LO_DS,    88)
+ELF_RELOC(R_PPC64_GOT_TPREL16_HI,       89)
+ELF_RELOC(R_PPC64_GOT_TPREL16_HA,       90)
+ELF_RELOC(R_PPC64_GOT_DTPREL16_DS,      91)
+ELF_RELOC(R_PPC64_GOT_DTPREL16_LO_DS,   92)
+ELF_RELOC(R_PPC64_GOT_DTPREL16_HI,      93)
+ELF_RELOC(R_PPC64_GOT_DTPREL16_HA,      94)
+ELF_RELOC(R_PPC64_TPREL16_DS,           95)
+ELF_RELOC(R_PPC64_TPREL16_LO_DS,        96)
+ELF_RELOC(R_PPC64_TPREL16_HIGHER,       97)
+ELF_RELOC(R_PPC64_TPREL16_HIGHERA,      98)
+ELF_RELOC(R_PPC64_TPREL16_HIGHEST,      99)
+ELF_RELOC(R_PPC64_TPREL16_HIGHESTA,     100)
+ELF_RELOC(R_PPC64_DTPREL16_DS,          101)
+ELF_RELOC(R_PPC64_DTPREL16_LO_DS,       102)
+ELF_RELOC(R_PPC64_DTPREL16_HIGHER,      103)
+ELF_RELOC(R_PPC64_DTPREL16_HIGHERA,     104)
+ELF_RELOC(R_PPC64_DTPREL16_HIGHEST,     105)
+ELF_RELOC(R_PPC64_DTPREL16_HIGHESTA,    106)
+ELF_RELOC(R_PPC64_TLSGD,                107)
+ELF_RELOC(R_PPC64_TLSLD,                108)
+ELF_RELOC(R_PPC64_REL16,                249)
+ELF_RELOC(R_PPC64_REL16_LO,             250)
+ELF_RELOC(R_PPC64_REL16_HI,             251)
+ELF_RELOC(R_PPC64_REL16_HA,             252)
diff --git a/include/LIEF/ELF/Relocations/Sparc.def b/include/LIEF/ELF/Relocations/Sparc.def
new file mode 100644
index 0000000..7e01a4a
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/Sparc.def
@@ -0,0 +1,89 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+ELF_RELOC(R_SPARC_NONE,         0)
+ELF_RELOC(R_SPARC_8,            1)
+ELF_RELOC(R_SPARC_16,           2)
+ELF_RELOC(R_SPARC_32,           3)
+ELF_RELOC(R_SPARC_DISP8,        4)
+ELF_RELOC(R_SPARC_DISP16,       5)
+ELF_RELOC(R_SPARC_DISP32,       6)
+ELF_RELOC(R_SPARC_WDISP30,      7)
+ELF_RELOC(R_SPARC_WDISP22,      8)
+ELF_RELOC(R_SPARC_HI22,         9)
+ELF_RELOC(R_SPARC_22,           10)
+ELF_RELOC(R_SPARC_13,           11)
+ELF_RELOC(R_SPARC_LO10,         12)
+ELF_RELOC(R_SPARC_GOT10,        13)
+ELF_RELOC(R_SPARC_GOT13,        14)
+ELF_RELOC(R_SPARC_GOT22,        15)
+ELF_RELOC(R_SPARC_PC10,         16)
+ELF_RELOC(R_SPARC_PC22,         17)
+ELF_RELOC(R_SPARC_WPLT30,       18)
+ELF_RELOC(R_SPARC_COPY,         19)
+ELF_RELOC(R_SPARC_GLOB_DAT,     20)
+ELF_RELOC(R_SPARC_JMP_SLOT,     21)
+ELF_RELOC(R_SPARC_RELATIVE,     22)
+ELF_RELOC(R_SPARC_UA32,         23)
+ELF_RELOC(R_SPARC_PLT32,        24)
+ELF_RELOC(R_SPARC_HIPLT22,      25)
+ELF_RELOC(R_SPARC_LOPLT10,      26)
+ELF_RELOC(R_SPARC_PCPLT32,      27)
+ELF_RELOC(R_SPARC_PCPLT22,      28)
+ELF_RELOC(R_SPARC_PCPLT10,      29)
+ELF_RELOC(R_SPARC_10,           30)
+ELF_RELOC(R_SPARC_11,           31)
+ELF_RELOC(R_SPARC_64,           32)
+ELF_RELOC(R_SPARC_OLO10,        33)
+ELF_RELOC(R_SPARC_HH22,         34)
+ELF_RELOC(R_SPARC_HM10,         35)
+ELF_RELOC(R_SPARC_LM22,         36)
+ELF_RELOC(R_SPARC_PC_HH22,      37)
+ELF_RELOC(R_SPARC_PC_HM10,      38)
+ELF_RELOC(R_SPARC_PC_LM22,      39)
+ELF_RELOC(R_SPARC_WDISP16,      40)
+ELF_RELOC(R_SPARC_WDISP19,      41)
+ELF_RELOC(R_SPARC_7,            43)
+ELF_RELOC(R_SPARC_5,            44)
+ELF_RELOC(R_SPARC_6,            45)
+ELF_RELOC(R_SPARC_DISP64,       46)
+ELF_RELOC(R_SPARC_PLT64,        47)
+ELF_RELOC(R_SPARC_HIX22,        48)
+ELF_RELOC(R_SPARC_LOX10,        49)
+ELF_RELOC(R_SPARC_H44,          50)
+ELF_RELOC(R_SPARC_M44,          51)
+ELF_RELOC(R_SPARC_L44,          52)
+ELF_RELOC(R_SPARC_REGISTER,     53)
+ELF_RELOC(R_SPARC_UA64,         54)
+ELF_RELOC(R_SPARC_UA16,         55)
+ELF_RELOC(R_SPARC_TLS_GD_HI22,    56)
+ELF_RELOC(R_SPARC_TLS_GD_LO10,    57)
+ELF_RELOC(R_SPARC_TLS_GD_ADD,     58)
+ELF_RELOC(R_SPARC_TLS_GD_CALL,    59)
+ELF_RELOC(R_SPARC_TLS_LDM_HI22,   60)
+ELF_RELOC(R_SPARC_TLS_LDM_LO10,   61)
+ELF_RELOC(R_SPARC_TLS_LDM_ADD,    62)
+ELF_RELOC(R_SPARC_TLS_LDM_CALL,   63)
+ELF_RELOC(R_SPARC_TLS_LDO_HIX22,  64)
+ELF_RELOC(R_SPARC_TLS_LDO_LOX10,  65)
+ELF_RELOC(R_SPARC_TLS_LDO_ADD,    66)
+ELF_RELOC(R_SPARC_TLS_IE_HI22,    67)
+ELF_RELOC(R_SPARC_TLS_IE_LO10,    68)
+ELF_RELOC(R_SPARC_TLS_IE_LD,      69)
+ELF_RELOC(R_SPARC_TLS_IE_LDX,     70)
+ELF_RELOC(R_SPARC_TLS_IE_ADD,     71)
+ELF_RELOC(R_SPARC_TLS_LE_HIX22,   72)
+ELF_RELOC(R_SPARC_TLS_LE_LOX10,   73)
+ELF_RELOC(R_SPARC_TLS_DTPMOD32,   74)
+ELF_RELOC(R_SPARC_TLS_DTPMOD64,   75)
+ELF_RELOC(R_SPARC_TLS_DTPOFF32,   76)
+ELF_RELOC(R_SPARC_TLS_DTPOFF64,   77)
+ELF_RELOC(R_SPARC_TLS_TPOFF32,    78)
+ELF_RELOC(R_SPARC_TLS_TPOFF64,    79)
+ELF_RELOC(R_SPARC_GOTDATA_HIX22,  80)
+ELF_RELOC(R_SPARC_GOTDATA_LOX10,  81)
+ELF_RELOC(R_SPARC_GOTDATA_OP_HIX22,  82)
+ELF_RELOC(R_SPARC_GOTDATA_OP_LOX10,  83)
+ELF_RELOC(R_SPARC_GOTDATA_OP,     84)
diff --git a/include/LIEF/ELF/Relocations/SystemZ.def b/include/LIEF/ELF/Relocations/SystemZ.def
new file mode 100644
index 0000000..711f940
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/SystemZ.def
@@ -0,0 +1,67 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+ELF_RELOC(R_390_NONE,          0)
+ELF_RELOC(R_390_8,             1)
+ELF_RELOC(R_390_12,            2)
+ELF_RELOC(R_390_16,            3)
+ELF_RELOC(R_390_32,            4)
+ELF_RELOC(R_390_PC32,          5)
+ELF_RELOC(R_390_GOT12,         6)
+ELF_RELOC(R_390_GOT32,         7)
+ELF_RELOC(R_390_PLT32,         8)
+ELF_RELOC(R_390_COPY,          9)
+ELF_RELOC(R_390_GLOB_DAT,     10)
+ELF_RELOC(R_390_JMP_SLOT,     11)
+ELF_RELOC(R_390_RELATIVE,     12)
+ELF_RELOC(R_390_GOTOFF,       13)
+ELF_RELOC(R_390_GOTPC,        14)
+ELF_RELOC(R_390_GOT16,        15)
+ELF_RELOC(R_390_PC16,         16)
+ELF_RELOC(R_390_PC16DBL,      17)
+ELF_RELOC(R_390_PLT16DBL,     18)
+ELF_RELOC(R_390_PC32DBL,      19)
+ELF_RELOC(R_390_PLT32DBL,     20)
+ELF_RELOC(R_390_GOTPCDBL,     21)
+ELF_RELOC(R_390_64,           22)
+ELF_RELOC(R_390_PC64,         23)
+ELF_RELOC(R_390_GOT64,        24)
+ELF_RELOC(R_390_PLT64,        25)
+ELF_RELOC(R_390_GOTENT,       26)
+ELF_RELOC(R_390_GOTOFF16,     27)
+ELF_RELOC(R_390_GOTOFF64,     28)
+ELF_RELOC(R_390_GOTPLT12,     29)
+ELF_RELOC(R_390_GOTPLT16,     30)
+ELF_RELOC(R_390_GOTPLT32,     31)
+ELF_RELOC(R_390_GOTPLT64,     32)
+ELF_RELOC(R_390_GOTPLTENT,    33)
+ELF_RELOC(R_390_PLTOFF16,     34)
+ELF_RELOC(R_390_PLTOFF32,     35)
+ELF_RELOC(R_390_PLTOFF64,     36)
+ELF_RELOC(R_390_TLS_LOAD,     37)
+ELF_RELOC(R_390_TLS_GDCALL,   38)
+ELF_RELOC(R_390_TLS_LDCALL,   39)
+ELF_RELOC(R_390_TLS_GD32,     40)
+ELF_RELOC(R_390_TLS_GD64,     41)
+ELF_RELOC(R_390_TLS_GOTIE12,  42)
+ELF_RELOC(R_390_TLS_GOTIE32,  43)
+ELF_RELOC(R_390_TLS_GOTIE64,  44)
+ELF_RELOC(R_390_TLS_LDM32,    45)
+ELF_RELOC(R_390_TLS_LDM64,    46)
+ELF_RELOC(R_390_TLS_IE32,     47)
+ELF_RELOC(R_390_TLS_IE64,     48)
+ELF_RELOC(R_390_TLS_IEENT,    49)
+ELF_RELOC(R_390_TLS_LE32,     50)
+ELF_RELOC(R_390_TLS_LE64,     51)
+ELF_RELOC(R_390_TLS_LDO32,    52)
+ELF_RELOC(R_390_TLS_LDO64,    53)
+ELF_RELOC(R_390_TLS_DTPMOD,   54)
+ELF_RELOC(R_390_TLS_DTPOFF,   55)
+ELF_RELOC(R_390_TLS_TPOFF,    56)
+ELF_RELOC(R_390_20,           57)
+ELF_RELOC(R_390_GOT20,        58)
+ELF_RELOC(R_390_GOTPLT20,     59)
+ELF_RELOC(R_390_TLS_GOTIE20,  60)
+ELF_RELOC(R_390_IRELATIVE,    61)
diff --git a/include/LIEF/ELF/Relocations/i386.def b/include/LIEF/ELF/Relocations/i386.def
new file mode 100644
index 0000000..a128cd7
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/i386.def
@@ -0,0 +1,47 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+/* TODO: this is just a subset */
+ELF_RELOC(R_386_NONE,           0)
+ELF_RELOC(R_386_32,             1)
+ELF_RELOC(R_386_PC32,           2)
+ELF_RELOC(R_386_GOT32,          3)
+ELF_RELOC(R_386_PLT32,          4)
+ELF_RELOC(R_386_COPY,           5)
+ELF_RELOC(R_386_GLOB_DAT,       6)
+ELF_RELOC(R_386_JUMP_SLOT,      7)
+ELF_RELOC(R_386_RELATIVE,       8)
+ELF_RELOC(R_386_GOTOFF,         9)
+ELF_RELOC(R_386_GOTPC,          10)
+ELF_RELOC(R_386_32PLT,          11)
+ELF_RELOC(R_386_TLS_TPOFF,      14)
+ELF_RELOC(R_386_TLS_IE,         15)
+ELF_RELOC(R_386_TLS_GOTIE,      16)
+ELF_RELOC(R_386_TLS_LE,         17)
+ELF_RELOC(R_386_TLS_GD,         18)
+ELF_RELOC(R_386_TLS_LDM,        19)
+ELF_RELOC(R_386_16,             20)
+ELF_RELOC(R_386_PC16,           21)
+ELF_RELOC(R_386_8,              22)
+ELF_RELOC(R_386_PC8,            23)
+ELF_RELOC(R_386_TLS_GD_32,      24)
+ELF_RELOC(R_386_TLS_GD_PUSH,    25)
+ELF_RELOC(R_386_TLS_GD_CALL,    26)
+ELF_RELOC(R_386_TLS_GD_POP,     27)
+ELF_RELOC(R_386_TLS_LDM_32,     28)
+ELF_RELOC(R_386_TLS_LDM_PUSH,   29)
+ELF_RELOC(R_386_TLS_LDM_CALL,   30)
+ELF_RELOC(R_386_TLS_LDM_POP,    31)
+ELF_RELOC(R_386_TLS_LDO_32,     32)
+ELF_RELOC(R_386_TLS_IE_32,      33)
+ELF_RELOC(R_386_TLS_LE_32,      34)
+ELF_RELOC(R_386_TLS_DTPMOD32,   35)
+ELF_RELOC(R_386_TLS_DTPOFF32,   36)
+ELF_RELOC(R_386_TLS_TPOFF32,    37)
+ELF_RELOC(R_386_TLS_GOTDESC,    39)
+ELF_RELOC(R_386_TLS_DESC_CALL,  40)
+ELF_RELOC(R_386_TLS_DESC,       41)
+ELF_RELOC(R_386_IRELATIVE,      42)
+ELF_RELOC(R_386_NUM,            43)
diff --git a/include/LIEF/ELF/Relocations/x86_64.def b/include/LIEF/ELF/Relocations/x86_64.def
new file mode 100644
index 0000000..9c8d92f
--- /dev/null
+++ b/include/LIEF/ELF/Relocations/x86_64.def
@@ -0,0 +1,44 @@
+
+#ifndef ELF_RELOC
+#error "ELF_RELOC must be defined"
+#endif
+
+ELF_RELOC(R_X86_64_NONE,             0)
+ELF_RELOC(R_X86_64_64,               1)
+ELF_RELOC(R_X86_64_PC32,             2)
+ELF_RELOC(R_X86_64_GOT32,            3)
+ELF_RELOC(R_X86_64_PLT32,            4)
+ELF_RELOC(R_X86_64_COPY,             5)
+ELF_RELOC(R_X86_64_GLOB_DAT,         6)
+ELF_RELOC(R_X86_64_JUMP_SLOT,        7)
+ELF_RELOC(R_X86_64_RELATIVE,         8)
+ELF_RELOC(R_X86_64_GOTPCREL,         9)
+ELF_RELOC(R_X86_64_32,               10)
+ELF_RELOC(R_X86_64_32S,              11)
+ELF_RELOC(R_X86_64_16,               12)
+ELF_RELOC(R_X86_64_PC16,             13)
+ELF_RELOC(R_X86_64_8,                14)
+ELF_RELOC(R_X86_64_PC8,              15)
+ELF_RELOC(R_X86_64_DTPMOD64,         16)
+ELF_RELOC(R_X86_64_DTPOFF64,         17)
+ELF_RELOC(R_X86_64_TPOFF64,          18)
+ELF_RELOC(R_X86_64_TLSGD,            19)
+ELF_RELOC(R_X86_64_TLSLD,            20)
+ELF_RELOC(R_X86_64_DTPOFF32,         21)
+ELF_RELOC(R_X86_64_GOTTPOFF,         22)
+ELF_RELOC(R_X86_64_TPOFF32,          23)
+ELF_RELOC(R_X86_64_PC64,             24)
+ELF_RELOC(R_X86_64_GOTOFF64,         25)
+ELF_RELOC(R_X86_64_GOTPC32,          26)
+ELF_RELOC(R_X86_64_GOT64,            27)
+ELF_RELOC(R_X86_64_GOTPCREL64,       28)
+ELF_RELOC(R_X86_64_GOTPC64,          29)
+ELF_RELOC(R_X86_64_GOTPLT64,         30)
+ELF_RELOC(R_X86_64_PLTOFF64,         31)
+ELF_RELOC(R_X86_64_SIZE32,           32)
+ELF_RELOC(R_X86_64_SIZE64,           33)
+ELF_RELOC(R_X86_64_GOTPC32_TLSDESC,  34)
+ELF_RELOC(R_X86_64_TLSDESC_CALL,     35)
+ELF_RELOC(R_X86_64_TLSDESC,          36)
+ELF_RELOC(R_X86_64_IRELATIVE,        37)
+
diff --git a/include/LIEF/ELF/Section.hpp b/include/LIEF/ELF/Section.hpp
new file mode 100644
index 0000000..e8b99a4
--- /dev/null
+++ b/include/LIEF/ELF/Section.hpp
@@ -0,0 +1,127 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SECTION_H_
+#define LIEF_ELF_SECTION_H_
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <tuple>
+#include <set>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/Section.hpp"
+
+#include "LIEF/ELF/type_traits.hpp"
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/DataHandler/Handler.hpp"
+
+
+namespace LIEF {
+namespace ELF {
+
+class Segment;
+class Parser;
+class Binary;
+
+//! @brief Class wich represent sections
+class DLL_PUBLIC Section : public LIEF::Section {
+
+  friend class Parser;
+  friend class Binary;
+
+ public:
+    Section(uint8_t *data, ELF_CLASS type);
+    Section(const Elf64_Shdr* header);
+    Section(const Elf32_Shdr* header);
+
+    Section(void);
+    ~Section(void);
+
+    Section& operator=(Section other);
+    Section(const Section& other);
+    void swap(Section& other);
+
+    uint32_t                  name_idx(void) const;
+    SECTION_TYPES type(void) const;
+
+    // ============================
+    // LIEF::Section implementation
+    // ============================
+
+    //! @brief Section's content
+    virtual std::vector<uint8_t> content(void) const override;
+
+    //! @brief Set section content
+    virtual void content(const std::vector<uint8_t>& data) override;
+
+    uint64_t flags(void) const;
+
+    bool has_flag(SECTION_FLAGS flag) const;
+    std::set<SECTION_FLAGS> flags_list(void) const;
+    //! @see offset
+    uint64_t file_offset(void) const;
+    uint64_t original_size(void) const;
+    uint64_t alignment(void) const;
+    uint64_t information(void) const;
+    uint64_t entry_size(void) const;
+    uint32_t link(void) const;
+
+
+    void type(SECTION_TYPES type);
+    void flags(uint64_t flags);
+    void add_flag(SECTION_FLAGS flag);
+    void remove_flag(SECTION_FLAGS flag);
+    void clear_flags(void);
+    void file_offset(uint64_t offset);
+    void link(uint32_t link);
+    void information(uint32_t info);
+    void alignment(uint64_t alignment);
+    void entry_size(uint64_t entry_size);
+
+    it_segments       segments(void);
+    it_const_segments segments(void) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Section& rhs) const;
+    bool operator!=(const Section& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Section& section);
+
+  private:
+
+    // virtualAddress_, offset_ and size_ are inherited from LIEF::Section
+    uint32_t              name_idx_;
+    SECTION_TYPES         type_;
+    uint64_t              flags_;
+    uint64_t              original_size_;
+    uint32_t              link_;
+    uint32_t              info_;
+    uint64_t              address_align_;
+    uint64_t              entry_size_;
+    segments_t            segments_;
+    DataHandler::Handler* datahandler_;
+    std::vector<uint8_t>  content_c_;
+
+
+
+};
+
+}
+}
+#endif /* _ELF_SECTION_H_ */
diff --git a/include/LIEF/ELF/Segment.hpp b/include/LIEF/ELF/Segment.hpp
new file mode 100644
index 0000000..35d7180
--- /dev/null
+++ b/include/LIEF/ELF/Segment.hpp
@@ -0,0 +1,107 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SEGMENT_H_
+#define LIEF_ELF_SEGMENT_H_
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <memory>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/type_traits.hpp"
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/Section.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+class Parser;
+class Binary;
+
+//! @brief Class which represent segments
+class DLL_PUBLIC Segment : public Visitable {
+
+  friend class Parser;
+  friend class Section;
+  friend class Binary;
+
+  public:
+    Segment(void);
+    Segment(const std::vector<uint8_t>&   header, ELF_CLASS type);
+    Segment(const std::vector<uint8_t>&   header);
+    Segment(const Elf64_Phdr* header);
+    Segment(const Elf32_Phdr* header);
+    virtual ~Segment(void);
+
+    Segment& operator=(Segment other);
+    Segment(const Segment& other);
+    void swap(Segment& other);
+
+    SEGMENT_TYPES type(void) const;
+    uint32_t flag(void) const;
+    uint64_t file_offset(void) const;
+    uint64_t virtual_address(void) const;
+    uint64_t physical_address(void) const;
+    uint64_t physical_size(void) const;
+    uint64_t virtual_size(void) const;
+    uint64_t alignment(void) const;
+    bool has_flag(SEGMENT_FLAGS flag) const;
+    std::vector<uint8_t> content(void) const;
+
+    void type(SEGMENT_TYPES type);
+    void flag(uint32_t flags);
+    void add_flag(SEGMENT_FLAGS flag);
+    void remove_flag(SEGMENT_FLAGS flag);
+    void clear_flags(void);
+    void file_offset(uint64_t fileOffset);
+    void virtual_address(uint64_t virtualAddress);
+    void physical_address(uint64_t physicalAddress);
+    void physical_size(uint64_t physicalSize);
+    void virtual_size(uint64_t virtualSize);
+    void alignment(uint64_t alignment);
+    void content(const std::vector<uint8_t>& content);
+
+    it_sections       sections(void);
+    it_const_sections sections(void) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Segment& rhs) const;
+    bool operator!=(const Segment& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Segment& segment);
+
+  private:
+    SEGMENT_TYPES         type_;
+    uint32_t              flags_;
+    uint64_t              file_offset_;
+    uint64_t              virtual_address_;
+    uint64_t              physical_address_;
+    uint64_t              size_;
+    uint64_t              virtual_size_;
+    uint64_t              alignment_;
+    sections_t            sections_;
+    DataHandler::Handler* datahandler_;
+    std::vector<uint8_t>  content_c_;
+};
+
+
+}
+}
+#endif /* _ELF_SEGMENT_H_ */
diff --git a/include/LIEF/ELF/Structures.hpp.in b/include/LIEF/ELF/Structures.hpp.in
new file mode 100644
index 0000000..68a6d62
--- /dev/null
+++ b/include/LIEF/ELF/Structures.hpp.in
@@ -0,0 +1,95 @@
+/* From llvm/Support/ELF.h */
+#ifndef LIEF_ELF_STRUCTURES_H_
+#define LIEF_ELF_STRUCTURES_H_
+
+#include <cstring>
+
+#include "LIEF/types.hpp"
+#include "LIEF/ELF/enums.hpp"
+
+namespace LIEF {
+//! @brief Namespace related to the LIEF's ELF module
+namespace ELF {
+
+@LIEF_ELF_STRUCTURES@
+
+static const SECTION_FLAGS section_flags_array[] = {
+  SECTION_FLAGS::SHF_NONE, SECTION_FLAGS::SHF_WRITE, SECTION_FLAGS::SHF_ALLOC, SECTION_FLAGS::SHF_EXECINSTR,
+   SECTION_FLAGS::SHF_MERGE, SECTION_FLAGS::SHF_STRINGS, SECTION_FLAGS::SHF_INFO_LINK,
+   SECTION_FLAGS::SHF_LINK_ORDER, SECTION_FLAGS::SHF_OS_NONCONFORMING, SECTION_FLAGS::SHF_GROUP,
+   SECTION_FLAGS::SHF_TLS, SECTION_FLAGS::SHF_EXCLUDE, SECTION_FLAGS::XCORE_SHF_CP_SECTION,
+   SECTION_FLAGS::XCORE_SHF_DP_SECTION, SECTION_FLAGS::SHF_MASKOS, SECTION_FLAGS::SHF_MASKPROC,
+   SECTION_FLAGS::SHF_HEX_GPREL, SECTION_FLAGS::SHF_MIPS_NODUPES, SECTION_FLAGS::SHF_MIPS_NAMES,
+   SECTION_FLAGS::SHF_MIPS_LOCAL, SECTION_FLAGS::SHF_MIPS_NOSTRIP, SECTION_FLAGS::SHF_MIPS_GPREL,
+   SECTION_FLAGS::SHF_MIPS_MERGE, SECTION_FLAGS::SHF_MIPS_ADDR, SECTION_FLAGS::SHF_MIPS_STRING
+};
+
+
+class ELF32 {
+  public:
+  typedef Elf32_Addr    Elf_Addr;
+  typedef Elf32_Off     Elf_Off;
+  typedef Elf32_Half    Elf_Half;
+  typedef Elf32_Word    Elf_Word;
+  typedef Elf32_Sword   Elf_Sword;
+  // Equivalent
+  typedef Elf32_Addr    Elf_Xword;
+  typedef Elf32_Sword   Elf_Sxword;
+
+  typedef uint32_t      uint;
+
+  typedef Elf32_Phdr    Elf_Phdr;
+  typedef Elf32_Ehdr    Elf_Ehdr;
+  typedef Elf32_Shdr    Elf_Shdr;
+  typedef Elf32_Sym     Elf_Sym;
+  typedef Elf32_Rel     Elf_Rel;
+  typedef Elf32_Rela    Elf_Rela;
+  typedef Elf32_Dyn     Elf_Dyn;
+  typedef Elf32_Verneed Elf_Verneed;
+  typedef Elf32_Vernaux Elf_Vernaux;
+  typedef Elf32_Auxv    Elf_Auxv;
+  typedef Elf32_Verdef  Elf_Verdef;
+  typedef Elf32_Verdaux Elf_Verdaux;
+
+};
+
+
+class ELF64 {
+  public:
+  typedef Elf64_Addr    Elf_Addr;
+  typedef Elf64_Off     Elf_Off;
+  typedef Elf64_Half    Elf_Half;
+  typedef Elf64_Word    Elf_Word;
+  typedef Elf64_Sword   Elf_Sword;
+
+  typedef Elf64_Xword   Elf_Xword;
+  typedef Elf64_Sxword  Elf_Sxword;
+
+  typedef uint64_t      uint;
+
+  typedef Elf64_Phdr    Elf_Phdr;
+  typedef Elf64_Ehdr    Elf_Ehdr;
+  typedef Elf64_Shdr    Elf_Shdr;
+  typedef Elf64_Sym     Elf_Sym;
+  typedef Elf64_Rel     Elf_Rel;
+  typedef Elf64_Rela    Elf_Rela;
+  typedef Elf64_Dyn     Elf_Dyn;
+  typedef Elf64_Verneed Elf_Verneed;
+  typedef Elf64_Vernaux Elf_Vernaux;
+  typedef Elf64_Auxv    Elf_Auxv;
+  typedef Elf64_Verdef  Elf_Verdef;
+  typedef Elf64_Verdaux Elf_Verdaux;
+ };
+
+template<typename T>
+struct Sizes {
+  const static uint32_t ehdr = sizeof(typename T::Elf_Ehdr);
+  const static uint32_t phdr = sizeof(typename T::Elf_Phdr);
+  const static uint32_t shdr = sizeof(typename T::Elf_Shdr);
+  const static uint32_t sym  = sizeof(typename T::Elf_Sym);
+};
+
+
+} /* end namespace ELF */
+} /* end namespace LIEF */
+#endif
diff --git a/include/LIEF/ELF/Symbol.hpp b/include/LIEF/ELF/Symbol.hpp
new file mode 100644
index 0000000..08bab53
--- /dev/null
+++ b/include/LIEF/ELF/Symbol.hpp
@@ -0,0 +1,103 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SYMBOL_H_
+#define LIEF_ELF_SYMBOL_H_
+
+#include <string>
+#include <vector>
+#include <iostream>
+
+#ifdef __unix__
+  #include <cxxabi.h>
+#endif
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/Symbol.hpp"
+
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/Section.hpp"
+#include "LIEF/ELF/SymbolVersion.hpp"
+
+
+namespace LIEF {
+namespace ELF {
+class Parser;
+class Binary;
+
+class DLL_PUBLIC Symbol : public LIEF::Symbol {
+  friend class Parser;
+  friend class Binary;
+
+  public:
+    Symbol(const Elf32_Sym* header);
+    Symbol(const Elf64_Sym* header);
+    Symbol(std::string name,
+        SYMBOL_TYPES type = SYMBOL_TYPES::STT_NOTYPE,
+        SYMBOL_BINDINGS binding = SYMBOL_BINDINGS::STB_WEAK,
+        uint8_t other = 0, uint16_t shndx = 0,
+        uint64_t value = 0, uint64_t size = 0);
+    Symbol(void);
+    virtual ~Symbol(void);
+
+    Symbol& operator=(Symbol other);
+    Symbol(const Symbol& other);
+    void swap(Symbol& other);
+
+    SYMBOL_TYPES         type(void) const;
+    SYMBOL_BINDINGS      binding(void) const;
+    uint8_t              information(void) const;
+    uint8_t              other(void) const;
+    uint16_t             section_idx(void) const;
+    Section&             section(void);
+    uint64_t             value(void) const;
+    uint64_t             size(void) const;
+    uint16_t             shndx(void) const;
+    bool                 has_version(void) const;
+    SymbolVersion&       symbol_version(void);
+    const SymbolVersion& symbol_version(void) const;
+
+    std::string          demangled_name(void) const;
+
+    void type(SYMBOL_TYPES type);
+    void binding(SYMBOL_BINDINGS binding);
+    void other(uint8_t other);
+    void value(uint64_t value);
+    void size(uint64_t size);
+    void information(uint8_t info);
+    void shndx(uint16_t idx);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Symbol& rhs) const;
+    bool operator!=(const Symbol& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Symbol& entry);
+
+  private:
+    SYMBOL_TYPES    type_;
+    SYMBOL_BINDINGS binding_;
+    uint8_t         other_;
+    uint16_t        shndx_;
+    Section*        section_;
+    uint64_t        value_;
+    uint64_t        size_;
+    SymbolVersion*  symbol_version_;
+
+};
+}
+}
+#endif /* _ELF_SYMBOL_H_ */
diff --git a/include/LIEF/ELF/SymbolVersion.hpp b/include/LIEF/ELF/SymbolVersion.hpp
new file mode 100644
index 0000000..992a61a
--- /dev/null
+++ b/include/LIEF/ELF/SymbolVersion.hpp
@@ -0,0 +1,66 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SYMBOL_VERSION_H_
+#define LIEF_ELF_SYMBOL_VERSION_H_
+
+#include <string>
+#include <iostream>
+#include <list>
+#include <memory>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/SymbolVersionAux.hpp"
+
+namespace LIEF {
+namespace ELF {
+class Parser;
+
+//! @brief Class which modelization of an entry defined in ``DT_VERSYM``
+class DLL_PUBLIC SymbolVersion : public Visitable {
+  friend class Parser;
+
+  public:
+    SymbolVersion(uint16_t value);
+    SymbolVersion(void);
+    virtual ~SymbolVersion(void);
+
+    SymbolVersion& operator=(const SymbolVersion& copy);
+    SymbolVersion(const SymbolVersion& copy);
+
+    uint16_t                value(void) const;
+    bool                    has_auxiliary_version(void) const;
+    SymbolVersionAux&       symbol_version_auxiliary(void);
+    const SymbolVersionAux& symbol_version_auxiliary(void) const;
+
+    void value(uint16_t v);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const SymbolVersion& rhs) const;
+    bool operator!=(const SymbolVersion& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const SymbolVersion& symv);
+
+  private:
+    uint16_t          value_;
+    SymbolVersionAux* symbol_aux_;
+};
+}
+}
+#endif
diff --git a/include/LIEF/ELF/SymbolVersionAux.hpp b/include/LIEF/ELF/SymbolVersionAux.hpp
new file mode 100644
index 0000000..9d16c67
--- /dev/null
+++ b/include/LIEF/ELF/SymbolVersionAux.hpp
@@ -0,0 +1,57 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SYMBOL_VERSION_AUX_H_
+#define LIEF_ELF_SYMBOL_VERSION_AUX_H_
+
+#include <string>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+namespace ELF {
+class Parser;
+
+//! @brief Class which modelize an Auxiliary Symbol version
+class DLL_PUBLIC SymbolVersionAux : public Visitable {
+  friend class Parser;
+  public:
+    SymbolVersionAux(const std::string& name);
+    SymbolVersionAux(void);
+    virtual ~SymbolVersionAux(void);
+
+    SymbolVersionAux& operator=(const SymbolVersionAux&);
+    SymbolVersionAux(const SymbolVersionAux&);
+
+    //! @brief Smybol's aux name (e.g. ``GLIBC_2.2.5``)
+    const std::string& name(void) const;
+
+    void name(const std::string& name);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const SymbolVersionAux& rhs) const;
+    bool operator!=(const SymbolVersionAux& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const SymbolVersionAux& symAux);
+
+  protected:
+    std::string name_;
+};
+}
+}
+#endif
diff --git a/include/LIEF/ELF/SymbolVersionAuxRequirement.hpp b/include/LIEF/ELF/SymbolVersionAuxRequirement.hpp
new file mode 100644
index 0000000..f60882a
--- /dev/null
+++ b/include/LIEF/ELF/SymbolVersionAuxRequirement.hpp
@@ -0,0 +1,73 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SYMBOL_VERSION_AUX_REQUIREMENT_H_
+#define LIEF_ELF_SYMBOL_VERSION_AUX_REQUIREMENT_H_
+
+#include <string>
+#include <iostream>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/SymbolVersionAux.hpp"
+
+namespace LIEF {
+namespace ELF {
+class DLL_PUBLIC SymbolVersionAuxRequirement : public SymbolVersionAux {
+  public:
+    using SymbolVersionAux::name;
+
+    SymbolVersionAuxRequirement(const Elf64_Vernaux *header);
+    SymbolVersionAuxRequirement(const Elf32_Vernaux *header);
+    SymbolVersionAuxRequirement(void);
+
+    SymbolVersionAuxRequirement& operator=(const SymbolVersionAuxRequirement&);
+    SymbolVersionAuxRequirement(const SymbolVersionAuxRequirement&);
+
+    virtual ~SymbolVersionAuxRequirement(void);
+
+
+    //! @brief Hash value of the dependency name (use ELF hashing function)
+    uint32_t hash(void) const;
+
+    //! @brief Bitmask of flags
+    uint16_t flags(void) const;
+
+    //! @brief Contains version index unique for the file which is used in the
+    //! version symbol table.  If the highest bit (bit 15) is set this
+    //! is a hidden symbol which cannot be referenced from outside the
+    //! object.
+    uint16_t other(void) const;
+
+    void hash(uint32_t hash);
+    void flags(uint16_t flags);
+    void other(uint16_t other);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const SymbolVersionAuxRequirement& rhs) const;
+    bool operator!=(const SymbolVersionAuxRequirement& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const SymbolVersionAuxRequirement& symAux);
+
+  private:
+    uint32_t hash_;
+    uint16_t flags_;
+    uint16_t other_;
+};
+}
+}
+#endif
diff --git a/include/LIEF/ELF/SymbolVersionDefinition.hpp b/include/LIEF/ELF/SymbolVersionDefinition.hpp
new file mode 100644
index 0000000..928bb91
--- /dev/null
+++ b/include/LIEF/ELF/SymbolVersionDefinition.hpp
@@ -0,0 +1,94 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SYMBOL_VERSION_DEFINITION_H_
+#define LIEF_ELF_SYMBOL_VERSION_DEFINITION_H_
+
+#include <string>
+#include <iostream>
+#include <vector>
+#include <memory>
+#include <functional>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/type_traits.hpp"
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/SymbolVersionAux.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+class Parser;
+
+//! @brief Class which modelization of an entry defined in ``DT_VERDEF``
+//! (or ``.gnu.version_d``)
+class DLL_PUBLIC SymbolVersionDefinition : public Visitable {
+  friend class Parser;
+  public:
+    SymbolVersionDefinition(void);
+    SymbolVersionDefinition(const Elf64_Verdef *header);
+    SymbolVersionDefinition(const Elf32_Verdef *header);
+    virtual ~SymbolVersionDefinition(void);
+
+    SymbolVersionDefinition& operator=(SymbolVersionDefinition other);
+    SymbolVersionDefinition(const SymbolVersionDefinition& other);
+    void swap(SymbolVersionDefinition& other);
+
+
+    //! @brief Version revision
+    //!
+    //! This field should always have the value ``1``. It will be changed
+    //! if the versioning implementation has to be changed in an incompatible way.
+    uint16_t version(void) const;
+
+    //! @brief Version information
+    uint16_t flags(void) const;
+
+    //! @brief Version index
+    //!
+    //! Numeric value used as an index in the LIEF::ELF::SymbolVersion table
+    uint16_t ndx(void) const;
+
+    //! @brief Hash value of the symbol's name (using ELF hash function)
+    uint32_t hash(void) const;
+
+    //! @brief SymbolVersionAux entries
+    it_symbols_version_aux       symbols_aux(void);
+    it_const_symbols_version_aux symbols_aux(void) const;
+
+    void version(uint16_t version);
+    void flags(uint16_t flags);
+    void hash(uint32_t hash);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const SymbolVersionDefinition& rhs) const;
+    bool operator!=(const SymbolVersionDefinition& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const SymbolVersionDefinition& sym);
+
+  private:
+    uint16_t version_;
+    uint16_t flags_;
+    uint16_t ndx_;
+    uint32_t hash_;
+    symbols_version_aux_t symbol_version_aux_;
+};
+}
+}
+#endif
+
diff --git a/include/LIEF/ELF/SymbolVersionRequirement.hpp b/include/LIEF/ELF/SymbolVersionRequirement.hpp
new file mode 100644
index 0000000..7a2f087
--- /dev/null
+++ b/include/LIEF/ELF/SymbolVersionRequirement.hpp
@@ -0,0 +1,83 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_SYMBOL_VERSION_REQUIREMENTS_H_
+#define LIEF_ELF_SYMBOL_VERSION_REQUIREMENTS_H_
+
+#include <string>
+#include <iostream>
+#include <vector>
+#include <memory>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/ELF/type_traits.hpp"
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/SymbolVersionAuxRequirement.hpp"
+
+namespace LIEF {
+namespace ELF {
+class Parser;
+
+//! @brief Class which modelize an entry in ``DT_VERNEED`` or ``.gnu.version_r`` table
+class DLL_PUBLIC SymbolVersionRequirement : public Visitable {
+  friend class Parser;
+
+  public:
+    SymbolVersionRequirement(void);
+    SymbolVersionRequirement(const Elf64_Verneed *header);
+    SymbolVersionRequirement(const Elf32_Verneed *header);
+    virtual ~SymbolVersionRequirement(void);
+
+    SymbolVersionRequirement& operator=(SymbolVersionRequirement other);
+    SymbolVersionRequirement(const SymbolVersionRequirement& other);
+    void swap(SymbolVersionRequirement& other);
+
+    //! @brief Version revision
+    //!
+    //! This field should always have the value ``1``. It will be changed
+    //! if the versioning implementation has to be changed in an incompatible way.
+    uint16_t version(void) const;
+
+    //! @brief Number of associated auxiliary entries
+    uint32_t cnt(void) const;
+
+    //! @brief Auxiliary entries
+    it_symbols_version_aux_requirement       get_auxiliary_symbols(void);
+    it_const_symbols_version_aux_requirement get_auxiliary_symbols(void) const;
+
+    const std::string& name(void) const;
+
+    void version(uint16_t version);
+    void name(const std::string& name);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const SymbolVersionRequirement& rhs) const;
+    bool operator!=(const SymbolVersionRequirement& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const SymbolVersionRequirement& symr);
+
+  private:
+    symbols_version_aux_requirement_t symbol_version_aux_requirement_;
+    uint16_t                          version_;
+    std::string                       name_;
+};
+
+}
+}
+#endif
+
diff --git a/include/LIEF/ELF/enums.hpp.in b/include/LIEF/ELF/enums.hpp.in
new file mode 100644
index 0000000..0dec2f8
--- /dev/null
+++ b/include/LIEF/ELF/enums.hpp.in
@@ -0,0 +1,11 @@
+#ifndef LIEF_ELF_ENUMS_H_
+#define LIEF_ELF_ENUMS_H_
+
+namespace LIEF {
+namespace ELF {
+
+@LIEF_ELF_ENUMS@
+
+}
+}
+#endif
diff --git a/include/LIEF/ELF/enums.inc b/include/LIEF/ELF/enums.inc
new file mode 100644
index 0000000..2f8320d
--- /dev/null
+++ b/include/LIEF/ELF/enums.inc
@@ -0,0 +1,952 @@
+
+/** e_ident size and indices. */
+enum IDENTITY {
+  EI_MAG0       = 0,  /**< File identification index. */
+  EI_MAG1       = 1,  /**< File identification index. */
+  EI_MAG2       = 2,  /**< File identification index. */
+  EI_MAG3       = 3,  /**< File identification index. */
+  EI_CLASS      = 4,  /**< File class. */
+  EI_DATA       = 5,  /**< Data encoding. */
+  EI_VERSION    = 6,  /**< File version. */
+  EI_OSABI      = 7,  /**< OS/ABI identification. */
+  EI_ABIVERSION = 8,  /**< ABI version. */
+  EI_PAD        = 9,  /**< Start of padding bytes. */
+  EI_NIDENT     = 16  /**< Number of bytes in e_ident. */
+};
+
+
+/** Enum associated with *e_type* */
+enum E_TYPE {
+  ET_NONE   = 0,      /**< No file type */
+  ET_REL    = 1,      /**< Relocatable file */
+  ET_EXEC   = 2,      /**< Executable file */
+  ET_DYN    = 3,      /**< Shared object file */
+  ET_CORE   = 4,      /**< Core file */
+  ET_LOPROC = 0xff00, /**< Beginning of processor-specific codes */
+  ET_HIPROC = 0xffff  /**< Processor-specific */
+};
+
+
+/** Versioning */
+enum VERSION {
+  EV_NONE    = 0,
+  EV_CURRENT = 1  /**< Default value */
+};
+
+
+/**
+ * @brief Machine architectures
+ * See current registered ELF machine architectures at:
+ * http://www.uxsglobal.com/developers/gabi/latest/ch4.eheader.html
+ */
+enum ARCH {
+  EM_NONE          = 0,  /**< No machine */
+  EM_M32           = 1,  /**< AT&T WE 32100 */
+  EM_SPARC         = 2,  /**< SPARC */
+  EM_386           = 3,  /**< Intel 386 */
+  EM_68K           = 4,  /**< Motorola 68000 */
+  EM_88K           = 5,  /**< Motorola 88000 */
+  EM_IAMCU         = 6,  /**< Intel MCU */
+  EM_860           = 7,  /**< Intel 80860 */
+  EM_MIPS          = 8,  /**< MIPS R3000 */
+  EM_S370          = 9,  /**< IBM System/370 */
+  EM_MIPS_RS3_LE   = 10, /**< MIPS RS3000 Little-endian */
+  EM_PARISC        = 15, /**< Hewlett-Packard PA-RISC */
+  EM_VPP500        = 17, /**< Fujitsu VPP500 */
+  EM_SPARC32PLUS   = 18, /**< Enhanced instruction set SPARC */
+  EM_960           = 19, /**< Intel 80960 */
+  EM_PPC           = 20, /**< PowerPC */
+  EM_PPC64         = 21, /**< PowerPC64 */
+  EM_S390          = 22, /**< IBM System/390 */
+  EM_SPU           = 23, /**< IBM SPU/SPC */
+  EM_V800          = 36, /**< NEC V800 */
+  EM_FR20          = 37, /**< Fujitsu FR20 */
+  EM_RH32          = 38, /**< TRW RH-32 */
+  EM_RCE           = 39, /**< Motorola RCE */
+  EM_ARM           = 40, /**< ARM */
+  EM_ALPHA         = 41, /**< DEC Alpha */
+  EM_SH            = 42, /**< Hitachi SH */
+  EM_SPARCV9       = 43, /**< SPARC V9 */
+  EM_TRICORE       = 44, /**< Siemens TriCore */
+  EM_ARC           = 45, /**< Argonaut RISC Core */
+  EM_H8_300        = 46, /**< Hitachi H8/300 */
+  EM_H8_300H       = 47, /**< Hitachi H8/300H */
+  EM_H8S           = 48, /**< Hitachi H8S */
+  EM_H8_500        = 49, /**< Hitachi H8/500 */
+  EM_IA_64         = 50, /**< Intel IA-64 processor architecture */
+  EM_MIPS_X        = 51, /**< Stanford MIPS-X */
+  EM_COLDFIRE      = 52, /**< Motorola ColdFire */
+  EM_68HC12        = 53, /**< Motorola M68HC12 */
+  EM_MMA           = 54, /**< Fujitsu MMA Multimedia Accelerator */
+  EM_PCP           = 55, /**< Siemens PCP */
+  EM_NCPU          = 56, /**< Sony nCPU embedded RISC processor */
+  EM_NDR1          = 57, /**< Denso NDR1 microprocessor */
+  EM_STARCORE      = 58, /**< Motorola Star*Core processor */
+  EM_ME16          = 59, /**< Toyota ME16 processor */
+  EM_ST100         = 60, /**< STMicroelectronics ST100 processor */
+  EM_TINYJ         = 61, /**< Advanced Logic Corp. TinyJ embedded processor family */
+  EM_X86_64        = 62, /**< AMD x86-64 architecture */
+  EM_PDSP          = 63, /**< Sony DSP Processor */
+  EM_PDP10         = 64, /**< Digital Equipment Corp. PDP-10 */
+  EM_PDP11         = 65, /**< Digital Equipment Corp. PDP-11 */
+  EM_FX66          = 66, /**< Siemens FX66 microcontroller */
+  EM_ST9PLUS       = 67, /**< STMicroelectronics ST9+ 8/16 bit microcontroller */
+  EM_ST7           = 68, /**< STMicroelectronics ST7 8-bit microcontroller */
+  EM_68HC16        = 69, /**< Motorola MC68HC16 Microcontroller */
+  EM_68HC11        = 70, /**< Motorola MC68HC11 Microcontroller */
+  EM_68HC08        = 71, /**< Motorola MC68HC08 Microcontroller */
+  EM_68HC05        = 72, /**< Motorola MC68HC05 Microcontroller */
+  EM_SVX           = 73, /**< Silicon Graphics SVx */
+  EM_ST19          = 74, /**< STMicroelectronics ST19 8-bit microcontroller */
+  EM_VAX           = 75, /**< Digital VAX */
+  EM_CRIS          = 76, /**< Axis Communications 32-bit embedded processor */
+  EM_JAVELIN       = 77, /**< Infineon Technologies 32-bit embedded processor */
+  EM_FIREPATH      = 78, /**< Element 14 64-bit DSP Processor */
+  EM_ZSP           = 79, /**< LSI Logic 16-bit DSP Processor */
+  EM_MMIX          = 80, /**< Donald Knuth's educational 64-bit processor */
+  EM_HUANY         = 81, /**< Harvard University machine-independent object files */
+  EM_PRISM         = 82, /**< SiTera Prism */
+  EM_AVR           = 83, /**< Atmel AVR 8-bit microcontroller */
+  EM_FR30          = 84, /**< Fujitsu FR30 */
+  EM_D10V          = 85, /**< Mitsubishi D10V */
+  EM_D30V          = 86, /**< Mitsubishi D30V */
+  EM_V850          = 87, /**< NEC v850 */
+  EM_M32R          = 88, /**< Mitsubishi M32R */
+  EM_MN10300       = 89, /**< Matsushita MN10300 */
+  EM_MN10200       = 90, /**< Matsushita MN10200 */
+  EM_PJ            = 91, /**< picoJava */
+  EM_OPENRISC      = 92, /**< OpenRISC 32-bit embedded processor */
+  EM_ARC_COMPACT   = 93, /**< ARC International ARCompact processor (old spelling/synonym: EM_ARC_A5) */
+  EM_XTENSA        = 94,  /**< Tensilica Xtensa Architecture */
+  EM_VIDEOCORE     = 95,  /**< Alphamosaic VideoCore processor */
+  EM_TMM_GPP       = 96,  /**< Thompson Multimedia General Purpose Processor */
+  EM_NS32K         = 97,  /**< National Semiconductor 32000 series */
+  EM_TPC           = 98,  /**< Tenor Network TPC processor */
+  EM_SNP1K         = 99,  /**< Trebia SNP 1000 processor */
+  EM_ST200         = 100, /**< STMicroelectronics (www.st.com) ST200 */
+  EM_IP2K          = 101, /**< Ubicom IP2xxx microcontroller family */
+  EM_MAX           = 102, /**< MAX Processor */
+  EM_CR            = 103, /**< National Semiconductor CompactRISC microprocessor */
+  EM_F2MC16        = 104, /**< Fujitsu F2MC16 */
+  EM_MSP430        = 105, /**< Texas Instruments embedded microcontroller msp430 */
+  EM_BLACKFIN      = 106, /**< Analog Devices Blackfin (DSP) processor */
+  EM_SE_C33        = 107, /**< S1C33 Family of Seiko Epson processors */
+  EM_SEP           = 108, /**< Sharp embedded microprocessor */
+  EM_ARCA          = 109, /**< Arca RISC Microprocessor */
+  EM_UNICORE       = 110, /**< Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */
+  EM_EXCESS        = 111, /**< eXcess: 16/32/64-bit configurable embedded CPU */
+  EM_DXP           = 112, /**< Icera Semiconductor Inc. Deep Execution Processor */
+  EM_ALTERA_NIOS2  = 113, /**< Altera Nios II soft-core processor */
+  EM_CRX           = 114, /**< National Semiconductor CompactRISC CRX */
+  EM_XGATE         = 115, /**< Motorola XGATE embedded processor */
+  EM_C166          = 116, /**< Infineon C16x/XC16x processor */
+  EM_M16C          = 117, /**< Renesas M16C series microprocessors */
+  EM_DSPIC30F      = 118, /**< Microchip Technology dsPIC30F Digital Signal */
+  /* Controller */
+  EM_CE            = 119, /**< Freescale Communication Engine RISC core */
+  EM_M32C          = 120, /**< Renesas M32C series microprocessors */
+  EM_TSK3000       = 131, /**< Altium TSK3000 core */
+  EM_RS08          = 132, /**< Freescale RS08 embedded processor */
+  EM_SHARC         = 133, /**< Analog Devices SHARC family of 32-bit DSP */
+  /* processors */
+  EM_ECOG2         = 134, /**< Cyan Technology eCOG2 microprocessor */
+  EM_SCORE7        = 135, /**< Sunplus S+core7 RISC processor */
+  EM_DSP24         = 136, /**< New Japan Radio (NJR) 24-bit DSP Processor */
+  EM_VIDEOCORE3    = 137, /**< Broadcom VideoCore III processor */
+  EM_LATTICEMICO32 = 138, /**< RISC processor for Lattice FPGA architecture */
+  EM_SE_C17        = 139, /**< Seiko Epson C17 family */
+  EM_TI_C6000      = 140, /**< The Texas Instruments TMS320C6000 DSP family */
+  EM_TI_C2000      = 141, /**< The Texas Instruments TMS320C2000 DSP family */
+  EM_TI_C5500      = 142, /**< The Texas Instruments TMS320C55x DSP family */
+  EM_MMDSP_PLUS    = 160, /**< STMicroelectronics 64bit VLIW Data Signal Processor */
+  EM_CYPRESS_M8C   = 161, /**< Cypress M8C microprocessor */
+  EM_R32C          = 162, /**< Renesas R32C series microprocessors */
+  EM_TRIMEDIA      = 163, /**< NXP Semiconductors TriMedia architecture family */
+  EM_HEXAGON       = 164, /**< Qualcomm Hexagon processor */
+  EM_8051          = 165, /**< Intel 8051 and variants */
+  EM_STXP7X        = 166, /**< STMicroelectronics STxP7x family of configurable */
+  /* and extensible RISC processors */
+  EM_NDS32         = 167, /* Andes Technology compact code size embedded RISC */
+  /* processor family */
+  EM_ECOG1         = 168, /**< Cyan Technology eCOG1X family */
+  EM_ECOG1X        = 168, /**< Cyan Technology eCOG1X family */
+  EM_MAXQ30        = 169, /**< Dallas Semiconductor MAXQ30 Core Micro-controllers */
+  EM_XIMO16        = 170, /**< New Japan Radio (NJR) 16-bit DSP Processor */
+  EM_MANIK         = 171, /**< M2000 Reconfigurable RISC Microprocessor */
+  EM_CRAYNV2       = 172, /**< Cray Inc. NV2 vector architecture */
+  EM_RX            = 173, /**< Renesas RX family */
+  EM_METAG         = 174, /**< Imagination Technologies META processor */
+  /* architecture */
+  EM_MCST_ELBRUS   = 175, /**< MCST Elbrus general purpose hardware architecture */
+  EM_ECOG16        = 176, /**< Cyan Technology eCOG16 family */
+  EM_CR16          = 177, /**< National Semiconductor CompactRISC CR16 16-bit */
+  /* microprocessor */
+  EM_ETPU          = 178, /**< Freescale Extended Time Processing Unit */
+  EM_SLE9X         = 179, /**< Infineon Technologies SLE9X core */
+  EM_L10M          = 180, /**< Intel L10M */
+  EM_K10M          = 181, /**< Intel K10M */
+  EM_AARCH64       = 183, /**< ARM AArch64 */
+  EM_AVR32         = 185, /**< Atmel Corporation 32-bit microprocessor family */
+  EM_STM8          = 186, /**< STMicroeletronics STM8 8-bit microcontroller */
+  EM_TILE64        = 187, /**< Tilera TILE64 multicore architecture family */
+  EM_TILEPRO       = 188, /**< Tilera TILEPro multicore architecture family */
+  EM_CUDA          = 190, /**< NVIDIA CUDA architecture */
+  EM_TILEGX        = 191, /**< Tilera TILE-Gx multicore architecture family */
+  EM_CLOUDSHIELD   = 192, /**< CloudShield architecture family */
+  EM_COREA_1ST     = 193, /**< KIPO-KAIST Core-A 1st generation processor family */
+  EM_COREA_2ND     = 194, /**< KIPO-KAIST Core-A 2nd generation processor family */
+  EM_ARC_COMPACT2  = 195, /**< Synopsys ARCompact V2 */
+  EM_OPEN8         = 196, /**< Open8 8-bit RISC soft processor core */
+  EM_RL78          = 197, /**< Renesas RL78 family */
+  EM_VIDEOCORE5    = 198, /**< Broadcom VideoCore V processor */
+  EM_78KOR         = 199, /**< Renesas 78KOR family */
+  EM_56800EX       = 200, /**< Freescale 56800EX Digital Signal Controller (DSC) */
+  EM_BA1           = 201, /**< Beyond BA1 CPU architecture */
+  EM_BA2           = 202, /**< Beyond BA2 CPU architecture */
+  EM_XCORE         = 203, /**< XMOS xCORE processor family */
+  EM_MCHP_PIC      = 204, /**< Microchip 8-bit PIC(r) family */
+  EM_INTEL205      = 205, /**< Reserved by Intel */
+  EM_INTEL206      = 206, /**< Reserved by Intel */
+  EM_INTEL207      = 207, /**< Reserved by Intel */
+  EM_INTEL208      = 208, /**< Reserved by Intel */
+  EM_INTEL209      = 209, /**< Reserved by Intel */
+  EM_KM32          = 210, /**< KM211 KM32 32-bit processor */
+  EM_KMX32         = 211, /**< KM211 KMX32 32-bit processor */
+  EM_KMX16         = 212, /**< KM211 KMX16 16-bit processor */
+  EM_KMX8          = 213, /**< KM211 KMX8 8-bit processor */
+  EM_KVARC         = 214, /**< KM211 KVARC processor */
+  EM_CDP           = 215, /**< Paneve CDP architecture family */
+  EM_COGE          = 216, /**< Cognitive Smart Memory Processor */
+  EM_COOL          = 217, /**< iCelero CoolEngine */
+  EM_NORC          = 218, /**< Nanoradio Optimized RISC */
+  EM_CSR_KALIMBA   = 219, /**< CSR Kalimba architecture family */
+  EM_AMDGPU        = 224  /**< AMD GPU architecture */
+};
+
+
+/** Object file classes. */
+enum ELF_CLASS {
+  ELFCLASSNONE = 0, /**< Unknown */
+  ELFCLASS32   = 1, /**< 32-bit object file */
+  ELFCLASS64   = 2  /**< 64-bit object file */
+};
+
+/** Object file byte orderings. */
+enum ELF_DATA {
+  ELFDATANONE = 0, /**< Invalid data encoding. */
+  ELFDATA2LSB = 1, /**< Little-endian object file */
+  ELFDATA2MSB = 2  /**< Big-endian object file */
+};
+
+/** OS ABI identification. */
+enum OS_ABI {
+  ELFOSABI_SYSTEMV      = 0,  /**< UNIX System V ABI */
+  ELFOSABI_HPUX         = 1,  /**< HP-UX operating system */
+  ELFOSABI_NETBSD       = 2,  /**< NetBSD */
+  ELFOSABI_GNU          = 3,  /**< GNU/Linux */
+  ELFOSABI_LINUX        = 3,  /**< Historical alias for ELFOSABI_GNU. */
+  ELFOSABI_HURD         = 4,  /**< GNU/Hurd */
+  ELFOSABI_SOLARIS      = 6,  /**< Solaris */
+  ELFOSABI_AIX          = 7,  /**< AIX */
+  ELFOSABI_IRIX         = 8,  /**< IRIX */
+  ELFOSABI_FREEBSD      = 9,  /**< FreeBSD */
+  ELFOSABI_TRU64        = 10, /**< TRU64 UNIX */
+  ELFOSABI_MODESTO      = 11, /**< Novell Modesto */
+  ELFOSABI_OPENBSD      = 12, /**< OpenBSD */
+  ELFOSABI_OPENVMS      = 13, /**< OpenVMS */
+  ELFOSABI_NSK          = 14, /**< Hewlett-Packard Non-Stop Kernel */
+  ELFOSABI_AROS         = 15, /**< AROS */
+  ELFOSABI_FENIXOS      = 16, /**< FenixOS */
+  ELFOSABI_CLOUDABI     = 17, /**< Nuxi CloudABI */
+  ELFOSABI_C6000_ELFABI = 64, /**< Bare-metal TMS320C6000 */
+  ELFOSABI_AMDGPU_HSA   = 64, /**< AMD HSA runtime */
+  ELFOSABI_C6000_LINUX  = 65, /**< Linux TMS320C6000 */
+  ELFOSABI_ARM          = 97, /**< ARM */
+  ELFOSABI_STANDALONE   = 255 /**< Standalone (embedded) application */
+};
+
+/* ELF Relocations */
+
+#define ELF_RELOC(name, value) name = value,
+
+/** x86_64 relocations. */
+enum RELOC_x86_64 {
+   #include "LIEF/ELF/Relocations/x86_64.def"
+};
+
+/** i386 relocations. */
+enum  RELOC_i386 {
+   #include "LIEF/ELF/Relocations/i386.def"
+};
+
+/* ELF Relocation types for PPC32 */
+enum {
+   #include "LIEF/ELF/Relocations/PowerPC.def"
+};
+
+/* Specific e_flags for PPC64 */
+enum {
+  /* e_flags bits specifying ABI: */
+  /* 1 for original ABI using function descriptors, */
+  /* 2 for revised ABI without function descriptors, */
+  /* 0 for unspecified or not using any features affected by the differences. */
+  EF_PPC64_ABI = 3
+};
+
+/* Special values for the st_other field in the symbol table entry for PPC64. */
+enum {
+  STO_PPC64_LOCAL_BIT = 5,
+  STO_PPC64_LOCAL_MASK = (7 << STO_PPC64_LOCAL_BIT)
+};
+
+/* ELF Relocation types for PPC64 */
+enum {
+   #include "LIEF/ELF/Relocations/PowerPC64.def"
+};
+
+/* ELF Relocation types for AArch64 */
+enum {
+   #include "LIEF/ELF/Relocations/AArch64.def"
+};
+
+/* ARM Specific e_flags */
+enum {
+  EF_ARM_SOFT_FLOAT =     0x00000200U,
+  EF_ARM_VFP_FLOAT =      0x00000400U,
+  EF_ARM_EABI_UNKNOWN =   0x00000000U,
+  EF_ARM_EABI_VER1 =      0x01000000U,
+  EF_ARM_EABI_VER2 =      0x02000000U,
+  EF_ARM_EABI_VER3 =      0x03000000U,
+  EF_ARM_EABI_VER4 =      0x04000000U,
+  EF_ARM_EABI_VER5 =      0x05000000U,
+  EF_ARM_EABIMASK =       0xFF000000U
+};
+
+/* ELF Relocation types for ARM */
+enum RELOC_ARM {
+  #include "LIEF/ELF/Relocations/ARM.def"
+};
+
+/* Mips Specific e_flags */
+enum {
+  EF_MIPS_NOREORDER = 0x00000001, /* Don't reorder instructions */
+  EF_MIPS_PIC       = 0x00000002, /* Position independent code */
+  EF_MIPS_CPIC      = 0x00000004, /* Call object with Position independent code */
+  EF_MIPS_ABI2      = 0x00000020, /* File uses N32 ABI */
+  EF_MIPS_32BITMODE = 0x00000100, /* Code compiled for a 64-bit machine */
+  /* in 32-bit mode */
+  EF_MIPS_FP64      = 0x00000200, /* Code compiled for a 32-bit machine */
+  /* but uses 64-bit FP registers */
+  EF_MIPS_NAN2008   = 0x00000400, /* Uses IEE 754-2008 NaN encoding */
+
+  /* ABI flags */
+  EF_MIPS_ABI_O32    = 0x00001000, /* This file follows the first MIPS 32 bit ABI */
+  EF_MIPS_ABI_O64    = 0x00002000, /* O32 ABI extended for 64-bit architecture. */
+  EF_MIPS_ABI_EABI32 = 0x00003000, /* EABI in 32 bit mode. */
+  EF_MIPS_ABI_EABI64 = 0x00004000, /* EABI in 64 bit mode. */
+  EF_MIPS_ABI        = 0x0000f000, /* Mask for selecting EF_MIPS_ABI_ variant. */
+
+  /* MIPS machine variant */
+  EF_MIPS_MACH_3900    = 0x00810000, /* Toshiba R3900 */
+  EF_MIPS_MACH_4010    = 0x00820000, /* LSI R4010 */
+  EF_MIPS_MACH_4100    = 0x00830000, /* NEC VR4100 */
+  EF_MIPS_MACH_4650    = 0x00850000, /* MIPS R4650 */
+  EF_MIPS_MACH_4120    = 0x00870000, /* NEC VR4120 */
+  EF_MIPS_MACH_4111    = 0x00880000, /* NEC VR4111/VR4181 */
+  EF_MIPS_MACH_SB1     = 0x008a0000, /* Broadcom SB-1 */
+  EF_MIPS_MACH_OCTEON  = 0x008b0000, /* Cavium Networks Octeon */
+  EF_MIPS_MACH_XLR     = 0x008c0000, /* RMI Xlr */
+  EF_MIPS_MACH_OCTEON2 = 0x008d0000, /* Cavium Networks Octeon2 */
+  EF_MIPS_MACH_OCTEON3 = 0x008e0000, /* Cavium Networks Octeon3 */
+  EF_MIPS_MACH_5400    = 0x00910000, /* NEC VR5400 */
+  EF_MIPS_MACH_5900    = 0x00920000, /* MIPS R5900 */
+  EF_MIPS_MACH_5500    = 0x00980000, /* NEC VR5500 */
+  EF_MIPS_MACH_9000    = 0x00990000, /* Unknown */
+  EF_MIPS_MACH_LS2E    = 0x00a00000, /* ST Microelectronics Loongson 2E */
+  EF_MIPS_MACH_LS2F    = 0x00a10000, /* ST Microelectronics Loongson 2F */
+  EF_MIPS_MACH_LS3A    = 0x00a20000, /* Loongson 3A */
+  EF_MIPS_MACH         = 0x00ff0000, /* EF_MIPS_MACH_xxx selection mask */
+
+  /* ARCH_ASE */
+  EF_MIPS_MICROMIPS = 0x02000000, /* microMIPS */
+  EF_MIPS_ARCH_ASE_M16 =
+    0x04000000, /* Has Mips-16 ISA extensions */
+  EF_MIPS_ARCH_ASE_MDMX =
+    0x08000000, /* Has MDMX multimedia extensions */
+  EF_MIPS_ARCH_ASE  = 0x0f000000, /* Mask for EF_MIPS_ARCH_ASE_xxx flags */
+
+  /* ARCH */
+  EF_MIPS_ARCH_1    = 0x00000000, /* MIPS1 instruction set */
+  EF_MIPS_ARCH_2    = 0x10000000, /* MIPS2 instruction set */
+  EF_MIPS_ARCH_3    = 0x20000000, /* MIPS3 instruction set */
+  EF_MIPS_ARCH_4    = 0x30000000, /* MIPS4 instruction set */
+  EF_MIPS_ARCH_5    = 0x40000000, /* MIPS5 instruction set */
+  EF_MIPS_ARCH_32   = 0x50000000, /* MIPS32 instruction set per linux not elf.h */
+  EF_MIPS_ARCH_64   = 0x60000000, /* MIPS64 instruction set per linux not elf.h */
+  EF_MIPS_ARCH_32R2 = 0x70000000, /* mips32r2, mips32r3, mips32r5 */
+  EF_MIPS_ARCH_64R2 = 0x80000000, /* mips64r2, mips64r3, mips64r5 */
+  EF_MIPS_ARCH_32R6 = 0x90000000, /* mips32r6 */
+  EF_MIPS_ARCH_64R6 = 0xa0000000, /* mips64r6 */
+  EF_MIPS_ARCH      = 0xf0000000  /* Mask for applying EF_MIPS_ARCH_ variant */
+};
+
+/* ELF Relocation types for Mips */
+enum {
+  #include "LIEF/ELF/Relocations/Mips.def"
+};
+
+/* Special values for the st_other field in the symbol table entry for MIPS. */
+enum {
+  STO_MIPS_OPTIONAL        = 0x04,  /* Symbol whose definition is optional */
+  STO_MIPS_PLT             = 0x08,  /* PLT entry related dynamic table record */
+  STO_MIPS_PIC             = 0x20,  /* PIC func in an object mixes PIC/non-PIC */
+  STO_MIPS_MICROMIPS       = 0x80,  /* MIPS Specific ISA for MicroMips */
+  STO_MIPS_MIPS16          = 0xf0   /* MIPS Specific ISA for Mips16 */
+};
+
+/* .MIPS.options section descriptor kinds */
+enum {
+  ODK_NULL       = 0,   /* Undefined */
+  ODK_REGINFO    = 1,   /* Register usage information */
+  ODK_EXCEPTIONS = 2,   /* Exception processing options */
+  ODK_PAD        = 3,   /* Section padding options */
+  ODK_HWPATCH    = 4,   /* Hardware patches applied */
+  ODK_FILL       = 5,   /* Linker fill value */
+  ODK_TAGS       = 6,   /* Space for tool identification */
+  ODK_HWAND      = 7,   /* Hardware AND patches applied */
+  ODK_HWOR       = 8,   /* Hardware OR patches applied */
+  ODK_GP_GROUP   = 9,   /* GP group to use for text/data sections */
+  ODK_IDENT      = 10,  /* ID information */
+  ODK_PAGESIZE   = 11   /* Page size information */
+};
+
+/* Hexagon Specific e_flags */
+/* Release 5 ABI */
+enum {
+  /* Object processor version flags, bits[3:0] */
+  EF_HEXAGON_MACH_V2      = 0x00000001,   /* Hexagon V2 */
+  EF_HEXAGON_MACH_V3      = 0x00000002,   /* Hexagon V3 */
+  EF_HEXAGON_MACH_V4      = 0x00000003,   /* Hexagon V4 */
+  EF_HEXAGON_MACH_V5      = 0x00000004,   /* Hexagon V5 */
+
+  /* Highest ISA version flags */
+  EF_HEXAGON_ISA_MACH     = 0x00000000,   /* Same as specified in bits[3:0] */
+  /* of e_flags */
+  EF_HEXAGON_ISA_V2       = 0x00000010,   /* Hexagon V2 ISA */
+  EF_HEXAGON_ISA_V3       = 0x00000020,   /* Hexagon V3 ISA */
+  EF_HEXAGON_ISA_V4       = 0x00000030,   /* Hexagon V4 ISA */
+  EF_HEXAGON_ISA_V5       = 0x00000040    /* Hexagon V5 ISA */
+};
+
+/* Hexagon specific Section indexes for common small data */
+/* Release 5 ABI */
+enum {
+  SHN_HEXAGON_SCOMMON     = 0xff00,       /* Other access sizes */
+  SHN_HEXAGON_SCOMMON_1   = 0xff01,       /* Byte-sized access */
+  SHN_HEXAGON_SCOMMON_2   = 0xff02,       /* Half-word-sized access */
+  SHN_HEXAGON_SCOMMON_4   = 0xff03,       /* Word-sized access */
+  SHN_HEXAGON_SCOMMON_8   = 0xff04        /* Double-word-size access */
+};
+
+/* ELF Relocation types for Hexagon */
+enum {
+  #include "LIEF/ELF/Relocations/Hexagon.def"
+};
+
+/* ELF Relocation types for S390/zSeries */
+enum {
+  #include "LIEF/ELF/Relocations/SystemZ.def"
+};
+
+/* ELF Relocation type for Sparc. */
+enum {
+  #include "LIEF/ELF/Relocations/Sparc.def"
+};
+
+#undef ELF_RELOC
+
+
+/** Special section indices. */
+enum SYMBOL_SECTION_INDEX {
+  SHN_UNDEF     = 0,      /**< Undefined, missing, irrelevant, or meaningless */
+  SHN_LORESERVE = 0xff00, /**< Lowest reserved index */
+  SHN_LOPROC    = 0xff00, /**< Lowest processor-specific index */
+  SHN_HIPROC    = 0xff1f, /**< Highest processor-specific index */
+  SHN_LOOS      = 0xff20, /**< Lowest operating system-specific index */
+  SHN_HIOS      = 0xff3f, /**< Highest operating system-specific index */
+  SHN_ABS       = 0xfff1, /**< Symbol has absolute value; does not need relocation */
+  SHN_COMMON    = 0xfff2, /**< FORTRAN COMMON or C external global variables */
+  SHN_XINDEX    = 0xffff, /**< Mark that the index is >= SHN_LORESERVE */
+  SHN_HIRESERVE = 0xffff  /**< Highest reserved index */
+};
+
+/** Section types. */
+enum SECTION_TYPES {
+  SHT_NULL                = 0,  /**< No associated section (inactive entry). */
+  SHT_PROGBITS            = 1,  /**< Program-defined contents. */
+  SHT_SYMTAB              = 2,  /**< Symbol table. */
+  SHT_STRTAB              = 3,  /**< String table. */
+  SHT_RELA                = 4,  /**< Relocation entries; explicit addends. */
+  SHT_HASH                = 5,  /**< Symbol hash table. */
+  SHT_DYNAMIC             = 6,  /**< Information for dynamic linking. */
+  SHT_NOTE                = 7,  /**< Information about the file. */
+  SHT_NOBITS              = 8,  /**< Data occupies no space in the file. */
+  SHT_REL                 = 9,  /**< Relocation entries; no explicit addends. */
+  SHT_SHLIB               = 10, /**< Reserved. */
+  SHT_DYNSYM              = 11, /**< Symbol table. */
+  SHT_INIT_ARRAY          = 14, /**< Pointers to initialization functions. */
+  SHT_FINI_ARRAY          = 15, /**< Pointers to termination functions. */
+  SHT_PREINIT_ARRAY       = 16, /**< Pointers to pre-init functions. */
+  SHT_GROUP               = 17, /**< Section group. */
+  SHT_SYMTAB_SHNDX        = 18, /**< Indices for SHN_XINDEX entries. */
+  SHT_LOOS                = 0x60000000, /**< Lowest operating system-specific type. */
+  SHT_GNU_ATTRIBUTES      = 0x6ffffff5, /**< Object attributes. */
+  SHT_GNU_HASH            = 0x6ffffff6, /**< GNU-style hash table. */
+  SHT_GNU_verdef          = 0x6ffffffd, /**< GNU version definitions. */
+  SHT_GNU_verneed         = 0x6ffffffe, /**< GNU version references. */
+  SHT_GNU_versym          = 0x6fffffff, /**< GNU symbol versions table. */
+  SHT_HIOS                = 0x6fffffff, /**< Highest operating system-specific type. */
+  SHT_LOPROC              = 0x70000000, /**< Lowest processor arch-specific type. */
+  SHT_ARM_EXIDX           = 0x70000001U, /**< Exception Index table */
+  SHT_ARM_PREEMPTMAP      = 0x70000002U, /**< BPABI DLL dynamic linking pre-emption map */
+  SHT_ARM_ATTRIBUTES      = 0x70000003U, /**<  Object file compatibility attributes */
+  SHT_ARM_DEBUGOVERLAY    = 0x70000004U,
+  SHT_ARM_OVERLAYSECTION  = 0x70000005U,
+  SHT_HEX_ORDERED         = 0x70000000, /**< Link editor is to sort the entries in */
+
+  /* this section based on their sizes */
+  SHT_X86_64_UNWIND       = 0x70000001, /**< Unwind information */
+  SHT_MIPS_REGINFO        = 0x70000006, /**< Register usage information */
+  SHT_MIPS_OPTIONS        = 0x7000000d, /**< General options */
+  SHT_MIPS_ABIFLAGS       = 0x7000002a, /**< ABI information. */
+
+  SHT_HIPROC              = 0x7fffffff, /**< Highest processor arch-specific type. */
+  SHT_LOUSER              = 0x80000000, /**< Lowest type reserved for applications. */
+  SHT_HIUSER              = 0xffffffff  /**< Highest type reserved for applications. */
+};
+
+
+
+/** Section flags. */
+enum SECTION_FLAGS {
+  SHF_NONE             = 0x0,
+  SHF_WRITE            = 0x1,         /**< Section data should be writable during execution. */
+  SHF_ALLOC            = 0x2,         /**< Section occupies memory during program execution. */
+  SHF_EXECINSTR        = 0x4,         /**< Section contains executable machine instructions. */
+  SHF_MERGE            = 0x10,        /**< The data in this section may be merged. */
+  SHF_STRINGS          = 0x20,        /**< The data in this section is null-terminated strings. */
+  SHF_INFO_LINK        = 0x40U,       /**< A field in this section holds a section header table index. */
+  SHF_LINK_ORDER       = 0x80U,       /**< Adds special ordering requirements for link editors. */
+  SHF_OS_NONCONFORMING = 0x100U,      /**< This section requires special OS-specific processing to avoid incorrect behavior */
+  SHF_GROUP            = 0x200U,      /**< This section is a member of a section group. */
+  SHF_TLS              = 0x400U,      /**< This section holds Thread-Local Storage. */
+  SHF_EXCLUDE          = 0x80000000U, /**< This section is excluded from the final executable or shared library. */
+  /* Start of target-specific flags. */
+
+  /* XCORE_SHF_CP_SECTION - All sections with the "c" flag are grouped
+   * together by the linker to form the constant pool and the cp register is
+   * set to the start of the constant pool by the boot code.
+   */
+  XCORE_SHF_CP_SECTION = 0x800U,
+
+  /* XCORE_SHF_DP_SECTION - All sections with the "d" flag are grouped
+   * together by the linker to form the data section and the dp register is
+   * set to the start of the section by the boot code.
+   */
+  XCORE_SHF_DP_SECTION = 0x1000U,
+  SHF_MASKOS   = 0x0ff00000,
+  SHF_MASKPROC = 0xf0000000, /**< Bits indicating processor-specific flags. */
+
+  /* If an object file section does not have this flag set, then it may not hold
+   * more than 2GB and can be freely referred to in objects using smaller code
+   * models. Otherwise, only objects using larger code models can refer to them.
+   * For example, a medium code model object can refer to data in a section that
+   * sets this flag besides being able to refer to data in a section that does
+   * not set it; likewise, a small code model object can refer only to code in a
+   * section that does not set this flag.
+   */
+  SHF_X86_64_LARGE = 0x10000000,
+
+  /* All sections with the GPREL flag are grouped into a global data area
+   * for faster accesses.
+   */
+  SHF_HEX_GPREL = 0x10000000,
+
+  /* Section contains text/data which may be replicated in other sections.
+   * Linker must retain only one copy.
+   */
+  SHF_MIPS_NODUPES = 0x01000000,
+
+  SHF_MIPS_NAMES   = 0x02000000, /**< Linker must generate implicit hidden weak names. */
+  SHF_MIPS_LOCAL   = 0x04000000, /**< Section data local to process. */
+  SHF_MIPS_NOSTRIP = 0x08000000, /**< Do not strip this section. */
+  SHF_MIPS_GPREL   = 0x10000000, /**< Section must be part of global data area. */
+  SHF_MIPS_MERGE   = 0x20000000, /**< This section should be merged. */
+  SHF_MIPS_ADDR    = 0x40000000, /**< Address size to be inferred from section entry size. */
+  SHF_MIPS_STRING  = 0x80000000  /**< Section data is string data by default. */
+};
+
+
+/* Section Group Flags */
+enum {
+   GRP_COMDAT   = 0x1,
+   GRP_MASKOS   = 0x0ff00000,
+   GRP_MASKPROC = 0xf0000000
+};
+
+
+/* The size (in bytes) of symbol table entries. */
+enum {
+  SYMENTRY_SIZE32 = 16, /* 32-bit symbol entry size */
+  SYMENTRY_SIZE64 = 24  /* 64-bit symbol entry size. */
+};
+
+/** Symbol bindings. */
+enum SYMBOL_BINDINGS {
+  STB_LOCAL      = 0,  /**< Local symbol, not visible outside obj file containing def */
+  STB_GLOBAL     = 1,  /**< Global symbol, visible to all object files being combined */
+  STB_WEAK       = 2,  /**< Weak symbol, like global but lower-precedence */
+  STB_GNU_UNIQUE = 10,
+  STB_LOOS       = 10, /**< Lowest operating system-specific binding type */
+  STB_HIOS       = 12, /**< Highest operating system-specific binding type */
+  STB_LOPROC     = 13, /**< Lowest processor-specific binding type */
+  STB_HIPROC     = 15  /**< Highest processor-specific binding type */
+};
+
+
+/* Symbol types. */
+enum SYMBOL_TYPES {
+  STT_NOTYPE    = 0,   /* Symbol's type is not specified */
+  STT_OBJECT    = 1,   /* Symbol is a data object (variable, array, etc.) */
+  STT_FUNC      = 2,   /* Symbol is executable code (function, etc.) */
+  STT_SECTION   = 3,   /* Symbol refers to a section */
+  STT_FILE      = 4,   /* Local, absolute symbol that refers to a file */
+  STT_COMMON    = 5,   /* An uninitialized common block */
+  STT_TLS       = 6,   /* Thread local data object */
+  STT_GNU_IFUNC = 10,  /* GNU indirect function */
+  STT_LOOS      = 10,  /* Lowest operating system-specific symbol type */
+  STT_HIOS      = 12,  /* Highest operating system-specific symbol type */
+  STT_LOPROC    = 13,  /* Lowest processor-specific symbol type */
+  STT_HIPROC    = 15   /* Highest processor-specific symbol type */
+};
+
+enum {
+  STV_DEFAULT   = 0,  /* Visibility is specified by binding type */
+  STV_INTERNAL  = 1,  /* Defined by processor supplements */
+  STV_HIDDEN    = 2,  /* Not visible to other components */
+  STV_PROTECTED = 3   /* Visible in other components but not preemptable */
+};
+
+/* Symbol number. */
+enum {
+  STN_UNDEF = 0
+};
+
+/** @brief Special relocation symbols used in the MIPS64 ELF relocation entries */
+enum {
+  RSS_UNDEF = 0, /**< None */
+  RSS_GP = 1,    /**< Value of gp */
+  RSS_GP0 = 2,   /**< Value of gp used to create object being relocated */
+  RSS_LOC = 3    /**< Address of location being relocated */
+};
+
+
+/** @brief Segment types. */
+enum SEGMENT_TYPES {
+  PT_NULL          = 0,          /**< Unused segment. */
+  PT_LOAD          = 1,          /**< Loadable segment. */
+  PT_DYNAMIC       = 2,          /**< Dynamic linking information. */
+  PT_INTERP        = 3,          /**< Interpreter pathname. */
+  PT_NOTE          = 4,          /**< Auxiliary information. */
+  PT_SHLIB         = 5,          /**< Reserved. */
+  PT_PHDR          = 6,          /**< The program header table itself. */
+  PT_TLS           = 7,          /**< The thread-local storage template. */
+  PT_LOOS          = 0x60000000, /**< Lowest operating system-specific pt entry type. */
+  PT_HIOS          = 0x6fffffff, /**< Highest operating system-specific pt entry type. */
+  PT_LOPROC        = 0x70000000, /**< Lowest processor-specific program hdr entry type. */
+  PT_HIPROC        = 0x7fffffff, /**< Highest processor-specific program hdr entry type. */
+
+  /* x86-64 program header types. */
+  /* These all contain stack unwind tables. */
+  PT_GNU_EH_FRAME  = 0x6474e550,
+  PT_SUNW_EH_FRAME = 0x6474e550,
+  PT_SUNW_UNWIND   = 0x6464e550,
+
+  PT_GNU_STACK     = 0x6474e551, /**< Indicates stack executability. */
+  PT_GNU_RELRO     = 0x6474e552, /**< Read-only after relocation. */
+
+  /* ARM program header types. */
+  PT_ARM_ARCHEXT   = 0x70000000, /**< Platform architecture compatibility info */
+
+  /* These all contain stack unwind tables. */
+  PT_ARM_EXIDX     = 0x70000001,
+  PT_ARM_UNWIND    = 0x70000001,
+
+  /* MIPS program header types. */
+  PT_MIPS_REGINFO  = 0x70000000,  /**< Register usage information. */
+  PT_MIPS_RTPROC   = 0x70000001,  /**< Runtime procedure table. */
+  PT_MIPS_OPTIONS  = 0x70000002,  /**< Options segment. */
+  PT_MIPS_ABIFLAGS = 0x70000003   /**< Abiflags segment. */
+};
+
+
+/** Segment flags. */
+enum SEGMENT_FLAGS {
+   PF_X        = 1,         /**< Execute */
+   PF_W        = 2,         /**< Write */
+   PF_R        = 4,         /**< Read */
+   PF_MASKOS   = 0x0ff00000,/**< Bits for operating system-specific semantics. */
+   PF_MASKPROC = 0xf0000000 /**< Bits for processor-specific semantics. */
+};
+
+
+/** Dynamic table entry tags. */
+enum DYNAMIC_TAGS {
+  DT_NULL                       = 0,          /**< Marks end of dynamic array. */
+  DT_NEEDED                     = 1,          /**< String table offset of needed library. */
+  DT_PLTRELSZ                   = 2,          /**< Size of relocation entries in PLT. */
+  DT_PLTGOT                     = 3,          /**< Address associated with linkage table. */
+  DT_HASH                       = 4,          /**< Address of symbolic hash table. */
+  DT_STRTAB                     = 5,          /**< Address of dynamic string table. */
+  DT_SYMTAB                     = 6,          /**< Address of dynamic symbol table. */
+  DT_RELA                       = 7,          /**< Address of relocation table (Rela entries). */
+  DT_RELASZ                     = 8,          /**< Size of Rela relocation table. */
+  DT_RELAENT                    = 9,          /**< Size of a Rela relocation entry. */
+  DT_STRSZ                      = 10,         /**< Total size of the string table. */
+  DT_SYMENT                     = 11,         /**< Size of a symbol table entry. */
+  DT_INIT                       = 12,         /**< Address of initialization function. */
+  DT_FINI                       = 13,         /**< Address of termination function. */
+  DT_SONAME                     = 14,         /**< String table offset of a shared objects name. */
+  DT_RPATH                      = 15,         /**< String table offset of library search path. */
+  DT_SYMBOLIC                   = 16,         /**< Changes symbol resolution algorithm. */
+  DT_REL                        = 17,         /**< Address of relocation table (Rel entries). */
+  DT_RELSZ                      = 18,         /**< Size of Rel relocation table. */
+  DT_RELENT                     = 19,         /**< Size of a Rel relocation entry. */
+  DT_PLTREL                     = 20,         /**< Type of relocation entry used for linking. */
+  DT_DEBUG                      = 21,         /**< Reserved for debugger. */
+  DT_TEXTREL                    = 22,         /**< Relocations exist for non-writable segments. */
+  DT_JMPREL                     = 23,         /**< Address of relocations associated with PLT. */
+  DT_BIND_NOW                   = 24,         /**< Process all relocations before execution. */
+  DT_INIT_ARRAY                 = 25,         /**< Pointer to array of initialization functions. */
+  DT_FINI_ARRAY                 = 26,         /**< Pointer to array of termination functions. */
+  DT_INIT_ARRAYSZ               = 27,         /**< Size of DT_INIT_ARRAY. */
+  DT_FINI_ARRAYSZ               = 28,         /**< Size of DT_FINI_ARRAY. */
+  DT_RUNPATH                    = 29,         /**< String table offset of lib search path. */
+  DT_FLAGS                      = 30,         /**< Flags. */
+  DT_ENCODING                   = 32,         /**< Values from here to DT_LOOS follow the rules for the interpretation of the d_un union. */
+
+  DT_PREINIT_ARRAY              = 32,         /**< Pointer to array of preinit functions. */
+  DT_PREINIT_ARRAYSZ            = 33,         /**< Size of the DT_PREINIT_ARRAY array. */
+
+  DT_LOOS                       = 0x60000000, /**< Start of environment specific tags. */
+  DT_HIOS                       = 0x6FFFFFFF, /**< End of environment specific tags. */
+  DT_LOPROC                     = 0x70000000, /**< Start of processor specific tags. */
+  DT_HIPROC                     = 0x7FFFFFFF, /**< End of processor specific tags. */
+
+  DT_GNU_HASH                   = 0x6FFFFEF5, /**< Reference to the GNU hash table. */
+  DT_RELACOUNT                  = 0x6FFFFFF9, /**< ELF32_Rela count. */
+  DT_RELCOUNT                   = 0x6FFFFFFA, /**< ELF32_Rel count. */
+
+  DT_FLAGS_1                    = 0X6FFFFFFB, /**< Flags_1. */
+  DT_VERSYM                     = 0x6FFFFFF0, /**< The address of .gnu.version section. */
+  DT_VERDEF                     = 0X6FFFFFFC, /**< The address of the version definition table. */
+  DT_VERDEFNUM                  = 0X6FFFFFFD, /**< The number of entries in DT_VERDEF. */
+  DT_VERNEED                    = 0X6FFFFFFE, /**< The address of the version Dependency table. */
+  DT_VERNEEDNUM                 = 0X6FFFFFFF, /**< The number of entries in DT_VERNEED. */
+
+  /* Mips specific dynamic table entry tags. */
+  DT_MIPS_RLD_VERSION           = 0x70000001, /**< 32 bit version number for runtime linker interface. */
+  DT_MIPS_TIME_STAMP            = 0x70000002, /**< Time stamp. */
+  DT_MIPS_ICHECKSUM             = 0x70000003, /**< Checksum of external strings and common sizes. */
+  DT_MIPS_IVERSION              = 0x70000004, /**< Index of version string in string table. */
+  DT_MIPS_FLAGS                 = 0x70000005, /**< 32 bits of flags. */
+  DT_MIPS_BASE_ADDRESS          = 0x70000006, /**< Base address of the segment. */
+  DT_MIPS_MSYM                  = 0x70000007, /**< Address of .msym section. */
+  DT_MIPS_CONFLICT              = 0x70000008, /**< Address of .conflict section. */
+  DT_MIPS_LIBLIST               = 0x70000009, /**< Address of .liblist section. */
+  DT_MIPS_LOCAL_GOTNO           = 0x7000000a, /**< Number of local global offset table entries. */
+  DT_MIPS_CONFLICTNO            = 0x7000000b, /**< Number of entries in the .conflict section. */
+  DT_MIPS_LIBLISTNO             = 0x70000010, /**< Number of entries in the .liblist section. */
+  DT_MIPS_SYMTABNO              = 0x70000011, /**< Number of entries in the .dynsym section. */
+  DT_MIPS_UNREFEXTNO            = 0x70000012, /**< Index of first external dynamic symbol not referenced locally. */
+  DT_MIPS_GOTSYM                = 0x70000013, /**< Index of first dynamic symbol in global offset table. */
+  DT_MIPS_HIPAGENO              = 0x70000014, /**< Number of page table entries in global offset table. */
+  DT_MIPS_RLD_MAP               = 0x70000016, /**< Address of run time loader map, used for debugging. */
+  DT_MIPS_DELTA_CLASS           = 0x70000017, /**< Delta C++ class definition. */
+  DT_MIPS_DELTA_CLASS_NO        = 0x70000018, /**< Number of entries in DT_MIPS_DELTA_CLASS. */
+  DT_MIPS_DELTA_INSTANCE        = 0x70000019, /**< Delta C++ class instances. */
+  DT_MIPS_DELTA_INSTANCE_NO     = 0x7000001A, /**< Number of entries in DT_MIPS_DELTA_INSTANCE. */
+  DT_MIPS_DELTA_RELOC           = 0x7000001B, /**< Delta relocations. */
+  DT_MIPS_DELTA_RELOC_NO        = 0x7000001C, /**< Number of entries in DT_MIPS_DELTA_RELOC. */
+  DT_MIPS_DELTA_SYM             = 0x7000001D, /**< Delta symbols that Delta relocations refer to. */
+  DT_MIPS_DELTA_SYM_NO          = 0x7000001E, /**< Number of entries in DT_MIPS_DELTA_SYM. */
+  DT_MIPS_DELTA_CLASSSYM        = 0x70000020, /**< Delta symbols that hold class declarations. */
+  DT_MIPS_DELTA_CLASSSYM_NO     = 0x70000021, /**< Number of entries in DT_MIPS_DELTA_CLASSSYM. */
+  DT_MIPS_CXX_FLAGS             = 0x70000022, /**< Flags indicating information about C++ flavor. */
+  DT_MIPS_PIXIE_INIT            = 0x70000023, /**< Pixie information. */
+  DT_MIPS_SYMBOL_LIB            = 0x70000024, /**< Address of .MIPS.symlib */
+  DT_MIPS_LOCALPAGE_GOTIDX      = 0x70000025, /**< The GOT index of the first PTE for a segment */
+  DT_MIPS_LOCAL_GOTIDX          = 0x70000026, /**< The GOT index of the first PTE for a local symbol */
+  DT_MIPS_HIDDEN_GOTIDX         = 0x70000027, /**< The GOT index of the first PTE for a hidden symbol */
+  DT_MIPS_PROTECTED_GOTIDX      = 0x70000028, /**< The GOT index of the first PTE for a protected symbol */
+  DT_MIPS_OPTIONS               = 0x70000029, /**< Address of `.MIPS.options'. */
+  DT_MIPS_INTERFACE             = 0x7000002A, /**< Address of `.interface'. */
+  DT_MIPS_DYNSTR_ALIGN          = 0x7000002B, /**< Unknown. */
+  DT_MIPS_INTERFACE_SIZE        = 0x7000002C, /**< Size of the .interface section. */
+  DT_MIPS_RLD_TEXT_RESOLVE_ADDR = 0x7000002D, /**< Size of rld_text_resolve function stored in the GOT. */
+  DT_MIPS_PERF_SUFFIX           = 0x7000002E, /**< Default suffix of DSO to be added by rld on dlopen() calls. */
+  DT_MIPS_COMPACT_SIZE          = 0x7000002F, /**< Size of compact relocation section (O32). */
+  DT_MIPS_GP_VALUE              = 0x70000030, /**< GP value for auxiliary GOTs. */
+  DT_MIPS_AUX_DYNAMIC           = 0x70000031, /**< Address of auxiliary .dynamic. */
+  DT_MIPS_PLTGOT                = 0x70000032, /**< Address of the base of the PLTGOT. */
+  DT_MIPS_RWPLT                 = 0x70000034  /**< Points to the base of a writable PLT. */
+};
+
+/** DT_FLAGS values. */
+enum DYNAMIC_FLAGS {
+  DF_ORIGIN     = 0x01, /**< The object may reference $ORIGIN. */
+  DF_SYMBOLIC   = 0x02, /**< Search the shared lib before searching the exe. */
+  DF_TEXTREL    = 0x04, /**< Relocations may modify a non-writable segment. */
+  DF_BIND_NOW   = 0x08, /**< Process all relocations on load. */
+  DF_STATIC_TLS = 0x10  /**< Reject attempts to load dynamically. */
+};
+
+/* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1 entry. */
+enum {
+  DF_1_NOW        = 0x00000001, /* Set RTLD_NOW for this object. */
+  DF_1_GLOBAL     = 0x00000002, /* Set RTLD_GLOBAL for this object. */
+  DF_1_GROUP      = 0x00000004, /* Set RTLD_GROUP for this object. */
+  DF_1_NODELETE   = 0x00000008, /* Set RTLD_NODELETE for this object. */
+  DF_1_LOADFLTR   = 0x00000010, /* Trigger filtee loading at runtime. */
+  DF_1_INITFIRST  = 0x00000020, /* Set RTLD_INITFIRST for this object. */
+  DF_1_NOOPEN     = 0x00000040, /* Set RTLD_NOOPEN for this object. */
+  DF_1_ORIGIN     = 0x00000080, /* $ORIGIN must be handled. */
+  DF_1_DIRECT     = 0x00000100, /* Direct binding enabled. */
+  DF_1_TRANS      = 0x00000200,
+  DF_1_INTERPOSE  = 0x00000400, /* Object is used to interpose. */
+  DF_1_NODEFLIB   = 0x00000800, /* Ignore default lib search path. */
+  DF_1_NODUMP     = 0x00001000, /* Object can't be dldump'ed. */
+  DF_1_CONFALT    = 0x00002000, /* Configuration alternative created. */
+  DF_1_ENDFILTEE  = 0x00004000, /* Filtee terminates filters search. */
+  DF_1_DISPRELDNE = 0x00008000, /* Disp reloc applied at build time. */
+  DF_1_DISPRELPND = 0x00010000, /* Disp reloc applied at run-time. */
+  DF_1_NODIRECT   = 0x00020000, /* Object has no-direct binding. */
+  DF_1_IGNMULDEF  = 0x00040000,
+  DF_1_NOKSYMS    = 0x00080000,
+  DF_1_NOHDR      = 0x00100000,
+  DF_1_EDITED     = 0x00200000, /* Object is modified after built. */
+  DF_1_NORELOC    = 0x00400000,
+  DF_1_SYMINTPOSE = 0x00800000, /* Object has individual interposers. */
+  DF_1_GLOBAUDIT  = 0x01000000, /* Global auditing required. */
+  DF_1_SINGLETON  = 0x02000000  /* Singleton symbols are used. */
+};
+
+/* DT_MIPS_FLAGS values. */
+enum {
+  RHF_NONE                    = 0x00000000, /* No flags. */
+  RHF_QUICKSTART              = 0x00000001, /* Uses shortcut pointers. */
+  RHF_NOTPOT                  = 0x00000002, /* Hash size is not a power of two. */
+  RHS_NO_LIBRARY_REPLACEMENT  = 0x00000004, /* Ignore LD_LIBRARY_PATH. */
+  RHF_NO_MOVE                 = 0x00000008, /* DSO address may not be relocated. */
+  RHF_SGI_ONLY                = 0x00000010, /* SGI specific features. */
+  RHF_GUARANTEE_INIT          = 0x00000020, /* Guarantee that .init will finish */
+  /* executing before any non-init */
+  /* code in DSO is called. */
+  RHF_DELTA_C_PLUS_PLUS       = 0x00000040, /* Contains Delta C++ code. */
+  RHF_GUARANTEE_START_INIT    = 0x00000080, /* Guarantee that .init will start */
+  /* executing before any non-init */
+  /* code in DSO is called. */
+  RHF_PIXIE                   = 0x00000100, /* Generated by pixie. */
+  RHF_DEFAULT_DELAY_LOAD      = 0x00000200, /* Delay-load DSO by default. */
+  RHF_REQUICKSTART            = 0x00000400, /* Object may be requickstarted */
+  RHF_REQUICKSTARTED          = 0x00000800, /* Object has been requickstarted */
+  RHF_CORD                    = 0x00001000, /* Generated by cord. */
+  RHF_NO_UNRES_UNDEF          = 0x00002000, /* Object contains no unresolved */
+  /* undef symbols. */
+  RHF_RLD_ORDER_SAFE          = 0x00004000  /* Symbol table is in a safe order. */
+};
+
+/** ElfXX_VerDef structure version (GNU versioning) */
+enum {
+  VER_DEF_NONE    = 0,
+  VER_DEF_CURRENT = 1
+};
+
+/** VerDef Flags (ElfXX_VerDef::vd_flags) */
+enum {
+  VER_FLG_BASE = 0x1,
+  VER_FLG_WEAK = 0x2,
+  VER_FLG_INFO = 0x4
+};
+
+/** Special constants for the version table. (SHT_GNU_versym/.gnu.version) */
+enum {
+  VER_NDX_LOCAL  = 0,      /**< Unversioned local symbol */
+  VER_NDX_GLOBAL = 1,      /**< Unversioned global symbol */
+  VERSYM_VERSION = 0x7fff, /**< Version Index mask */
+  VERSYM_HIDDEN  = 0x8000  /**< Hidden bit (non-default version) */
+};
+
+/** ElfXX_VerNeed structure version (GNU versioning) */
+enum {
+  VER_NEED_NONE = 0,
+  VER_NEED_CURRENT = 1
+};
+
+
+enum AUX_TYPE {
+
+   AT_NULL          = 0,     /**< End of vector */
+   AT_IGNORE        = 1,     /**< Entry should be ignored */
+   AT_EXECFD        = 2,     /**< File descriptor of program */
+   AT_PHDR          = 3,     /**< Program headers for program */
+   AT_PHENT         = 4,     /**< Size of program header entry */
+   AT_PHNUM         = 5,     /**< Number of program headers */
+   AT_PAGESZ        = 6,     /**< System page size */
+   AT_BASE          = 7,     /**< Base address of interpreter */
+   AT_FLAGS         = 8,     /**< Flags */
+   AT_ENTRY         = 9,     /**< Entry point of program */
+   AT_NOTELF        = 10,    /**< Program is not ELF */
+   AT_UID           = 11,    /**< Real uid */
+   AT_EUID          = 12,    /**< Effective uid */
+   AT_GID           = 13,    /**< Real gid */
+   AT_EGID          = 14,    /**< Effective gid */
+   AT_CLKTCK        = 17,    /**< Frequency of times() */
+
+   /* Some more special a_type values describing the hardware.  */
+
+   AT_PLATFORM      = 15,    /**< String identifying platform.  */
+   AT_HWCAP         = 16,    /**< Machine dependent hints about processor capabilities.  */
+
+   /* This entry g  ives some information about the FPU initialization
+      performed by   the kernel.  */
+
+   AT_FPUCW         = 18,    /**< Used FPU control word.  */
+
+   /* Cache block sizes. */
+   AT_DCACHEBSIZE   = 19,    /**< Data cache block size.  */
+   AT_ICACHEBSIZE   = 20,    /**< Instruction cache block size.  */
+   AT_UCACHEBSIZE   = 21,    /**< Unified cache block size.  */
+
+   /* A special ig  nored value for PPC, used by the kernel to control the
+      interpretati  on of the AUXV. Must be > 16.  */
+
+   AT_IGNOREPPC     = 22,    /**< Entry should be ignored.  */
+   AT_SECURE        = 23,    /**< Boolean, was exec setuid-like?  */
+   AT_BASE_PLATFORM = 24,    /**< String identifying real platforms.*/
+   AT_RANDOM        = 25,    /**< Address of 16 random bytes.  */
+   AT_EXECFN        = 31,    /**< Filename of executable.  */
+
+   /* Pointer to the global system page used for system calls and other
+      nice things.  */
+   AT_SYSINFO       = 32,
+   AT_SYSINFO_EHDR  = 33,
+
+   /* Shapes of the caches.  Bits 0-3 contains associativity; bits 4-7 contains
+      log2 of line size; mask those to get cache size.  */
+   AT_L1I_CACHESHAPE  = 34,
+   AT_L1D_CACHESHAPE  = 35,
+   AT_L2_CACHESHAPE   = 36,
+   AT_L3_CACHESHAPE   = 37
+};
+
diff --git a/include/LIEF/ELF/structures.inc b/include/LIEF/ELF/structures.inc
new file mode 100644
index 0000000..f0b1c83
--- /dev/null
+++ b/include/LIEF/ELF/structures.inc
@@ -0,0 +1,273 @@
+typedef uint32_t Elf32_Addr;
+typedef uint32_t Elf32_Off;
+typedef uint16_t Elf32_Half;
+typedef uint32_t Elf32_Word;
+typedef int32_t  Elf32_Sword;
+
+typedef uint64_t Elf64_Addr;
+typedef uint64_t Elf64_Off;
+typedef uint16_t Elf64_Half;
+typedef uint32_t Elf64_Word;
+typedef int32_t  Elf64_Sword;
+
+typedef uint64_t Elf64_Xword;
+typedef int64_t  Elf64_Sxword;
+
+
+/** Object file magic string. */
+static const char ElfMagic[] = {'\x7f', 'E', 'L', 'F'};
+
+#pragma pack(push,1)
+
+/** 32-bits ELF header */
+struct Elf32_Ehdr {
+  unsigned char e_ident[EI_NIDENT]; /**< ELF Identification bytes */
+  Elf32_Half    e_type;             /**< Type of file (see ET_* below) */
+  Elf32_Half    e_machine;          /**< Required architecture for this file (see EM_*) */
+  Elf32_Word    e_version;          /**< Must be equal to 1 */
+  Elf32_Addr    e_entry;            /**< Address to jump to in order to start program */
+  Elf32_Off     e_phoff;            /**< Program header table's file offset, in bytes */
+  Elf32_Off     e_shoff;            /**< Section header table's file offset, in bytes */
+  Elf32_Word    e_flags;            /**< Processor-specific flags */
+  Elf32_Half    e_ehsize;           /**< Size of ELF header, in bytes */
+  Elf32_Half    e_phentsize;        /**< Size of an entry in the program header table */
+  Elf32_Half    e_phnum;            /**< Number of entries in the program header table */
+  Elf32_Half    e_shentsize;        /**< Size of an entry in the section header table */
+  Elf32_Half    e_shnum;            /**< Number of entries in the section header table */
+  Elf32_Half    e_shstrndx;         /**< Sect hdr table index of sect name string table */
+};
+
+
+/**
+ * @brief 64-bit ELF header. Fields are the same as for Elf32_Ehdr, but with different
+ * types
+ * @see Elf32_Ehdr
+ */
+struct Elf64_Ehdr {
+  unsigned char e_ident[EI_NIDENT];
+  Elf64_Half    e_type;
+  Elf64_Half    e_machine;
+  Elf64_Word    e_version;
+  Elf64_Addr    e_entry;
+  Elf64_Off     e_phoff;
+  Elf64_Off     e_shoff;
+  Elf64_Word    e_flags;
+  Elf64_Half    e_ehsize;
+  Elf64_Half    e_phentsize;
+  Elf64_Half    e_phnum;
+  Elf64_Half    e_shentsize;
+  Elf64_Half    e_shnum;
+  Elf64_Half    e_shstrndx;
+};
+
+
+/** 32-bits Section header. */
+struct Elf32_Shdr {
+  Elf32_Word sh_name;      /**< Section name (index into string table) */
+  Elf32_Word sh_type;      /**< Section type (SHT_*) */
+  Elf32_Word sh_flags;     /**< Section flags (SHF_*) */
+  Elf32_Addr sh_addr;      /**< Address where section is to be loaded */
+  Elf32_Off  sh_offset;    /**< File offset of section data, in bytes */
+  Elf32_Word sh_size;      /**< Size of section, in bytes */
+  Elf32_Word sh_link;      /**< Section type-specific header table index link */
+  Elf32_Word sh_info;      /**< Section type-specific extra information */
+  Elf32_Word sh_addralign; /**< Section address alignment */
+  Elf32_Word sh_entsize;   /**< Size of records contained within the section */
+};
+
+/**
+ * 64-bits Section header Section header for ELF64 - same fields as Elf32_Shdr, different types.
+ * @see Elf32_Shdr
+ */
+struct Elf64_Shdr {
+  Elf64_Word  sh_name;
+  Elf64_Word  sh_type;
+  Elf64_Xword sh_flags;
+  Elf64_Addr  sh_addr;
+  Elf64_Off   sh_offset;
+  Elf64_Xword sh_size;
+  Elf64_Word  sh_link;
+  Elf64_Word  sh_info;
+  Elf64_Xword sh_addralign;
+  Elf64_Xword sh_entsize;
+};
+
+
+/** Symbol table entries for ELF32. */
+struct Elf32_Sym {
+  Elf32_Word    st_name;  /**< Symbol name (index into string table) */
+  Elf32_Addr    st_value; /**< Value or address associated with the symbol */
+  Elf32_Word    st_size;  /**< Size of the symbol */
+  unsigned char st_info;  /**< Symbol's type and binding attributes */
+  unsigned char st_other; /**< Must be zero; reserved */
+  Elf32_Half    st_shndx; /**< Which section (header table index) it's defined in */
+};
+
+/** Symbol table entries for ELF64. */
+struct Elf64_Sym {
+  Elf64_Word      st_name;  /**< Symbol name (index into string table) */
+  unsigned char   st_info;  /**< Symbol's type and binding attributes */
+  unsigned char   st_other; /**< Must be zero; reserved */
+  Elf64_Half      st_shndx; /**< Which section (header tbl index) it's defined in */
+  Elf64_Addr      st_value; /**< Value or address associated with the symbol */
+  Elf64_Xword     st_size;  /**< Size of the symbol */
+
+};
+
+/** @brief Relocation entry, without explicit addend. */
+struct Elf32_Rel {
+  Elf32_Addr r_offset; /**< Location (file byte offset, or program virtual addr) */
+  Elf32_Word r_info;   /**< Symbol table index and type of relocation to apply */
+};
+
+/** @brief Relocation entry with explicit addend. */
+struct Elf32_Rela {
+  Elf32_Addr  r_offset; /**< Location (file byte offset, or program virtual addr) */
+  Elf32_Word  r_info;   /**< Symbol table index and type of relocation to apply */
+  Elf32_Sword r_addend; /**< Compute value for relocatable field by adding this */
+};
+
+/** @brief Relocation entry, without explicit addend. */
+struct Elf64_Rel {
+  Elf64_Addr r_offset; /**< Location (file byte offset, or program virtual addr). */
+  Elf64_Xword r_info;  /**< Symbol table index and type of relocation to apply. */
+};
+
+/** @brief Relocation entry with explicit addend. */
+struct Elf64_Rela {
+  Elf64_Addr  r_offset;  /**< Location (file byte offset, or program virtual addr). */
+  Elf64_Xword  r_info;   /**< Symbol table index and type of relocation to apply. */
+  Elf64_Sxword r_addend; /**< Compute value for relocatable field by adding this. */
+};
+
+/** Program header for ELF32. */
+struct Elf32_Phdr {
+  Elf32_Word p_type;   /**< Type of segment */
+  Elf32_Off  p_offset; /**< File offset where segment is located, in bytes */
+  Elf32_Addr p_vaddr;  /**< Virtual address of beginning of segment */
+  Elf32_Addr p_paddr;  /**< Physical address of beginning of segment (OS-specific) */
+  Elf32_Word p_filesz; /**< Num. of bytes in file image of segment (may be zero) */
+  Elf32_Word p_memsz;  /**< Num. of bytes in mem image of segment (may be zero) */
+  Elf32_Word p_flags;  /**< Segment flags */
+  Elf32_Word p_align;  /**< Segment alignment constraint */
+};
+
+/** Program header for ELF64. */
+struct Elf64_Phdr {
+  Elf64_Word   p_type;   /**< Type of segment */
+  Elf64_Word   p_flags;  /**< Segment flags */
+  Elf64_Off    p_offset; /**< File offset where segment is located, in bytes */
+  Elf64_Addr   p_vaddr;  /**< Virtual address of beginning of segment */
+  Elf64_Addr   p_paddr;  /**< Physical addr of beginning of segment (OS-specific) */
+  Elf64_Xword  p_filesz; /**< Num. of bytes in file image of segment (may be zero) */
+  Elf64_Xword  p_memsz;  /**< Num. of bytes in mem image of segment (may be zero) */
+  Elf64_Xword  p_align;  /**< Segment alignment constraint */
+};
+
+
+/** Dynamic table entry for ELF32. */
+struct Elf32_Dyn
+{
+  Elf32_Sword d_tag;          /**< Type of dynamic table entry. */
+  union
+  {
+    Elf32_Word d_val;         /**< Integer value of entry. */
+    Elf32_Addr d_ptr;         /**< Pointer value of entry. */
+  } d_un;
+};
+
+/** Dynamic table entry for ELF64. */
+struct Elf64_Dyn
+{
+  Elf64_Sxword d_tag;         /**< Type of dynamic table entry. */
+  union
+  {
+    Elf64_Xword d_val;        /**< Integer value of entry. */
+    Elf64_Addr  d_ptr;        /**< Pointer value of entry. */
+  } d_un;
+};
+
+
+struct Elf32_Verneed {
+  Elf32_Half    vn_version; /**< Version of structure */
+  Elf32_Half    vn_cnt;     /**< Number of associated aux entry */
+  Elf32_Word    vn_file;    /**< Offset of filename for this dependency */
+  Elf32_Word    vn_aux;     /**< Offset in bytes to vernaux array */
+  Elf32_Word    vn_next;    /**< Offset in bytes to next verneed */
+} ;
+
+struct Elf64_Verneed {
+  Elf64_Half    vn_version; /**< Version of structure */
+  Elf64_Half    vn_cnt;     /**< Number of associated aux entry */
+  Elf64_Word    vn_file;    /**< Offset of filename for this dependency */
+  Elf64_Word    vn_aux;     /**< Offset in bytes to vernaux array */
+  Elf64_Word    vn_next;    /**< Offset in bytes to next verneed */
+};
+
+struct Elf64_Vernaux {
+  Elf64_Word    vna_hash;
+  Elf64_Half    vna_flags;
+  Elf64_Half    vna_other;
+  Elf64_Word    vna_name;
+  Elf64_Word    vna_next;
+};
+
+struct Elf32_Vernaux {
+  Elf32_Word    vna_hash;
+  Elf32_Half    vna_flags;
+  Elf32_Half    vna_other;
+  Elf32_Word    vna_name;
+  Elf32_Word    vna_next;
+};
+
+struct Elf32_Auxv {
+ uint32_t a_type;     /**< Entry type */
+ union {
+     uint32_t a_val;  /**< Integer value */
+   } a_un;
+};
+
+struct Elf64_Auxv {
+ uint64_t a_type;     /**< Entry type */
+ union {
+     uint64_t a_val;  /**< Integer value */
+   } a_un;
+};
+
+/** Structure for .gnu.version_d (64 bits) */
+struct Elf64_Verdef {
+  Elf64_Half	vd_version;	/**< Version revision */
+  Elf64_Half	vd_flags;		/**< Version information */
+  Elf64_Half	vd_ndx;			/**< Version Index */
+  Elf64_Half	vd_cnt;			/**< Number of associated aux entries */
+  Elf64_Word	vd_hash;		/**< Version name hash value */
+  Elf64_Word	vd_aux;			/**< Offset in bytes to verdaux array */
+  Elf64_Word	vd_next;		/**< Offset in bytes to next verdef entry */
+};
+
+/** Structure for .gnu.version_d (32 bits) */
+struct Elf32_Verdef {
+  Elf32_Half	vd_version;	/**< Version revision */
+  Elf32_Half	vd_flags;		/**< Version information */
+  Elf32_Half	vd_ndx;			/**< Version Index */
+  Elf32_Half	vd_cnt;			/**< Number of associated aux entries */
+  Elf32_Word	vd_hash;		/**< Version name hash value */
+  Elf32_Word	vd_aux;			/**< Offset in bytes to verdaux array */
+  Elf32_Word	vd_next;		/**< Offset in bytes to next verdef entry */
+};
+
+struct Elf64_Verdaux
+{
+  Elf64_Word	vda_name;		/**< Version or dependency names */
+  Elf64_Word	vda_next;		/**< Offset in bytes to next verdaux entry */
+};
+
+struct Elf32_Verdaux
+{
+  Elf32_Word	vda_name;		/**< Version or dependency names */
+  Elf32_Word	vda_next;		/**< Offset in bytes to next verdaux entry */
+};
+
+
+#pragma pack(pop)
+
diff --git a/include/LIEF/ELF/type_traits.hpp b/include/LIEF/ELF/type_traits.hpp
new file mode 100644
index 0000000..16ff2c6
--- /dev/null
+++ b/include/LIEF/ELF/type_traits.hpp
@@ -0,0 +1,83 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_TYPE_TRAITS_H_
+#define LIEF_ELF_TYPE_TRAITS_H_
+#include <vector>
+#include "LIEF/iterators.hpp"
+
+namespace LIEF {
+namespace ELF {
+class Section;
+class Segment;
+class DynamicEntry;
+class Symbol;
+class Relocation;
+class Section;
+class SymbolVersion;
+class SymbolVersionRequirement;
+class SymbolVersionDefinition;
+class SymbolVersionAux;
+class SymbolVersionAuxRequirement;
+
+using sections_t                               = std::vector<Section*>;
+using it_sections                              = ref_iterator<sections_t&>;
+using it_const_sections                        = const_ref_iterator<const sections_t&>;
+
+using segments_t                               = std::vector<Segment*>;
+using it_segments                              = ref_iterator<segments_t&>;
+using it_const_segments                        = const_ref_iterator<const segments_t&>;
+
+using dynamic_entries_t                        = std::vector<DynamicEntry*>;
+using it_dynamic_entries                       = ref_iterator<dynamic_entries_t&>;
+using it_const_dynamic_entries                 = const_ref_iterator<const dynamic_entries_t&>;
+
+using symbols_t                                = std::vector<Symbol*>;
+using it_symbols                               = ref_iterator<symbols_t&>;
+using it_const_symbols                         = const_ref_iterator<const symbols_t&>;
+
+using relocations_t                            = std::vector<Relocation*>;
+using it_relocations                           = ref_iterator<relocations_t&>;
+using it_const_relocations                     = const_ref_iterator<const relocations_t&>;
+
+using symbols_version_t                        = std::vector<SymbolVersion*>;
+using it_symbols_version                       = ref_iterator<symbols_version_t&>;
+using it_const_symbols_version                 = const_ref_iterator<const symbols_version_t&>;
+
+using symbols_version_requirement_t            = std::vector<SymbolVersionRequirement*>;
+using it_symbols_version_requirement           = ref_iterator<symbols_version_requirement_t&>;
+using it_const_symbols_version_requirement     = const_ref_iterator<const symbols_version_requirement_t&>;
+
+using symbols_version_definition_t             = std::vector<SymbolVersionDefinition*>;
+using it_symbols_version_definition            = ref_iterator<symbols_version_definition_t&>;
+using it_const_symbols_version_definition      = const_ref_iterator<const symbols_version_definition_t&>;
+
+using it_exported_symbols                      = filter_iterator<symbols_t>;
+using it_const_exported_symbols                = const_filter_iterator<symbols_t>;
+
+using it_imported_symbols                      = filter_iterator<symbols_t>;
+using it_const_imported_symbols                = const_filter_iterator<symbols_t>;
+
+using symbols_version_aux_t                    = std::vector<SymbolVersionAux*>;
+using it_symbols_version_aux                   = ref_iterator<symbols_version_aux_t&>;
+using it_const_symbols_version_aux             = const_ref_iterator<const symbols_version_aux_t&>;
+
+using symbols_version_aux_requirement_t        = std::vector<SymbolVersionAuxRequirement*>;
+using it_symbols_version_aux_requirement       = ref_iterator<symbols_version_aux_requirement_t&>;
+using it_const_symbols_version_aux_requirement = const_ref_iterator<const symbols_version_aux_requirement_t&>;
+}
+}
+
+#endif
diff --git a/include/LIEF/ELF/utils.hpp b/include/LIEF/ELF/utils.hpp
new file mode 100644
index 0000000..66cecf0
--- /dev/null
+++ b/include/LIEF/ELF/utils.hpp
@@ -0,0 +1,37 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_UTILS_H_
+#define LIEF_ELF_UTILS_H_
+
+#include <string>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+namespace ELF {
+
+//! @brief Check if the given file is an ELF one.
+DLL_PUBLIC bool is_elf(const std::string& file);
+DLL_PUBLIC unsigned long hash32(const char* name);
+DLL_PUBLIC unsigned long hash64(const char* name);
+DLL_PUBLIC uint32_t dl_new_hash(const char* name);
+
+}
+}
+
+
+#endif
diff --git a/include/LIEF/LIEF.hpp b/include/LIEF/LIEF.hpp
new file mode 100644
index 0000000..36de202
--- /dev/null
+++ b/include/LIEF/LIEF.hpp
@@ -0,0 +1,25 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MAIN_HEADER_H_
+#define LIEF_MAIN_HEADER_H_
+
+#include <LIEF/Abstract/Abstract.hpp>
+#include <LIEF/ELF.hpp>
+#include <LIEF/PE.hpp>
+#include <LIEF/MachO.hpp>
+
+
+#endif
diff --git a/include/LIEF/MachO.hpp b/include/LIEF/MachO.hpp
new file mode 100644
index 0000000..887beb5
--- /dev/null
+++ b/include/LIEF/MachO.hpp
@@ -0,0 +1,24 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_H_
+#define LIEF_MACHO_H_
+
+#include "LIEF/MachO/Parser.hpp"
+#include "LIEF/MachO/Builder.hpp"
+#include "LIEF/MachO/Binary.hpp"
+#include "LIEF/MachO/utils.hpp"
+
+#endif
diff --git a/include/LIEF/MachO/Binary.hpp b/include/LIEF/MachO/Binary.hpp
new file mode 100644
index 0000000..b3b3554
--- /dev/null
+++ b/include/LIEF/MachO/Binary.hpp
@@ -0,0 +1,183 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_BINARY_H_
+#define LIEF_MACHO_BINARY_H_
+
+#include <vector>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/Binary.hpp"
+
+#include "LIEF/MachO/type_traits.hpp"
+#include "LIEF/MachO/Structures.hpp"
+#include "LIEF/MachO/Header.hpp"
+#include "LIEF/MachO/LoadCommand.hpp"
+#include "LIEF/MachO/SegmentCommand.hpp"
+#include "LIEF/MachO/DylibCommand.hpp"
+#include "LIEF/MachO/DylinkerCommand.hpp"
+#include "LIEF/MachO/UUIDCommand.hpp"
+#include "LIEF/MachO/Symbol.hpp"
+#include "LIEF/MachO/SymbolCommand.hpp"
+#include "LIEF/MachO/MainCommand.hpp"
+#include "LIEF/MachO/DynamicSymbolCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+class BinaryParser;
+class Builder;
+
+//! @brief Class which represent a MachO binary
+class DLL_PUBLIC Binary : public LIEF::Binary  {
+
+  friend class BinaryParser;
+  friend class Builder;
+
+  public:
+    Binary(const Binary&) = delete;
+
+    //! @brief Return a reference to MachO::Header
+    Header&       header(void);
+    const Header& header(void) const;
+
+    //! @brief Return binary's @link MachO::LoadCommand load commands @endlink
+    it_commands       commands(void);
+    it_const_commands commands(void) const;
+
+    //! @brief Return binary's @link MachO::Symbol symbols @endlink
+    it_symbols       symbols(void);
+    it_const_symbols symbols(void) const;
+
+    static bool                 is_exported(const Symbol& symbol);
+
+    //! @brief Return binary's exported symbols
+    it_exported_symbols       get_exported_symbols(void);
+    it_const_exported_symbols get_exported_symbols(void) const;
+
+    //! @brief Check if the given symbol is a imported one
+    static bool is_imported(const Symbol& symbol);
+
+    //! @brief Return binary's imported symbols
+    it_imported_symbols       get_imported_symbols(void);
+    it_const_imported_symbols get_imported_symbols(void) const;
+
+    //! @brief Return binary imported libraries (MachO::DylibCommand)
+    it_libraries       libraries(void);
+    it_const_libraries libraries(void) const;
+
+    //! @brief Return binary's @link MachO::SegmentCommand segments @endlink
+    it_segments       segments(void);
+    it_const_segments segments(void) const;
+
+    //! @brief Return binary's @link MachO::Section sections @endlink
+    it_sections       sections(void);
+    it_const_sections sections(void) const;
+
+    //! @brief Reconstruct the binary object and write it in `filename`
+    //! @param filename Path to write the reconstructed binary
+    void write(const std::string& filename);
+
+    //! @brief Reconstruct the binary object and return his content as bytes
+    std::vector<uint8_t> raw(void);
+
+    //! @brief insert load_command
+    LoadCommand& insert_command(const LoadCommand& command);
+
+    //! @brief Remove ``PIE`` flag
+    bool disable_pie(void);
+
+    //! @brief Return binary's imagebase
+    uint64_t imagebase(void) const;
+
+    //! @brief Return binary's loader (e.g. ``/usr/lib/dyld``)
+    const std::string& get_loader(void) const;
+
+    // ======
+    // Helper
+    // ======
+
+    //! @brief Return binary's @link MachO::Section section @endlink
+    //! which holds the offset
+    Section&       section_from_offset(uint64_t offset);
+    const Section& section_from_offset(uint64_t offset) const;
+
+    //! @brief Convert a virtual address to an offset in the file
+    uint64_t virtual_address_to_offset(uint64_t virtualAddress) const;
+
+
+    // @brief Return binary's @link MachO::SegmentCommand segment command
+    // which hold the offset
+    SegmentCommand&       segment_from_offset(uint64_t offset);
+    const SegmentCommand& segment_from_offset(uint64_t offset) const;
+
+
+    // @brief Return binary's @link MachO::SegmentCommand segment command
+    // which hold the virtual address
+    SegmentCommand&       segment_from_virtual_address(uint64_t virtual_address);
+    const SegmentCommand& segment_from_virtual_address(uint64_t virtual_address) const;
+
+    //! @brief Method so that the ``visitor`` can visit us
+    virtual void accept(LIEF::Visitor& visitor) const override;
+
+    virtual ~Binary(void);
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+    // LIEF Interface
+    // ==============
+
+    //! @brief Patch the content at virtual address @p address with @p patch_value
+    //!
+    //! @param[in] address Address to patch
+    //! @param[in] patch_value Patch to apply
+    virtual void patch_address(uint64_t address, const std::vector<uint8_t>& patch_value) override;
+
+
+    //! @brief Patch the address with the given value
+    //!
+    //! @param[in] address Address to patch
+    //! @param[in] patch_value Patch to apply
+    //! @param[in] size Size of the value in **bytes** (1, 2, ... 8)
+    virtual void patch_address(uint64_t address, uint64_t patch_value, size_t size = sizeof(uint64_t)) override;
+
+    //! @brief Return the content located at virtual address
+    virtual std::vector<uint8_t> get_content_from_virtual_address(uint64_t virtual_address, uint64_t size) const override;
+
+    virtual uint64_t entrypoint(void) const override;
+
+
+  private:
+    //! @brief Default constructor
+    Binary(void);
+
+    virtual LIEF::Header              get_abstract_header(void) const override;
+    virtual LIEF::sections_t          get_abstract_sections(void) override;
+    virtual LIEF::symbols_t           get_abstract_symbols(void) override;
+    virtual std::vector<std::string>  get_abstract_exported_functions(void) const override;
+    virtual std::vector<std::string>  get_abstract_imported_functions(void) const override;
+    virtual std::vector<std::string>  get_abstract_imported_libraries(void) const override;
+
+    bool       is64_;
+    Header     header_;
+    commands_t commands_;
+    symbols_t  symbols_;
+};
+
+} // namespace MachO
+} // namespace LIEF
+#endif
diff --git a/include/LIEF/MachO/BinaryParser.hpp b/include/LIEF/MachO/BinaryParser.hpp
new file mode 100644
index 0000000..7e80eb5
--- /dev/null
+++ b/include/LIEF/MachO/BinaryParser.hpp
@@ -0,0 +1,76 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_BINARY_PARSER_H_
+#define LIEF_MACHO_BINARY_PARSER_H_
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+#include "LIEF/BinaryStream/VectorStream.hpp"
+
+#include "LIEF/Abstract/Parser.hpp"
+
+#include "LIEF/MachO/Structures.hpp"
+#include "LIEF/MachO/Binary.hpp"
+#include "LIEF/MachO/LoadCommand.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+class Parser;
+
+//! @brief Class used to parse **single** binary (i.e. **not** FAT)
+//! @see MachO::Parser
+class DLL_PUBLIC BinaryParser : public LIEF::Parser {
+
+  friend class MachO::Parser;
+
+  public:
+    BinaryParser(const std::string& file);
+    BinaryParser(const std::vector<uint8_t>& data);
+    BinaryParser(void);
+
+    BinaryParser& operator=(const BinaryParser& copy) = delete;
+    BinaryParser(const BinaryParser& copy) = delete;
+
+    ~BinaryParser(void);
+
+    Binary* get_binary(void);
+
+  private:
+    BinaryParser(std::unique_ptr<VectorStream>&& stream);
+
+    void parse(void);
+
+    template<class MACHO_T>
+    void parse_header(void);
+
+    template<class MACHO_T>
+    void parse_load_commands(void);
+
+    std::unique_ptr<VectorStream> stream_;
+    Binary*                       binary_ ;
+    MACHO_TYPES                   type_;
+    bool                          is64_;
+};
+
+
+} // namespace MachO
+} // namespace LIEF
+#endif
diff --git a/include/LIEF/MachO/Builder.hpp b/include/LIEF/MachO/Builder.hpp
new file mode 100644
index 0000000..1fd5907
--- /dev/null
+++ b/include/LIEF/MachO/Builder.hpp
@@ -0,0 +1,66 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_BUIDLER_H_
+#define LIEF_MACHO_BUIDLER_H_
+
+#include <algorithm>
+#include <vector>
+#include <vector>
+#include <memory>
+
+#include "LIEF/visibility.h"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/MachO/Binary.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+
+class DLL_PUBLIC Builder {
+  public:
+    Builder(Binary *binary);
+    Builder(std::vector<Binary*> binaries);
+
+    Builder(void) = delete;
+    ~Builder(void);
+
+    const std::vector<uint8_t>& get_build(void);
+    void write(const std::string& filename) const;
+    static void write(Binary *binary, const std::string& filename);
+
+  private:
+    void build(void);
+    void build_header(void);
+    void build_load_commands(void);
+
+    template <typename T>
+    void build_segments(void);
+
+    void build_uuid(void);
+
+    template <typename T>
+    void build_symbols(void);
+
+    std::vector<Binary*> binaries_;
+    Binary*              binary_;
+    std::vector<uint8_t> rawBinary_;
+};
+
+} // namespace MachO
+} // namespace LIEF
+#endif
diff --git a/include/LIEF/MachO/DylibCommand.hpp b/include/LIEF/MachO/DylibCommand.hpp
new file mode 100644
index 0000000..81c0057
--- /dev/null
+++ b/include/LIEF/MachO/DylibCommand.hpp
@@ -0,0 +1,67 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_DYLIB_COMMAND_H_
+#define LIEF_MACHO_DYLIB_COMMAND_H_
+
+#include <iostream>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/MachO/LoadCommand.hpp"
+
+
+namespace LIEF {
+namespace MachO {
+class DLL_PUBLIC DylibCommand : public LoadCommand {
+  public:
+    DylibCommand(void);
+    DylibCommand(const dylib_command *cmd);
+
+    DylibCommand& operator=(const DylibCommand& copy);
+    DylibCommand(const DylibCommand& copy);
+
+    virtual ~DylibCommand(void);
+
+    const std::string& name(void) const;
+    uint32_t timestamp(void) const;
+    uint32_t current_version(void) const;
+    uint32_t compatibility_version(void) const;
+
+    void name(const std::string& name);
+    void timestamp(uint32_t timestamp);
+    void current_version(uint32_t currentVersion);
+    void compatibility_version(uint32_t compatibilityVersion);
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+    bool operator==(const DylibCommand& rhs) const;
+    bool operator!=(const DylibCommand& rhs) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+
+  private:
+    std::string name_;
+    uint32_t timestamp_;
+    uint32_t currentVersion_;
+    uint32_t compatibilityVersion_;
+};
+
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/DylinkerCommand.hpp b/include/LIEF/MachO/DylinkerCommand.hpp
new file mode 100644
index 0000000..687f39d
--- /dev/null
+++ b/include/LIEF/MachO/DylinkerCommand.hpp
@@ -0,0 +1,57 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_DYLINKER_COMMAND_H_
+#define LIEF_MACHO_DYLINKER_COMMAND_H_
+
+#include <iostream>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/MachO/LoadCommand.hpp"
+
+
+namespace LIEF {
+namespace MachO {
+class DLL_PUBLIC DylinkerCommand : public LoadCommand {
+  public:
+    DylinkerCommand(void);
+    DylinkerCommand(const dylinker_command *cmd);
+
+    DylinkerCommand& operator=(const DylinkerCommand& copy);
+    DylinkerCommand(const DylinkerCommand& copy);
+
+    virtual ~DylinkerCommand(void);
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+    const std::string& name(void) const;
+
+    void name(const std::string& name);
+
+    bool operator==(const DylinkerCommand& rhs) const;
+    bool operator!=(const DylinkerCommand& rhs) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+
+  private:
+    std::string name_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/DynamicSymbolCommand.hpp b/include/LIEF/MachO/DynamicSymbolCommand.hpp
new file mode 100644
index 0000000..55ad616
--- /dev/null
+++ b/include/LIEF/MachO/DynamicSymbolCommand.hpp
@@ -0,0 +1,116 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_DYNAMIC_SYMBOL_COMMAND_H_
+#define LIEF_MACHO_DYNAMIC_SYMBOL_COMMAND_H_
+#include <string>
+#include <vector>
+#include <iostream>
+#include <array>
+
+#include "LIEF/visibility.h"
+#include "LIEF/types.hpp"
+
+#include "LIEF/MachO/LoadCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+class DLL_PUBLIC DynamicSymbolCommand : public LoadCommand {
+  public:
+    DynamicSymbolCommand(void);
+    DynamicSymbolCommand(const dysymtab_command *cmd);
+
+    DynamicSymbolCommand& operator=(const DynamicSymbolCommand& copy);
+    DynamicSymbolCommand(const DynamicSymbolCommand& copy);
+
+    virtual ~DynamicSymbolCommand(void);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const DynamicSymbolCommand& rhs) const;
+    bool operator!=(const DynamicSymbolCommand& rhs) const;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+
+  private:
+    //! @brief Integer indicating the index of the first symbol in the group of local symbols.
+    uint32_t idxLocalSymbol_;
+
+    //! @brief Integer indicating the total number of symbols in the group of local symbols.
+    uint32_t nbLocalSymbol_;
+
+    //! @brief Integer indicating the index of the first symbol in the group of
+    //! defined external symbols.
+    uint32_t idxExternalDefineSymbol_;
+
+    //! @brief Integer indicating the total number of symbols in the group of
+    //! defined external symbols.
+    uint32_t nbExternalDefineSymbol_;
+
+    //! @brief Integer indicating the index of the first symbol in the group of
+    //! undefined external symbols.
+    uint32_t idxUndefineSymbol_;
+
+    //! @brief Integer indicating the total number of symbols in the group of
+    //! undefined external symbols.
+    uint32_t nbUndefineSymbol_;
+
+    //! @brief Integer indicating the byte offset from the start of
+    //! the file to the table of contents data.
+    uint32_t tocOffset_;
+
+    //! @brief Integer indicating the number of entries in the table of contents.
+    uint32_t nbToc_;
+
+    //! @brief Integer indicating the byte offset from the start of
+    //! the file to the module table data.
+    uint32_t moduleTableOffset_;
+
+    //! @brief Integer indicating the number of entries in the module table.
+    uint32_t nbModuleTable_;
+
+    //! @brief Integer indicating the byte offset from the start of
+    //! the file to the external reference table data.
+    uint32_t externalReferenceSymbolOffset_;
+
+    //! @brief Integer indicating the number of entries in the external reference table.
+    uint32_t nbExternalReferenceSymbols_;
+
+    //! @brief Integer indicating the byte offset from the start of
+    //! the file to the indirect symbol table data.
+    uint32_t indirectSymOffset_;
+
+    //! @brief Integer indicating the number of entries in the indirect symbol table.
+    uint32_t nbIndirectSymbols_;
+
+    //! @brief Integer indicating the byte offset from the start of
+    //! the file to the external relocation table data.
+    uint32_t externalRelocationOffset_;
+
+    //! @brief Integer indicating the number of entries in the external relocation table.
+    uint32_t nbExternalRelocation_;
+
+    //! @brief Integer indicating the byte offset from the start of
+    //! the file to the local relocation table data.
+    uint32_t localRelocationOffset_;
+
+    //! @brief An integer indicating the number of entries in the local relocation table.
+    uint32_t nbLocRelocation_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/EnumToString.hpp b/include/LIEF/MachO/EnumToString.hpp
new file mode 100644
index 0000000..3ea3700
--- /dev/null
+++ b/include/LIEF/MachO/EnumToString.hpp
@@ -0,0 +1,37 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_ENUM_TO_STRING_H
+#define LIEF_MACHO_ENUM_TO_STRING_H
+#include "LIEF/visibility.h"
+
+#include "LIEF/MachO/Structures.hpp"
+
+namespace LIEF {
+namespace MachO {
+DLL_PUBLIC const char* to_string(LOAD_COMMAND_TYPES e);
+DLL_PUBLIC const char* to_string(MACHO_TYPES e);
+DLL_PUBLIC const char* to_string(FILE_TYPES e);
+DLL_PUBLIC const char* to_string(CPU_TYPES e);
+DLL_PUBLIC const char* to_string(HEADER_FLAGS e);
+DLL_PUBLIC const char* to_string(SECTION_TYPES e);
+DLL_PUBLIC const char* to_string(SECTION_FLAGS e);
+DLL_PUBLIC const char* to_string(SYMBOL_TYPES e);
+DLL_PUBLIC const char* to_string(N_LIST_TYPES e);
+DLL_PUBLIC const char* to_string(SYMBOL_DESCRIPTIONS e);
+} // namespace MachO
+} // namespace LIEF
+
+#endif
diff --git a/include/LIEF/MachO/Header.hpp b/include/LIEF/MachO/Header.hpp
new file mode 100644
index 0000000..3269bcd
--- /dev/null
+++ b/include/LIEF/MachO/Header.hpp
@@ -0,0 +1,85 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_HEADER_H_
+#define LIEF_MACHO_HEADER_H_
+
+#include <iostream>
+#include <set>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/enums.hpp"
+
+#include "LIEF/MachO/Structures.hpp"
+
+namespace LIEF {
+namespace MachO {
+class DLL_PUBLIC Header : public Visitable {
+  public:
+    Header(void);
+    Header(const mach_header_64 *header);
+    Header(const mach_header    *header);
+
+    Header& operator=(const Header& copy);
+    Header(const Header& copy);
+
+    virtual ~Header(void);
+
+    uint32_t               magic(void) const;
+    CPU_TYPES              cpu_type(void) const;
+    uint32_t               cpu_subtype(void) const;
+    FILE_TYPES             file_type(void) const;
+    std::set<HEADER_FLAGS> flags_list(void) const;
+    bool                   has_flag(HEADER_FLAGS flag) const;
+    uint32_t               nb_cmds(void) const;
+    uint32_t               sizeof_cmds(void) const;
+    uint32_t               flags(void) const;
+    uint32_t               reserved(void) const;
+
+    std::pair<ARCHITECTURES, std::set<MODES>> abstract_architecture(void) const;
+
+    void magic(uint32_t magic);
+    void cpu_type(CPU_TYPES cputype);
+    void cpu_subtype(uint32_t cpusubtype);
+    void file_type(FILE_TYPES filetype);
+    void nb_cmds(uint32_t ncmds);
+    void sizeof_cmds(uint32_t sizeofcmds);
+    void flags(uint32_t flags);
+    void remove_flag(HEADER_FLAGS flag);
+    void reserved(uint32_t reserved);
+
+    bool operator==(const Header& rhs) const;
+    bool operator!=(const Header& rhs) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Header& hdr);
+
+  private:
+    uint32_t   magic_;
+    CPU_TYPES  cputype_;
+    uint32_t   cpusubtype_;
+    FILE_TYPES filetype_;
+    uint32_t   ncmds_;
+    uint32_t   sizeofcmds_;
+    uint32_t   flags_;
+    uint32_t   reserved_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/LoadCommand.hpp b/include/LIEF/MachO/LoadCommand.hpp
new file mode 100644
index 0000000..61afd7d
--- /dev/null
+++ b/include/LIEF/MachO/LoadCommand.hpp
@@ -0,0 +1,69 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_LOAD_COMMAND_H_
+#define LIEF_MACHO_LOAD_COMMAND_H_
+
+#include <string>
+#include <vector>
+
+#include "LIEF/types.hpp"
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/MachO/Structures.hpp"
+
+
+namespace LIEF {
+namespace MachO {
+class DLL_PUBLIC LoadCommand : public Visitable {
+  public:
+    LoadCommand(void);
+    LoadCommand(const load_command* command);
+
+    LoadCommand& operator=(const LoadCommand& copy);
+    LoadCommand(const LoadCommand& copy);
+
+    virtual ~LoadCommand(void);
+
+    LOAD_COMMAND_TYPES          command(void) const;
+    uint32_t                    size(void) const;
+    const std::vector<uint8_t>& data(void) const;
+    uint64_t                    command_offset(void) const;
+
+    void data(const std::vector<uint8_t>& data);
+    void command(LOAD_COMMAND_TYPES command);
+    void size(uint32_t size);
+    void command_offset(uint64_t offset);
+
+    virtual std::ostream& print(std::ostream& os) const;
+
+    bool operator==(const LoadCommand& rhs) const;
+    bool operator!=(const LoadCommand& rhs) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const LoadCommand& cmd);
+
+  protected:
+    std::vector<uint8_t> originalData_;
+    LOAD_COMMAND_TYPES   command_;
+    uint32_t             size_;
+    uint64_t             commandOffset_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/MainCommand.hpp b/include/LIEF/MachO/MainCommand.hpp
new file mode 100644
index 0000000..fe2ed74
--- /dev/null
+++ b/include/LIEF/MachO/MainCommand.hpp
@@ -0,0 +1,61 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_MAIN_COMMAND_H_
+#define LIEF_MACHO_MAIN_COMMAND_H_
+
+#include <iostream>
+#include <set>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/MachO/Structures.hpp"
+#include "LIEF/MachO/LoadCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+class DLL_PUBLIC MainCommand : public LoadCommand {
+  public:
+    MainCommand(void);
+    MainCommand(const entry_point_command *cmd);
+
+    MainCommand& operator=(const MainCommand& copy);
+    MainCommand(const MainCommand& copy);
+
+    virtual ~MainCommand(void);
+
+    uint64_t entrypoint(void) const;
+    uint64_t stack_size(void) const;
+
+    void entrypoint(uint64_t entrypoint);
+    void stack_size(uint64_t stacksize);
+
+    bool operator==(const MainCommand& rhs) const;
+    bool operator!=(const MainCommand& rhs) const;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+    virtual void accept(Visitor& visitor) const override;
+
+  private:
+    uint64_t entrypoint_;
+    uint64_t stackSize_;
+
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/Parser.hpp b/include/LIEF/MachO/Parser.hpp
new file mode 100644
index 0000000..272d5f5
--- /dev/null
+++ b/include/LIEF/MachO/Parser.hpp
@@ -0,0 +1,55 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_PARSER_H_
+#define LIEF_MACHO_PARSER_H_
+#include <string>
+#include <list>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+#include "LIEF/BinaryStream/VectorStream.hpp"
+
+#include "LIEF/Abstract/Parser.hpp"
+
+#include "LIEF/MachO/Structures.hpp"
+#include "LIEF/MachO/Binary.hpp"
+
+
+namespace LIEF {
+namespace MachO {
+class DLL_PUBLIC Parser : public LIEF::Parser {
+  public:
+    Parser& operator=(const Parser& copy) = delete;
+    Parser(const Parser& copy)            = delete;
+
+    ~Parser(void);
+
+    static std::vector<Binary*> parse(const std::string& filename);
+
+  private:
+    Parser(const std::string& file);
+    Parser(const std::vector<uint8_t>& data);
+    Parser(void);
+
+    void build(void);
+    void build_fat(void);
+
+    std::unique_ptr<VectorStream> stream_;
+    std::vector<Binary*>          binaries_;
+};
+}
+}
+#endif
diff --git a/include/LIEF/MachO/Section.hpp b/include/LIEF/MachO/Section.hpp
new file mode 100644
index 0000000..f7b2049
--- /dev/null
+++ b/include/LIEF/MachO/Section.hpp
@@ -0,0 +1,113 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_SECTION_H_
+#define LIEF_MACHO_SECTION_H_
+#include <string>
+#include <vector>
+#include <iostream>
+#include <set>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/Section.hpp"
+
+#include "LIEF/MachO/LoadCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+class BinaryParser;
+class SegmentCommand;
+
+class DLL_PUBLIC Section : public LIEF::Section {
+
+  friend class BinaryParser;
+
+  public:
+    Section(void);
+    Section(const section_32 *sectionCmd);
+    Section(const section_64 *sectionCmd);
+
+    Section& operator=(const Section& copy);
+    Section(const Section& copy);
+
+    virtual ~Section(void);
+
+    // ============================
+    // LIEF::Section implementation
+    // ============================
+    //! @todo To implement
+    virtual std::vector<uint8_t> content(void) const override;
+
+    //! @brief Return the name of the segment holding this section
+    const std::string& segment_name(void) const;
+
+    //! @see virtual_address
+    uint64_t address(void) const;
+
+    uint32_t                alignment(void) const;
+    uint32_t                relocation_offset(void) const;
+    uint32_t                numberof_relocations(void) const;
+    uint32_t                flags(void) const;
+    SECTION_TYPES           type(void) const;
+    uint32_t                reserved1(void) const;
+    uint32_t                reserved2(void) const;
+    uint32_t                reserved3(void) const;
+    std::set<SECTION_FLAGS> flags_list(void) const;
+    uint32_t                raw_flags(void) const;
+
+    void segment_name(const std::string& name);
+    void address(uint64_t address);
+    void alignment(uint32_t align);
+    void relocation_offset(uint32_t relocOffset);
+    void numberof_relocations(uint32_t nbReloc);
+    void flags(uint32_t flags);
+    void type(SECTION_TYPES type);
+    void reserved1(uint32_t reserved1);
+    void reserved2(uint32_t reserved2);
+    void reserved3(uint32_t reserved3);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Section& rhs) const;
+    bool operator!=(const Section& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Section& section);
+
+  private:
+    std::string segmentName_;
+    uint64_t address_;
+    uint64_t original_size_;
+    uint32_t align_;
+    uint32_t relocationOffset_;
+    uint32_t nbRelocations_;
+    //! @brief `flags_` attribute holds both section's type and section's *flags*
+    //!
+    //! * Type:  `flags_[7:0]`
+    //! * Flags: `flags_[31:8]`
+    uint32_t flags_;
+    uint32_t reserved1_;
+    uint32_t reserved2_;
+    uint32_t reserved3_;
+    std::vector<uint8_t> content_;
+    //! @brief Pointer to the segment holding this section.
+    SegmentCommand *segment_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/SegmentCommand.hpp b/include/LIEF/MachO/SegmentCommand.hpp
new file mode 100644
index 0000000..f142495
--- /dev/null
+++ b/include/LIEF/MachO/SegmentCommand.hpp
@@ -0,0 +1,115 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_SEGMENT_COMMAND_H_
+#define LIEF_MACHO_SEGMENT_COMMAND_H_
+
+#include <string>
+#include <vector>
+#include <iostream>
+#include <functional>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/MachO/type_traits.hpp"
+#include "LIEF/MachO/LoadCommand.hpp"
+#include "LIEF/MachO/Section.hpp"
+
+
+namespace LIEF {
+namespace MachO {
+class BinaryParser;
+
+//! @class SegmentCommand
+//! @brief Class which represent a MachO Segment
+class DLL_PUBLIC SegmentCommand : public LoadCommand {
+
+  friend class BinaryParser;
+
+  public:
+    SegmentCommand(void);
+    SegmentCommand(const segment_command_32 *segmentCmd);
+    SegmentCommand(const segment_command_64 *segmentCmd);
+
+    SegmentCommand& operator=(const SegmentCommand& copy);
+    SegmentCommand(const SegmentCommand& copy);
+
+    virtual ~SegmentCommand(void);
+
+    const std::string& name(void) const;
+    uint64_t virtual_address(void) const;
+    uint64_t virtual_size(void) const;
+    uint64_t file_size(void) const;
+    uint64_t file_offset(void) const;
+    uint32_t max_protection(void) const;
+    uint32_t init_protection(void) const;
+    uint32_t numberof_sections(void) const;
+    uint32_t flags(void) const;
+    it_sections       sections(void);
+    it_const_sections sections(void) const;
+    const std::vector<uint8_t>& content(void) const;
+
+    void name(const std::string& name);
+    void virtual_address(uint64_t virtualAddress);
+    void virtual_size(uint64_t virtualSize);
+    void file_offset(uint64_t fileOffset);
+    void file_size(uint64_t fileSize);
+    void max_protection(uint32_t maxProtection);
+    void init_protection(uint32_t initProtection);
+    void numberof_sections(uint32_t nbSections);
+    void flags(uint32_t flags);
+    //void add_section(const Section& section);
+    void content(const std::vector<uint8_t>& data);
+
+    void remove_all_sections(void);
+
+    bool operator==(const SegmentCommand& rhs) const;
+    bool operator!=(const SegmentCommand& rhs) const;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+    virtual void accept(Visitor& visitor) const override;
+
+  private:
+    std::string name_;
+
+    //! @brief Indicates the starting virtual memory address of this segmen
+    uint64_t virtualAddress_;
+
+    //! @brief Indicates the number of bytes of virtual memory occupied by this segment. See also the description of filesize, below.
+    uint64_t virtualSize_;
+
+    //! @brief Indicates the offset in this file of the data to be mapped at virtualAddress_.
+    uint64_t fileOffset_;
+
+    uint64_t fileSize_;
+
+    uint32_t maxProtection_;
+
+    uint32_t initProtection_;
+
+    uint32_t nbSections_;
+
+    uint32_t flags_;
+
+    std::vector<uint8_t> data_;
+
+    std::vector<Section> sections_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/Structures.hpp.in b/include/LIEF/MachO/Structures.hpp.in
new file mode 100644
index 0000000..ffae241
--- /dev/null
+++ b/include/LIEF/MachO/Structures.hpp.in
@@ -0,0 +1,505 @@
+// From llvm/Support/MachO.h - The MachO file format
+#ifndef LIEF_MACHO_STRUCTURES_H_
+#define LIEF_MACHO_STRUCTURES_H_
+
+#include <cstdint>
+
+#include "LIEF/types.hpp"
+
+#include "LIEF/MachO/enums.hpp"
+
+
+// Swap 2 byte, 16 bit values:
+#define Swap2Bytes(val) \
+ ( (((val) >> 8) & 0x00FF) | (((val) << 8) & 0xFF00) )
+
+
+// Swap 4 byte, 32 bit values:
+#define Swap4Bytes(val) \
+ ( (((val) >> 24) & 0x000000FF) | (((val) >>  8) & 0x0000FF00) | \
+   (((val) <<  8) & 0x00FF0000) | (((val) << 24) & 0xFF000000) )
+
+
+
+// Swap 8 byte, 64 bit values:
+#define Swap8Bytes(val) \
+ ( (((val) >> 56) & 0x00000000000000FF) | (((val) >> 40) & 0x000000000000FF00) | \
+   (((val) >> 24) & 0x0000000000FF0000) | (((val) >>  8) & 0x00000000FF000000) | \
+   (((val) <<  8) & 0x000000FF00000000) | (((val) << 24) & 0x0000FF0000000000) | \
+   (((val) << 40) & 0x00FF000000000000) | (((val) << 56) & 0xFF00000000000000) )
+
+namespace LIEF {
+//! Namespace related to the LIEF's MachO module
+namespace MachO {
+
+  @LIEF_MACHO_STRUCTURES@
+
+
+  static const HEADER_FLAGS header_flags_array[] = {
+    HEADER_FLAGS::MH_NOUNDEFS,              HEADER_FLAGS::MH_INCRLINK,
+    HEADER_FLAGS::MH_DYLDLINK,              HEADER_FLAGS::MH_BINDATLOAD,
+    HEADER_FLAGS::MH_PREBOUND,              HEADER_FLAGS::MH_SPLIT_SEGS,
+    HEADER_FLAGS::MH_LAZY_INIT,             HEADER_FLAGS::MH_TWOLEVEL,
+    HEADER_FLAGS::MH_FORCE_FLAT,            HEADER_FLAGS::MH_NOMULTIDEFS,
+    HEADER_FLAGS::MH_NOFIXPREBINDING,       HEADER_FLAGS::MH_PREBINDABLE,
+    HEADER_FLAGS::MH_ALLMODSBOUND,          HEADER_FLAGS::MH_SUBSECTIONS_VIA_SYMBOLS,
+    HEADER_FLAGS::MH_CANONICAL,             HEADER_FLAGS::MH_WEAK_DEFINES,
+    HEADER_FLAGS::MH_BINDS_TO_WEAK,         HEADER_FLAGS::MH_ALLOW_STACK_EXECUTION,
+    HEADER_FLAGS::MH_ROOT_SAFE,             HEADER_FLAGS::MH_SETUID_SAFE,
+    HEADER_FLAGS::MH_NO_REEXPORTED_DYLIBS,  HEADER_FLAGS::MH_PIE,
+    HEADER_FLAGS::MH_DEAD_STRIPPABLE_DYLIB, HEADER_FLAGS::MH_HAS_TLV_DESCRIPTORS,
+    HEADER_FLAGS::MH_NO_HEAP_EXECUTION,     HEADER_FLAGS::MH_APP_EXTENSION_SAFE
+  };
+
+
+  static const SECTION_FLAGS section_flags_array[] = {
+    SECTION_FLAGS::S_ATTR_PURE_INSTRUCTIONS, SECTION_FLAGS::S_ATTR_NO_TOC,
+    SECTION_FLAGS::S_ATTR_STRIP_STATIC_SYMS, SECTION_FLAGS::S_ATTR_NO_DEAD_STRIP,
+    SECTION_FLAGS::S_ATTR_LIVE_SUPPORT,      SECTION_FLAGS::S_ATTR_SELF_MODIFYING_CODE,
+    SECTION_FLAGS::S_ATTR_DEBUG,             SECTION_FLAGS::S_ATTR_SOME_INSTRUCTIONS,
+    SECTION_FLAGS::S_ATTR_EXT_RELOC,         SECTION_FLAGS::S_ATTR_LOC_RELOC
+  };
+
+
+
+  // Structs from <mach-o/loader.h>
+
+
+
+
+  // Byte order swapping functions for MachO structs
+
+  //inline void swapStruct(mach_header &mh) {
+  //  sys::swapByteOrder(mh.magic);
+  //  sys::swapByteOrder(mh.cputype);
+  //  sys::swapByteOrder(mh.cpusubtype);
+  //  sys::swapByteOrder(mh.filetype);
+  //  sys::swapByteOrder(mh.ncmds);
+  //  sys::swapByteOrder(mh.sizeofcmds);
+  //  sys::swapByteOrder(mh.flags);
+  //}
+
+  //inline void swapStruct(mach_header_64 &H) {
+  //  sys::swapByteOrder(H.magic);
+  //  sys::swapByteOrder(H.cputype);
+  //  sys::swapByteOrder(H.cpusubtype);
+  //  sys::swapByteOrder(H.filetype);
+  //  sys::swapByteOrder(H.ncmds);
+  //  sys::swapByteOrder(H.sizeofcmds);
+  //  sys::swapByteOrder(H.flags);
+  //  sys::swapByteOrder(H.reserved);
+  //}
+
+  //inline void swapStruct(load_command &lc) {
+  //  sys::swapByteOrder(lc.cmd);
+  //  sys::swapByteOrder(lc.cmdsize);
+  //}
+
+  //inline void swapStruct(symtab_command &lc) {
+  //  sys::swapByteOrder(lc.cmd);
+  //  sys::swapByteOrder(lc.cmdsize);
+  //  sys::swapByteOrder(lc.symoff);
+  //  sys::swapByteOrder(lc.nsyms);
+  //  sys::swapByteOrder(lc.stroff);
+  //  sys::swapByteOrder(lc.strsize);
+  //}
+
+  //inline void swapStruct(segment_command_64 &seg) {
+  //  sys::swapByteOrder(seg.cmd);
+  //  sys::swapByteOrder(seg.cmdsize);
+  //  sys::swapByteOrder(seg.vmaddr);
+  //  sys::swapByteOrder(seg.vmsize);
+  //  sys::swapByteOrder(seg.fileoff);
+  //  sys::swapByteOrder(seg.filesize);
+  //  sys::swapByteOrder(seg.maxprot);
+  //  sys::swapByteOrder(seg.initprot);
+  //  sys::swapByteOrder(seg.nsects);
+  //  sys::swapByteOrder(seg.flags);
+  //}
+
+  //inline void swapStruct(segment_command &seg) {
+  //  sys::swapByteOrder(seg.cmd);
+  //  sys::swapByteOrder(seg.cmdsize);
+  //  sys::swapByteOrder(seg.vmaddr);
+  //  sys::swapByteOrder(seg.vmsize);
+  //  sys::swapByteOrder(seg.fileoff);
+  //  sys::swapByteOrder(seg.filesize);
+  //  sys::swapByteOrder(seg.maxprot);
+  //  sys::swapByteOrder(seg.initprot);
+  //  sys::swapByteOrder(seg.nsects);
+  //  sys::swapByteOrder(seg.flags);
+  //}
+
+  //inline void swapStruct(section_64 &sect) {
+  //  sys::swapByteOrder(sect.addr);
+  //  sys::swapByteOrder(sect.size);
+  //  sys::swapByteOrder(sect.offset);
+  //  sys::swapByteOrder(sect.align);
+  //  sys::swapByteOrder(sect.reloff);
+  //  sys::swapByteOrder(sect.nreloc);
+  //  sys::swapByteOrder(sect.flags);
+  //  sys::swapByteOrder(sect.reserved1);
+  //  sys::swapByteOrder(sect.reserved2);
+  //}
+
+  //inline void swapStruct(section &sect) {
+  //  sys::swapByteOrder(sect.addr);
+  //  sys::swapByteOrder(sect.size);
+  //  sys::swapByteOrder(sect.offset);
+  //  sys::swapByteOrder(sect.align);
+  //  sys::swapByteOrder(sect.reloff);
+  //  sys::swapByteOrder(sect.nreloc);
+  //  sys::swapByteOrder(sect.flags);
+  //  sys::swapByteOrder(sect.reserved1);
+  //  sys::swapByteOrder(sect.reserved2);
+  //}
+
+  //inline void swapStruct(dyld_info_command &info) {
+  //  sys::swapByteOrder(info.cmd);
+  //  sys::swapByteOrder(info.cmdsize);
+  //  sys::swapByteOrder(info.rebase_off);
+  //  sys::swapByteOrder(info.rebase_size);
+  //  sys::swapByteOrder(info.bind_off);
+  //  sys::swapByteOrder(info.bind_size);
+  //  sys::swapByteOrder(info.weak_bind_off);
+  //  sys::swapByteOrder(info.weak_bind_size);
+  //  sys::swapByteOrder(info.lazy_bind_off);
+  //  sys::swapByteOrder(info.lazy_bind_size);
+  //  sys::swapByteOrder(info.export_off);
+  //  sys::swapByteOrder(info.export_size);
+  //}
+
+  //inline void swapStruct(dylib_command &d) {
+  //  sys::swapByteOrder(d.cmd);
+  //  sys::swapByteOrder(d.cmdsize);
+  //  sys::swapByteOrder(d.dylib.name);
+  //  sys::swapByteOrder(d.dylib.timestamp);
+  //  sys::swapByteOrder(d.dylib.current_version);
+  //  sys::swapByteOrder(d.dylib.compatibility_version);
+  //}
+
+  //inline void swapStruct(sub_framework_command &s) {
+  //  sys::swapByteOrder(s.cmd);
+  //  sys::swapByteOrder(s.cmdsize);
+  //  sys::swapByteOrder(s.umbrella);
+  //}
+
+  //inline void swapStruct(sub_umbrella_command &s) {
+  //  sys::swapByteOrder(s.cmd);
+  //  sys::swapByteOrder(s.cmdsize);
+  //  sys::swapByteOrder(s.sub_umbrella);
+  //}
+
+  //inline void swapStruct(sub_library_command &s) {
+  //  sys::swapByteOrder(s.cmd);
+  //  sys::swapByteOrder(s.cmdsize);
+  //  sys::swapByteOrder(s.sub_library);
+  //}
+
+  //inline void swapStruct(sub_client_command &s) {
+  //  sys::swapByteOrder(s.cmd);
+  //  sys::swapByteOrder(s.cmdsize);
+  //  sys::swapByteOrder(s.client);
+  //}
+
+  //inline void swapStruct(routines_command &r) {
+  //  sys::swapByteOrder(r.cmd);
+  //  sys::swapByteOrder(r.cmdsize);
+  //  sys::swapByteOrder(r.init_address);
+  //  sys::swapByteOrder(r.init_module);
+  //  sys::swapByteOrder(r.reserved1);
+  //  sys::swapByteOrder(r.reserved2);
+  //  sys::swapByteOrder(r.reserved3);
+  //  sys::swapByteOrder(r.reserved4);
+  //  sys::swapByteOrder(r.reserved5);
+  //  sys::swapByteOrder(r.reserved6);
+  //}
+
+  //inline void swapStruct(routines_command_64 &r) {
+  //  sys::swapByteOrder(r.cmd);
+  //  sys::swapByteOrder(r.cmdsize);
+  //  sys::swapByteOrder(r.init_address);
+  //  sys::swapByteOrder(r.init_module);
+  //  sys::swapByteOrder(r.reserved1);
+  //  sys::swapByteOrder(r.reserved2);
+  //  sys::swapByteOrder(r.reserved3);
+  //  sys::swapByteOrder(r.reserved4);
+  //  sys::swapByteOrder(r.reserved5);
+  //  sys::swapByteOrder(r.reserved6);
+  //}
+
+  //inline void swapStruct(thread_command &t) {
+  //  sys::swapByteOrder(t.cmd);
+  //  sys::swapByteOrder(t.cmdsize);
+  //}
+
+  //inline void swapStruct(dylinker_command &d) {
+  //  sys::swapByteOrder(d.cmd);
+  //  sys::swapByteOrder(d.cmdsize);
+  //  sys::swapByteOrder(d.name);
+  //}
+
+  //inline void swapStruct(uuid_command &u) {
+  //  sys::swapByteOrder(u.cmd);
+  //  sys::swapByteOrder(u.cmdsize);
+  //}
+
+  //inline void swapStruct(rpath_command &r) {
+  //  sys::swapByteOrder(r.cmd);
+  //  sys::swapByteOrder(r.cmdsize);
+  //  sys::swapByteOrder(r.path);
+  //}
+
+  //inline void swapStruct(source_version_command &s) {
+  //  sys::swapByteOrder(s.cmd);
+  //  sys::swapByteOrder(s.cmdsize);
+  //  sys::swapByteOrder(s.version);
+  //}
+
+  //inline void swapStruct(entry_point_command &e) {
+  //  sys::swapByteOrder(e.cmd);
+  //  sys::swapByteOrder(e.cmdsize);
+  //  sys::swapByteOrder(e.entryoff);
+  //  sys::swapByteOrder(e.stacksize);
+  //}
+
+  //inline void swapStruct(encryption_info_command &e) {
+  //  sys::swapByteOrder(e.cmd);
+  //  sys::swapByteOrder(e.cmdsize);
+  //  sys::swapByteOrder(e.cryptoff);
+  //  sys::swapByteOrder(e.cryptsize);
+  //  sys::swapByteOrder(e.cryptid);
+  //}
+
+  //inline void swapStruct(encryption_info_command_64 &e) {
+  //  sys::swapByteOrder(e.cmd);
+  //  sys::swapByteOrder(e.cmdsize);
+  //  sys::swapByteOrder(e.cryptoff);
+  //  sys::swapByteOrder(e.cryptsize);
+  //  sys::swapByteOrder(e.cryptid);
+  //  sys::swapByteOrder(e.pad);
+  //}
+
+  //inline void swapStruct(dysymtab_command &dst) {
+  //  sys::swapByteOrder(dst.cmd);
+  //  sys::swapByteOrder(dst.cmdsize);
+  //  sys::swapByteOrder(dst.ilocalsym);
+  //  sys::swapByteOrder(dst.nlocalsym);
+  //  sys::swapByteOrder(dst.iextdefsym);
+  //  sys::swapByteOrder(dst.nextdefsym);
+  //  sys::swapByteOrder(dst.iundefsym);
+  //  sys::swapByteOrder(dst.nundefsym);
+  //  sys::swapByteOrder(dst.tocoff);
+  //  sys::swapByteOrder(dst.ntoc);
+  //  sys::swapByteOrder(dst.modtaboff);
+  //  sys::swapByteOrder(dst.nmodtab);
+  //  sys::swapByteOrder(dst.extrefsymoff);
+  //  sys::swapByteOrder(dst.nextrefsyms);
+  //  sys::swapByteOrder(dst.indirectsymoff);
+  //  sys::swapByteOrder(dst.nindirectsyms);
+  //  sys::swapByteOrder(dst.extreloff);
+  //  sys::swapByteOrder(dst.nextrel);
+  //  sys::swapByteOrder(dst.locreloff);
+  //  sys::swapByteOrder(dst.nlocrel);
+  //}
+
+  //inline void swapStruct(any_relocation_info &reloc) {
+  //  sys::swapByteOrder(reloc.r_word0);
+  //  sys::swapByteOrder(reloc.r_word1);
+  //}
+
+  //inline void swapStruct(nlist_base &S) {
+  //  sys::swapByteOrder(S.n_strx);
+  //  sys::swapByteOrder(S.n_desc);
+  //}
+
+  //inline void swapStruct(nlist &sym) {
+  //  sys::swapByteOrder(sym.n_strx);
+  //  sys::swapByteOrder(sym.n_desc);
+  //  sys::swapByteOrder(sym.n_value);
+  //}
+
+  //inline void swapStruct(nlist_64 &sym) {
+  //  sys::swapByteOrder(sym.n_strx);
+  //  sys::swapByteOrder(sym.n_desc);
+  //  sys::swapByteOrder(sym.n_value);
+  //}
+
+  //inline void swapStruct(linkedit_data_command &C) {
+  //  sys::swapByteOrder(C.cmd);
+  //  sys::swapByteOrder(C.cmdsize);
+  //  sys::swapByteOrder(C.dataoff);
+  //  sys::swapByteOrder(C.datasize);
+  //}
+
+  //inline void swapStruct(linker_option_command &C) {
+  //  sys::swapByteOrder(C.cmd);
+  //  sys::swapByteOrder(C.cmdsize);
+  //  sys::swapByteOrder(C.count);
+  //}
+
+  //inline void swapStruct(version_min_command&C) {
+  //  sys::swapByteOrder(C.cmd);
+  //  sys::swapByteOrder(C.cmdsize);
+  //  sys::swapByteOrder(C.version);
+  //  sys::swapByteOrder(C.sdk);
+  //}
+
+  //inline void swapStruct(data_in_code_entry &C) {
+  //  sys::swapByteOrder(C.offset);
+  //  sys::swapByteOrder(C.length);
+  //  sys::swapByteOrder(C.kind);
+  //}
+
+  //inline void swapStruct(uint32_t &C) {
+  //  sys::swapByteOrder(C);
+  //}
+
+  // Get/Set functions from <mach-o/nlist.h>
+
+  //static inline uint16_t GET_LIBRARY_ORDINAL(uint16_t n_desc) {
+  //  return (((n_desc) >> 8u) & 0xffu);
+  //}
+
+  //static inline void SET_LIBRARY_ORDINAL(uint16_t &n_desc, uint8_t ordinal) {
+  //  n_desc = (((n_desc) & 0x00ff) | (((ordinal) & 0xff) << 8));
+  //}
+
+  //static inline uint8_t GET_COMM_ALIGN (uint16_t n_desc) {
+  //  return (n_desc >> 8u) & 0x0fu;
+  //}
+
+  //static inline void SET_COMM_ALIGN (uint16_t &n_desc, uint8_t align) {
+  //  n_desc = ((n_desc & 0xf0ffu) | ((align & 0x0fu) << 8u));
+  //}
+
+  //static inline int CPU_SUBTYPE_INTEL(int Family, int Model) {
+  //  return Family | (Model << 4);
+  //}
+  //static inline int CPU_SUBTYPE_INTEL_FAMILY(CPUSubTypeX86 ST) {
+  //  return ((int)ST) & 0x0f;
+  //}
+  //static inline int CPU_SUBTYPE_INTEL_MODEL(CPUSubTypeX86 ST) {
+  //  return ((int)ST) >> 4;
+  //}
+
+
+
+
+
+  //inline void swapStruct(x86hread_state64 &x) {
+  //  sys::swapByteOrder(x.rax);
+  //  sys::swapByteOrder(x.rbx);
+  //  sys::swapByteOrder(x.rcx);
+  //  sys::swapByteOrder(x.rdx);
+  //  sys::swapByteOrder(x.rdi);
+  //  sys::swapByteOrder(x.rsi);
+  //  sys::swapByteOrder(x.rbp);
+  //  sys::swapByteOrder(x.rsp);
+  //  sys::swapByteOrder(x.r8);
+  //  sys::swapByteOrder(x.r9);
+  //  sys::swapByteOrder(x.r10);
+  //  sys::swapByteOrder(x.r11);
+  //  sys::swapByteOrder(x.r12);
+  //  sys::swapByteOrder(x.r13);
+  //  sys::swapByteOrder(x.r14);
+  //  sys::swapByteOrder(x.r15);
+  //  sys::swapByteOrder(x.rip);
+  //  sys::swapByteOrder(x.rflags);
+  //  sys::swapByteOrder(x.cs);
+  //  sys::swapByteOrder(x.fs);
+  //  sys::swapByteOrder(x.gs);
+  //}
+
+  //inline void swapStruct(x86_float_state64 &x) {
+  //  sys::swapByteOrder(x.fpu_reserved[0]);
+  //  sys::swapByteOrder(x.fpu_reserved[1]);
+  //  // TODO swap: fp_control_t fpu_fcw;
+  //  // TODO swap: fp_status_t fpu_fsw;
+  //  sys::swapByteOrder(x.fpu_fop);
+  //  sys::swapByteOrder(x.fpu_ip);
+  //  sys::swapByteOrder(x.fpu_cs);
+  //  sys::swapByteOrder(x.fpu_rsrv2);
+  //  sys::swapByteOrder(x.fpu_dp);
+  //  sys::swapByteOrder(x.fpu_ds);
+  //  sys::swapByteOrder(x.fpu_rsrv3);
+  //  sys::swapByteOrder(x.fpu_mxcsr);
+  //  sys::swapByteOrder(x.fpu_mxcsrmask);
+  //  sys::swapByteOrder(x.fpu_reserved1);
+  //}
+
+  //inline void swapStruct(x86_exception_state64 &x) {
+  //  sys::swapByteOrder(x.trapno);
+  //  sys::swapByteOrder(x.cpu);
+  //  sys::swapByteOrder(x.err);
+  //  sys::swapByteOrder(x.faultvaddr);
+  //}
+
+
+  //inline void swapStruct(x86_state_hdr_t &x) {
+  //  sys::swapByteOrder(x.flavor);
+  //  sys::swapByteOrder(x.count);
+  //}
+
+
+  //inline void swapStruct(x86hread_state_t &x) {
+  //  swapStruct(x.tsh);
+  //  if (x.tsh.flavor == x86HREAD_STATE64)
+  //    swapStruct(x.uts.ts64);
+  //}
+
+  //inline void swapStruct(x86_float_state_t &x) {
+  //  swapStruct(x.fsh);
+  //  if (x.fsh.flavor == x86_FLOAT_STATE64)
+  //    swapStruct(x.ufs.fs64);
+  //}
+
+  //inline void swapStruct(x86_exception_state_t &x) {
+  //  swapStruct(x.esh);
+  //  if (x.esh.flavor == x86_EXCEPTION_STATE64)
+  //    swapStruct(x.ues.es64);
+  //}
+
+  const uint32_t x86HREAD_STATE64_COUNT =
+    sizeof(x86hread_state64) / sizeof(uint32_t);
+  const uint32_t x86_FLOAT_STATE64_COUNT =
+    sizeof(x86_float_state64) / sizeof(uint32_t);
+  const uint32_t x86_EXCEPTION_STATE64_COUNT =
+    sizeof(x86_exception_state64) / sizeof(uint32_t);
+
+  const uint32_t x86HREAD_STATE_COUNT =
+    sizeof(x86hread_state_t) / sizeof(uint32_t);
+  const uint32_t x86_FLOAT_STATE_COUNT =
+    sizeof(x86_float_state_t) / sizeof(uint32_t);
+  const uint32_t x86_EXCEPTION_STATE_COUNT =
+    sizeof(x86_exception_state_t) / sizeof(uint32_t);
+
+  class MachO32 {
+    public:
+    using header                  = mach_header;
+    using segment_command         = segment_command_32;
+    using section                 = section_32;
+    using routines_command        = routines_command_32;
+    using dylib_module            = dylib_module_32;
+    using encryption_info_command = encryption_info_command_32;
+    using nlist                   = nlist_32;
+
+    using uint                    = uint32_t;
+  };
+
+  class MachO64 {
+    public:
+    using header                  = mach_header_64;
+    using segment_command         = segment_command_64;
+    using section                 = section_64;
+    using routines_command        = routines_command_64;
+    using dylib_module            = dylib_module_64;
+    using encryption_info_command = encryption_info_command_64;
+    using nlist                   = nlist_64;
+
+    using uint                    = uint64_t;
+  };
+
+} // end namespace MachO
+}
+#endif
diff --git a/include/LIEF/MachO/Symbol.hpp b/include/LIEF/MachO/Symbol.hpp
new file mode 100644
index 0000000..4a19d92
--- /dev/null
+++ b/include/LIEF/MachO/Symbol.hpp
@@ -0,0 +1,70 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_SYMBOL_H_
+#define LIEF_MACHO_SYMBOL_H_
+
+#include <iostream>
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/Symbol.hpp"
+
+#include "LIEF/MachO/LoadCommand.hpp"
+
+
+namespace LIEF {
+namespace MachO {
+class DLL_PUBLIC Symbol : public LIEF::Symbol {
+  public:
+    Symbol(void);
+
+    Symbol(const nlist_32 *cmd);
+    Symbol(const nlist_64 *cmd);
+
+    Symbol& operator=(const Symbol& copy);
+    Symbol(const Symbol& copy);
+    virtual ~Symbol(void);
+
+    uint8_t  type(void) const;
+    uint8_t  numberof_sections(void) const;
+    uint16_t description(void) const;
+    uint64_t value(void) const;
+
+    void type(uint8_t type);
+    void numberof_sections(uint8_t nbsections);
+    void description(uint16_t desc);
+    void value(uint64_t);
+
+    bool is_external(void) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Symbol& rhs) const;
+    bool operator!=(const Symbol& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Symbol& symbol);
+
+  private:
+    uint8_t  type_;
+    uint8_t  numberof_sections_;
+    uint16_t description_;
+    uint64_t value_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/SymbolCommand.hpp b/include/LIEF/MachO/SymbolCommand.hpp
new file mode 100644
index 0000000..369200d
--- /dev/null
+++ b/include/LIEF/MachO/SymbolCommand.hpp
@@ -0,0 +1,65 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_SYMBOL_COMMAND_H_
+#define LIEF_MACHO_SYMBOL_COMMAND_H_
+
+#include <string>
+#include <iostream>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/types.hpp"
+#include "LIEF/MachO/LoadCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+class DLL_PUBLIC SymbolCommand : public LoadCommand {
+  public:
+    SymbolCommand(void);
+    SymbolCommand(const symtab_command *command);
+
+    SymbolCommand& operator=(const SymbolCommand& copy);
+    SymbolCommand(const SymbolCommand& copy);
+
+    virtual ~SymbolCommand(void);
+
+    uint32_t symbol_offset(void) const;
+    uint32_t numberof_symbols(void) const;
+    uint32_t strings_offset(void) const;
+    uint32_t strings_size(void) const;
+
+    void symbol_offset(uint32_t offset);
+    void numberof_symbol(uint32_t nb);
+    void strings_offset(uint32_t offset);
+    void strings_size(uint32_t size);
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const SymbolCommand& rhs) const;
+    bool operator!=(const SymbolCommand& rhs) const;
+
+  private:
+    uint32_t symbolOffset_;
+    uint32_t numberOfSymbols_;
+    uint32_t stringsOffset_;
+    uint32_t stringsSize_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/UUIDCommand.hpp b/include/LIEF/MachO/UUIDCommand.hpp
new file mode 100644
index 0000000..ca9d27d
--- /dev/null
+++ b/include/LIEF/MachO/UUIDCommand.hpp
@@ -0,0 +1,58 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_UUID_COMMAND_H_
+#define LIEF_MACHO_UUID_COMMAND_H_
+#include <string>
+#include <vector>
+#include <iostream>
+#include <array>
+
+#include "LIEF/visibility.h"
+#include "LIEF/types.hpp"
+
+#include "LIEF/MachO/LoadCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+using uuid_t = std::array<uint8_t, 16>;
+
+class DLL_PUBLIC UUIDCommand : public LoadCommand {
+  public:
+    UUIDCommand(void);
+    UUIDCommand(const uuid_command *uuidCmd);
+
+    UUIDCommand& operator=(const UUIDCommand& copy);
+    UUIDCommand(const UUIDCommand& copy);
+
+    virtual ~UUIDCommand(void);
+
+    uuid_t uuid(void) const;
+    void   uuid(const uuid_t& uuid);
+
+    bool operator==(const UUIDCommand& rhs) const;
+    bool operator!=(const UUIDCommand& rhs) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+  private:
+    uuid_t uuid_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/enums.hpp.in b/include/LIEF/MachO/enums.hpp.in
new file mode 100644
index 0000000..08de382
--- /dev/null
+++ b/include/LIEF/MachO/enums.hpp.in
@@ -0,0 +1,11 @@
+#ifndef LIEF_MACHO_ENUMS_H_
+#define LIEF_MACHO_ENUMS_H_
+
+namespace LIEF {
+namespace MachO {
+
+@LIEF_MACHO_ENUMS@
+
+}
+}
+#endif
diff --git a/include/LIEF/MachO/enums.inc b/include/LIEF/MachO/enums.inc
new file mode 100644
index 0000000..d5fd09e
--- /dev/null
+++ b/include/LIEF/MachO/enums.inc
@@ -0,0 +1,604 @@
+
+
+enum MACHO_TYPES {
+  MH_MAGIC    = 0xFEEDFACEu, ///< 32-bit big-endian magic
+  MH_CIGAM    = 0xCEFAEDFEu, ///< 32-bit little-endian magic
+  MH_MAGIC_64 = 0xFEEDFACFu, ///< 64-bit big-endian magic
+  MH_CIGAM_64 = 0xCFFAEDFEu, ///< 64-bit little-endian magic
+  FAT_MAGIC   = 0xCAFEBABEu, ///< big-endian fat magic
+  FAT_CIGAM   = 0xBEBAFECAu  ///< little-endian fat magic
+};
+
+enum FILE_TYPES {
+  MH_OBJECT      = 0x1u,
+  MH_EXECUTE     = 0x2u,
+  MH_FVMLIB      = 0x3u,
+  MH_CORE        = 0x4u,
+  MH_PRELOAD     = 0x5u,
+  MH_DYLIB       = 0x6u,
+  MH_DYLINKER    = 0x7u,
+  MH_BUNDLE      = 0x8u,
+  MH_DYLIB_STUB  = 0x9u,
+  MH_DSYM        = 0xAu,
+  MH_KEXT_BUNDLE = 0xBu
+};
+
+
+enum HEADER_FLAGS {
+  MH_NOUNDEFS                = 0x00000001u,
+  MH_INCRLINK                = 0x00000002u,
+  MH_DYLDLINK                = 0x00000004u,
+  MH_BINDATLOAD              = 0x00000008u,
+  MH_PREBOUND                = 0x00000010u,
+  MH_SPLIT_SEGS              = 0x00000020u,
+  MH_LAZY_INIT               = 0x00000040u,
+  MH_TWOLEVEL                = 0x00000080u,
+  MH_FORCE_FLAT              = 0x00000100u,
+  MH_NOMULTIDEFS             = 0x00000200u,
+  MH_NOFIXPREBINDING         = 0x00000400u,
+  MH_PREBINDABLE             = 0x00000800u,
+  MH_ALLMODSBOUND            = 0x00001000u,
+  MH_SUBSECTIONS_VIA_SYMBOLS = 0x00002000u,
+  MH_CANONICAL               = 0x00004000u,
+  MH_WEAK_DEFINES            = 0x00008000u,
+  MH_BINDS_TO_WEAK           = 0x00010000u,
+  MH_ALLOW_STACK_EXECUTION   = 0x00020000u,
+  MH_ROOT_SAFE               = 0x00040000u,
+  MH_SETUID_SAFE             = 0x00080000u,
+  MH_NO_REEXPORTED_DYLIBS    = 0x00100000u,
+  MH_PIE                     = 0x00200000u,
+  MH_DEAD_STRIPPABLE_DYLIB   = 0x00400000u,
+  MH_HAS_TLV_DESCRIPTORS     = 0x00800000u,
+  MH_NO_HEAP_EXECUTION       = 0x01000000u,
+  MH_APP_EXTENSION_SAFE      = 0x02000000u
+};
+
+
+enum LOAD_COMMAND_TYPES {
+  // Constants for the "cmd" field in llvm::MachO::load_command
+  LC_SEGMENT                  = 0x00000001u,
+  LC_SYMTAB                   = 0x00000002u,
+  LC_SYMSEG                   = 0x00000003u,
+  LC_THREAD                   = 0x00000004u,
+  LC_UNIXTHREAD               = 0x00000005u,
+  LC_LOADFVMLIB               = 0x00000006u,
+  LC_IDFVMLIB                 = 0x00000007u,
+  LC_IDENT                    = 0x00000008u,
+  LC_FVMFILE                  = 0x00000009u,
+  LC_PREPAGE                  = 0x0000000Au,
+  LC_DYSYMTAB                 = 0x0000000Bu,
+  LC_LOAD_DYLIB               = 0x0000000Cu,
+  LC_ID_DYLIB                 = 0x0000000Du,
+  LC_LOAD_DYLINKER            = 0x0000000Eu,
+  LC_ID_DYLINKER              = 0x0000000Fu,
+  LC_PREBOUND_DYLIB           = 0x00000010u,
+  LC_ROUTINES                 = 0x00000011u,
+  LC_SUB_FRAMEWORK            = 0x00000012u,
+  LC_SUB_UMBRELLA             = 0x00000013u,
+  LC_SUB_CLIENT               = 0x00000014u,
+  LC_SUB_LIBRARY              = 0x00000015u,
+  LC_TWOLEVEL_HINTS           = 0x00000016u,
+  LC_PREBIND_CKSUM            = 0x00000017u,
+  LC_LOAD_WEAK_DYLIB          = 0x80000018u,
+  LC_SEGMENT_64               = 0x00000019u,
+  LC_ROUTINES_64              = 0x0000001Au,
+  LC_UUID                     = 0x0000001Bu,
+  LC_RPATH                    = 0x8000001Cu,
+  LC_CODE_SIGNATURE           = 0x0000001Du,
+  LC_SEGMENT_SPLIT_INFO       = 0x0000001Eu,
+  LC_REEXPORT_DYLIB           = 0x8000001Fu,
+  LC_LAZY_LOAD_DYLIB          = 0x00000020u,
+  LC_ENCRYPTION_INFO          = 0x00000021u,
+  LC_DYLD_INFO                = 0x00000022u,
+  LC_DYLD_INFO_ONLY           = 0x80000022u,
+  LC_LOAD_UPWARD_DYLIB        = 0x80000023u,
+  LC_VERSION_MIN_MACOSX       = 0x00000024u,
+  LC_VERSION_MIN_IPHONEOS     = 0x00000025u,
+  LC_FUNCTION_STARTS          = 0x00000026u,
+  LC_DYLD_ENVIRONMENT         = 0x00000027u,
+  LC_MAIN                     = 0x80000028u,
+  LC_DATA_IN_CODE             = 0x00000029u,
+  LC_SOURCE_VERSION           = 0x0000002Au,
+  LC_DYLIB_CODE_SIGN_DRS      = 0x0000002Bu,
+  LC_ENCRYPTION_INFO_64       = 0x0000002Cu,
+  LC_LINKER_OPTION            = 0x0000002Du,
+  LC_LINKER_OPTIMIZATION_HINT = 0x0000002Eu,
+  LC_VERSION_MIN_TVOS         = 0x0000002Fu,
+  LC_VERSION_MIN_WATCHOS      = 0x00000030u,
+};
+
+
+enum {
+    // Flags for the "cmd" field in llvm::MachO::load_command
+    LC_REQ_DYLD    = 0x80000000u
+  };
+
+
+enum SEGMENTS_FLAGS {
+  // Constant bits for the "flags" field in llvm::MachO::segment_command
+  SG_HIGHVM              = 0x1u, ///< The file contents for this segment are for the high part of the virtual memory space; the low part is zero filled (for stacks in core files).
+  SG_FVMLIB              = 0x2u, ///< this segment is the VM that is allocated by a fixed VM library, for overlap checking in the link editor.
+  SG_NORELOC             = 0x4u, ///< This segment has nothing that was relocated in it and nothing relocated to it. It may be safely replaced without relocation.
+  SG_PROTECTED_VERSION_1 = 0x8u,
+};
+
+enum SECTION_FLAGS_HELPER  {
+  // Constant masks for the "flags" field in llvm::MachO::section and
+  // llvm::MachO::section_64
+  SECTION_TYPE_MASK      = 0x000000ffu, // SECTION_TYPE
+  SECTION_FLAGS_MASK     = 0xffffff00u, // SECTION_ATTRIBUTES
+  SECTION_FLAGS_USR_MASK = 0xff000000u, // SECTION_ATTRIBUTES_USR
+  SECTION_FLAGS_SYS_MASK = 0x00ffff00u  // SECTION_ATTRIBUTES_SYS
+};
+
+//! @brief These are the section type and attributes fields.  A MachO section can
+//! have only one Type, but can have any of the attributes specified.
+enum SECTION_TYPES {
+  // Constant masks for the "flags[7:0]" field in llvm::MachO::section and
+  // llvm::MachO::section_64 (mask "flags" with SECTION_TYPE)
+  S_REGULAR                             = 0x00u, ///< Regular section.
+  S_ZEROFILL                            = 0x01u, ///< Zero fill on demand section.
+  S_CSTRING_LITERALS                    = 0x02u, ///< Section with literal C strings.
+  S_4BYTE_LITERALS                      = 0x03u, ///< Section with 4 byte literals.
+  S_8BYTE_LITERALS                      = 0x04u, ///< Section with 8 byte literals.
+  S_LITERAL_POINTERS                    = 0x05u, ///< Section with pointers to literals.
+  S_NON_LAZY_SYMBOL_POINTERS            = 0x06u, ///< Section with non-lazy symbol pointers.
+  S_LAZY_SYMBOL_POINTERS                = 0x07u, ///< Section with lazy symbol pointers.
+  S_SYMBOL_STUBS                        = 0x08u, ///< Section with symbol stubs, byte size of stub in the Reserved2 field.
+  S_MOD_INIT_FUNC_POINTERS              = 0x09u, ///< Section with only function pointers for initialization.
+  S_MOD_TERM_FUNC_POINTERS              = 0x0au, ///< Section with only function pointers for termination.
+  S_COALESCED                           = 0x0bu, ///< Section contains symbols that are to be coalesced.
+  S_GB_ZEROFILL                         = 0x0cu, ///< Zero fill on demand section (that can be larger than 4 gigabytes).
+  S_INTERPOSING                         = 0x0du, ///< Section with only pairs of function pointers for interposing.
+  S_16BYTE_LITERALS                     = 0x0eu, ///< Section with only 16 byte literals.
+  S_DTRACE_DOF                          = 0x0fu, ///< Section contains DTrace Object Format.
+  S_LAZY_DYLIB_SYMBOL_POINTERS          = 0x10u, ///< Section with lazy symbol pointers to lazy loaded dylibs.
+  S_THREAD_LOCAL_REGULAR                = 0x11u, ///< Thread local data section.
+  S_THREAD_LOCAL_ZEROFILL               = 0x12u, ///< Thread local zerofill section.
+  S_THREAD_LOCAL_VARIABLES              = 0x13u, ///< Section with thread local variable structure data.
+  S_THREAD_LOCAL_VARIABLE_POINTERS      = 0x14u, ///< Section with pointers to thread local structures.
+  S_THREAD_LOCAL_INIT_FUNCTION_POINTERS = 0x15u, ///< Section with thread local variable initialization pointers to functions.
+
+  LAST_KNOWN_SECTION_TYPE = S_THREAD_LOCAL_INIT_FUNCTION_POINTERS
+};
+
+enum SECTION_FLAGS {
+
+  // Constant masks for the "flags[31:24]" field in llvm::MachO::section and
+  // llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_USR)
+  S_ATTR_PURE_INSTRUCTIONS   = 0x80000000u, ///< Section contains only true machine instructions
+  S_ATTR_NO_TOC              = 0x40000000u, ///< Section contains coalesced symbols that are not to be in a ranlib table of contents.
+  S_ATTR_STRIP_STATIC_SYMS   = 0x20000000u, ///< Ok to strip static symbols in this section in files with the MY_DYLDLINK flag.
+  S_ATTR_NO_DEAD_STRIP       = 0x10000000u, ///<  No dead stripping.
+  S_ATTR_LIVE_SUPPORT        = 0x08000000u, ///< Blocks are live if they reference live blocks.
+  S_ATTR_SELF_MODIFYING_CODE = 0x04000000u, ///< Used with i386 code stubs written on by dyld
+  S_ATTR_DEBUG               = 0x02000000u, ///< A debug section.
+
+  // Constant masks for the "flags[23:8]" field in llvm::MachO::section and
+  // llvm::MachO::section_64 (mask "flags" with SECTION_ATTRIBUTES_SYS)
+  S_ATTR_SOME_INSTRUCTIONS   = 0x00000400u, ///< Section contains some machine instructions.
+  S_ATTR_EXT_RELOC           = 0x00000200u, ///< Section has external relocation entries.
+  S_ATTR_LOC_RELOC           = 0x00000100u, ///< Section has local relocation entries.
+
+  // Constant masks for the value of an indirect symbol in an indirect
+  // symbol table
+  INDIRECT_SYMBOL_LOCAL = 0x80000000u,
+  INDIRECT_SYMBOL_ABS   = 0x40000000u
+};
+
+
+enum DataRegionType {
+  // Constants for the "kind" field in a data_in_code_entry structure
+  DICE_KIND_DATA             = 1u,
+  DICE_KIND_JUMP_TABLE8      = 2u,
+  DICE_KIND_JUMP_TABLE16     = 3u,
+  DICE_KIND_JUMP_TABLE32     = 4u,
+  DICE_KIND_ABS_JUMP_TABLE32 = 5u
+};
+
+enum RebaseType {
+  REBASE_TYPE_POINTER         = 1u,
+  REBASE_TYPE_TEXT_ABSOLUTE32 = 2u,
+  REBASE_TYPE_TEXT_PCREL32    = 3u
+};
+
+enum {
+  REBASE_OPCODE_MASK    = 0xF0u,
+  REBASE_IMMEDIATE_MASK = 0x0Fu
+};
+
+enum RebaseOpcode {
+  REBASE_OPCODE_DONE                               = 0x00u,
+  REBASE_OPCODE_SET_TYPE_IMM                       = 0x10u,
+  REBASE_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB        = 0x20u,
+  REBASE_OPCODE_ADD_ADDR_ULEB                      = 0x30u,
+  REBASE_OPCODE_ADD_ADDR_IMM_SCALED                = 0x40u,
+  REBASE_OPCODE_DO_REBASE_IMM_TIMES                = 0x50u,
+  REBASE_OPCODE_DO_REBASE_ULEB_TIMES               = 0x60u,
+  REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB            = 0x70u,
+  REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB = 0x80u
+};
+
+enum BindType {
+  BIND_TYPE_POINTER         = 1u,
+  BIND_TYPE_TEXT_ABSOLUTE32 = 2u,
+  BIND_TYPE_TEXT_PCREL32    = 3u
+};
+
+enum BindSpecialDylib {
+  BIND_SPECIAL_DYLIB_SELF            =  0,
+  BIND_SPECIAL_DYLIB_MAIN_EXECUTABLE = -1,
+  BIND_SPECIAL_DYLIB_FLAT_LOOKUP     = -2
+};
+
+enum {
+  BIND_SYMBOL_FLAGS_WEAK_IMPORT         = 0x1u,
+  BIND_SYMBOL_FLAGS_NON_WEAK_DEFINITION = 0x8u,
+
+  BIND_OPCODE_MASK                      = 0xF0u,
+  BIND_IMMEDIATE_MASK                   = 0x0Fu
+};
+
+enum BindOpcode {
+  BIND_OPCODE_DONE                             = 0x00u,
+  BIND_OPCODE_SET_DYLIB_ORDINAL_IMM            = 0x10u,
+  BIND_OPCODE_SET_DYLIB_ORDINAL_ULEB           = 0x20u,
+  BIND_OPCODE_SET_DYLIB_SPECIAL_IMM            = 0x30u,
+  BIND_OPCODE_SET_SYMBOL_TRAILING_FLAGS_IMM    = 0x40u,
+  BIND_OPCODE_SET_TYPE_IMM                     = 0x50u,
+  BIND_OPCODE_SET_ADDEND_SLEB                  = 0x60u,
+  BIND_OPCODE_SET_SEGMENT_AND_OFFSET_ULEB      = 0x70u,
+  BIND_OPCODE_ADD_ADDR_ULEB                    = 0x80u,
+  BIND_OPCODE_DO_BIND                          = 0x90u,
+  BIND_OPCODE_DO_BIND_ADD_ADDR_ULEB            = 0xA0u,
+  BIND_OPCODE_DO_BIND_ADD_ADDR_IMM_SCALED      = 0xB0u,
+  BIND_OPCODE_DO_BIND_ULEB_TIMES_SKIPPING_ULEB = 0xC0u
+};
+
+enum {
+  EXPORT_SYMBOL_FLAGS_KIND_MASK           = 0x03u,
+  EXPORT_SYMBOL_FLAGS_WEAK_DEFINITION     = 0x04u,
+  EXPORT_SYMBOL_FLAGS_REEXPORT            = 0x08u,
+  EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER   = 0x10u
+};
+
+enum ExportSymbolKind {
+  EXPORT_SYMBOL_FLAGS_KIND_REGULAR        = 0x00u,
+  EXPORT_SYMBOL_FLAGS_KIND_THREAD_LOCAL   = 0x01u,
+  EXPORT_SYMBOL_FLAGS_KIND_ABSOLUTE       = 0x02u
+};
+
+enum SYMBOL_TYPES {
+  N_STAB = 0xe0, ///< The symbol is symbolic debugging table
+  N_PEXT = 0x10, ///< Limited global scope symbol.
+  N_TYPE = 0x0e, ///< Define the type of the symbol. @see N_LIST_TYPES
+  N_EXT  = 0x01  ///< External symbol, a symbol that is either defined outside this file or that is defined in this file but can be referenced by other files.
+};
+
+//! @brief Constants for the "n_type & SYMBOL_TYPES::N_TYPE" in nlist
+//! @see nlist
+enum N_LIST_TYPES {
+  N_UNDF = 0x0u, ///< The symbol is undefined. It is referenced in a different module.
+  N_ABS  = 0x2u, ///< The symbol is absolute. The linker doesn't update his value.
+  N_SECT = 0xeu, ///< The symbol is defined in the section number given in nlist_base.n_sect .
+  N_PBUD = 0xcu, ///< The symbol is undefined and the image is using a prebound value for the symbol. Set the n_sect field to NO_SECT .
+  N_INDR = 0xau  ///< The symbol is defined to be the same as another symbol. The n_value field is an index into the string table specifying the name of the other symbol. When that symbol is linked, both this and the other symbol point to the same defined type and value.
+};
+
+enum SectionOrdinal {
+  // Constants for the "n_sect" field in llvm::MachO::nlist and
+  // llvm::MachO::nlist_64
+  NO_SECT  = 0u,
+  MAX_SECT = 0xffu
+};
+
+enum SYMBOL_DESCRIPTIONS {
+
+  // The low 3 bits are the for the REFERENCE_TYPE.
+  REFERENCE_TYPE                            = 0x7,
+  REFERENCE_FLAG_UNDEFINED_NON_LAZY         = 0, ///< Reference to an external non-lazy (data) symbol.
+  REFERENCE_FLAG_UNDEFINED_LAZY             = 1, ///< Reference to an external lazy symbol - that is, to a function call.
+  REFERENCE_FLAG_DEFINED                    = 2, ///< Defined in this module.
+  REFERENCE_FLAG_PRIVATE_DEFINED            = 3, ///< Defined in this module and is visible only to modules within this shared library.
+  REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY = 4, ///< Defined in another module in this file, is a non-lazy (data) symbol, and is visible only to modules within this shared library.
+  REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY     = 5, ///< Defined in another module in this file, is a lazy (function) symbol, and is visible only to modules within this shared library.
+
+  // Flag bits (some overlap with the library ordinal bits).
+  N_ARM_THUMB_DEF        = 0x0008u,
+  REFERENCED_DYNAMICALLY = 0x0010u,
+  N_NO_DEAD_STRIP        = 0x0020u,
+  N_WEAK_REF             = 0x0040u,
+  N_WEAK_DEF             = 0x0080u,
+  N_SYMBOL_RESOLVER      = 0x0100u,
+  N_ALT_ENTRY            = 0x0200u,
+
+  // For undefined symbols coming from libraries, see GET_LIBRARY_ORDINAL()
+  // as these are in the top 8 bits.
+  SELF_LIBRARY_ORDINAL   = 0x0,
+  MAX_LIBRARY_ORDINAL    = 0xfd,
+  DYNAMIC_LOOKUP_ORDINAL = 0xfe,
+  EXECUTABLE_ORDINAL     = 0xff
+};
+
+enum StabType {
+  // Constant values for the "n_type" field in llvm::MachO::nlist and
+  // llvm::MachO::nlist_64 when "(n_type & N_STAB) != 0"
+  N_GSYM    = 0x20u,
+  N_FNAME   = 0x22u,
+  N_FUN     = 0x24u,
+  N_STSYM   = 0x26u,
+  N_LCSYM   = 0x28u,
+  N_BNSYM   = 0x2Eu,
+  N_PC      = 0x30u,
+  N_AST     = 0x32u,
+  N_OPT     = 0x3Cu,
+  N_RSYM    = 0x40u,
+  N_SLINE   = 0x44u,
+  N_ENSYM   = 0x4Eu,
+  N_SSYM    = 0x60u,
+  N_SO      = 0x64u,
+  N_OSO     = 0x66u,
+  N_LSYM    = 0x80u,
+  N_BINCL   = 0x82u,
+  N_SOL     = 0x84u,
+  N_PARAMS  = 0x86u,
+  N_VERSION = 0x88u,
+  N_OLEVEL  = 0x8Au,
+  N_PSYM    = 0xA0u,
+  N_EINCL   = 0xA2u,
+  N_ENTRY   = 0xA4u,
+  N_LBRAC   = 0xC0u,
+  N_EXCL    = 0xC2u,
+  N_RBRAC   = 0xE0u,
+  N_BCOMM   = 0xE2u,
+  N_ECOMM   = 0xE4u,
+  N_ECOML   = 0xE8u,
+  N_LENG    = 0xFEu
+};
+
+
+enum {
+  // Constant values for the r_symbolnum field in an
+  // llvm::MachO::relocation_info structure when r_extern is 0.
+  R_ABS = 0,
+
+  // Constant bits for the r_address field in an
+  // llvm::MachO::relocation_info structure.
+  R_SCATTERED = 0x80000000
+};
+
+enum RelocationInfoType {
+  // Constant values for the r_type field in an
+  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
+  // structure.
+  GENERIC_RELOC_VANILLA        = 0,
+  GENERIC_RELOC_PAIR           = 1,
+  GENERIC_RELOC_SECTDIFF       = 2,
+  GENERIC_RELOC_PB_LA_PTR      = 3,
+  GENERIC_RELOC_LOCAL_SECTDIFF = 4,
+  GENERIC_RELOC_TLV            = 5,
+
+  // Constant values for the r_type field in a PowerPC architecture
+  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
+  // structure.
+  PPC_RELOC_VANILLA            = GENERIC_RELOC_VANILLA,
+  PPC_RELOC_PAIR               = GENERIC_RELOC_PAIR,
+  PPC_RELOC_BR14               = 2,
+  PPC_RELOC_BR24               = 3,
+  PPC_RELOC_HI16               = 4,
+  PPC_RELOC_LO16               = 5,
+  PPC_RELOC_HA16               = 6,
+  PPC_RELOC_LO14               = 7,
+  PPC_RELOC_SECTDIFF           = 8,
+  PPC_RELOC_PB_LA_PTR          = 9,
+  PPC_RELOC_HI16_SECTDIFF      = 10,
+  PPC_RELOC_LO16_SECTDIFF      = 11,
+  PPC_RELOC_HA16_SECTDIFF      = 12,
+  PPC_RELOC_JBSR               = 13,
+  PPC_RELOC_LO14_SECTDIFF      = 14,
+  PPC_RELOC_LOCAL_SECTDIFF     = 15,
+
+  // Constant values for the r_type field in an ARM architecture
+  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
+  // structure.
+  ARM_RELOC_VANILLA            = GENERIC_RELOC_VANILLA,
+  ARM_RELOC_PAIR               = GENERIC_RELOC_PAIR,
+  ARM_RELOC_SECTDIFF           = GENERIC_RELOC_SECTDIFF,
+  ARM_RELOC_LOCAL_SECTDIFF     = 3,
+  ARM_RELOC_PB_LA_PTR          = 4,
+  ARM_RELOC_BR24               = 5,
+  ARM_THUMB_RELOC_BR22         = 6,
+  ARM_THUMB_32BIT_BRANCH       = 7, // obsolete
+  ARM_RELOC_HALF               = 8,
+  ARM_RELOC_HALF_SECTDIFF      = 9,
+
+  // Constant values for the r_type field in an ARM64 architecture
+  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
+  // structure.
+
+  // For pointers.
+  ARM64_RELOC_UNSIGNED            = 0,
+  // Must be followed by an ARM64_RELOC_UNSIGNED
+  ARM64_RELOC_SUBTRACTOR          = 1,
+  // A B/BL instruction with 26-bit displacement.
+  ARM64_RELOC_BRANCH26            = 2,
+  // PC-rel distance to page of target.
+  ARM64_RELOC_PAGE21              = 3,
+  // Offset within page, scaled by r_length.
+  ARM64_RELOC_PAGEOFF12           = 4,
+  // PC-rel distance to page of GOT slot.
+  ARM64_RELOC_GOT_LOAD_PAGE21     = 5,
+  // Offset within page of GOT slot, scaled by r_length.
+  ARM64_RELOC_GOT_LOAD_PAGEOFF12  = 6,
+  // For pointers to GOT slots.
+  ARM64_RELOC_POINTER_TO_GOT      = 7,
+  // PC-rel distance to page of TLVP slot.
+  ARM64_RELOC_TLVP_LOAD_PAGE21    = 8,
+  // Offset within page of TLVP slot, scaled by r_length.
+  ARM64_RELOC_TLVP_LOAD_PAGEOFF12 = 9,
+  // Must be followed by ARM64_RELOC_PAGE21 or ARM64_RELOC_PAGEOFF12.
+  ARM64_RELOC_ADDEND              = 10,
+
+  // Constant values for the r_type field in an x86_64 architecture
+  // llvm::MachO::relocation_info or llvm::MachO::scattered_relocation_info
+  // structure
+  X86_64_RELOC_UNSIGNED        = 0,
+  X86_64_RELOC_SIGNED          = 1,
+  X86_64_RELOC_BRANCH          = 2,
+  X86_64_RELOC_GOT_LOAD        = 3,
+  X86_64_RELOC_GOT             = 4,
+  X86_64_RELOC_SUBTRACTOR      = 5,
+  X86_64_RELOC_SIGNED_1        = 6,
+  X86_64_RELOC_SIGNED_2        = 7,
+  X86_64_RELOC_SIGNED_4        = 8,
+  X86_64_RELOC_TLV             = 9
+};
+
+// Values for segment_command.initprot.
+// From <mach/vm_prot.h>
+enum {
+  VM_PROT_READ    = 0x1,
+  VM_PROT_WRITE   = 0x2,
+  VM_PROT_EXECUTE = 0x4
+};
+
+
+// Enums from <mach/machine.h>
+enum {
+  // Capability bits used in the definition of cpu_type.
+  CPU_ARCH_MASK  = 0xff000000,   // Mask for architecture bits
+  CPU_ARCH_ABI64 = 0x01000000    // 64 bit ABI
+};
+
+// Constants for the cputype field.
+enum CPU_TYPES {
+  CPU_TYPE_ANY       = -1,
+  CPU_TYPE_X86       = 7,
+  CPU_TYPE_I386      = CPU_TYPE_X86,
+  CPU_TYPE_X86_64    = CPU_TYPE_X86 | CPU_ARCH_ABI64,
+/* CPU_TYPE_MIPS      = 8, */
+  CPU_TYPE_MC98000   = 10, // Old Motorola PowerPC
+  CPU_TYPE_ARM       = 12,
+  CPU_TYPE_ARM64     = CPU_TYPE_ARM | CPU_ARCH_ABI64,
+  CPU_TYPE_SPARC     = 14,
+  CPU_TYPE_POWERPC   = 18,
+  CPU_TYPE_POWERPC64 = CPU_TYPE_POWERPC | CPU_ARCH_ABI64
+};
+
+enum {
+  // Capability bits used in the definition of cpusubtype.
+  CPU_SUBTYPE_MASK  = 0xff000000,   // Mask for architecture bits
+  CPU_SUBTYPE_LIB64 = 0x80000000,   // 64 bit libraries
+
+  // Special CPU subtype constants.
+  CPU_SUBTYPE_MULTIPLE = ~0u
+};
+
+// Constants for the cpusubtype field.
+enum CPU_SUBTYPES_X86 {
+  CPU_SUBTYPE_I386_ALL       = 3,
+  CPU_SUBTYPE_386            = 3,
+  CPU_SUBTYPE_486            = 4,
+  CPU_SUBTYPE_486SX          = 0x84,
+  CPU_SUBTYPE_586            = 5,
+  CPU_SUBTYPE_PENT           = CPU_SUBTYPE_586,
+  CPU_SUBTYPE_PENTPRO        = 0x16,
+  CPU_SUBTYPE_PENTII_M3      = 0x36,
+  CPU_SUBTYPE_PENTII_M5      = 0x56,
+  CPU_SUBTYPE_CELERON        = 0x67,
+  CPU_SUBTYPE_CELERON_MOBILE = 0x77,
+  CPU_SUBTYPE_PENTIUM_3      = 0x08,
+  CPU_SUBTYPE_PENTIUM_3_M    = 0x18,
+  CPU_SUBTYPE_PENTIUM_3_XEON = 0x28,
+  CPU_SUBTYPE_PENTIUM_M      = 0x09,
+  CPU_SUBTYPE_PENTIUM_4      = 0x0a,
+  CPU_SUBTYPE_PENTIUM_4_M    = 0x1a,
+  CPU_SUBTYPE_ITANIUM        = 0x0b,
+  CPU_SUBTYPE_ITANIUM_2      = 0x1b,
+  CPU_SUBTYPE_XEON           = 0x0c,
+  CPU_SUBTYPE_XEON_MP        = 0x1c,
+
+  CPU_SUBTYPE_X86_ALL     = 3,
+  CPU_SUBTYPE_X86_64_ALL  = 3,
+  CPU_SUBTYPE_X86_ARCH1   = 4,
+  CPU_SUBTYPE_X86_64_H    = 8
+};
+
+
+enum {
+  CPU_SUBTYPE_INTEL_FAMILY_MAX = 15,
+  CPU_SUBTYPE_INTEL_MODEL_ALL  = 0
+};
+
+enum CPU_SUBTYPES_ARM {
+  CPU_SUBTYPE_ARM_ALL     = 0,
+  CPU_SUBTYPE_ARM_V4T     = 5,
+  CPU_SUBTYPE_ARM_V6      = 6,
+  CPU_SUBTYPE_ARM_V5      = 7,
+  CPU_SUBTYPE_ARM_V5TEJ   = 7,
+  CPU_SUBTYPE_ARM_XSCALE  = 8,
+  CPU_SUBTYPE_ARM_V7      = 9,
+  //  unused  ARM_V7F     = 10,
+  CPU_SUBTYPE_ARM_V7S     = 11,
+  CPU_SUBTYPE_ARM_V7K     = 12,
+  CPU_SUBTYPE_ARM_V6M     = 14,
+  CPU_SUBTYPE_ARM_V7M     = 15,
+  CPU_SUBTYPE_ARM_V7EM    = 16
+};
+
+enum CPU_SUBTYPES_ARM64 {
+  CPU_SUBTYPE_ARM64_ALL   = 0
+};
+
+enum CPU_SUBTYPES_SPARC {
+  CPU_SUBTYPE_SPARC_ALL   = 0
+};
+
+enum CPU_SUBTYPES_POWERPC {
+  CPU_SUBTYPE_POWERPC_ALL   = 0,
+  CPU_SUBTYPE_POWERPC_601   = 1,
+  CPU_SUBTYPE_POWERPC_602   = 2,
+  CPU_SUBTYPE_POWERPC_603   = 3,
+  CPU_SUBTYPE_POWERPC_603e  = 4,
+  CPU_SUBTYPE_POWERPC_603ev = 5,
+  CPU_SUBTYPE_POWERPC_604   = 6,
+  CPU_SUBTYPE_POWERPC_604e  = 7,
+  CPU_SUBTYPE_POWERPC_620   = 8,
+  CPU_SUBTYPE_POWERPC_750   = 9,
+  CPU_SUBTYPE_POWERPC_7400  = 10,
+  CPU_SUBTYPE_POWERPC_7450  = 11,
+  CPU_SUBTYPE_POWERPC_970   = 100,
+
+  CPU_SUBTYPE_MC980000_ALL  = CPU_SUBTYPE_POWERPC_ALL,
+  CPU_SUBTYPE_MC98601       = CPU_SUBTYPE_POWERPC_601
+};
+
+
+enum x86_fp_control_precis {
+  x86_FP_PREC_24B = 0,
+  x86_FP_PREC_53B = 2,
+  x86_FP_PREC_64B = 3
+};
+
+enum x86_fp_control_rc {
+  x86_FP_RND_NEAR = 0,
+  x86_FP_RND_DOWN = 1,
+  x86_FP_RND_UP = 2,
+  x86_FP_CHOP = 3
+};
+
+
+enum X86ThreadFlavors {
+  x86HREAD_STATE32    = 1,
+  x86_FLOAT_STATE32     = 2,
+  x86_EXCEPTION_STATE32 = 3,
+  x86HREAD_STATE64    = 4,
+  x86_FLOAT_STATE64     = 5,
+  x86_EXCEPTION_STATE64 = 6,
+  x86HREAD_STATE      = 7,
+  x86_FLOAT_STATE       = 8,
+  x86_EXCEPTION_STATE   = 9,
+  x86_DEBUG_STATE32     = 10,
+  x86_DEBUG_STATE64     = 11,
+  x86_DEBUG_STATE       = 12
+};
diff --git a/include/LIEF/MachO/structures.inc b/include/LIEF/MachO/structures.inc
new file mode 100644
index 0000000..34ad37b
--- /dev/null
+++ b/include/LIEF/MachO/structures.inc
@@ -0,0 +1,611 @@
+
+struct mach_header {
+  uint32_t magic;
+  uint32_t cputype;
+  uint32_t cpusubtype;
+  uint32_t filetype;
+  uint32_t ncmds;
+  uint32_t sizeofcmds;
+  uint32_t flags;
+  //uint32_t reserved; not for 32 bits
+};
+
+struct mach_header_64 {
+  uint32_t magic;
+  uint32_t cputype;
+  uint32_t cpusubtype;
+  uint32_t filetype;
+  uint32_t ncmds;
+  uint32_t sizeofcmds;
+  uint32_t flags;
+  uint32_t reserved;
+};
+
+struct load_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+};
+
+struct segment_command_32 {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  char     segname[16];
+  uint32_t vmaddr;
+  uint32_t vmsize;
+  uint32_t fileoff;
+  uint32_t filesize;
+  uint32_t maxprot;
+  uint32_t initprot;
+  uint32_t nsects;
+  uint32_t flags;
+};
+
+struct segment_command_64 {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  char     segname[16];
+  uint64_t vmaddr;
+  uint64_t vmsize;
+  uint64_t fileoff;
+  uint64_t filesize;
+  uint32_t maxprot;
+  uint32_t initprot;
+  uint32_t nsects;
+  uint32_t flags;
+};
+
+struct section_32 {
+  char sectname[16];
+  char segname[16];
+  uint32_t addr;
+  uint32_t size;
+  uint32_t offset;
+  uint32_t align;
+  uint32_t reloff;
+  uint32_t nreloc;
+  uint32_t flags;
+  uint32_t reserved1;
+  uint32_t reserved2;
+};
+
+struct section_64 {
+  char sectname[16];
+  char segname[16];
+  uint64_t addr;
+  uint64_t size;
+  uint32_t offset;
+  uint32_t align;
+  uint32_t reloff;
+  uint32_t nreloc;
+  uint32_t flags;
+  uint32_t reserved1;
+  uint32_t reserved2;
+  uint32_t reserved3;
+};
+
+struct fvmlib {
+  uint32_t name;
+  uint32_t minor_version;
+  uint32_t header_addr;
+};
+
+struct fvmlib_command {
+  uint32_t  cmd;
+  uint32_t cmdsize;
+  struct fvmlib fvmlib;
+};
+
+struct dylib {
+  uint32_t name;
+  uint32_t timestamp;
+  uint32_t current_version;
+  uint32_t compatibility_version;
+};
+
+struct dylib_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  struct dylib dylib;
+};
+
+struct sub_framework_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t umbrella;
+};
+
+struct sub_client_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t client;
+};
+
+struct sub_umbrella_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t sub_umbrella;
+};
+
+struct sub_library_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t sub_library;
+};
+
+struct prebound_dylib_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t name;
+  uint32_t nmodules;
+  uint32_t linked_modules;
+};
+
+struct dylinker_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t name;
+};
+
+struct thread_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t flavor;
+  uint32_t count;
+};
+
+struct routines_command_32 {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t init_address;
+  uint32_t init_module;
+  uint32_t reserved1;
+  uint32_t reserved2;
+  uint32_t reserved3;
+  uint32_t reserved4;
+  uint32_t reserved5;
+  uint32_t reserved6;
+};
+
+struct routines_command_64 {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint64_t init_address;
+  uint64_t init_module;
+  uint64_t reserved1;
+  uint64_t reserved2;
+  uint64_t reserved3;
+  uint64_t reserved4;
+  uint64_t reserved5;
+  uint64_t reserved6;
+};
+
+struct symtab_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t symoff;
+  uint32_t nsyms;
+  uint32_t stroff;
+  uint32_t strsize;
+};
+
+struct dysymtab_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t ilocalsym;
+  uint32_t nlocalsym;
+  uint32_t iextdefsym;
+  uint32_t nextdefsym;
+  uint32_t iundefsym;
+  uint32_t nundefsym;
+  uint32_t tocoff;
+  uint32_t ntoc;
+  uint32_t modtaboff;
+  uint32_t nmodtab;
+  uint32_t extrefsymoff;
+  uint32_t nextrefsyms;
+  uint32_t indirectsymoff;
+  uint32_t nindirectsyms;
+  uint32_t extreloff;
+  uint32_t nextrel;
+  uint32_t locreloff;
+  uint32_t nlocrel;
+};
+
+struct dylib_table_of_contents {
+  uint32_t symbol_index;
+  uint32_t module_index;
+};
+
+struct dylib_module_32 {
+  uint32_t module_name;
+  uint32_t iextdefsym;
+  uint32_t nextdefsym;
+  uint32_t irefsym;
+  uint32_t nrefsym;
+  uint32_t ilocalsym;
+  uint32_t nlocalsym;
+  uint32_t iextrel;
+  uint32_t nextrel;
+  uint32_t iinit_iterm;
+  uint32_t ninit_nterm;
+  uint32_t objc_module_info_addr;
+  uint32_t objc_module_info_size;
+};
+
+struct dylib_module_64 {
+  uint32_t module_name;
+  uint32_t iextdefsym;
+  uint32_t nextdefsym;
+  uint32_t irefsym;
+  uint32_t nrefsym;
+  uint32_t ilocalsym;
+  uint32_t nlocalsym;
+  uint32_t iextrel;
+  uint32_t nextrel;
+  uint32_t iinit_iterm;
+  uint32_t ninit_nterm;
+  uint32_t objc_module_info_size;
+  uint64_t objc_module_info_addr;
+};
+
+struct dylib_reference {
+  uint32_t isym:24,
+           flags:8;
+};
+
+struct twolevel_hints_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t offset;
+  uint32_t nhints;
+};
+
+struct twolevel_hint {
+  uint32_t isub_image:8,
+           itoc:24;
+};
+
+struct prebind_cksum_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t cksum;
+};
+
+struct uuid_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint8_t uuid[16];
+};
+
+struct rpath_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t path;
+};
+
+struct linkedit_data_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t dataoff;
+  uint32_t datasize;
+};
+
+struct data_in_code_entry {
+  uint32_t offset;
+  uint16_t length;
+  uint16_t kind;
+};
+
+struct source_version_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint64_t version;
+};
+
+struct encryption_info_command_32 {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t cryptoff;
+  uint32_t cryptsize;
+  uint32_t cryptid;
+};
+
+struct encryption_info_command_64 {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t cryptoff;
+  uint32_t cryptsize;
+  uint32_t cryptid;
+  uint32_t pad;
+};
+
+struct version_min_command {
+  uint32_t cmd;       // LC_VERSION_MIN_MACOSX or
+                      // LC_VERSION_MIN_IPHONEOS
+  uint32_t cmdsize;   // sizeof(struct version_min_command)
+  uint32_t version;   // X.Y.Z is encoded in nibbles xxxx.yy.zz
+  uint32_t sdk;       // X.Y.Z is encoded in nibbles xxxx.yy.zz
+};
+
+struct dyld_info_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t rebase_off;
+  uint32_t rebase_size;
+  uint32_t bind_off;
+  uint32_t bind_size;
+  uint32_t weak_bind_off;
+  uint32_t weak_bind_size;
+  uint32_t lazy_bind_off;
+  uint32_t lazy_bind_size;
+  uint32_t export_off;
+  uint32_t export_size;
+};
+
+struct linker_option_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t count;
+};
+
+struct symseg_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t offset;
+  uint32_t size;
+};
+
+struct ident_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+};
+
+struct fvmfile_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint32_t name;
+  uint32_t header_addr;
+};
+
+struct tlv_descriptor_32 {
+  uint32_t thunk;
+  uint32_t key;
+  uint32_t offset;
+};
+
+struct tlv_descriptor_64 {
+  uint64_t thunk;
+  uint64_t key;
+  uint64_t offset;
+};
+
+struct tlv_descriptor {
+  uintptr_t thunk;
+  uintptr_t key;
+  uintptr_t offset;
+};
+
+struct entry_point_command {
+  uint32_t cmd;
+  uint32_t cmdsize;
+  uint64_t entryoff;
+  uint64_t stacksize;
+};
+
+// Structs from <mach-o/fat.h>
+struct fat_header {
+  uint32_t magic;
+  uint32_t nfat_arch;
+};
+
+struct fat_arch {
+  uint32_t cputype;
+  uint32_t cpusubtype;
+  uint32_t offset;
+  uint32_t size;
+  uint32_t align;
+};
+
+// Structs from <mach-o/reloc.h>
+struct relocation_info {
+  int32_t r_address;
+  uint32_t r_symbolnum:24,
+           r_pcrel:1,
+           r_length:2,
+           r_extern:1,
+           r_type:4;
+};
+
+
+struct scattered_relocation_info {
+  #if defined(BYTE_ORDER) && defined(BIG_ENDIAN) && (BYTE_ORDER == BIG_ENDIAN)
+  uint32_t r_scattered:1,
+           r_pcrel:1,
+           r_length:2,
+           r_type:4,
+           r_address:24;
+  #else
+  uint32_t r_address:24,
+           r_type:4,
+           r_length:2,
+           r_pcrel:1,
+           r_scattered:1;
+  #endif
+  int32_t r_value;
+};
+
+
+// Structs NOT from <mach-o/reloc.h>, but that make LLVM's life easier
+struct any_relocation_info {
+  uint32_t r_word0, r_word1;
+};
+
+// Structs from <mach-o/nlist.h>
+struct nlist_base {
+  uint32_t n_strx;
+  uint8_t n_type;
+  uint8_t n_sect;
+  uint16_t n_desc;
+};
+
+struct nlist_32 {
+  uint32_t n_strx;
+  uint8_t n_type;
+  uint8_t n_sect;
+  int16_t n_desc;
+  uint32_t n_value;
+};
+
+struct nlist_64 {
+  uint32_t n_strx;
+  uint8_t n_type;
+  uint8_t n_sect;
+  uint16_t n_desc;
+  uint64_t n_value;
+};
+
+
+struct x86hread_state64 {
+  uint64_t rax;
+  uint64_t rbx;
+  uint64_t rcx;
+  uint64_t rdx;
+  uint64_t rdi;
+  uint64_t rsi;
+  uint64_t rbp;
+  uint64_t rsp;
+  uint64_t r8;
+  uint64_t r9;
+  uint64_t r10;
+  uint64_t r11;
+  uint64_t r12;
+  uint64_t r13;
+  uint64_t r14;
+  uint64_t r15;
+  uint64_t rip;
+  uint64_t rflags;
+  uint64_t cs;
+  uint64_t fs;
+  uint64_t gs;
+};
+
+
+struct fp_control_t {
+  unsigned short
+   invalid :1,
+   denorm  :1,
+   zdiv    :1,
+   ovrfl   :1,
+   undfl   :1,
+   precis  :1,
+           :2,
+   pc      :2,
+   rc      :2,
+           :1,
+           :3;
+};
+
+struct fp_status_t {
+  unsigned short
+    invalid :1,
+    denorm  :1,
+    zdiv    :1,
+    ovrfl   :1,
+    undfl   :1,
+    precis  :1,
+    stkflt  :1,
+    errsumm :1,
+    c0      :1,
+    c1      :1,
+    c2      :1,
+    tos     :3,
+    c3      :1,
+    busy    :1;
+};
+
+
+struct mmst_reg_t {
+  char mmst_reg[10];
+  char mmst_rsrv[6];
+};
+
+struct xmm_reg_t {
+  char xmm_reg[16];
+};
+
+struct x86_float_state64 {
+  int32_t fpu_reserved[2];
+  fp_control_t fpu_fcw;
+  fp_status_t fpu_fsw;
+  uint8_t fpu_ftw;
+  uint8_t fpu_rsrv1;
+  uint16_t fpu_fop;
+  uint32_t fpu_ip;
+  uint16_t fpu_cs;
+  uint16_t fpu_rsrv2;
+  uint32_t fpu_dp;
+  uint16_t fpu_ds;
+  uint16_t fpu_rsrv3;
+  uint32_t fpu_mxcsr;
+  uint32_t fpu_mxcsrmask;
+  mmst_reg_t fpu_stmm0;
+  mmst_reg_t fpu_stmm1;
+  mmst_reg_t fpu_stmm2;
+  mmst_reg_t fpu_stmm3;
+  mmst_reg_t fpu_stmm4;
+  mmst_reg_t fpu_stmm5;
+  mmst_reg_t fpu_stmm6;
+  mmst_reg_t fpu_stmm7;
+  xmm_reg_t fpu_xmm0;
+  xmm_reg_t fpu_xmm1;
+  xmm_reg_t fpu_xmm2;
+  xmm_reg_t fpu_xmm3;
+  xmm_reg_t fpu_xmm4;
+  xmm_reg_t fpu_xmm5;
+  xmm_reg_t fpu_xmm6;
+  xmm_reg_t fpu_xmm7;
+  xmm_reg_t fpu_xmm8;
+  xmm_reg_t fpu_xmm9;
+  xmm_reg_t fpu_xmm10;
+  xmm_reg_t fpu_xmm11;
+  xmm_reg_t fpu_xmm12;
+  xmm_reg_t fpu_xmm13;
+  xmm_reg_t fpu_xmm14;
+  xmm_reg_t fpu_xmm15;
+  char fpu_rsrv4[6*16];
+  uint32_t fpu_reserved1;
+};
+
+struct x86_exception_state64 {
+  uint16_t trapno;
+  uint16_t cpu;
+  uint32_t err;
+  uint64_t faultvaddr;
+};
+
+
+struct x86_state_hdr_t {
+  uint32_t flavor;
+  uint32_t count;
+};
+
+struct x86hread_state_t {
+  x86_state_hdr_t tsh;
+  union {
+    x86hread_state64 ts64;
+  } uts;
+};
+
+struct x86_float_state_t {
+  x86_state_hdr_t fsh;
+  union {
+    x86_float_state64 fs64;
+  } ufs;
+};
+
+struct x86_exception_state_t {
+  x86_state_hdr_t esh;
+  union {
+    x86_exception_state64 es64;
+  } ues;
+};
diff --git a/include/LIEF/MachO/type_traits.hpp b/include/LIEF/MachO/type_traits.hpp
new file mode 100644
index 0000000..a6cae6f
--- /dev/null
+++ b/include/LIEF/MachO/type_traits.hpp
@@ -0,0 +1,57 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_TYPE_TRAITS_H_
+#define LIEF_MACHO_TYPE_TRAITS_H_
+#include <vector>
+#include "LIEF/iterators.hpp"
+
+namespace LIEF {
+namespace MachO {
+class LoadCommand;
+class Symbol;
+class SegmentCommand;
+class DylibCommand;
+class Section;
+
+using commands_t                = std::vector<LoadCommand*>;
+using it_commands               = ref_iterator<commands_t>;
+using it_const_commands         = const_ref_iterator<commands_t>;
+
+using symbols_t                 = std::vector<Symbol*>;
+using it_symbols                = ref_iterator<symbols_t>;
+using it_const_symbols          = const_ref_iterator<symbols_t>;
+
+using it_exported_symbols       = filter_iterator<symbols_t>;
+using it_const_exported_symbols = const_filter_iterator<symbols_t>;
+
+using it_imported_symbols       = filter_iterator<symbols_t>;
+using it_const_imported_symbols = const_filter_iterator<symbols_t>;
+
+using libraries_t               = std::vector<DylibCommand*>;
+using it_libraries              = ref_iterator<libraries_t>;
+using it_const_libraries        = const_ref_iterator<libraries_t>;
+
+using segments_t                = std::vector<SegmentCommand*>;
+using it_segments               = ref_iterator<segments_t>;
+using it_const_segments         = const_ref_iterator<segments_t>;
+
+using sections_t                = std::vector<Section*>;
+using it_sections               = ref_iterator<sections_t>;
+using it_const_sections         = const_ref_iterator<sections_t>;
+}
+}
+
+#endif
diff --git a/include/LIEF/MachO/utils.hpp b/include/LIEF/MachO/utils.hpp
new file mode 100644
index 0000000..931c0fe
--- /dev/null
+++ b/include/LIEF/MachO/utils.hpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_MACHO_UTILS_H_
+#define LIEF_MACHO_UTILS_H_
+
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+#include <string>
+
+namespace LIEF {
+namespace MachO {
+DLL_PUBLIC bool is_macho(const std::string& file);
+DLL_PUBLIC bool is_fat(const std::string& file);
+DLL_PUBLIC bool is_64(const std::string& file);
+}
+}
+
+
+#endif
diff --git a/include/LIEF/PE.hpp b/include/LIEF/PE.hpp
new file mode 100644
index 0000000..34c60f4
--- /dev/null
+++ b/include/LIEF/PE.hpp
@@ -0,0 +1,26 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_H_
+#define LIEF_PE_H_
+
+
+#include "LIEF/PE/Parser.hpp"
+#include "LIEF/PE/Builder.hpp"
+#include "LIEF/PE/Binary.hpp"
+
+#include "LIEF/PE/utils.hpp"
+
+#endif
diff --git a/include/LIEF/PE/AuxiliarySymbol.hpp b/include/LIEF/PE/AuxiliarySymbol.hpp
new file mode 100644
index 0000000..86f863a
--- /dev/null
+++ b/include/LIEF/PE/AuxiliarySymbol.hpp
@@ -0,0 +1,29 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_AUXILIARY_SYMBOL_H_
+#define LIEF_PE_AUXILIARY_SYMBOL_H_
+
+#include "LIEF/visibility.h"
+namespace LIEF {
+namespace PE {
+class DLL_PUBLIC AuxiliarySymbol {
+};
+}
+}
+
+
+#endif
+
diff --git a/include/LIEF/PE/Binary.hpp b/include/LIEF/PE/Binary.hpp
new file mode 100644
index 0000000..e0cb54d
--- /dev/null
+++ b/include/LIEF/PE/Binary.hpp
@@ -0,0 +1,327 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_BINARY_H_
+#define LIEF_PE_BINARY_H_
+
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/Header.hpp"
+#include "LIEF/PE/OptionalHeader.hpp"
+#include "LIEF/PE/DosHeader.hpp"
+#include "LIEF/PE/Section.hpp"
+#include "LIEF/PE/Import.hpp"
+#include "LIEF/PE/DataDirectory.hpp"
+#include "LIEF/PE/TLS.hpp"
+#include "LIEF/PE/Symbol.hpp"
+#include "LIEF/PE/utils.hpp"
+#include "LIEF/PE/Relocation.hpp"
+#include "LIEF/PE/ResourceDirectory.hpp"
+#include "LIEF/PE/Export.hpp"
+#include "LIEF/PE/Debug.hpp"
+#include "LIEF/PE/ResourcesManager.hpp"
+#include "LIEF/PE/signature/Signature.hpp"
+
+#include "LIEF/Abstract/Binary.hpp"
+
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+namespace PE {
+class Parser;
+class Builder;
+
+//! @brief Class which represent a PE binary object
+class DLL_PUBLIC Binary : public LIEF::Binary {
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    Binary(const std::string& name, PE_TYPE type);
+
+    virtual ~Binary(void);
+
+    //! @brief Return `PE32` or `PE32+`
+    PE_TYPE type(void) const;
+
+    //! @brief Convert Relative Virtual Address to offset
+    //!
+    //! We try to get the get section wich hold the given
+    //! `RVA` and convert it to offset. If the section
+    //! does not exist, we assume that `RVA` = `offset`
+    uint64_t rva_to_offset(uint64_t RVA);
+
+    //! @brief Convert Virtual address to offset
+    uint64_t va_to_offset(uint64_t VA);
+
+    //! @brief Find the section associated with the `offset`
+    Section&       section_from_offset(uint64_t offset);
+    const Section& section_from_offset(uint64_t offset) const;
+
+    //! @brief Find the section associated with the `virtual address`
+    Section&       section_from_virtual_address(uint64_t virtual_address);
+    const Section& section_from_virtual_address(uint64_t virtual_address) const;
+
+    //! @brief Return binary's sections
+    it_sections       get_sections(void);
+    it_const_sections get_sections(void) const;
+
+    // =======
+    // Headers
+    // =======
+
+    //! @brief Return a reference to the PE::DosHeader object
+    DosHeader&       dos_header(void);
+    const DosHeader& dos_header(void) const;
+
+    //! @brief Return a reference to the PE::Header object
+    Header&       header(void);
+    const Header& header(void) const;
+
+    //! @brief Return a reference to the OptionalHeader object
+    OptionalHeader&       optional_header(void);
+    const OptionalHeader& optional_header(void) const;
+
+    //! @brief Compute the binary's virtual size.
+    //! It should match with OptionalHeader::sizeof_image
+    uint64_t get_virtual_size(void) const;
+
+    //! @brief Compute the size of all headers
+    uint32_t get_sizeof_headers(void) const;
+
+
+    //! @brief Return a reference to the TLS object
+    TLS&       tls(void);
+    const TLS& tls(void) const;
+
+    //! @brief Set a TLS object in the current Binary
+    void tls(const TLS& tls);
+
+    //! @brief Check if the current binary has a TLS object
+    bool has_tls(void) const;
+
+    //! @brief Check if the current binary has imports
+    //!
+    //! @see Import
+    bool has_imports(void) const;
+
+    //! @brief Check if the current binary is signed
+    bool has_signature(void) const;
+
+    //! @brief Check if the current binary has exports.
+    //!
+    //! @see Export
+    bool has_exports(void) const;
+
+    //! @brief Check if the current binary has resources
+    bool has_resources(void) const;
+
+    //! @brief Check if the current binary has exceptions
+    bool has_exceptions(void) const;
+
+    //! @brief Check if the current binary has relocations
+    //!
+    //! @see Relocation
+    bool has_relocations(void) const;
+
+    //! @brief Check if the current binary has debugs
+    bool has_debug(void) const;
+
+    //! @brief Check if the current binary has configuration
+    bool has_configuration(void) const;
+
+    //! @brief Return the Signature object if the bianry is signed
+    const Signature& signature(void) const;
+
+    //! @brief Try to predict the RVA of the function `function` in the import library `library`
+    //!
+    //! @warning
+    //! The value could be changed if imports change
+    uint32_t predict_function_rva(const std::string& library, const std::string& function);
+
+    //! @brief Return a Export object
+    Export&       get_export(void);
+    const Export& get_export(void) const;
+
+    //!@brief Return binary's Symbol
+    std::vector<Symbol>&       symbols(void);
+    const std::vector<Symbol>& symbols(void) const;
+
+    ResourceNode&                  get_resources(void);
+    const ResourceNode&            get_resources(void) const;
+    void set_resources(ResourceNode* resource);
+    ResourcesManager               get_resources_manager(void);
+    const ResourcesManager         get_resources_manager(void) const;
+
+    // ==========================
+    // Methods to manage sections
+    // ==========================
+
+    //! @brief Return binary's section from its name
+    //!
+    //! @param[in] name Name of the Section
+    Section&       get_section(const std::string& name);
+    const Section& get_section(const std::string& name) const;
+
+    //! @brief Return the section associated with import table
+    const Section& get_import_section(void) const;
+    Section&       get_import_section(void);
+
+    //! @brief Delete the section with the given name
+    //!
+    //! @param[in] name Name of section to delete
+    void  delete_section(const std::string& name);
+
+    //! @brief Add a section to the binary and return the section added.
+    Section& add_section(
+        const Section& section,
+        SECTION_TYPES type = SECTION_TYPES::UNKNOWN);
+
+    // =============================
+    // Methods to manage relocations
+    // =============================
+
+    it_relocations       relocations(void);
+    it_const_relocations relocations(void) const;
+
+    //! @brief Add a @link PE::Relocation relocation @endlink
+    void add_relocation(const Relocation& relocation);
+
+    //! @brief Remove all relocations
+    void remove_all_relocations(void);
+
+    // ===============================
+    // Methods to manage DataDirectory
+    // ===============================
+
+    //! @brief Return data directories in the binary
+    it_data_directories       data_directories(void);
+    it_const_data_directories data_directories(void) const;
+
+    DataDirectory&       data_directory(DATA_DIRECTORY index);
+    const DataDirectory& data_directory(DATA_DIRECTORY index) const;
+
+    Debug&       get_debug(void);
+    const Debug& get_debug(void) const;
+
+    // =========================
+    // Methods to manage Imports
+    // =========================
+
+    //! @brief return binary's @link PE::Import imports @endlink
+    it_imports       imports(void);
+    it_const_imports imports(void) const;
+
+    //! @brief Add the function @p function of the library @p library
+    //!
+    //! @param[in] library library name of the function
+    //! @param[in] function function's name from the library to import
+    ImportEntry& add_import_function(const std::string& library, const std::string& function);
+
+    //! @brief add an imported library (i.e. `DLL`) to the binary
+    Import& add_library(const std::string& name);
+
+    //! @brief Remove the library with the given `name`
+    void remove_library(const std::string& name);
+
+    //! @brief Remove all libraries in the binary
+    void remove_all_libraries(void);
+
+    //! @brief Reconstruct the binary object and write it in  `filename`
+    //!
+    //! Rebuild a PE binary from the current Binary object.
+    //! When rebuilding, import table and relocations are not rebuilt.
+    void write(const std::string& filename);
+
+    virtual void accept(Visitor& visitor) const override;
+
+
+    // LIEF Interface
+    // ==============
+
+    //! @brief Patch the content at virtual address @p address with @p patch_value
+    //!
+    //! @param[in] address Address to patch
+    //! @param[in] patch_value Patch to apply
+    virtual void patch_address(uint64_t address, const std::vector<uint8_t>& patch_value) override;
+
+
+    //! @brief Patch the address with the given value
+    //!
+    //! @param[in] address Address to patch
+    //! @param[in] patch_value Patch to apply
+    //! @param[in] size Size of the value in **bytes** (1, 2, ... 8)
+    virtual void patch_address(uint64_t address, uint64_t patch_value, size_t size = sizeof(uint64_t)) override;
+
+    //! @brief Return the content located at virtual address
+    virtual std::vector<uint8_t> get_content_from_virtual_address(uint64_t virtual_address, uint64_t size) const override;
+
+    //! @brief Return the binary's entrypoint
+    virtual uint64_t entrypoint(void) const override;
+
+    bool operator==(const Binary& rhs) const;
+    bool operator!=(const Binary& rhs) const;
+
+    virtual std::ostream& print(std::ostream& os) const override;
+
+  private:
+    Binary(void);
+
+    //! @brief Return binary's symbols as LIEF::Symbol
+    virtual LIEF::symbols_t  get_abstract_symbols(void) override;
+
+    virtual LIEF::Header     get_abstract_header(void) const override;
+
+    //! @brief Return binary's section as LIEF::Section
+    virtual LIEF::sections_t get_abstract_sections(void) override;
+
+    virtual std::vector<std::string> get_abstract_exported_functions(void) const override;
+    virtual std::vector<std::string> get_abstract_imported_functions(void) const override;
+    virtual std::vector<std::string> get_abstract_imported_libraries(void) const override;
+
+    void update_lookup_address_table_offset(void);
+    void update_iat(void);
+
+    PE_TYPE type_;
+    DosHeader          dos_header_;
+    Header             header_;
+    OptionalHeader     optional_header_;
+
+    bool               has_tls_;
+    bool               has_imports_;
+    bool               has_signature_;
+    bool               has_exports_;
+    bool               has_resources_;
+    bool               has_exceptions_;
+    bool               has_relocations_;
+    bool               has_debug_;
+    bool               has_configuration_;
+
+    Signature          signature_;
+    TLS                tls_;
+    sections_t         sections_;
+    data_directories_t data_directories_;
+    symbols_t          symbols_;
+    strings_table_t    strings_table_;
+    relocations_t      relocations_;
+    ResourceNode*      resources_;
+    imports_t          imports_;
+    Export             export_;
+    Debug              debug_;
+
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/PE/Builder.hpp b/include/LIEF/PE/Builder.hpp
new file mode 100644
index 0000000..fec53d4
--- /dev/null
+++ b/include/LIEF/PE/Builder.hpp
@@ -0,0 +1,116 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_BUILDER_H_
+#define LIEF_PE_BUILDER_H_
+
+#include <cstring>
+#include <string>
+#include <vector>
+#include <iterator>
+#include <iostream>
+#include <ostream>
+#include <sstream>
+#include <algorithm>
+#include <iomanip>
+
+#include "LIEF/visibility.h"
+#include "LIEF/utils.hpp"
+#include "LIEF/iostream.hpp"
+
+#include "LIEF/PE/Binary.hpp"
+
+
+namespace LIEF {
+namespace PE {
+
+//! @brief Class which reconstruct a PE binary from a PE::Binary object
+class DLL_PUBLIC Builder
+{
+  public:
+    Builder(void) = delete;
+    Builder(Binary* pe_binary);
+    ~Builder(void);
+
+    void build(void);
+
+    template<typename PE_T>
+    static std::vector<uint8_t> build_jmp(uint64_t address);
+
+    Builder& build_imports(bool flag = true);
+    Builder& patch_imports(bool flag = true);
+    Builder& build_relocations(bool flag = true);
+    Builder& build_tls(bool flag = true);
+    Builder& build_resources(bool flag);
+
+    const std::vector<uint8_t>& get_build(void);
+    void write(const std::string& filename) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Builder& b);
+
+    Builder& operator<<(const DosHeader& dos_header);
+    Builder& operator<<(const Header& bHeader);
+    Builder& operator<<(const OptionalHeader& optional_header);
+    Builder& operator<<(const DataDirectory& data_directory);
+    Builder& operator<<(const Section& section);
+
+  protected:
+    template<typename PE_T>
+    void build_optional_header(const OptionalHeader& optional_header);
+
+
+    //! @brief Rebuild Import Table
+    // TODO: Bug with x86
+    template<typename PE_T>
+    void build_import_table(void);
+
+    template<typename PE_T>
+    void build_tls(void);
+
+    void build_symbols(void);
+    void build_string_table(void);
+    void build_relocation(void);
+    void build_resources(void);
+
+    void compute_resources_size(
+        ResourceNode *node,
+        uint32_t *headerSize,
+        uint32_t *dataSize,
+        uint32_t *nameSize);
+
+    void construct_resources(
+        ResourceNode *node,
+        std::vector<uint8_t> *content,
+        uint32_t *offsetToHeader,
+        uint32_t *offsetToData,
+        uint32_t *offsetToName,
+        uint32_t baseRVA,
+        uint32_t depth);
+
+
+    mutable vector_iostream ios_;
+    Binary                 *binary_;
+
+    bool build_imports_;
+    bool patch_imports_;
+    bool build_relocations_;
+    bool build_tls_;
+    bool build_resources_;
+
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/PE/DataDirectory.hpp b/include/LIEF/PE/DataDirectory.hpp
new file mode 100644
index 0000000..c9ae693
--- /dev/null
+++ b/include/LIEF/PE/DataDirectory.hpp
@@ -0,0 +1,78 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_DATADIRECTORY_H_
+#define LIEF_PE_DATADIRECTORY_H_
+
+#include <memory>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/Section.hpp"
+
+
+namespace LIEF {
+namespace PE {
+
+class Builder;
+class Parser;
+class Binary;
+
+class DLL_PUBLIC DataDirectory : public Visitable {
+
+  friend class Builder;
+  friend class Parser;
+  friend class Binary;
+
+  public:
+  DataDirectory(void);
+  DataDirectory(DATA_DIRECTORY type);
+  DataDirectory(const pe_data_directory *header, DATA_DIRECTORY type);
+
+  DataDirectory(const DataDirectory& other);
+  DataDirectory& operator=(DataDirectory other);
+  void swap(DataDirectory& other);
+  virtual ~DataDirectory(void);
+
+  uint32_t       RVA(void) const;
+  uint32_t       size(void) const;
+  Section&       section(void);
+  const Section& section(void) const;
+  DATA_DIRECTORY type(void) const;
+  bool           has_section(void) const;
+
+  void size(uint32_t size);
+  void RVA(uint32_t rva);
+
+  virtual void accept(Visitor& visitor) const override;
+
+  bool operator==(const DataDirectory& rhs) const;
+  bool operator!=(const DataDirectory& rhs) const;
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const DataDirectory& entry);
+
+  private:
+  uint32_t       rva_;
+  uint32_t       size_;
+  DATA_DIRECTORY type_;
+  Section*       section_;
+};
+}
+}
+
+#endif /* DATADIRECTORY_H_ */
diff --git a/include/LIEF/PE/Debug.hpp b/include/LIEF/PE/Debug.hpp
new file mode 100644
index 0000000..adbf037
--- /dev/null
+++ b/include/LIEF/PE/Debug.hpp
@@ -0,0 +1,87 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_DEBUG_H_
+#define LIEF_PE_DEBUG_H_
+
+#include <string>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC Debug : public Visitable {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    Debug(void);
+    Debug(const pe_debug* debug_s);
+    Debug(const Debug& other);
+    Debug& operator=(const Debug& other);
+    virtual ~Debug(void);
+
+    uint32_t characteristics(void) const;
+    uint32_t timestamp(void) const;
+    uint16_t major_version(void) const;
+    uint16_t minor_version(void) const;
+    DEBUG_TYPES type(void) const;
+    uint32_t sizeof_data(void) const;
+    uint32_t addressof_rawdata(void) const;
+    uint32_t pointerto_rawdata(void) const;
+
+
+    void characteristics(uint32_t characteristics);
+    void timestamp(uint32_t timestamp);
+    void major_version(uint16_t major_version);
+    void minor_version(uint16_t minor_version);
+    void type(DEBUG_TYPES new_type);
+    void sizeof_data(uint32_t sizeof_data);
+    void addressof_rawdata(uint32_t addressof_rawdata);
+    void pointerto_rawdata(uint32_t pointerto_rawdata);
+
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Debug& rhs) const;
+    bool operator!=(const Debug& rhs) const;
+
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Debug& entry);
+
+  private:
+    uint32_t    characteristics_;
+    uint32_t    timestamp_;
+    uint16_t    majorversion_;
+    uint16_t    minorversion_;
+    DEBUG_TYPES type_;
+    uint32_t    sizeof_data_;
+    uint32_t    addressof_rawdata_;
+    uint32_t    pointerto_rawdata_;
+
+
+};
+}
+}
+#endif
diff --git a/include/LIEF/PE/DosHeader.hpp b/include/LIEF/PE/DosHeader.hpp
new file mode 100644
index 0000000..967eac1
--- /dev/null
+++ b/include/LIEF/PE/DosHeader.hpp
@@ -0,0 +1,112 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_DOS_HEADER_H_
+#define LIEF_PE_DOS_HEADER_H_
+#include <array>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class DLL_PUBLIC DosHeader : public Visitable {
+  public:
+    using reserved_t  = std::array<uint16_t, 4>;
+    using reserved2_t = std::array<uint16_t, 10>;
+
+    DosHeader(const pe_dos_header* header);
+    DosHeader(void);
+    DosHeader(const DosHeader& copy);
+    DosHeader& operator=(const DosHeader& copy);
+    virtual ~DosHeader(void);
+
+    uint16_t    magic(void) const;
+    uint16_t    used_bytes_in_the_last_page(void) const;
+    uint16_t    file_size_in_pages(void) const;
+    uint16_t    numberof_relocation(void) const;
+    uint16_t    header_size_in_paragraphs(void) const;
+    uint16_t    minimum_extra_paragraphs(void) const;
+    uint16_t    maximum_extra_paragraphs(void) const;
+    uint16_t    initial_relative_ss(void) const;
+    uint16_t    initial_sp(void) const;
+    uint16_t    checksum(void) const;
+    uint16_t    initial_ip(void) const;
+    uint16_t    initial_relative_cs(void) const;
+    uint16_t    addressof_relocation_table(void) const;
+    uint16_t    overlay_number(void) const;
+    reserved_t  reserved(void) const;
+    uint16_t    oem_id(void) const;
+    uint16_t    oem_info(void) const;
+    reserved2_t reserved2(void) const;
+    uint32_t    addressof_new_exeheader(void) const;
+
+    void magic(uint16_t magic);
+    void used_bytes_in_the_last_page(uint16_t usedBytesInTheLastPage);
+    void file_size_in_pages(uint16_t fileSizeInPages);
+    void numberof_relocation(uint16_t numberOfRelocation);
+    void header_size_in_paragraphs(uint16_t headerSizeInParagraphs);
+    void minimum_extra_paragraphs(uint16_t minimumExtraParagraphs);
+    void maximum_extra_paragraphs(uint16_t maximumExtraParagraphs);
+    void initial_relative_ss(uint16_t initialRelativeSS);
+    void initial_sp(uint16_t initialSP);
+    void checksum(uint16_t checksum);
+    void initial_ip(uint16_t initialIP);
+    void initial_relative_cs(uint16_t initialRelativeCS);
+    void addressof_relocation_table(uint16_t addressOfRelocationTable);
+    void overlay_number(uint16_t overlayNumber);
+    void reserved(const reserved_t& reserved);
+    void oem_id(uint16_t oEMid);
+    void oem_info(uint16_t oEMinfo);
+    void reserved2(const reserved2_t& reserved2);
+    void addressof_new_exeheader(uint32_t addressOfNewExeHeader);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const DosHeader& rhs) const;
+    bool operator!=(const DosHeader& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const DosHeader& entry);
+
+  private:
+    uint16_t    magic_;
+    uint16_t    usedBytesInTheLastPage_;
+    uint16_t    fileSizeInPages_;
+    uint16_t    numberOfRelocation_;
+    uint16_t    headerSizeInParagraphs_;
+    uint16_t    minimumExtraParagraphs_;
+    uint16_t    maximumExtraParagraphs_;
+    uint16_t    initialRelativeSS_;
+    uint16_t    initialSP_;
+    uint16_t    checksum_;
+    uint16_t    initialIP_;
+    uint16_t    initialRelativeCS_;
+    uint16_t    addressOfRelocationTable_;
+    uint16_t    overlayNumber_;
+    reserved_t  reserved_;
+    uint16_t    oEMid_;
+    uint16_t    oEMinfo_;
+    reserved2_t reserved2_;
+    uint32_t    addressOfNewExeHeader_;
+};
+}
+}
+
+#endif
+
diff --git a/include/LIEF/PE/EnumToString.hpp b/include/LIEF/PE/EnumToString.hpp
new file mode 100644
index 0000000..36d200d
--- /dev/null
+++ b/include/LIEF/PE/EnumToString.hpp
@@ -0,0 +1,51 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_ENUM_TO_STRING_H
+#define LIEF_PE_ENUM_TO_STRING_H
+
+#include "LIEF/visibility.h"
+#include "LIEF/PE/Structures.hpp"
+
+namespace LIEF {
+namespace PE {
+DLL_PUBLIC const char* to_string(PE_TYPE e);
+DLL_PUBLIC const char* to_string(DATA_DIRECTORY e);
+
+DLL_PUBLIC const char* to_string(MACHINE_TYPES e);
+DLL_PUBLIC const char* to_string(HEADER_CHARACTERISTICS e);
+DLL_PUBLIC const char* to_string(SUBSYSTEM e);
+DLL_PUBLIC const char* to_string(DLL_CHARACTERISTICS e);
+
+DLL_PUBLIC const char* to_string(SECTION_CHARACTERISTICS e);
+DLL_PUBLIC const char* to_string(SECTION_TYPES e);
+
+DLL_PUBLIC const char* to_string(SYMBOL_BASE_TYPES e);
+DLL_PUBLIC const char* to_string(SYMBOL_COMPLEX_TYPES e);
+DLL_PUBLIC const char* to_string(SYMBOL_SECTION_NUMBER e);
+DLL_PUBLIC const char* to_string(SYMBOL_STORAGE_CLASS e);
+
+DLL_PUBLIC const char* to_string(RELOCATIONS_BASE_TYPES e);
+DLL_PUBLIC const char* to_string(RELOCATIONS_I386 e);
+DLL_PUBLIC const char* to_string(RELOCATIONS_AMD64 e);
+DLL_PUBLIC const char* to_string(RELOCATIONS_ARM e);
+
+DLL_PUBLIC const char* to_string(DEBUG_TYPES e);
+
+} // namespace PE
+} // namespace LIEF
+#endif
+
+
diff --git a/include/LIEF/PE/Export.hpp b/include/LIEF/PE/Export.hpp
new file mode 100644
index 0000000..0415b4c
--- /dev/null
+++ b/include/LIEF/PE/Export.hpp
@@ -0,0 +1,87 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_EXPORT_H_
+#define LIEF_PE_EXPORT_H_
+
+#include <iostream>
+#include <vector>
+#include <string>
+#include <functional>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/type_traits.hpp"
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/ExportEntry.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Builder;
+class Parser;
+
+class DLL_PUBLIC Export : public Visitable {
+
+  friend class Builder;
+  friend class Parser;
+
+
+  public:
+  Export(void);
+  Export(const pe_export_directory_table *header);
+  Export(const Export& copy);
+  Export& operator=(const Export& copy);
+  virtual ~Export(void);
+
+  uint32_t                      export_flags(void) const;
+  uint32_t                      timestamp(void) const;
+  uint16_t                      major_version(void) const;
+  uint16_t                      minor_version(void) const;
+  uint32_t                      ordinal_base(void) const;
+  const std::string&            name(void) const;
+  it_export_entries             entries(void);
+  it_const_export_entries       entries(void) const;
+
+  void export_flags(uint32_t flags);
+  void timestamp(uint32_t timestamp);
+  void major_version(uint16_t major_version);
+  void minor_version(uint16_t minor_version);
+  void ordinal_base(uint32_t ordinal_base);
+  void name(const std::string& name);
+
+  virtual void accept(Visitor& visitor) const override;
+
+  bool operator==(const Export& rhs) const;
+  bool operator!=(const Export& rhs) const;
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Export& exp);
+
+  private:
+  uint32_t         exportFlags_;
+  uint32_t         timestamp_;
+  uint16_t         majorVersion_;
+  uint16_t         minorVersion_;
+  uint32_t         ordinalBase_;
+  std::string      name_;
+  export_entries_t entries_;
+
+};
+
+}
+}
+
+#endif /* PE_EXPORT_H_ */
diff --git a/include/LIEF/PE/ExportEntry.hpp b/include/LIEF/PE/ExportEntry.hpp
new file mode 100644
index 0000000..2600ec9
--- /dev/null
+++ b/include/LIEF/PE/ExportEntry.hpp
@@ -0,0 +1,75 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_EXPORT_ENTRY_H_
+#define LIEF_PE_EXPORT_ENTRY_H_
+
+#include <string>
+#include <memory>
+#include <iostream>
+#include <vector>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+
+
+namespace LIEF {
+namespace PE {
+
+class Builder;
+class Parser;
+
+class DLL_PUBLIC ExportEntry : public Visitable {
+
+  friend class Builder;
+  friend class Parser;
+
+  public:
+  ExportEntry(void);
+  ExportEntry(const ExportEntry& copy);
+  ExportEntry& operator=(const ExportEntry& copy);
+  virtual ~ExportEntry(void);
+
+  const std::string& name(void) const;
+  uint16_t           ordinal(void) const;
+  uint32_t           address(void) const;
+  bool               is_extern(void) const;
+
+  void name(const std::string& name);
+  void ordinal(uint16_t ordinal);
+  void address(uint32_t address);
+  void is_extern(bool is_extern);
+
+  virtual void accept(Visitor& visitor) const override;
+
+  bool operator==(const ExportEntry& rhs) const;
+  bool operator!=(const ExportEntry& rhs) const;
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const ExportEntry& exportEntry);
+
+  private:
+  std::string name_;
+  uint16_t    ordinal_;
+  uint32_t    address_;
+  bool        is_extern_;
+
+};
+
+}
+}
+
+#endif /* PE_EXPORTENTRY_H_ */
diff --git a/include/LIEF/PE/Header.hpp b/include/LIEF/PE/Header.hpp
new file mode 100644
index 0000000..6fb5f19
--- /dev/null
+++ b/include/LIEF/PE/Header.hpp
@@ -0,0 +1,85 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_HEADER_H_
+#define LIEF_PE_HEADER_H_
+#include <array>
+#include <set>
+#include <functional>
+#include <algorithm>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+
+namespace LIEF {
+namespace PE {
+class DLL_PUBLIC Header : public Visitable {
+  public:
+    using signature_t = std::array<uint8_t, sizeof(PE_Magic)>;
+    Header(void);
+    Header(const pe_header *header);
+    virtual ~Header(void);
+
+    Header& operator=(const Header& copy);
+    Header(const Header& copy);
+
+    const signature_t& signature(void) const;
+    MACHINE_TYPES      machine(void) const;
+    uint16_t           numberof_sections(void) const;
+    uint32_t           time_date_stamp(void) const;
+    uint32_t           pointerto_symbol_table(void) const;
+    uint32_t           numberof_symbols(void) const;
+    uint16_t           sizeof_optional_header(void) const;
+    uint16_t           characteristics(void) const;
+
+    bool has_characteristic(HEADER_CHARACTERISTICS c) const;
+    std::set<HEADER_CHARACTERISTICS> characteristics_list(void) const;
+
+    void machine(MACHINE_TYPES type);
+    void numberof_sections(uint16_t nbOfSections);
+    void time_date_stamp(uint32_t timestamp);
+    void pointerto_symbol_table(uint32_t pointerToSymbol);
+    void numberof_symbols(uint32_t nbOfSymbols);
+    void sizeof_optional_header(uint16_t sizeOfOptionalHdr);
+    void characteristics(uint16_t characteristics);
+    void signature(const signature_t& sig);
+
+    void add_characteristic(HEADER_CHARACTERISTICS c);
+    void remove_characteristic(HEADER_CHARACTERISTICS c);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Header& rhs) const;
+    bool operator!=(const Header& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Header& entry);
+  private:
+    signature_t   signature_;
+    MACHINE_TYPES machine_;
+    uint16_t      numberOfSections_;
+    uint32_t      timeDateStamp_;
+    uint32_t      pointerToSymbolTable_;
+    uint32_t      numberOfSymbols_;
+    uint16_t      sizeOfOptionalHeader_;
+    uint16_t      characteristics_;
+
+};
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/Import.hpp b/include/LIEF/PE/Import.hpp
new file mode 100644
index 0000000..689ef98
--- /dev/null
+++ b/include/LIEF/PE/Import.hpp
@@ -0,0 +1,136 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_IMPORT_H_
+#define LIEF_PE_IMPORT_H_
+
+#include <string>
+#include <vector>
+#include <memory>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/types.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/type_traits.hpp"
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/ImportEntry.hpp"
+#include "LIEF/PE/DataDirectory.hpp"
+
+namespace LIEF {
+namespace PE {
+class Parser;
+class Builder;
+
+class DLL_PUBLIC Import : public Visitable {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+  Import(const pe_import *import);
+  Import(const std::string& name);
+  Import(void);
+  virtual ~Import(void);
+
+  Import(const Import& other);
+  Import& operator=(Import other);
+  void swap(Import& other);
+
+  uint32_t forwarder_chain(void) const;
+  uint32_t timedatestamp(void) const;
+
+
+  //! @brief Return a vector of @link PE::ImportEntry Import entries @endlink
+  it_import_entries       entries(void);
+  it_const_import_entries entries(void) const;
+
+  //! @brief Return the relative virtual address of the import address table (`IAT`)
+  //
+  //! @warning
+  //! This address could be change when re-building the binary
+  //!
+  uint32_t import_address_table_rva(void) const;
+
+  //! @brief Return the relative virtual address of the import lookup table
+  //!
+  //! @warning
+  //! This address could be change when re-building the binary
+  //!
+  uint32_t  import_lookup_table_rva(void) const;
+
+  //! @brief Return the Function's RVA from the import address table (`IAT`)
+  //!
+  //! @warning
+  //! This address could be change when re-building the binary
+  //!
+  uint32_t get_function_rva_from_iat(const std::string& function) const;
+
+  //! @brief Return the imported function with the given name
+  ImportEntry&       get_entry(const std::string& name);
+  const ImportEntry& get_entry(const std::string& name) const;
+
+  //! @brief Return the library's name
+  //!
+  //! e.g. `kernel32.dll`
+  const std::string& name(void) const;
+  std::string&       name(void);
+
+  //! @brief Return the @link PE::DataDirectory Data directory@endlink associated.
+  //! It should be the one at index PE::DATA_DIRECTORY::IMPORT_TABLE
+  //!
+  DataDirectory&       directory(void);
+  const DataDirectory& directory(void) const;
+
+  //! @brief Return the @link PE::DataDirectory Data directory@endlink associated.
+  //! It should be the one at index PE::DATA_DIRECTORY::IAT
+  //!
+  DataDirectory&       iat_directory(void);
+  const DataDirectory& iat_directory(void) const;
+
+  //! @brief Add a function
+  ImportEntry& add_entry(const ImportEntry& entry);
+
+  //! @brief Add a function from name
+  ImportEntry& add_entry(const std::string& name);
+
+  void import_lookup_table_rva(uint32_t rva);
+  void import_address_table_rva(uint32_t rva);
+
+  virtual void accept(Visitor& visitor) const override;
+
+  bool operator==(const Import& rhs) const;
+  bool operator!=(const Import& rhs) const;
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Import& entry);
+
+  private:
+  import_entries_t entries_;
+  DataDirectory*   directory_;
+  DataDirectory*   iat_directory_;
+  uint32_t         import_lookup_table_RVA_;
+  uint32_t         timedatestamp_;
+  uint32_t         forwarder_chain_;
+  uint32_t         name_RVA_;
+  uint32_t         import_address_table_RVA_;
+  std::string      name_;
+  PE_TYPE          type_;
+};
+
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/ImportEntry.hpp b/include/LIEF/PE/ImportEntry.hpp
new file mode 100644
index 0000000..937e7e1
--- /dev/null
+++ b/include/LIEF/PE/ImportEntry.hpp
@@ -0,0 +1,95 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_IMPORT_ENTRY_H_
+#define LIEF_PE_IMPORT_ENTRY_H_
+
+#include <string>
+#include <stdexcept>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+
+
+namespace LIEF {
+namespace PE {
+class Parser;
+class Builder;
+
+class DLL_PUBLIC ImportEntry : public Visitable {
+  friend class Parser;
+  friend class Builder;
+
+  public:
+  ImportEntry(void);
+  ImportEntry(uint64_t data, const std::string& name = "");
+  ImportEntry(const std::string& name);
+  ImportEntry(const ImportEntry&);
+  ImportEntry& operator=(const ImportEntry&);
+  virtual ~ImportEntry(void);
+
+
+  //! @brief ``True`` if ordinal is used
+  bool is_ordinal(void) const;
+
+  //! @brief ordinal value
+  uint16_t ordinal(void) const;
+
+  //! @see ImportEntry::data
+  uint64_t hint_name_rva(void) const;
+
+  //! @brief Index into the Export::entries
+  uint16_t hint(void) const;
+
+  //! @brief Value of the current entry in the Import Address Table.
+  //! It should match the lookup table value
+  uint64_t iat_value(void) const;
+
+  //! @brief Import name if not ordinal
+  const std::string& name(void) const;
+
+  //! @brief Raw value
+  uint64_t data(void) const;
+
+  //! @brief **Original** address of the entry in the Import Address Table
+  uint64_t iat_address(void) const;
+
+
+  void name(const std::string& name);
+  void data(uint64_t data);
+
+  virtual void accept(Visitor& visitor) const override;
+
+  bool operator==(const ImportEntry& rhs) const;
+  bool operator!=(const ImportEntry& rhs) const;
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const ImportEntry& entry);
+
+  private:
+  uint64_t    data_;
+  std::string name_;
+  uint16_t    hint_;
+  uint64_t    iat_value_;
+  uint64_t    rva_;
+  PE_TYPE     type_;
+};
+
+}
+}
+
+#endif /* IMPORTENTRY_H_ */
diff --git a/include/LIEF/PE/OptionalHeader.hpp b/include/LIEF/PE/OptionalHeader.hpp
new file mode 100644
index 0000000..c40cb54
--- /dev/null
+++ b/include/LIEF/PE/OptionalHeader.hpp
@@ -0,0 +1,144 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_OPTIONALHEADER_H_
+#define LIEF_PE_OPTIONALHEADER_H_
+#include <iostream>
+#include <set>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+
+namespace LIEF {
+namespace PE {
+class DLL_PUBLIC OptionalHeader : public Visitable {
+  public:
+    OptionalHeader(void);
+    OptionalHeader(const pe32_optional_header *header);
+    OptionalHeader(const pe64_optional_header *header);
+    virtual ~OptionalHeader(void);
+
+    OptionalHeader& operator=(const OptionalHeader& copy);
+    OptionalHeader(const OptionalHeader& copy);
+
+    PE_TYPE   magic(void) const;
+    uint8_t   major_linker_version(void) const;
+    uint8_t   minor_linker_version(void) const;
+    uint32_t  sizeof_code(void) const;
+    uint32_t  sizeof_initialized_data(void) const;
+    uint32_t  sizeof_uninitialized_data(void) const;
+    uint32_t  addressof_entrypoint(void) const;
+    uint32_t  baseof_code(void) const;
+    uint32_t  baseof_data(void) const;
+    uint64_t  imagebase(void) const;
+    uint32_t  section_alignment(void) const;
+    uint32_t  file_alignment(void) const;
+    uint16_t  major_operating_system_version(void) const;
+    uint16_t  minor_operating_system_version(void) const;
+    uint16_t  major_image_version(void) const;
+    uint16_t  minor_image_version(void) const;
+    uint16_t  major_subsystem_version(void) const;
+    uint16_t  minor_subsystem_version(void) const;
+    uint32_t  win32_version_value(void) const;
+    uint32_t  sizeof_image(void) const;
+    uint32_t  sizeof_headers(void) const;
+    uint32_t  checksum(void) const;
+    SUBSYSTEM subsystem(void) const;
+    uint32_t  dll_characteristics(void) const;
+    uint64_t  sizeof_stack_reserve(void) const;
+    uint64_t  sizeof_stack_commit(void) const;
+    uint64_t  sizeof_heap_reserve(void) const;
+    uint64_t  sizeof_heap_commit(void) const;
+    uint32_t  loader_flags(void) const;
+    uint32_t  numberof_rva_and_size(void) const;
+    bool      has_dll_characteristics(DLL_CHARACTERISTICS c) const;
+    std::set<DLL_CHARACTERISTICS> dll_characteristics_list(void) const;
+
+    void magic(PE_TYPE magic);
+    void major_linker_version(uint8_t majorLinkerVersion);
+    void minor_linker_version(uint8_t minorLinkerVersion);
+    void sizeof_code(uint32_t sizeOfCode);
+    void sizeof_initialized_data(uint32_t sizeOfInitializedData);
+    void sizeof_uninitialized_data(uint32_t sizeOfUninitializedData);
+    void addressof_entrypoint(uint32_t addressOfEntryPoint);
+    void baseof_code(uint32_t baseOfCode);
+    void baseof_data(uint32_t baseOfData);
+    void imagebase(uint64_t imageBase);
+    void section_alignment(uint32_t sectionAlignment);
+    void file_alignment(uint32_t fileAlignment);
+    void major_operating_system_version(uint16_t majorOperatingSystemVersion);
+    void minor_operating_system_version(uint16_t minorOperatingSystemVersion);
+    void major_image_version(uint16_t majorImageVersion);
+    void minor_image_version(uint16_t minorImageVersion);
+    void major_subsystem_version(uint16_t majorSubsystemVersion);
+    void minor_subsystem_version(uint16_t minorSubsystemVersion);
+    void win32_version_value(uint32_t win32VersionValue);
+    void sizeof_image(uint32_t sizeOfImage);
+    void sizeof_headers(uint32_t sizeOfHeaders);
+    void checksum(uint32_t checkSum);
+    void subsystem(SUBSYSTEM subsystem);
+    void dll_characteristics(uint32_t DLLCharacteristics);
+    void sizeof_stack_reserve(uint64_t sizeOfStackReserve);
+    void sizeof_stack_commit(uint64_t sizeOfStackCommit);
+    void sizeof_heap_reserve(uint64_t sizeOfHeapReserve);
+    void sizeof_heap_commit(uint64_t sizeOfHeapCommit);
+    void loader_flags(uint32_t loaderFlags);
+    void numberof_rva_and_size(uint32_t numberOfRvaAndSize);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const OptionalHeader& rhs) const;
+    bool operator!=(const OptionalHeader& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const OptionalHeader& entry);
+
+  private:
+    PE_TYPE   magic_;
+    uint8_t   majorLinkerVersion_;
+    uint8_t   minorLinkerVersion_;
+    uint32_t  sizeOfCode_;
+    uint32_t  sizeOfInitializedData_;
+    uint32_t  sizeOfUninitializedData_;
+    uint32_t  addressOfEntryPoint_; // RVA
+    uint32_t  baseOfCode_;          // RVA
+    uint32_t  baseOfData_;          //Not present in PE32+
+    uint64_t  imageBase_;
+    uint32_t  sectionAlignment_;
+    uint32_t  fileAlignment_;
+    uint16_t  majorOperatingSystemVersion_;
+    uint16_t  minorOperatingSystemVersion_;
+    uint16_t  majorImageVersion_;
+    uint16_t  minorImageVersion_;
+    uint16_t  majorSubsystemVersion_;
+    uint16_t  minorSubsystemVersion_;
+    uint32_t  win32VersionValue_;
+    uint32_t  sizeOfImage_;
+    uint32_t  sizeOfHeaders_;
+    uint32_t  checkSum_;
+    SUBSYSTEM subsystem_;
+    uint32_t  DLLCharacteristics_;
+    uint64_t  sizeOfStackReserve_;
+    uint64_t  sizeOfStackCommit_;
+    uint64_t  sizeOfHeapReserve_;
+    uint64_t  sizeOfHeapCommit_;
+    uint32_t  loaderFlags_;
+    uint32_t  numberOfRvaAndSize_;
+};
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/Parser.hpp b/include/LIEF/PE/Parser.hpp
new file mode 100644
index 0000000..dcad549
--- /dev/null
+++ b/include/LIEF/PE/Parser.hpp
@@ -0,0 +1,99 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_PARSER_H_
+#define LIEF_PE_PARSER_H_
+
+#include <string>
+#include <vector>
+
+#include "LIEF/exception.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/Parser.hpp"
+
+#include "LIEF/BinaryStream/VectorStream.hpp"
+
+#include "LIEF/PE/Binary.hpp"
+
+#include "LIEF/PE/ResourceNode.hpp"
+#include "LIEF/PE/ResourceData.hpp"
+#include "LIEF/PE/ResourceDirectory.hpp"
+
+#include "LIEF/PE/EnumToString.hpp"
+
+
+
+namespace LIEF {
+namespace PE {
+class DLL_PUBLIC Parser : public LIEF::Parser {
+  public:
+    static Binary* parse(const std::string& filename);
+    static Binary* parse(const std::vector<uint8_t>& data, const std::string& name = "");
+
+    Parser& operator=(const Parser& copy) = delete;
+    Parser(const Parser& copy)            = delete;
+
+  private:
+    Parser(const std::string& file);
+    Parser(const std::vector<uint8_t>& data, const std::string& name);
+
+    ~Parser(void);
+    Parser(void);
+
+    void init(const std::string& name = "");
+
+    template<typename PE_T>
+    void build(void);
+
+    void build_exports(void);
+    void build_sections(void);
+
+    template<typename PE_T>
+    void build_headers(void);
+
+    void build_configuration(void);
+
+    template<typename PE_T>
+    void build_data_directories(void);
+
+    template<typename PE_T>
+    void build_import_table(void);
+
+    void build_export_table(void);
+    void build_debug(void);
+
+    template<typename PE_T>
+    void build_tls(void);
+
+    void build_relocations(void);
+    void build_resources(void);
+    void build_string_table(void);
+    void build_symbols(void);
+    void build_signature(void);
+
+    ResourceNode* build_resource_node(
+        const pe_resource_directory_table *directoryTable, uint32_t baseOffset);
+
+
+    std::unique_ptr<VectorStream> stream_;
+    Binary*                       binary_;
+    PE_TYPE           type_;
+};
+
+
+}
+}
+#endif
diff --git a/include/LIEF/PE/Relocation.hpp b/include/LIEF/PE/Relocation.hpp
new file mode 100644
index 0000000..6e65dad
--- /dev/null
+++ b/include/LIEF/PE/Relocation.hpp
@@ -0,0 +1,68 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_RELOCATION_H_
+#define LIEF_PE_RELOCATION_H_
+#include <vector>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/RelocationEntry.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC Relocation : public Visitable {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    Relocation(void);
+    Relocation(const Relocation& other);
+    Relocation& operator=(const Relocation& other);
+    Relocation(const pe_base_relocation_block* header);
+    virtual ~Relocation(void);
+
+    uint32_t virtual_address(void) const;
+    uint32_t block_size(void) const;
+    const std::vector<RelocationEntry>& entries(void) const;
+
+    void virtual_address(uint32_t virtual_address);
+    void block_size(uint32_t block_size);
+    void add_entry(const RelocationEntry& entry);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Relocation& rhs) const;
+    bool operator!=(const Relocation& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Relocation& relocation);
+
+  private:
+    uint32_t                     block_size_;
+    uint32_t                     virtual_address_;
+    std::vector<RelocationEntry> entries_;
+};
+
+}
+}
+#endif /* RELOCATION_H_ */
diff --git a/include/LIEF/PE/RelocationEntry.hpp b/include/LIEF/PE/RelocationEntry.hpp
new file mode 100644
index 0000000..b6ae008
--- /dev/null
+++ b/include/LIEF/PE/RelocationEntry.hpp
@@ -0,0 +1,68 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_RELOCATION_ENTRY_H_
+#define LIEF_PE_RELOCATION_ENTRY_H_
+
+#include <string>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC RelocationEntry : public Visitable {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    RelocationEntry(void);
+    RelocationEntry(const RelocationEntry&);
+    RelocationEntry& operator=(const RelocationEntry&);
+    RelocationEntry(uint16_t data);
+    RelocationEntry(uint16_t position, RELOCATIONS_BASE_TYPES type);
+    virtual ~RelocationEntry(void);
+
+    uint16_t data(void) const;
+    uint16_t position(void) const;
+    RELOCATIONS_BASE_TYPES  type(void) const;
+
+    void data(uint16_t data);
+    void position(uint16_t position);
+    void type(RELOCATIONS_BASE_TYPES type);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const RelocationEntry& rhs) const;
+    bool operator!=(const RelocationEntry& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const RelocationEntry& entry);
+
+  private:
+    uint16_t               position_;
+    RELOCATIONS_BASE_TYPES type_;
+};
+
+}
+}
+#endif
diff --git a/include/LIEF/PE/ResourceData.hpp b/include/LIEF/PE/ResourceData.hpp
new file mode 100644
index 0000000..7f0f860
--- /dev/null
+++ b/include/LIEF/PE/ResourceData.hpp
@@ -0,0 +1,63 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_RESOURCE_DATA_H_
+#define LIEF_PE_RESOURCE_DATA_H_
+
+#include <vector>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/ResourceNode.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC ResourceData : public ResourceNode {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    ResourceData(void);
+    ResourceData(const std::vector<uint8_t>& content, uint32_t codePage);
+    ResourceData(const ResourceData&);
+    ResourceData& operator=(const ResourceData&);
+    virtual ~ResourceData(void);
+
+    uint32_t                    code_page(void) const;
+    const std::vector<uint8_t>& content(void) const;
+
+    void code_page(uint32_t codePage);
+    void content(const std::vector<uint8_t>& content);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const ResourceData& rhs) const;
+    bool operator!=(const ResourceData& rhs) const;
+
+  private:
+    std::vector<uint8_t> content_;
+    uint32_t             codePage_;
+
+};
+
+} // namespace PE
+} // namepsace LIEF
+#endif /* RESOURCEDATA_H_ */
diff --git a/include/LIEF/PE/ResourceDirectory.hpp b/include/LIEF/PE/ResourceDirectory.hpp
new file mode 100644
index 0000000..8c52c47
--- /dev/null
+++ b/include/LIEF/PE/ResourceDirectory.hpp
@@ -0,0 +1,69 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_RESOURCE_DIRECTORY_H_
+#define LIEF_PE_RESOURCE_DIRECTORY_H_
+
+#include <string>
+#include <list>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/ResourceNode.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC ResourceDirectory : public ResourceNode {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    ResourceDirectory(void);
+    ResourceDirectory(const pe_resource_directory_table* header);
+
+    ResourceDirectory(const ResourceDirectory&);
+    ResourceDirectory& operator=(const ResourceDirectory&);
+    virtual ~ResourceDirectory(void);
+
+    uint32_t characteristics(void) const;
+    uint32_t time_date_stamp(void) const;
+    uint16_t major_version(void) const;
+    uint16_t minor_version(void) const;
+    uint16_t numberof_name_entries(void) const;
+    uint16_t numberof_id_entries(void) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const ResourceDirectory& rhs) const;
+    bool operator!=(const ResourceDirectory& rhs) const;
+
+  private:
+    uint32_t characteristics_;
+    uint32_t timeDateStamp_;
+    uint16_t majorVersion_;
+    uint16_t minorVersion_;
+    uint16_t numberOfNameEntries_;
+    uint16_t numberOfIDEntries_;
+
+};
+}
+}
+#endif /* RESOURCEDIRECTORY_H_ */
diff --git a/include/LIEF/PE/ResourceNode.hpp b/include/LIEF/PE/ResourceNode.hpp
new file mode 100644
index 0000000..d92b7bc
--- /dev/null
+++ b/include/LIEF/PE/ResourceNode.hpp
@@ -0,0 +1,72 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_RESOURCE_NODE_H_
+#define LIEF_PE_RESOURCE_NODE_H_
+
+#include <string>
+#include <vector>
+#include <memory>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+
+namespace LIEF {
+namespace PE {
+
+enum class RESOURCE_NODE_TYPES : uint8_t {
+  DIRECTORY = 0,
+  DATA
+};
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC ResourceNode : public Visitable {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+  ResourceNode(void);
+  ResourceNode(const ResourceNode& other);
+  ResourceNode& operator=(const ResourceNode& other);
+  virtual ~ResourceNode(void);
+
+  RESOURCE_NODE_TYPES               type(void) const;
+  uint32_t                          id(void) const;
+  const std::u16string&             name(void) const;
+  std::vector<ResourceNode*>&       childs(void);
+  const std::vector<ResourceNode*>& childs(void) const;
+  bool                              has_name(void) const;
+
+  void add_child(ResourceNode* child);
+
+  virtual void accept(Visitor& visitor) const override;
+
+  bool operator==(const ResourceNode& rhs) const;
+  bool operator!=(const ResourceNode& rhs) const;
+
+  protected:
+  RESOURCE_NODE_TYPES        type_;
+  uint32_t                   id_;
+  std::u16string             name_;
+  std::vector<ResourceNode*> childs_;
+};
+}
+}
+#endif /* RESOURCENODE_H_ */
diff --git a/include/LIEF/PE/ResourcesManager.hpp b/include/LIEF/PE/ResourcesManager.hpp
new file mode 100644
index 0000000..44c94d0
--- /dev/null
+++ b/include/LIEF/PE/ResourcesManager.hpp
@@ -0,0 +1,56 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_RESOURCES_MANAGER_H_
+#define LIEF_PE_RESOURCES_MANAGER_H_
+#include <iostream>
+#include <sstream>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/ResourceDirectory.hpp"
+
+namespace LIEF {
+namespace PE {
+class DLL_PUBLIC ResourcesManager {
+  public:
+  ResourcesManager(void) = delete;
+  ResourcesManager(ResourceNode *rsrc);
+
+  ResourcesManager(const ResourcesManager&);
+  ResourcesManager& operator=(const ResourcesManager&);
+  ~ResourcesManager(void);
+
+
+  ResourceDirectory* cursor(void);
+  // bitmap(void);
+  //
+  std::string print(uint32_t depth = 0) const;
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const ResourcesManager& m);
+
+  private:
+  void print_tree(
+      const ResourceNode& node,
+      std::ostringstream& stream,
+      uint32_t current_depth,
+      uint32_t max_depth) const;
+  ResourceNode *resources_;
+};
+
+} // namespace PE
+} // namespace LIEF
+
+#endif
diff --git a/include/LIEF/PE/Section.hpp b/include/LIEF/PE/Section.hpp
new file mode 100644
index 0000000..30ceb09
--- /dev/null
+++ b/include/LIEF/PE/Section.hpp
@@ -0,0 +1,112 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_SECTION_H_
+#define LIEF_PE_SECTION_H_
+#include <iostream>
+#include <vector>
+#include <string>
+#include <set>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/Section.hpp"
+
+#include "LIEF/PE/Structures.hpp"
+
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC Section : public LIEF::Section {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    using LIEF::Section::name;
+
+    Section(const pe_section* header);
+    Section(void);
+    Section(const std::vector<uint8_t>& data, const std::string& name = "", uint32_t characteristics = 0);
+    Section(const std::string& name);
+
+    Section& operator=(const Section& copy);
+    Section(const Section& copy);
+    virtual ~Section(void);
+
+    //! @brief Return the size of the data in the section.
+    uint32_t sizeof_raw_data(void) const;
+    uint32_t virtual_size(void) const;
+
+    // ============================
+    // LIEF::Section implementation
+    // ============================
+    virtual std::vector<uint8_t> content(void) const override;
+
+
+    uint32_t pointerto_raw_data(void) const;
+    uint32_t pointerto_relocation(void) const;
+    uint32_t pointerto_line_numbers(void) const;
+    uint16_t numberof_relocations(void) const;
+    uint16_t numberof_line_numbers(void) const;
+    uint32_t characteristics(void) const;
+
+    bool                              is_type(SECTION_TYPES type) const;
+    const std::set<SECTION_TYPES>&    types(void) const;
+    bool                              has_characteristic(SECTION_CHARACTERISTICS c) const;
+    std::set<SECTION_CHARACTERISTICS> characteristics_list(void) const;
+
+
+    virtual void name(const std::string& name) override;
+    virtual void content(const std::vector<uint8_t>& data) override;
+    void virtual_size(uint32_t virtualSize);
+    void pointerto_raw_data(uint32_t pointerToRawData);
+    void pointerto_relocation(uint32_t pointerToRelocation);
+    void pointerto_line_numbers(uint32_t pointerToLineNumbers);
+    void numberof_relocations(uint16_t numberOfRelocations);
+    void numberof_line_numbers(uint16_t numberOfLineNumbers);
+    void sizeof_raw_data(uint32_t sizeOfRawData);
+    void characteristics(uint32_t characteristics);
+    void type(SECTION_TYPES type);
+    void add_type(SECTION_TYPES type);
+    void remove_type(SECTION_TYPES type);
+    void add_characteristic(SECTION_CHARACTERISTICS characteristic);
+    void remove_characteristic(SECTION_CHARACTERISTICS characteristic);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Section& rhs) const;
+    bool operator!=(const Section& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Section& section);
+
+  private:
+    uint32_t                virtualSize_;
+    std::vector<uint8_t>    content_;
+    uint32_t                pointerToRelocations_;
+    uint32_t                pointerToLineNumbers_;
+    uint16_t                numberOfRelocations_;
+    uint16_t                numberOfLineNumbers_;
+    uint32_t                characteristics_;
+    std::set<SECTION_TYPES> types_;
+};
+
+} // namespace PE
+} // namespace LIEF
+#endif /* _PE_SECTION_H_ */
diff --git a/include/LIEF/PE/Structures.hpp.in b/include/LIEF/PE/Structures.hpp.in
new file mode 100644
index 0000000..716adf4
--- /dev/null
+++ b/include/LIEF/PE/Structures.hpp.in
@@ -0,0 +1,201 @@
+#ifndef LIEF_PE_STRUCTURES_H_
+#define LIEF_PE_STRUCTURES_H_
+#include <type_traits>
+
+#include "LIEF/types.hpp"
+
+#include "LIEF/PE/enums.hpp"
+
+namespace LIEF {
+
+//! Namespace related to the LIEF's PE module
+//!
+//! Some parts from llvm/Support/COFF.h
+namespace PE {
+
+//! Sizes in bytes of various things in the COFF format.
+namespace STRUCT_SIZES {
+  enum {
+    Header16Size                  = 20,
+    Header32Size                  = 56,
+    NameSize                      = 8,
+    Symbol16Size                  = 18,
+    Symbol32Size                  = 20,
+    SectionSize                   = 40,
+    RelocationSize                = 10,
+    BaseRelocationBlockSize       = 8,
+    ImportDirectoryTableEntrySize = 20,
+    ResourceDirectoryTableSize    = 16,
+    ResourceDirectoryEntriesSize  = 8,
+    ResourceDataEntrySize         = 16
+  };
+}
+
+
+
+@LIEF_PE_STRUCTURES@
+
+static const HEADER_CHARACTERISTICS header_characteristics_array[] = {
+  HEADER_CHARACTERISTICS::IMAGE_FILE_INVALID,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_RELOCS_STRIPPED,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_EXECUTABLE_IMAGE,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_LINE_NUMS_STRIPPED,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_LOCAL_SYMS_STRIPPED,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_AGGRESSIVE_WS_TRIM,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_LARGE_ADDRESS_AWARE,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_BYTES_REVERSED_LO,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_32BIT_MACHINE,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_DEBUG_STRIPPED,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_NET_RUN_FROM_SWAP,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_SYSTEM,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_DLL,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_UP_SYSTEM_ONLY,
+  HEADER_CHARACTERISTICS::IMAGE_FILE_BYTES_REVERSED_HI
+};
+
+
+// Common section type
+enum class SECTION_TYPES : uint8_t {
+  TEXT       = 0,
+  TLS        = 1,
+  IMPORT     = 2,
+  DATA       = 3,
+  BSS        = 4,
+  RESOURCE   = 5,
+  RELOCATION = 6,
+  EXPORT     = 7,
+  DEBUG      = 8,
+  UNKNOWN    = 9
+};
+
+
+static const SECTION_CHARACTERISTICS section_characteristics_array[] = {
+  SECTION_CHARACTERISTICS::IMAGE_SCN_TYPE_NO_PAD,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_CODE,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_INITIALIZED_DATA,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_UNINITIALIZED_DATA,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_OTHER,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_INFO,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_REMOVE,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_COMDAT,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_GPREL,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_PURGEABLE,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_16BIT,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_LOCKED,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_PRELOAD,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_1BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_2BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_4BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_8BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_16BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_32BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_64BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_128BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_256BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_512BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_1024BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_2048BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_4096BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_8192BYTES,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_NRELOC_OVFL,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_DISCARDABLE,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_NOT_CACHED,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_NOT_PAGED,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_SHARED,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_EXECUTE,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_READ,
+  SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_WRITE,
+};
+
+
+enum class PE_TYPE : uint16_t {
+    PE32      = 0x10b, ///< 32bits
+    PE32_PLUS = 0x20b  ///< 64 bits
+};
+
+
+
+static const DLL_CHARACTERISTICS dll_characteristics_array[] = {
+  IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA,
+  IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE,
+  IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY,
+  IMAGE_DLL_CHARACTERISTICS_NX_COMPAT,
+  IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION,
+  IMAGE_DLL_CHARACTERISTICS_NO_SEH,
+  IMAGE_DLL_CHARACTERISTICS_NO_BIND,
+  IMAGE_DLL_CHARACTERISTICS_APPCONTAINER,
+  IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER,
+  IMAGE_DLL_CHARACTERISTICS_GUARD_CF,
+  IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE,
+};
+
+
+
+//struct pe_import {
+//  uint16_t Sig1; ///< Must be IMAGE_FILE_MACHINE_UNKNOWN (0).
+//  uint16_t Sig2; ///< Must be 0xFFFF.
+//  uint16_t Version;
+//  uint16_t Machine;
+//  uint32_t TimeDateStamp;
+//  uint32_t SizeOfData;
+//  uint16_t OrdinalHint;
+//  uint16_t TypeInfo;
+//
+//  ImportType getType() const {
+//    return static_cast<ImportType>(TypeInfo & 0x3);
+//  }
+//
+//  ImportNameType getNameType() const {
+//    return static_cast<ImportNameType>((TypeInfo & 0x1C) >> 3);
+//  }
+//};
+
+
+
+
+template <typename T>
+  struct LoadConfiguration {
+  uint32_t Characteristics;
+  uint32_t TimeDateStamp;
+  uint16_t MajorVersion;
+  uint16_t MinorVersion;
+  uint32_t GlobalFlagsClear;
+  uint32_t GlobalFlagsSet;
+  uint32_t CriticalSectionDefaultTimeout;
+  T      DeCommitFreeBlockThreshold;
+  T      DeCommitTotalFreeThreshold;
+  T      LockPrefixTable;
+  T      MaximumAllocationSize;
+  T      VirtualMemoryThreshold;
+  T      ProcessAffinityMask;
+  uint32_t ProcessHeapFlags;
+  uint16_t CSDVersion;
+  uint16_t Reserved1;
+  T      EditList;
+  T      SecurityCookie;
+  T      SEHandlerTable;
+  T      SEHandlerCount;
+};
+
+
+
+class PE32 {
+  public:
+    using pe_optional_header = pe32_optional_header;
+    using pe_tls             = pe32_tls;
+    using uint               = uint32_t;
+ };
+
+
+class PE64 {
+  public:
+    using pe_optional_header = pe64_optional_header;
+    using pe_tls             = pe64_tls;
+    using uint               = uint64_t;
+ };
+
+} // end namesapce ELF
+}
+
+#endif
diff --git a/include/LIEF/PE/Symbol.hpp b/include/LIEF/PE/Symbol.hpp
new file mode 100644
index 0000000..7d9d4f0
--- /dev/null
+++ b/include/LIEF/PE/Symbol.hpp
@@ -0,0 +1,85 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_SYMBOLS_H_
+#define LIEF_PE_SYMBOLS_H_
+
+#include <string>
+#include <memory>
+#include <vector>
+#include <iostream>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/Abstract/Symbol.hpp"
+
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/AuxiliarySymbol.hpp"
+#include "LIEF/PE/Section.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC Symbol : public LIEF::Symbol {
+
+  friend class Parser;
+  friend class Builder;
+
+  public:
+    Symbol(const pe_symbol* header);
+
+    Symbol(void);
+    virtual ~Symbol(void);
+
+    Symbol& operator=(Symbol other);
+    Symbol(const Symbol& copy);
+    void swap(Symbol& other);
+
+    uint32_t             value(void) const;
+    int16_t              section_number(void) const;
+    uint16_t             type(void) const;
+    SYMBOL_BASE_TYPES    base_type(void) const;
+    SYMBOL_COMPLEX_TYPES complex_type(void) const;
+    SYMBOL_STORAGE_CLASS storage_class(void) const;
+    uint8_t              numberof_aux_symbols(void) const;
+    std::wstring         wname(void) const;
+    Section&             section(void);
+    const Section&       section(void) const;
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const Symbol& rhs) const;
+    bool operator!=(const Symbol& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Symbol& entry);
+
+  private:
+    uint32_t             value_;
+    int16_t              section_number_;
+    uint16_t             type_;
+    SYMBOL_STORAGE_CLASS storage_class_;
+    uint8_t              numberof_aux_symbols_;
+    Section*             section_;
+
+};
+
+
+} // namespace PE
+} // namespace LIEF
+#endif /* SYMBOLS_H_ */
diff --git a/include/LIEF/PE/TLS.hpp b/include/LIEF/PE/TLS.hpp
new file mode 100644
index 0000000..35194ab
--- /dev/null
+++ b/include/LIEF/PE/TLS.hpp
@@ -0,0 +1,96 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_TLS_H_
+#define LIEF_PE_TLS_H_
+
+#include <vector>
+#include <iostream>
+#include <memory>
+#include <utility>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/DataDirectory.hpp"
+#include "LIEF/PE/Section.hpp"
+
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+class Builder;
+
+class DLL_PUBLIC TLS : public Visitable {
+  friend class Parser;
+  friend class Builder;
+
+  public:
+
+    TLS(void);
+    TLS(const pe32_tls *header);
+    TLS(const pe64_tls *header);
+    virtual ~TLS(void);
+
+    TLS(const TLS& copy);
+    TLS& operator=(TLS copy);
+    void swap(TLS& other);
+
+    const std::vector<uint64_t>&  callbacks(void) const;
+    std::pair<uint64_t, uint64_t> addressof_raw_data(void) const;
+    uint64_t                      addressof_index(void) const;
+    uint64_t                      addressof_callbacks(void) const;
+    uint32_t                      sizeof_zero_fill(void) const;
+    uint32_t                      characteristics(void) const;
+    const std::vector<uint8_t>&   data_template(void) const;
+
+    DataDirectory&                directory(void);
+    const DataDirectory&          directory(void) const;
+
+    Section&                      section(void);
+    const Section&                section(void) const;
+
+    void callbacks(const std::vector<uint64_t>& callbacks);
+    void addressof_raw_data(std::pair<uint64_t, uint64_t> VAOfRawData);
+    void addressof_index(uint64_t addressOfIndex);
+    void addressof_callbacks(uint64_t addressOfCallbacks);
+    void sizeof_zero_fill(uint32_t sizeOfZeroFill);
+    void characteristics(uint32_t characteristics);
+    void data_template(const std::vector<uint8_t>& dataTemplate);
+
+    virtual void accept(Visitor& visitor) const override;
+
+    bool operator==(const TLS& rhs) const;
+    bool operator!=(const TLS& rhs) const;
+
+    DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const TLS& entry);
+
+  private:
+    std::vector<uint64_t>         callbacks_;
+    std::pair<uint64_t, uint64_t> VAOfRawData_;
+    uint64_t                      addressof_index_;
+    uint64_t                      addressof_callbacks_;
+    uint32_t                      sizeof_zero_fill_;
+    uint32_t                      characteristics_;
+    DataDirectory*                directory_;
+    Section*                      section_;
+    std::vector<uint8_t>          data_template_;
+
+};
+}
+}
+#endif
diff --git a/include/LIEF/PE/enums.hpp.in b/include/LIEF/PE/enums.hpp.in
new file mode 100644
index 0000000..5ae263b
--- /dev/null
+++ b/include/LIEF/PE/enums.hpp.in
@@ -0,0 +1,13 @@
+#ifndef LIEF_PE_ENUMS_H_
+#define LIEF_PE_ENUMS_H_
+
+#include "LIEF/PE/undef.h"
+
+namespace LIEF {
+namespace PE {
+
+@LIEF_PE_ENUMS@
+
+}
+}
+#endif
diff --git a/include/LIEF/PE/enums.inc b/include/LIEF/PE/enums.inc
new file mode 100644
index 0000000..243765c
--- /dev/null
+++ b/include/LIEF/PE/enums.inc
@@ -0,0 +1,369 @@
+
+enum MACHINE_TYPES {
+  MT_Invalid = 0xffff,
+  IMAGE_FILE_MACHINE_UNKNOWN   = 0x0,
+  IMAGE_FILE_MACHINE_AM33      = 0x13,   /**< Matsushita AM33               */
+  IMAGE_FILE_MACHINE_AMD64     = 0x8664, /**< AMD x64                        */
+  IMAGE_FILE_MACHINE_ARM       = 0x1C0,  /**< ARM little endian              */
+  IMAGE_FILE_MACHINE_ARMNT     = 0x1C4,  /**< ARMv7 Thumb mode only          */
+  IMAGE_FILE_MACHINE_ARM64     = 0xAA64, /**< ARMv8 in 64-bits mode          */
+  IMAGE_FILE_MACHINE_EBC       = 0xEBC,  /**< EFI byte code                  */
+  IMAGE_FILE_MACHINE_I386      = 0x14C,  /**< Intel 386 or later             */
+  IMAGE_FILE_MACHINE_IA64      = 0x200,  /**< Intel Itanium processor family */
+  IMAGE_FILE_MACHINE_M32R      = 0x9041, /**< Mitsubishi M32R little endian  */
+  IMAGE_FILE_MACHINE_MIPS16    = 0x266,  /**< MIPS16                         */
+  IMAGE_FILE_MACHINE_MIPSFPU   = 0x366,  /**< MIPS with FPU                  */
+  IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466,  /**< MIPS16 with FPU                */
+  IMAGE_FILE_MACHINE_POWERPC   = 0x1F0,  /**< Power PC little endian         */
+  IMAGE_FILE_MACHINE_POWERPCFP = 0x1F1,  /**< Power PC with floating point   */
+  IMAGE_FILE_MACHINE_R4000     = 0x166,  /**< MIPS with little endian        */
+  IMAGE_FILE_MACHINE_SH3       = 0x1A2,  /**< Hitachi SH3                    */
+  IMAGE_FILE_MACHINE_SH3DSP    = 0x1A3,  /**< Hitachi SH3 DSP                */
+  IMAGE_FILE_MACHINE_SH4       = 0x1A6,  /**< Hitachi SH4                    */
+  IMAGE_FILE_MACHINE_SH5       = 0x1A8,  /**< Hitachi SH5                    */
+  IMAGE_FILE_MACHINE_THUMB     = 0x1C2,  /**< ARM or Thumb                   */
+  IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169   /**< MIPS little-endian WCE v2      */
+};
+
+enum SYMBOL_SECTION_NUMBER {
+  IMAGE_SYM_DEBUG     = -2,
+  IMAGE_SYM_ABSOLUTE  = -1,
+  IMAGE_SYM_UNDEFINED = 0
+};
+
+
+enum HEADER_CHARACTERISTICS {
+  IMAGE_FILE_INVALID                 = 0x0000,
+  IMAGE_FILE_RELOCS_STRIPPED         = 0x0001, /**< The file does not contain base relocations and must be loaded at its preferred base. If this cannot be done, the loader will error.*/
+  IMAGE_FILE_EXECUTABLE_IMAGE        = 0x0002, /**< The file is valid and can be run.*/
+  IMAGE_FILE_LINE_NUMS_STRIPPED      = 0x0004, /**< COFF line numbers have been stripped. This is deprecated and should be 0*/
+  IMAGE_FILE_LOCAL_SYMS_STRIPPED     = 0x0008, /**< COFF symbol table entries for local symbols have been removed. This is deprecated and should be 0.*/
+  IMAGE_FILE_AGGRESSIVE_WS_TRIM      = 0x0010, /**< Aggressively trim working set. This is deprecated and must be 0.*/
+  IMAGE_FILE_LARGE_ADDRESS_AWARE     = 0x0020, /**< Image can handle > 2GiB addresses. */
+  IMAGE_FILE_BYTES_REVERSED_LO       = 0x0080, /**< Little endian: the LSB precedes the MSB in memory. This is deprecated and should be 0.*/
+  IMAGE_FILE_32BIT_MACHINE           = 0x0100, /**< Machine is based on a 32bit word architecture. */
+  IMAGE_FILE_DEBUG_STRIPPED          = 0x0200, /**< Debugging info has been removed. */
+  IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400, /**< If the image is on removable media, fully load it and copy it to swap. */
+  IMAGE_FILE_NET_RUN_FROM_SWAP       = 0x0800, /**< If the image is on network media, fully load it and copy it to swap. */
+  IMAGE_FILE_SYSTEM                  = 0x1000, /**< The image file is a system file, not a user program.*/
+  IMAGE_FILE_DLL                     = 0x2000, /**< The image file is a DLL. */
+  IMAGE_FILE_UP_SYSTEM_ONLY          = 0x4000, /**< This file should only be run on a uniprocessor machine. */
+  IMAGE_FILE_BYTES_REVERSED_HI       = 0x8000  /**< Big endian: the MSB precedes the LSB in memory. This is deprecated */
+};
+
+
+/// Storage class tells where and what the symbol represents
+enum SYMBOL_STORAGE_CLASS {
+  IMAGE_SYM_CLASS_INVALID = 0xFF,
+
+  IMAGE_SYM_CLASS_END_OF_FUNCTION  = -1,  ///< Physical end of function
+  IMAGE_SYM_CLASS_NULL             = 0,   ///< No symbol
+  IMAGE_SYM_CLASS_AUTOMATIC        = 1,   ///< Stack variable
+  IMAGE_SYM_CLASS_EXTERNAL         = 2,   ///< External symbol
+  IMAGE_SYM_CLASS_STATIC           = 3,   ///< Static
+  IMAGE_SYM_CLASS_REGISTER         = 4,   ///< Register variable
+  IMAGE_SYM_CLASS_EXTERNAL_DEF     = 5,   ///< External definition
+  IMAGE_SYM_CLASS_LABEL            = 6,   ///< Label
+  IMAGE_SYM_CLASS_UNDEFINED_LABEL  = 7,   ///< Undefined label
+  IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 8,   ///< Member of structure
+  IMAGE_SYM_CLASS_ARGUMENT         = 9,   ///< Function argument
+  IMAGE_SYM_CLASS_STRUCT_TAG       = 10,  ///< Structure tag
+  IMAGE_SYM_CLASS_MEMBER_OF_UNION  = 11,  ///< Member of union
+  IMAGE_SYM_CLASS_UNION_TAG        = 12,  ///< Union tag
+  IMAGE_SYM_CLASS_TYPE_DEFINITION  = 13,  ///< Type definition
+  IMAGE_SYM_CLASS_UNDEFINED_STATIC = 14,  ///< Undefined static
+  IMAGE_SYM_CLASS_ENUM_TAG         = 15,  ///< Enumeration tag
+  IMAGE_SYM_CLASS_MEMBER_OF_ENUM   = 16,  ///< Member of enumeration
+  IMAGE_SYM_CLASS_REGISTER_PARAM   = 17,  ///< Register parameter
+  IMAGE_SYM_CLASS_BIT_FIELD        = 18,  ///< Bit field ".bb" or ".eb" - beginning or end of block
+  IMAGE_SYM_CLASS_BLOCK            = 100, ///< ".bf" or ".ef" - beginning or end of function
+  IMAGE_SYM_CLASS_FUNCTION         = 101,
+  IMAGE_SYM_CLASS_END_OF_STRUCT    = 102, ///< End of structure
+  IMAGE_SYM_CLASS_FILE             = 103, ///< File name line number, reformatted as symbol
+  IMAGE_SYM_CLASS_SECTION          = 104,
+  IMAGE_SYM_CLASS_WEAK_EXTERNAL    = 105, ///< Duplicate tag external symbol in dmert public lib
+  IMAGE_SYM_CLASS_CLR_TOKEN        = 107
+};
+
+
+enum SYMBOL_BASE_TYPES {
+  IMAGE_SYM_TYPE_NULL   = 0,  ///< No type information or unknown base type.
+  IMAGE_SYM_TYPE_VOID   = 1,  ///< Used with void pointers and functions.
+  IMAGE_SYM_TYPE_CHAR   = 2,  ///< A character (signed byte).
+  IMAGE_SYM_TYPE_SHORT  = 3,  ///< A 2-byte signed integer.
+  IMAGE_SYM_TYPE_INT    = 4,  ///< A natural integer type on the target.
+  IMAGE_SYM_TYPE_LONG   = 5,  ///< A 4-byte signed integer.
+  IMAGE_SYM_TYPE_FLOAT  = 6,  ///< A 4-byte floating-point number.
+  IMAGE_SYM_TYPE_DOUBLE = 7,  ///< An 8-byte floating-point number.
+  IMAGE_SYM_TYPE_STRUCT = 8,  ///< A structure.
+  IMAGE_SYM_TYPE_UNION  = 9,  ///< An union.
+  IMAGE_SYM_TYPE_ENUM   = 10, ///< An enumerated type.
+  IMAGE_SYM_TYPE_MOE    = 11, ///< A member of enumeration (a specific value).
+  IMAGE_SYM_TYPE_BYTE   = 12, ///< A byte; unsigned 1-byte integer.
+  IMAGE_SYM_TYPE_WORD   = 13, ///< A word; unsigned 2-byte integer.
+  IMAGE_SYM_TYPE_UINT   = 14, ///< An unsigned integer of natural size.
+  IMAGE_SYM_TYPE_DWORD  = 15  ///< An unsigned 4-byte integer.
+};
+
+enum SYMBOL_COMPLEX_TYPES {
+  IMAGE_SYM_DTYPE_NULL     = 0, ///< No complex type; simple scalar variable.
+  IMAGE_SYM_DTYPE_POINTER  = 1, ///< A pointer to base type.
+  IMAGE_SYM_DTYPE_FUNCTION = 2, ///< A function that returns a base type.
+  IMAGE_SYM_DTYPE_ARRAY    = 3, ///< An array of base type.
+  SCT_COMPLEX_TYPE_SHIFT   = 4  ///< Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
+};
+
+enum AuxSymbolType {
+  IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1
+};
+
+
+enum RELOCATIONS_BASE_TYPES {
+  IMAGE_REL_BASED_ABSOLUTE       = 0,
+  IMAGE_REL_BASED_HIGH           = 1,
+  IMAGE_REL_BASED_LOW            = 2,
+  IMAGE_REL_BASED_HIGHLOW        = 3,
+  IMAGE_REL_BASED_HIGHADJ        = 4,
+  IMAGE_REL_BASED_MIPS_JMPADDR   = 5,
+  IMAGE_REL_BASED_SECTION        = 6,
+  IMAGE_REL_BASED_REL            = 7,
+  IMAGE_REL_BASED_MIPS_JMPADDR16 = 9,
+  IMAGE_REL_BASED_IA64_IMM64     = 9,
+  IMAGE_REL_BASED_DIR64          = 10,
+  IMAGE_REL_BASED_HIGH3ADJ       = 11,
+};
+
+enum RELOCATIONS_I386 {
+  IMAGE_REL_I386_ABSOLUTE = 0x0000,
+  IMAGE_REL_I386_DIR16    = 0x0001,
+  IMAGE_REL_I386_REL16    = 0x0002,
+  IMAGE_REL_I386_DIR32    = 0x0006,
+  IMAGE_REL_I386_DIR32NB  = 0x0007,
+  IMAGE_REL_I386_SEG12    = 0x0009,
+  IMAGE_REL_I386_SECTION  = 0x000A,
+  IMAGE_REL_I386_SECREL   = 0x000B,
+  IMAGE_REL_I386_TOKEN    = 0x000C,
+  IMAGE_REL_I386_SECREL7  = 0x000D,
+  IMAGE_REL_I386_REL32    = 0x0014
+};
+
+enum RELOCATIONS_AMD64 {
+  IMAGE_REL_AMD64_ABSOLUTE = 0x0000,
+  IMAGE_REL_AMD64_ADDR64   = 0x0001,
+  IMAGE_REL_AMD64_ADDR32   = 0x0002,
+  IMAGE_REL_AMD64_ADDR32NB = 0x0003,
+  IMAGE_REL_AMD64_REL32    = 0x0004,
+  IMAGE_REL_AMD64_REL32_1  = 0x0005,
+  IMAGE_REL_AMD64_REL32_2  = 0x0006,
+  IMAGE_REL_AMD64_REL32_3  = 0x0007,
+  IMAGE_REL_AMD64_REL32_4  = 0x0008,
+  IMAGE_REL_AMD64_REL32_5  = 0x0009,
+  IMAGE_REL_AMD64_SECTION  = 0x000A,
+  IMAGE_REL_AMD64_SECREL   = 0x000B,
+  IMAGE_REL_AMD64_SECREL7  = 0x000C,
+  IMAGE_REL_AMD64_TOKEN    = 0x000D,
+  IMAGE_REL_AMD64_SREL32   = 0x000E,
+  IMAGE_REL_AMD64_PAIR     = 0x000F,
+  IMAGE_REL_AMD64_SSPAN32  = 0x0010
+};
+
+enum RELOCATIONS_ARM {
+  IMAGE_REL_ARM_ABSOLUTE  = 0x0000,
+  IMAGE_REL_ARM_ADDR32    = 0x0001,
+  IMAGE_REL_ARM_ADDR32NB  = 0x0002,
+  IMAGE_REL_ARM_BRANCH24  = 0x0003,
+  IMAGE_REL_ARM_BRANCH11  = 0x0004,
+  IMAGE_REL_ARM_TOKEN     = 0x0005,
+  IMAGE_REL_ARM_BLX24     = 0x0008,
+  IMAGE_REL_ARM_BLX11     = 0x0009,
+  IMAGE_REL_ARM_SECTION   = 0x000E,
+  IMAGE_REL_ARM_SECREL    = 0x000F,
+  IMAGE_REL_ARM_MOV32A    = 0x0010,
+  IMAGE_REL_ARM_MOV32T    = 0x0011,
+  IMAGE_REL_ARM_BRANCH20T = 0x0012,
+  IMAGE_REL_ARM_BRANCH24T = 0x0014,
+  IMAGE_REL_ARM_BLX23T    = 0x0015
+};
+
+
+/// These are not documented in the spec, but are located in WinNT.h.
+enum WeakExternalCharacteristics {
+  IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1,
+  IMAGE_WEAK_EXTERN_SEARCH_LIBRARY   = 2,
+  IMAGE_WEAK_EXTERN_SEARCH_ALIAS     = 3
+};
+
+
+enum DATA_DIRECTORY {
+  EXPORT_TABLE            = 0,
+  IMPORT_TABLE            = 1,
+  RESOURCE_TABLE          = 2,
+  EXCEPTION_TABLE         = 3,
+  CERTIFICATE_TABLE       = 4,
+  BASE_RELOCATION_TABLE   = 5,
+  DEBUG                   = 6,
+  ARCHITECTURE            = 7,
+  GLOBAL_PTR              = 8,
+  TLS_TABLE               = 9,
+  LOAD_CONFIG_TABLE       = 10,
+  BOUND_IMPORT            = 11,
+  IAT                     = 12,
+  DELAY_IMPORT_DESCRIPTOR = 13,
+  CLR_RUNTIME_HEADER      = 14,
+
+  NUM_DATA_DIRECTORIES    = 15
+};
+
+
+enum SUBSYSTEM {
+  IMAGE_SUBSYSTEM_UNKNOWN                  = 0,  ///< An unknown subsystem.
+  IMAGE_SUBSYSTEM_NATIVE                   = 1,  ///< Device drivers and native Windows processes
+  IMAGE_SUBSYSTEM_WINDOWS_GUI              = 2,  ///< The Windows GUI subsystem.
+  IMAGE_SUBSYSTEM_WINDOWS_CUI              = 3,  ///< The Windows character subsystem.
+  IMAGE_SUBSYSTEM_OS2_CUI                  = 5,  ///< The OS/2 character subsytem.
+  IMAGE_SUBSYSTEM_POSIX_CUI                = 7,  ///< The POSIX character subsystem.
+  IMAGE_SUBSYSTEM_NATIVE_WINDOWS           = 8,  ///< Native Windows 9x driver.
+  IMAGE_SUBSYSTEM_WINDOWS_CE_GUI           = 9,  ///< Windows CE.
+  IMAGE_SUBSYSTEM_EFI_APPLICATION          = 10, ///< An EFI application.
+  IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER  = 11, ///< An EFI driver with boot services.
+  IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER       = 12, ///< An EFI driver with run-time services.
+  IMAGE_SUBSYSTEM_EFI_ROM                  = 13, ///< An EFI ROM image.
+  IMAGE_SUBSYSTEM_XBOX                     = 14, ///< XBOX.
+  IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16  ///< A BCD application.
+};
+
+enum DLL_CHARACTERISTICS {
+  IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA       = 0x0020, ///< ASLR with 64 bit address space.
+  IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE          = 0x0040, ///< DLL can be relocated at load time.
+  IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY       = 0x0080, ///< Code integrity checks are enforced.
+  IMAGE_DLL_CHARACTERISTICS_NX_COMPAT             = 0x0100, ///< Image is NX compatible.
+  IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION          = 0x0200, ///< Isolation aware, but do not isolate the image.
+  IMAGE_DLL_CHARACTERISTICS_NO_SEH                = 0x0400, ///< Does not use structured exception handling (SEH). No SEH handler may be called in this image.
+  IMAGE_DLL_CHARACTERISTICS_NO_BIND               = 0x0800, ///< Do not bind the image.
+  IMAGE_DLL_CHARACTERISTICS_APPCONTAINER          = 0x1000, ///< Image should execute in an AppContainer.
+  IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER            = 0x2000, ///< A WDM driver.
+  IMAGE_DLL_CHARACTERISTICS_GUARD_CF              = 0x4000, ///< Image supports Control Flow Guard.
+  IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000  ///< Terminal Server aware.
+};
+
+
+enum DEBUG_TYPES {
+  IMAGE_DEBUG_TYPE_UNKNOWN       = 0,
+  IMAGE_DEBUG_TYPE_COFF          = 1,
+  IMAGE_DEBUG_TYPE_CODEVIEW      = 2,
+  IMAGE_DEBUG_TYPE_FPO           = 3,
+  IMAGE_DEBUG_TYPE_MISC          = 4,
+  IMAGE_DEBUG_TYPE_EXCEPTION     = 5,
+  IMAGE_DEBUG_TYPE_FIXUP         = 6,
+  IMAGE_DEBUG_TYPE_OMAP_TO_SRC   = 7,
+  IMAGE_DEBUG_TYPE_OMAP_FROM_SRC = 8,
+  IMAGE_DEBUG_TYPE_BORLAND       = 9,
+  IMAGE_DEBUG_TYPE_CLSID         = 11
+};
+
+enum ImportType {
+  IMPORT_CODE  = 0,
+  IMPORT_DATA  = 1,
+  IMPORT_CONST = 2
+};
+
+
+enum ImportNameType {
+  /// Import is by ordinal. This indicates that the value in the Ordinal/Hint
+  /// field of the import header is the import's ordinal. If this constant is
+  /// not specified, then the Ordinal/Hint field should always be interpreted
+  /// as the import's hint.
+  IMPORT_ORDINAL         = 0,
+  /// The import name is identical to the public symbol name
+  IMPORT_NAME            = 1,
+  /// The import name is the public symbol name, but skipping the leading ?,
+  /// @, or optionally _.
+  IMPORT_NAME_NOPREFIX   = 2,
+  /// The import name is the public symbol name, but skipping the leading ?,
+  /// @, or optionally _, and truncating at the first @.
+  IMPORT_NAME_UNDECORATE = 3
+};
+
+
+enum CodeViewIdentifiers {
+  DEBUG_LINE_TABLES_HAVE_COLUMN_RECORDS = 0x1,
+  DEBUG_SECTION_MAGIC = 0x4,
+  DEBUG_SYMBOL_SUBSECTION = 0xF1,
+  DEBUG_LINE_TABLE_SUBSECTION = 0xF2,
+  DEBUG_STRING_TABLE_SUBSECTION = 0xF3,
+  DEBUG_INDEX_SUBSECTION = 0xF4,
+
+  // Symbol subsections are split into records of different types.
+  DEBUG_SYMBOL_TYPE_PROC_START = 0x1147,
+  DEBUG_SYMBOL_TYPE_PROC_END = 0x114F
+};
+
+
+//
+// Resources
+//
+enum RESOURCE_TYPES {
+  CURSOR       = 1,
+  BITMAP       = 2,
+  ICON         = 3,
+  MENU         = 4,
+  DIALOG       = 5,
+  STRING       = 6,
+  FONTDIR      = 7,
+  FONT         = 8,
+  ACCELERATOR  = 9,
+  RCDATA       = 10,
+  MESSAGETABLE = 11,
+  GROUP_CURSOR = 12,
+  GROUP_ICON   = 13,
+  VERSION      = 14,
+  DLGINCLUDE   = 15,
+  PLUGPLAY     = 16,
+  VXD          = 17,
+  ANICURSOR    = 18,
+  ANIICON      = 19,
+  HTML         = 20,
+  MANIFEST     = 21
+};
+
+
+enum SECTION_CHARACTERISTICS {
+  SC_Invalid = 0xffffffff,
+
+  IMAGE_SCN_TYPE_NO_PAD            = 0x00000008,
+  IMAGE_SCN_CNT_CODE               = 0x00000020,
+  IMAGE_SCN_CNT_INITIALIZED_DATA   = 0x00000040,
+  IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080,
+  IMAGE_SCN_LNK_OTHER              = 0x00000100,
+  IMAGE_SCN_LNK_INFO               = 0x00000200,
+  IMAGE_SCN_LNK_REMOVE             = 0x00000800,
+  IMAGE_SCN_LNK_COMDAT             = 0x00001000,
+  IMAGE_SCN_GPREL                  = 0x00008000,
+  IMAGE_SCN_MEM_PURGEABLE          = 0x00020000,
+  IMAGE_SCN_MEM_16BIT              = 0x00020000,
+  IMAGE_SCN_MEM_LOCKED             = 0x00040000,
+  IMAGE_SCN_MEM_PRELOAD            = 0x00080000,
+  IMAGE_SCN_ALIGN_1BYTES           = 0x00100000,
+  IMAGE_SCN_ALIGN_2BYTES           = 0x00200000,
+  IMAGE_SCN_ALIGN_4BYTES           = 0x00300000,
+  IMAGE_SCN_ALIGN_8BYTES           = 0x00400000,
+  IMAGE_SCN_ALIGN_16BYTES          = 0x00500000,
+  IMAGE_SCN_ALIGN_32BYTES          = 0x00600000,
+  IMAGE_SCN_ALIGN_64BYTES          = 0x00700000,
+  IMAGE_SCN_ALIGN_128BYTES         = 0x00800000,
+  IMAGE_SCN_ALIGN_256BYTES         = 0x00900000,
+  IMAGE_SCN_ALIGN_512BYTES         = 0x00A00000,
+  IMAGE_SCN_ALIGN_1024BYTES        = 0x00B00000,
+  IMAGE_SCN_ALIGN_2048BYTES        = 0x00C00000,
+  IMAGE_SCN_ALIGN_4096BYTES        = 0x00D00000,
+  IMAGE_SCN_ALIGN_8192BYTES        = 0x00E00000,
+  IMAGE_SCN_LNK_NRELOC_OVFL        = 0x01000000,
+  IMAGE_SCN_MEM_DISCARDABLE        = 0x02000000,
+  IMAGE_SCN_MEM_NOT_CACHED         = 0x04000000,
+  IMAGE_SCN_MEM_NOT_PAGED          = 0x08000000,
+  IMAGE_SCN_MEM_SHARED             = 0x10000000,
+  IMAGE_SCN_MEM_EXECUTE            = 0x20000000,
+  IMAGE_SCN_MEM_READ               = 0x40000000,
+  IMAGE_SCN_MEM_WRITE              = 0x80000000
+};
+
diff --git a/include/LIEF/PE/signature/AuthenticatedAttributes.hpp b/include/LIEF/PE/signature/AuthenticatedAttributes.hpp
new file mode 100644
index 0000000..5326c50
--- /dev/null
+++ b/include/LIEF/PE/signature/AuthenticatedAttributes.hpp
@@ -0,0 +1,69 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_AUTHENTICATED_ATTRIBUTES_H_
+#define LIEF_PE_AUTHENTICATED_ATTRIBUTES_H_
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/signature/types.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+
+class DLL_PUBLIC AuthenticatedAttributes : public Visitable {
+
+  friend class Parser;
+
+  public:
+  AuthenticatedAttributes(void);
+  AuthenticatedAttributes(const AuthenticatedAttributes&);
+  AuthenticatedAttributes& operator=(const AuthenticatedAttributes&);
+
+  //! @brief Should return the ``messageDigest`` OID
+  const oid_t& content_type(void) const;
+
+  //! @brief Return an hash of the signed attributes
+  const std::vector<uint8_t>& message_digest(void) const;
+
+  //! @brief Return the program description (if any)
+  const std::u16string& program_name(void) const;
+
+  //! @brief Return an URL to website with more information about the signer
+  const std::string& more_info(void) const;
+
+  virtual void accept(Visitor& visitor) const override;
+
+  virtual ~AuthenticatedAttributes(void);
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const AuthenticatedAttributes& authenticated_attributes);
+
+  private:
+  oid_t content_type_; // should holds 1.2.840.113549.1.9.4
+
+  std::vector<uint8_t> message_digest_;
+
+  std::u16string program_name_;
+  std::string    more_info_;
+
+};
+
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/signature/ContentInfo.hpp b/include/LIEF/PE/signature/ContentInfo.hpp
new file mode 100644
index 0000000..cfe754e
--- /dev/null
+++ b/include/LIEF/PE/signature/ContentInfo.hpp
@@ -0,0 +1,72 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_CONTENT_INFO_H_
+#define LIEF_PE_CONTENT_INFO_H_
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/signature/types.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+
+class DLL_PUBLIC ContentInfo : public Visitable {
+
+  friend class Parser;
+
+  public:
+  ContentInfo(void);
+  ContentInfo(const ContentInfo&);
+  ContentInfo& operator=(const ContentInfo&);
+
+  //! @brief OID of the content type.
+  //! This value should match ``SPC_INDIRECT_DATA_OBJID``
+  const oid_t& content_type(void) const;
+
+  const oid_t& type(void) const;
+
+  //! @brief Algorithm (OID) used to hash the file.
+  //! This value should match SignerInfo::digest_algorithm and Signature::digest_algorithm
+  const oid_t& digest_algorithm(void) const;
+
+  //! @brief The digest
+  const std::vector<uint8_t>& digest(void) const;
+
+  virtual void accept(Visitor& visitor) const override;
+
+  virtual ~ContentInfo(void);
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const ContentInfo& content_info);
+
+  private:
+  oid_t content_type_; // SPC_INDIRECT_DATA_OBJID
+
+  oid_t type_;         // SPC_PE_IMAGE_DATAOBJ
+  //TODO: value
+
+  oid_t digest_algorithm_; // algorithm used to hash the file (should match Signature::digest_algorithms_)
+  std::vector<uint8_t> digest_; //hash value
+
+
+};
+
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/signature/OIDToString.hpp b/include/LIEF/PE/signature/OIDToString.hpp
new file mode 100644
index 0000000..dced8e9
--- /dev/null
+++ b/include/LIEF/PE/signature/OIDToString.hpp
@@ -0,0 +1,30 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_OID_TO_STRING_H_
+#define LIEF_PE_OID_TO_STRING_H_
+#include "LIEF/visibility.h"
+#include "LIEF/PE/signature/types.hpp"
+
+namespace LIEF {
+namespace PE {
+
+//! @brief Convert an OID to a human-readable string
+DLL_PUBLIC const char* oid_to_string(const oid_t& oid);
+
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/signature/Signature.hpp b/include/LIEF/PE/signature/Signature.hpp
new file mode 100644
index 0000000..d85081c
--- /dev/null
+++ b/include/LIEF/PE/signature/Signature.hpp
@@ -0,0 +1,84 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_SIGNATURE_H_
+#define LIEF_PE_SIGNATURE_H_
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/signature/x509.hpp"
+#include "LIEF/PE/signature/SignerInfo.hpp"
+#include "LIEF/PE/signature/ContentInfo.hpp"
+
+#include "LIEF/PE/signature/types.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class DLL_PUBLIC Signature : public Visitable {
+
+  friend class Parser;
+
+  public:
+  Signature(void);
+  Signature(const Signature&);
+  Signature& operator=(const Signature&);
+
+  //! @brief Should be 1
+  uint32_t version(void) const;
+
+  //! @brief Return the algorithm (OID) used to
+  //! sign the content of ContentInfo
+  const oid_t& digest_algorithm(void) const;
+
+  //! @brief Return the ContentInfo
+  const ContentInfo& content_info(void) const;
+
+  //! @brief Return an iterator over x509 certificates
+  it_const_crt certificates(void) const;
+
+  //! @brief Return the SignerInfo object
+  const SignerInfo& signer_info(void) const;
+
+  //! @brief Return the raw original signature
+  const std::vector<uint8_t>& original_signature(void) const;
+
+  virtual void accept(Visitor& visitor) const override;
+
+  virtual ~Signature(void);
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const Signature& signature);
+
+  private:
+
+  uint32_t          version_;
+  oid_t             digest_algorithm_;
+  ContentInfo       content_info_;
+  std::vector<x509> certificates_;
+  SignerInfo        signer_info_;
+
+  std::vector<uint8_t> original_raw_signature_;
+
+
+
+};
+
+}
+}
+
+
+#endif
+
diff --git a/include/LIEF/PE/signature/SignerInfo.hpp b/include/LIEF/PE/signature/SignerInfo.hpp
new file mode 100644
index 0000000..1fd85b5
--- /dev/null
+++ b/include/LIEF/PE/signature/SignerInfo.hpp
@@ -0,0 +1,80 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_SIGNER_INFO_H_
+#define LIEF_PE_SIGNER_INFO_H_
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/signature/AuthenticatedAttributes.hpp"
+
+#include "LIEF/PE/signature/types.hpp"
+
+namespace LIEF {
+namespace PE {
+
+class Parser;
+
+class DLL_PUBLIC SignerInfo : public Visitable {
+
+  friend class Parser;
+
+  public:
+  SignerInfo(void);
+  SignerInfo(const SignerInfo&);
+  SignerInfo& operator=(const SignerInfo&);
+
+  //! @brief Should be 1
+  uint32_t version(void) const;
+
+  //! @brief Issuer and serial number
+  const issuer_t& issuer(void) const;
+
+  //! @brief Algorithm (OID) used to hash the file.
+  //! This value should match ContentInfo::digest_algorithm and Signature::digest_algorithm
+  const oid_t& digest_algorithm(void) const;
+
+  //! @brief Return the AuthenticatedAttributes object
+  const AuthenticatedAttributes& authenticated_attributes(void) const;
+
+  //! @brief Return the signature algorithm (OID)
+  const oid_t& signature_algorithm(void) const;
+
+  //! @brief Return the signature created by the signing
+  //! certificate's private key
+  const std::vector<uint8_t>& encrypted_digest(void) const;
+
+  virtual void accept(Visitor& visitor) const override;
+
+  virtual ~SignerInfo(void);
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const SignerInfo& signer_info);
+
+  private:
+  uint32_t                 version_;
+  issuer_t                 issuer_;
+  oid_t                    digest_algorithm_;
+
+  AuthenticatedAttributes authenticated_attributes_;
+  oid_t                   signature_algorithm_;
+  std::vector<uint8_t>    encrypted_digest_;
+
+};
+
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/signature/types.hpp b/include/LIEF/PE/signature/types.hpp
new file mode 100644
index 0000000..0a87537
--- /dev/null
+++ b/include/LIEF/PE/signature/types.hpp
@@ -0,0 +1,34 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_SIGNATURE_TYPES_H_
+#define LIEF_PE_SIGNATURE_TYPES_H_
+#include <string>
+#include <inttypes.h>
+#include <vector>
+
+#include "LIEF/iterators.hpp"
+
+namespace LIEF {
+namespace PE {
+class x509;
+
+using oid_t        = std::string;
+using issuer_t     = std::pair<std::vector<std::pair<std::string, std::string>>, std::vector<uint8_t>>;
+using it_const_crt = const_ref_iterator<const std::vector<x509>&>;
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/signature/x509.hpp b/include/LIEF/PE/signature/x509.hpp
new file mode 100644
index 0000000..f5adaad
--- /dev/null
+++ b/include/LIEF/PE/signature/x509.hpp
@@ -0,0 +1,83 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_X509_H_
+#define LIEF_PE_X509_H_
+#include <tuple>
+
+#include "LIEF/Visitable.hpp"
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/signature/types.hpp"
+
+struct mbedtls_x509_crt;
+
+namespace LIEF {
+namespace PE {
+
+
+class Parser;
+
+class DLL_PUBLIC x509 : public Visitable {
+
+  friend class Parser;
+
+  public:
+  //! @brief Tuple (Year, Month, Day, Hour, Minute, Second)
+  using date_t = std::tuple<uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, uint32_t>;
+
+  x509(mbedtls_x509_crt* ca);
+  x509(const x509& other);
+  x509& operator=(x509 other);
+  void swap(x509& other);
+
+  //! @brief X.509 version. (1=v1, 2=v2, 3=v3)
+  uint32_t version(void) const;
+
+  //! @brief Unique id for certificate issued by a specific CA.
+  std::vector<uint8_t> serial_number(void) const;
+
+  //! @brief Signature algorithm (OID)
+  oid_t signature_alogrithm(void) const;
+
+  //! @brief Start time of certificate validity
+  x509::date_t valid_from(void) const;
+
+  //! @brief End time of certificate validity
+  x509::date_t valid_to(void) const;
+
+  //! @brief Issuer informations
+  std::string issuer(void) const;
+
+  //! @brief Subject informations
+  std::string subject(void) const;
+
+
+  virtual void accept(Visitor& visitor) const override;
+
+  virtual ~x509(void);
+
+  DLL_PUBLIC friend std::ostream& operator<<(std::ostream& os, const x509& x509_cert);
+
+  private:
+  x509(void);
+  mbedtls_x509_crt *x509_cert_;
+
+};
+
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/structures.inc b/include/LIEF/PE/structures.inc
new file mode 100644
index 0000000..f991f32
--- /dev/null
+++ b/include/LIEF/PE/structures.inc
@@ -0,0 +1,313 @@
+//! The maximum number of sections that a COFF object can have (inclusive).
+static const int32_t MaxNumberOfSections16 = 65279;
+
+//! The PE signature bytes that follows the DOS stub header.
+static const char PE_Magic[] = { 'P', 'E', '\0', '\0' };
+
+static const char BigObjMagic[] = {
+  '\xc7', '\xa1', '\xba', '\xd1', '\xee', '\xba', '\xa9', '\x4b',
+  '\xaf', '\x20', '\xfa', '\xf6', '\x6a', '\xa4', '\xdc', '\xb8',
+};
+
+static const uint8_t DEFAULT_NUMBER_DATA_DIRECTORIES = 15;
+
+#pragma pack(push,1)
+struct pe_header {
+  char     signature[sizeof(PE_Magic)];
+  uint16_t Machine;
+  uint16_t NumberOfSections;
+  uint32_t TimeDateStamp;
+  uint32_t PointerToSymbolTable;
+  uint32_t NumberOfSymbols;
+  uint16_t SizeOfOptionalHeader;
+  uint16_t Characteristics;
+};
+
+
+struct pe_relocation {
+  uint32_t VirtualAddress;
+  uint32_t SymbolTableIndex;
+  uint16_t Type;
+};
+
+struct pe_base_relocation_block {
+  uint32_t PageRVA;
+  uint32_t BlockSize;
+};
+
+
+struct pe_symbol {
+  union {
+    char ShortName[8];
+    struct
+		{
+	    uint32_t Zeroes;
+			uint32_t Offset;
+    } Name;
+  } Name;
+  uint32_t Value;
+  int16_t  SectionNumber;
+  uint16_t Type;
+  uint8_t  StorageClass;
+  uint8_t  NumberOfAuxSymbols;
+};
+
+
+struct pe_section {
+  char     Name[8];
+  uint32_t VirtualSize;
+  uint32_t VirtualAddress;
+  uint32_t SizeOfRawData;
+  uint32_t PointerToRawData;
+  uint32_t PointerToRelocations;
+  uint32_t PointerToLineNumbers;
+  uint16_t NumberOfRelocations;
+  uint16_t NumberOfLineNumbers;
+  uint32_t Characteristics;
+};
+
+struct AuxiliaryFunctionDefinition {
+  uint32_t TagIndex;
+  uint32_t TotalSize;
+  uint32_t PointerToLinenumber;
+  uint32_t PointerToNextFunction;
+  char     unused[2];
+};
+
+struct AuxiliarybfAndefSymbol {
+  uint8_t  unused1[4];
+  uint16_t Linenumber;
+  uint8_t  unused2[6];
+  uint32_t PointerToNextFunction;
+  uint8_t  unused3[2];
+};
+
+struct AuxiliaryWeakExternal {
+  uint32_t TagIndex;
+  uint32_t Characteristics;
+  uint8_t  unused[10];
+};
+
+
+struct AuxiliarySectionDefinition {
+  uint32_t Length;
+  uint16_t NumberOfRelocations;
+  uint16_t NumberOfLinenumbers;
+  uint32_t CheckSum;
+  uint32_t Number;
+  uint8_t  Selection;
+  char     unused;
+};
+
+struct AuxiliaryCLRToken {
+  uint8_t  AuxType;
+  uint8_t  unused1;
+  uint32_t SymbolTableIndex;
+  char     unused2[12];
+};
+
+union Auxiliary {
+  AuxiliaryFunctionDefinition FunctionDefinition;
+  AuxiliarybfAndefSymbol      bfAndefSymbol;
+  AuxiliaryWeakExternal       WeakExternal;
+  AuxiliarySectionDefinition  SectionDefinition;
+};
+
+
+/// @brief The Import Directory Table.
+///
+/// There is a single array of these and one entry per imported DLL.
+struct pe_import {
+  uint32_t ImportLookupTableRVA;
+  uint32_t TimeDateStamp;
+  uint32_t ForwarderChain;
+  uint32_t NameRVA;
+  uint32_t ImportAddressTableRVA;
+};
+
+
+struct ImportLookupTableEntry32 {
+  uint32_t data;
+};
+
+struct ImportLookupTableEntry64 {
+  uint64_t data;
+};
+
+
+struct pe32_tls {
+  uint32_t RawDataStartVA;
+  uint32_t RawDataEndVA;
+  uint32_t AddressOfIndex;
+  uint32_t AddressOfCallback;
+  uint32_t SizeOfZeroFill;
+  uint32_t Characteristics;
+};
+
+
+struct pe64_tls {
+  uint64_t RawDataStartVA;
+  uint64_t RawDataEndVA;
+  uint64_t AddressOfIndex;
+  uint64_t AddressOfCallback;
+  uint32_t SizeOfZeroFill;
+  uint32_t Characteristics;
+};
+
+
+/// @brief The DOS compatible header at the front of all PEs.
+struct pe_dos_header {
+  uint16_t Magic;
+  uint16_t UsedBytesInTheLastPage;
+  uint16_t FileSizeInPages;
+  uint16_t NumberOfRelocationItems;
+  uint16_t HeaderSizeInParagraphs;
+  uint16_t MinimumExtraParagraphs;
+  uint16_t MaximumExtraParagraphs;
+  uint16_t InitialRelativeSS;
+  uint16_t InitialSP;
+  uint16_t Checksum;
+  uint16_t InitialIP;
+  uint16_t InitialRelativeCS;
+  uint16_t AddressOfRelocationTable;
+  uint16_t OverlayNumber;
+  uint16_t Reserved[4];
+  uint16_t OEMid;
+  uint16_t OEMinfo;
+  uint16_t Reserved2[10];
+  uint32_t AddressOfNewExeHeader;
+};
+
+struct pe64_optional_header {
+  uint16_t Magic;
+  uint8_t  MajorLinkerVersion;
+  uint8_t  MinorLinkerVersion;
+  uint32_t SizeOfCode;
+  uint32_t SizeOfInitializedData;
+  uint32_t SizeOfUninitializedData;
+  uint32_t AddressOfEntryPoint; // RVA
+  uint32_t BaseOfCode; // RVA
+  //uint32_t BaseOfData; // RVA
+  uint64_t ImageBase;
+  uint32_t SectionAlignment;
+  uint32_t FileAlignment;
+  uint16_t MajorOperatingSystemVersion;
+  uint16_t MinorOperatingSystemVersion;
+  uint16_t MajorImageVersion;
+  uint16_t MinorImageVersion;
+  uint16_t MajorSubsystemVersion;
+  uint16_t MinorSubsystemVersion;
+  uint32_t Win32VersionValue;
+  uint32_t SizeOfImage;
+  uint32_t SizeOfHeaders;
+  uint32_t CheckSum;
+  uint16_t Subsystem;
+  uint16_t DLLCharacteristics;
+  uint64_t SizeOfStackReserve;
+  uint64_t SizeOfStackCommit;
+  uint64_t SizeOfHeapReserve;
+  uint64_t SizeOfHeapCommit;
+  uint32_t LoaderFlags;
+  uint32_t NumberOfRvaAndSize;
+};
+
+
+struct pe32_optional_header {
+  uint16_t Magic;
+  uint8_t  MajorLinkerVersion;
+  uint8_t  MinorLinkerVersion;
+  uint32_t SizeOfCode;
+  uint32_t SizeOfInitializedData;
+  uint32_t SizeOfUninitializedData;
+  uint32_t AddressOfEntryPoint; // RVA
+  uint32_t BaseOfCode; // RVA
+  uint32_t BaseOfData; // RVA
+  uint32_t ImageBase;
+  uint32_t SectionAlignment;
+  uint32_t FileAlignment;
+  uint16_t MajorOperatingSystemVersion;
+  uint16_t MinorOperatingSystemVersion;
+  uint16_t MajorImageVersion;
+  uint16_t MinorImageVersion;
+  uint16_t MajorSubsystemVersion;
+  uint16_t MinorSubsystemVersion;
+  uint32_t Win32VersionValue;
+  uint32_t SizeOfImage;
+  uint32_t SizeOfHeaders;
+  uint32_t CheckSum;
+  uint16_t Subsystem;
+  uint16_t DLLCharacteristics;
+  uint32_t SizeOfStackReserve;
+  uint32_t SizeOfStackCommit;
+  uint32_t SizeOfHeapReserve;
+  uint32_t SizeOfHeapCommit;
+  uint32_t LoaderFlags;
+  uint32_t NumberOfRvaAndSize;
+};
+
+
+struct pe_data_directory {
+  uint32_t RelativeVirtualAddress;
+  uint32_t Size;
+};
+
+
+struct pe_debug {
+  uint32_t Characteristics;
+  uint32_t TimeDateStamp;
+  uint16_t MajorVersion;
+  uint16_t MinorVersion;
+  uint32_t Type;
+  uint32_t SizeOfData;
+  uint32_t AddressOfRawData;
+  uint32_t PointerToRawData;
+};
+
+
+struct pe_resource_directory_table {
+  uint32_t Characteristics;
+  uint32_t TimeDateStamp;
+  uint16_t MajorVersion;
+  uint16_t MinorVersion;
+  uint16_t NumberOfNameEntries;
+  uint16_t NumberOfIDEntries;
+};
+
+struct pe_resource_directory_entries {
+  union {
+    uint32_t NameRVA;
+    uint32_t IntegerID;
+  } NameID;
+  uint32_t RVA;
+};
+
+struct pe_resource_data_entry {
+  uint32_t DataRVA;
+  uint32_t Size;
+  uint32_t Codepage;
+  uint32_t Reserved;
+};
+
+struct pe_resource_string {
+  int16_t Length;
+  uint16_t Name[1];
+};
+
+
+//
+// Export structures
+//
+struct pe_export_directory_table {
+  uint32_t ExportFlags;           ///< Reserverd must be 0
+  uint32_t Timestamp;             ///< The time and date that the export data was created
+  uint16_t MajorVersion;          ///< The Major version number
+  uint16_t MinorVersion;          ///< The Minor version number
+  uint32_t NameRVA;               ///< The address of the ASCII DLL's name (RVA)
+  uint32_t OrdinalBase;           ///< The starting ordinal number for exports. (Usually 1)
+  uint32_t AddressTableEntries;   ///< Number of entries in the export address table
+  uint32_t NumberOfNamePointers;  ///< Number of entries in the name pointer table
+  uint32_t ExportAddressTableRVA; ///< Address of the export address table (RVA)
+  uint32_t NamePointerRVA;        ///< Address of the name pointer table (RVA)
+  uint32_t OrdinalTableRVA;       ///< Address of the ordinal table (RVA)
+};
+#pragma pack(pop)
diff --git a/include/LIEF/PE/type_traits.hpp b/include/LIEF/PE/type_traits.hpp
new file mode 100644
index 0000000..baf25bf
--- /dev/null
+++ b/include/LIEF/PE/type_traits.hpp
@@ -0,0 +1,66 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_TYPE_TRAITS_H_
+#define LIEF_PE_TYPE_TRAITS_H_
+#include <vector>
+#include "LIEF/iterators.hpp"
+
+namespace LIEF {
+namespace PE {
+class Section;
+class DataDirectory;
+class Relocation;
+class Import;
+class ImportEntry;
+class Symbol;
+class ExportEntry;
+
+using sections_t                = std::vector<Section*>;
+using it_sections               = ref_iterator<sections_t>;
+using it_const_sections         = const_ref_iterator<sections_t>;
+
+using data_directories_t        = std::vector<DataDirectory*>;
+using it_data_directories       = ref_iterator<data_directories_t>;
+using it_const_data_directories = const_ref_iterator<data_directories_t>;
+
+using relocations_t             = std::vector<Relocation>;
+using it_relocations            = ref_iterator<relocations_t&>;
+using it_const_relocations      = const_ref_iterator<const relocations_t&>;
+
+using imports_t                 = std::vector<Import>;
+using it_imports                = ref_iterator<imports_t&>;
+using it_const_imports          = const_ref_iterator<const imports_t&>;
+
+using import_entries_t          = std::vector<ImportEntry>;
+using it_import_entries         = ref_iterator<import_entries_t&>;
+using it_const_import_entries   = const_ref_iterator<const import_entries_t&>;
+
+using export_entries_t          = std::vector<ExportEntry>;
+using it_export_entries         = ref_iterator<export_entries_t&>;
+using it_const_export_entries   = const_ref_iterator<const export_entries_t&>;
+
+using symbols_t                 = std::vector<Symbol>;
+using it_symbols                = ref_iterator<symbols_t&>;
+using it_const_symbols          = const_ref_iterator<const symbols_t&>;
+
+using strings_table_t           = std::vector<std::string>;
+using it_strings_table          = ref_iterator<strings_table_t&>;
+using it_const_strings_table    = const_ref_iterator<const strings_table_t&>;
+
+}
+}
+
+#endif
diff --git a/include/LIEF/PE/undef.h b/include/LIEF/PE/undef.h
new file mode 100644
index 0000000..ea82618
--- /dev/null
+++ b/include/LIEF/PE/undef.h
@@ -0,0 +1,277 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_UNDEF_H_
+#define LIEF_PE_UNDEF_H_
+
+
+#undef IMAGE_FILE_MACHINE_UNKNOWN
+#undef IMAGE_FILE_MACHINE_AM33
+#undef IMAGE_FILE_MACHINE_AMD64
+#undef IMAGE_FILE_MACHINE_ARM
+#undef IMAGE_FILE_MACHINE_ARMNT
+#undef IMAGE_FILE_MACHINE_ARM64
+#undef IMAGE_FILE_MACHINE_EBC
+#undef IMAGE_FILE_MACHINE_I386
+#undef IMAGE_FILE_MACHINE_IA64
+#undef IMAGE_FILE_MACHINE_M32R
+#undef IMAGE_FILE_MACHINE_MIPS16
+#undef IMAGE_FILE_MACHINE_MIPSFPU
+#undef IMAGE_FILE_MACHINE_MIPSFPU16
+#undef IMAGE_FILE_MACHINE_POWERPC
+#undef IMAGE_FILE_MACHINE_POWERPCFP
+#undef IMAGE_FILE_MACHINE_R4000
+#undef IMAGE_FILE_MACHINE_SH3
+#undef IMAGE_FILE_MACHINE_SH3DSP
+#undef IMAGE_FILE_MACHINE_SH4
+#undef IMAGE_FILE_MACHINE_SH5
+#undef IMAGE_FILE_MACHINE_THUMB
+#undef IMAGE_FILE_MACHINE_WCEMIPSV2
+
+#undef IMAGE_SYM_DEBUG
+#undef IMAGE_SYM_ABSOLUTE
+#undef IMAGE_SYM_UNDEFINED
+
+
+#undef IMAGE_FILE_INVALID
+#undef IMAGE_FILE_RELOCS_STRIPPED
+#undef IMAGE_FILE_EXECUTABLE_IMAGE
+#undef IMAGE_FILE_LINE_NUMS_STRIPPED
+#undef IMAGE_FILE_LOCAL_SYMS_STRIPPED
+#undef IMAGE_FILE_AGGRESSIVE_WS_TRIM
+#undef IMAGE_FILE_LARGE_ADDRESS_AWARE
+#undef IMAGE_FILE_BYTES_REVERSED_LO
+#undef IMAGE_FILE_32BIT_MACHINE
+#undef IMAGE_FILE_DEBUG_STRIPPED
+#undef IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
+#undef IMAGE_FILE_NET_RUN_FROM_SWAP
+#undef IMAGE_FILE_SYSTEM
+#undef IMAGE_FILE_DLL
+#undef IMAGE_FILE_UP_SYSTEM_ONLY
+#undef IMAGE_FILE_BYTES_REVERSED_HI
+
+#undef IMAGE_SYM_CLASS_END_OF_FUNCTION
+#undef IMAGE_SYM_CLASS_NULL
+#undef IMAGE_SYM_CLASS_AUTOMATIC
+#undef IMAGE_SYM_CLASS_EXTERNAL
+#undef IMAGE_SYM_CLASS_STATIC
+#undef IMAGE_SYM_CLASS_REGISTER
+#undef IMAGE_SYM_CLASS_EXTERNAL_DEF
+#undef IMAGE_SYM_CLASS_LABEL
+#undef IMAGE_SYM_CLASS_UNDEFINED_LABEL
+#undef IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
+#undef IMAGE_SYM_CLASS_ARGUMENT
+#undef IMAGE_SYM_CLASS_STRUCT_TAG
+#undef IMAGE_SYM_CLASS_MEMBER_OF_UNION
+#undef IMAGE_SYM_CLASS_UNION_TAG
+#undef IMAGE_SYM_CLASS_TYPE_DEFINITION
+#undef IMAGE_SYM_CLASS_UNDEFINED_STATIC
+#undef IMAGE_SYM_CLASS_ENUM_TAG
+#undef IMAGE_SYM_CLASS_MEMBER_OF_ENUM
+#undef IMAGE_SYM_CLASS_REGISTER_PARAM
+#undef IMAGE_SYM_CLASS_BIT_FIELD
+#undef IMAGE_SYM_CLASS_BLOCK
+#undef IMAGE_SYM_CLASS_FUNCTION
+#undef IMAGE_SYM_CLASS_END_OF_STRUCT
+#undef IMAGE_SYM_CLASS_FILE
+#undef IMAGE_SYM_CLASS_SECTION
+#undef IMAGE_SYM_CLASS_WEAK_EXTERNAL
+#undef IMAGE_SYM_CLASS_CLR_TOKEN
+
+#undef IMAGE_SYM_TYPE_NULL
+#undef IMAGE_SYM_TYPE_VOID
+#undef IMAGE_SYM_TYPE_CHAR
+#undef IMAGE_SYM_TYPE_SHORT
+#undef IMAGE_SYM_TYPE_INT
+#undef IMAGE_SYM_TYPE_LONG
+#undef IMAGE_SYM_TYPE_FLOAT
+#undef IMAGE_SYM_TYPE_DOUBLE
+#undef IMAGE_SYM_TYPE_STRUCT
+#undef IMAGE_SYM_TYPE_UNION
+#undef IMAGE_SYM_TYPE_ENUM
+#undef IMAGE_SYM_TYPE_MOE
+#undef IMAGE_SYM_TYPE_BYTE
+#undef IMAGE_SYM_TYPE_WORD
+#undef IMAGE_SYM_TYPE_UINT
+#undef IMAGE_SYM_TYPE_DWORD
+
+
+
+#undef IMAGE_SYM_DTYPE_NULL
+#undef IMAGE_SYM_DTYPE_POINTER
+#undef IMAGE_SYM_DTYPE_FUNCTION
+#undef IMAGE_SYM_DTYPE_ARRAY
+#undef SCT_COMPLEX_TYPE_SHIFT
+
+#undef IMAGE_REL_BASED_ABSOLUTE
+#undef IMAGE_REL_BASED_HIGH
+#undef IMAGE_REL_BASED_LOW
+#undef IMAGE_REL_BASED_HIGHLOW
+#undef IMAGE_REL_BASED_HIGHADJ
+#undef IMAGE_REL_BASED_MIPS_JMPADDR
+#undef IMAGE_REL_BASED_SECTION
+#undef IMAGE_REL_BASED_REL
+#undef IMAGE_REL_BASED_MIPS_JMPADDR16
+#undef IMAGE_REL_BASED_IA64_IMM64
+#undef IMAGE_REL_BASED_DIR64
+#undef IMAGE_REL_BASED_HIGH3ADJ
+
+#undef IMAGE_REL_I386_ABSOLUTE
+#undef IMAGE_REL_I386_DIR16
+#undef IMAGE_REL_I386_REL16
+#undef IMAGE_REL_I386_DIR32
+#undef IMAGE_REL_I386_DIR32NB
+#undef IMAGE_REL_I386_SEG12
+#undef IMAGE_REL_I386_SECTION
+#undef IMAGE_REL_I386_SECREL
+#undef IMAGE_REL_I386_TOKEN
+#undef IMAGE_REL_I386_SECREL7
+#undef IMAGE_REL_I386_REL32
+
+#undef IMAGE_REL_AMD64_ABSOLUTE
+#undef IMAGE_REL_AMD64_ADDR64
+#undef IMAGE_REL_AMD64_ADDR32
+#undef IMAGE_REL_AMD64_ADDR32NB
+#undef IMAGE_REL_AMD64_REL32
+#undef IMAGE_REL_AMD64_REL32_1
+#undef IMAGE_REL_AMD64_REL32_2
+#undef IMAGE_REL_AMD64_REL32_3
+#undef IMAGE_REL_AMD64_REL32_4
+#undef IMAGE_REL_AMD64_REL32_5
+#undef IMAGE_REL_AMD64_SECTION
+#undef IMAGE_REL_AMD64_SECREL
+#undef IMAGE_REL_AMD64_SECREL7
+#undef IMAGE_REL_AMD64_TOKEN
+#undef IMAGE_REL_AMD64_SREL32
+#undef IMAGE_REL_AMD64_PAIR
+#undef IMAGE_REL_AMD64_SSPAN32
+
+#undef IMAGE_REL_ARM_ABSOLUTE
+#undef IMAGE_REL_ARM_ADDR32
+#undef IMAGE_REL_ARM_ADDR32NB
+#undef IMAGE_REL_ARM_BRANCH24
+#undef IMAGE_REL_ARM_BRANCH11
+#undef IMAGE_REL_ARM_TOKEN
+#undef IMAGE_REL_ARM_BLX24
+#undef IMAGE_REL_ARM_BLX11
+#undef IMAGE_REL_ARM_SECTION
+#undef IMAGE_REL_ARM_SECREL
+#undef IMAGE_REL_ARM_MOV32A
+#undef IMAGE_REL_ARM_MOV32T
+#undef IMAGE_REL_ARM_BRANCH20T
+#undef IMAGE_REL_ARM_BRANCH24T
+#undef IMAGE_REL_ARM_BLX23T
+
+
+#undef IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY
+#undef IMAGE_WEAK_EXTERN_SEARCH_LIBRARY
+#undef IMAGE_WEAK_EXTERN_SEARCH_ALIAS
+
+
+#undef EXPORT_TABLE
+#undef IMPORT_TABLE
+#undef RESOURCE_TABLE
+#undef EXCEPTION_TABLE
+#undef CERTIFICATE_TABLE
+#undef BASE_RELOCATION_TABLE
+#undef DEBUG
+#undef ARCHITECTURE
+#undef GLOBAL_PTR
+#undef TLS_TABLE
+#undef LOAD_CONFIG_TABLE
+#undef BOUND_IMPORT
+#undef IAT
+#undef DELAY_IMPORT_DESCRIPTOR
+#undef CLR_RUNTIME_HEADER
+#undef NUM_DATA_DIRECTORIES
+
+#undef IMAGE_SUBSYSTEM_UNKNOWN
+#undef IMAGE_SUBSYSTEM_NATIVE
+#undef IMAGE_SUBSYSTEM_WINDOWS_GUI
+#undef IMAGE_SUBSYSTEM_WINDOWS_CUI
+#undef IMAGE_SUBSYSTEM_OS2_CUI
+#undef IMAGE_SUBSYSTEM_POSIX_CUI
+#undef IMAGE_SUBSYSTEM_NATIVE_WINDOWS
+#undef IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
+#undef IMAGE_SUBSYSTEM_EFI_APPLICATION
+#undef IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
+#undef IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
+#undef IMAGE_SUBSYSTEM_EFI_ROM
+#undef IMAGE_SUBSYSTEM_XBOX
+#undef IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
+
+
+
+#undef IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA
+#undef IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE
+#undef IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY
+#undef IMAGE_DLL_CHARACTERISTICS_NX_COMPAT
+#undef IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION
+#undef IMAGE_DLL_CHARACTERISTICS_NO_SEH
+#undef IMAGE_DLL_CHARACTERISTICS_NO_BIND
+#undef IMAGE_DLL_CHARACTERISTICS_APPCONTAINER
+#undef IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER
+#undef IMAGE_DLL_CHARACTERISTICS_GUARD_CF
+#undef IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE
+
+#undef IMAGE_DEBUG_TYPE_UNKNOWN
+#undef IMAGE_DEBUG_TYPE_COFF
+#undef IMAGE_DEBUG_TYPE_CODEVIEW
+#undef IMAGE_DEBUG_TYPE_FPO
+#undef IMAGE_DEBUG_TYPE_MISC
+#undef IMAGE_DEBUG_TYPE_EXCEPTION
+#undef IMAGE_DEBUG_TYPE_FIXUP
+#undef IMAGE_DEBUG_TYPE_OMAP_TO_SRC
+#undef IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
+#undef IMAGE_DEBUG_TYPE_BORLAND
+#undef IMAGE_DEBUG_TYPE_CLSID
+
+#undef IMAGE_SCN_TYPE_NO_PAD
+#undef IMAGE_SCN_CNT_CODE
+#undef IMAGE_SCN_CNT_INITIALIZED_DATA
+#undef IMAGE_SCN_CNT_UNINITIALIZED_DATA
+#undef IMAGE_SCN_LNK_OTHER
+#undef IMAGE_SCN_LNK_INFO
+#undef IMAGE_SCN_LNK_REMOVE
+#undef IMAGE_SCN_LNK_COMDAT
+#undef IMAGE_SCN_GPREL
+#undef IMAGE_SCN_MEM_PURGEABLE
+#undef IMAGE_SCN_MEM_16BIT
+#undef IMAGE_SCN_MEM_LOCKED
+#undef IMAGE_SCN_MEM_PRELOAD
+#undef IMAGE_SCN_ALIGN_1BYTES
+#undef IMAGE_SCN_ALIGN_2BYTES
+#undef IMAGE_SCN_ALIGN_4BYTES
+#undef IMAGE_SCN_ALIGN_8BYTES
+#undef IMAGE_SCN_ALIGN_16BYTES
+#undef IMAGE_SCN_ALIGN_32BYTES
+#undef IMAGE_SCN_ALIGN_64BYTES
+#undef IMAGE_SCN_ALIGN_128BYTES
+#undef IMAGE_SCN_ALIGN_256BYTES
+#undef IMAGE_SCN_ALIGN_512BYTES
+#undef IMAGE_SCN_ALIGN_1024BYTES
+#undef IMAGE_SCN_ALIGN_2048BYTES
+#undef IMAGE_SCN_ALIGN_4096BYTES
+#undef IMAGE_SCN_ALIGN_8192BYTES
+#undef IMAGE_SCN_LNK_NRELOC_OVFL
+#undef IMAGE_SCN_MEM_DISCARDABLE
+#undef IMAGE_SCN_MEM_NOT_CACHED
+#undef IMAGE_SCN_MEM_NOT_PAGED
+#undef IMAGE_SCN_MEM_SHARED
+#undef IMAGE_SCN_MEM_EXECUTE
+#undef IMAGE_SCN_MEM_READ
+#undef IMAGE_SCN_MEM_WRITE
+
+#endif
diff --git a/include/LIEF/PE/utils.hpp b/include/LIEF/PE/utils.hpp
new file mode 100644
index 0000000..766723c
--- /dev/null
+++ b/include/LIEF/PE/utils.hpp
@@ -0,0 +1,47 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_UTILS_H_
+#define LIEF_PE_UTILS_H_
+
+#include <list>
+#include <string>
+#include <locale>
+#include <memory>
+
+#include "LIEF/visibility.h"
+
+#include "LIEF/PE/Section.hpp"
+
+namespace LIEF {
+namespace PE {
+
+//! @brief check if the `file` is a PE file
+DLL_PUBLIC bool is_pe(const std::string& file);
+
+//! @brief check if the raw data is a PE file
+DLL_PUBLIC bool is_pe(const std::vector<uint8_t>& raw);
+
+//! @brief if the `file` is PE, return `PE32` or `PE32+`
+DLL_PUBLIC PE_TYPE get_type(const std::string& file);
+
+//! @brief Return `PE32` or `PE32+`
+DLL_PUBLIC PE_TYPE get_type(const std::vector<uint8_t>& raw);
+
+//! Convert a UTF-16 string to a UTF-8 one
+DLL_PUBLIC std::string u16tou8(const std::u16string& string);
+}
+}
+#endif
diff --git a/include/LIEF/Visitable.hpp b/include/LIEF/Visitable.hpp
new file mode 100644
index 0000000..2a59e4f
--- /dev/null
+++ b/include/LIEF/Visitable.hpp
@@ -0,0 +1,33 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_VISITABLE_H_
+#define LIEF_VISITABLE_H_
+
+#include "LIEF/Visitor.hpp"
+
+namespace LIEF {
+
+class Visitable {
+  public:
+  Visitable(void);
+  Visitable(const Visitable& other);
+  Visitable& operator=(const Visitable& other);
+  virtual ~Visitable(void);
+  virtual void accept(Visitor& visitor) const = 0;
+};
+}
+
+#endif
diff --git a/include/LIEF/Visitor.hpp b/include/LIEF/Visitor.hpp
new file mode 100644
index 0000000..040e7d0
--- /dev/null
+++ b/include/LIEF/Visitor.hpp
@@ -0,0 +1,334 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_VISITOR_H_
+#define LIEF_VISITOR_H_
+
+#include <set>
+#include <vector>
+#include <array>
+#include <string>
+#include <functional>
+#include <iostream>
+
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+
+// Forward declarations
+// ====================
+
+class Binary;
+class Header;
+class Section;
+class Symbol;
+
+namespace ELF {
+class Binary;
+class Header;
+class Section;
+class Segment;
+class Relocation;
+
+class DynamicEntry;
+class DynamicEntryArray;
+class DynamicEntryLibrary;
+class DynamicSharedObject;
+class DynamicEntryRunPath;
+class DynamicEntryRpath;
+
+class Symbol;
+class SymbolVersion;
+class SymbolVersionAux;
+class SymbolVersionAuxRequirement;
+class SymbolVersionRequirement;
+class SymbolVersionDefinition;
+}
+
+namespace PE {
+class Binary;
+
+class DosHeader;
+class Header;
+class OptionalHeader;
+
+class DataDirectory;
+class Section;
+
+class Relocation;
+class RelocationEntry;
+
+class Export;
+class ExportEntry;
+
+class TLS;
+class Symbol;
+class Debug;
+
+class Import;
+class ImportEntry;
+
+class ResourceNode;
+class ResourceData;
+class ResourceDirectory;
+}
+
+namespace MachO {
+class Binary;
+
+class Header;
+
+class LoadCommand;
+class UUIDCommand;
+class SymbolCommand;
+class SegmentCommand;
+class Section;
+class MainCommand;
+class DynamicSymbolCommand;
+class DylinkerCommand;
+class DylibCommand;
+
+class Symbol;
+
+
+}
+// =====================
+
+
+class DLL_PUBLIC Visitor {
+  public:
+  Visitor(void);
+  virtual ~Visitor(void);
+
+  virtual void operator()(void);
+
+  template<typename Arg1, typename... Args>
+  void operator()(Arg1&& arg1, Args&&... args);
+
+  // Visit Fundamental types
+  // =======================
+  template<
+    typename T,
+    typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
+  void visit(T n) {
+    this->visit(static_cast<size_t>(n));
+  }
+
+  template<
+    typename T,
+    size_t N,
+    typename std::enable_if<std::is_integral<T>::value>::type* = nullptr>
+  void visit(const std::array<T, N>& array) {
+    for (const T& v : array) {
+      this->visit(static_cast<size_t>(v));
+    }
+  }
+
+  virtual void visit(size_t n);
+  virtual void visit(const std::string& str);
+  virtual void visit(const std::u16string& str);
+  virtual void visit(const std::vector<uint8_t>& raw);
+
+
+  // Abstract Part
+  // =============
+
+  //! @brief Method to visit a LIEF::Binary
+  virtual void visit(const Binary& binary);
+
+  //! @brief Method to visit a LIEF::Header
+  virtual void visit(const Header& header);
+
+  //! @brief Method to visit a LIEF::Section
+  virtual void visit(const Section& section);
+
+  //! @brief Method to visit a LIEF::Symbol
+  virtual void visit(const Symbol& symbol);
+
+  // ELF Part
+  // ========
+
+  //! @brief Method to visit a LIEF::ELF::Binary
+  virtual void visit(const ELF::Binary& binary);
+
+  //! @brief Method to visit a LIEF::ELF::Header
+  virtual void visit(const ELF::Header& header);
+
+  //! @brief Method to visit a LIEF::ELF::Section
+  virtual void visit(const ELF::Section& section);
+
+  //! @brief Method to visit a LIEF::ELF::Segment
+  virtual void visit(const ELF::Segment& segment);
+
+  //! @brief Method to visit a LIEF::ELF::Relocation
+  virtual void visit(const ELF::Relocation& relocation);
+
+  //! @brief Method to visit a LIEF::ELF::DynamicEntry
+  virtual void visit(const ELF::DynamicEntry& entry);
+
+  //! @brief Method to visit a LIEF::ELF::DynamicEntryArray
+  virtual void visit(const ELF::DynamicEntryArray& array);
+
+  //! @brief Method to visit a LIEF::ELF::DynamicEntryLibrary
+  virtual void visit(const ELF::DynamicEntryLibrary& library);
+
+  //! @brief Method to visit a LIEF::ELF::DynamicSharedObject
+  virtual void visit(const ELF::DynamicSharedObject& shared);
+
+  //! @brief Method to visit a LIEF::ELF::DynamicEntryRunPath
+  virtual void visit(const ELF::DynamicEntryRunPath& runpath);
+
+  //! @brief Method to visit a LIEF::ELF::DynamicEntryRpath
+  virtual void visit(const ELF::DynamicEntryRpath& rpath);
+
+  //! @brief Method to visit a LIEF::ELF::Symbol
+  virtual void visit(const ELF::Symbol& symbol);
+
+  //! @brief Method to visit a LIEF::ELF::SymbolVersion
+  virtual void visit(const ELF::SymbolVersion& sv);
+
+  //! @brief Method to visit a LIEF::ELF::SymbolVersionAux
+  virtual void visit(const ELF::SymbolVersionAux& sva);
+
+  //! @brief Method to visit a LIEF::ELF::SymbolVersionAuxRequirement
+  virtual void visit(const ELF::SymbolVersionAuxRequirement& svar);
+
+  //! @brief Method to visit a LIEF::ELF::SymbolVersionRequirement
+  virtual void visit(const ELF::SymbolVersionRequirement& svr);
+
+  //! @brief Method to visit a LIEF::ELF::SymbolVersionDefinition
+  virtual void visit(const ELF::SymbolVersionDefinition& svd);
+
+  // PE Part
+  // =======
+
+  //! @brief Method to visit a LIEF::PE::Binary
+  virtual void visit(const PE::Binary& binary);
+
+  //! @brief Method to visit a LIEF::PE::DosHeader
+  virtual void visit(const PE::DosHeader& dos_header);
+
+  //! @brief Method to visit a LIEF::PE::Header
+  virtual void visit(const PE::Header& header);
+
+  //! @brief Method to visit a LIEF::PE::OptionalHeader
+  virtual void visit(const PE::OptionalHeader& optional_header);
+
+  //! @brief Method to visit a LIEF::PE::DataDirectory
+  virtual void visit(const PE::DataDirectory& data_directory);
+
+  //! @brief Method to visit a LIEF::PE::TLS
+  virtual void visit(const PE::TLS& tls);
+
+  //! @brief Method to visit a LIEF::PE::Symbol
+  virtual void visit(const PE::Symbol& symbol);
+
+  //! @brief Method to visit a LIEF::PE::Relocation
+  virtual void visit(const PE::Relocation& relocation);
+
+  //! @brief Method to visit a LIEF::PE::RelocationEntry
+  virtual void visit(const PE::RelocationEntry& relocation_entry);
+
+  //! @brief Method to visit a LIEF::PE::Export
+  virtual void visit(const PE::Export& exp);
+
+  //! @brief Method to visit a LIEF::PE::ExportEntry
+  virtual void visit(const PE::ExportEntry& export_entry);
+
+  //! @brief Method to visit a LIEF::PE::Debug
+  virtual void visit(const PE::Debug& debug);
+
+  //! @brief Method to visit a LIEF::PE::Import
+  virtual void visit(const PE::Import& import);
+
+  //! @brief Method to visit a LIEF::PE::ImportEntry
+  virtual void visit(const PE::ImportEntry& import_entry);
+
+  //! @brief Method to visit a LIEF::PE::ResourceNode
+  virtual void visit(const PE::ResourceNode& node);
+
+  //! @brief Method to visit a LIEF::PE::ResourceData
+  virtual void visit(const PE::ResourceData& data);
+
+  //! @brief Method to visit a LIEF::PE::ResourceDirectory
+  virtual void visit(const PE::ResourceDirectory& directory);
+
+  // MachO part
+  // ==========
+
+  //! @brief Method to visit a LIEF::MachO::Binary
+  virtual void visit(const MachO::Binary& binary);
+
+  //! @brief Method to visit a LIEF::MachO::Header
+  virtual void visit(const MachO::Header& header);
+
+  //! @brief Method to visit a LIEF::MachO::LoadCommand
+  virtual void visit(const MachO::LoadCommand& load_command);
+
+  //! @brief Method to visit a LIEF::MachO::UUIDCommand
+  virtual void visit(const MachO::UUIDCommand& uuid_command);
+
+  //! @brief Method to visit a LIEF::MachO::SymbolCommand
+  virtual void visit(const MachO::SymbolCommand& symbol_command);
+
+  //! @brief Method to visit a LIEF::MachO::SegmentCommand
+  virtual void visit(const MachO::SegmentCommand& segment_command);
+
+  //! @brief Method to visit a LIEF::MachO::Section
+  virtual void visit(const MachO::Section& section);
+
+  //! @brief Method to visit a LIEF::MachO::MainCommand
+  virtual void visit(const MachO::MainCommand& main_command);
+
+  //! @brief Method to visit a LIEF::MachO::DynamicSymbolCommand
+  virtual void visit(const MachO::DynamicSymbolCommand& dyn_sym_cmd);
+
+  //! @brief Method to visit a LIEF::MachO::DylinkerCommand
+  virtual void visit(const MachO::DylinkerCommand& dylinker_command);
+
+  //! @brief Method to visit a LIEF::MachO::DylibCommand
+  virtual void visit(const MachO::DylibCommand& dylib_command);
+
+  //! @brief Method to visit a LIEF::MachO::Symbol
+  virtual void visit(const MachO::Symbol& symbol);
+
+
+  template<class T>
+  void dispatch(const T& obj);
+
+
+  private:
+  std::set<size_t> visited_;
+};
+
+
+
+template<typename Arg1, typename... Args>
+void Visitor::operator()(Arg1&& arg1, Args&&... args) {
+  this->dispatch(std::forward<Arg1>(arg1));
+  this->operator()(std::forward<Args>(args)... );
+}
+
+template<class T>
+void Visitor::dispatch(const T& obj) {
+  size_t hash = reinterpret_cast<size_t>(&obj);
+  if (this->visited_.find(hash) == std::end(this->visited_)) {
+    this->visited_.insert(hash);
+    this->visit(obj);
+  }
+}
+
+}
+#endif
diff --git a/include/LIEF/exception.hpp b/include/LIEF/exception.hpp
new file mode 100644
index 0000000..4328063
--- /dev/null
+++ b/include/LIEF/exception.hpp
@@ -0,0 +1,129 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_EXCEPTIONS_H_
+#define LIEF_EXCEPTIONS_H_
+
+#include <exception>
+#include <stdexcept>
+#include <string>
+
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+
+class DLL_PUBLIC exception : public std::exception {
+  public:
+
+    exception(const exception& other);
+    explicit exception(const std::string& msg);
+    explicit exception(const char* msg);
+    virtual const char* what(void) const noexcept override;
+    virtual ~exception() noexcept;
+
+  protected:
+    std::string msg_;
+
+};
+
+class DLL_PUBLIC bad_file : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC bad_format : public bad_file {
+  public:
+  using bad_file::bad_file;
+  using bad_file::what;
+};
+
+class DLL_PUBLIC not_implemented : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC not_supported : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC integrity_error : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC read_out_of_bound : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+  explicit read_out_of_bound(uint64_t offset, uint64_t size);
+  explicit read_out_of_bound(uint64_t offset);
+
+};
+
+class DLL_PUBLIC not_found : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC corrupted : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC conversion_error : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC type_error : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC builder_error : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC parser_error : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC pe_error : public exception {
+  public:
+  using exception::exception;
+  using exception::what;
+};
+
+class DLL_PUBLIC pe_bad_section_name : public pe_error {
+  public:
+  using pe_error::pe_error;
+  using pe_error::what;
+};
+
+} //namespace ELF
+#endif
diff --git a/include/LIEF/filesystem/filesystem.h b/include/LIEF/filesystem/filesystem.h
new file mode 100644
index 0000000..4629dbe
--- /dev/null
+++ b/include/LIEF/filesystem/filesystem.h
@@ -0,0 +1,8 @@
+#ifndef LIEF_FILESYSTEM_H_
+#define LIEF_FILESYSTEM_H_
+
+#include "resolver.h"
+#include "path.h"
+#include "fwd.h"
+
+#endif
diff --git a/include/LIEF/filesystem/fwd.h b/include/LIEF/filesystem/fwd.h
new file mode 100644
index 0000000..3552199
--- /dev/null
+++ b/include/LIEF/filesystem/fwd.h
@@ -0,0 +1,24 @@
+/*
+    fwd.h -- Forward declarations for path.h and resolver.h
+
+    Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch>
+
+    All rights reserved. Use of this source code is governed by a
+    BSD-style license that can be found in the LICENSE file.
+*/
+
+#pragma once
+
+#if !defined(NAMESPACE_BEGIN)
+#define NAMESPACE_BEGIN(name) namespace name {
+#endif
+#if !defined(NAMESPACE_END)
+#define NAMESPACE_END(name) }
+#endif
+
+NAMESPACE_BEGIN(filesystem)
+
+class path;
+class resolver;
+
+NAMESPACE_END(filesystem)
diff --git a/include/LIEF/filesystem/path.h b/include/LIEF/filesystem/path.h
new file mode 100644
index 0000000..a5b582c
--- /dev/null
+++ b/include/LIEF/filesystem/path.h
@@ -0,0 +1,339 @@
+/*
+    path.h -- A simple class for manipulating paths on Linux/Windows/Mac OS
+
+    Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch>
+
+    All rights reserved. Use of this source code is governed by a
+    BSD-style license that can be found in the LICENSE file.
+*/
+
+#pragma once
+
+#include "fwd.h"
+#include <string>
+#include <vector>
+#include <stdexcept>
+#include <sstream>
+#include <cctype>
+#include <cstdlib>
+#include <cerrno>
+#include <cstring>
+
+#if defined(_WIN32)
+# include <windows.h>
+#else
+# include <unistd.h>
+#endif
+#include <sys/stat.h>
+
+#if defined(__linux)
+# include <linux/limits.h>
+#endif
+
+NAMESPACE_BEGIN(filesystem)
+
+/**
+ * \brief Simple class for manipulating paths on Linux/Windows/Mac OS
+ *
+ * This class is just a temporary workaround to avoid the heavy boost
+ * dependency until boost::filesystem is integrated into the standard template
+ * library at some point in the future.
+ */
+class path {
+public:
+    enum path_type {
+        windows_path = 0,
+        posix_path = 1,
+#if defined(_WIN32)
+        native_path = windows_path
+#else
+        native_path = posix_path
+#endif
+    };
+
+    path() : m_type(native_path), m_absolute(false) { }
+
+    path(const path &path)
+        : m_type(path.m_type), m_path(path.m_path), m_absolute(path.m_absolute) {}
+
+    path(path &&path)
+        : m_type(path.m_type), m_path(std::move(path.m_path)),
+          m_absolute(path.m_absolute) {}
+
+    path(const char *string) { set(string); }
+
+    path(const std::string &string) { set(string); }
+
+#if defined(_WIN32)
+    path(const std::wstring &wstring) { set(wstring); }
+    path(const wchar_t *wstring) { set(wstring); }
+#endif
+
+    size_t length() const { return m_path.size(); }
+
+    bool empty() const { return m_path.empty(); }
+
+    bool is_absolute() const { return m_absolute; }
+
+    path make_absolute() const {
+#if !defined(_WIN32)
+        char temp[PATH_MAX];
+        if (realpath(str().c_str(), temp) == NULL)
+            throw std::runtime_error("Internal error in realpath(): " + std::string(strerror(errno)));
+        return path(temp);
+#else
+        std::wstring value = wstr(), out(MAX_PATH, '\0');
+        DWORD length = GetFullPathNameW(value.c_str(), MAX_PATH, &out[0], NULL);
+        if (length == 0)
+            throw std::runtime_error("Internal error in realpath(): " + std::to_string(GetLastError()));
+        return path(out.substr(0, length));
+#endif
+    }
+
+    bool exists() const {
+#if defined(_WIN32)
+        return GetFileAttributesW(wstr().c_str()) != INVALID_FILE_ATTRIBUTES;
+#else
+        struct stat sb;
+        return stat(str().c_str(), &sb) == 0;
+#endif
+    }
+
+    size_t file_size() const {
+#if defined(_WIN32)
+        struct _stati64 sb;
+        if (_wstati64(wstr().c_str(), &sb) != 0)
+            throw std::runtime_error("path::file_size(): cannot stat file \"" + str() + "\"!");
+#else
+        struct stat sb;
+        if (stat(str().c_str(), &sb) != 0)
+            throw std::runtime_error("path::file_size(): cannot stat file \"" + str() + "\"!");
+#endif
+        return (size_t) sb.st_size;
+    }
+
+    bool is_directory() const {
+#if defined(_WIN32)
+        DWORD result = GetFileAttributesW(wstr().c_str());
+        if (result == INVALID_FILE_ATTRIBUTES)
+            return false;
+        return (result & FILE_ATTRIBUTE_DIRECTORY) != 0;
+#else
+        struct stat sb;
+        if (stat(str().c_str(), &sb))
+            return false;
+        return S_ISDIR(sb.st_mode);
+#endif
+    }
+
+    bool is_file() const {
+#if defined(_WIN32)
+        DWORD attr = GetFileAttributesW(wstr().c_str());
+        return (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY) == 0);
+#else
+        struct stat sb;
+        if (stat(str().c_str(), &sb))
+            return false;
+        return S_ISREG(sb.st_mode);
+#endif
+    }
+
+    std::string extension() const {
+        const std::string &name = filename();
+        size_t pos = name.find_last_of(".");
+        if (pos == std::string::npos)
+            return "";
+        return name.substr(pos+1);
+    }
+
+    std::string filename() const {
+        if (empty())
+            return "";
+        const std::string &last = m_path[m_path.size()-1];
+        return last;
+    }
+
+    path parent_path() const {
+        path result;
+        result.m_absolute = m_absolute;
+
+        if (m_path.empty()) {
+            if (!m_absolute)
+                result.m_path.push_back("..");
+        } else {
+            size_t until = m_path.size() - 1;
+            for (size_t i = 0; i < until; ++i)
+                result.m_path.push_back(m_path[i]);
+        }
+        return result;
+    }
+
+    path operator/(const path &other) const {
+        if (other.m_absolute)
+            throw std::runtime_error("path::operator/(): expected a relative path!");
+        if (m_type != other.m_type)
+            throw std::runtime_error("path::operator/(): expected a path of the same type!");
+
+        path result(*this);
+
+        for (size_t i=0; i<other.m_path.size(); ++i)
+            result.m_path.push_back(other.m_path[i]);
+
+        return result;
+    }
+
+    std::string str(path_type type = native_path) const {
+        std::ostringstream oss;
+
+        if (m_type == posix_path && m_absolute)
+            oss << "/";
+
+        for (size_t i=0; i<m_path.size(); ++i) {
+            oss << m_path[i];
+            if (i+1 < m_path.size()) {
+                if (type == posix_path)
+                    oss << '/';
+                else
+                    oss << '\\';
+            }
+        }
+
+        return oss.str();
+    }
+
+    void set(const std::string &str, path_type type = native_path) {
+        m_type = type;
+        if (type == windows_path) {
+            m_path = tokenize(str, "/\\");
+            m_absolute = str.size() >= 2 && std::isalpha(str[0]) && str[1] == ':';
+        } else {
+            m_path = tokenize(str, "/");
+            m_absolute = !str.empty() && str[0] == '/';
+        }
+    }
+
+    path &operator=(const path &path) {
+        m_type = path.m_type;
+        m_path = path.m_path;
+        m_absolute = path.m_absolute;
+        return *this;
+    }
+
+    path &operator=(path &&path) {
+        if (this != &path) {
+            m_type = path.m_type;
+            m_path = std::move(path.m_path);
+            m_absolute = path.m_absolute;
+        }
+        return *this;
+    }
+
+    friend std::ostream &operator<<(std::ostream &os, const path &path) {
+        os << path.str();
+        return os;
+    }
+
+    bool remove_file() {
+#if !defined(_WIN32)
+        return std::remove(str().c_str()) == 0;
+#else
+        return DeleteFileW(wstr().c_str()) != 0;
+#endif
+    }
+
+    bool resize_file(size_t target_length) {
+#if !defined(_WIN32)
+        return ::truncate(str().c_str(), (off_t) target_length) == 0;
+#else
+        HANDLE handle = CreateFileW(wstr().c_str(), GENERIC_WRITE, 0, nullptr, 0, FILE_ATTRIBUTE_NORMAL, nullptr);
+        if (handle == INVALID_HANDLE_VALUE)
+            return false;
+        LARGE_INTEGER size;
+        size.QuadPart = (LONGLONG) target_length;
+        if (SetFilePointerEx(handle, size, NULL, FILE_BEGIN) == 0) {
+            CloseHandle(handle);
+            return false;
+        }
+        if (SetEndOfFile(handle) == 0) {
+            CloseHandle(handle);
+            return false;
+        }
+        CloseHandle(handle);
+        return true;
+#endif
+    }
+
+    static path getcwd() {
+#if !defined(_WIN32)
+        char temp[PATH_MAX];
+        if (::getcwd(temp, PATH_MAX) == NULL)
+            throw std::runtime_error("Internal error in getcwd(): " + std::string(strerror(errno)));
+        return path(temp);
+#else
+        std::wstring temp(MAX_PATH, '\0');
+        if (!_wgetcwd(&temp[0], MAX_PATH))
+            throw std::runtime_error("Internal error in getcwd(): " + std::to_string(GetLastError()));
+        return path(temp.c_str());
+#endif
+    }
+
+#if defined(_WIN32)
+    std::wstring wstr(path_type type = native_path) const {
+        std::string temp = str(type);
+        int size = MultiByteToWideChar(CP_UTF8, 0, &temp[0], (int)temp.size(), NULL, 0);
+        std::wstring result(size, 0);
+        MultiByteToWideChar(CP_UTF8, 0, &temp[0], (int)temp.size(), &result[0], size);
+        return result;
+    }
+
+
+    void set(const std::wstring &wstring, path_type type = native_path) {
+        std::string string;
+        if (!wstring.empty()) {
+            int size = WideCharToMultiByte(CP_UTF8, 0, &wstring[0], (int)wstring.size(),
+                            NULL, 0, NULL, NULL);
+            string.resize(size, 0);
+            WideCharToMultiByte(CP_UTF8, 0, &wstring[0], (int)wstring.size(),
+                                &string[0], size, NULL, NULL);
+        }
+        set(string, type);
+    }
+
+    path &operator=(const std::wstring &str) { set(str); return *this; }
+#endif
+
+    bool operator==(const path &p) const { return p.m_path == m_path; }
+    bool operator!=(const path &p) const { return p.m_path != m_path; }
+
+protected:
+    static std::vector<std::string> tokenize(const std::string &string, const std::string &delim) {
+        std::string::size_type lastPos = 0, pos = string.find_first_of(delim, lastPos);
+        std::vector<std::string> tokens;
+
+        while (lastPos != std::string::npos) {
+            if (pos != lastPos)
+                tokens.push_back(string.substr(lastPos, pos - lastPos));
+            lastPos = pos;
+            if (lastPos == std::string::npos || lastPos + 1 == string.length())
+                break;
+            pos = string.find_first_of(delim, ++lastPos);
+        }
+
+        return tokens;
+    }
+
+protected:
+    path_type m_type;
+    std::vector<std::string> m_path;
+    bool m_absolute;
+};
+
+inline bool create_directory(const path& p) {
+#if defined(_WIN32)
+    return CreateDirectoryW(p.wstr().c_str(), NULL) != 0;
+#else
+    return mkdir(p.str().c_str(), S_IRUSR | S_IWUSR | S_IXUSR) == 0;
+#endif
+}
+
+NAMESPACE_END(filesystem)
diff --git a/include/LIEF/filesystem/resolver.h b/include/LIEF/filesystem/resolver.h
new file mode 100644
index 0000000..0c75768
--- /dev/null
+++ b/include/LIEF/filesystem/resolver.h
@@ -0,0 +1,72 @@
+/*
+    resolver.h -- A simple class for cross-platform path resolution
+
+    Copyright (c) 2015 Wenzel Jakob <wenzel@inf.ethz.ch>
+
+    All rights reserved. Use of this source code is governed by a
+    BSD-style license that can be found in the LICENSE file.
+*/
+
+#pragma once
+
+#include "path.h"
+
+NAMESPACE_BEGIN(filesystem)
+
+/**
+ * \brief Simple class for resolving paths on Linux/Windows/Mac OS
+ *
+ * This convenience class looks for a file or directory given its name
+ * and a set of search paths. The implementation walks through the
+ * search paths in order and stops once the file is found.
+ */
+class resolver {
+public:
+    typedef std::vector<path>::iterator iterator;
+    typedef std::vector<path>::const_iterator const_iterator;
+
+    resolver() {
+        m_paths.push_back(path::getcwd());
+    }
+
+    size_t size() const { return m_paths.size(); }
+
+    iterator begin() { return m_paths.begin(); }
+    iterator end()   { return m_paths.end(); }
+
+    const_iterator begin() const { return m_paths.begin(); }
+    const_iterator end()   const { return m_paths.end(); }
+
+    void erase(iterator it) { m_paths.erase(it); }
+
+    void prepend(const path &path) { m_paths.insert(m_paths.begin(), path); }
+    void append(const path &path) { m_paths.push_back(path); }
+    const path &operator[](size_t index) const { return m_paths[index]; }
+    path &operator[](size_t index) { return m_paths[index]; }
+
+    path resolve(const path &value) const {
+        for (const_iterator it = m_paths.begin(); it != m_paths.end(); ++it) {
+            path combined = *it / value;
+            if (combined.exists())
+                return combined;
+        }
+        return value;
+    }
+
+    friend std::ostream &operator<<(std::ostream &os, const resolver &r) {
+        os << "resolver[" << std::endl;
+        for (size_t i = 0; i < r.m_paths.size(); ++i) {
+            os << "  \"" << r.m_paths[i] << "\"";
+            if (i + 1 < r.m_paths.size())
+                os << ",";
+            os << std::endl;
+        }
+        os << "]";
+        return os;
+    }
+
+private:
+    std::vector<path> m_paths;
+};
+
+NAMESPACE_END(filesystem)
diff --git a/include/LIEF/iostream.hpp b/include/LIEF/iostream.hpp
new file mode 100644
index 0000000..fa539eb
--- /dev/null
+++ b/include/LIEF/iostream.hpp
@@ -0,0 +1,54 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_OSTREAM_H_
+#define LIEF_OSTREAM_H_
+#include <istream>
+#include <streambuf>
+#include <cstdint>
+#include <vector>
+
+namespace LIEF {
+class vector_iostream {
+  public:
+
+  using pos_type = std::streampos;
+  using off_type = std::streamoff;
+
+  vector_iostream(void);
+  void reserve(size_t size);
+
+  vector_iostream& put(uint8_t c);
+  vector_iostream& write(const uint8_t* s, std::streamsize n);
+  vector_iostream& write(const std::vector<uint8_t>& s);
+  vector_iostream& write(std::vector<uint8_t>&& s);
+
+  vector_iostream& get(std::vector<uint8_t>& c);
+
+  vector_iostream& flush();
+
+  // seeks:
+  pos_type tellp(void);
+  vector_iostream& seekp(pos_type p);
+  vector_iostream& seekp(vector_iostream::off_type p, std::ios_base::seekdir dir);
+
+  const std::vector<uint8_t>& raw(void) const;
+
+  private:
+  pos_type             current_pos_;
+  std::vector<uint8_t> raw_;
+};
+}
+#endif
diff --git a/include/LIEF/iterators.hpp b/include/LIEF/iterators.hpp
new file mode 100644
index 0000000..a2f8649
--- /dev/null
+++ b/include/LIEF/iterators.hpp
@@ -0,0 +1,745 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ITERATORS_H_
+#define LIEF_ITERATORS_H_
+#include <iostream>
+#include <cmath>
+#include <iterator>
+#include <functional>
+#include <algorithm>
+#include <type_traits>
+
+#include "LIEF/exception.hpp"
+
+namespace LIEF {
+
+template<class T>
+using decay_t = typename std::decay<T>::type;
+
+
+// Iterator which return ref on container's values
+// ===============================================
+
+template<class T>
+class ref_iterator : public std::iterator<
+                     std::forward_iterator_tag,
+                     typename decay_t<T>::value_type,
+                     size_t,
+                     typename std::remove_pointer<typename decay_t<T>::value_type>::type*,
+                     typename std::remove_pointer<typename decay_t<T>::value_type>::type&> {
+  public:
+  using DT = decay_t<T>;
+
+  ref_iterator(T container) :
+    container_{std::forward<T>(container)}
+  {
+    this->it_ = std::begin(container_);
+  }
+
+  ref_iterator(const ref_iterator& copy) :
+    container_{copy.container_},
+    it_{std::begin(container_)}
+  {
+    size_t d = std::distance(const_cast<ref_iterator&>(copy).container_.begin(), copy.it_);
+    std::advance(this->it_, d);
+  }
+
+
+  ref_iterator operator=(ref_iterator other) {
+    this->swap(other);
+    return *this;
+  }
+
+  void swap(ref_iterator& other) {
+    std::swap(this->container_, other.container_);
+    std::swap(this->it_, other.it_);
+  }
+
+
+  ref_iterator& operator++(void) {
+    it_++;
+    return *this;
+  }
+
+  ref_iterator operator++(int) {
+    ref_iterator retval = *this;
+    ++(*this);
+    return retval;
+  }
+
+  ref_iterator& operator--(void) {
+    if (this->it_ != std::begin(container_)) {
+      this->it_--;
+    }
+    return *this;
+  }
+
+  ref_iterator operator--(int) {
+    ref_iterator retval = *this;
+    --(*this);
+    return retval;
+  }
+
+
+  ref_iterator& operator+=(const typename ref_iterator::difference_type& movement) {
+    std::advance(this->it_, movement);
+    return *this;
+  }
+
+
+  ref_iterator& operator-=(const typename ref_iterator::difference_type& movement) {
+    return (*this) += -movement;
+  }
+
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<std::is_pointer<U>::value, typename ref_iterator::reference>::type
+  operator[](typename ref_iterator::difference_type n) {
+    if (n < 0 or n >= this->size()) {
+      throw integrity_error(std::to_string(n) + " is out of bound");
+    }
+    auto it = std::begin(this->container_);
+    std::advance(it, n);
+
+    if (*it == nullptr) {
+      throw integrity_error("nullptr");
+    }
+    return **it;
+
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<not std::is_pointer<U>::value, typename ref_iterator::reference>::type
+  operator[](typename ref_iterator::difference_type n) {
+    if (n < 0 or n >= this->size()) {
+      throw integrity_error(std::to_string(n) + " is out of bound");
+    }
+    auto it = std::begin(this->container_);
+    std::advance(it, n);
+    return *it;
+  }
+
+  ref_iterator operator+(typename ref_iterator::difference_type n) const {
+    ref_iterator tmp = *this;
+    return tmp += n;
+  }
+
+
+  ref_iterator operator-(typename ref_iterator::difference_type n) const {
+    ref_iterator tmp = *this;
+    return tmp -= n;
+  }
+
+
+  typename ref_iterator::difference_type operator-(const ref_iterator& rhs) const {
+    return std::distance(rhs, *this);
+  }
+
+  bool operator<(const ref_iterator& rhs) const {
+    return (rhs - *this) > 0;
+  }
+
+
+  bool operator>(const ref_iterator& rhs) const {
+    return rhs < *this;
+  }
+
+
+  bool operator>=(const ref_iterator& rhs) const {
+    return not (*this < rhs);
+  }
+
+
+  bool operator<=(const ref_iterator& rhs) const {
+    return not (*this > rhs);
+  }
+
+  ref_iterator begin(void) {
+    return {this->container_};
+  }
+
+  ref_iterator end(void)  {
+    ref_iterator it = ref_iterator{this->container_};
+    it.it_ = std::end(it.container_);
+    return it;
+  }
+
+  bool operator==(const ref_iterator& other) const {
+    size_t d1 = static_cast<size_t>(std::distance(this->it_, const_cast<ref_iterator*>(this)->container_.end()));
+    size_t d2 = static_cast<size_t>(std::distance(other.it_, const_cast<ref_iterator&>(other).container_.end()));
+    return (this->size() == other.size() and d1 == d2);
+  }
+
+  bool operator!=(const ref_iterator& other) const {
+    return not (*this == other);
+  }
+
+  size_t size(void) const {
+    return this->container_.size();
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<std::is_pointer<U>::value, typename ref_iterator::reference>::type
+  operator*() {
+    if (*this->it_ == nullptr) {
+      throw integrity_error("nullptr");
+    }
+    return **it_;
+  }
+
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<std::is_pointer<U>::value, typename ref_iterator::pointer>::type
+  operator->() {
+    if (*this->it_ == nullptr) {
+      throw integrity_error("nullptr");
+    }
+    return *this->it_;
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<not std::is_pointer<U>::value, typename ref_iterator::reference>::type
+  operator*() {
+    return *(this->it_);
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<not std::is_pointer<U>::value, typename ref_iterator::pointer>::type
+  operator->() {
+    return &(*this->it_);
+  }
+
+  private:
+  T container_;
+  typename DT::iterator it_;
+};
+
+
+// Iterator which return const ref on container's values
+// =====================================================
+
+template<class T, class CT = typename std::add_const<T>::type>
+class const_ref_iterator : public std::iterator<
+                     std::forward_iterator_tag,
+                     const typename decay_t<T>::value_type,
+                     size_t,
+                     const typename std::remove_pointer<typename decay_t<T>::value_type>::type*,
+                     const typename std::remove_pointer<typename decay_t<T>::value_type>::type&> {
+  public:
+
+  using DT = decay_t<CT>;
+
+  const_ref_iterator(CT container) :
+    container_{std::forward<CT>(container)}
+  {
+    this->it_ = this->container_.cbegin();
+  }
+
+
+  const_ref_iterator(const const_ref_iterator& copy) :
+    container_{copy.container_},
+    it_{container_.cbegin()}
+  {
+    size_t d = std::distance(copy.container_.cbegin(), copy.it_);
+    std::advance(this->it_, d);
+  }
+
+  const_ref_iterator operator=(const_ref_iterator other) {
+    this->swap(other);
+    return *this;
+  }
+
+  void swap(const_ref_iterator& other) {
+    std::swap(this->container_, other.container_);
+    std::swap(this->it_, other.it_);
+  }
+
+
+
+  const_ref_iterator& operator++() {
+    it_++;
+    return *this;
+  }
+
+  const_ref_iterator operator++(int) {
+    const_ref_iterator retval = *this;
+    ++(*this);
+    return retval;
+  }
+
+  const_ref_iterator& operator--(void) {
+    if (this->it_ != container_.cbegin()) {
+      this->it_--;
+    }
+    return *this;
+  }
+
+  const_ref_iterator operator--(int) {
+    const_ref_iterator retval = *this;
+    --(*this);
+    return retval;
+  }
+
+
+  const_ref_iterator& operator+=(const typename const_ref_iterator::difference_type& movement) {
+    std::advance(this->it_, movement);
+    return *this;
+  }
+
+
+  const_ref_iterator& operator-=(const typename const_ref_iterator::difference_type& movement) {
+    return (*this) += -movement;
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<std::is_pointer<U>::value, typename const_ref_iterator::reference>::type
+  operator[](typename const_ref_iterator::difference_type n) {
+    if (n < 0 or n >= this->size()) {
+      throw integrity_error(std::to_string(n) + " is out of bound");
+    }
+    auto&& it = this->container_.cbegin();
+    std::advance(it, n);
+
+    if (*it == nullptr) {
+      throw integrity_error("nullptr");
+    }
+    return **it;
+
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<not std::is_pointer<U>::value, typename const_ref_iterator::reference>::type
+  operator[](typename const_ref_iterator::difference_type n) {
+    auto&& it = this->container_.cbegin();
+    std::advance(it, n);
+    return *it;
+  }
+
+  const_ref_iterator operator+(typename const_ref_iterator::difference_type n) const {
+    const_ref_iterator tmp = *this;
+    return tmp += n;
+  }
+
+
+  const_ref_iterator operator-(typename const_ref_iterator::difference_type n) const {
+    const_ref_iterator tmp = *this;
+    return tmp -= n;
+  }
+
+
+  typename const_ref_iterator::difference_type operator-(const const_ref_iterator& rhs) const {
+    return std::distance(rhs, *this);
+  }
+
+  bool operator<(const const_ref_iterator& rhs) const {
+    return (rhs - *this) > 0;
+  }
+
+
+  bool operator>(const const_ref_iterator& rhs) const {
+    return rhs < *this;
+  }
+
+
+  bool operator>=(const const_ref_iterator& rhs) const {
+    return not (*this < rhs);
+  }
+
+  bool operator<=(const const_ref_iterator& rhs) const {
+    return not (*this > rhs);
+  }
+
+  const_ref_iterator cbegin(void) const {
+    return {this->container_};
+  }
+
+  const_ref_iterator cend(void) const {
+    const_ref_iterator it{this->container_};
+    it.it_ = it.container_.cend();
+    return it;
+  }
+
+  const_ref_iterator begin(void) const {
+    return this->cbegin();
+  }
+
+  const_ref_iterator end(void) const {
+    return this->cend();
+  }
+
+  bool operator==(const const_ref_iterator& other) const {
+    size_t d1 = static_cast<size_t>(std::distance(this->it_, this->container_.cend()));
+    size_t d2 = static_cast<size_t>(std::distance(other.it_, other.container_.cend()));
+    return (this->size() == other.size() and d1 == d2);
+  }
+
+  bool operator!=(const const_ref_iterator& other) const {
+    return not (*this == other);
+  }
+
+  size_t size(void) const {
+    return this->container_.size();
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<std::is_pointer<U>::value, typename const_ref_iterator::reference>::type
+  operator*() const {
+    if (*this->it_ == nullptr) {
+      throw integrity_error("nullptr");
+    }
+    return **it_;
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<std::is_pointer<U>::value, typename const_ref_iterator::pointer>::type
+  operator->() {
+    if (*this->it_ == nullptr) {
+      throw integrity_error("nullptr");
+    }
+    return *this->it_;
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<not std::is_pointer<U>::value, typename const_ref_iterator::reference>::type
+  operator*() const {
+    return *it_;
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<not std::is_pointer<U>::value, typename const_ref_iterator::pointer>::type
+  operator->() {
+    return &(*this->it_);
+  }
+  private:
+  T container_;
+  typename decay_t<decltype(container_)>::const_iterator it_;
+};
+
+
+// Iterator which return a ref on container's values given a predicated
+// ====================================================================
+
+template<class T>
+class filter_iterator : public std::iterator<
+                     std::forward_iterator_tag,
+                     typename decay_t<T>::value_type,
+                     size_t,
+                     typename std::remove_pointer<typename decay_t<T>::value_type>::type*,
+                     typename std::remove_pointer<typename decay_t<T>::value_type>::type&> {
+
+  public:
+
+  using DT = decay_t<T>;
+  using filter_t = std::function<bool (const typename DT::value_type&)>;
+
+  filter_iterator(T container, filter_t filter) :
+    size_c_{0}, container_{std::forward<T>(container)}, filter_{filter}
+  {
+
+    this->it_ = std::begin(this->container_);
+
+    if (this->it_ != std::end(this->container_)) {
+      if (not this->filter_(*this->it_)) {
+        this->next();
+      }
+    }
+  }
+
+  filter_iterator(const filter_iterator& copy) :
+    size_c_{0},
+    container_{copy.container_},
+    it_{std::begin(container_)},
+    filter_{copy.filter_}
+  {
+    size_t d = std::distance(const_cast<filter_iterator&>(copy).container_.begin(), copy.it_);
+    std::advance(this->it_, d);
+  }
+
+  filter_iterator operator=(filter_iterator other) {
+    this->swap(other);
+    return *this;
+  }
+
+  void swap(filter_iterator& other) {
+    std::swap(this->container_, other.container_);
+    std::swap(this->it_,        other.it_);
+    std::swap(this->filter_,    other.filter_);
+    std::swap(this->size_c_,    other.size_c_);
+  }
+
+
+  filter_iterator& def(filter_t func) {
+    this->filter_ = func;
+    this->size_c_ = 0;
+    return *this;
+  }
+
+  filter_iterator& operator++() {
+    this->next();
+    return *this;
+  }
+
+  filter_iterator operator++(int) {
+    filter_iterator retval = *this;
+    ++(*this);
+    return retval;
+  }
+
+  filter_iterator begin(void) {
+    return {this->container_, this->filter_};
+  }
+
+  filter_iterator end(void) {
+    filter_iterator it_end{this->container_, this->filter_};
+    it_end.it_ =  it_end.container_.end();
+    return it_end;
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<std::is_pointer<U>::value, typename filter_iterator::reference>::type
+  operator*() {
+    if (*this->it_ == nullptr) {
+      throw integrity_error("nullptr");
+    }
+    return **this->it_;
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<!std::is_pointer<U>::value, typename filter_iterator::reference>::type
+  operator*() {
+    return *this->it_;
+  }
+
+
+  typename filter_iterator::reference
+  operator[](typename filter_iterator::difference_type n) {
+    if (n < 0 or n >= this->size()) {
+      throw integrity_error(std::to_string(n) + " is out of bound");
+    }
+
+    auto it = this->begin();
+    std::advance(it, n);
+    return *it;
+  }
+
+  size_t size(void) const {
+    if (this->size_c_ > 0) {
+      return this->size_c_;
+    }
+    filter_iterator it = *this;
+    size_t size = 0;
+    while (it++ != std::end(it)) ++size;
+    this->size_c_ = size;
+    return this->size_c_;
+  }
+
+
+  bool operator==(const filter_iterator& other) const {
+
+    size_t d1 = std::distance(this->it_, const_cast<filter_iterator*>(this)->container_.end());
+    size_t d2 = std::distance(other.it_, const_cast<filter_iterator&>(other).container_.end());
+
+    return (this->container_.size() == other.container_.size() and d1 == d2);
+  }
+
+  bool operator!=(const filter_iterator& other) const {
+    return not (*this == other);
+  }
+
+  private:
+  void next(void) {
+    if (this->it_ == std::end(this->container_)) {
+      return;
+    }
+
+    this->it_ = std::find_if(
+      std::next(this->it_),
+      std::end(this->container_),
+      this->filter_);
+
+  }
+
+
+  mutable size_t size_c_;
+  T container_;
+  typename DT::iterator it_;
+  filter_t filter_;
+};
+
+// Iterator which return a const ref on container's values given a predicated
+// ==========================================================================
+
+template<class T, class CT = typename std::add_const<T>::type>
+class const_filter_iterator : public std::iterator<
+                     std::forward_iterator_tag,
+                     const typename decay_t<T>::value_type,
+                     std::size_t,
+                     const typename std::remove_pointer<typename decay_t<T>::value_type>::type*,
+                     const typename std::remove_pointer<typename decay_t<T>::value_type>::type&> {
+
+  public:
+
+  using DT = decay_t<CT>;
+  using filter_t = std::function<bool (const typename DT::value_type)>;
+
+  const_filter_iterator(CT container, filter_t filter) :
+    size_c_{0}, container_{std::forward<CT>(container)}, filter_{filter}
+  {
+    this->it_ = this->container_.cbegin();
+
+    if (this->it_ != this->container_.cend()) {
+      if (not this->filter_(*this->it_)) {
+        this->next();
+      }
+    }
+  }
+
+  const_filter_iterator(const const_filter_iterator& copy) :
+    size_c_{0},
+    container_{copy.container_},
+    it_{container_.cbegin()},
+    filter_{copy.filter_}
+  {
+    size_t d = std::distance(copy.container_.cbegin(), copy.it_);
+    std::advance(this->it_, d);
+  }
+
+  const_filter_iterator operator=(const_filter_iterator other) {
+    this->swap(other);
+    return *this;
+  }
+
+  void swap(const_filter_iterator& other) {
+    std::swap(this->container_, other.container_);
+    std::swap(this->it_,        other.it_);
+    std::swap(this->filter_,    other.filter_);
+    std::swap(this->size_c_,    other.size_c_);
+  }
+
+
+
+  const_filter_iterator& def(filter_t func) {
+    this->filter_ = func;
+    this->size_c_ = 0;
+    return *this;
+  }
+
+  const_filter_iterator& operator++() {
+    this->next();
+    return *this;
+  }
+
+  const_filter_iterator operator++(int) {
+    const_filter_iterator retval = *this;
+    ++(*this);
+    return retval;
+  }
+
+  const_filter_iterator cbegin(void) const {
+    return {this->container_, this->filter_};
+  }
+
+  const_filter_iterator cend(void) const {
+    const_filter_iterator it{this->container_, this->filter_};
+    it.it_ = it.container_.cend();
+    return it;
+  }
+
+  const_filter_iterator begin(void) const {
+    return this->cbegin();
+  }
+
+  const_filter_iterator end(void) const {
+    return this->cend();
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<std::is_pointer<U>::value, typename const_filter_iterator::reference>::type
+  operator*() const {
+    if (*this->it_ == nullptr) {
+      throw integrity_error("nullptr");
+    }
+    return **this->it_;
+  }
+
+  template<typename U = typename DT::value_type>
+  typename std::enable_if<not std::is_pointer<U>::value, typename const_filter_iterator::reference>::type
+  operator*() const {
+    return *this->it_;
+  }
+
+
+  size_t size(void) const {
+    if (this->size_c_ > 0) {
+      return this->size_c_;
+    }
+
+    auto it = this->cbegin();
+    size_t size = 0;
+    while (it++ != it.cend()) ++size;
+    this->size_c_ = size;
+    return this->size_c_;
+  }
+
+
+  typename const_filter_iterator::reference
+  operator[](typename const_filter_iterator::difference_type n) const {
+    if (n < 0 or n >= this->size()) {
+      throw integrity_error(std::to_string(n) + " is out of bound");
+    }
+
+    auto it = this->cbegin();
+    std::advance(it, n);
+
+    return *it;
+  }
+
+
+
+  bool operator==(const const_filter_iterator& other) const {
+    size_t d1 = static_cast<size_t>(std::distance(this->it_, this->container_.cend()));
+    size_t d2 = static_cast<size_t>(std::distance(other.it_, other.container_.cend()));
+    return (this->container_.size() == other.container_.size() and d1 == d2);
+  }
+
+  bool operator!=(const const_filter_iterator& other) const {
+    return not (*this == other);
+  }
+
+  private:
+  void next(void) {
+
+    if (this->it_ == this->container_.cend()) {
+      return;
+    }
+
+    this->it_ = std::find_if(
+      std::next(this->it_),
+      this->container_.cend(),
+      this->filter_);
+  }
+
+  mutable size_t size_c_;
+  T container_;
+  typename decay_t<decltype(container_)>::const_iterator it_;
+  filter_t filter_;
+};
+
+
+
+}
+
+#endif
diff --git a/include/LIEF/json.hpp b/include/LIEF/json.hpp
new file mode 100644
index 0000000..db2adc8
--- /dev/null
+++ b/include/LIEF/json.hpp
@@ -0,0 +1,22 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_JSON_H_
+#define LIEF_JSON_H_
+#include <json.hpp>
+
+using json = nlohmann::json;
+
+#endif
diff --git a/include/LIEF/logging.hpp b/include/LIEF/logging.hpp
new file mode 100644
index 0000000..e20f3d5
--- /dev/null
+++ b/include/LIEF/logging.hpp
@@ -0,0 +1,50 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_LOGGING_H_
+#define LIEF_LOGGING_H_
+
+#include "LIEF/visibility.h"
+
+namespace LIEF {
+static const char* logging_config = R"config(
+* GLOBAL:
+   FORMAT               = "%msg"
+   ENABLED              = true
+   TO_STANDARD_OUTPUT   = true
+   TO_FILE              = false
+   PERFORMANCE_TRACKING = true
+
+* DEBUG:
+   FORMAT  = "%func %msg"
+   Enabled = true
+)config";
+
+class DLL_PUBLIC Logger {
+  public:
+  Logger(void);
+  Logger(const Logger&) = delete;
+  Logger& operator=(const Logger&) = delete;
+
+  ~Logger(void);
+
+};
+
+
+
+
+}
+
+#endif
diff --git a/include/LIEF/to_json.hpp b/include/LIEF/to_json.hpp
new file mode 100644
index 0000000..85125b3
--- /dev/null
+++ b/include/LIEF/to_json.hpp
@@ -0,0 +1,42 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_TO_JSON_H_
+#define LIEF_TO_JSON_H_
+
+#include "LIEF/json.hpp"
+
+#include "LIEF/visitors/json.hpp"
+#include "LIEF/visitors/elf_json.hpp"
+
+#include "LIEF/Abstract/Abstract.hpp"
+#include "LIEF/ELF.hpp"
+
+namespace LIEF {
+template<class T, class VISITOR = JsonVisitor>
+json to_json(const T& obj) {
+  VISITOR visitor;
+  visitor(obj);
+  return visitor.get();
+}
+
+template<class T, class VISITOR = JsonVisitor>
+std::string to_json_str(const T& obj) {
+  return to_json<T, VISITOR>(obj).dump();
+}
+
+} // namespace LIEF
+
+#endif
diff --git a/include/LIEF/types.hpp b/include/LIEF/types.hpp
new file mode 100644
index 0000000..dbc8cf5
--- /dev/null
+++ b/include/LIEF/types.hpp
@@ -0,0 +1,20 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_TYPES_H_
+#define LIEF_TYPES_H_
+#include <stdint.h>
+#include <inttypes.h>
+#endif
diff --git a/include/LIEF/utf8.h b/include/LIEF/utf8.h
new file mode 100644
index 0000000..4e44514
--- /dev/null
+++ b/include/LIEF/utf8.h
@@ -0,0 +1,34 @@
+// Copyright 2006 Nemanja Trifunovic
+
+/*
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+*/
+
+
+#ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
+#define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731
+
+#include "utf8/checked.h"
+#include "utf8/unchecked.h"
+
+#endif // header guard
diff --git a/include/LIEF/utf8/checked.h b/include/LIEF/utf8/checked.h
new file mode 100644
index 0000000..1331155
--- /dev/null
+++ b/include/LIEF/utf8/checked.h
@@ -0,0 +1,327 @@
+// Copyright 2006 Nemanja Trifunovic
+
+/*
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+*/
+
+
+#ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
+#define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
+
+#include "core.h"
+#include <stdexcept>
+
+namespace utf8
+{
+    // Base for the exceptions that may be thrown from the library
+    class exception : public ::std::exception {
+    };
+
+    // Exceptions that may be thrown from the library functions.
+    class invalid_code_point : public exception {
+        uint32_t cp;
+    public:
+        invalid_code_point(uint32_t cp) : cp(cp) {}
+        virtual const char* what() const throw() { return "Invalid code point"; }
+        uint32_t code_point() const {return cp;}
+    };
+
+    class invalid_utf8 : public exception {
+        uint8_t u8;
+    public:
+        invalid_utf8 (uint8_t u) : u8(u) {}
+        virtual const char* what() const throw() { return "Invalid UTF-8"; }
+        uint8_t utf8_octet() const {return u8;}
+    };
+
+    class invalid_utf16 : public exception {
+        uint16_t u16;
+    public:
+        invalid_utf16 (uint16_t u) : u16(u) {}
+        virtual const char* what() const throw() { return "Invalid UTF-16"; }
+        uint16_t utf16_word() const {return u16;}
+    };
+
+    class not_enough_room : public exception {
+    public:
+        virtual const char* what() const throw() { return "Not enough space"; }
+    };
+
+    /// The library API - functions intended to be called by the users
+
+    template <typename octet_iterator>
+    octet_iterator append(uint32_t cp, octet_iterator result)
+    {
+        if (!utf8::internal::is_code_point_valid(cp))
+            throw invalid_code_point(cp);
+
+        if (cp < 0x80)                        // one octet
+            *(result++) = static_cast<uint8_t>(cp);
+        else if (cp < 0x800) {                // two octets
+            *(result++) = static_cast<uint8_t>((cp >> 6)            | 0xc0);
+            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);
+        }
+        else if (cp < 0x10000) {              // three octets
+            *(result++) = static_cast<uint8_t>((cp >> 12)           | 0xe0);
+            *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f)   | 0x80);
+            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);
+        }
+        else {                                // four octets
+            *(result++) = static_cast<uint8_t>((cp >> 18)           | 0xf0);
+            *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)  | 0x80);
+            *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f)   | 0x80);
+            *(result++) = static_cast<uint8_t>((cp & 0x3f)          | 0x80);
+        }
+        return result;
+    }
+
+    template <typename octet_iterator, typename output_iterator>
+    output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out, uint32_t replacement)
+    {
+        while (start != end) {
+            octet_iterator sequence_start = start;
+            internal::utf_error err_code = utf8::internal::validate_next(start, end);
+            switch (err_code) {
+                case internal::UTF8_OK :
+                    for (octet_iterator it = sequence_start; it != start; ++it)
+                        *out++ = *it;
+                    break;
+                case internal::NOT_ENOUGH_ROOM:
+                    throw not_enough_room();
+                case internal::INVALID_LEAD:
+                    out = utf8::append (replacement, out);
+                    ++start;
+                    break;
+                case internal::INCOMPLETE_SEQUENCE:
+                case internal::OVERLONG_SEQUENCE:
+                case internal::INVALID_CODE_POINT:
+                    out = utf8::append (replacement, out);
+                    ++start;
+                    // just one replacement mark for the sequence
+                    while (start != end && utf8::internal::is_trail(*start))
+                        ++start;
+                    break;
+            }
+        }
+        return out;
+    }
+
+    template <typename octet_iterator, typename output_iterator>
+    inline output_iterator replace_invalid(octet_iterator start, octet_iterator end, output_iterator out)
+    {
+        static const uint32_t replacement_marker = utf8::internal::mask16(0xfffd);
+        return utf8::replace_invalid(start, end, out, replacement_marker);
+    }
+
+    template <typename octet_iterator>
+    uint32_t next(octet_iterator& it, octet_iterator end)
+    {
+        uint32_t cp = 0;
+        internal::utf_error err_code = utf8::internal::validate_next(it, end, cp);
+        switch (err_code) {
+            case internal::UTF8_OK :
+                break;
+            case internal::NOT_ENOUGH_ROOM :
+                throw not_enough_room();
+            case internal::INVALID_LEAD :
+            case internal::INCOMPLETE_SEQUENCE :
+            case internal::OVERLONG_SEQUENCE :
+                throw invalid_utf8(*it);
+            case internal::INVALID_CODE_POINT :
+                throw invalid_code_point(cp);
+        }
+        return cp;
+    }
+
+    template <typename octet_iterator>
+    uint32_t peek_next(octet_iterator it, octet_iterator end)
+    {
+        return utf8::next(it, end);
+    }
+
+    template <typename octet_iterator>
+    uint32_t prior(octet_iterator& it, octet_iterator start)
+    {
+        // can't do much if it == start
+        if (it == start)
+            throw not_enough_room();
+
+        octet_iterator end = it;
+        // Go back until we hit either a lead octet or start
+        while (utf8::internal::is_trail(*(--it)))
+            if (it == start)
+                throw invalid_utf8(*it); // error - no lead byte in the sequence
+        return utf8::peek_next(it, end);
+    }
+
+    /// Deprecated in versions that include "prior"
+    template <typename octet_iterator>
+    uint32_t previous(octet_iterator& it, octet_iterator pass_start)
+    {
+        octet_iterator end = it;
+        while (utf8::internal::is_trail(*(--it)))
+            if (it == pass_start)
+                throw invalid_utf8(*it); // error - no lead byte in the sequence
+        octet_iterator temp = it;
+        return utf8::next(temp, end);
+    }
+
+    template <typename octet_iterator, typename distance_type>
+    void advance (octet_iterator& it, distance_type n, octet_iterator end)
+    {
+        for (distance_type i = 0; i < n; ++i)
+            utf8::next(it, end);
+    }
+
+    template <typename octet_iterator>
+    typename std::iterator_traits<octet_iterator>::difference_type
+    distance (octet_iterator first, octet_iterator last)
+    {
+        typename std::iterator_traits<octet_iterator>::difference_type dist;
+        for (dist = 0; first < last; ++dist)
+            utf8::next(first, last);
+        return dist;
+    }
+
+    template <typename u16bit_iterator, typename octet_iterator>
+    octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
+    {
+        while (start != end) {
+            uint32_t cp = utf8::internal::mask16(*start++);
+            // Take care of surrogate pairs first
+            if (utf8::internal::is_lead_surrogate(cp)) {
+                if (start != end) {
+                    uint32_t trail_surrogate = utf8::internal::mask16(*start++);
+                    if (utf8::internal::is_trail_surrogate(trail_surrogate))
+                        cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
+                    else
+                        throw invalid_utf16(static_cast<uint16_t>(trail_surrogate));
+                }
+                else
+                    throw invalid_utf16(static_cast<uint16_t>(cp));
+
+            }
+            // Lone trail surrogate
+            else if (utf8::internal::is_trail_surrogate(cp))
+                throw invalid_utf16(static_cast<uint16_t>(cp));
+
+            result = utf8::append(cp, result);
+        }
+        return result;
+    }
+
+    template <typename u16bit_iterator, typename octet_iterator>
+    u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
+    {
+        while (start != end) {
+            uint32_t cp = utf8::next(start, end);
+            if (cp > 0xffff) { //make a surrogate pair
+                *result++ = static_cast<uint16_t>((cp >> 10)   + internal::LEAD_OFFSET);
+                *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
+            }
+            else
+                *result++ = static_cast<uint16_t>(cp);
+        }
+        return result;
+    }
+
+    template <typename octet_iterator, typename u32bit_iterator>
+    octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
+    {
+        while (start != end)
+            result = utf8::append(*(start++), result);
+
+        return result;
+    }
+
+    template <typename octet_iterator, typename u32bit_iterator>
+    u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
+    {
+        while (start != end)
+            (*result++) = utf8::next(start, end);
+
+        return result;
+    }
+
+    // The iterator class
+    template <typename octet_iterator>
+    class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
+      octet_iterator it;
+      octet_iterator range_start;
+      octet_iterator range_end;
+      public:
+      iterator () {}
+      explicit iterator (const octet_iterator& octet_it,
+                         const octet_iterator& range_start,
+                         const octet_iterator& range_end) :
+               it(octet_it), range_start(range_start), range_end(range_end)
+      {
+          if (it < range_start || it > range_end)
+              throw std::out_of_range("Invalid utf-8 iterator position");
+      }
+      // the default "big three" are OK
+      octet_iterator base () const { return it; }
+      uint32_t operator * () const
+      {
+          octet_iterator temp = it;
+          return utf8::next(temp, range_end);
+      }
+      bool operator == (const iterator& rhs) const
+      {
+          if (range_start != rhs.range_start || range_end != rhs.range_end)
+              throw std::logic_error("Comparing utf-8 iterators defined with different ranges");
+          return (it == rhs.it);
+      }
+      bool operator != (const iterator& rhs) const
+      {
+          return !(operator == (rhs));
+      }
+      iterator& operator ++ ()
+      {
+          utf8::next(it, range_end);
+          return *this;
+      }
+      iterator operator ++ (int)
+      {
+          iterator temp = *this;
+          utf8::next(it, range_end);
+          return temp;
+      }
+      iterator& operator -- ()
+      {
+          utf8::prior(it, range_start);
+          return *this;
+      }
+      iterator operator -- (int)
+      {
+          iterator temp = *this;
+          utf8::prior(it, range_start);
+          return temp;
+      }
+    }; // class iterator
+
+} // namespace utf8
+
+#endif //header guard
+
+
diff --git a/include/LIEF/utf8/core.h b/include/LIEF/utf8/core.h
new file mode 100644
index 0000000..f85081f
--- /dev/null
+++ b/include/LIEF/utf8/core.h
@@ -0,0 +1,329 @@
+// Copyright 2006 Nemanja Trifunovic
+
+/*
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+*/
+
+
+#ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
+#define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
+
+#include <iterator>
+
+namespace utf8
+{
+    // The typedefs for 8-bit, 16-bit and 32-bit unsigned integers
+    // You may need to change them to match your system.
+    // These typedefs have the same names as ones from cstdint, or boost/cstdint
+    typedef unsigned char   uint8_t;
+    typedef unsigned short  uint16_t;
+    typedef unsigned int    uint32_t;
+
+// Helper code - not intended to be directly called by the library users. May be changed at any time
+namespace internal
+{
+    // Unicode constants
+    // Leading (high) surrogates: 0xd800 - 0xdbff
+    // Trailing (low) surrogates: 0xdc00 - 0xdfff
+    const uint16_t LEAD_SURROGATE_MIN  = 0xd800u;
+    const uint16_t LEAD_SURROGATE_MAX  = 0xdbffu;
+    const uint16_t TRAIL_SURROGATE_MIN = 0xdc00u;
+    const uint16_t TRAIL_SURROGATE_MAX = 0xdfffu;
+    const uint16_t LEAD_OFFSET         = LEAD_SURROGATE_MIN - (0x10000 >> 10);
+    const uint32_t SURROGATE_OFFSET    = 0x10000u - (LEAD_SURROGATE_MIN << 10) - TRAIL_SURROGATE_MIN;
+
+    // Maximum valid value for a Unicode code point
+    const uint32_t CODE_POINT_MAX      = 0x0010ffffu;
+
+    template<typename octet_type>
+    inline uint8_t mask8(octet_type oc)
+    {
+        return static_cast<uint8_t>(0xff & oc);
+    }
+    template<typename u16_type>
+    inline uint16_t mask16(u16_type oc)
+    {
+        return static_cast<uint16_t>(0xffff & oc);
+    }
+    template<typename octet_type>
+    inline bool is_trail(octet_type oc)
+    {
+        return ((utf8::internal::mask8(oc) >> 6) == 0x2);
+    }
+
+    template <typename u16>
+    inline bool is_lead_surrogate(u16 cp)
+    {
+        return (cp >= LEAD_SURROGATE_MIN && cp <= LEAD_SURROGATE_MAX);
+    }
+
+    template <typename u16>
+    inline bool is_trail_surrogate(u16 cp)
+    {
+        return (cp >= TRAIL_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);
+    }
+
+    template <typename u16>
+    inline bool is_surrogate(u16 cp)
+    {
+        return (cp >= LEAD_SURROGATE_MIN && cp <= TRAIL_SURROGATE_MAX);
+    }
+
+    template <typename u32>
+    inline bool is_code_point_valid(u32 cp)
+    {
+        return (cp <= CODE_POINT_MAX && !utf8::internal::is_surrogate(cp));
+    }
+
+    template <typename octet_iterator>
+    inline typename std::iterator_traits<octet_iterator>::difference_type
+    sequence_length(octet_iterator lead_it)
+    {
+        uint8_t lead = utf8::internal::mask8(*lead_it);
+        if (lead < 0x80)
+            return 1;
+        else if ((lead >> 5) == 0x6)
+            return 2;
+        else if ((lead >> 4) == 0xe)
+            return 3;
+        else if ((lead >> 3) == 0x1e)
+            return 4;
+        else
+            return 0;
+    }
+
+    template <typename octet_difference_type>
+    inline bool is_overlong_sequence(uint32_t cp, octet_difference_type length)
+    {
+        if (cp < 0x80) {
+            if (length != 1)
+                return true;
+        }
+        else if (cp < 0x800) {
+            if (length != 2)
+                return true;
+        }
+        else if (cp < 0x10000) {
+            if (length != 3)
+                return true;
+        }
+
+        return false;
+    }
+
+    enum utf_error {UTF8_OK, NOT_ENOUGH_ROOM, INVALID_LEAD, INCOMPLETE_SEQUENCE, OVERLONG_SEQUENCE, INVALID_CODE_POINT};
+
+    /// Helper for get_sequence_x
+    template <typename octet_iterator>
+    utf_error increase_safely(octet_iterator& it, octet_iterator end)
+    {
+        if (++it == end)
+            return NOT_ENOUGH_ROOM;
+
+        if (!utf8::internal::is_trail(*it))
+            return INCOMPLETE_SEQUENCE;
+
+        return UTF8_OK;
+    }
+
+    #define UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(IT, END) {utf_error ret = increase_safely(IT, END); if (ret != UTF8_OK) return ret;}
+
+    /// get_sequence_x functions decode utf-8 sequences of the length x
+    template <typename octet_iterator>
+    utf_error get_sequence_1(octet_iterator& it, octet_iterator end, uint32_t& code_point)
+    {
+        if (it == end)
+            return NOT_ENOUGH_ROOM;
+
+        code_point = utf8::internal::mask8(*it);
+
+        return UTF8_OK;
+    }
+
+    template <typename octet_iterator>
+    utf_error get_sequence_2(octet_iterator& it, octet_iterator end, uint32_t& code_point)
+    {
+        if (it == end)
+            return NOT_ENOUGH_ROOM;
+
+        code_point = utf8::internal::mask8(*it);
+
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point = ((code_point << 6) & 0x7ff) + ((*it) & 0x3f);
+
+        return UTF8_OK;
+    }
+
+    template <typename octet_iterator>
+    utf_error get_sequence_3(octet_iterator& it, octet_iterator end, uint32_t& code_point)
+    {
+        if (it == end)
+            return NOT_ENOUGH_ROOM;
+
+        code_point = utf8::internal::mask8(*it);
+
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point = ((code_point << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
+
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point += (*it) & 0x3f;
+
+        return UTF8_OK;
+    }
+
+    template <typename octet_iterator>
+    utf_error get_sequence_4(octet_iterator& it, octet_iterator end, uint32_t& code_point)
+    {
+        if (it == end)
+           return NOT_ENOUGH_ROOM;
+
+        code_point = utf8::internal::mask8(*it);
+
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point = ((code_point << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
+
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point += (utf8::internal::mask8(*it) << 6) & 0xfff;
+
+        UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR(it, end)
+
+        code_point += (*it) & 0x3f;
+
+        return UTF8_OK;
+    }
+
+    #undef UTF8_CPP_INCREASE_AND_RETURN_ON_ERROR
+
+    template <typename octet_iterator>
+    utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point)
+    {
+        // Save the original value of it so we can go back in case of failure
+        // Of course, it does not make much sense with i.e. stream iterators
+        octet_iterator original_it = it;
+
+        uint32_t cp = 0;
+        // Determine the sequence length based on the lead octet
+        typedef typename std::iterator_traits<octet_iterator>::difference_type octet_difference_type;
+        const octet_difference_type length = utf8::internal::sequence_length(it);
+
+        // Get trail octets and calculate the code point
+        utf_error err = UTF8_OK;
+        switch (length) {
+            case 0:
+                return INVALID_LEAD;
+            case 1:
+                err = utf8::internal::get_sequence_1(it, end, cp);
+                break;
+            case 2:
+                err = utf8::internal::get_sequence_2(it, end, cp);
+            break;
+            case 3:
+                err = utf8::internal::get_sequence_3(it, end, cp);
+            break;
+            case 4:
+                err = utf8::internal::get_sequence_4(it, end, cp);
+            break;
+        }
+
+        if (err == UTF8_OK) {
+            // Decoding succeeded. Now, security checks...
+            if (utf8::internal::is_code_point_valid(cp)) {
+                if (!utf8::internal::is_overlong_sequence(cp, length)){
+                    // Passed! Return here.
+                    code_point = cp;
+                    ++it;
+                    return UTF8_OK;
+                }
+                else
+                    err = OVERLONG_SEQUENCE;
+            }
+            else
+                err = INVALID_CODE_POINT;
+        }
+
+        // Failure branch - restore the original value of the iterator
+        it = original_it;
+        return err;
+    }
+
+    template <typename octet_iterator>
+    inline utf_error validate_next(octet_iterator& it, octet_iterator end) {
+        uint32_t ignored;
+        return utf8::internal::validate_next(it, end, ignored);
+    }
+
+} // namespace internal
+
+    /// The library API - functions intended to be called by the users
+
+    // Byte order mark
+    const uint8_t bom[] = {0xef, 0xbb, 0xbf};
+
+    template <typename octet_iterator>
+    octet_iterator find_invalid(octet_iterator start, octet_iterator end)
+    {
+        octet_iterator result = start;
+        while (result != end) {
+            utf8::internal::utf_error err_code = utf8::internal::validate_next(result, end);
+            if (err_code != internal::UTF8_OK)
+                return result;
+        }
+        return result;
+    }
+
+    template <typename octet_iterator>
+    inline bool is_valid(octet_iterator start, octet_iterator end)
+    {
+        return (utf8::find_invalid(start, end) == end);
+    }
+
+    template <typename octet_iterator>
+    inline bool starts_with_bom (octet_iterator it, octet_iterator end)
+    {
+        return (
+            ((it != end) && (utf8::internal::mask8(*it++)) == bom[0]) &&
+            ((it != end) && (utf8::internal::mask8(*it++)) == bom[1]) &&
+            ((it != end) && (utf8::internal::mask8(*it))   == bom[2])
+           );
+    }
+
+    //Deprecated in release 2.3
+    template <typename octet_iterator>
+    inline bool is_bom (octet_iterator it)
+    {
+        return (
+            (utf8::internal::mask8(*it++)) == bom[0] &&
+            (utf8::internal::mask8(*it++)) == bom[1] &&
+            (utf8::internal::mask8(*it))   == bom[2]
+           );
+    }
+} // namespace utf8
+
+#endif // header guard
+
+
diff --git a/include/LIEF/utf8/unchecked.h b/include/LIEF/utf8/unchecked.h
new file mode 100644
index 0000000..989ccef
--- /dev/null
+++ b/include/LIEF/utf8/unchecked.h
@@ -0,0 +1,228 @@
+// Copyright 2006 Nemanja Trifunovic
+
+/*
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+*/
+
+
+#ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
+#define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
+
+#include "core.h"
+
+namespace utf8
+{
+    namespace unchecked
+    {
+        template <typename octet_iterator>
+        octet_iterator append(uint32_t cp, octet_iterator result)
+        {
+            if (cp < 0x80)                        // one octet
+                *(result++) = static_cast<uint8_t>(cp);
+            else if (cp < 0x800) {                // two octets
+                *(result++) = static_cast<uint8_t>((cp >> 6)          | 0xc0);
+                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);
+            }
+            else if (cp < 0x10000) {              // three octets
+                *(result++) = static_cast<uint8_t>((cp >> 12)         | 0xe0);
+                *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
+                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);
+            }
+            else {                                // four octets
+                *(result++) = static_cast<uint8_t>((cp >> 18)         | 0xf0);
+                *(result++) = static_cast<uint8_t>(((cp >> 12) & 0x3f)| 0x80);
+                *(result++) = static_cast<uint8_t>(((cp >> 6) & 0x3f) | 0x80);
+                *(result++) = static_cast<uint8_t>((cp & 0x3f)        | 0x80);
+            }
+            return result;
+        }
+
+        template <typename octet_iterator>
+        uint32_t next(octet_iterator& it)
+        {
+            uint32_t cp = utf8::internal::mask8(*it);
+            typename std::iterator_traits<octet_iterator>::difference_type length = utf8::internal::sequence_length(it);
+            switch (length) {
+                case 1:
+                    break;
+                case 2:
+                    it++;
+                    cp = ((cp << 6) & 0x7ff) + ((*it) & 0x3f);
+                    break;
+                case 3:
+                    ++it;
+                    cp = ((cp << 12) & 0xffff) + ((utf8::internal::mask8(*it) << 6) & 0xfff);
+                    ++it;
+                    cp += (*it) & 0x3f;
+                    break;
+                case 4:
+                    ++it;
+                    cp = ((cp << 18) & 0x1fffff) + ((utf8::internal::mask8(*it) << 12) & 0x3ffff);
+                    ++it;
+                    cp += (utf8::internal::mask8(*it) << 6) & 0xfff;
+                    ++it;
+                    cp += (*it) & 0x3f;
+                    break;
+            }
+            ++it;
+            return cp;
+        }
+
+        template <typename octet_iterator>
+        uint32_t peek_next(octet_iterator it)
+        {
+            return utf8::unchecked::next(it);
+        }
+
+        template <typename octet_iterator>
+        uint32_t prior(octet_iterator& it)
+        {
+            while (utf8::internal::is_trail(*(--it))) ;
+            octet_iterator temp = it;
+            return utf8::unchecked::next(temp);
+        }
+
+        // Deprecated in versions that include prior, but only for the sake of consistency (see utf8::previous)
+        template <typename octet_iterator>
+        inline uint32_t previous(octet_iterator& it)
+        {
+            return utf8::unchecked::prior(it);
+        }
+
+        template <typename octet_iterator, typename distance_type>
+        void advance (octet_iterator& it, distance_type n)
+        {
+            for (distance_type i = 0; i < n; ++i)
+                utf8::unchecked::next(it);
+        }
+
+        template <typename octet_iterator>
+        typename std::iterator_traits<octet_iterator>::difference_type
+        distance (octet_iterator first, octet_iterator last)
+        {
+            typename std::iterator_traits<octet_iterator>::difference_type dist;
+            for (dist = 0; first < last; ++dist)
+                utf8::unchecked::next(first);
+            return dist;
+        }
+
+        template <typename u16bit_iterator, typename octet_iterator>
+        octet_iterator utf16to8 (u16bit_iterator start, u16bit_iterator end, octet_iterator result)
+        {
+            while (start != end) {
+                uint32_t cp = utf8::internal::mask16(*start++);
+            // Take care of surrogate pairs first
+                if (utf8::internal::is_lead_surrogate(cp)) {
+                    uint32_t trail_surrogate = utf8::internal::mask16(*start++);
+                    cp = (cp << 10) + trail_surrogate + internal::SURROGATE_OFFSET;
+                }
+                result = utf8::unchecked::append(cp, result);
+            }
+            return result;
+        }
+
+        template <typename u16bit_iterator, typename octet_iterator>
+        u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
+        {
+            while (start < end) {
+                uint32_t cp = utf8::unchecked::next(start);
+                if (cp > 0xffff) { //make a surrogate pair
+                    *result++ = static_cast<uint16_t>((cp >> 10)   + internal::LEAD_OFFSET);
+                    *result++ = static_cast<uint16_t>((cp & 0x3ff) + internal::TRAIL_SURROGATE_MIN);
+                }
+                else
+                    *result++ = static_cast<uint16_t>(cp);
+            }
+            return result;
+        }
+
+        template <typename octet_iterator, typename u32bit_iterator>
+        octet_iterator utf32to8 (u32bit_iterator start, u32bit_iterator end, octet_iterator result)
+        {
+            while (start != end)
+                result = utf8::unchecked::append(*(start++), result);
+
+            return result;
+        }
+
+        template <typename octet_iterator, typename u32bit_iterator>
+        u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
+        {
+            while (start < end)
+                (*result++) = utf8::unchecked::next(start);
+
+            return result;
+        }
+
+        // The iterator class
+        template <typename octet_iterator>
+          class iterator : public std::iterator <std::bidirectional_iterator_tag, uint32_t> {
+            octet_iterator it;
+            public:
+            iterator () {}
+            explicit iterator (const octet_iterator& octet_it): it(octet_it) {}
+            // the default "big three" are OK
+            octet_iterator base () const { return it; }
+            uint32_t operator * () const
+            {
+                octet_iterator temp = it;
+                return utf8::unchecked::next(temp);
+            }
+            bool operator == (const iterator& rhs) const
+            {
+                return (it == rhs.it);
+            }
+            bool operator != (const iterator& rhs) const
+            {
+                return !(operator == (rhs));
+            }
+            iterator& operator ++ ()
+            {
+                ::std::advance(it, utf8::internal::sequence_length(it));
+                return *this;
+            }
+            iterator operator ++ (int)
+            {
+                iterator temp = *this;
+                ::std::advance(it, utf8::internal::sequence_length(it));
+                return temp;
+            }
+            iterator& operator -- ()
+            {
+                utf8::unchecked::prior(it);
+                return *this;
+            }
+            iterator operator -- (int)
+            {
+                iterator temp = *this;
+                utf8::unchecked::prior(it);
+                return temp;
+            }
+          }; // class iterator
+
+    } // namespace utf8::unchecked
+} // namespace utf8
+
+
+#endif // header guard
+
diff --git a/include/LIEF/utils.hpp b/include/LIEF/utils.hpp
new file mode 100644
index 0000000..75a7046
--- /dev/null
+++ b/include/LIEF/utils.hpp
@@ -0,0 +1,23 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_UTILS_HEADER
+#define LIEF_UTILS_HEADER
+#include "LIEF/types.hpp"
+namespace LIEF {
+uint64_t align(uint64_t value, uint64_t align_on);
+}
+
+#endif
diff --git a/include/LIEF/version.h.in b/include/LIEF/version.h.in
new file mode 100644
index 0000000..50180d4
--- /dev/null
+++ b/include/LIEF/version.h.in
@@ -0,0 +1,30 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_VERSION_H_
+#define LIEF_VERSION_H_
+
+#if defined(NDEBUG)
+  #define LIEF_NAME "@PROJECT_NAME@"
+#else
+  #define LIEF_NAME "@PROJECT_NAME@ (Debug)"
+#endif
+
+#define LIEF_VERSION "@LIEF_VERSION_MAJOR@.@LIEF_VERSION_MINOR@.@LIEF_VERSION_PATCH@"
+
+#define HUMAN_VERSION " v" LIEF_VERSION
+#define HUMAN_NAME NAME HUMAN_VERSION
+
+#endif
diff --git a/include/LIEF/visibility.h b/include/LIEF/visibility.h
new file mode 100644
index 0000000..d55814c
--- /dev/null
+++ b/include/LIEF/visibility.h
@@ -0,0 +1,27 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_SYMBOL_VISIBILITY_H_
+#define LIEF_SYMBOL_VISIBILITY_H_
+
+#if defined(__clang__) || defined(__GNUC__)
+    #define DLL_PUBLIC __attribute__ ((visibility ("default")))
+    #define DLL_LOCAL  __attribute__ ((visibility ("hidden")))
+#else
+	#define DLL_PUBLIC
+  #define DLL_LOCAL
+#endif
+
+#endif
diff --git a/include/LIEF/visitors/Hash.hpp b/include/LIEF/visitors/Hash.hpp
new file mode 100644
index 0000000..068b56c
--- /dev/null
+++ b/include/LIEF/visitors/Hash.hpp
@@ -0,0 +1,74 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_HASH_H_
+#define LIEF_HASH_H_
+
+#include <iostream>
+
+#include "LIEF/visibility.h"
+#include "LIEF/Visitable.hpp"
+#include "LIEF/Visitor.hpp"
+
+
+namespace LIEF {
+class DLL_PUBLIC Hash : public Visitor {
+
+  public:
+  using Visitor::visit;
+  Hash(void);
+  Hash(size_t init_value);
+
+  template<class T>
+  static size_t hash(const T& obj);
+
+  // combine two elements to produce a size_t.
+  template<typename U = size_t>
+  static inline size_t combine(size_t lhs, U rhs);
+
+  static size_t hash(const std::vector<uint8_t>& raw);
+  static size_t hash(const void* raw, size_t size);
+
+  virtual void visit(size_t n) override;
+  virtual void visit(const std::string& str) override;
+  virtual void visit(const std::u16string& str) override;
+  virtual void visit(const std::vector<uint8_t>& raw) override;
+
+  size_t value(void) const;
+
+  protected:
+  size_t value_;
+
+};
+
+template<typename U>
+size_t Hash::combine(size_t lhs, U rhs) {
+  return (lhs ^ rhs) + 0x9e3779b9 + (lhs << 6) + (rhs >> 2);
+}
+
+
+template<class T>
+size_t Hash::hash(const T& obj) {
+  static_assert(std::is_base_of<Visitable, T>::value, "Hash require inheritance of 'Visitable'");
+  Hash hasher;
+  obj.accept(hasher);
+  return hasher.value();
+
+}
+
+}
+
+
+#endif
diff --git a/include/LIEF/visitors/elf_json.hpp b/include/LIEF/visitors/elf_json.hpp
new file mode 100644
index 0000000..6d48a25
--- /dev/null
+++ b/include/LIEF/visitors/elf_json.hpp
@@ -0,0 +1,59 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_VISITOR_JSONS_H_
+#define LIEF_ELF_VISITOR_JSONS_H_
+
+#include "LIEF/visibility.h"
+#include "LIEF/visitors/json.hpp"
+
+namespace LIEF {
+namespace ELF {
+class DLL_PUBLIC JsonVisitor : public LIEF::JsonVisitor {
+  public:
+  using LIEF::JsonVisitor::JsonVisitor;
+  using LIEF::JsonVisitor::operator=;
+  using LIEF::JsonVisitor::visit;
+  using LIEF::JsonVisitor::get;
+
+  virtual void visit(const Binary& binary)                  override;
+  virtual void visit(const Header& header)                  override;
+  virtual void visit(const Section& section)                override;
+  virtual void visit(const Segment& segment)                override;
+  virtual void visit(const DynamicEntry& entry)             override;
+  virtual void visit(const DynamicEntryArray& entry)        override;
+  virtual void visit(const DynamicEntryLibrary& entry)      override;
+  virtual void visit(const DynamicEntryRpath& entry)        override;
+  virtual void visit(const DynamicEntryRunPath& entry)      override;
+  virtual void visit(const DynamicSharedObject& entry)      override;
+  virtual void visit(const Symbol& symbol)                  override;
+  virtual void visit(const Relocation& relocation)          override;
+  virtual void visit(const SymbolVersion& sv)               override;
+  virtual void visit(const SymbolVersionAux& sv)            override;
+  virtual void visit(const SymbolVersionAuxRequirement& sv) override;
+  virtual void visit(const SymbolVersionRequirement& svr)   override;
+  virtual void visit(const SymbolVersionDefinition& svd)    override;
+
+
+  virtual void visit(const LIEF::Binary& binary)   override;
+  virtual void visit(const LIEF::Symbol& symbol)   override;
+  virtual void visit(const LIEF::Section& section) override;
+};
+
+}
+}
+
+
+#endif
diff --git a/include/LIEF/visitors/json.hpp b/include/LIEF/visitors/json.hpp
new file mode 100644
index 0000000..1d04fcf
--- /dev/null
+++ b/include/LIEF/visitors/json.hpp
@@ -0,0 +1,50 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_VISITOR_JSONS_H_
+#define LIEF_VISITOR_JSONS_H_
+
+#include "LIEF/visibility.h"
+#include "LIEF/Visitor.hpp"
+#include "LIEF/json.hpp"
+
+namespace LIEF {
+class DLL_PUBLIC JsonVisitor : public Visitor {
+
+  public:
+  using LIEF::Visitor::visit;
+
+  JsonVisitor(void);
+  JsonVisitor(const json& node);
+  JsonVisitor(const JsonVisitor& other);
+  JsonVisitor& operator=(const JsonVisitor& other);
+
+  virtual void visit(const Binary&  binary)  override;
+  virtual void visit(const Header&  header)  override;
+  virtual void visit(const Section& section) override;
+  virtual void visit(const Symbol&  symbol)  override;
+
+  const json& get(void) const;
+
+  protected:
+  json node_;
+
+
+};
+
+}
+
+
+#endif
diff --git a/package/CMakeLists.txt b/package/CMakeLists.txt
new file mode 100644
index 0000000..77a641f
--- /dev/null
+++ b/package/CMakeLists.txt
@@ -0,0 +1,30 @@
+set(CPACK_PACKAGE_NAME   "LIEF")
+set(CPACK_PACKAGE_VENDOR "Quarkslab")
+
+set(CPACK_PACKAGE_VERSION_MAJOR "${LIEF_VERSION_MAJOR}")
+set(CPACK_PACKAGE_VERSION_MINOR "${LIEF_VERSION_MINOR}")
+set(CPACK_PACKAGE_VERSION_PATCH "${LIEF_VERSION_PATCH}")
+
+set(CPACK_SYSTEM_NAME ${PLATFORM})
+set(CPACK_PACKAGE_CONTACT "rthomas@quarkslab.com")
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LIEF - Library to Instrument Executable Formats")
+set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
+set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_CURRENT_SOURCE_DIR}/Welcome")
+
+
+if (UNIX AND NOT APPLE)
+  #set(CPACK_GENERATOR "TGZ;STGZ;DEB")
+  set(CPACK_GENERATOR "TGZ")
+  set(CPACK_SOURCE_GENERATOR "TGZ")
+  #set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Romain Thomas")
+endif()
+
+if (UNIX AND APPLE)
+  set(CPACK_GENERATOR "TGZ")
+endif()
+
+if (WIN32)
+  set(CPACK_GENERATOR "ZIP")
+endif()
+
+include(CPack)
diff --git a/package/CPack.STGZ_Header.sh.in b/package/CPack.STGZ_Header.sh.in
new file mode 100644
index 0000000..216badd
--- /dev/null
+++ b/package/CPack.STGZ_Header.sh.in
@@ -0,0 +1,132 @@
+#!/bin/sh
+
+# Display usage
+cpack_usage()
+{
+  cat <<EOF
+Usage: $0 [options]
+Options: [defaults in brackets after descriptions]
+  --help            print this message
+  --prefix=dir      directory in which to install
+EOF
+  exit 1
+}
+
+cpack_echo_exit()
+{
+  echo $1
+  exit 1
+}
+
+# Display version
+cpack_version()
+{
+  echo "@CPACK_PACKAGE_NAME@ Installer Version: @CPACK_PACKAGE_VERSION@, Copyright (c) @CPACK_PACKAGE_VENDOR@"
+}
+
+# Helper function to fix windows paths.
+cpack_fix_slashes ()
+{
+  echo "$1" | sed 's/\\/\//g'
+}
+
+interactive=TRUE
+cpack_skip_license=FALSE
+cpack_include_subdir=""
+for a in "$@CPACK_AT_SIGN@"; do
+  if echo $a | grep "^--prefix=" > /dev/null 2> /dev/null; then
+    cpack_prefix_dir=`echo $a | sed "s/^--prefix=//"`
+    cpack_prefix_dir=`cpack_fix_slashes "${cpack_prefix_dir}"`
+  fi
+  if echo $a | grep "^--help" > /dev/null 2> /dev/null; then
+    cpack_usage
+  fi
+  if echo $a | grep "^--version" > /dev/null 2> /dev/null; then
+    cpack_version
+    exit 2
+  fi
+  if echo $a | grep "^--skip-license" > /dev/null 2> /dev/null; then
+    cpack_skip_license=TRUE
+  fi
+done
+
+if [ "x${cpack_include_subdir}x" != "xx" -o "x${cpack_skip_license}x" = "xTRUEx" ]
+then
+  interactive=FALSE
+fi
+
+cpack_version
+echo "This is a self-extracting archive."
+toplevel="/usr"
+if [ "x${cpack_prefix_dir}x" != "xx" ]
+then
+  toplevel="${cpack_prefix_dir}"
+fi
+
+echo "The archive will be extracted to: ${toplevel}"
+
+if [ "x${interactive}x" = "xTRUEx" ]
+then
+  echo ""
+  echo "If you want to stop extracting, please press <ctrl-C>."
+
+  if [ "x${cpack_skip_license}x" != "xTRUEx" ]
+  then
+    more << '____cpack__here_doc____'
+@CPACK_RESOURCE_FILE_LICENSE_CONTENT@
+____cpack__here_doc____
+    echo
+    echo "Do you accept the license? [yN]: "
+    read line leftover
+    case ${line} in
+      y* | Y*)
+        cpack_license_accepted=TRUE;;
+      *)
+        echo "License not accepted. Exiting ..."
+        exit 1;;
+    esac
+  fi
+
+  if [ "x${cpack_prefix_dir}x" = "xx" ]
+  then
+      echo "Where do you want to install @CPACK_PACKAGE_NAME@? \"@CPACK_PACKAGE_FILE_NAME@\" will be appended to the path [${toplevel}] "
+      read line
+      if [ "x$line" != "x" ]; then
+        toplevel="$line"
+      fi
+  fi
+fi
+
+toplevel="${toplevel}/"
+mkdir -p "${toplevel}"
+
+test -w "${toplevel}" || cpack_echo_exit "It seems that you don't have permission to write to ${toplevel}. You may have to run this script as root."
+
+echo
+echo "Using target directory: ${toplevel}"
+echo "Extracting, please wait..."
+echo ""
+
+# take the archive portion of this file and pipe it to tar
+# the NUMERIC parameter in this command should be one more
+# than the number of lines in this header file
+# there are tails which don't understand the "-n" argument, e.g. on SunOS
+# OTOH there are tails which complain when not using the "-n" argument (e.g. GNU)
+# so at first try to tail some file to see if tail fails if used with "-n"
+# if so, don't use "-n"
+use_new_tail_syntax="-n"
+tail $use_new_tail_syntax +1 "$0" > /dev/null 2> /dev/null || use_new_tail_syntax=""
+
+tail $use_new_tail_syntax +###CPACK_HEADER_LENGTH### "$0" | gunzip | (cd "${toplevel}" && tar xf -) || cpack_echo_exit "Problem unpacking the @CPACK_PACKAGE_FILE_NAME@"
+
+toplevel=`(cd "${toplevel}" >/dev/null 2>&1; pwd)`
+
+cat << EOF
+Unpacking finished successfully
+EOF
+
+exit 0
+#-----------------------------------------------------------
+#      Start of TAR.GZ file
+#-----------------------------------------------------------;
+
diff --git a/package/Welcome b/package/Welcome
new file mode 100644
index 0000000..e69de29
diff --git a/scripts/FindLIEF.cmake b/scripts/FindLIEF.cmake
new file mode 100644
index 0000000..3174052
--- /dev/null
+++ b/scripts/FindLIEF.cmake
@@ -0,0 +1,64 @@
+# Locate LIEF
+#
+# This module defines
+#  LIEF_FOUND, if false, do not try to link to yaml-cpp
+#  LIEF_LIBNAME, name of yaml library
+#  LIEF_LIBRARY, where to find lief
+#  LIEF_LIBRARY_RELEASE, where to find Release or RelWithDebInfo lief
+#  LIEF_LIBRARY_DEBUG, where to find Debug version of LIEF
+#  LIEF_INCLUDE_DIR, where to find LIEF.hpp
+#  LIEF_LIBRARY_DIR, the directories to find LIEF_LIBRARY
+#
+# By default, the shared libraries of LIEF will be found. To find the static ones instead,
+# you must set the LIEF_USE_STATIC_LIBS variable to TRUE before calling find_package(LIEF ...)
+
+
+if(LIEF_USE_STATIC_LIBS)
+  set(LIEF_STATIC libLIEF.a)
+endif()
+
+set(LIEF_LIBNAME "libLIEF" CACHE STRING "Name of LIEF library")
+
+
+# Find include directory
+# ======================
+find_path(LIEF_INCLUDE_DIR
+  NAMES LIEF/LIEF.hpp
+  PATH_SUFFIXES include
+  PATHS
+    /usr/local/include/
+    /usr/include/)
+
+
+# Find the library
+# ================
+find_library(LIEF_LIBRARY_RELEASE
+  NAMES ${LIEF_STATIC} libLIEF LIEF
+  PATH_SUFFIXES lib64 lib Release RelWithDebInfo
+  PATHS
+    /usr/local
+    /usr)
+
+
+set(LIEF_LIBRARY ${LIEF_LIBRARY_RELEASE})
+if(CMAKE_BUILD_TYPE MATCHES Debug AND EXISTS ${LIEF_LIBRARY_DEBUG})
+  set(LIEF_LIBRARY ${LIEF_LIBRARY_DEBUG})
+endif()
+
+
+get_filename_component(LIEF_LIBRARY_RELEASE_DIR ${LIEF_LIBRARY_RELEASE} PATH)
+set(LIEF_LIBRARY_DIR ${LIEF_LIBRARY_RELEASE_DIR})
+
+# handle the QUIETLY and REQUIRED arguments and set LIEF_FOUND to TRUE if all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(LIEF DEFAULT_MSG
+  LIEF_INCLUDE_DIR
+  LIEF_LIBRARY
+  LIEF_LIBRARY_DIR)
+
+mark_as_advanced(
+  LIEF_INCLUDE_DIR
+  LIEF_LIBRARY_DIR
+  LIEF_LIBRARY
+  LIEF_LIBRARY_RELEASE
+  LIEF_LIBRARY_RELEASE_DIR)
diff --git a/src/Abstract/Binary.cpp b/src/Abstract/Binary.cpp
new file mode 100644
index 0000000..bdc094e
--- /dev/null
+++ b/src/Abstract/Binary.cpp
@@ -0,0 +1,110 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/Abstract/Binary.hpp"
+#include "LIEF/exception.hpp"
+
+namespace LIEF {
+Binary::Binary(void) :
+  original_size_{0}
+{}
+Binary::~Binary(void) = default;
+Binary& Binary::operator=(const Binary& copy) = default;
+Binary::Binary(const Binary& copy) = default;
+
+
+Header Binary::get_header(void) const {
+  return this->get_abstract_header();
+}
+
+it_symbols Binary::get_symbols(void) {
+  return it_symbols{this->get_abstract_symbols()};
+}
+
+it_const_symbols Binary::get_symbols(void) const {
+  return it_const_symbols{const_cast<Binary*>(this)->get_abstract_symbols()};
+}
+
+it_sections Binary::get_sections(void) {
+  return it_sections{this->get_abstract_sections()};
+}
+
+
+it_const_sections Binary::get_sections(void) const {
+  return it_const_sections{const_cast<Binary*>(this)->get_abstract_sections()};
+}
+
+
+std::vector<std::string> Binary::get_exported_functions(void) const {
+  return this->get_abstract_exported_functions();
+}
+
+std::vector<std::string> Binary::get_imported_functions(void) const {
+  return this->get_abstract_imported_functions();
+}
+
+
+std::vector<std::string> Binary::get_imported_libraries(void) const {
+  return this->get_abstract_imported_libraries();
+}
+
+uint64_t Binary::get_function_address(const std::string&) const {
+  throw not_implemented("Not implemented for this format");
+}
+
+
+void Binary::accept(Visitor& visitor) const {
+  visitor(this->get_header());
+  for (const Section& section : const_cast<Binary*>(this)->get_sections()) {
+    visitor(section);
+  }
+
+
+  for (const Symbol& symbol : const_cast<Binary*>(this)->get_symbols()) {
+    visitor(symbol);
+  }
+}
+
+const std::string& Binary::name(void) const {
+  return this->name_;
+}
+
+
+uint64_t Binary::original_size(void) const {
+  return this->original_size_;
+}
+
+
+void Binary::name(const std::string& name) {
+  this->name_ = name;
+}
+
+
+void Binary::original_size(uint64_t size) {
+  this->original_size_ = size;
+}
+
+
+std::ostream& Binary::print(std::ostream& os) const {
+  return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const Binary& binary) {
+  binary.print(os);
+  return os;
+}
+
+
+}
diff --git a/src/Abstract/EnumToString.cpp b/src/Abstract/EnumToString.cpp
new file mode 100644
index 0000000..79db0b9
--- /dev/null
+++ b/src/Abstract/EnumToString.cpp
@@ -0,0 +1,86 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/Abstract/EnumToString.hpp"
+#include <map>
+
+namespace LIEF {
+
+const char* to_string(FILE_FORMATS e) {
+  const std::map<FILE_FORMATS, const char*> enumStrings {
+    { FILE_FORMATS::FORMAT_ELF,   "ELF"   },
+    { FILE_FORMATS::FORMAT_PE,    "PE"    },
+    { FILE_FORMATS::FORMAT_MACHO, "MACHO" },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(OBJECT_TYPES e) {
+  const std::map<OBJECT_TYPES, const char*> enumStrings {
+    { OBJECT_TYPES::TYPE_NONE,       "NONE"       },
+    { OBJECT_TYPES::TYPE_EXECUTABLE, "EXECUTABLE" },
+    { OBJECT_TYPES::TYPE_LIBRARY,    "LIBRARY"    },
+    { OBJECT_TYPES::TYPE_OBJECT,     "OBJECT"     },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(ARCHITECTURES e) {
+  const std::map<ARCHITECTURES, const char*> enumStrings {
+    { ARCHITECTURES::ARCH_NONE,  "NONE"  },
+    { ARCHITECTURES::ARCH_ARM,   "ARM"   },
+    { ARCHITECTURES::ARCH_ARM64, "ARM64" },
+    { ARCHITECTURES::ARCH_MIPS,  "MIPS"  },
+    { ARCHITECTURES::ARCH_X86,   "X86"    },
+    { ARCHITECTURES::ARCH_PPC,   "PPC"   },
+    { ARCHITECTURES::ARCH_SPARC, "SPARC" },
+    { ARCHITECTURES::ARCH_SYSZ,  "SYSZ"  },
+    { ARCHITECTURES::ARCH_XCORE, "XCODE" },
+    { ARCHITECTURES::ARCH_INTEL, "INTEL" },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+
+const char* to_string(MODES e) {
+  const std::map<MODES, const char*> enumStrings {
+    { MODES::MODE_NONE,          "NONE"  },
+    { MODES::MODE_LITTLE_ENDIAN, "LITTLE_ENDIAN"   },
+    { MODES::MODE_BIG_ENDIAN,    "BIG_ENDIAN" },
+    { MODES::MODE_16,            "16"  },
+    { MODES::MODE_32,            "32"    },
+    { MODES::MODE_64,            "64"   },
+    { MODES::MODE_ARM,           "ARM" },
+    { MODES::MODE_THUMB,         "THUMB"  },
+    { MODES::MODE_MCLASS,        "MCLASS" },
+    { MODES::MODE_MIPS3,         "MIPS3" },
+    { MODES::MODE_MIPS32R6,      "MIPS32R6" },
+    { MODES::MODE_MIPSGP64,      "MIPSGP64" },
+    { MODES::MODE_V7,            "V7" },
+    { MODES::MODE_V8,            "V8" },
+    { MODES::MODE_V9,            "V9" },
+    { MODES::MODE_MIPS32,        "MIPS32" },
+    { MODES::MODE_MIPS64,        "MIPS64" },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+} // namespace LIEF
+
+
+
diff --git a/src/Abstract/Header.cpp b/src/Abstract/Header.cpp
new file mode 100644
index 0000000..40d3c27
--- /dev/null
+++ b/src/Abstract/Header.cpp
@@ -0,0 +1,96 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+#include <numeric>
+
+#include "LIEF/Abstract/Header.hpp"
+#include "LIEF/Abstract/EnumToString.hpp"
+
+namespace LIEF {
+Header::Header(const Header&) = default;
+Header& Header::operator=(const Header&) = default;
+Header::~Header(void) = default;
+
+
+Header::Header(void) :
+  architecture_{ARCHITECTURES::ARCH_NONE},
+  modes_{},
+  object_type_{OBJECT_TYPES::TYPE_NONE},
+  entrypoint_{0}
+{}
+
+
+ARCHITECTURES Header::architecture(void) const {
+  return this->architecture_;
+}
+
+
+OBJECT_TYPES Header::object_type(void) const {
+  return this->object_type_;
+}
+
+
+const std::set<MODES>& Header::modes(void) const {
+  return this->modes_;
+}
+
+
+uint64_t Header::entrypoint(void) const {
+  return this->entrypoint_;
+}
+
+
+void Header::accept(Visitor&) const {
+}
+
+
+void Header::architecture(ARCHITECTURES arch) {
+  this->architecture_ = arch;
+}
+
+
+void Header::object_type(OBJECT_TYPES type) {
+  this->object_type_ = type;
+}
+
+
+void Header::modes(const std::set<MODES>& m) {
+  this->modes_ = m;
+}
+
+
+void Header::entrypoint(uint64_t entrypoint) {
+  this->entrypoint_ = entrypoint;
+}
+
+std::ostream& operator<<(std::ostream& os, const Header& hdr) {
+
+  const std::set<MODES>& m = hdr.modes();
+  std::string modes = std::accumulate(
+     std::begin(m),
+     std::end(m), std::string{},
+     [] (const std::string& a, MODES b) {
+         return a.empty() ? to_string(b) : a + "-" + to_string(b);
+     });
+  os << std::hex << std::left;
+
+  os << std::setw(33) << std::setfill(' ') << "Architecture:" << to_string(hdr.architecture()) << "_" << modes << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Entrypoint:"   << "0x" << hdr.entrypoint() << std::endl;
+  return os;
+}
+
+
+}
diff --git a/src/Abstract/Parser.cpp b/src/Abstract/Parser.cpp
new file mode 100644
index 0000000..c5d88de
--- /dev/null
+++ b/src/Abstract/Parser.cpp
@@ -0,0 +1,82 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/Abstract/Parser.hpp"
+
+#include "LIEF/ELF/utils.hpp"
+#include "LIEF/ELF/Parser.hpp"
+
+#include "LIEF/PE/utils.hpp"
+#include "LIEF/PE/Parser.hpp"
+
+#include "LIEF/MachO/utils.hpp"
+#include "LIEF/MachO/Parser.hpp"
+
+#include "LIEF/exception.hpp"
+
+namespace LIEF {
+Parser::~Parser(void) = default;
+Parser::Parser(void)  = default;
+
+Binary* Parser::parse(const std::string& filename) {
+
+#if defined(LIEF_ELF_MODULE)
+  if (ELF::is_elf(filename)) {
+    return ELF::Parser::parse(filename);
+  }
+#endif
+
+
+#if defined(LIEF_PE_MODULE)
+  if (PE::is_pe(filename)) {
+     return PE::Parser::parse(filename);
+  }
+#endif
+
+#if defined(LIEF_MACHO_MODULE)
+  if (MachO::is_macho(filename)) {
+    // For fat binary we take the last one...
+    std::vector<MachO::Binary*> binaries = MachO::Parser::parse(filename);
+    MachO::Binary* binary_return = binaries.back();
+    binaries.pop_back();
+    // delete others
+    for (MachO::Binary* binary : binaries) {
+      delete binary;
+    }
+    return binary_return;
+  }
+#endif
+
+  throw bad_file("Unknown format");
+
+}
+
+Parser::Parser(const std::string& filename) :
+  binary_size_{0},
+  binary_name_{filename}
+{
+  std::ifstream file(filename, std::ios::in | std::ios::binary);
+
+  if (file) {
+    file.unsetf(std::ios::skipws);
+    file.seekg(0, std::ios::end);
+    this->binary_size_ = static_cast<uint64_t>(file.tellg());
+    file.seekg(0, std::ios::beg);
+  } else {
+    throw LIEF::bad_file("Unable to open " + filename);
+  }
+}
+
+}
diff --git a/src/Abstract/Section.cpp b/src/Abstract/Section.cpp
new file mode 100644
index 0000000..adda449
--- /dev/null
+++ b/src/Abstract/Section.cpp
@@ -0,0 +1,137 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <array>
+#include <iostream>
+#include <algorithm>
+#include <cmath>
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/Abstract/Section.hpp"
+
+namespace LIEF {
+Section::Section(void) :
+  name_{""},
+  virtual_address_{0},
+  size_{0},
+  offset_{0}
+{}
+
+
+Section::~Section(void) = default;
+Section& Section::operator=(const Section& copy) = default;
+Section::Section(const Section& copy) = default;
+
+const std::string& Section::name(void) const {
+  return this->name_;
+}
+
+
+void Section::name(const std::string& name) {
+  this->name_ = name;
+}
+
+
+void Section::content(const std::vector<uint8_t>&) {
+  throw not_supported("Not supported by this format");
+}
+
+
+std::vector<uint8_t> Section::content(void) const {
+  throw not_supported("Not supported by this format");
+}
+
+
+uint64_t Section::size(void) const {
+  return this->size_;
+}
+
+
+void Section::size(uint64_t size) {
+  this->size_ = size;
+}
+
+
+
+uint64_t Section::offset(void) const {
+  return this->offset_;
+}
+
+
+uint64_t Section::virtual_address(void) const {
+  return this->virtual_address_;
+}
+
+void Section::virtual_address(uint64_t virtual_address) {
+  this->virtual_address_ = virtual_address;;
+}
+
+void Section::offset(uint64_t offset) {
+  this->offset_ = offset;
+}
+
+
+double Section::entropy(void) const {
+  std::array<uint64_t, 256> frequencies = { {0} };
+  const std::vector<uint8_t>& content = this->content();
+  for (uint8_t x : content) {
+    frequencies[x]++;
+  }
+
+  double entropy = 0.0;
+  for (uint64_t p : frequencies) {
+    if (p > 0) {
+      double freq = static_cast<double>(p) / static_cast<double>(content.size());
+      entropy += freq * std::log2(freq) ;
+    }
+  }
+  return (-entropy);
+}
+
+
+void Section::accept(Visitor& visitor) const {
+  visitor.visit(this->name());
+  visitor.visit(this->virtual_address());
+  visitor.visit(this->offset());
+  visitor.visit(this->size());
+}
+
+
+bool Section::operator==(const Section& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Section::operator!=(const Section& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const Section& entry) {
+  os << std::hex;
+  os << std::left
+     << std::setw(30) << entry.name()
+     << std::setw(10) << entry.virtual_address()
+     << std::setw(10) << entry.size()
+     << std::setw(10) << entry.offset()
+     << std::setw(10) << entry.entropy();
+
+  return os;
+}
+
+}
diff --git a/src/Abstract/Symbol.cpp b/src/Abstract/Symbol.cpp
new file mode 100644
index 0000000..d3735e2
--- /dev/null
+++ b/src/Abstract/Symbol.cpp
@@ -0,0 +1,60 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <iostream>
+
+#include "LIEF/Abstract/Symbol.hpp"
+
+namespace LIEF {
+Symbol::Symbol(void) = default;
+Symbol::Symbol(const Symbol&) = default;
+Symbol& Symbol::operator=(const Symbol&) = default;
+Symbol::~Symbol(void) = default;
+
+Symbol::Symbol(const std::string& name) :
+  name_{name}
+{}
+
+const std::string& Symbol::name(void) const {
+  return this->name_;
+}
+
+void Symbol::name(const std::string& name) {
+  this->name_ = name;
+}
+
+
+void Symbol::accept(Visitor& visitor) const {
+  visitor.visit(this->name());
+}
+
+std::ostream& operator<<(std::ostream& os, const Symbol& entry) {
+  std::string name = entry.name();
+  // UTF8 -> ASCII
+  std::transform(
+      std::begin(name),
+      std::end(name),
+      std::begin(name), []
+      (unsigned char c) { return (c < 127 and c > 32) ? c : ' ';});
+  if (name.size() > 20) {
+    name = name.substr(0, 17) + "...";
+  }
+  os << name;
+
+  return os;
+}
+}
+
diff --git a/src/BinaryStream/BinaryStream.cpp b/src/BinaryStream/BinaryStream.cpp
new file mode 100644
index 0000000..f3d5620
--- /dev/null
+++ b/src/BinaryStream/BinaryStream.cpp
@@ -0,0 +1,19 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/BinaryStream/BinaryStream.hpp"
+
+BinaryStream::~BinaryStream(void) = default;
+
diff --git a/src/BinaryStream/VectorStream.cpp b/src/BinaryStream/VectorStream.cpp
new file mode 100644
index 0000000..5732313
--- /dev/null
+++ b/src/BinaryStream/VectorStream.cpp
@@ -0,0 +1,94 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iterator>
+#include <vector>
+#include <string>
+#include <fstream>
+#include <cassert>
+#include <sstream>
+
+#include "easylogging++.h"
+
+#include "LIEF/BinaryStream/VectorStream.hpp"
+#include "LIEF/exception.hpp"
+
+VectorStream::VectorStream(const std::string& filename) {
+  std::ifstream binary(filename, std::ios::in | std::ios::binary);
+
+  if (binary) {
+    binary.unsetf(std::ios::skipws);
+    binary.seekg(0, std::ios::end);
+    assert(binary.tellg() > 0);
+    const uint64_t filesize = static_cast<uint64_t>(binary.tellg());
+    binary.seekg(0, std::ios::beg);
+
+    // reserve capacity
+    this->binary_.resize(filesize + 30, 0);
+    std::copy(
+      std::istreambuf_iterator<char>(binary),
+      std::istreambuf_iterator<char>(),
+      std::begin(this->binary_)
+    );
+    binary.close();
+  } else {
+    throw LIEF::bad_file("Unable to open " + filename);
+  }
+}
+
+
+VectorStream::VectorStream(const std::vector<uint8_t>& data):
+  binary_(data)
+{}
+
+
+uint64_t VectorStream::size(void) const {
+  return this->binary_.size();
+}
+
+
+const void* VectorStream::read(uint64_t offset, uint64_t size) const {
+
+  if (offset > this->binary_.size() or (offset + size) > this->binary_.size()) {
+    LOG(DEBUG) << "Offset: " << std::hex << offset << std::endl;
+    LOG(DEBUG) << "Size:   " << std::hex << size   << std::endl;
+
+    if (offset > this->binary_.size()) {
+      throw LIEF::read_out_of_bound(offset);
+    }
+
+    if ((offset + size) > this->binary_.size()) {
+      throw LIEF::read_out_of_bound(offset, size);
+    }
+  }
+  return this->binary_.data() + offset;
+
+}
+
+
+const char* VectorStream::read_string(uint64_t offset) const {
+
+  if (offset > this->binary_.size()) {
+    throw LIEF::read_out_of_bound(offset);
+  }
+  return reinterpret_cast<const char*>(this->binary_.data() + offset);
+
+}
+
+
+const std::vector<uint8_t>& VectorStream::content(void) const {
+  return this->binary_;
+}
+
diff --git a/src/ELF/Binary.cpp b/src/ELF/Binary.cpp
new file mode 100644
index 0000000..1e72743
--- /dev/null
+++ b/src/ELF/Binary.cpp
@@ -0,0 +1,1575 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <iterator>
+#include <numeric>
+
+#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
+#include <unistd.h>
+#else
+#define getpagesize() 0x1000
+#endif
+
+#include <stdexcept>
+
+#include "easylogging++.h"
+
+#include "LIEF/exception.hpp"
+#include "LIEF/utils.hpp"
+
+#include "LIEF/ELF/EnumToString.hpp"
+#include "LIEF/ELF/Binary.hpp"
+#include "LIEF/ELF/Builder.hpp"
+
+namespace LIEF {
+namespace ELF {
+Binary::Binary(void)  = default;
+
+Binary::Binary(const std::string& name, ELF_CLASS type) : type_{type} {
+  this->name_ = name;
+  if (type_ == ELF_CLASS::ELFCLASS32) {
+  }
+  else if (type_ == ELF_CLASS::ELFCLASS32) {
+  }
+}
+
+
+Header& Binary::get_header(void) {
+  return const_cast<Header&>(static_cast<const Binary*>(this)->get_header());
+}
+
+
+const Header& Binary::get_header(void) const {
+  return this->header_;
+}
+
+
+ELF_CLASS Binary::type(void) const {
+  return this->type_;
+}
+
+size_t Binary::hash(const std::string& name) {
+  if (this->type_ == ELFCLASS32) {
+    return hash32(name.c_str());
+  } else {
+    return hash32(name.c_str());
+  }
+}
+
+LIEF::sections_t Binary::get_abstract_sections(void) {
+  return {std::begin(this->sections_), std::end(this->sections_)};
+}
+
+
+// Sections
+// ========
+
+it_sections Binary::get_sections(void) {
+  return it_sections{std::ref(this->sections_)};
+}
+
+
+it_const_sections Binary::get_sections(void) const {
+  return it_const_sections{std::cref(this->sections_)};
+}
+
+// Segments
+// ========
+
+it_segments Binary::get_segments(void) {
+  return it_segments{std::ref(this->segments_)};
+}
+
+it_const_segments Binary::get_segments(void) const {
+  return it_const_segments{std::ref(this->segments_)};
+}
+
+
+std::vector<std::string> Binary::get_abstract_exported_functions(void) const {
+  std::vector<std::string> result;
+  for (const Symbol& symbol : this->get_exported_symbols()) {
+    if (symbol.type() == SYMBOL_TYPES::STT_FUNC) {
+      result.push_back(symbol.name());
+    }
+  }
+  return result;
+}
+
+
+std::vector<std::string> Binary::get_abstract_imported_functions(void) const {
+  std::vector<std::string> result;
+  for (const Symbol& symbol : this->get_imported_symbols()) {
+    if (symbol.type() == SYMBOL_TYPES::STT_FUNC) {
+      result.push_back(symbol.name());
+    }
+  }
+  return result;
+}
+
+
+std::vector<std::string> Binary::get_abstract_imported_libraries(void) const {
+  std::vector<std::string> result;
+  for (const DynamicEntry& entry : this->get_dynamic_entries()) {
+    if (dynamic_cast<const DynamicEntryLibrary*>(&entry)) {
+      result.push_back(dynamic_cast<const DynamicEntryLibrary*>(&entry)->name());
+    }
+  }
+  return result;
+}
+
+
+// Dynamic Entries
+// ===============
+
+it_dynamic_entries Binary::get_dynamic_entries(void) {
+  return it_dynamic_entries{std::ref(this->dynamic_entries_)};
+}
+
+it_const_dynamic_entries Binary::get_dynamic_entries(void) const {
+  return it_const_dynamic_entries{std::cref(this->dynamic_entries_)};
+}
+
+
+
+// Symbols
+// =======
+
+// Statics
+// -------
+
+it_symbols Binary::get_static_symbols(void) {
+  return it_symbols{std::ref(this->static_symbols_)};
+}
+
+it_const_symbols Binary::get_static_symbols(void) const {
+  return it_const_symbols{std::cref(this->static_symbols_)};
+}
+
+// Dynamics
+// --------
+
+it_symbols Binary::get_dynamic_symbols(void) {
+  return it_symbols{std::ref(this->dynamic_symbols_)};
+}
+
+it_const_symbols Binary::get_dynamic_symbols(void) const {
+  return it_const_symbols{std::cref(this->dynamic_symbols_)};
+}
+
+// Exported
+// --------
+
+bool Binary::is_exported(const Symbol& symbol) {
+  return ((symbol.binding() == SYMBOL_BINDINGS::STB_GLOBAL or
+        symbol.binding() == SYMBOL_BINDINGS::STB_WEAK) and
+        symbol.shndx() != SYMBOL_SECTION_INDEX::SHN_UNDEF);
+}
+
+it_exported_symbols Binary::get_exported_symbols(void) {
+  return {this->dynamic_symbols_,
+    [] (const Symbol* symbol) { return is_exported(*symbol); }
+  };
+}
+
+it_const_exported_symbols Binary::get_exported_symbols(void) const {
+  return {this->dynamic_symbols_,
+    [] (const Symbol* symbol) { return is_exported(*symbol); }
+  };
+}
+
+
+
+// Imported
+// --------
+
+bool Binary::is_imported(const Symbol& symbol) {
+  return symbol.shndx() == SYMBOL_SECTION_INDEX::SHN_UNDEF;
+}
+
+it_imported_symbols Binary::get_imported_symbols(void) {
+  return filter_iterator<symbols_t>{std::ref(this->dynamic_symbols_),
+    [] (const Symbol* symbol) { return is_imported(*symbol); }
+  };
+}
+
+it_const_imported_symbols Binary::get_imported_symbols(void) const {
+  return const_filter_iterator<symbols_t>{std::cref(this->dynamic_symbols_),
+    [] (const Symbol* symbol) { return is_imported(*symbol); }
+  };
+}
+
+
+// Symbol version
+// --------------
+
+it_symbols_version Binary::get_symbols_version(void) {
+  return it_symbols_version{std::ref(this->symbol_version_table_)};
+}
+
+it_const_symbols_version Binary::get_symbols_version(void) const {
+  return it_const_symbols_version{std::cref(this->symbol_version_table_)};
+}
+
+// Symbol version definition
+// -------------------------
+
+it_symbols_version_definition Binary::get_symbols_version_definition(void) {
+  return it_symbols_version_definition{std::ref(this->symbol_version_definition_)};
+}
+
+it_const_symbols_version_definition Binary::get_symbols_version_definition(void) const {
+  return it_const_symbols_version_definition{std::cref(this->symbol_version_definition_)};
+}
+
+// Symbol version requirement
+// --------------------------
+
+it_symbols_version_requirement Binary::get_symbols_version_requirement(void) {
+  return it_symbols_version_requirement{std::ref(this->symbol_version_requirements_)};
+}
+
+it_const_symbols_version_requirement Binary::get_symbols_version_requirement(void) const {
+  return it_const_symbols_version_requirement{std::cref(this->symbol_version_requirements_)};
+}
+
+void Binary::remove_symbol(const std::string& name) {
+  this->remove_static_symbol(name);
+  this->remove_dynamic_symbol(name);
+}
+
+
+void Binary::remove_static_symbol(const std::string& name) {
+  auto&& it_symbol = std::find_if(
+      std::begin(this->static_symbols_),
+      std::end(this->static_symbols_),
+      [&name] (const Symbol* symbol) {
+        return symbol != nullptr and symbol->name() == name;
+      });
+
+  if (it_symbol == std::end(this->static_symbols_)) {
+    throw not_found("Can't find '" + name + "'");
+  }
+
+  this->remove_static_symbol(*it_symbol);
+
+}
+
+void Binary::remove_static_symbol(Symbol* symbol) {
+  auto&& it_symbol = std::find_if(
+      std::begin(this->static_symbols_),
+      std::end(this->static_symbols_),
+      [&symbol] (const Symbol* sym) {
+        return sym != nullptr and sym != nullptr and *symbol == *sym;
+      });
+
+  if (it_symbol == std::end(this->static_symbols_)) {
+    throw not_found("Can't find '" + symbol->name() + "'");
+  }
+
+  delete *it_symbol;
+  this->dynamic_symbols_.erase(it_symbol);
+
+  symbol = nullptr;
+
+}
+
+
+
+void Binary::remove_dynamic_symbol(const std::string& name) {
+  auto&& it_symbol = std::find_if(
+      std::begin(this->dynamic_symbols_),
+      std::end(this->dynamic_symbols_),
+      [&name] (const Symbol* symbol) {
+        return symbol != nullptr and symbol->name() == name;
+      });
+
+  if (it_symbol == std::end(this->dynamic_symbols_)) {
+    throw not_found("Can't find '" + name + "'");
+  }
+
+  this->remove_dynamic_symbol(*it_symbol);
+
+}
+
+void Binary::remove_dynamic_symbol(Symbol* symbol) {
+  auto&& it_symbol = std::find_if(
+      std::begin(this->dynamic_symbols_),
+      std::end(this->dynamic_symbols_),
+      [&symbol] (const Symbol* sym) {
+        return symbol != nullptr and sym != nullptr and *symbol == *sym;
+      });
+
+  if (it_symbol == std::end(this->dynamic_symbols_)) {
+    throw not_found("Can't find '" + symbol->name() + "'");
+  }
+
+
+  // Update relocations
+  auto&& it_relocation = std::find_if(
+      std::begin(this->pltgot_relocations_),
+      std::end(this->pltgot_relocations_),
+      [&symbol] (const Relocation* relocation) {
+        return relocation != nullptr and relocation->has_symbol() and relocation->symbol() == *symbol;
+      });
+
+  if (it_relocation != std::end(this->pltgot_relocations_)) {
+    delete *it_relocation;
+    this->pltgot_relocations_.erase(it_relocation);
+  } else {
+  }
+
+
+  it_relocation = std::find_if(
+      std::begin(this->dynamic_relocations_),
+      std::end(this->dynamic_relocations_),
+      [&symbol] (const Relocation* relocation) {
+        return relocation != nullptr and relocation->has_symbol() and relocation->symbol() == *symbol;
+      });
+  if (it_relocation != std::end(this->dynamic_relocations_)) {
+    delete *it_relocation;
+    this->dynamic_relocations_.erase(it_relocation);
+  }
+
+  // Update symbol versions
+  if (symbol->has_version()) {
+    this->symbol_version_table_.erase(
+        std::remove(
+          std::begin(this->symbol_version_table_),
+          std::end(this->symbol_version_table_),
+          symbol->symbol_version_));
+    delete symbol->symbol_version_;
+
+  }
+
+  delete *it_symbol;
+  this->dynamic_symbols_.erase(it_symbol);
+
+  symbol = nullptr;
+
+}
+
+
+// Relocations
+// ===========
+
+// Dynamics
+// --------
+
+it_relocations Binary::get_dynamic_relocations(void) {
+  return it_relocations{std::ref(this->dynamic_relocations_)};
+}
+
+it_const_relocations Binary::get_dynamic_relocations(void) const {
+  return it_const_relocations{std::cref(this->dynamic_relocations_)};
+}
+
+// plt/got
+// -------
+it_relocations Binary::get_pltgot_relocations(void) {
+  return it_relocations{std::ref(this->pltgot_relocations_)};
+}
+
+it_const_relocations Binary::get_pltgot_relocations(void) const {
+  return it_const_relocations{std::cref(this->pltgot_relocations_)};
+}
+
+LIEF::symbols_t Binary::get_abstract_symbols(void) {
+  return {std::begin(this->dynamic_symbols_), std::end(this->dynamic_symbols_)};
+}
+
+
+Section& Binary::get_section(const std::string& name) {
+  return const_cast<Section&>(static_cast<const Binary*>(this)->get_section(name));
+}
+
+const Section& Binary::get_section(const std::string& name) const {
+  auto&& it_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [&name] (const Section* section)
+      {
+        return section != nullptr and section->name() == name;
+      });
+
+  if (it_section == std::end(this->sections_)) {
+    throw not_found("Unable to find section '" + name + "'");
+  }
+  return **it_section;
+
+}
+
+Section& Binary::get_text_section(void) {
+  return this->get_section(".text");
+}
+
+
+Section& Binary::get_dynamic_section(void) {
+
+  auto&& it_dynamic_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [] (const Section* section) {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_DYNAMIC;
+      });
+
+  if (it_dynamic_section == std::end(this->sections_)) {
+    throw not_found("Unable to find the SHT_DYNAMIC section");
+  }
+
+  return **it_dynamic_section;
+
+}
+
+Section& Binary::get_hash_section(void) {
+  auto&& it_hash_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [] (const Section* section) {
+        return section != nullptr and (section->type() == SECTION_TYPES::SHT_HASH or
+            section->type() == SECTION_TYPES::SHT_GNU_HASH);
+      });
+
+  if (it_hash_section == std::end(this->sections_)) {
+    throw not_found("Unable to find the SHT_HASH / SHT_GNU_HASH section");
+  }
+
+  return **it_hash_section;
+
+}
+
+Section& Binary::get_static_symbols_section(void) {
+
+  auto&& it_symtab_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_SYMTAB;
+      });
+
+
+  if (it_symtab_section == std::end(this->sections_)) {
+    throw not_found("Unable to find a SHT_SYMTAB section");
+  }
+
+  return **it_symtab_section;
+}
+
+uint64_t Binary::get_imagebase(void) const {
+  uint64_t imagebase = static_cast<uint64_t>(-1);
+  for (const Segment* segment : this->segments_) {
+    if (segment != nullptr and segment->type() == SEGMENT_TYPES::PT_LOAD) {
+      imagebase = std::min(imagebase, segment->virtual_address() - segment->file_offset());
+    }
+  }
+  return imagebase;
+}
+
+uint64_t Binary::get_virtual_size(void) const {
+  uint64_t virtual_size = 0;
+  for (const Segment* segment : this->segments_) {
+    if (segment != nullptr and segment->type() == SEGMENT_TYPES::PT_LOAD) {
+      virtual_size = std::max(virtual_size, segment->virtual_address() + segment->virtual_size());
+    }
+  }
+  virtual_size = align(virtual_size, static_cast<uint64_t>(getpagesize()));
+  return virtual_size - this->get_imagebase();
+}
+
+
+std::vector<uint8_t> Binary::raw(void) {
+  Builder builder{this};
+  builder.build();
+  return builder.get_build();
+}
+
+
+uint64_t Binary::get_function_address(const std::string& func_name) const {
+  try {
+    return this->get_function_address(func_name, true);
+  } catch(const not_found&) {
+    return this->get_function_address(func_name, false);
+  } catch(const not_supported&) {
+    return this->get_function_address(func_name, false);
+  }
+}
+
+uint64_t Binary::get_function_address(const std::string& func_name, bool demangled) const {
+  auto&& it_symbol = std::find_if(
+      std::begin(this->static_symbols_),
+      std::end(this->static_symbols_),
+      [&func_name, &demangled] (const Symbol* symbol) {
+        if (symbol == nullptr) {
+          return false;
+        }
+
+        if (demangled) {
+          return (symbol->demangled_name() == func_name and
+                  symbol->type() == SYMBOL_TYPES::STT_FUNC);
+        } else {
+          return (symbol->name() == func_name and
+                  symbol->type() == SYMBOL_TYPES::STT_FUNC);
+        }
+      });
+
+  if (it_symbol == std::end(this->static_symbols_)) {
+    throw not_found("Can't find the function name");
+  } else {
+    return (*it_symbol)->value();
+  }
+}
+
+Section& Binary::add_section(const Section& section, bool loaded) {
+  Section* new_section = new Section{section};
+  uint32_t new_section_index = 0;
+
+  if (loaded) {
+    // Find the first PROGBITS section
+    // TODO: may not be the first one with if sections not sorted !!!!!
+    auto&& it_progbit_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [] (const Section* s)
+      {
+        return s->type() == SECTION_TYPES::SHT_PROGBITS;
+      });
+
+    if (it_progbit_section == std::end(this->sections_)) {
+      throw not_found("Can't find a SHT_PROGBITS section.");
+    }
+    LOG(DEBUG) << "First SHT_PROGBITS: " << **it_progbit_section << std::endl;
+
+    new_section_index = static_cast<uint32_t>(std::distance(std::begin(this->sections_), it_progbit_section));
+    const Section* progbit_section = *it_progbit_section;
+    new_section->file_offset(progbit_section->file_offset());
+  } else {
+    uint64_t new_section_offset = 0;
+    for (const Section* s : this->sections_) {
+      if (s == nullptr) {
+        continue;
+      }
+
+      if (s->type() != SECTION_TYPES::SHT_NOBITS) { // to avoid .bss section
+        new_section_offset = std::max<uint64_t>(s->file_offset() + s->size(), new_section_offset);
+      }
+    }
+    new_section_index = static_cast<uint32_t>(this->sections_.size());
+    new_section->file_offset(new_section_offset);
+  }
+
+  LOG(DEBUG) << "New section offset: 0x" << std::hex << new_section->file_offset();
+  LOG(DEBUG) << "New section index: " << std::dec << new_section_index;
+
+  // The section size must align on a pagesize
+  const uint64_t psize        = static_cast<uint64_t>(getpagesize());
+  const uint64_t section_size = new_section->size() + (psize - (new_section->size() % psize));
+  new_section->size(section_size);
+
+  if (loaded) {
+    // Patch segments
+    for (Segment* segment : this->segments_) {
+      if (segment->type() == SEGMENT_TYPES::PT_LOAD) {
+
+        //segment->add_flag(SEGMENT_FLAGS::PF_W);
+        segment->virtual_size(segment->virtual_size()         + new_section->size());
+        segment->virtual_address(segment->virtual_address()   - new_section->size());
+
+        segment->physical_size(segment->physical_size()       + new_section->size());
+        segment->physical_address(segment->physical_address() - new_section->size());
+
+        DataHandler::Node& node = this->datahandler_->find(
+            segment->file_offset(),
+            segment->physical_size(),
+            false, DataHandler::Node::SEGMENT);
+        node.size(node.size() +  new_section->size());
+      } else if (segment->type() == SEGMENT_TYPES::PT_PHDR) {
+        segment->virtual_address(segment->virtual_address()   - new_section->size());
+        segment->physical_address(segment->physical_address() - new_section->size());
+        //after PHT
+        new_section->virtual_address(segment->virtual_address() + segment->virtual_size());
+      } else {
+        DataHandler::Node& node = this->datahandler_->find(
+            segment->file_offset(),
+            segment->physical_size(),
+            false,
+            DataHandler::Node::SEGMENT);
+        this->datahandler_->move(node, node.offset() + new_section->size());
+        segment->file_offset(segment->file_offset() + new_section->size());
+      }
+    }
+  }
+  // Patch header
+  this->get_header().numberof_sections(this->get_header().numberof_sections() + 1);
+
+  if (new_section->file_offset() <= this->header_.section_headers_offset()) {
+    this->header_.section_headers_offset(this->header_.section_headers_offset() + new_section->size());
+  }
+
+
+  new_section->datahandler_ = this->datahandler_;
+
+  for (Section* s : this->sections_) {
+    if (s->file_offset() >= new_section->file_offset()) {
+      DataHandler::Node& node = this->datahandler_->find(
+            s->file_offset(),
+            s->size(),
+            false,
+            DataHandler::Node::SECTION);
+      this->datahandler_->move(node, node.offset() + new_section->size());
+      s->file_offset(s->file_offset() + new_section->size());
+    }
+  }
+
+  std::vector<uint8_t> section_content = section.content();
+  this->datahandler_->make_hole(new_section->file_offset(), new_section->size());
+  section_content.resize(new_section->size(), 0);
+  new_section->content(section_content);
+
+  // increment the string section index if we add the section before it.
+  // When we use INSERT and not PUSH_BACK
+  if (new_section_index < this->get_header().section_name_table_idx() and not loaded) {
+    this->get_header().section_name_table_idx(this->get_header().section_name_table_idx() + 1);
+  }
+
+  //this->sections_.insert(itProgbitSection, newSectionPtr);
+  //TODO: use insert instead of push_back but probleme with readelf
+  this->sections_.push_back(new_section);
+  return *(this->sections_.back());
+
+}
+
+
+
+bool Binary::is_pie(void) const {
+  auto&& it_segment = std::find_if(
+      std::begin(this->segments_),
+      std::end(this->segments_),
+      [] (const Segment* entry) {
+        return entry != nullptr and entry->type() == SEGMENT_TYPES::PT_INTERP;
+      });
+
+  if (it_segment != std::end(this->segments_) and
+      this->get_header().file_type() == E_TYPE::ET_DYN) {
+    return true;
+  } else {
+    return false;
+  }
+}
+
+Segment& Binary::add_segment(const Segment& segment, uint64_t base, bool force_note) {
+  const std::vector<uint8_t>& content = segment.content();
+  Segment* new_segment = new Segment{segment};
+  new_segment->datahandler_ = this->datahandler_;
+
+  // Use sections and not segments because some data like (.symtab) are not present in segments
+  const uint64_t last_offset = std::accumulate(
+      std::begin(this->sections_),
+      std::end(this->sections_), 0,
+      [] (uint64_t offset, const Section* section) {
+        return std::max<uint64_t>(section->file_offset() + section->size(), offset);
+      });
+
+  const uint64_t psize = static_cast<uint64_t>(getpagesize());
+  const uint64_t last_offset_aligned = align(last_offset, psize);
+  new_segment->file_offset(last_offset_aligned);
+
+  if (segment.virtual_address() == 0) {
+    new_segment->virtual_address(base + last_offset_aligned);
+  }
+
+  new_segment->physical_address(new_segment->virtual_address());
+
+  uint64_t segmentsize = align(content.size(), psize);
+  new_segment->physical_size(segmentsize);
+  new_segment->virtual_size(segmentsize);
+
+  if (new_segment->alignment() == 0) {
+    new_segment->alignment(psize);
+  }
+
+  // Patch shdr
+  Header& binary_header = this->get_header();
+  const uint64_t new_section_hdr_offset = new_segment->file_offset() + new_segment->physical_size() + 1;
+  binary_header.section_headers_offset(new_section_hdr_offset);
+
+  this->datahandler_->make_hole(last_offset_aligned, new_segment->physical_size());
+
+  new_segment->content(content);
+
+  auto&& it_segment_phdr = std::find_if(
+      std::begin(this->segments_),
+      std::end(this->segments_),
+      [] (const Segment* s)
+      {
+        return s != nullptr and s->type() == SEGMENT_TYPES::PT_PHDR;
+      });
+
+  // If there is a PHDR entry we can't expand the program header table (at least for PIE binaries)
+  // so we have to find a segment which is not mandatory
+  // We choose NOTE section
+  if (it_segment_phdr != std::end(this->segments_) or force_note) {
+    if (it_segment_phdr != std::end(this->segments_)) {
+      Segment *phdr_segment = *it_segment_phdr;
+      const size_t phdr_size = phdr_segment->content().size();
+      phdr_segment->content(std::vector<uint8_t>(phdr_size, 0));
+    }
+
+    auto&& it_segment_note = std::find_if(
+        std::begin(this->segments_),
+        std::end(this->segments_),
+        [] (const Segment* s)
+        {
+          return s != nullptr and s->type() == SEGMENT_TYPES::PT_NOTE;
+        });
+
+    if (it_segment_note == std::end(this->segments_)) {
+      throw not_found("Can't find 'PT_NOTE' segment");
+    }
+
+    this->segments_.erase(it_segment_note);
+  } else {
+    //TODO: Probleme with static binaries
+    this->get_header().numberof_segments(this->get_header().numberof_segments() + 1);
+    this->get_header().program_headers_offset(last_offset_aligned + new_segment->virtual_size());
+    new_segment->physical_size(new_segment->physical_size());
+  }
+
+  this->segments_.push_back(new_segment);
+  return *this->segments_.back();
+
+
+}
+
+// Patch
+// =====
+
+void Binary::patch_address(uint64_t address, const std::vector<uint8_t>& patch_value) {
+  // Find the segment associated with the virtual address
+  Segment& segment_topatch = this->segment_from_virtual_address(address);
+  const uint64_t offset = address - segment_topatch.virtual_address();
+  std::vector<uint8_t> content = segment_topatch.content();
+  std::copy(
+      std::begin(patch_value),
+      std::end(patch_value),
+      content.data() + offset);
+  segment_topatch.content(content);
+}
+
+
+void Binary::patch_address(uint64_t address, uint64_t patch_value, size_t size) {
+  if (size > sizeof(patch_value)) {
+    throw std::runtime_error("Invalid size (" + std::to_string(size) + ")");
+  }
+
+  Segment& segment_topatch = this->segment_from_virtual_address(address);
+  const uint64_t offset = address - segment_topatch.virtual_address();
+  std::vector<uint8_t> content = segment_topatch.content();
+
+  std::copy(
+      reinterpret_cast<uint8_t*>(&patch_value),
+      reinterpret_cast<uint8_t*>(&patch_value) + size,
+      content.data() + offset);
+  segment_topatch.content(content);
+}
+
+
+
+void Binary::patch_pltgot(const Symbol& symbol, uint64_t address) {
+  auto&& it_relocation = std::find_if(
+      std::begin(this->pltgot_relocations_),
+      std::end(this->pltgot_relocations_),
+      [&symbol] (const Relocation* relocation) {
+        return relocation->has_symbol() and relocation->symbol() == symbol;
+      });
+
+  if (it_relocation == std::end(this->pltgot_relocations_)) {
+    throw not_found("Unable to find the relocation associated with symbol '" + symbol.name() + "'");
+  }
+
+  uint64_t got_address = (*it_relocation)->address();
+  this->patch_address(got_address, address, sizeof(uint64_t));
+  //(*it_relocation)->address(0);
+  //delete *it_relocation;
+  //this->pltgot_relocations_.erase(it_relocation);
+}
+
+void Binary::patch_pltgot(const std::string& symbol_name, uint64_t address) {
+  std::for_each(
+      std::begin(this->dynamic_symbols_),
+      std::end(this->dynamic_symbols_),
+      [&symbol_name, address, this] (const Symbol* s) {
+        if (s->name() == symbol_name) {
+          this->patch_pltgot(*s, address);
+        }
+      });
+}
+
+
+const Segment& Binary::segment_from_virtual_address(uint64_t address) const {
+  auto&& it_segment = std::find_if(
+      this->segments_.cbegin(),
+      this->segments_.cend(),
+      [&address] (const Segment* segment) {
+        if (segment == nullptr) {
+          return false;
+        }
+        return ((segment->virtual_address() <= address) and
+            (segment->virtual_address() + segment->virtual_size()) >= address);
+      });
+
+  if (it_segment == this->segments_.cend()) {
+    std::stringstream adr_str;
+    adr_str << "0x" << std::hex << address;
+    throw not_found("Unable to find the segment associated with the " + adr_str.str());
+  }
+
+  return **it_segment;
+
+}
+
+Segment& Binary::segment_from_virtual_address(uint64_t address) {
+  return const_cast<Segment&>(static_cast<const Binary*>(this)->segment_from_virtual_address(address));
+}
+
+
+const Segment& Binary::segment_from_offset(uint64_t offset) const {
+  auto&& it_segment = std::find_if(
+      this->segments_.cbegin(),
+      this->segments_.cend(),
+      [&offset] (const Segment* segment) {
+        if (segment == nullptr) {
+          return false;
+        }
+
+        return ((segment->file_offset() <= offset) and
+            (segment->file_offset() + segment->physical_size()) > offset);
+      });
+
+  if (it_segment == this->segments_.cend()) {
+    throw not_found("Unable to find the segment");
+  }
+
+  return **it_segment;
+}
+
+Segment& Binary::segment_from_offset(uint64_t offset) {
+  return const_cast<Segment&>(static_cast<const Binary*>(this)->segment_from_offset(offset));
+}
+
+void Binary::remove_section(const std::string& name) {
+  auto&& it_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [&name] (const Section* section) {
+        return section != nullptr and section->name() == name;
+      });
+
+  if (it_section == std::end(this->sections_)) {
+    throw not_found("Unable to find the section");
+  }
+
+  Section* section = *it_section;
+
+  // First clear the content
+  section->content(std::vector<uint8_t>(section->size(), 0));
+
+  // Patch header
+  this->get_header().numberof_sections(this->get_header().numberof_sections() - 1);
+
+  // Remove from sections vector
+  this->sections_.erase(it_section);
+}
+
+std::pair<uint64_t, uint64_t> Binary::insert_content(std::vector<uint8_t>& content) {
+
+  // Find the first SHT_PROGBIT Section. New content will be added before it
+  // TODO: maynot be the first one with if sections not sorted !!!!!
+  auto&& it_first_progbit = find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [] (const Section* section)
+      {
+        return (section->type() == SECTION_TYPES::SHT_PROGBITS) and
+                section->name() != ".interp";
+      });
+
+  if (it_first_progbit == std::end(this->sections_)) {
+    throw not_found("Unable to find a SHT_PROGBITS section");
+  }
+
+  const ARCH arch = this->get_header().machine_type();
+
+  Section *progbit_section = *it_first_progbit;
+
+  LOG(DEBUG) << "Data will be inserted before the section: " << *progbit_section;
+
+  // We align on page size
+  const uint64_t psize = static_cast<uint64_t>(getpagesize());
+  const uint64_t new_section_size = content.size() + (psize - (content.size() % psize));
+
+  // Virtual address of data inserted
+  const uint64_t stub_virtual_address = progbit_section->virtual_address();
+
+  LOG(DEBUG) << "New data VA 0x" << std::hex << stub_virtual_address;
+
+  // Offset of data inserted
+  const uint64_t sectionOffset = progbit_section->file_offset();
+
+  LOG(DEBUG) << "New data offset 0x" << std::hex << sectionOffset;
+
+  // To remove if we don't want to include data in the section
+  progbit_section->size(progbit_section->size() + new_section_size);
+
+  // <=> malloc
+  this->datahandler_->make_hole(sectionOffset, new_section_size);
+
+  // ============
+  // Patch Header
+  // ============
+  this->get_header().section_headers_offset(this->get_header().section_headers_offset() + new_section_size);
+
+  // ==============
+  // Patch sections
+  // ==============
+  for (Section* section : this->sections_) {
+    // Use >= if you don't want to **include** data in the section
+    if (section->file_offset() > sectionOffset) {
+      DataHandler::Node& node = this->datahandler_->find(
+          section->file_offset(),
+          section->size(),
+          false,
+          DataHandler::Node::SECTION);
+      this->datahandler_->move(node, node.offset() + new_section_size);
+      section->file_offset(section->file_offset() + new_section_size);
+      section->virtual_address(section->virtual_address() + new_section_size);
+    }
+  }
+
+  // ==============
+  // Patch Segments
+  // ==============
+  for (Segment* segment : this->segments_) {
+    if (segment->type() == SEGMENT_TYPES::PT_LOAD) {
+      segment->add_flag(SEGMENT_FLAGS::PF_W); // TODO: Improve
+    }
+
+    if (segment->file_offset() > sectionOffset) {
+      DataHandler::Node& node = this->datahandler_->find(
+          segment->file_offset(),
+          segment->physical_size(),
+          false,
+          DataHandler::Node::SEGMENT);
+      this->datahandler_->move(node, node.offset() + new_section_size);
+
+      segment->file_offset(segment->file_offset() + new_section_size);
+      segment->virtual_address(segment->virtual_address() + new_section_size);
+      segment->physical_address(segment->physical_address() + new_section_size);
+    }
+
+    // Patch segment size for the segment which contains the new section
+    if ((segment->file_offset() + segment->physical_size()) >= sectionOffset and
+        sectionOffset >= segment->file_offset()) {
+
+      DataHandler::Node& node = this->datahandler_->find(
+          segment->file_offset(),
+          segment->physical_size(),
+          false,
+          DataHandler::Node::SEGMENT);
+      node.size(node.size() + new_section_size);
+
+      segment->virtual_size(segment->virtual_size()   + new_section_size);
+      segment->physical_size(segment->physical_size() + new_section_size);
+      uint64_t relativeOffset = sectionOffset - segment->file_offset();
+      std::vector<uint8_t> segmentData = segment->content();
+      std::copy(
+          std::begin(content),
+          std::end(content),
+          segmentData.data() + relativeOffset);
+      segment->content(segmentData);
+
+    }
+  }
+
+  // =====================================
+  // Patch DT_INIT_ARRAY and DT_FINI_ARRAY
+  // =====================================
+  auto&& it_dtinit = std::find_if(
+      std::begin(this->dynamic_entries_),
+      std::end(this->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry->tag() == DYNAMIC_TAGS::DT_INIT_ARRAY;
+      });
+
+  auto&& it_dtfini = std::find_if(
+      std::begin(this->dynamic_entries_),
+      std::end(this->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry->tag() == DYNAMIC_TAGS::DT_FINI_ARRAY;
+      });
+
+  // DT_INIT
+  // -------
+  if (it_dtinit != std::end(this->dynamic_entries_)) {
+    std::vector<uint64_t>& array = (*it_dtinit)->array();
+    for (uint64_t& address : array) {
+      if (address > stub_virtual_address) {
+        address += new_section_size;
+      }
+    }
+  }
+
+  // DT_FINI
+  // -------
+  if (it_dtfini != std::end(this->dynamic_entries_)) {
+    std::vector<uint64_t>& array = (*it_dtfini)->array();
+    for (uint64_t& address : array) {
+      if (address > stub_virtual_address) {
+        address += new_section_size;
+      }
+    }
+  }
+
+  // =====================
+  // Patch dynamic symbols
+  // .dynsym
+  // =====================
+  for (Symbol* symbol : this->dynamic_symbols_) {
+    if (symbol->value() >= stub_virtual_address) {
+      symbol->value(symbol->value() + new_section_size);
+    }
+  }
+
+  // ====================
+  // Patch static symbols
+  // ====================
+  for (Symbol* symbol : this->static_symbols_) {
+    if (symbol->value() >= stub_virtual_address) {
+      symbol->value(symbol->value() + new_section_size);
+    }
+  }
+
+  // =====================
+  // Patch dynamic section
+  // .dynamic
+  // =====================
+  for (DynamicEntry* entry : this->dynamic_entries_) {
+    if (
+        entry->tag() == DYNAMIC_TAGS::DT_PLTGOT or
+        entry->tag() == DYNAMIC_TAGS::DT_HASH or
+        entry->tag() == DYNAMIC_TAGS::DT_GNU_HASH or
+        entry->tag() == DYNAMIC_TAGS::DT_STRTAB or
+        entry->tag() == DYNAMIC_TAGS::DT_SYMTAB or
+        entry->tag() == DYNAMIC_TAGS::DT_RELA or
+        entry->tag() == DYNAMIC_TAGS::DT_INIT or
+        entry->tag() == DYNAMIC_TAGS::DT_FINI or
+        entry->tag() == DYNAMIC_TAGS::DT_REL or
+        entry->tag() == DYNAMIC_TAGS::DT_JMPREL or
+        entry->tag() == DYNAMIC_TAGS::DT_INIT_ARRAY or
+        entry->tag() == DYNAMIC_TAGS::DT_FINI_ARRAY or
+        entry->tag() == DYNAMIC_TAGS::DT_PREINIT_ARRAY or
+        entry->tag() == DYNAMIC_TAGS::DT_VERSYM or
+        entry->tag() == DYNAMIC_TAGS::DT_VERDEF or
+        entry->tag() == DYNAMIC_TAGS::DT_VERNEED
+       ) {
+      if (entry->value() >= stub_virtual_address) {
+        entry->value(entry->value() + new_section_size);
+      }
+    }
+  }
+
+  // =================
+  // Patch relocations
+  // =================
+
+  // Dynamic relocations
+  // -------------------
+  for (Relocation& relocation : this->get_dynamic_relocations()) {
+
+    //TODO check addend
+    if (relocation.type() == RELOC_x86_64::R_X86_64_RELATIVE) {
+      relocation.addend(relocation.addend() + new_section_size);
+    }
+
+    if (relocation.address() >= stub_virtual_address) {
+      relocation.address(relocation.address() + new_section_size);
+    }
+
+    if(arch == ARCH::EM_ARM and relocation.type() == RELOC_ARM::R_ARM_RELATIVE) {
+      const uint64_t address = relocation.address();
+      LOG(DEBUG) << "Patch ARM relative relocation at address: 0x" << std::hex << address;
+      Section& section = this->section_from_virtual_address(address);
+      const uint64_t relative_offset = this->virtual_address_to_offset(address) - section.offset();
+      std::vector<uint8_t> section_content = section.content();
+      uint32_t *reloc_address = reinterpret_cast<uint32_t*>(section_content.data() + relative_offset);
+      if (reloc_address != nullptr and *reloc_address >= stub_virtual_address) {
+        *reloc_address += new_section_size;
+      }
+      section.content(section_content);
+    }
+
+    if(arch == ARCH::EM_386 and relocation.type() == RELOC_i386::R_386_RELATIVE) {
+      const uint64_t address = relocation.address();
+      LOG(DEBUG) << "Patch i386 relative relocation at address: " << std::hex << address;
+      Section& section = this->section_from_virtual_address(address);
+      const uint64_t relative_offset = this->virtual_address_to_offset(address) - section.offset();
+      std::vector<uint8_t> section_content = section.content();
+      uint32_t *reloc_address = reinterpret_cast<uint32_t*>(section_content.data() + relative_offset);
+      if (reloc_address != nullptr and *reloc_address >= stub_virtual_address) {
+        *reloc_address += new_section_size;
+      }
+      section.content(section_content);
+    }
+
+    if((arch == ARCH::EM_X86_64 or arch == ARCH::EM_IA_64) and
+        relocation.type() == RELOC_x86_64::R_X86_64_RELATIVE) {
+      const uint64_t address = relocation.address();
+      LOG(DEBUG) << "Patch R_X86_64_RELATIVE relocation at address: 0x" << std::hex << address;
+      Section& section = this->section_from_virtual_address(address);
+      const uint64_t relative_offset = this->virtual_address_to_offset(address) - section.offset();
+      std::vector<uint8_t> section_content = section.content();
+      uint64_t *reloc_address = reinterpret_cast<uint64_t*>(section_content.data() + relative_offset);
+      if (reloc_address != nullptr and *reloc_address >= stub_virtual_address) {
+        *reloc_address += new_section_size;
+      }
+      section.content(section_content);
+    }
+
+  }
+
+  // PLT/GOT Relocations
+  // -------------------
+
+  LOG(DEBUG) << "Patching plt/got relocations";
+  for (Relocation& relocation : this->get_pltgot_relocations()) {
+    if (relocation.address() >= stub_virtual_address) {
+      relocation.address(relocation.address() + new_section_size);
+    }
+
+    // R_X86_64_IRELATIVE
+    if ((arch == ARCH::EM_X86_64 or arch == ARCH::EM_IA_64) and relocation.type() == RELOC_x86_64::R_X86_64_IRELATIVE) {
+      LOG(DEBUG) << "Patching R_X86_64_IRELATIVE";
+      if (static_cast<uint64_t>(relocation.addend()) >= stub_virtual_address) {
+        relocation.addend(relocation.addend() + new_section_size);
+      }
+    }
+
+    if (((arch == ARCH::EM_X86_64 or arch == ARCH::EM_IA_64) and relocation.type() == RELOC_x86_64::R_X86_64_JUMP_SLOT) or
+        (arch == ARCH::EM_ARM and                                relocation.type() == RELOC_ARM::R_ARM_JUMP_SLOT) or
+        (arch == ARCH::EM_386 and                                relocation.type() == RELOC_i386::R_386_JUMP_SLOT)) {
+      LOG(DEBUG) << "Patching JUMP_SLOT";
+      const uint64_t address = relocation.address();
+      Section& section = this->section_from_virtual_address(address);
+      std::vector<uint8_t> content = section.content();
+      const uint64_t relative_offset = address - section.virtual_address();
+
+      LOG(DEBUG) << "Section associated with the relocation: " << section.name();
+
+      if (this->type_ == ELF_CLASS::ELFCLASS64) {
+        uint64_t* value = reinterpret_cast<uint64_t*>(content.data() + relative_offset);
+        if (value != nullptr and *value >= stub_virtual_address) {
+          *value += new_section_size;
+        }
+      }
+
+      if (this->type_ == ELF_CLASS::ELFCLASS32) {
+        uint32_t* value = reinterpret_cast<uint32_t*>(content.data() + relative_offset);
+        if (value != nullptr and *value >= stub_virtual_address) {
+          *value += new_section_size;
+        }
+      }
+      section.content(content);
+    }
+  }
+
+  // ===============================
+  // Patch Entry Point
+  // ===============================
+
+  // Note: It useless for library but anyway
+  this->get_header().entrypoint(this->get_header().entrypoint() + new_section_size);
+  return {sectionOffset, new_section_size};
+
+}
+
+
+bool Binary::has_section(const std::string& name) const {
+  return std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [&name] (const Section* section) {
+        return section != nullptr and section->name() == name;
+      }) != std::end(this->sections_);
+}
+
+void Binary::strip(void) {
+  this->static_symbols_ = {};
+}
+
+
+Symbol& Binary::add_static_symbol(const Symbol& symbol) {
+  this->static_symbols_.push_back(new Symbol{symbol});
+  return *(this->static_symbols_.back());
+}
+
+uint64_t Binary::virtual_address_to_offset(uint64_t virtual_address) const {
+  auto&& it_segment = std::find_if(
+      std::begin(this->segments_),
+      std::end(this->segments_),
+      [virtual_address] (const Segment* segment)
+      {
+        if (segment == nullptr) {
+          return false;
+        }
+        return (
+          segment->type() == SEGMENT_TYPES::PT_LOAD and
+          segment->virtual_address() <= virtual_address and
+          segment->virtual_address() + segment->virtual_size() >= virtual_address
+          );
+      });
+
+  if (it_segment == std::end(this->segments_)) {
+    LOG(DEBUG) << "Address: 0x" << std::hex << virtual_address;
+    throw conversion_error("Invalid virtual address");
+  }
+  uint64_t baseAddress = (*it_segment)->virtual_address() - (*it_segment)->file_offset();
+  uint64_t offset      = virtual_address - baseAddress;
+
+  return offset;
+
+}
+
+
+bool Binary::has_interpreter(void) const {
+  auto&& it_segment_interp = std::find_if(
+      std::begin(this->segments_),
+      std::end(this->segments_),
+      [] (const Segment* segment)
+      {
+        return segment != nullptr and segment->type() == SEGMENT_TYPES::PT_INTERP;
+      });
+
+  return it_segment_interp != std::end(this->segments_);
+}
+
+std::string Binary::get_interpreter(void) const {
+  auto&& it_segment_interp = std::find_if(
+      std::begin(this->segments_),
+      std::end(this->segments_),
+      [] (const Segment* segment)
+      {
+        return segment != nullptr and segment->type() == SEGMENT_TYPES::PT_INTERP;
+      });
+
+  if (it_segment_interp == std::end(this->segments_)) {
+    throw not_found("PT_INTERP not found");
+  }
+
+  const std::vector<uint8_t>& content = (*it_segment_interp)->content();
+  return reinterpret_cast<const char*>(content.data());
+}
+
+void Binary::write(const std::string& filename) {
+  Builder builder{this};
+  builder.build();
+  builder.write(filename);
+}
+
+
+uint64_t Binary::entrypoint() const {
+  return this->get_header().entrypoint();
+}
+
+
+const Section& Binary::section_from_offset(uint64_t offset) const {
+  auto&& it_section = std::find_if(
+      this->sections_.cbegin(),
+      this->sections_.cend(),
+      [&offset] (const Section* section) {
+        if (section == nullptr) {
+          return false;
+        }
+        return ((section->offset() <= offset) and
+            (section->offset() + section->size()) > offset);
+      });
+
+  if (it_section == this->sections_.cend()) {
+    throw not_found("Unable to find the section");
+  }
+
+  return **it_section;
+}
+
+Section& Binary::section_from_offset(uint64_t offset) {
+  return const_cast<Section&>(static_cast<const Binary*>(this)->section_from_offset(offset));
+}
+
+
+
+const Section& Binary::section_from_virtual_address(uint64_t address) const {
+  auto&& it_section = std::find_if(
+      this->sections_.cbegin(),
+      this->sections_.cend(),
+      [&address] (const Section* section) {
+        if (section == nullptr) {
+          return false;
+        }
+        return ((section->virtual_address() <= address) and
+            (section->virtual_address() + section->size()) > address);
+      });
+
+  if (it_section == this->sections_.cend()) {
+    throw not_found("Unable to find the section");
+  }
+
+  return **it_section;
+}
+
+Section& Binary::section_from_virtual_address(uint64_t address) {
+  return const_cast<Section&>(static_cast<const Binary*>(this)->section_from_virtual_address(address));
+}
+
+std::vector<uint8_t> Binary::get_content_from_virtual_address(uint64_t virtual_address, uint64_t size) const {
+  const Segment& segment = this->segment_from_virtual_address(virtual_address);
+  const std::vector<uint8_t>& content = segment.content();
+  const uint64_t offset = virtual_address - segment.virtual_address();
+  uint64_t checked_size = size;
+  if ((offset + checked_size) > content.size()) {
+    checked_size = checked_size - (offset + checked_size - content.size());
+  }
+
+  return {content.data() + offset, content.data() + offset + checked_size};
+}
+
+
+const DynamicEntry& Binary::dynamic_entry_from_tag(DYNAMIC_TAGS tag) const {
+
+  auto&& it_entry = std::find_if(
+      std::begin(this->dynamic_entries_),
+      std::end(this->dynamic_entries_),
+      [tag] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == tag;
+      });
+  if (it_entry == std::end(this->dynamic_entries_)) {
+    throw not_found("Unable to find the dynamic entry with tag '" + std::string(to_string(tag)) + "'.");
+  }
+  return **it_entry;
+}
+
+DynamicEntry& Binary::dynamic_entry_from_tag(DYNAMIC_TAGS tag) {
+  return const_cast<DynamicEntry&>(static_cast<const Binary*>(this)->dynamic_entry_from_tag(tag));
+}
+
+
+bool Binary::has_dynamic_entry(DYNAMIC_TAGS tag) const {
+  auto&& it_entry = std::find_if(
+      std::begin(this->dynamic_entries_),
+      std::end(this->dynamic_entries_),
+      [tag] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == tag;
+      });
+
+  if (it_entry == std::end(this->dynamic_entries_)) {
+    return false;
+  }
+  return true;
+}
+
+LIEF::Header Binary::get_abstract_header(void) const {
+  LIEF::Header header;
+  const std::pair<ARCHITECTURES, std::set<MODES>>& am = this->get_header().abstract_architecture();
+  header.architecture(am.first);
+  header.modes(am.second);
+  header.entrypoint(this->get_header().entrypoint());
+  header.object_type(this->get_header().abstract_object_type());
+
+  return header;
+}
+
+
+void Binary::accept(LIEF::Visitor&) const {
+}
+
+
+const GnuHash& Binary::get_gnu_hash(void) const {
+  return this->gnu_hash_;
+}
+
+
+std::ostream& Binary::print(std::ostream& os) const {
+
+  os << "Header" << std::endl;
+  os << "======" << std::endl;
+
+  os << this->get_header();
+  os << std::endl;
+
+
+  os << "Sections" << std::endl;
+  os << "========" << std::endl;
+  for (const Section& section : this->get_sections()) {
+    os << section << std::endl;
+  }
+  os << std::endl;
+
+
+  os << "Segments" << std::endl;
+  os << "========" << std::endl;
+  for (const Segment& segment : this->get_segments()) {
+    os << segment << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << "Dynamic entries" << std::endl;
+  os << "===============" << std::endl;
+
+  for (const DynamicEntry& entry : this->get_dynamic_entries()) {
+    os << entry << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << "Dynamic symbols" << std::endl;
+  os << "===============" << std::endl;
+
+  for (const Symbol& symbol : this->get_dynamic_symbols()) {
+    os << symbol << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << "Static symbols" << std::endl;
+  os << "==============" << std::endl;
+
+  for (const Symbol& symbol : this->get_static_symbols()) {
+    os << symbol << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << "Symbol versions" << std::endl;
+  os << "===============" << std::endl;
+
+  for (const SymbolVersion& sv : this->get_symbols_version()) {
+    os << sv << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << "Symbol versions definition" << std::endl;
+  os << "==========================" << std::endl;
+
+  for (const SymbolVersionDefinition& svd : this->get_symbols_version_definition()) {
+    os << svd << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << "Symbol version requirement" << std::endl;
+  os << "==========================" << std::endl;
+
+  for (const SymbolVersionRequirement& svr : this->get_symbols_version_requirement()) {
+    os << svr << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << "Dynamic relocations" << std::endl;
+  os << "===================" << std::endl;
+
+  for (const Relocation& relocation : this->get_dynamic_relocations()) {
+    os << relocation << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << ".plt.got relocations" << std::endl;
+  os << "====================" << std::endl;
+
+  for (const Relocation& relocation : this->get_pltgot_relocations()) {
+    os << relocation << std::endl;
+  }
+
+  os << std::endl;
+
+
+
+  return os;
+}
+
+
+
+Binary::~Binary(void) {
+
+  for (Relocation* relocation : this->pltgot_relocations_) {
+    delete relocation;
+  }
+
+
+  for (Relocation* relocation : this->dynamic_relocations_) {
+    delete relocation;
+  }
+
+  for (Section* section : this->sections_) {
+    delete section;
+  }
+
+  for (Segment* segment : this->segments_) {
+    delete segment;
+  }
+
+  for (DynamicEntry* entry : this->dynamic_entries_) {
+    delete entry;
+  }
+
+  for (Symbol* symbol : this->dynamic_symbols_) {
+    delete symbol;
+  }
+
+  for (Symbol* symbol : this->static_symbols_) {
+    delete symbol;
+  }
+
+  for (SymbolVersion* symbol_version : this->symbol_version_table_) {
+    delete symbol_version;
+  }
+
+  for (SymbolVersionDefinition* svd : this->symbol_version_definition_) {
+    delete svd;
+  }
+
+  for (SymbolVersionRequirement* svr : this->symbol_version_requirements_) {
+    delete svr;
+  }
+
+  delete datahandler_;
+}
+
+
+}
+}
diff --git a/src/ELF/Builder.cpp b/src/ELF/Builder.cpp
new file mode 100644
index 0000000..6acbb8d
--- /dev/null
+++ b/src/ELF/Builder.cpp
@@ -0,0 +1,156 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <set>
+#include <fstream>
+#include <iterator>
+#include <stdexcept>
+#include <functional>
+
+#include "LIEF/exception.hpp"
+
+#include "LIEF/ELF/Builder.hpp"
+#include "Builder.tcc"
+
+namespace LIEF {
+namespace ELF {
+
+
+Builder::~Builder(void) = default;
+
+Builder::Builder(Binary *binary) :
+  empties_gnuhash_{false},
+  binary_{binary}
+{
+  this->ios_.reserve(binary->original_size());
+}
+
+void Builder::build(void) {
+  if(this->binary_->type() == ELFCLASS32) {
+    this->build<ELF32>();
+  } else {
+    this->build<ELF64>();
+  }
+}
+
+const std::vector<uint8_t>& Builder::get_build(void) {
+  return this->ios_.raw();
+}
+
+
+Builder& Builder::empties_gnuhash(bool flag) {
+  this->empties_gnuhash_ = flag;
+  return *this;
+}
+
+
+void Builder::write(const std::string& filename) const {
+  std::ofstream output_file{filename, std::ios::out | std::ios::binary | std::ios::trunc};
+  if (output_file) {
+    std::vector<uint8_t> content;
+    this->ios_.get(content);
+
+    std::copy(
+        std::begin(content),
+        std::end(content),
+        std::ostreambuf_iterator<char>(output_file));
+  }
+}
+
+
+void Builder::build_empty_symbol_gnuhash(void) {
+  auto&& it_gnuhash = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_GNU_HASH;
+      });
+
+  if (it_gnuhash == std::end(this->binary_->sections_)) {
+    throw corrupted("Unable to find the .gnu.hash section");
+  }
+
+  std::vector<uint8_t> content;
+  const uint32_t nb_buckets = 1;
+  const uint32_t shift2     = 0;
+  const uint32_t maskwords  = 1;
+  const uint32_t symndx     = 1; // 0 is reserved
+
+  // nb_buckets
+  content.insert(std::end(content),
+    reinterpret_cast<const uint8_t*>(&nb_buckets),
+    reinterpret_cast<const uint8_t*>(&nb_buckets) + sizeof(uint32_t));
+
+  // symndx
+  content.insert(std::end(content),
+    reinterpret_cast<const uint8_t*>(&symndx),
+    reinterpret_cast<const uint8_t*>(&symndx) + sizeof(uint32_t));
+
+  // maskwords
+  content.insert(std::end(content),
+    reinterpret_cast<const uint8_t*>(&maskwords),
+    reinterpret_cast<const uint8_t*>(&maskwords) + sizeof(uint32_t));
+
+  // shift2
+  content.insert(std::end(content),
+    reinterpret_cast<const uint8_t*>(&shift2),
+    reinterpret_cast<const uint8_t*>(&shift2) + sizeof(uint32_t));
+
+  // fill with 0
+  content.insert(
+      std::end(content),
+      (*it_gnuhash)->size() - content.size(),
+      0);
+  (*it_gnuhash)->content(content);
+
+
+}
+
+
+
+void Builder::build_symbol_version(void) {
+
+  LOG(DEBUG) << "[+] Building symbol version" << std::endl;
+
+  if (this->binary_->symbol_version_table_.size() != this->binary_->dynamic_symbols_.size()) {
+    LOG(WARNING) << "The number of symbol version is different from the number of dynamic symbols ("
+                 << std::dec << this->binary_->symbol_version_table_.size() << " != "
+                 << this->binary_->dynamic_symbols_.size() << " ) " << std::endl;
+  }
+
+  const uint64_t sv_address = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_VERSYM).value();
+
+  std::vector<uint8_t> sv_raw;
+  sv_raw.reserve(this->binary_->symbol_version_table_.size() * sizeof(uint16_t));
+
+  for (const SymbolVersion* sv : this->binary_->symbol_version_table_) {
+    const uint16_t value = sv->value();
+    sv_raw.insert(
+        std::end(sv_raw),
+        reinterpret_cast<const uint8_t*>(&value),
+        reinterpret_cast<const uint8_t*>(&value) + sizeof(uint16_t));
+
+  }
+
+ this->binary_->section_from_virtual_address(sv_address).content(sv_raw);
+
+}
+
+
+
+}
+}
diff --git a/src/ELF/Builder.tcc b/src/ELF/Builder.tcc
new file mode 100644
index 0000000..6e79e76
--- /dev/null
+++ b/src/ELF/Builder.tcc
@@ -0,0 +1,1264 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <numeric>
+
+#include "easylogging++.h"
+
+namespace LIEF {
+namespace ELF {
+
+template<class ELF_T>
+void Builder::build(void) {
+
+  std::string type = ((this->binary_->type_ == ELFCLASS32) ? "ELF32" : "ELF64");
+  LOG(DEBUG) << "== Re-building " << type << " ==";
+
+  this->build_hash_table<ELF_T>();
+
+  this->build_dynamic<ELF_T>();
+
+  if (this->binary_->symbol_version_table_.size() > 0) {
+    this->build_symbol_version();
+  }
+
+  if (this->binary_->symbol_version_requirements_.size() > 0) {
+    this->build_symbol_requirement<ELF_T>();
+  }
+
+  if (this->binary_->symbol_version_definition_.size() > 0) {
+    this->build_symbol_definition<ELF_T>();
+  }
+
+  if (this->binary_->static_symbols_.size() > 0) {
+    try {
+      this->build_static_symbols<ELF_T>();
+    } catch (const LIEF::exception& e) {
+      LOG(ERROR) << e.what();
+    }
+  }
+
+  if (this->binary_->dynamic_relocations_.size() > 0) {
+    this->build_dynamic_relocations<ELF_T>();
+  }
+
+  if (this->binary_->pltgot_relocations_.size() > 0) {
+    this->build_pltgot_relocations<ELF_T>();
+  }
+
+  if (this->binary_->get_header().program_headers_offset() > 0) {
+    this->build_segments<ELF_T>();
+  } else {
+    LOG(WARNING) << "Segements offset is null";
+  }
+
+  this->build_sections<ELF_T>();
+
+  this->build_header<ELF_T>();
+
+}
+
+
+template<typename T, typename HANDLER>
+std::vector<std::string> Builder::optimize(const HANDLER& e) {
+
+  auto setPropertie = [] (const std::string& a, const std::string& b) {
+    return (a.size() >= b.size() and a != b);
+  };
+
+  // Container which will hold the section name sorted by length
+  std::set<std::string, decltype(setPropertie)> stringTable{setPropertie};
+
+  std::vector<std::string> stringTableOpti;
+
+  std::transform(
+    std::begin(e),
+    std::end(e),
+    std::inserter(
+      stringTable,
+      std::end(stringTable)),
+    std::mem_fn(static_cast<const std::string& (T::*)(void) const>(&T::name)));
+
+  // Optimize the string table
+  std::copy_if(
+  std::begin(stringTable),
+  std::end(stringTable),
+  std::back_inserter(stringTableOpti),
+  [&stringTableOpti] (const std::string& name)
+  {
+    auto it = std::find_if(
+        std::begin(stringTableOpti),
+        std::end(stringTableOpti),
+        [&name] (const std::string& nameOpti) {
+          return nameOpti.substr(nameOpti.size() - name.size()) == name ;
+        });
+
+    return (it == std::end(stringTableOpti));
+
+  });
+
+  return stringTableOpti;
+}
+
+
+template<typename ELF_T>
+void Builder::build_header(void) {
+  using Elf_Half = typename ELF_T::Elf_Half;
+  using Elf_Word = typename ELF_T::Elf_Word;
+  using Elf_Addr = typename ELF_T::Elf_Addr;
+  using Elf_Off  = typename ELF_T::Elf_Off;
+  using Elf_Word = typename ELF_T::Elf_Word;
+
+  using Elf_Ehdr = typename ELF_T::Elf_Ehdr;
+
+  const Header& header = this->binary_->get_header();
+  Elf_Ehdr ehdr;
+
+  ehdr.e_type      = static_cast<Elf_Half>(header.file_type());
+  ehdr.e_machine   = static_cast<Elf_Half>(header.machine_type());
+  ehdr.e_version   = static_cast<Elf_Word>(header.object_file_version());
+  ehdr.e_entry     = static_cast<Elf_Addr>(header.entrypoint());
+  ehdr.e_phoff     = static_cast<Elf_Off>(header.program_headers_offset());
+  ehdr.e_shoff     = static_cast<Elf_Off>(header.section_headers_offset());
+  ehdr.e_flags     = static_cast<Elf_Word>(header.processor_flag());
+  ehdr.e_ehsize    = static_cast<Elf_Half>(header.header_size());
+  ehdr.e_phentsize = static_cast<Elf_Half>(header.program_header_size());
+  ehdr.e_phnum     = static_cast<Elf_Half>(header.numberof_segments());
+  ehdr.e_shentsize = static_cast<Elf_Half>(header.sizeof_section_header());
+  ehdr.e_shnum     = static_cast<Elf_Half>(header.numberof_sections());
+  ehdr.e_shstrndx  = static_cast<Elf_Half>(header.section_name_table_idx());
+
+  std::copy(
+    std::begin(header.identity()),
+    std::end(header.identity()),
+    std::begin(ehdr.e_ident));
+
+  this->ios_.seekp(0);
+  this->ios_.write(reinterpret_cast<const uint8_t*>(&ehdr), sizeof(Elf_Ehdr));
+}
+
+
+template<typename ELF_T>
+void Builder::build_sections(void) {
+  using Elf_Word = typename ELF_T::Elf_Word;
+  using Elf_Addr = typename ELF_T::Elf_Addr;
+  using Elf_Off  = typename ELF_T::Elf_Off;
+  using Elf_Word = typename ELF_T::Elf_Word;
+
+  using Elf_Shdr = typename ELF_T::Elf_Shdr;
+  LOG(DEBUG) << "[+] Build sections";
+
+  const Header& header = this->binary_->get_header();
+  const uint64_t section_headers_offset = header.section_headers_offset();
+
+  /////////////////////////
+  ////////////////////////
+  ///////////////////////
+  std::vector<std::string> stringTableOpti =
+    this->optimize<Section, decltype(this->binary_->sections_)>(this->binary_->sections_);
+
+  // Build section's name
+  std::vector<uint8_t> section_names;
+  for (const std::string& name : stringTableOpti) {
+    section_names.insert(std::end(section_names), std::begin(name), std::end(name));
+    section_names.push_back(0);
+  }
+
+  Section* string_names_section = this->binary_->sections_[header.section_name_table_idx()];
+  string_names_section->content(section_names);
+
+  for (size_t i = 0; i < this->binary_->sections_.size(); i++) {
+    const Section* section = this->binary_->sections_[i];
+
+    auto&& it_offset_name = std::search(
+        std::begin(section_names),
+        std::end(section_names),
+        section->name().c_str(),
+        section->name().c_str() + section->name().size() + 1);
+
+    if (it_offset_name == std::end(section_names)) {
+      throw LIEF::not_found(""); // TODO: msg
+    }
+
+    const uint64_t offset_name = static_cast<uint64_t>(std::distance(std::begin(section_names), it_offset_name));
+
+    Elf_Shdr shdr;
+    shdr.sh_name      = static_cast<Elf_Word>(offset_name);
+    shdr.sh_type      = static_cast<Elf_Word>(section->type());
+    shdr.sh_flags     = static_cast<Elf_Word>(section->flags());
+    shdr.sh_addr      = static_cast<Elf_Addr>(section->virtual_address());
+    shdr.sh_offset    = static_cast<Elf_Off>(section->file_offset());
+    shdr.sh_size      = static_cast<Elf_Word>(section->size());
+    shdr.sh_link      = static_cast<Elf_Word>(section->link());
+    shdr.sh_info      = static_cast<Elf_Word>(section->information());
+    shdr.sh_addralign = static_cast<Elf_Word>(section->alignment());
+    shdr.sh_entsize   = static_cast<Elf_Word>(section->entry_size());
+
+    // Write Section'header
+    if (section_headers_offset > 0) {
+      this->ios_.seekp(section_headers_offset + i * sizeof(Elf_Shdr));
+      this->ios_.write(reinterpret_cast<const uint8_t*>(&shdr), sizeof(Elf_Shdr));
+    }
+
+    // Write Section's content
+    if (section->type() != SECTION_TYPES::SHT_NOBITS) {
+        const std::vector<uint8_t>& content = section->content();
+        // TODO: Assert sh_size == content.size()
+        this->ios_.seekp(shdr.sh_offset);
+        this->ios_.write(content.data(), shdr.sh_size);
+    }
+  }
+}
+
+
+template<typename ELF_T>
+void Builder::build_segments(void) {
+  using Elf_Word = typename ELF_T::Elf_Word;
+  using Elf_Addr = typename ELF_T::Elf_Addr;
+  using Elf_Off  = typename ELF_T::Elf_Off;
+  using Elf_Word = typename ELF_T::Elf_Word;
+
+  using Elf_Phdr = typename ELF_T::Elf_Phdr;
+  LOG(DEBUG) << "[+] Build segments";
+
+  std::vector<uint8_t> pheaders;
+  pheaders.reserve(this->binary_->segments_.size() * sizeof(Elf_Phdr));
+
+  for (const Segment* segment : this->binary_->segments_) {
+      Elf_Phdr phdr;
+      phdr.p_type   = static_cast<Elf_Word>(segment->type());
+      phdr.p_flags  = static_cast<Elf_Word>(segment->flag());
+      phdr.p_offset = static_cast<Elf_Off>(segment->file_offset());
+      phdr.p_vaddr  = static_cast<Elf_Addr>(segment->virtual_address());
+      phdr.p_paddr  = static_cast<Elf_Addr>(segment->physical_address());
+      phdr.p_filesz = static_cast<Elf_Word>(segment->physical_size());
+      phdr.p_memsz  = static_cast<Elf_Word>(segment->virtual_size());
+      phdr.p_align  = static_cast<Elf_Word>(segment->alignment());
+
+      pheaders.insert(
+          std::end(pheaders),
+          reinterpret_cast<uint8_t*>(&phdr),
+          reinterpret_cast<uint8_t*>(&phdr) + sizeof(Elf_Phdr));
+  }
+
+  auto&& it_segment_phdr = std::find_if(
+      std::begin(this->binary_->segments_),
+      std::end(this->binary_->segments_),
+      [] (const Segment* segment)
+      {
+        return segment != nullptr and segment->type() == SEGMENT_TYPES::PT_PHDR;
+      });
+
+  if (it_segment_phdr != std::end(this->binary_->segments_)) {
+    (*it_segment_phdr)->content(pheaders);
+  } else {
+    const uint64_t segment_header_offset = this->binary_->get_header().program_headers_offset();
+    this->ios_.seekp(segment_header_offset);
+    this->ios_.write(pheaders);
+  }
+
+  // Write segment content
+  for (const Segment* segment : this->binary_->segments_) {
+    // If there isn't sections in the segments
+    // We have to insert data in the segments because
+    // we didn't do in `build_section()`
+    if (segment->sections().size() == 0 and segment->physical_size() > 0) {
+      const std::vector<uint8_t>& content = segment->content();
+      LOG(DEBUG) << "Write content for segment " << *segment;
+      LOG(DEBUG) << "Offset: 0x" << std::hex << segment->file_offset();
+      LOG(DEBUG) << "Size: 0x" << std::hex << content.size();
+
+      LOG(DEBUG) << "Content: " << std::accumulate(
+        std::begin(content),
+        std::begin(content) + 10,
+        std::string(""),
+        [] (std::string lhs, uint8_t x) {
+          std::stringstream ss;
+          ss << std::hex << static_cast<uint32_t>(x);
+          return lhs.empty() ? ss.str() : lhs + " " + ss.str();
+        });
+
+
+      //TODO assert content.size == segmenthdr.physicalsize
+      this->ios_.seekp(segment->file_offset());
+      this->ios_.write(content);
+    }
+  }
+}
+
+
+template<typename ELF_T>
+void Builder::build_static_symbols(void) {
+  using Elf_Half = typename ELF_T::Elf_Half;
+  using Elf_Word = typename ELF_T::Elf_Word;
+  using Elf_Addr = typename ELF_T::Elf_Addr;
+  using Elf_Word = typename ELF_T::Elf_Word;
+
+  using Elf_Sym  = typename ELF_T::Elf_Sym;
+  LOG(DEBUG) << "Build static symbols";
+
+  Section& symbol_section = this->binary_->get_static_symbols_section();
+  LOG(DEBUG) << "Section: " << symbol_section << std::endl;
+
+  //clear
+  //symbol_section.content(std::vector<uint8_t>(symbol_section.content().size(), 0));
+
+  if (symbol_section.link() == 0 or
+      symbol_section.link() >= this->binary_->sections_.size()) {
+    throw LIEF::not_found("Unable to find a string section associated \
+        with the Symbol section (sh_link)");
+  }
+  Section& symbol_str_section = *(this->binary_->sections_[symbol_section.link()]);
+
+  std::vector<uint8_t> content;
+  content.reserve(this->binary_->static_symbols_.size() * sizeof(Elf_Sym));
+  std::vector<uint8_t> string_table;
+
+  // Container which will hold symbols name (optimized)
+  std::vector<std::string> string_table_optimize =
+    this->optimize<Symbol, decltype(this->binary_->static_symbols_)>(this->binary_->static_symbols_);
+
+  // We can't start with a symbol name
+  string_table.push_back(0);
+  for (const std::string& name : string_table_optimize) {
+    string_table.insert(std::end(string_table), std::begin(name), std::end(name));
+    string_table.push_back(0);
+  }
+
+  // Fill `content`
+  for (const Symbol* symbol : this->binary_->static_symbols_) {
+    LOG(DEBUG) << "Dealing with symbol: " << symbol->name();
+    //TODO
+    const std::string& name = symbol->name();
+
+    // Check if name is already pressent
+    auto&& it_name = std::search(
+        std::begin(string_table),
+        std::end(string_table),
+        name.c_str(),
+        name.c_str() + name.size() + 1);
+
+
+    if (it_name == std::end(string_table)) {
+      throw LIEF::not_found("Unable to find symbol '" + name + "' in the string table");
+    }
+
+    const uint64_t name_offset = static_cast<uint64_t>(std::distance(std::begin(string_table), it_name));
+
+    Elf_Sym sym_hdr;
+    sym_hdr.st_name  = static_cast<Elf_Word>(name_offset);
+    sym_hdr.st_info  = static_cast<unsigned char>(symbol->information());
+    sym_hdr.st_other = static_cast<unsigned char>(symbol->other());
+    sym_hdr.st_shndx = static_cast<Elf_Half>(symbol->shndx());
+    sym_hdr.st_value = static_cast<Elf_Addr>(symbol->value());
+    sym_hdr.st_size  = static_cast<Elf_Word>(symbol->size());
+
+    content.insert(
+        std::end(content),
+        reinterpret_cast<uint8_t*>(&sym_hdr),
+        reinterpret_cast<uint8_t*>(&sym_hdr) + sizeof(Elf_Sym));
+  }
+
+  symbol_str_section.content(string_table);
+  symbol_section.content(content);
+
+}
+
+/*!
+ * \brief This method construct binary's dynamic part.
+ *
+ * Which include:
+ *
+ *   - Dynamic section
+ *   - Dynamic string table
+ *   - Dynamic symbol
+ *   - Dynamic relocation
+ */
+template<typename ELF_T>
+void Builder::build_dynamic(void) {
+  LOG(DEBUG) << "Building dynamic part";
+
+  if (this->binary_->dynamic_entries_.size() > 0) {
+    this->build_dynamic_section<ELF_T>();
+  }
+
+  if (this->binary_->dynamic_symbols_.size() > 0) {
+    this->build_dynamic_symbols<ELF_T>();
+  }
+
+}
+
+template<typename ELF_T>
+void Builder::build_dynamic_section(void) {
+  using uint__     = typename ELF_T::uint;
+  using Elf_Sxword = typename ELF_T::Elf_Sxword;
+  using Elf_Xword  = typename ELF_T::Elf_Xword;
+
+  using Elf_Dyn    = typename ELF_T::Elf_Dyn;
+
+
+
+  LOG(DEBUG) << "[+] Building dynamic section";
+
+  const uint64_t dyn_strtab_va = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_STRTAB).value();
+
+  Section& dyn_strtab_section = this->binary_->section_from_virtual_address(dyn_strtab_va);
+
+  std::vector<uint8_t> dynamic_strings_raw;
+  std::vector<uint8_t> dynamic_table_raw;
+
+  for (DynamicEntry* entry : this->binary_->dynamic_entries_) {
+    if (dynamic_cast<DynamicEntryLibrary*>(entry) or
+        dynamic_cast<DynamicSharedObject*>(entry)) { // Contains library name
+      const std::string& library_name = entry->name();
+      dynamic_strings_raw.insert(
+          std::end(dynamic_strings_raw),
+          std::begin(library_name),
+          std::end(library_name));
+      dynamic_strings_raw.push_back(0);
+      entry->value(dynamic_strings_raw.size() - library_name.size() - 1);
+    }
+
+    if (dynamic_cast<DynamicEntryRunPath*>(entry) or
+        dynamic_cast<DynamicEntryRpath*>(entry)) { // contains path
+      const std::string& path = entry->name();
+      dynamic_strings_raw.insert(
+          std::end(dynamic_strings_raw),
+          std::begin(path),
+          std::end(path));
+      dynamic_strings_raw.push_back(0);
+      entry->value(dynamic_strings_raw.size() - path.size() - 1);
+    }
+
+    //TODO: Update size
+    if (dynamic_cast<DynamicEntryArray*>(entry)) { // contains array
+      uint64_t address = entry->value();
+      Segment& segment = this->binary_->segment_from_virtual_address(address);
+
+      uint64_t rva                 = address - segment.virtual_address();
+      std::vector<uint8_t> content = segment.content();
+      std::vector<uint64_t>& array = entry->array();
+
+      uint__* raw_array = reinterpret_cast<uint__*>(content.data() + rva);
+      for(size_t i = 0; i < array.size(); ++i) {
+        raw_array[i] = static_cast<uint__>(array[i]);
+      }
+      segment.content(content);
+    }
+
+    Elf_Dyn dynhdr;
+    dynhdr.d_tag       = static_cast<Elf_Sxword>(entry->tag());
+    dynhdr.d_un.d_val  = static_cast<Elf_Xword>(entry->value());
+
+    dynamic_table_raw.insert(
+      std::end(dynamic_table_raw),
+      reinterpret_cast<uint8_t*>(&dynhdr),
+      reinterpret_cast<uint8_t*>(&dynhdr) + sizeof(Elf_Dyn));
+  }
+
+  dyn_strtab_section.content(dynamic_strings_raw);
+  this->binary_->get_dynamic_section().content(dynamic_table_raw);
+}
+
+
+template<typename ELF_T>
+void Builder::build_symbol_hash(void) {
+  LOG(DEBUG) << "Build SYSV Hash ";
+  auto&& it_hash_section = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_HASH;
+      });
+
+  if (it_hash_section == std::end(this->binary_->sections_)) {
+    return;
+  }
+
+  std::vector<uint8_t> content = (*it_hash_section)->content();
+  uint32_t* hashtable = reinterpret_cast<uint32_t*>(content.data());
+  uint32_t nbucket    = *hashtable++;
+  uint32_t nchain     = *hashtable++;
+
+
+  std::vector<uint8_t> new_hash_table((nbucket + nchain + 2) * sizeof(uint32_t), STN_UNDEF);
+  uint32_t *new_hash_table_ptr = reinterpret_cast<uint32_t*>(new_hash_table.data());
+
+  new_hash_table_ptr[0] = nbucket;
+  new_hash_table_ptr[1] = nchain;
+
+  uint32_t* bucket = &new_hash_table_ptr[2];
+  uint32_t* chain  = &new_hash_table_ptr[2 + nbucket];
+  uint32_t idx = 0;
+  for (const Symbol* symbol : this->binary_->dynamic_symbols_) {
+    uint32_t hash = 0;
+
+    if (this->binary_->type_ == ELFCLASS32) {
+      hash = hash32(symbol->name().c_str());
+    } else {
+      hash = hash64(symbol->name().c_str());
+    }
+
+    if(bucket[hash % nbucket] ==  STN_UNDEF) {
+      bucket[hash % nbucket] = idx;
+    } else {
+      uint32_t value = bucket[hash % nbucket];
+      while (chain[value] != STN_UNDEF) {
+        value = chain[value];
+        if (value >= (new_hash_table.size() / sizeof(uint32_t))) {
+          LOG(ERROR) << "Out-of-bound for symbol" << symbol->name() << std::endl
+                     << "Abort !";
+          return;
+        }
+      }
+      chain[value] = idx;
+    }
+    ++idx;
+
+  }
+
+  (*it_hash_section)->content(new_hash_table);
+}
+
+// Mainly inspired from
+// * https://github.com/llvm-mirror/lld/blob/master/ELF/SyntheticSections.cpp
+//
+// Checking is performed here:
+// * https://github.com/lattera/glibc/blob/a2f34833b1042d5d8eeb263b4cf4caaea138c4ad/elf/dl-lookup.c#L228
+//
+// See also:
+// * p.9, https://www.akkadia.org/drepper/dsohowto.pdf
+template<typename ELF_T>
+void Builder::build_symbol_gnuhash(void) {
+  using uint__ = typename ELF_T::uint;
+
+  LOG(DEBUG) << "Rebuild GNU Hash table";
+
+  const GnuHash& gnu_hash   = this->binary_->get_gnu_hash();
+
+  const uint32_t nb_buckets = gnu_hash.nb_buckets();
+  const uint32_t symndx     = gnu_hash.symbol_index();
+  const uint32_t maskwords  = gnu_hash.maskwords();
+  const uint32_t shift2     = gnu_hash.shift2();
+
+  LOG(DEBUG) << "Number of buckets " << std::dec << nb_buckets;
+  LOG(DEBUG) << "First symbol idx  " << std::dec << symndx;
+  LOG(DEBUG) << "Number of bloom filters  " << std::dec << maskwords;
+  LOG(DEBUG) << "Shift  " << std::dec << shift2;
+
+  // MANDATORY !
+  std::stable_sort(
+      std::begin(this->binary_->dynamic_symbols_) + symndx,
+      std::end(this->binary_->dynamic_symbols_),
+      [&nb_buckets] (const Symbol* lhs, const Symbol* rhs) {
+        return
+          (dl_new_hash(lhs->name().c_str()) % nb_buckets) <
+          (dl_new_hash(rhs->name().c_str()) % nb_buckets);
+    });
+
+  it_symbols dynamic_symbols = this->binary_->get_dynamic_symbols();
+
+  std::vector<uint8_t> raw_gnuhash;
+  raw_gnuhash.reserve(
+      4 * sizeof(uint32_t) +          // header
+      maskwords * sizeof(uint__) +    // bloom filters
+      nb_buckets * sizeof(uint32_t) + // buckets
+      (dynamic_symbols.size() - symndx) * sizeof(uint32_t)); // hash values
+
+
+  // Write "header"
+  // ==============
+
+  // nb_buckets
+  raw_gnuhash.insert(std::end(raw_gnuhash),
+    reinterpret_cast<const uint8_t*>(&nb_buckets),
+    reinterpret_cast<const uint8_t*>(&nb_buckets) + sizeof(uint32_t));
+
+  // symndx
+  raw_gnuhash.insert(std::end(raw_gnuhash),
+    reinterpret_cast<const uint8_t*>(&symndx),
+    reinterpret_cast<const uint8_t*>(&symndx) + sizeof(uint32_t));
+
+  // maskwords
+  raw_gnuhash.insert(std::end(raw_gnuhash),
+    reinterpret_cast<const uint8_t*>(&maskwords),
+    reinterpret_cast<const uint8_t*>(&maskwords) + sizeof(uint32_t));
+
+  // shift2
+  raw_gnuhash.insert(std::end(raw_gnuhash),
+    reinterpret_cast<const uint8_t*>(&shift2),
+    reinterpret_cast<const uint8_t*>(&shift2) + sizeof(uint32_t));
+
+
+
+  // Compute Bloom filters
+  // =====================
+  std::vector<uint__> bloom_filters(maskwords, 0);
+  size_t C = sizeof(uint__) * 8; // 32 for ELF, 64 for ELF64
+
+  for (size_t i = symndx; i < dynamic_symbols.size(); ++i) {
+    const uint32_t hash = dl_new_hash(dynamic_symbols[i].name().c_str());
+    const size_t pos = (hash / C) & (gnu_hash.maskwords() - 1);
+    uint__ V = (static_cast<uint__>(1) << (hash % C)) |
+               (static_cast<uint__>(1) << ((hash >> gnu_hash.shift2()) % C));
+    bloom_filters[pos] |= V;
+  }
+  for (size_t idx = 0; idx < bloom_filters.size(); ++idx) {
+    LOG(DEBUG) << "Bloom filter [" << std::dec << idx << "]: " << std::hex << bloom_filters[idx];
+  }
+
+  raw_gnuhash.insert(std::end(raw_gnuhash),
+    reinterpret_cast<uint8_t*>(bloom_filters.data()),
+    reinterpret_cast<uint8_t*>(bloom_filters.data() + bloom_filters.size()));
+
+
+  // Write buckets and hash
+  // ======================
+  int previous_bucket = -1;
+  size_t hash_value_idx = 0;
+  std::vector<uint32_t> buckets(nb_buckets, 0);
+  std::vector<uint32_t> hash_values(dynamic_symbols.size() - symndx, 0);
+
+  for (size_t i = symndx; i < dynamic_symbols.size(); ++i) {
+    LOG(DEBUG) << "Dealing with symbol " << dynamic_symbols[i];
+    const uint32_t hash = dl_new_hash(dynamic_symbols[i].name().c_str());
+    int bucket = hash % nb_buckets;
+
+    if (bucket < previous_bucket) {
+      throw corrupted("Previous bucket is greater than the current one ("
+          + std::to_string(bucket) + " < " +  std::to_string(previous_bucket) + ")");
+    }
+
+    if (bucket != previous_bucket) {
+      buckets[bucket] = i;
+      previous_bucket = bucket;
+      if (hash_value_idx > 0) {
+        hash_values[hash_value_idx - 1] |= 1;
+      }
+    }
+
+    hash_values[hash_value_idx] = hash & ~1;
+    ++hash_value_idx;
+  }
+
+  if (hash_value_idx > 0) {
+    hash_values[hash_value_idx - 1] |= 1;
+  }
+
+  raw_gnuhash.insert(std::end(raw_gnuhash),
+    reinterpret_cast<uint8_t*>(buckets.data()),
+    reinterpret_cast<uint8_t*>(buckets.data() + buckets.size()));
+
+  raw_gnuhash.insert(std::end(raw_gnuhash),
+    reinterpret_cast<uint8_t*>(hash_values.data()),
+    reinterpret_cast<uint8_t*>(hash_values.data() + hash_values.size()));
+
+  auto&& it_gnuhash = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_GNU_HASH;
+      });
+
+  if (it_gnuhash == std::end(this->binary_->sections_)) {
+    throw corrupted("Unable to find the .gnu.hash section");
+  }
+
+  if (raw_gnuhash.size()  <= (*it_gnuhash)->size()) {
+    return (*it_gnuhash)->content(raw_gnuhash);
+  } else { // Write a "null hash table"
+    this->build_empty_symbol_gnuhash();
+  }
+
+
+}
+
+template<typename ELF_T>
+void Builder::build_hash_table(void) {
+  LOG(DEBUG) << "Build hash table";
+  auto&& it_hash = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_HASH;
+      });
+
+
+  auto&& it_gnuhash = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_GNU_HASH;
+      });
+
+  //TODO: To improve
+  if (it_hash != std::end(this->binary_->sections_)) {
+    this->build_symbol_hash<ELF_T>();
+  }
+
+  if (it_gnuhash != std::end(this->binary_->sections_)) {
+    if (this->empties_gnuhash_) {
+      this->build_empty_symbol_gnuhash();
+    } else {
+      this->build_symbol_gnuhash<ELF_T>();
+    }
+  }
+}
+
+template<typename ELF_T>
+void Builder::build_dynamic_symbols(void) {
+
+  using Elf_Half = typename ELF_T::Elf_Half;
+  using Elf_Word = typename ELF_T::Elf_Word;
+  using Elf_Addr = typename ELF_T::Elf_Addr;
+  using Elf_Word = typename ELF_T::Elf_Word;
+
+  using Elf_Sym  = typename ELF_T::Elf_Sym;
+  LOG(DEBUG) << "[+] Building dynamic symbols";
+
+  // Find useful sections
+  // ====================
+  uint64_t symbol_table_va = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_SYMTAB).value();
+  uint64_t string_table_va = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_STRTAB).value();
+
+  // Find the section associated with the address
+  Section& symbol_table_section = this->binary_->section_from_virtual_address(symbol_table_va);
+  Section& string_table_section = this->binary_->section_from_virtual_address(string_table_va);
+
+  LOG(DEBUG) << "SYMTAB's address: 0x" << std::hex << symbol_table_va;
+  LOG(DEBUG) << "SYMTAB's section: " << symbol_table_section.name().c_str();
+  LOG(DEBUG) << "STRTAB's section: " << string_table_section.name().c_str();
+
+  // Build symbols string table
+  std::vector<uint8_t> string_table_raw = string_table_section.content();
+
+  std::vector<std::string> string_table_optimized =
+    this->optimize<Symbol, decltype(this->binary_->dynamic_symbols_)>(this->binary_->dynamic_symbols_);
+
+  for (const std::string& name : string_table_optimized) {
+    string_table_raw.insert(std::end(string_table_raw), std::begin(name), std::end(name));
+    string_table_raw.push_back(0);
+  }
+
+
+  //
+  // Build symbols
+  //
+  std::vector<uint8_t> symbol_table_raw;
+  for (const Symbol* symbol : this->binary_->dynamic_symbols_) {
+    const std::string& name = symbol->name();
+    // Check if name is already pressent
+    auto&& it_name = std::search(
+        std::begin(string_table_raw),
+        std::end(string_table_raw),
+        name.c_str(),
+        name.c_str() + name.size() + 1);
+
+    if (it_name == std::end(string_table_raw)) {
+      throw LIEF::not_found("Unable to find the symbol in the string table");
+    }
+    const uint64_t name_offset = static_cast<uint64_t>(std::distance(std::begin(string_table_raw), it_name));
+
+    Elf_Sym sym_header;
+    sym_header.st_name  = static_cast<Elf_Word>(name_offset);
+    sym_header.st_info  = static_cast<unsigned char>(symbol->information());
+    sym_header.st_other = static_cast<unsigned char>(symbol->other());
+    sym_header.st_shndx = static_cast<Elf_Half>(symbol->shndx());
+    sym_header.st_value = static_cast<Elf_Addr>(symbol->value());
+    sym_header.st_size  = static_cast<Elf_Word>(symbol->size());
+
+    symbol_table_raw.insert(
+        std::end(symbol_table_raw),
+        reinterpret_cast<uint8_t*>(&sym_header),
+        reinterpret_cast<uint8_t*>(&sym_header) + sizeof(Elf_Sym));
+  }
+
+  LOG(DEBUG) << "Set raw string table";
+
+  //string_table_section.content(string_table_raw);
+  if (string_table_raw.size() <= string_table_section.size()) {
+    string_table_section.content(string_table_raw);
+  } else {
+    //TODO
+    string_table_section.content(string_table_raw);
+    //LOG(DEBUG) << "New dynamic string table is bigger " << std::dec << string_table_raw.size()
+    //           << " than the original one " << string_table_section.size();
+
+    //std::pair<uint64_t, uint64_t> offset_size = this->binary_->insert_content(string_table_raw);
+    //LOG(DEBUG) << "New 'dynamic string table' offset: " << std::hex << std::get<0>(offset_size);
+    //LOG(DEBUG) << "New 'dynamic string table' size:   " << std::hex << std::get<1>(offset_size);
+
+    //Section& dynamic_section = this->binary_->get_dynamic_section();
+
+    //this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_STRTAB).value(std::get<0>(offset_size));
+    //this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_STRSZ).value(std::get<1>(offset_size));
+
+
+    //Section new_string_table_section;// = string_table_section;
+    //new_string_table_section.content(string_table_raw);
+    //Section& section_added = this->binary_->add_section(new_string_table_section, true);
+  }
+
+  LOG(DEBUG) << "Write back symbol table";
+
+  symbol_table_section.content(symbol_table_raw);
+
+}
+
+template<typename ELF_T>
+void Builder::build_dynamic_relocations(void) {
+  using Elf_Addr   = typename ELF_T::Elf_Addr;
+  using Elf_Xword  = typename ELF_T::Elf_Xword;
+  using Elf_Sxword = typename ELF_T::Elf_Sxword;
+
+  using Elf_Rela   = typename ELF_T::Elf_Rela;
+  using Elf_Rel    = typename ELF_T::Elf_Rel;
+  LOG(DEBUG) << "[+] Building dynamic relocations";
+
+  bool isRela = this->binary_->dynamic_relocations_[0]->is_rela();
+  if (not std::all_of(
+        std::begin(this->binary_->dynamic_relocations_),
+        std::end(this->binary_->dynamic_relocations_),
+        [isRela] (const Relocation* relocation) {
+          return relocation != nullptr and relocation->is_rela() == isRela;
+        })) {
+      throw LIEF::type_error("Relocation are not of the same type");
+  }
+
+  dynamic_entries_t::iterator it_dyn_relocation;
+  dynamic_entries_t::iterator it_dyn_relocation_size;
+
+  if (isRela) {
+    it_dyn_relocation = std::find_if(
+        std::begin(this->binary_->dynamic_entries_),
+        std::end(this->binary_->dynamic_entries_),
+        [] (const DynamicEntry* entry)
+        {
+          return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_RELA;
+        });
+
+    it_dyn_relocation_size = std::find_if(
+        std::begin(this->binary_->dynamic_entries_),
+        std::end(this->binary_->dynamic_entries_),
+        [] (const DynamicEntry* entry)
+        {
+          return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_RELASZ ;
+        });
+  } else {
+    it_dyn_relocation = std::find_if(
+        std::begin(this->binary_->dynamic_entries_),
+        std::end(this->binary_->dynamic_entries_),
+        [] (const DynamicEntry* entry)
+        {
+          return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_REL;
+        });
+
+    it_dyn_relocation_size = std::find_if(
+        std::begin(this->binary_->dynamic_entries_),
+        std::end(this->binary_->dynamic_entries_),
+        [] (const DynamicEntry* entry)
+        {
+          return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_RELSZ ;
+        });
+  }
+
+  if (it_dyn_relocation == std::end(this->binary_->dynamic_entries_)) {
+    throw LIEF::not_found("Unable to find the DT_REL{A} entry");
+  }
+
+  if (it_dyn_relocation_size == std::end(this->binary_->dynamic_entries_)) {
+    throw LIEF::not_found("Unable to find the DT_REL{A}SZ entry");
+  }
+
+  Section& relocation_section = this->binary_->section_from_virtual_address((*it_dyn_relocation)->value());
+
+  if (isRela) {
+    (*it_dyn_relocation_size)->value(this->binary_->dynamic_relocations_.size() * sizeof(Elf_Rela));
+  } else {
+    (*it_dyn_relocation_size)->value(this->binary_->dynamic_relocations_.size() * sizeof(Elf_Rel));
+  }
+
+  std::vector<uint8_t> content;
+  for (const Relocation& relocation : this->binary_->get_dynamic_relocations()) {
+
+    // look for symbol index
+    uint32_t idx = 0;
+    if (relocation.has_symbol()) {
+      const Symbol& symbol    = relocation.symbol();
+      const std::string& name = symbol.name();
+      auto&& it_name  = std::find_if(
+          std::begin(this->binary_->dynamic_symbols_),
+          std::end(this->binary_->dynamic_symbols_),
+          [&name] (const Symbol* s) {
+            return s->name() == name;
+          });
+
+      if (it_name == std::end(this->binary_->dynamic_symbols_)) {
+        throw not_found("Unable to find the symbol associated with the relocation");
+      }
+
+      idx = static_cast<uint32_t>(std::distance(std::begin(this->binary_->dynamic_symbols_), it_name));
+    }
+
+
+    Elf_Xword info = 0;
+    if (std::is_same<ELF_T, ELF32>::value) {
+      info = (static_cast<Elf_Xword>(idx) << 8) | relocation.type();
+    } else {
+      info = (static_cast<Elf_Xword>(idx) << 32) | (relocation.type() & 0xffffffffL);
+    }
+
+    if (isRela) {
+      Elf_Rela relahdr;
+      relahdr.r_offset = static_cast<Elf_Addr>(relocation.address());
+      relahdr.r_info   = static_cast<Elf_Xword>(info);
+      relahdr.r_addend = static_cast<Elf_Sxword>(relocation.addend());
+
+      content.insert(
+          std::end(content),
+          reinterpret_cast<uint8_t*>(&relahdr),
+          reinterpret_cast<uint8_t*>(&relahdr) + sizeof(Elf_Rela));
+
+    } else {
+      Elf_Rel relhdr;
+      relhdr.r_offset = static_cast<Elf_Addr>(relocation.address());
+      relhdr.r_info   = static_cast<Elf_Xword>(info);
+
+      content.insert(
+          std::end(content),
+          reinterpret_cast<uint8_t*>(&relhdr),
+          reinterpret_cast<uint8_t*>(&relhdr) + sizeof(Elf_Rel));
+    }
+
+  }
+
+  relocation_section.content(content);
+}
+
+template<typename ELF_T>
+void Builder::build_pltgot_relocations(void) {
+  using Elf_Addr   = typename ELF_T::Elf_Addr;
+  using Elf_Xword  = typename ELF_T::Elf_Xword;
+  using Elf_Sxword = typename ELF_T::Elf_Sxword;
+
+  using Elf_Rela   = typename ELF_T::Elf_Rela;
+  using Elf_Rel    = typename ELF_T::Elf_Rel;
+
+  LOG(DEBUG) << "[+] Building .plt.got relocations";
+  bool isRela = this->binary_->pltgot_relocations_[0]->is_rela();
+
+  if (not std::all_of(
+        std::begin(this->binary_->pltgot_relocations_),
+        std::end(this->binary_->pltgot_relocations_),
+        [isRela] (const Relocation* relocation) {
+          return relocation != nullptr and relocation->is_rela() == isRela;
+        })) {
+      throw LIEF::type_error("Relocation are not of the same type");
+  }
+
+  //TODO: check DT_PLTREL
+  auto&& it_dyn_relocation = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_JMPREL;
+      });
+
+  auto&& it_dyn_relocation_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_PLTRELSZ;
+      });
+
+  if (it_dyn_relocation == std::end(this->binary_->dynamic_entries_)) {
+    throw LIEF::not_found("Unable to find the DT_JMPREL entry");
+  }
+
+  if (it_dyn_relocation_size == std::end(this->binary_->dynamic_entries_)) {
+    throw LIEF::not_found("Unable to find the DT_PLTRELSZ entry");
+  }
+
+  Section& relocation_section = this->binary_->section_from_virtual_address((*it_dyn_relocation)->value());
+  if (isRela) {
+    (*it_dyn_relocation_size)->value(this->binary_->pltgot_relocations_.size() * sizeof(Elf_Rela));
+  } else {
+    (*it_dyn_relocation_size)->value(this->binary_->pltgot_relocations_.size() * sizeof(Elf_Rel));
+  }
+
+  std::vector<uint8_t> content; // Section's content
+  for (const Relocation& relocation : this->binary_->get_pltgot_relocations()) {
+
+
+    uint32_t idx = 0;
+    if (relocation.has_symbol()) {
+      // look for symbol index
+      const Symbol& symbol = relocation.symbol();
+      const std::string& name = symbol.name();
+      auto&& it_name = std::find_if(
+          std::begin(this->binary_->dynamic_symbols_),
+          std::end(this->binary_->dynamic_symbols_),
+          [&name] (const Symbol* s) {
+            return s->name() == name;
+          });
+
+      if (it_name == std::end(this->binary_->dynamic_symbols_)) {
+        throw not_found("Unable to find the symbol associated with the relocation");
+      }
+
+      idx = static_cast<uint32_t>(std::distance(std::begin(this->binary_->dynamic_symbols_), it_name));
+    }
+
+    Elf_Xword info = 0;
+    if (std::is_same<ELF_T, ELF32>::value) {
+      info = (static_cast<Elf_Xword>(idx) << 8) | relocation.type();
+    } else {
+      info = (static_cast<Elf_Xword>(idx) << 32) | (relocation.type() & 0xffffffffL);
+    }
+
+    if (isRela) {
+      Elf_Rela relahdr;
+      relahdr.r_offset = static_cast<Elf_Addr>(relocation.address());
+      relahdr.r_info   = static_cast<Elf_Xword>(info);
+      relahdr.r_addend = static_cast<Elf_Sxword>(relocation.addend());
+
+      content.insert(
+          std::end(content),
+          reinterpret_cast<uint8_t*>(&relahdr),
+          reinterpret_cast<uint8_t*>(&relahdr) + sizeof(Elf_Rela));
+
+    } else {
+      Elf_Rel relhdr;
+      relhdr.r_offset = static_cast<Elf_Addr>(relocation.address());
+      relhdr.r_info   = static_cast<Elf_Xword>(info);
+
+      content.insert(
+          std::end(content),
+          reinterpret_cast<uint8_t*>(&relhdr),
+          reinterpret_cast<uint8_t*>(&relhdr) + sizeof(Elf_Rel));
+    }
+  }
+
+  relocation_section.content(content);
+}
+
+
+template<typename ELF_T>
+void Builder::build_symbol_requirement(void) {
+  using Elf_Half    = typename ELF_T::Elf_Half;
+  using Elf_Word    = typename ELF_T::Elf_Word;
+  using Elf_Word    = typename ELF_T::Elf_Word;
+
+  using Elf_Verneed = typename ELF_T::Elf_Verneed;
+  using Elf_Vernaux = typename ELF_T::Elf_Vernaux;
+  LOG(DEBUG) << "[+] Building symbol requirement";
+
+
+  const uint64_t svr_address = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_VERNEED).value();
+  const uint64_t svr_offset  = this->binary_->virtual_address_to_offset(svr_address);
+  const uint64_t svr_nb      = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_VERNEEDNUM).value();
+
+  if (svr_nb != this->binary_->symbol_version_requirements_.size()) {
+    LOG(WARNING) << "The number of symbol version requirement \
+      entries in the binary differ from the value in DT_VERNEEDNUM";
+  }
+
+  const uint64_t dyn_str_va = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_STRTAB).value();
+
+  Section& dyn_str_section = this->binary_->section_from_virtual_address(dyn_str_va);
+  std::vector<uint8_t> svr_raw;
+  std::vector<uint8_t> dyn_str_raw = dyn_str_section.content();
+
+  uint32_t svr_idx = 0;
+  for (const SymbolVersionRequirement& svr: this->binary_->get_symbols_version_requirement()) {
+    const std::string& name = svr.name();
+    auto&& it_name_offset  = std::search(
+        std::begin(dyn_str_raw),
+        std::end(dyn_str_raw),
+        name.c_str(),
+        name.c_str() + name.size() + 1);
+
+    uint64_t name_offset = 0;
+
+    if (it_name_offset != std::end(dyn_str_raw)) {
+      name_offset = static_cast<uint64_t>(std::distance(std::begin(dyn_str_raw), it_name_offset));
+    } else {
+      LOG(DEBUG) << "[LIEF_DEBUG] buildSymbolRequirement(): Library name is not present";
+      dyn_str_raw.insert(std::end(dyn_str_raw), std::begin(name), std::end(name));
+      dyn_str_raw.push_back(0);
+      name_offset = dyn_str_raw.size() - name.size() - 1;
+    }
+
+    it_const_symbols_version_aux_requirement svars = svr.get_auxiliary_symbols();
+
+    uint64_t next_symbol_offset = 0;
+    if (svr_idx < (this->binary_->symbol_version_requirements_.size() - 1)) {
+      next_symbol_offset = sizeof(Elf_Verneed) + svars.size() * sizeof(Elf_Vernaux);
+    }
+
+    Elf_Verneed header;
+    header.vn_version = static_cast<Elf_Half>(svr.version());
+    header.vn_cnt     = static_cast<Elf_Half>(svars.size());
+    header.vn_file    = static_cast<Elf_Word>(name_offset);
+    header.vn_aux     = static_cast<Elf_Word>(svars.size() > 0 ? sizeof(Elf_Verneed) : 0);
+    header.vn_next    = static_cast<Elf_Word>(next_symbol_offset);
+
+    svr_raw.insert(
+        std::end(svr_raw),
+        reinterpret_cast<uint8_t*>(&header),
+        reinterpret_cast<uint8_t*>(&header) + sizeof(Elf_Verneed));
+
+
+    uint32_t svar_idx = 0;
+    for (const SymbolVersionAuxRequirement& svar : svars) {
+      const std::string& svar_name = svar.name();
+      auto&& it_svar_name_offset = std::search(
+          std::begin(dyn_str_raw),
+          std::end(dyn_str_raw),
+          svar_name.c_str(),
+          svar_name.c_str() + svar_name.size() + 1);
+
+      uint64_t svar_name_offset = 0;
+
+      if (it_svar_name_offset != std::end(dyn_str_raw)) {
+        svar_name_offset = static_cast<uint64_t>(std::distance(std::begin(dyn_str_raw), it_svar_name_offset));
+      } else {
+        dyn_str_raw.insert(std::end(dyn_str_raw), std::begin(svar_name), std::end(svar_name));
+        dyn_str_raw.push_back(0);
+        svar_name_offset = dyn_str_raw.size() - svar_name.size() - 1;
+      }
+
+      Elf_Vernaux aux_header;
+      aux_header.vna_hash  = static_cast<Elf_Word>(svar.hash());
+      aux_header.vna_flags = static_cast<Elf_Half>(svar.flags());
+      aux_header.vna_other = static_cast<Elf_Half>(svar.other());
+      aux_header.vna_name  = static_cast<Elf_Word>(svar_name_offset);
+      aux_header.vna_next  = static_cast<Elf_Word>(svar_idx < (svars.size() - 1) ? sizeof(Elf_Vernaux) : 0);
+
+      svr_raw.insert(
+          std::end(svr_raw),
+          reinterpret_cast<uint8_t*>(&aux_header),
+          reinterpret_cast<uint8_t*>(&aux_header) + sizeof(Elf_Vernaux));
+
+      ++svar_idx;
+    }
+
+    ++svr_idx;
+  }
+
+  this->binary_->section_from_offset(svr_offset).content(svr_raw);
+  dyn_str_section.content(dyn_str_raw);
+
+}
+
+template<typename ELF_T>
+void Builder::build_symbol_definition(void) {
+  using Elf_Half   = typename ELF_T::Elf_Half;
+  using Elf_Word   = typename ELF_T::Elf_Word;
+  using Elf_Word   = typename ELF_T::Elf_Word;
+
+  using Elf_Verdef   = typename ELF_T::Elf_Verdef;
+  using Elf_Verdaux   = typename ELF_T::Elf_Verdaux;
+
+  LOG(DEBUG) << "[+] Building symbol definition";
+
+  const uint64_t svd_va     = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_VERDEF).value();
+  const uint64_t svd_offset = this->binary_->virtual_address_to_offset(svd_va);
+  const uint64_t svd_nb     = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_VERDEFNUM).value();
+
+  if (svd_nb != this->binary_->symbol_version_definition_.size()) {
+    LOG(WARNING) << "The number of symbol version definition entries\
+      in the binary differ from the value in DT_VERDEFNUM";
+  }
+
+
+  const uint64_t dyn_str_va = this->binary_->dynamic_entry_from_tag(DYNAMIC_TAGS::DT_STRTAB).value();
+  Section& dyn_str_section = this->binary_->section_from_virtual_address(dyn_str_va);
+
+  std::vector<uint8_t> svd_raw;
+  std::vector<uint8_t> dyn_str_raw = dyn_str_section.content();
+
+  uint32_t svd_idx = 0;
+  for (const SymbolVersionDefinition& svd: this->binary_->get_symbols_version_definition()) {
+
+    it_const_symbols_version_aux svas = svd.symbols_aux();
+
+    uint64_t next_symbol_offset = 0;
+
+    if (svd_idx < (svd_nb - 1)) {
+      next_symbol_offset = sizeof(Elf_Verdef) + svas.size() * sizeof(Elf_Verdaux);
+    }
+
+    Elf_Verdef header;
+    header.vd_version = static_cast<Elf_Half>(svd.version());
+    header.vd_flags   = static_cast<Elf_Half>(svd.flags());
+    header.vd_ndx     = static_cast<Elf_Half>(svd.ndx());
+    header.vd_cnt     = static_cast<Elf_Half>(svas.size());
+    header.vd_hash    = static_cast<Elf_Word>(svd.hash());
+    header.vd_aux     = static_cast<Elf_Word>(svas.size() > 0 ? sizeof(Elf_Verdef) : 0);
+    header.vd_next    = static_cast<Elf_Word>(next_symbol_offset);
+
+    svd_raw.insert(std::end(svd_raw),
+        reinterpret_cast<uint8_t*>(&header),
+        reinterpret_cast<uint8_t*>(&header) + sizeof(Elf_Verdef));
+
+
+    uint32_t sva_idx = 0;
+    for (const SymbolVersionAux& sva : svas) {
+      const std::string& sva_name = sva.name();
+      auto&& it_sva_name_offset = std::search(
+          std::begin(dyn_str_raw),
+          std::end(dyn_str_raw),
+          sva_name.c_str(),
+          sva_name.c_str() + sva_name.size() + 1);
+
+      uint64_t sva_name_offset = 0;
+
+      if (it_sva_name_offset != std::end(dyn_str_raw)) {
+        sva_name_offset = static_cast<uint64_t>(std::distance(std::begin(dyn_str_raw), it_sva_name_offset));
+      } else {
+        dyn_str_raw.insert(std::end(dyn_str_raw), std::begin(sva_name), std::end(sva_name));
+        dyn_str_raw.push_back(0);
+        sva_name_offset = dyn_str_raw.size() - sva_name.size() - 1;
+      }
+
+
+      Elf_Verdaux aux_header;
+      aux_header.vda_name  = static_cast<Elf_Word>(sva_name_offset);
+      aux_header.vda_next  = static_cast<Elf_Word>(sva_idx < (svas.size() - 1) ? sizeof(Elf_Verdaux) : 0);
+
+      svd_raw.insert(
+          std::end(svd_raw),
+          reinterpret_cast<uint8_t*>(&aux_header),
+          reinterpret_cast<uint8_t*>(&aux_header) + sizeof(Elf_Verdaux));
+
+      ++sva_idx;
+    }
+    ++svd_idx;
+  }
+
+
+  this->binary_->section_from_offset(svd_offset).content(svd_raw);
+  dyn_str_section.content(dyn_str_raw);
+
+}
+}
+}
diff --git a/src/ELF/CMakeLists.txt b/src/ELF/CMakeLists.txt
new file mode 100644
index 0000000..4159660
--- /dev/null
+++ b/src/ELF/CMakeLists.txt
@@ -0,0 +1,45 @@
+set(LIEF_ELF_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/DynamicEntryArray.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/utils.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/SymbolVersionRequirement.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/SymbolVersionAuxRequirement.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Binary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Symbol.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/EnumToString.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Header.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DynamicSharedObject.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Segment.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Section.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/SymbolVersionAux.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/GnuHash.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/SymbolVersion.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Builder.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DynamicEntryLibrary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DataHandler
+  ${CMAKE_CURRENT_LIST_DIR}/DataHandler/Node.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DataHandler/Handler.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Parser.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Relocation.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DynamicEntryRunPath.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/SymbolVersionDefinition.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DynamicEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DynamicEntryRpath.cpp)
+
+
+target_sources(LIB_LIEF_STATIC PRIVATE ${LIEF_ELF_SRC})
+target_sources(LIB_LIEF_SHARED PRIVATE ${LIEF_ELF_SRC})
+
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/enums.inc      LIEF_ELF_ENUMS)
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/structures.inc LIEF_ELF_STRUCTURES)
+
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/enums.hpp.in
+  ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/ELF/enums.hpp
+  @ONLY
+)
+
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/ELF/Structures.hpp.in
+  ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/ELF/Structures.hpp
+  @ONLY
+)
diff --git a/src/ELF/DataHandler/Handler.cpp b/src/ELF/DataHandler/Handler.cpp
new file mode 100644
index 0000000..5f19152
--- /dev/null
+++ b/src/ELF/DataHandler/Handler.cpp
@@ -0,0 +1,163 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <stdexcept>
+#include <algorithm>
+
+#include "easylogging++.h"
+
+#include "LIEF/ELF/DataHandler/Handler.hpp"
+#include "LIEF/exception.hpp"
+
+namespace LIEF {
+namespace ELF {
+namespace DataHandler {
+
+Handler::Handler(void) = default;
+Handler::~Handler(void) = default;
+Handler& Handler::operator=(const Handler& copy) = default;
+Handler::Handler(const Handler& copy) = default;
+
+Handler::Handler(const std::vector<uint8_t>& content) :
+  data_{content}
+{}
+
+//! \brief return the raw content
+const std::vector<uint8_t>& Handler::content(void) const {
+  return this->data_;
+}
+
+/*! \brief return the content from offset and size
+ *
+ * First we have to find the node which hold the content
+ * if the node does not exist we throw an exception because we wants to read
+ * something which is not hold by `section` or `segment`
+ * if the node exist we return the raw content
+ */
+std::vector<uint8_t> Handler::content(uint64_t offset, uint64_t size, Node::Type type) {
+  if (offset > this->data_.size() or (offset + size) > this->data_.size()) {
+    LOG(DEBUG) << "Offset: 0x" << std::hex << offset;
+    LOG(DEBUG) << "Size: 0x" << std::hex << size;
+    LOG(DEBUG) << "Data size" << std::hex << this->data_.size();
+    throw std::runtime_error("Invalid data access");
+  }
+  Node& node = this->find(offset, size, false, type);
+  uint64_t relativeOffset = offset - node.offset();
+    return {
+      this->data_.data() + node.offset() + relativeOffset,
+      this->data_.data() + node.offset() + relativeOffset + size
+    };
+
+}
+
+/*! \brief Insert content in the raw data
+ *
+ * First we check if the container is large enough to insert the new data
+ * Then we check if a node exist for this data. If yes, we replace the raw data with the new data
+ * if not we create a node to hold this data and then we insert data
+ */
+void Handler::content(uint64_t offset, std::vector<uint8_t> content, Node::Type type) {
+
+  if (this->data_.size() < (offset + content.size())) {
+    this->data_.resize(offset + content.size());
+  }
+
+  if (content.size() == 0) {
+    return;
+  }
+
+  try {
+    Node& node = this->find(offset, content.size(), true, type);
+    std::copy(std::begin(content), std::end(content), this->data_.data() + node.offset());
+  } catch (const not_found&) {
+    Node nodeCreated = {offset, content.size(), type};
+    std::copy(std::begin(content), std::end(content), this->data_.data() + nodeCreated.offset());
+    this->nodes_.push_back(std::move(nodeCreated));
+  }
+
+}
+
+/*! \brief Find the node associated with the following parameters
+ *  \return `nullptr` if the node doesn't exist else the node
+ *
+ *  To complete
+ *
+ */
+Node& Handler::find(uint64_t offset, uint64_t size, bool insert, Node::Type type) {
+
+  if (insert) {
+    auto&& itNode = std::find_if(
+        std::begin(this->nodes_),
+        std::end(this->nodes_),
+        [&offset, &size, &type] (const Node& node)
+        {
+          return node.type() == type and (node.offset() == offset) and ((offset + size) == (node.offset() + node.size()));
+        });
+
+    if (itNode != std::end(this->nodes_)) {
+      return *itNode;
+    } else {
+      throw LIEF::not_found("Node not found (set)");
+    }
+  } else {
+    auto&& itNode = std::find_if(
+        std::begin(this->nodes_),
+        std::end(this->nodes_),
+        [&offset, &size, &type] (const Node& node)
+        {
+          return node.type() == type and (node.offset() <= offset) and ((offset + size) <= (node.offset() + node.size()));
+        });
+
+    if (itNode != std::end(this->nodes_)) {
+      return *itNode;
+    } else {
+      this->nodes_.emplace_back(offset, size, type);
+      return this->nodes_.back();
+    }
+  }
+}
+
+void Handler::move(Node& node, uint64_t newOffset) {
+  if (newOffset < node.offset()) {
+    throw LIEF::not_implemented("Handler::move shift << not implemented");
+  }
+
+  uint64_t originalOffset = node.offset();
+  uint64_t shift          = newOffset - originalOffset;
+
+  // Virtual shift. Use makeHole to physical shift
+  for (Node& child : this->nodes_) {
+    if (child.type() == node.type() and child.offset() > originalOffset) {
+      child.offset(child.offset() + shift);
+    }
+  }
+
+}
+
+void Handler::add_node(const Node& node) {
+  this->nodes_.push_back(node);
+}
+
+void Handler::make_hole(uint64_t offset, uint64_t size) {
+  if (this->data_.size() < (offset + size)) {
+    this->data_.resize((offset + size));
+  }
+  this->data_.insert(std::begin(this->data_) + offset, size, 0);
+}
+
+} // namespace DataHandler
+} // namespace ELF
+} // namespace LIEF
diff --git a/src/ELF/DataHandler/Node.cpp b/src/ELF/DataHandler/Node.cpp
new file mode 100644
index 0000000..9b0925b
--- /dev/null
+++ b/src/ELF/DataHandler/Node.cpp
@@ -0,0 +1,70 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/DataHandler/Node.hpp"
+
+namespace LIEF {
+namespace ELF {
+namespace DataHandler {
+
+Node& Node::operator=(const Node& copy) = default;
+Node::Node(const Node& copy) = default;
+
+Node::Node(void) :
+  size_{0},
+  offset_{0},
+  type_{UNKNOWN}
+{}
+
+
+Node::Node(uint64_t offset, uint64_t size, Type type) :
+  size_{size},
+  offset_{offset},
+  type_{type}
+{
+}
+
+uint64_t Node::size(void) const {
+  return this->size_;
+}
+
+
+uint64_t Node::offset(void) const {
+  return this->offset_;
+}
+
+
+Node::Type Node::type(void) const {
+  return this->type_;
+}
+
+
+void Node::size(uint64_t size) {
+  this->size_ = size;
+}
+
+
+void Node::type(Node::Type type) {
+  this->type_ = type;
+}
+
+
+void Node::offset(uint64_t offset) {
+  this->offset_ = offset;
+}
+
+}
+}
+}
diff --git a/src/ELF/DynamicEntry.cpp b/src/ELF/DynamicEntry.cpp
new file mode 100644
index 0000000..27dc7ae
--- /dev/null
+++ b/src/ELF/DynamicEntry.cpp
@@ -0,0 +1,118 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdexcept>
+#include <iomanip>
+
+#include "LIEF/exception.hpp"
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/DynamicEntry.hpp"
+#include "LIEF/ELF/EnumToString.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+DynamicEntry::DynamicEntry(void) = default;
+
+DynamicEntry& DynamicEntry::operator=(const DynamicEntry& copy) = default;
+
+DynamicEntry::DynamicEntry(const DynamicEntry& copy) = default;
+
+DynamicEntry::~DynamicEntry(void) = default;
+
+DynamicEntry::DynamicEntry(const Elf64_Dyn* header) :
+  tag_{static_cast<DYNAMIC_TAGS>(header->d_tag)},
+  value_{header->d_un.d_val}
+{}
+
+
+DynamicEntry::DynamicEntry(const Elf32_Dyn* header) :
+  tag_{static_cast<DYNAMIC_TAGS>(header->d_tag)},
+  value_{header->d_un.d_val}
+{}
+
+
+DYNAMIC_TAGS DynamicEntry::tag(void) const {
+  return this->tag_;
+}
+
+
+uint64_t DynamicEntry::value(void) const {
+  return this->value_;
+}
+
+void DynamicEntry::tag(DYNAMIC_TAGS tag) {
+  this->tag_ = tag;
+}
+
+
+void DynamicEntry::value(uint64_t value) {
+  this->value_ = value;
+}
+
+
+const std::string& DynamicEntry::name(void) const {
+  throw LIEF::not_found("This dynamic hasn't name field");
+}
+
+
+void DynamicEntry::name(const std::string&) {
+  throw LIEF::not_found("This dynamic hasn't name field");
+}
+
+
+std::vector<uint64_t>& DynamicEntry::array(void) {
+  throw LIEF::not_found("This dynamic entry hasn't array");
+}
+
+
+void DynamicEntry::array(const std::vector<uint64_t>&) {
+  throw LIEF::not_found("This dynamic entry hasn't array");
+}
+
+void DynamicEntry::accept(Visitor& visitor) const {
+  visitor.visit(*this); // Double dispatch to avoid down-casting
+  visitor.visit(this->value());
+  visitor.visit(this->tag());
+}
+
+
+bool DynamicEntry::operator==(const DynamicEntry& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool DynamicEntry::operator!=(const DynamicEntry& rhs) const {
+  return not (*this == rhs);
+}
+
+
+
+std::ostream& DynamicEntry::print(std::ostream& os) const {
+  os << std::hex;
+  os << std::left
+     << std::setw(20) << to_string(this->tag())
+     << std::setw(10) << this->value();
+  return os;
+}
+
+
+std::ostream& operator<<(std::ostream& os, const DynamicEntry& entry) {
+  return entry.print(os);
+}
+}
+}
diff --git a/src/ELF/DynamicEntryArray.cpp b/src/ELF/DynamicEntryArray.cpp
new file mode 100644
index 0000000..47043a8
--- /dev/null
+++ b/src/ELF/DynamicEntryArray.cpp
@@ -0,0 +1,82 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/DynamicEntryArray.hpp"
+#include <numeric>
+#include <sstream>
+#include <iomanip>
+
+namespace LIEF {
+namespace ELF {
+
+DynamicEntryArray::DynamicEntryArray(void) = default;
+DynamicEntryArray& DynamicEntryArray::operator=(const DynamicEntryArray& copy) = default;
+DynamicEntryArray::DynamicEntryArray(const DynamicEntryArray& copy) = default;
+
+DynamicEntryArray::DynamicEntryArray(const Elf64_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+DynamicEntryArray::DynamicEntryArray(const Elf32_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+std::vector<uint64_t>& DynamicEntryArray::array(void) {
+  return const_cast<std::vector<uint64_t>&>(static_cast<const DynamicEntryArray*>(this)->array());
+}
+
+
+const std::vector<uint64_t>& DynamicEntryArray::array(void) const {
+  return this->array_;
+}
+
+void DynamicEntryArray::array(const std::vector<uint64_t>& array) {
+  this->array_ = array;
+}
+
+void DynamicEntryArray::accept(Visitor& visitor) const {
+  DynamicEntry::accept(visitor);
+  visitor(*this); // Double dispatch to avoid down-casting
+  for (uint64_t x : this->array()) {
+    visitor.visit(x);
+  }
+}
+
+std::ostream& DynamicEntryArray::print(std::ostream& os) const {
+  const std::vector<uint64_t>& array = this->array();
+  DynamicEntry::print(os);
+  os << std::hex
+     << std::left
+     << "["
+     << std::accumulate(
+         std::begin(array),
+         std::end(array),
+         std::string(""),
+         [] (std::string& s, uint64_t x) {
+          std::stringstream ss;
+          ss << "0x" << std::hex << x;
+            return s.empty() ? ss.str() : " ," + ss.str();
+         })
+     << "]";
+
+
+  return os;
+}
+
+}
+}
+
+
+
diff --git a/src/ELF/DynamicEntryLibrary.cpp b/src/ELF/DynamicEntryLibrary.cpp
new file mode 100644
index 0000000..504495b
--- /dev/null
+++ b/src/ELF/DynamicEntryLibrary.cpp
@@ -0,0 +1,72 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/DynamicEntryLibrary.hpp"
+
+#include <iomanip>
+
+namespace LIEF {
+namespace ELF {
+
+DynamicEntryLibrary::DynamicEntryLibrary(void) = default;
+DynamicEntryLibrary& DynamicEntryLibrary::operator=(const DynamicEntryLibrary& copy) = default;
+DynamicEntryLibrary::DynamicEntryLibrary(const DynamicEntryLibrary& copy) = default;
+
+DynamicEntryLibrary::DynamicEntryLibrary(const Elf64_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+
+DynamicEntryLibrary::DynamicEntryLibrary(const Elf32_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+DynamicEntryLibrary::DynamicEntryLibrary(const std::string& name) :
+  libname_{name}
+{
+  this->tag_   = DYNAMIC_TAGS::DT_NEEDED;
+  this->value_ = 0;
+}
+
+const std::string& DynamicEntryLibrary::name(void) const {
+  return this->libname_;
+}
+
+
+void DynamicEntryLibrary::name(const std::string& name) {
+  this->libname_ = name;
+}
+
+
+void DynamicEntryLibrary::accept(Visitor& visitor) const {
+  DynamicEntry::accept(visitor);
+  visitor(*this); // Double dispatch to avoid down-casting
+  visitor.visit(this->name());
+}
+
+std::ostream& DynamicEntryLibrary::print(std::ostream& os) const {
+
+  DynamicEntry::print(os);
+  os << std::hex
+     << std::left
+     << std::setw(10) << this->name();
+  return os;
+
+}
+}
+}
+
+
+
diff --git a/src/ELF/DynamicEntryRpath.cpp b/src/ELF/DynamicEntryRpath.cpp
new file mode 100644
index 0000000..ce5a96f
--- /dev/null
+++ b/src/ELF/DynamicEntryRpath.cpp
@@ -0,0 +1,80 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/DynamicEntryRpath.hpp"
+
+#include <iomanip>
+
+namespace LIEF {
+namespace ELF {
+
+DynamicEntryRpath::DynamicEntryRpath(void) = default;
+DynamicEntryRpath& DynamicEntryRpath::operator=(const DynamicEntryRpath& copy) = default;
+DynamicEntryRpath::DynamicEntryRpath(const DynamicEntryRpath& copy) = default;
+
+DynamicEntryRpath::DynamicEntryRpath(const Elf64_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+
+DynamicEntryRpath::DynamicEntryRpath(const Elf32_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+DynamicEntryRpath::DynamicEntryRpath(const std::string& rpath) :
+  rpath_{rpath}
+{
+  this->tag_   = DYNAMIC_TAGS::DT_RPATH;
+  this->value_ = 0;
+}
+
+const std::string& DynamicEntryRpath::name(void) const {
+  return this->rpath_;
+}
+
+
+void DynamicEntryRpath::name(const std::string& name) {
+  this->rpath_ = name;
+}
+
+const std::string& DynamicEntryRpath::rpath(void) const {
+  return this->name();
+}
+
+
+void DynamicEntryRpath::rpath(const std::string& rpath) {
+  this->name(rpath);
+}
+
+void DynamicEntryRpath::accept(Visitor& visitor) const {
+  DynamicEntry::accept(visitor);
+  visitor(*this); // Double dispatch to avoid down-casting
+  visitor.visit(this->rpath());
+}
+
+std::ostream& DynamicEntryRpath::print(std::ostream& os) const {
+
+  DynamicEntry::print(os);
+  os << std::hex
+     << std::left
+     << std::setw(10) << this->rpath();
+  return os;
+
+}
+}
+}
+
+
+
diff --git a/src/ELF/DynamicEntryRunPath.cpp b/src/ELF/DynamicEntryRunPath.cpp
new file mode 100644
index 0000000..ca31293
--- /dev/null
+++ b/src/ELF/DynamicEntryRunPath.cpp
@@ -0,0 +1,77 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/DynamicEntryRunPath.hpp"
+
+#include <iomanip>
+
+namespace LIEF {
+namespace ELF {
+
+DynamicEntryRunPath::DynamicEntryRunPath(void) = default;
+DynamicEntryRunPath& DynamicEntryRunPath::operator=(const DynamicEntryRunPath& copy) = default;
+DynamicEntryRunPath::DynamicEntryRunPath(const DynamicEntryRunPath& copy) = default;
+
+DynamicEntryRunPath::DynamicEntryRunPath(const Elf64_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+
+DynamicEntryRunPath::DynamicEntryRunPath(const Elf32_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+DynamicEntryRunPath::DynamicEntryRunPath(const std::string& runpath) :
+  runpath_{runpath}
+{
+  this->tag_   = DYNAMIC_TAGS::DT_RUNPATH;
+  this->value_ = 0;
+}
+
+const std::string& DynamicEntryRunPath::name(void) const {
+  return this->runpath_;
+}
+
+
+void DynamicEntryRunPath::name(const std::string& name) {
+  this->runpath_ = name;
+}
+
+const std::string& DynamicEntryRunPath::runpath(void) const {
+  return this->name();
+}
+
+
+void DynamicEntryRunPath::runpath(const std::string& runpath) {
+  this->name(runpath);
+}
+
+void DynamicEntryRunPath::accept(Visitor& visitor) const {
+  DynamicEntry::accept(visitor);
+  visitor(*this); // Double dispatch to avoid down-casting
+  visitor.visit(this->runpath());
+}
+
+std::ostream& DynamicEntryRunPath::print(std::ostream& os) const {
+  DynamicEntry::print(os);
+  os << std::hex
+     << std::left
+     << std::setw(10) << this->name();
+  return os;
+}
+}
+}
+
+
diff --git a/src/ELF/DynamicSharedObject.cpp b/src/ELF/DynamicSharedObject.cpp
new file mode 100644
index 0000000..cb67734
--- /dev/null
+++ b/src/ELF/DynamicSharedObject.cpp
@@ -0,0 +1,66 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/DynamicSharedObject.hpp"
+
+#include <iomanip>
+
+namespace LIEF {
+namespace ELF {
+DynamicSharedObject::DynamicSharedObject(void) = default;
+
+DynamicSharedObject& DynamicSharedObject::operator=(const DynamicSharedObject&) = default;
+
+DynamicSharedObject::DynamicSharedObject(const DynamicSharedObject&) = default;
+
+DynamicSharedObject::DynamicSharedObject(const Elf64_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+
+DynamicSharedObject::DynamicSharedObject(const Elf32_Dyn* header) :
+  DynamicEntry{header}
+{}
+
+
+const std::string& DynamicSharedObject::name(void) const {
+  return this->name_;
+}
+
+
+void DynamicSharedObject::name(const std::string& name) {
+  this->name_ = name;
+}
+
+void DynamicSharedObject::accept(Visitor& visitor) const {
+  DynamicEntry::accept(visitor);
+  visitor(*this); // Double dispatch to avoid down-casting
+  visitor.visit(this->name());
+}
+
+
+std::ostream& DynamicSharedObject::print(std::ostream& os) const {
+  DynamicEntry::print(os);
+  os << std::hex
+     << std::left
+     << std::setw(10) << this->name();
+  return os;
+
+}
+}
+}
+
+
+
diff --git a/src/ELF/EnumToString.cpp b/src/ELF/EnumToString.cpp
new file mode 100644
index 0000000..f5bb084
--- /dev/null
+++ b/src/ELF/EnumToString.cpp
@@ -0,0 +1,763 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/ELF/Structures.hpp"
+#include "LIEF/ELF/EnumToString.hpp"
+#include <map>
+
+namespace LIEF {
+namespace ELF {
+
+const char* to_string(SYMBOL_BINDINGS e) {
+  const std::map<SYMBOL_BINDINGS, const char*> enumStrings {
+    { SYMBOL_BINDINGS::STB_LOCAL,      "LOCAL" },
+    { SYMBOL_BINDINGS::STB_GLOBAL,     "GLOBAL" },
+    { SYMBOL_BINDINGS::STB_WEAK,       "WEAK" },
+    { SYMBOL_BINDINGS::STB_GNU_UNIQUE, "GNU_UNIQUE" },
+    { SYMBOL_BINDINGS::STB_LOOS,       "LOOS" },
+    { SYMBOL_BINDINGS::STB_HIOS,       "HIOS" },
+    { SYMBOL_BINDINGS::STB_LOPROC,     "LOPROC" },
+    { SYMBOL_BINDINGS::STB_HIPROC,     "HIPROC" }
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+
+const char* to_string(E_TYPE e) {
+  const std::map<E_TYPE, const char*> enumStrings {
+    { E_TYPE::ET_NONE,   "NONE" },
+    { E_TYPE::ET_REL,    "RELOCATABLE" },
+    { E_TYPE::ET_EXEC,   "EXECUTABLE" },
+    { E_TYPE::ET_DYN,    "DYNAMIC" },
+    { E_TYPE::ET_CORE,   "CORE" },
+    { E_TYPE::ET_LOPROC, "LOPROC" },
+    { E_TYPE::ET_HIPROC, "HIPROC" }
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+
+const char* to_string(VERSION e) {
+  const std::map<VERSION, const char*> enumStrings {
+    { VERSION::EV_NONE,    "NONE" },
+    { VERSION::EV_CURRENT, "CURRENT" }
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+
+const char* to_string(ARCH e) {
+  const std::map<ARCH, const char*> enumStrings {
+    { ARCH::EM_NONE,          "None" },
+    { ARCH::EM_M32,           "M32"},
+    { ARCH::EM_SPARC,         "SPARC"},
+    { ARCH::EM_386,           "i386"},
+    { ARCH::EM_68K,           "68K"},
+    { ARCH::EM_88K,           "88K"},
+    { ARCH::EM_IAMCU,         "IAMCU"},
+    { ARCH::EM_860,           "860"},
+    { ARCH::EM_MIPS,          "MIPS"},
+    { ARCH::EM_S370,          "S370"},
+    { ARCH::EM_MIPS_RS3_LE,   "MIPS_RS3_LE"},
+    { ARCH::EM_PARISC,        "PARISC"},
+    { ARCH::EM_VPP500,        "VPP500"},
+    { ARCH::EM_SPARC32PLUS,   "SPARC32PLUS"},
+    { ARCH::EM_960,           "960"},
+    { ARCH::EM_PPC,           "PPC"},
+    { ARCH::EM_PPC64,         "PPC64"},
+    { ARCH::EM_S390,          "S390"},
+    { ARCH::EM_SPU,           "SPU"},
+    { ARCH::EM_V800,          "V800"},
+    { ARCH::EM_FR20,          "FR20"},
+    { ARCH::EM_RH32,          "RH32"},
+    { ARCH::EM_RCE,           "RCE"},
+    { ARCH::EM_ARM,           "ARM"},
+    { ARCH::EM_ALPHA,         "ALPHA"},
+    { ARCH::EM_SH,            "SH"},
+    { ARCH::EM_SPARCV9,       "SPARCV9"},
+    { ARCH::EM_TRICORE,       "TRICORE"},
+    { ARCH::EM_ARC,           "ARC"},
+    { ARCH::EM_H8_300,        "H8_300"},
+    { ARCH::EM_H8_300H,       "H8_300H"},
+    { ARCH::EM_H8S,           "H8S"},
+    { ARCH::EM_H8_500,        "H8_500"},
+    { ARCH::EM_IA_64,         "IA_64"},
+    { ARCH::EM_MIPS_X,        "MIPS_X"},
+    { ARCH::EM_COLDFIRE,      "COLDFIRE"},
+    { ARCH::EM_68HC12,        "68HC12"},
+    { ARCH::EM_MMA,           "MMA"},
+    { ARCH::EM_PCP,           "PCP"},
+    { ARCH::EM_NCPU,          "NCPU"},
+    { ARCH::EM_NDR1,          "NDR1"},
+    { ARCH::EM_STARCORE,      "STARCORE"},
+    { ARCH::EM_ME16,          "ME16"},
+    { ARCH::EM_ST100,         "ST100"},
+    { ARCH::EM_TINYJ,         "TINYJ"},
+    { ARCH::EM_X86_64,        "x86_64"},
+    { ARCH::EM_PDSP,          "PDSP"},
+    { ARCH::EM_PDP10,         "PDP10"},
+    { ARCH::EM_PDP11,         "PDP11"},
+    { ARCH::EM_FX66,          "FX66"},
+    { ARCH::EM_ST9PLUS,       "ST9PLUS"},
+    { ARCH::EM_ST7,           "ST7"},
+    { ARCH::EM_68HC16,        "68HC16"},
+    { ARCH::EM_68HC11,        "68HC11"},
+    { ARCH::EM_68HC08,        "68HC08"},
+    { ARCH::EM_68HC05,        "68HC05"},
+    { ARCH::EM_SVX,           "SVX"},
+    { ARCH::EM_ST19,          "ST19"},
+    { ARCH::EM_VAX,           "VAX"},
+    { ARCH::EM_CRIS,          "CRIS"},
+    { ARCH::EM_JAVELIN,       "JAVELIN"},
+    { ARCH::EM_FIREPATH,      "FIREPATH"},
+    { ARCH::EM_ZSP,           "ZSP"},
+    { ARCH::EM_MMIX,          "MMIX"},
+    { ARCH::EM_HUANY,         "HUANY"},
+    { ARCH::EM_PRISM,         "PRISM"},
+    { ARCH::EM_AVR,           "AVR"},
+    { ARCH::EM_FR30,          "FR30"},
+    { ARCH::EM_D10V,          "D10V"},
+    { ARCH::EM_D30V,          "D30V"},
+    { ARCH::EM_V850,          "V850"},
+    { ARCH::EM_M32R,          "M32R"},
+    { ARCH::EM_MN10300,       "MN10300"},
+    { ARCH::EM_MN10200,       "MN10200"},
+    { ARCH::EM_PJ,            "PJ"},
+    { ARCH::EM_OPENRISC,      "OPENRISC"},
+    { ARCH::EM_ARC_COMPACT,   "ARC_COMPACT"},
+    { ARCH::EM_XTENSA,        "XTENSA"},
+    { ARCH::EM_VIDEOCORE,     "VIDEOCORE"},
+    { ARCH::EM_TMM_GPP,       "TMM_GPP"},
+    { ARCH::EM_NS32K,         "NS32K"},
+    { ARCH::EM_TPC,           "TPC"},
+    { ARCH::EM_SNP1K,         "SNP1K"},
+    { ARCH::EM_ST200,         "ST200"},
+    { ARCH::EM_IP2K,          "IP2K"},
+    { ARCH::EM_MAX,           "MAX"},
+    { ARCH::EM_CR,            "CR"},
+    { ARCH::EM_F2MC16,        "F2MC16"},
+    { ARCH::EM_MSP430,        "MSP430"},
+    { ARCH::EM_BLACKFIN,      "BLACKFIN"},
+    { ARCH::EM_SE_C33,        "SE_C33"},
+    { ARCH::EM_SEP,           "SEP"},
+    { ARCH::EM_ARCA,          "ARCA"},
+    { ARCH::EM_UNICORE,       "UNICORE"},
+    { ARCH::EM_EXCESS,        "EXCESS"},
+    { ARCH::EM_DXP,           "DXP"},
+    { ARCH::EM_ALTERA_NIOS2,  "ALTERA_NIOS2"},
+    { ARCH::EM_CRX,           "CRX"},
+    { ARCH::EM_XGATE,         "XGATE"},
+    { ARCH::EM_C166,          "C166"},
+    { ARCH::EM_M16C,          "M16C"},
+    { ARCH::EM_DSPIC30F,      "DSPIC30F"},
+    { ARCH::EM_CE,            "CE"},
+    { ARCH::EM_M32C,          "M32C"},
+    { ARCH::EM_TSK3000,       "TSK3000"},
+    { ARCH::EM_RS08,          "RS08"},
+    { ARCH::EM_SHARC,         "SHARC"},
+    { ARCH::EM_ECOG2,         "ECOG2"},
+    { ARCH::EM_SCORE7,        "SCORE7"},
+    { ARCH::EM_DSP24,         "DSP24"},
+    { ARCH::EM_VIDEOCORE3,    "VIDEOCORE3"},
+    { ARCH::EM_LATTICEMICO32, "LATTICEMICO32"},
+    { ARCH::EM_SE_C17,        "SE_C17"},
+    { ARCH::EM_TI_C6000,      "TI_C6000"},
+    { ARCH::EM_TI_C2000,      "TI_C2000"},
+    { ARCH::EM_TI_C5500,      "TI_C5500"},
+    { ARCH::EM_MMDSP_PLUS,    "MMDSP_PLUS"},
+    { ARCH::EM_CYPRESS_M8C,   "CYPRESS_M8C"},
+    { ARCH::EM_R32C,          "R32C"},
+    { ARCH::EM_TRIMEDIA,      "TRIMEDIA"},
+    { ARCH::EM_HEXAGON,       "HEXAGON"},
+    { ARCH::EM_8051,          "8051"},
+    { ARCH::EM_STXP7X,        "STXP7X"},
+    { ARCH::EM_NDS32,         "NDS32"},
+    { ARCH::EM_ECOG1,         "ECOG1"},
+    { ARCH::EM_ECOG1X,        "ECOG1X"},
+    { ARCH::EM_MAXQ30,        "MAXQ30"},
+    { ARCH::EM_XIMO16,        "XIMO16"},
+    { ARCH::EM_MANIK,         "MANIK"},
+    { ARCH::EM_CRAYNV2,       "CRAYNV2"},
+    { ARCH::EM_RX,            "RX"},
+    { ARCH::EM_METAG,         "METAG"},
+    { ARCH::EM_MCST_ELBRUS,   "MCST_ELBRUS"},
+    { ARCH::EM_ECOG16,        "ECOG16"},
+    { ARCH::EM_CR16,          "CR16"},
+    { ARCH::EM_ETPU,          "ETPU"},
+    { ARCH::EM_SLE9X,         "SLE9X"},
+    { ARCH::EM_L10M,          "L10M"},
+    { ARCH::EM_K10M,          "K10M"},
+    { ARCH::EM_AARCH64,       "AARCH64"},
+    { ARCH::EM_AVR32,         "AVR32"},
+    { ARCH::EM_STM8,          "STM8"},
+    { ARCH::EM_TILE64,        "TILE64"},
+    { ARCH::EM_TILEPRO,       "TILEPRO"},
+    { ARCH::EM_CUDA,          "CUDA"},
+    { ARCH::EM_TILEGX,        "TILEGX"},
+    { ARCH::EM_CLOUDSHIELD,   "CLOUDSHIELD"},
+    { ARCH::EM_COREA_1ST,     "COREA_1ST"},
+    { ARCH::EM_COREA_2ND,     "COREA_2ND"},
+    { ARCH::EM_ARC_COMPACT2,   "ARC_COMPACT2"},
+    { ARCH::EM_OPEN8,         "OPEN8"},
+    { ARCH::EM_RL78,          "RL78"},
+    { ARCH::EM_VIDEOCORE5,    "VIDEOCORE5"},
+    { ARCH::EM_78KOR,         "78KOR"},
+    { ARCH::EM_56800EX,       "56800EX"},
+    { ARCH::EM_BA1,           "BA1"},
+    { ARCH::EM_BA2,           "BA2"},
+    { ARCH::EM_XCORE,         "XCORE"},
+    { ARCH::EM_MCHP_PIC,      "MCHP_PIC"},
+    { ARCH::EM_INTEL205,      "INTEL205"},
+    { ARCH::EM_INTEL206,      "INTEL206"},
+    { ARCH::EM_INTEL207,      "INTEL207"},
+    { ARCH::EM_INTEL208,      "INTEL208"},
+    { ARCH::EM_INTEL209,      "INTEL209"},
+    { ARCH::EM_KM32,          "KM32"},
+    { ARCH::EM_KMX32,         "KMX32"},
+    { ARCH::EM_KMX16,         "KMX16"},
+    { ARCH::EM_KMX8,          "KMX8"},
+    { ARCH::EM_KVARC,         "KVARC"},
+    { ARCH::EM_CDP,           "CDP"},
+    { ARCH::EM_COGE,          "COGE"},
+    { ARCH::EM_COOL,          "COOL"},
+    { ARCH::EM_NORC,          "NORC"},
+    { ARCH::EM_CSR_KALIMBA,   "CSR_KALIMBA"},
+    { ARCH::EM_AMDGPU,        "AMDGPU"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(SEGMENT_TYPES e) {
+  const std::map<SEGMENT_TYPES, const char*> enumStrings {
+    { SEGMENT_TYPES::PT_LOAD,          "LOAD" },
+    { SEGMENT_TYPES::PT_DYNAMIC,       "DYNAMIC" },
+    { SEGMENT_TYPES::PT_INTERP,        "INTERP" },
+    { SEGMENT_TYPES::PT_NOTE,          "NOTE" },
+    { SEGMENT_TYPES::PT_SHLIB,         "SHLIB" },
+    { SEGMENT_TYPES::PT_PHDR,          "PHDR" },
+    { SEGMENT_TYPES::PT_TLS,           "TLS" },
+    { SEGMENT_TYPES::PT_LOOS,          "LOOS" },
+    { SEGMENT_TYPES::PT_HIOS,          "HIOS" },
+    { SEGMENT_TYPES::PT_LOPROC,        "LOPROC" },
+    { SEGMENT_TYPES::PT_HIPROC,        "HIPROC" },
+    { SEGMENT_TYPES::PT_GNU_EH_FRAME,  "GNU_EH_FRAME" },
+    { SEGMENT_TYPES::PT_SUNW_EH_FRAME, "SUNW_EH_FRAME" },
+    { SEGMENT_TYPES::PT_SUNW_UNWIND,   "SUNW_UNWIND" },
+    { SEGMENT_TYPES::PT_GNU_STACK,     "GNU_STACK" },
+    { SEGMENT_TYPES::PT_GNU_RELRO,     "GNU_RELRO" },
+    { SEGMENT_TYPES::PT_ARM_ARCHEXT,   "ARM_ARCHEXT" },
+    { SEGMENT_TYPES::PT_ARM_EXIDX,     "ARM_EXIDX" },
+    { SEGMENT_TYPES::PT_ARM_UNWIND,    "ARM_UNWIND" },
+    { SEGMENT_TYPES::PT_MIPS_REGINFO,  "MIPS_REGINFO" },
+    { SEGMENT_TYPES::PT_MIPS_RTPROC,   "MIPS_RTPROC" },
+    { SEGMENT_TYPES::PT_MIPS_OPTIONS,  "MIPS_OPTIONS" },
+    { SEGMENT_TYPES::PT_MIPS_ABIFLAGS, "MIPS_ABIFLAGS" }
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(DYNAMIC_TAGS e) {
+  const std::map<DYNAMIC_TAGS, const char*> enumStrings {
+    { DYNAMIC_TAGS::DT_NULL,                       "NULL"},
+    { DYNAMIC_TAGS::DT_NEEDED,                     "NEEDED"},
+    { DYNAMIC_TAGS::DT_PLTRELSZ,                   "PLTRELSZ"},
+    { DYNAMIC_TAGS::DT_PLTGOT,                     "PLTGOT"},
+    { DYNAMIC_TAGS::DT_HASH,                       "HASH"},
+    { DYNAMIC_TAGS::DT_STRTAB,                     "STRTAB"},
+    { DYNAMIC_TAGS::DT_SYMTAB,                     "SYMTAB"},
+    { DYNAMIC_TAGS::DT_RELA,                       "RELA"},
+    { DYNAMIC_TAGS::DT_RELASZ,                     "RELASZ"},
+    { DYNAMIC_TAGS::DT_RELAENT,                    "RELAENT"},
+    { DYNAMIC_TAGS::DT_STRSZ,                      "STRSZ"},
+    { DYNAMIC_TAGS::DT_SYMENT,                     "SYMENT"},
+    { DYNAMIC_TAGS::DT_INIT,                       "INIT"},
+    { DYNAMIC_TAGS::DT_FINI,                       "FINI"},
+    { DYNAMIC_TAGS::DT_SONAME,                     "SONAME"},
+    { DYNAMIC_TAGS::DT_RPATH,                      "RPATH"},
+    { DYNAMIC_TAGS::DT_SYMBOLIC,                   "SYMBOLIC"},
+    { DYNAMIC_TAGS::DT_REL,                        "REL"},
+    { DYNAMIC_TAGS::DT_RELSZ,                      "RELSZ"},
+    { DYNAMIC_TAGS::DT_RELENT,                     "RELENT"},
+    { DYNAMIC_TAGS::DT_PLTREL,                     "PLTREL"},
+    { DYNAMIC_TAGS::DT_DEBUG,                      "DEBUG"},
+    { DYNAMIC_TAGS::DT_TEXTREL,                    "TEXTREL"},
+    { DYNAMIC_TAGS::DT_JMPREL,                     "JMPREL"},
+    { DYNAMIC_TAGS::DT_BIND_NOW,                   "BIND_NOW"},
+    { DYNAMIC_TAGS::DT_INIT_ARRAY,                 "INIT_ARRAY"},
+    { DYNAMIC_TAGS::DT_FINI_ARRAY,                 "FINI_ARRAY"},
+    { DYNAMIC_TAGS::DT_INIT_ARRAYSZ,               "INIT_ARRAYSZ"},
+    { DYNAMIC_TAGS::DT_FINI_ARRAYSZ,               "FINI_ARRAYSZ"},
+    { DYNAMIC_TAGS::DT_RUNPATH,                    "RUNPATH"},
+    { DYNAMIC_TAGS::DT_FLAGS,                      "FLAGS"},
+    { DYNAMIC_TAGS::DT_ENCODING,                   "ENCODING"},
+    { DYNAMIC_TAGS::DT_PREINIT_ARRAY,              "PREINIT_ARRAY"},
+    { DYNAMIC_TAGS::DT_PREINIT_ARRAYSZ,            "PREINIT_ARRAYSZ"},
+    { DYNAMIC_TAGS::DT_LOOS,                       "LOOS"},
+    { DYNAMIC_TAGS::DT_HIOS,                       "HIOS"},
+    { DYNAMIC_TAGS::DT_LOPROC,                     "LOPROC"},
+    { DYNAMIC_TAGS::DT_HIPROC,                     "HIPROC"},
+    { DYNAMIC_TAGS::DT_GNU_HASH,                   "GNU_HASH"},
+    { DYNAMIC_TAGS::DT_RELACOUNT,                  "RELACOUNT"},
+    { DYNAMIC_TAGS::DT_RELCOUNT,                   "RELCOUNT"},
+    { DYNAMIC_TAGS::DT_FLAGS_1,                    "FLAGS_1"},
+    { DYNAMIC_TAGS::DT_VERSYM,                     "VERSYM"},
+    { DYNAMIC_TAGS::DT_VERDEF,                     "VERDEF"},
+    { DYNAMIC_TAGS::DT_VERDEFNUM,                  "VERDEFNUM"},
+    { DYNAMIC_TAGS::DT_VERNEED,                    "VERNEED"},
+    { DYNAMIC_TAGS::DT_VERNEEDNUM,                 "VERNEEDNUM"},
+    { DYNAMIC_TAGS::DT_MIPS_RLD_VERSION,           "MIPS_RLD_VERSION"},
+    { DYNAMIC_TAGS::DT_MIPS_TIME_STAMP,            "MIPS_TIME_STAMP"},
+    { DYNAMIC_TAGS::DT_MIPS_ICHECKSUM,             "MIPS_ICHECKSUM"},
+    { DYNAMIC_TAGS::DT_MIPS_IVERSION,              "MIPS_IVERSION"},
+    { DYNAMIC_TAGS::DT_MIPS_FLAGS,                 "MIPS_FLAGS"},
+    { DYNAMIC_TAGS::DT_MIPS_BASE_ADDRESS,          "MIPS_BASE_ADDRESS"},
+    { DYNAMIC_TAGS::DT_MIPS_MSYM,                  "MIPS_MSYM"},
+    { DYNAMIC_TAGS::DT_MIPS_CONFLICT,              "MIPS_CONFLICT"},
+    { DYNAMIC_TAGS::DT_MIPS_LIBLIST,               "MIPS_LIBLIST"},
+    { DYNAMIC_TAGS::DT_MIPS_LOCAL_GOTNO,           "MIPS_LOCAL_GOTNO"},
+    { DYNAMIC_TAGS::DT_MIPS_CONFLICTNO,            "MIPS_CONFLICTNO"},
+    { DYNAMIC_TAGS::DT_MIPS_LIBLISTNO,             "MIPS_LIBLISTNO"},
+    { DYNAMIC_TAGS::DT_MIPS_SYMTABNO,              "MIPS_SYMTABNO"},
+    { DYNAMIC_TAGS::DT_MIPS_UNREFEXTNO,            "MIPS_UNREFEXTNO"},
+    { DYNAMIC_TAGS::DT_MIPS_GOTSYM,                "MIPS_GOTSYM"},
+    { DYNAMIC_TAGS::DT_MIPS_HIPAGENO,              "MIPS_HIPAGENO"},
+    { DYNAMIC_TAGS::DT_MIPS_RLD_MAP,               "MIPS_RLD_MAP"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_CLASS,           "MIPS_DELTA_CLASS"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_CLASS_NO,        "MIPS_DELTA_CLASS_NO"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_INSTANCE,        "MIPS_DELTA_INSTANCE"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_INSTANCE_NO,     "MIPS_DELTA_INSTANCE_NO"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_RELOC,           "MIPS_DELTA_RELOC"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_RELOC_NO,        "MIPS_DELTA_RELOC_NO"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_SYM,             "MIPS_DELTA_SYM"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_SYM_NO,          "MIPS_DELTA_SYM_NO"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_CLASSSYM,        "MIPS_DELTA_CLASSSYM"},
+    { DYNAMIC_TAGS::DT_MIPS_DELTA_CLASSSYM_NO,     "MIPS_DELTA_CLASSSYM_NO"},
+    { DYNAMIC_TAGS::DT_MIPS_CXX_FLAGS,             "MIPS_CXX_FLAGS"},
+    { DYNAMIC_TAGS::DT_MIPS_PIXIE_INIT,            "MIPS_PIXIE_INIT"},
+    { DYNAMIC_TAGS::DT_MIPS_SYMBOL_LIB,            "MIPS_SYMBOL_LIB"},
+    { DYNAMIC_TAGS::DT_MIPS_LOCALPAGE_GOTIDX,      "MIPS_LOCALPAGE_GOTIDX"},
+    { DYNAMIC_TAGS::DT_MIPS_LOCAL_GOTIDX,          "MIPS_LOCAL_GOTIDX"},
+    { DYNAMIC_TAGS::DT_MIPS_HIDDEN_GOTIDX,         "MIPS_HIDDEN_GOTIDX"},
+    { DYNAMIC_TAGS::DT_MIPS_PROTECTED_GOTIDX,      "MIPS_PROTECTED_GOTIDX"},
+    { DYNAMIC_TAGS::DT_MIPS_OPTIONS,               "MIPS_OPTIONS"},
+    { DYNAMIC_TAGS::DT_MIPS_INTERFACE,             "MIPS_INTERFACE"},
+    { DYNAMIC_TAGS::DT_MIPS_DYNSTR_ALIGN,          "MIPS_DYNSTR_ALIGN"},
+    { DYNAMIC_TAGS::DT_MIPS_INTERFACE_SIZE,        "MIPS_INTERFACE_SIZE"},
+    { DYNAMIC_TAGS::DT_MIPS_RLD_TEXT_RESOLVE_ADDR, "MIPS_RLD_TEXT_RESOLVE_ADDR"},
+    { DYNAMIC_TAGS::DT_MIPS_PERF_SUFFIX,           "MIPS_PERF_SUFFIX"},
+    { DYNAMIC_TAGS::DT_MIPS_COMPACT_SIZE,          "MIPS_COMPACT_SIZE"},
+    { DYNAMIC_TAGS::DT_MIPS_GP_VALUE,              "MIPS_GP_VALUE"},
+    { DYNAMIC_TAGS::DT_MIPS_AUX_DYNAMIC,           "MIPS_AUX_DYNAMIC"},
+    { DYNAMIC_TAGS::DT_MIPS_PLTGOT,                "MIPS_PLTGOT"},
+    { DYNAMIC_TAGS::DT_MIPS_RWPLT,                 "MIPS_RWPLT"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+
+const char* to_string(SECTION_TYPES e) {
+  const std::map<SECTION_TYPES, const char*> enumStrings {
+    { SECTION_TYPES::SHT_NULL,               "NULL"},
+    { SECTION_TYPES::SHT_PROGBITS,           "PROGBITS"},
+    { SECTION_TYPES::SHT_SYMTAB,             "SYMTAB"},
+    { SECTION_TYPES::SHT_STRTAB,             "STRTAB"},
+    { SECTION_TYPES::SHT_RELA,               "RELA"},
+    { SECTION_TYPES::SHT_HASH,               "HASH"},
+    { SECTION_TYPES::SHT_DYNAMIC,            "DYNAMIC"},
+    { SECTION_TYPES::SHT_NOTE,               "NOTE"},
+    { SECTION_TYPES::SHT_NOBITS,             "NOBITS"},
+    { SECTION_TYPES::SHT_REL,                "REL"},
+    { SECTION_TYPES::SHT_SHLIB,              "SHLIB"},
+    { SECTION_TYPES::SHT_DYNSYM,             "DYNSYM"},
+    { SECTION_TYPES::SHT_INIT_ARRAY,         "INIT_ARRAY"},
+    { SECTION_TYPES::SHT_FINI_ARRAY,         "FINI_ARRAY"},
+    { SECTION_TYPES::SHT_PREINIT_ARRAY,      "PREINIT_ARRAY"},
+    { SECTION_TYPES::SHT_GROUP,              "GROUP"},
+    { SECTION_TYPES::SHT_SYMTAB_SHNDX,       "SYMTAB_SHNDX"},
+    { SECTION_TYPES::SHT_LOOS,               "LOOS"},
+    { SECTION_TYPES::SHT_GNU_ATTRIBUTES,     "GNU_ATTRIBUTES"},
+    { SECTION_TYPES::SHT_GNU_HASH,           "GNU_HASH"},
+    { SECTION_TYPES::SHT_GNU_verdef,         "GNU_VERDEF"},
+    { SECTION_TYPES::SHT_GNU_verneed,        "GNU_VERNEED"},
+    { SECTION_TYPES::SHT_GNU_versym,         "GNU_VERSYM"},
+    { SECTION_TYPES::SHT_HIOS,               "HIOS"},
+    { SECTION_TYPES::SHT_LOPROC,             "LOPROC"},
+    { SECTION_TYPES::SHT_ARM_EXIDX,          "ARM_EXIDX"},
+    { SECTION_TYPES::SHT_ARM_PREEMPTMAP,     "ARM_PREEMPTMAP"},
+    { SECTION_TYPES::SHT_ARM_ATTRIBUTES,     "ARM_ATTRIBUTES"},
+    { SECTION_TYPES::SHT_ARM_DEBUGOVERLAY,   "ARM_DEBUGOVERLAY"},
+    { SECTION_TYPES::SHT_ARM_OVERLAYSECTION, "ARM_OVERLAYSECTION"},
+    { SECTION_TYPES::SHT_HEX_ORDERED,        "HEX_ORDERED"},
+    { SECTION_TYPES::SHT_X86_64_UNWIND,      "X86_64_UNWIND"},
+    { SECTION_TYPES::SHT_MIPS_REGINFO,       "MIPS_REGINFO"},
+    { SECTION_TYPES::SHT_MIPS_OPTIONS,       "MIPS_OPTIONS"},
+    { SECTION_TYPES::SHT_MIPS_ABIFLAGS,      "MIPS_ABIFLAGS"},
+    { SECTION_TYPES::SHT_HIPROC,             "HIPROC"},
+    { SECTION_TYPES::SHT_LOUSER,             "LOUSER"},
+    { SECTION_TYPES::SHT_HIUSER,             "HIUSER"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(SECTION_FLAGS e) {
+  const std::map<SECTION_FLAGS, const char*> enumStrings {
+    { SECTION_FLAGS::SHF_NONE,             "NONE"},
+    { SECTION_FLAGS::SHF_WRITE,            "WRITE"},
+    { SECTION_FLAGS::SHF_ALLOC,            "ALLOC"},
+    { SECTION_FLAGS::SHF_EXECINSTR,        "EXECINSTR"},
+    { SECTION_FLAGS::SHF_MERGE,            "MERGE"},
+    { SECTION_FLAGS::SHF_STRINGS,          "STRINGS"},
+    { SECTION_FLAGS::SHF_INFO_LINK,        "INFO_LINK"},
+    { SECTION_FLAGS::SHF_LINK_ORDER,       "LINK_ORDER"},
+    { SECTION_FLAGS::SHF_OS_NONCONFORMING, "OS_NONCONFORMING"},
+    { SECTION_FLAGS::SHF_GROUP,            "GROUP"},
+    { SECTION_FLAGS::SHF_TLS,              "TLS"},
+    { SECTION_FLAGS::SHF_EXCLUDE,          "EXCLUDE"},
+    { SECTION_FLAGS::XCORE_SHF_CP_SECTION, "XCORE_SHF_CP_SECTION"},
+    { SECTION_FLAGS::XCORE_SHF_DP_SECTION, "XCORE_SHF_CP_SECTION"},
+    { SECTION_FLAGS::SHF_MASKOS,           "MASKOS"},
+    { SECTION_FLAGS::SHF_MASKPROC,         "MASKPROC"},
+    { SECTION_FLAGS::SHF_HEX_GPREL,        "HEX_GPREL"},
+    { SECTION_FLAGS::SHF_MIPS_NODUPES,     "MIPS_NODUPES"},
+    { SECTION_FLAGS::SHF_MIPS_NAMES,       "MIPS_NAMES"},
+    { SECTION_FLAGS::SHF_MIPS_LOCAL,       "MIPS_LOCAL"},
+    { SECTION_FLAGS::SHF_MIPS_NOSTRIP,     "MIPS_NOSTRIP"},
+    { SECTION_FLAGS::SHF_MIPS_GPREL,       "MIPS_GPREL"},
+    { SECTION_FLAGS::SHF_MIPS_MERGE,       "MIPS_MERGE"},
+    { SECTION_FLAGS::SHF_MIPS_ADDR,        "MIPS_ADDR"},
+    { SECTION_FLAGS::SHF_MIPS_STRING,      "MIPS_STRING"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+
+const char* to_string(SYMBOL_TYPES e) {
+  const std::map<SYMBOL_TYPES, const char*> enumStrings {
+    { SYMBOL_TYPES::STT_NOTYPE,    "NOTYPE"},
+    { SYMBOL_TYPES::STT_OBJECT,    "OBJECT"},
+    { SYMBOL_TYPES::STT_FUNC,      "FUNC"},
+    { SYMBOL_TYPES::STT_SECTION,   "SECTION"},
+    { SYMBOL_TYPES::STT_FILE,      "FILE"},
+    { SYMBOL_TYPES::STT_COMMON,    "COMMON"},
+    { SYMBOL_TYPES::STT_TLS,       "TLS"},
+    { SYMBOL_TYPES::STT_GNU_IFUNC, "GNU_IFUNC"},
+    { SYMBOL_TYPES::STT_LOOS,      "LOOS"},
+    { SYMBOL_TYPES::STT_HIOS,      "HIOS"},
+    { SYMBOL_TYPES::STT_LOPROC,    "LOPROC"},
+    { SYMBOL_TYPES::STT_HIPROC,    "HIPROC"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+
+const char* to_string(RELOC_x86_64 e) {
+  const std::map<RELOC_x86_64, const char*> enumStrings {
+    { RELOC_x86_64::R_X86_64_NONE,            "NONE"},
+    { RELOC_x86_64::R_X86_64_64,              "64"},
+    { RELOC_x86_64::R_X86_64_PC32,            "PC32"},
+    { RELOC_x86_64::R_X86_64_GOT32,           "GOT32"},
+    { RELOC_x86_64::R_X86_64_PLT32,           "PLT32"},
+    { RELOC_x86_64::R_X86_64_COPY,            "COPY"},
+    { RELOC_x86_64::R_X86_64_GLOB_DAT,        "GLOB_DAT"},
+    { RELOC_x86_64::R_X86_64_JUMP_SLOT,       "JUMP_SLOT"},
+    { RELOC_x86_64::R_X86_64_RELATIVE,        "RELATIVE"},
+    { RELOC_x86_64::R_X86_64_GOTPCREL,        "GOTPCREL"},
+    { RELOC_x86_64::R_X86_64_32,              "32"},
+    { RELOC_x86_64::R_X86_64_32S,             "32S"},
+    { RELOC_x86_64::R_X86_64_16,              "16"},
+    { RELOC_x86_64::R_X86_64_PC16,            "PC16"},
+    { RELOC_x86_64::R_X86_64_8,               "8"},
+    { RELOC_x86_64::R_X86_64_PC8,             "PC8"},
+    { RELOC_x86_64::R_X86_64_DTPMOD64,        "DTPMOD64"},
+    { RELOC_x86_64::R_X86_64_DTPOFF64,        "DTPOFF64"},
+    { RELOC_x86_64::R_X86_64_TPOFF64,         "TPOFF64"},
+    { RELOC_x86_64::R_X86_64_TLSGD,           "TLSGD"},
+    { RELOC_x86_64::R_X86_64_TLSLD,           "TLSLD"},
+    { RELOC_x86_64::R_X86_64_DTPOFF32,        "DTPOFF32"},
+    { RELOC_x86_64::R_X86_64_GOTTPOFF,        "GOTTPOFF"},
+    { RELOC_x86_64::R_X86_64_TPOFF32,         "TPOFF32"},
+    { RELOC_x86_64::R_X86_64_PC64,            "PC64"},
+    { RELOC_x86_64::R_X86_64_GOTOFF64,        "GOTOFF64"},
+    { RELOC_x86_64::R_X86_64_GOTPC32,         "GOTPC32"},
+    { RELOC_x86_64::R_X86_64_GOT64,           "GOT64"},
+    { RELOC_x86_64::R_X86_64_GOTPCREL64,      "GOTPCREL64"},
+    { RELOC_x86_64::R_X86_64_GOTPC64,         "GOTPC64"},
+    { RELOC_x86_64::R_X86_64_GOTPLT64,        "GOTPLT64"},
+    { RELOC_x86_64::R_X86_64_PLTOFF64,        "PLTOFF64"},
+    { RELOC_x86_64::R_X86_64_SIZE32,          "SIZE32"},
+    { RELOC_x86_64::R_X86_64_SIZE64,          "SIZE64"},
+    { RELOC_x86_64::R_X86_64_GOTPC32_TLSDESC, "GOTPC32_TLSDESC"},
+    { RELOC_x86_64::R_X86_64_TLSDESC_CALL,    "TLSDESC_CALL"},
+    { RELOC_x86_64::R_X86_64_TLSDESC,         "TLSDESC"},
+    { RELOC_x86_64::R_X86_64_IRELATIVE,       "IRELATIVE"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(RELOC_ARM e) {
+  const std::map<RELOC_ARM, const char*> enumStrings {
+    { RELOC_ARM::R_ARM_NONE, "NONE"},
+    { RELOC_ARM::R_ARM_PC24, "PC24"},
+    { RELOC_ARM::R_ARM_ABS32, "ABS32"},
+    { RELOC_ARM::R_ARM_REL32, "REL32"},
+    { RELOC_ARM::R_ARM_LDR_PC_G0, "LDR_PC_G0"},
+    { RELOC_ARM::R_ARM_ABS16, "ABS16"},
+    { RELOC_ARM::R_ARM_ABS12, "ABS12"},
+    { RELOC_ARM::R_ARM_THM_ABS5, "THM_ABS5"},
+    { RELOC_ARM::R_ARM_ABS8, "ABS8"},
+    { RELOC_ARM::R_ARM_SBREL32, "SBREL32"},
+    { RELOC_ARM::R_ARM_THM_CALL, "THM_CALL"},
+    { RELOC_ARM::R_ARM_THM_PC8, "THM_PC8"},
+    { RELOC_ARM::R_ARM_BREL_ADJ, "BREL_ADJ"},
+    { RELOC_ARM::R_ARM_TLS_DESC, "TLS_DESC"},
+    { RELOC_ARM::R_ARM_THM_SWI8, "THM_SWI8"},
+    { RELOC_ARM::R_ARM_XPC25, "XPC25"},
+    { RELOC_ARM::R_ARM_THM_XPC22, "THM_XPC22"},
+    { RELOC_ARM::R_ARM_TLS_DTPMOD32, "TLS_DTPMOD32"},
+    { RELOC_ARM::R_ARM_TLS_DTPOFF32, "TLS_DTPOFF32"},
+    { RELOC_ARM::R_ARM_TLS_TPOFF32, "TLS_TPOFF32"},
+    { RELOC_ARM::R_ARM_COPY, "COPY"},
+    { RELOC_ARM::R_ARM_GLOB_DAT, "GLOB_DAT"},
+    { RELOC_ARM::R_ARM_JUMP_SLOT, "JUMP_SLOT"},
+    { RELOC_ARM::R_ARM_RELATIVE, "RELATIVE"},
+    { RELOC_ARM::R_ARM_GOTOFF32, "GOTOFF32"},
+    { RELOC_ARM::R_ARM_BASE_PREL, "BASE_PREL"},
+    { RELOC_ARM::R_ARM_GOT_BREL, "GOT_BREL"},
+    { RELOC_ARM::R_ARM_PLT32, "PLT32"},
+    { RELOC_ARM::R_ARM_CALL, "CALL"},
+    { RELOC_ARM::R_ARM_JUMP24, "JUMP24"},
+    { RELOC_ARM::R_ARM_THM_JUMP24, "THM_JUMP24"},
+    { RELOC_ARM::R_ARM_BASE_ABS, "BASE_ABS"},
+    { RELOC_ARM::R_ARM_ALU_PCREL_7_0, "ALU_PCREL_7_0"},
+    { RELOC_ARM::R_ARM_ALU_PCREL_15_8, "ALU_PCREL_15_8"},
+    { RELOC_ARM::R_ARM_ALU_PCREL_23_15, "ALU_PCREL_23_15"},
+    { RELOC_ARM::R_ARM_LDR_SBREL_11_0_NC, "LDR_SBREL_11_0_NC"},
+    { RELOC_ARM::R_ARM_ALU_SBREL_19_12_NC, "ALU_SBREL_19_12_NC"},
+    { RELOC_ARM::R_ARM_ALU_SBREL_27_20_CK, "ALU_SBREL_27_20_CK"},
+    { RELOC_ARM::R_ARM_TARGET1, "TARGET1"},
+    { RELOC_ARM::R_ARM_SBREL31, "SBREL31"},
+    { RELOC_ARM::R_ARM_V4BX, "V4BX"},
+    { RELOC_ARM::R_ARM_TARGET2, "TARGET2"},
+    { RELOC_ARM::R_ARM_PREL31, "PREL31"},
+    { RELOC_ARM::R_ARM_MOVW_ABS_NC, "MOVW_ABS_NC"},
+    { RELOC_ARM::R_ARM_MOVT_ABS, "MOVT_ABS"},
+    { RELOC_ARM::R_ARM_MOVW_PREL_NC, "MOVW_PREL_NC"},
+    { RELOC_ARM::R_ARM_MOVT_PREL, "MOVT_PREL"},
+    { RELOC_ARM::R_ARM_THM_MOVW_ABS_NC, "THM_MOVW_ABS_NC"},
+    { RELOC_ARM::R_ARM_THM_MOVT_ABS, "THM_MOVT_ABS"},
+    { RELOC_ARM::R_ARM_THM_MOVW_PREL_NC, "THM_MOVW_PREL_NC"},
+    { RELOC_ARM::R_ARM_THM_MOVT_PREL, "THM_MOVT_PREL"},
+    { RELOC_ARM::R_ARM_THM_JUMP19, "THM_JUMP19"},
+    { RELOC_ARM::R_ARM_THM_JUMP6, "THM_JUMP6"},
+    { RELOC_ARM::R_ARM_THM_ALU_PREL_11_0, "THM_ALU_PREL_11_0"},
+    { RELOC_ARM::R_ARM_THM_PC12, "THM_PC12"},
+    { RELOC_ARM::R_ARM_ABS32_NOI, "ABS32_NOI"},
+    { RELOC_ARM::R_ARM_REL32_NOI, "REL32_NOI"},
+    { RELOC_ARM::R_ARM_ALU_PC_G0_NC, "ALU_PC_G0_NC"},
+    { RELOC_ARM::R_ARM_ALU_PC_G0, "ALU_PC_G0"},
+    { RELOC_ARM::R_ARM_ALU_PC_G1_NC, "ALU_PC_G1_NC"},
+    { RELOC_ARM::R_ARM_ALU_PC_G1, "ALU_PC_G1"},
+    { RELOC_ARM::R_ARM_ALU_PC_G2, "ALU_PC_G2"},
+    { RELOC_ARM::R_ARM_LDR_PC_G1, "LDR_PC_G1"},
+    { RELOC_ARM::R_ARM_LDR_PC_G2, "LDR_PC_G2"},
+    { RELOC_ARM::R_ARM_LDRS_PC_G0, "LDRS_PC_G0"},
+    { RELOC_ARM::R_ARM_LDRS_PC_G1, "LDRS_PC_G1"},
+    { RELOC_ARM::R_ARM_LDRS_PC_G2, "LDRS_PC_G2"},
+    { RELOC_ARM::R_ARM_LDC_PC_G0, "LDC_PC_G0"},
+    { RELOC_ARM::R_ARM_LDC_PC_G1, "LDC_PC_G1"},
+    { RELOC_ARM::R_ARM_LDC_PC_G2, "LDC_PC_G2"},
+    { RELOC_ARM::R_ARM_ALU_SB_G0_NC, "ALU_SB_G0_NC"},
+    { RELOC_ARM::R_ARM_ALU_SB_G0, "ALU_SB_G0"},
+    { RELOC_ARM::R_ARM_ALU_SB_G1_NC, "ALU_SB_G1_NC"},
+    { RELOC_ARM::R_ARM_ALU_SB_G1, "ALU_SB_G1"},
+    { RELOC_ARM::R_ARM_ALU_SB_G2, "ALU_SB_G2"},
+    { RELOC_ARM::R_ARM_LDR_SB_G0, "LDR_SB_G0"},
+    { RELOC_ARM::R_ARM_LDR_SB_G1, "LDR_SB_G1"},
+    { RELOC_ARM::R_ARM_LDR_SB_G2, "LDR_SB_G2"},
+    { RELOC_ARM::R_ARM_LDRS_SB_G0, "LDRS_SB_G0"},
+    { RELOC_ARM::R_ARM_LDRS_SB_G1, "LDRS_SB_G1"},
+    { RELOC_ARM::R_ARM_LDRS_SB_G2, "LDRS_SB_G2"},
+    { RELOC_ARM::R_ARM_LDC_SB_G0, "LDC_SB_G0"},
+    { RELOC_ARM::R_ARM_LDC_SB_G1, "LDC_SB_G1"},
+    { RELOC_ARM::R_ARM_LDC_SB_G2, "LDC_SB_G2"},
+    { RELOC_ARM::R_ARM_MOVW_BREL_NC, "MOVW_BREL_NC"},
+    { RELOC_ARM::R_ARM_MOVT_BREL, "MOVT_BREL"},
+    { RELOC_ARM::R_ARM_MOVW_BREL, "MOVW_BREL"},
+    { RELOC_ARM::R_ARM_THM_MOVW_BREL_NC, "THM_MOVW_BREL_NC"},
+    { RELOC_ARM::R_ARM_THM_MOVT_BREL, "THM_MOVT_BREL"},
+    { RELOC_ARM::R_ARM_THM_MOVW_BREL, "THM_MOVW_BREL"},
+    { RELOC_ARM::R_ARM_TLS_GOTDESC, "TLS_GOTDESC"},
+    { RELOC_ARM::R_ARM_TLS_CALL, "TLS_CALL"},
+    { RELOC_ARM::R_ARM_TLS_DESCSEQ, "TLS_DESCSEQ"},
+    { RELOC_ARM::R_ARM_THM_TLS_CALL, "THM_TLS_CALL"},
+    { RELOC_ARM::R_ARM_PLT32_ABS, "PLT32_ABS"},
+    { RELOC_ARM::R_ARM_GOT_ABS, "GOT_ABS"},
+    { RELOC_ARM::R_ARM_GOT_PREL, "GOT_PREL"},
+    { RELOC_ARM::R_ARM_GOT_BREL12, "GOT_BREL12"},
+    { RELOC_ARM::R_ARM_GOTOFF12, "GOTOFF12"},
+    { RELOC_ARM::R_ARM_GOTRELAX, "GOTRELAX"},
+    { RELOC_ARM::R_ARM_GNU_VTENTRY, "GNU_VTENTRY"},
+    { RELOC_ARM::R_ARM_GNU_VTINHERIT, "GNU_VTINHERIT"},
+    { RELOC_ARM::R_ARM_THM_JUMP11, "THM_JUMP11"},
+    { RELOC_ARM::R_ARM_THM_JUMP8, "THM_JUMP8"},
+    { RELOC_ARM::R_ARM_TLS_GD32, "TLS_GD32"},
+    { RELOC_ARM::R_ARM_TLS_LDM32, "TLS_LDM32"},
+    { RELOC_ARM::R_ARM_TLS_LDO32, "TLS_LDO32"},
+    { RELOC_ARM::R_ARM_TLS_IE32, "TLS_IE32"},
+    { RELOC_ARM::R_ARM_TLS_LE32, "TLS_LE32"},
+    { RELOC_ARM::R_ARM_TLS_LDO12, "TLS_LDO12"},
+    { RELOC_ARM::R_ARM_TLS_LE12, "TLS_LE12"},
+    { RELOC_ARM::R_ARM_TLS_IE12GP, "TLS_IE12GP"},
+    { RELOC_ARM::R_ARM_PRIVATE_0, "PRIVATE_0"},
+    { RELOC_ARM::R_ARM_PRIVATE_1, "PRIVATE_1"},
+    { RELOC_ARM::R_ARM_PRIVATE_2, "PRIVATE_2"},
+    { RELOC_ARM::R_ARM_PRIVATE_3, "PRIVATE_3"},
+    { RELOC_ARM::R_ARM_PRIVATE_4, "PRIVATE_4"},
+    { RELOC_ARM::R_ARM_PRIVATE_5, "PRIVATE_5"},
+    { RELOC_ARM::R_ARM_PRIVATE_6, "PRIVATE_6"},
+    { RELOC_ARM::R_ARM_PRIVATE_7, "PRIVATE_7"},
+    { RELOC_ARM::R_ARM_PRIVATE_8, "PRIVATE_8"},
+    { RELOC_ARM::R_ARM_PRIVATE_9, "PRIVATE_9"},
+    { RELOC_ARM::R_ARM_PRIVATE_10, "PRIVATE_10"},
+    { RELOC_ARM::R_ARM_PRIVATE_11, "PRIVATE_11"},
+    { RELOC_ARM::R_ARM_PRIVATE_12, "PRIVATE_12"},
+    { RELOC_ARM::R_ARM_PRIVATE_13, "PRIVATE_13"},
+    { RELOC_ARM::R_ARM_PRIVATE_14, "PRIVATE_14"},
+    { RELOC_ARM::R_ARM_PRIVATE_15, "PRIVATE_15"},
+    { RELOC_ARM::R_ARM_ME_TOO, "ME_TOO"},
+    { RELOC_ARM::R_ARM_THM_TLS_DESCSEQ16, "THM_TLS_DESCSEQ16"},
+    { RELOC_ARM::R_ARM_THM_TLS_DESCSEQ32, "THM_TLS_DESCSEQ32"},
+    { RELOC_ARM::R_ARM_IRELATIVE, "IRELATIVE"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+
+const char* to_string(RELOC_i386 e) {
+  const std::map<RELOC_i386, const char*> enumStrings {
+    { RELOC_i386::R_386_NONE, "NONE"},
+    { RELOC_i386::R_386_32, "32"},
+    { RELOC_i386::R_386_PC32, "PC32"},
+    { RELOC_i386::R_386_GOT32, "GOT32"},
+    { RELOC_i386::R_386_PLT32, "PLT32"},
+    { RELOC_i386::R_386_COPY, "COPY"},
+    { RELOC_i386::R_386_GLOB_DAT, "GLOB_DAT"},
+    { RELOC_i386::R_386_JUMP_SLOT, "JUMP_SLOT"},
+    { RELOC_i386::R_386_RELATIVE, "RELATIVE"},
+    { RELOC_i386::R_386_GOTOFF, "GOTOFF"},
+    { RELOC_i386::R_386_GOTPC, "GOTPC"},
+    { RELOC_i386::R_386_32PLT, "32PLT"},
+    { RELOC_i386::R_386_TLS_TPOFF, "TLS_TPOFF"},
+    { RELOC_i386::R_386_TLS_IE, "TLS_IE"},
+    { RELOC_i386::R_386_TLS_GOTIE, "TLS_GOTIE"},
+    { RELOC_i386::R_386_TLS_LE, "TLS_LE"},
+    { RELOC_i386::R_386_TLS_GD, "TLS_GD"},
+    { RELOC_i386::R_386_TLS_LDM, "TLS_LDM"},
+    { RELOC_i386::R_386_16, "16"},
+    { RELOC_i386::R_386_PC16, "PC16"},
+    { RELOC_i386::R_386_8, "8"},
+    { RELOC_i386::R_386_PC8, "PC8"},
+    { RELOC_i386::R_386_TLS_GD_32, "TLS_GD_32"},
+    { RELOC_i386::R_386_TLS_GD_PUSH, "TLS_GD_PUSH"},
+    { RELOC_i386::R_386_TLS_GD_CALL, "TLS_GD_CALL"},
+    { RELOC_i386::R_386_TLS_GD_POP, "TLS_GD_POP"},
+    { RELOC_i386::R_386_TLS_LDM_32, "TLS_LDM_32"},
+    { RELOC_i386::R_386_TLS_LDM_PUSH, "TLS_LDM_PUSH"},
+    { RELOC_i386::R_386_TLS_LDM_CALL, "TLS_LDM_CALL"},
+    { RELOC_i386::R_386_TLS_LDM_POP, "TLS_LDM_POP"},
+    { RELOC_i386::R_386_TLS_LDO_32, "TLS_LDO_32"},
+    { RELOC_i386::R_386_TLS_IE_32, "TLS_IE_32"},
+    { RELOC_i386::R_386_TLS_LE_32, "TLS_LE_32"},
+    { RELOC_i386::R_386_TLS_DTPMOD32, "TLS_DTPMOD32"},
+    { RELOC_i386::R_386_TLS_DTPOFF32, "TLS_DTPOFF32"},
+    { RELOC_i386::R_386_TLS_TPOFF32, "TLS_TPOFF32"},
+    { RELOC_i386::R_386_TLS_GOTDESC, "TLS_GOTDESC"},
+    { RELOC_i386::R_386_TLS_DESC_CALL, "TLS_DESC_CALL"},
+    { RELOC_i386::R_386_TLS_DESC, "TLS_DESC"},
+    { RELOC_i386::R_386_IRELATIVE, "IRELATIVE"},
+    { RELOC_i386::R_386_NUM, "NUM"},
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(ELF_CLASS e) {
+  const std::map<ELF_CLASS, const char*> enumStrings {
+    { ELF_CLASS::ELFCLASSNONE, "NONE"},
+    { ELF_CLASS::ELFCLASS32,   "CLASS32"},
+    { ELF_CLASS::ELFCLASS64,   "CLASS64"},
+  };
+
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(ELF_DATA e) {
+  const std::map<ELF_DATA, const char*> enumStrings {
+    { ELF_DATA::ELFDATANONE, "NONE"},
+    { ELF_DATA::ELFDATA2LSB, "LSB"},
+    { ELF_DATA::ELFDATA2MSB, "MSB"},
+  };
+
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+
+const char* to_string(OS_ABI e) {
+  const std::map<OS_ABI, const char*> enumStrings {
+    { OS_ABI::ELFOSABI_SYSTEMV,      "SYSTEMV"},
+    { OS_ABI::ELFOSABI_HPUX,         "HPUX"},
+    { OS_ABI::ELFOSABI_NETBSD,       "NETBSD"},
+    { OS_ABI::ELFOSABI_GNU,          "GNU"},
+    { OS_ABI::ELFOSABI_LINUX,        "LINUX"},
+    { OS_ABI::ELFOSABI_HURD,         "HURD"},
+    { OS_ABI::ELFOSABI_SOLARIS,      "SOLARIS"},
+    { OS_ABI::ELFOSABI_AIX,          "AIX"},
+    { OS_ABI::ELFOSABI_IRIX,         "IRIX"},
+    { OS_ABI::ELFOSABI_FREEBSD,      "FREEBSD"},
+    { OS_ABI::ELFOSABI_TRU64,        "TRU64"},
+    { OS_ABI::ELFOSABI_MODESTO,      "MODESTO"},
+    { OS_ABI::ELFOSABI_OPENBSD,      "OPENBSD"},
+    { OS_ABI::ELFOSABI_OPENVMS,      "OPENVMS"},
+    { OS_ABI::ELFOSABI_NSK,          "NSK"},
+    { OS_ABI::ELFOSABI_AROS,         "AROS"},
+    { OS_ABI::ELFOSABI_FENIXOS,      "FENIXOS"},
+    { OS_ABI::ELFOSABI_CLOUDABI,     "CLOUDABI"},
+    { OS_ABI::ELFOSABI_C6000_ELFABI, "C6000_ELFABI"},
+    { OS_ABI::ELFOSABI_AMDGPU_HSA,   "AMDGPU_HSA"},
+    { OS_ABI::ELFOSABI_C6000_LINUX,  "C6000_LINUX"},
+    { OS_ABI::ELFOSABI_ARM,          "ARM"},
+    { OS_ABI::ELFOSABI_STANDALONE,   "STANDALONE"},
+  };
+
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "UNDEFINED" : it->second;
+}
+} // namespace ELF
+} // namespace LIEF
+
+
+
diff --git a/src/ELF/GnuHash.cpp b/src/ELF/GnuHash.cpp
new file mode 100644
index 0000000..a2ede92
--- /dev/null
+++ b/src/ELF/GnuHash.cpp
@@ -0,0 +1,130 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+#include <numeric>
+#include <sstream>
+
+#include "LIEF/ELF/GnuHash.hpp"
+
+namespace LIEF {
+namespace ELF {
+GnuHash& GnuHash::operator=(const GnuHash&) = default;
+GnuHash::GnuHash(const GnuHash&)           = default;
+GnuHash::~GnuHash(void)                    = default;
+
+GnuHash::GnuHash(void) :
+  symbol_index_{0},
+  shift2_{0},
+  bloom_filters_{0},
+  buckets_{0},
+  hash_values_{0}
+{}
+
+
+uint32_t GnuHash::nb_buckets(void) const {
+  return static_cast<uint32_t>(this->buckets_.size());
+}
+
+uint32_t GnuHash::symbol_index(void) const {
+  return this->symbol_index_;
+}
+
+
+uint32_t GnuHash::maskwords(void) const {
+  return this->bloom_filters_.size();
+}
+
+uint32_t GnuHash::shift2(void) const {
+  return this->shift2_;
+}
+
+const std::vector<uint64_t>& GnuHash::bloom_filters(void) const {
+  return this->bloom_filters_;
+}
+
+const std::vector<uint32_t>& GnuHash::buckets(void) const {
+  return this->buckets_;
+}
+
+const std::vector<uint32_t>& GnuHash::hash_values(void) const {
+  return this->hash_values_;
+}
+
+void GnuHash::accept(Visitor&) const {
+
+}
+
+
+std::ostream& operator<<(std::ostream& os, const GnuHash& gnuhash) {
+  os << std::hex << std::left;
+
+  const std::vector<uint64_t>& bloom_filters = gnuhash.bloom_filters();
+  const std::vector<uint32_t>& buckets       = gnuhash.buckets();
+  const std::vector<uint32_t>& hash_values   = gnuhash.hash_values();
+
+  std::string bloom_filters_str = std::accumulate(
+      std::begin(bloom_filters),
+      std::end(bloom_filters), std::string{},
+      [] (const std::string& a, uint64_t bf) {
+        std::ostringstream hex_bf;
+        hex_bf << std::hex;
+        hex_bf << "0x" << bf;
+
+        return a.empty() ? "[" + hex_bf.str() : a + ", " + hex_bf.str();
+      });
+  bloom_filters_str += "]";
+
+  std::string buckets_str = std::accumulate(
+      std::begin(buckets),
+      std::end(buckets), std::string{},
+      [] (const std::string& a, uint32_t b) {
+        std::ostringstream hex_bucket;
+        hex_bucket << std::dec;
+        hex_bucket  << b;
+
+        return a.empty() ? "[" + hex_bucket.str() : a + ", " + hex_bucket.str();
+      });
+  buckets_str += "]";
+
+
+  std::string hash_values_str = std::accumulate(
+      std::begin(hash_values),
+      std::end(hash_values), std::string{},
+      [] (const std::string& a, uint64_t hv) {
+        std::ostringstream hex_hv;
+        hex_hv << std::hex;
+        hex_hv << "0x" << hv;
+
+        return a.empty() ? "[" + hex_hv.str() : a + ", " + hex_hv.str();
+      });
+  hash_values_str += "]";
+
+  os << std::setw(33) << std::setfill(' ') << "Number of buckets:"  << gnuhash.nb_buckets()   << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "First symbol index:" << gnuhash.symbol_index() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Shift Count:"        << gnuhash.shift2()       << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Bloom filters:"      << bloom_filters_str      << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Buckets:"            << buckets_str            << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Hash values:"        << hash_values_str        << std::endl;
+
+
+
+
+  return os;
+
+}
+
+} // namespace ELF
+} // namespace LIEF
diff --git a/src/ELF/Header.cpp b/src/ELF/Header.cpp
new file mode 100644
index 0000000..a7ce64e
--- /dev/null
+++ b/src/ELF/Header.cpp
@@ -0,0 +1,395 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <set>
+#include <map>
+#include <iomanip>
+#include <sstream>
+
+#include "LIEF/exception.hpp"
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/Header.hpp"
+#include "LIEF/ELF/EnumToString.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+static const std::map<ARCH, std::pair<ARCHITECTURES, std::set<MODES>>> arch_elf_to_lief {
+  {ARCH::EM_NONE,      {ARCH_NONE, {}}},
+  {ARCH::EM_X86_64,    {ARCH_X86,   {MODE_64}}},
+  {ARCH::EM_ARM,       {ARCH_ARM,   {}}},
+  {ARCH::EM_AARCH64,   {ARCH_ARM64, {}}},
+  {ARCH::EM_386,       {ARCH_X86,   {MODE_32}}},
+  {ARCH::EM_IA_64,     {ARCH_INTEL, {MODE_64}}},
+};
+
+
+static const std::map<E_TYPE, OBJECT_TYPES> obj_elf_to_lief {
+  {E_TYPE::ET_EXEC, OBJECT_TYPES::TYPE_EXECUTABLE},
+  {E_TYPE::ET_DYN,  OBJECT_TYPES::TYPE_LIBRARY},
+  {E_TYPE::ET_REL,  OBJECT_TYPES::TYPE_OBJECT},
+};
+
+Header& Header::operator=(const Header& copy) = default;
+Header::Header(const Header& copy)            = default;
+Header::~Header(void)                         = default;
+
+Header::Header(void) :
+  fileType_{E_TYPE::ET_NONE},
+  machineType_{ARCH::EM_NONE},
+  objectFileVersion_{VERSION::EV_NONE},
+  entryPoint_(0),
+  programHeaderOffset_(0),
+  sectionHeaderOffset_(0),
+  processorFlag_(0),
+  headerSize_(0),
+  programHeaderSize_(0),
+  numberof_segments_(0),
+  sizeOfSectionHeaderEntries_(0),
+  numberof_sections_(0),
+  sectionNameStringTableIdx_(0)
+{}
+
+
+Header::Header(const Elf32_Ehdr *header):
+  fileType_(static_cast<E_TYPE>(header->e_type)),
+  machineType_(static_cast<ARCH>(header->e_machine)),
+  objectFileVersion_(static_cast<VERSION>(header->e_version)),
+  entryPoint_(header->e_entry),
+  programHeaderOffset_(header->e_phoff),
+  sectionHeaderOffset_(header->e_shoff),
+  processorFlag_(header->e_flags),
+  headerSize_(header->e_ehsize),
+  programHeaderSize_(header->e_phentsize),
+  numberof_segments_(header->e_phnum),
+  sizeOfSectionHeaderEntries_(header->e_shentsize),
+  numberof_sections_(header->e_shnum),
+  sectionNameStringTableIdx_(header->e_shstrndx)
+{
+ std::copy(
+     reinterpret_cast<const uint8_t*>(header->e_ident),
+     reinterpret_cast<const uint8_t*>(header->e_ident) + IDENTITY::EI_NIDENT,
+     std::begin(this->identity_));
+}
+
+Header::Header(const Elf64_Ehdr *header):
+  fileType_(static_cast<E_TYPE>(header->e_type)),
+  machineType_(static_cast<ARCH>(header->e_machine)),
+  objectFileVersion_(static_cast<VERSION>(header->e_version)),
+  entryPoint_(header->e_entry),
+  programHeaderOffset_(header->e_phoff),
+  sectionHeaderOffset_(header->e_shoff),
+  processorFlag_(header->e_flags),
+  headerSize_(header->e_ehsize),
+  programHeaderSize_(header->e_phentsize),
+  numberof_segments_(header->e_phnum),
+  sizeOfSectionHeaderEntries_(header->e_shentsize),
+  numberof_sections_(header->e_shnum),
+  sectionNameStringTableIdx_(header->e_shstrndx)
+{
+  std::copy(
+      reinterpret_cast<const uint8_t*>(header->e_ident),
+      reinterpret_cast<const uint8_t*>(header->e_ident) + IDENTITY::EI_NIDENT,
+      std::begin(this->identity_));
+}
+
+
+Header::Header(const std::vector<uint8_t>& header) {
+  //TODO: Add more check
+  if (header[1] == 'E' and header[2] == 'L' and header[3] == 'F') {
+      uint32_t type = reinterpret_cast<const Elf32_Ehdr*>(header.data())->e_ident[IDENTITY::EI_CLASS];
+      if (type == ELFCLASS32) {
+        *this = Header{reinterpret_cast<const Elf32_Ehdr*>(header.data())};
+      } else if(type == ELFCLASS64) {
+        *this = Header{reinterpret_cast<const Elf64_Ehdr*>(header.data())};
+      } else {
+        throw corrupted("Incorrect header (Wrong ELFCLASS)");
+      }
+  } else {
+    throw corrupted("Incorrect header (Wrong magic)");
+  }
+}
+
+E_TYPE Header::file_type(void) const {
+  return this->fileType_;
+}
+
+
+ARCH Header::machine_type(void) const {
+  return this->machineType_;
+}
+
+OBJECT_TYPES Header::abstract_object_type(void) const {
+  try {
+    return obj_elf_to_lief.at(this->file_type());
+  } catch (const std::out_of_range&) {
+    throw not_implemented(to_string(this->file_type()));
+  }
+}
+
+
+std::pair<ARCHITECTURES, std::set<MODES>> Header::abstract_architecture(void) const {
+
+  try {
+    return arch_elf_to_lief.at(this->machine_type());
+  } catch (const std::out_of_range&) {
+    throw not_implemented(to_string(this->machine_type()));
+  }
+}
+
+
+VERSION Header::object_file_version(void) const {
+  return this->objectFileVersion_;
+}
+
+
+uint64_t Header::entrypoint(void) const {
+  return this->entryPoint_;
+}
+
+
+uint64_t Header::program_headers_offset(void) const {
+  return this->programHeaderOffset_;
+}
+
+
+uint64_t Header::section_headers_offset(void) const {
+  return this->sectionHeaderOffset_;
+}
+
+
+uint32_t Header::processor_flag(void) const {
+  return this->processorFlag_;
+}
+
+
+uint32_t Header::header_size(void) const {
+  return this->headerSize_;
+}
+
+
+uint32_t Header::program_header_size(void) const {
+  return this->programHeaderSize_;
+}
+
+
+uint32_t Header::numberof_segments(void) const {
+  return this->numberof_segments_;
+}
+
+//! @todo rename
+uint32_t Header::sizeof_section_header(void) const {
+  return this->sizeOfSectionHeaderEntries_;
+}
+
+
+uint32_t Header::numberof_sections(void) const {
+  return this->numberof_sections_;
+}
+
+
+uint32_t Header::section_name_table_idx(void) const {
+  return this->sectionNameStringTableIdx_;
+}
+
+
+const Header::identity_t& Header::identity(void) const {
+  return this->identity_;
+}
+
+Header::identity_t& Header::identity(void) {
+  return const_cast<Header::identity_t&>(static_cast<const Header*>(this)->identity());
+}
+
+ELF_CLASS Header::identity_class(void) const {
+  return static_cast<ELF_CLASS>(this->identity_[IDENTITY::EI_CLASS]);
+}
+
+ELF_DATA Header::identity_data(void) const {
+  return static_cast<ELF_DATA>(this->identity_[IDENTITY::EI_DATA]);
+}
+
+VERSION Header::identity_version(void) const {
+  return static_cast<VERSION>(this->identity_[IDENTITY::EI_VERSION]);
+}
+
+OS_ABI Header::identity_os_abi(void) const {
+  return static_cast<OS_ABI>(this->identity_[IDENTITY::EI_OSABI]);
+}
+
+void Header::file_type(E_TYPE type) {
+  this->fileType_ = type;
+}
+
+
+void Header::machine_type(ARCH machineType) {
+  this->machineType_ = machineType;
+}
+
+
+void Header::object_file_version(VERSION version) {
+  this->objectFileVersion_ = version;
+}
+
+
+void Header::entrypoint(uint64_t entryPoint) {
+  this->entryPoint_ = entryPoint;
+}
+
+
+void Header::program_headers_offset(uint64_t programHeaderOffset) {
+  this->programHeaderOffset_ = programHeaderOffset;
+}
+
+
+void Header::section_headers_offset(uint64_t sectionHeaderOffset) {
+  this->sectionHeaderOffset_ = sectionHeaderOffset;
+}
+
+
+void Header::processor_flag(uint32_t processorFlag) {
+  this->processorFlag_ = processorFlag;
+}
+
+
+void Header::header_size(uint32_t headerSize) {
+  this->headerSize_ = headerSize;
+}
+
+
+void Header::program_header_size(uint32_t programHeaderSize) {
+  this->programHeaderSize_ = programHeaderSize;
+}
+
+
+void Header::numberof_segments(uint32_t n) {
+  this->numberof_segments_ = n;
+}
+
+
+void Header::sizeof_section_header(uint32_t sizeOfSectionHeaderEntries) {
+  this->sizeOfSectionHeaderEntries_ = sizeOfSectionHeaderEntries;
+}
+
+
+void Header::numberof_sections(uint32_t n) {
+  this->numberof_sections_ = n;
+}
+
+
+void Header::section_name_table_idx(uint32_t sectionNameStringTableIdx) {
+  this->sectionNameStringTableIdx_ = sectionNameStringTableIdx;
+}
+
+
+void Header::identity(const std::string& identity) {
+  std::copy(
+      std::begin(identity),
+      std::end(identity),
+      std::begin(this->identity_));
+}
+
+void Header::identity(const Header::identity_t& identity) {
+  std::copy(
+      std::begin(identity),
+      std::end(identity),
+      std::begin(this->identity_));
+}
+
+void Header::identity_class(ELF_CLASS i_class) {
+  this->identity_[IDENTITY::EI_CLASS] = static_cast<uint8_t>(i_class);
+}
+
+void Header::identity_data(ELF_DATA data) {
+  this->identity_[IDENTITY::EI_DATA] = static_cast<uint8_t>(data);
+}
+
+void Header::identity_version(VERSION version) {
+  this->identity_[IDENTITY::EI_VERSION] = static_cast<uint8_t>(version);
+}
+
+void Header::identity_os_abi(OS_ABI osabi) {
+  this->identity_[IDENTITY::EI_OSABI] = static_cast<uint8_t>(osabi);
+}
+
+
+void Header::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->entrypoint());
+  visitor.visit(this->file_type());
+  visitor.visit(this->machine_type());
+  visitor.visit(this->object_file_version());
+  visitor.visit(this->entrypoint());
+  visitor.visit(this->program_headers_offset());
+  visitor.visit(this->section_headers_offset());
+  visitor.visit(this->processor_flag());
+  visitor.visit(this->header_size());
+  visitor.visit(this->program_header_size());
+  visitor.visit(this->numberof_segments());
+  visitor.visit(this->sizeof_section_header());
+  visitor.visit(this->section_name_table_idx());
+  visitor.visit(this->identity_class());
+  visitor.visit(this->identity_data());
+  visitor.visit(this->identity_version());
+  visitor.visit(this->identity_os_abi());
+}
+
+bool Header::operator==(const Header& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Header::operator!=(const Header& rhs) const {
+  return not (*this == rhs);
+}
+
+
+
+std::ostream& operator<<(std::ostream& os, const Header& hdr)
+{
+  const Header::identity_t& identity = const_cast<Header*>(&hdr)->identity();
+  std::stringstream ss;
+  ss << std::hex;
+  ss << static_cast<uint32_t>(identity[IDENTITY::EI_MAG0]) << " ";
+  ss << static_cast<uint32_t>(identity[IDENTITY::EI_MAG1]) << " ";
+  ss << static_cast<uint32_t>(identity[IDENTITY::EI_MAG2]) << " ";
+  ss << static_cast<uint32_t>(identity[IDENTITY::EI_MAG3]) << " ";
+  const std::string& ident_magic = ss.str();
+
+  os << std::hex << std::left;
+  os << std::setw(33) << std::setfill(' ') << "Magic:"                     << ident_magic << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Class"                      << to_string(hdr.identity_class()) << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Endianness:"                << to_string(hdr.identity_data()) << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Version:"                   << to_string(hdr.identity_version()) << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "OS/ABI:"                    << to_string(hdr.identity_os_abi()) << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Machine type:"              << to_string(hdr.machine_type()) << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "File type:"                 << to_string(hdr.file_type()) << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Object file version:"       << to_string(hdr.object_file_version()) << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Entry Point:"               << "0x" << hdr.entrypoint() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Program header offset:"     << "0x" << hdr.program_headers_offset() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Section header offset:"     << hdr.section_headers_offset() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Processor Flag"             << hdr.processor_flag() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Header size:"               << hdr.header_size() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Program header size:"       << hdr.program_header_size() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Number of program header:"  << hdr.numberof_segments() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Size of section header:"    << hdr.sizeof_section_header() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Number of section headers:" << hdr.numberof_sections() << std::endl;
+  os << std::setw(33) << std::setfill(' ') << "Section Name Table idx:"    << hdr.section_name_table_idx() << std::endl;
+
+  return os;
+}
+}
+}
diff --git a/src/ELF/Parser.cpp b/src/ELF/Parser.cpp
new file mode 100644
index 0000000..a52c9be
--- /dev/null
+++ b/src/ELF/Parser.cpp
@@ -0,0 +1,211 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <regex>
+#include <fstream>
+#include <iterator>
+#include <iostream>
+#include <algorithm>
+#include <stdexcept>
+#include <functional>
+
+#include "easylogging++.h"
+
+#include "LIEF/filesystem/filesystem.h"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/ELF/Parser.hpp"
+#include "LIEF/ELF/utils.hpp"
+
+
+#include "Parser.tcc"
+
+
+namespace LIEF {
+namespace ELF {
+
+
+Parser::~Parser(void) = default;
+Parser::Parser(void)  = default;
+
+Parser::Parser(const std::vector<uint8_t>& data, const std::string& name) :
+  stream_{std::unique_ptr<VectorStream>(new VectorStream{data})}
+{
+  this->init(name);
+}
+
+Parser::Parser(const std::string& file) :
+  LIEF::Parser{file}
+{
+  if (not is_elf(file)) {
+    throw LIEF::bad_format("'" + file + "' is not an ELF");
+  }
+
+  this->stream_ = std::unique_ptr<VectorStream>(new VectorStream{file});
+  this->init(filesystem::path(file).filename());
+}
+
+void Parser::init(const std::string& name) {
+  LOG(DEBUG) << "Parsing binary: " << name << std::endl;
+  this->binary_ = new Binary{};
+  this->binary_->original_size_ = this->binary_size_;
+  this->binary_->name(name);
+  this->binary_->datahandler_ = new DataHandler::Handler{this->stream_->content()};
+
+  this->type_ = reinterpret_cast<const Elf32_Ehdr*>(
+      this->stream_->read(0, sizeof(Elf32_Ehdr)))->e_ident[IDENTITY::EI_CLASS];
+
+  this->binary_->type_ = static_cast<ELF_CLASS>(this->type_);
+
+  switch (this->binary_->type_) {
+    case ELFCLASS32:
+      {
+        this->parse_binary<ELF32>();
+        break;
+      }
+
+    case ELFCLASS64:
+      {
+        this->parse_binary<ELF64>();
+        break;
+      }
+
+    case ELFCLASSNONE:
+    default:
+      LOG(WARNING) << "e_ident[EI_CLASS] seems corrupted." << std::endl;
+      //TODO try to guess with e_machine
+      throw LIEF::corrupted("e_ident[EI_CLASS] corrupted");
+  }
+}
+
+Binary* Parser::parse(const std::string& filename) {
+  Parser parser{filename};
+  return parser.binary_;
+}
+
+Binary* Parser::parse(const std::vector<uint8_t>& data, const std::string& name) {
+  Parser parser{data, name};
+  return parser.binary_;
+}
+
+
+void Parser::parse_symbol_version(uint64_t symbol_version_offset) {
+  LOG(DEBUG) << "[+] Parsing symbol version" << std::endl;
+
+  LOG(DEBUG) << "Symbol version offset: 0x" << std::hex << symbol_version_offset << std::endl;
+
+  const uint32_t nb_entries = static_cast<uint32_t>(this->binary_->dynamic_symbols_.size());
+  const uint16_t* array = reinterpret_cast<const uint16_t*>(
+      this->stream_->read(symbol_version_offset, nb_entries * sizeof(uint16_t)));
+
+  for (size_t i = 0; i < nb_entries; ++i) {
+    this->binary_->symbol_version_table_.push_back(new SymbolVersion{array[i]});
+  }
+}
+
+
+uint64_t Parser::get_dynamic_string_table_from_segments(void) const {
+  //find DYNAMIC segment
+  auto&& it_segment_dynamic = std::find_if(
+      std::begin(this->binary_->segments_),
+      std::end(this->binary_->segments_),
+      [] (const Segment* segment)
+      {
+        return segment != nullptr and segment->type() == SEGMENT_TYPES::PT_DYNAMIC;
+      });
+
+
+  uint64_t va_offset = 0;
+  if (it_segment_dynamic != std::end(this->binary_->segments_)) {
+    uint64_t offset = (*it_segment_dynamic)->file_offset();
+    uint64_t size   = (*it_segment_dynamic)->physical_size();
+
+    if (this->type_ == ELFCLASS32) {
+
+      size_t nb_entries = size / sizeof(Elf32_Dyn);
+      const Elf32_Dyn* entries = reinterpret_cast<const Elf32_Dyn*>(
+          this->stream_->read(offset, size));
+      for (size_t i = 0; i < nb_entries; ++i) {
+        if (static_cast<DYNAMIC_TAGS>(entries[i].d_tag) ==
+            DYNAMIC_TAGS::DT_STRTAB) {
+          va_offset = this->binary_->virtual_address_to_offset(entries[i].d_un.d_val);
+        }
+      }
+
+    } else {
+      const Elf64_Dyn* entries = reinterpret_cast<const Elf64_Dyn*>(
+          this->stream_->read(offset, size));
+      size_t nb_entries = size / sizeof(Elf64_Dyn);
+      for (size_t i = 0; i < nb_entries; ++i) {
+        if (static_cast<DYNAMIC_TAGS>(entries[i].d_tag) ==
+            DYNAMIC_TAGS::DT_STRTAB) {
+          va_offset = this->binary_->virtual_address_to_offset(entries[i].d_un.d_val);
+        }
+      }
+    }
+  }
+
+  if (va_offset > 0) {
+    return va_offset;
+  } else {
+    throw LIEF::conversion_error("Unable to convert VA to offset from segments");
+  }
+}
+
+uint64_t Parser::get_dynamic_string_table_from_sections(void) const {
+  // Find Dynamic string section
+  auto&& it_dynamic_string_section = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->name() == ".dynstr" and section->type() == SECTION_TYPES::SHT_STRTAB;
+      });
+
+
+  uint64_t va_offset = 0;
+  if (it_dynamic_string_section != std::end(this->binary_->sections_)) {
+    va_offset = (*it_dynamic_string_section)->file_offset();
+  }
+
+  if (va_offset > 0) {
+    return va_offset;
+  } else {
+    throw LIEF::conversion_error("Unable to convert VA to offset from sections");
+  }
+
+}
+
+uint64_t Parser::get_dynamic_string_table(void) const {
+  uint64_t offset = 0;
+  try {
+    offset = this->get_dynamic_string_table_from_segments();
+  } catch (const LIEF::conversion_error&) {
+    offset = this->get_dynamic_string_table_from_sections();
+  }
+  return offset;
+}
+
+
+void Parser::link_symbol_version(void) {
+  if (this->binary_->dynamic_symbols_.size() == this->binary_->symbol_version_table_.size()) {
+    for (size_t i = 0; i < this->binary_->dynamic_symbols_.size(); ++i) {
+      this->binary_->dynamic_symbols_[i]->symbol_version_ = this->binary_->symbol_version_table_[i];
+    }
+  }
+}
+
+}
+}
diff --git a/src/ELF/Parser.tcc b/src/ELF/Parser.tcc
new file mode 100644
index 0000000..256cdbc
--- /dev/null
+++ b/src/ELF/Parser.tcc
@@ -0,0 +1,1251 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "easylogging++.h"
+
+namespace LIEF {
+namespace ELF {
+template<typename ELF_T>
+void Parser::parse_binary(void) {
+  LOG(DEBUG) << "Start parsing";
+  // Parse header
+  // ============
+  this->parse_header<ELF_T>();
+
+  // Parse Sections
+  // ==============
+  if (this->binary_->header_.section_headers_offset() > 0) {
+    this->parse_sections<ELF_T>();
+  } else {
+    LOG(WARNING) << "The current binary doesn't have a section header";
+  }
+
+
+  // Parse segments
+  // ==============
+  if (this->binary_->header_.program_headers_offset() > 0) {
+    this->parse_segments<ELF_T>();
+  } else {
+    LOG(WARNING) << "Binary doesn't have a program header";
+  }
+
+  // Parse Dynamic elements
+  // ======================
+
+  // Find the dynamic Segment
+  auto&& it_segment_dynamic = std::find_if(
+      std::begin(this->binary_->segments_),
+      std::end(this->binary_->segments_),
+      [] (const Segment* segment) {
+        return segment != nullptr and segment->type() == SEGMENT_TYPES::PT_DYNAMIC;
+      });
+
+  if (it_segment_dynamic != std::end(this->binary_->segments_)) {
+
+    const uint64_t offset = (*it_segment_dynamic)->file_offset();
+    const uint64_t size   = (*it_segment_dynamic)->physical_size();
+
+    this->parse_dynamic_entries<ELF_T>(offset, size);
+  }
+
+
+  // Parse dynamic symbols
+  // =====================
+  auto&& it_dynamic_symbol_table = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_SYMTAB;
+      });
+
+  auto&& it_dynamic_symbol_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_SYMENT;
+      });
+
+  if (it_dynamic_symbol_table != std::end(this->binary_->dynamic_entries_) and
+      it_dynamic_symbol_size != std::end(this->binary_->dynamic_entries_)) {
+    const uint64_t virtual_address = (*it_dynamic_symbol_table)->value();
+    const uint64_t size            = (*it_dynamic_symbol_size)->value();
+    try {
+      const uint64_t offset = this->binary_->virtual_address_to_offset(virtual_address);
+      this->parse_dynamic_symbols<ELF_T>(offset, size);
+    } catch (const LIEF::exception&) {
+    }
+  }
+
+  // Parse dynamic relocations
+  // =========================
+
+  // RELA
+  // ----
+  auto&& it_dynamic_relocations = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_RELA;
+      });
+
+  auto&& it_dynamic_relocations_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_RELASZ;
+      });
+
+  if (it_dynamic_relocations != std::end(this->binary_->dynamic_entries_) and
+      it_dynamic_relocations_size != std::end(this->binary_->dynamic_entries_)) {
+    const uint64_t virtual_address = (*it_dynamic_relocations)->value();
+    const uint64_t size            = (*it_dynamic_relocations_size)->value();
+    try {
+      uint64_t offset = this->binary_->virtual_address_to_offset(virtual_address);
+      this->parse_dynamic_relocations<ELF_T>(offset, size, true);
+    } catch (const LIEF::exception&) {
+    }
+  }
+
+
+  // REL
+  // ---
+  it_dynamic_relocations = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_REL;
+      });
+
+  it_dynamic_relocations_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_RELSZ;
+      });
+
+  if (it_dynamic_relocations != std::end(this->binary_->dynamic_entries_) and
+      it_dynamic_relocations_size != std::end(this->binary_->dynamic_entries_)) {
+    const uint64_t virtual_address = (*it_dynamic_relocations)->value();
+    const uint64_t size            = (*it_dynamic_relocations_size)->value();
+    try {
+      const uint64_t offset = this->binary_->virtual_address_to_offset(virtual_address);
+      this->parse_dynamic_relocations<ELF_T>(offset, size, false);
+    } catch (const LIEF::exception&) {
+
+    }
+
+  }
+
+  // Parse PLT/GOT Relocations
+  // ==========================
+  auto&& it_pltgot_relocations = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_JMPREL;
+      });
+
+  auto&& it_pltgot_relocations_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_PLTRELSZ;
+      });
+
+  auto&& it_pltgot_relocations_type = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_PLTREL;
+      });
+
+  if (it_pltgot_relocations != std::end(this->binary_->dynamic_entries_) and
+      it_pltgot_relocations_size != std::end(this->binary_->dynamic_entries_)) {
+    const uint64_t virtual_address = (*it_pltgot_relocations)->value();
+    const uint64_t size            = (*it_pltgot_relocations_size)->value();
+    DYNAMIC_TAGS type;
+    if (it_pltgot_relocations_type != std::end(this->binary_->dynamic_entries_)) {
+      type = static_cast<DYNAMIC_TAGS>((*it_pltgot_relocations_type)->value());
+    } else {
+      // Try to guess: We assume that on ELF64 -> DT_RELA and on ELF32 -> DT_REL
+      if (std::is_same<ELF_T, ELF64>::value) {
+        type = DYNAMIC_TAGS::DT_RELA;
+      } else {
+        type = DYNAMIC_TAGS::DT_REL;
+      }
+    }
+
+    try {
+      const uint64_t offset = this->binary_->virtual_address_to_offset(virtual_address);
+      this->parse_pltgot_relocations<ELF_T>(
+        offset, size,
+        type == DYNAMIC_TAGS::DT_RELA ? true : false);
+    } catch (const LIEF::exception&) {
+
+    }
+
+
+  }
+
+  // Parse Symbol Version
+  // ====================
+  auto&& it_symbol_versions = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_VERSYM;
+      });
+
+  if (it_symbol_versions != std::end(this->binary_->dynamic_entries_)) {
+    const uint64_t virtual_address = (*it_symbol_versions)->value();
+    try {
+      uint64_t offset = this->binary_->virtual_address_to_offset(virtual_address);
+      this->parse_symbol_version(offset);
+    } catch (const LIEF::exception&) {
+
+    }
+
+  }
+
+  // Parse Symbol Version Requirement
+  // ================================
+  auto&& it_symbol_version_requirement = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_VERNEED;
+      });
+
+  auto&& it_symbol_version_requirement_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_VERNEEDNUM;
+      });
+
+  if (it_symbol_version_requirement != std::end(this->binary_->dynamic_entries_) and
+      it_symbol_version_requirement_size != std::end(this->binary_->dynamic_entries_)) {
+    const uint64_t virtual_address = (*it_symbol_version_requirement)->value();
+    const uint32_t size            = static_cast<uint32_t>((*it_symbol_version_requirement_size)->value());
+    try {
+      const uint64_t offset = this->binary_->virtual_address_to_offset(virtual_address);
+      this->parse_symbol_version_requirement<ELF_T>(offset, size);
+    } catch (const LIEF::exception& e) {
+      LOG(WARNING) << e.what();
+    }
+
+  }
+
+  // Parse Symbol Version Definition
+  // ===============================
+  auto&& it_symbol_version_definition = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_VERDEF;
+      });
+
+  auto&& it_symbol_version_definition_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_VERDEFNUM;
+      });
+
+  if (it_symbol_version_definition != std::end(this->binary_->dynamic_entries_) and
+      it_symbol_version_definition_size != std::end(this->binary_->dynamic_entries_)) {
+    const uint64_t virtual_address = (*it_symbol_version_definition)->value();
+    const uint32_t size            = static_cast<uint32_t>((*it_symbol_version_definition_size)->value());
+    try {
+      const uint64_t offset = this->binary_->virtual_address_to_offset(virtual_address);
+      this->parse_symbol_version_definition<ELF_T>(offset, size);
+    } catch (const LIEF::exception&) {
+
+    }
+
+  }
+
+
+  // Parse static symbols
+  // ====================
+  auto&& it_symtab_section = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_SYMTAB;
+      });
+
+  if (it_symtab_section != std::end(this->binary_->sections_)) {
+    const Section* section = *it_symtab_section;
+    uint32_t nb_entries = 0;
+    if (section->entry_size() > 0) {
+      nb_entries = static_cast<uint32_t>((section->size() / section->entry_size()));
+    } else {
+      LOG(WARNING) << "section->entry_size() is null !";
+      if (this->type_ == ELFCLASS32) {
+        nb_entries = static_cast<uint32_t>((section->size() / sizeof(Elf32_Sym)));
+      } else {
+        nb_entries = static_cast<uint32_t>((section->size() / sizeof(Elf64_Sym)));
+      }
+    }
+
+    if (section->link() == 0 or section->link() >= this->binary_->sections_.size()) {
+      LOG(WARNING) << "section->link() is not valid !";
+    } else {
+      // We should have:
+      // nb_entries == section->information())
+      // but lots of compiler not respect this rule
+      this->parse_static_symbols<ELF_T>(
+          section->file_offset(),
+          nb_entries,
+          this->binary_->sections_[section->link()]);
+    }
+  }
+
+  // Parse Symbols's hash
+  // ====================
+
+  auto&& it_symbol_hash = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_HASH;
+      });
+
+  auto&& it_symbol_gnu_hash = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry) {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_GNU_HASH;
+      });
+
+  if (it_symbol_hash != std::end(this->binary_->dynamic_entries_)) {
+    try {
+      //const uint64_t symbol_hash_offset = this->binary_->virtual_address_to_offset((*itSymbolHash)->value());
+    } catch (const conversion_error&) {
+    }
+  }
+
+
+  if (it_symbol_gnu_hash != std::end(this->binary_->dynamic_entries_)) {
+    try {
+      const uint64_t symbol_gnu_hash_offset = this->binary_->virtual_address_to_offset((*it_symbol_gnu_hash)->value());
+      this->parse_symbol_gnu_hash<ELF_T>(symbol_gnu_hash_offset);
+    } catch (const conversion_error&) {
+    }
+  }
+
+  // Try to parse using sections
+  //for (const std::shared_ptr<Section>& section : this->binary_->sections_) {
+  //  if (section->name() == ".rela.plt" and
+  //      (section->type() == SECTION_TYPES::SHT_RELA or
+  //       section->type() == SECTION_TYPES::SHT_REL)) {
+
+  //    this->parse_pltgot_relocations<ELF_T>(
+  //        section->file_offset(),
+  //        section->size(),
+  //        section->type() == SECTION_TYPES::SHT_RELA);
+  //  }
+
+  //  if (section->name() == ".rela.dyn" and
+  //      (section->type() == SECTION_TYPES::SHT_RELA or
+  //       section->type() == SECTION_TYPES::SHT_REL)) {
+  //    this->parse_dynamic_relocations<ELF_T>(
+  //        section->virtual_address(),
+  //        section->size(),
+  //        section->type() == SECTION_TYPES::SHT_RELA);
+  //  }
+  //}
+
+  this->link_symbol_version();
+}
+
+
+template<typename ELF_T>
+void Parser::parse_header(void) {
+  using Elf_Ehdr = typename ELF_T::Elf_Ehdr;
+
+  LOG(DEBUG) << "[+] Parsing Header";
+  try {
+    this->binary_->header_ = {reinterpret_cast<const Elf_Ehdr*>(
+        this->stream_->read(0, sizeof(Elf_Ehdr)))};
+  } catch (const read_out_of_bound&) {
+    throw corrupted("Header corrupted");
+  }
+}
+
+template<typename ELF_T>
+void Parser::parse_sections(void) {
+  using Elf_Shdr = typename ELF_T::Elf_Shdr;
+  LOG(DEBUG) << "[+] Parsing Section";
+
+  const uint64_t headers_offset    = this->binary_->header_.section_headers_offset();
+  const uint32_t numberof_sections = this->binary_->header_.numberof_sections();
+  const Elf_Shdr* section_headers = reinterpret_cast<const Elf_Shdr*>(
+      this->stream_->read(
+        headers_offset,
+        numberof_sections * sizeof(Elf_Shdr)));
+
+  for (size_t i = 0; i < numberof_sections; ++i) {
+
+    LOG(DEBUG) << "\t Parsing section " << std::dec << i;
+    const Elf_Shdr* hdr = &(section_headers[i]);
+    Section* section = new Section{hdr};
+    section->datahandler_ = this->binary_->datahandler_;
+
+    // Only if it contains data (with bits)
+    if (section->type() != SECTION_TYPES::SHT_NOBITS) {
+      const uint64_t offset_to_content   = section->file_offset();
+      const uint64_t size                = section->size();
+      try {
+        const uint8_t* content = static_cast<const uint8_t*>(
+            this->stream_->read(offset_to_content, size));
+        section->content({content, content + size});
+      } catch (const LIEF::read_out_of_bound&) {
+        LOG(WARNING) << "Section's file offset and/or section's size is corrupted";
+      } catch (const std::bad_alloc&) {
+        LOG(WARNING) << "Section's file offset and/or section's size is corrupted";
+      }
+    } else { //Create a node which will hold nothing
+      DataHandler::Node empty_node{
+          section->file_offset(),
+          section->size(),
+          DataHandler::Node::SECTION};
+      this->binary_->datahandler_->add_node(empty_node);
+    }
+    this->binary_->sections_.push_back(section);
+  }
+
+  // Parse name
+  if (this->binary_->header_.section_name_table_idx() < this->binary_->sections_.size()) {
+    const size_t section_string_index = this->binary_->header_.section_name_table_idx();
+    const Section* string_section = this->binary_->sections_[section_string_index];
+    for (Section* section : this->binary_->sections_) {
+      try {
+        section->name({this->stream_->read_string(
+              string_section->file_offset() + section->name_idx())});
+      } catch (const LIEF::read_out_of_bound&) {
+        LOG(WARNING) << "Section's name is corrupted";
+      }
+    }
+  } else {
+    LOG(WARNING) << "Unable to fetch the Name string section";
+  }
+}
+
+template<typename ELF_T>
+void Parser::parse_segments(void) {
+  using Elf_Phdr = typename ELF_T::Elf_Phdr;
+
+  LOG(DEBUG) << "[+] Parse Segments";
+  const uint64_t segment_headers_offset = this->binary_->get_header().program_headers_offset();
+  const uint32_t nbof_segments          = this->binary_->get_header().numberof_segments();
+
+  const Elf_Phdr* segment_headers = reinterpret_cast<const Elf_Phdr*>(
+      this->stream_->read(segment_headers_offset, nbof_segments * sizeof(Elf_Phdr)));
+
+  auto check_section_in_segment =
+    [] (const Section* section, const Segment* segment) {
+      return section->virtual_address() >= segment->virtual_address() and
+        (section->virtual_address() + section->size()) <=
+        (segment->virtual_address() + segment->virtual_size());
+    };
+
+  for (size_t i = 0; i < nbof_segments; ++i) {
+    Segment* segment = new Segment{&segment_headers[i]};
+    segment->datahandler_ = this->binary_->datahandler_;
+    // If if a section is in the current segment
+
+    if (segment->physical_size() > 0) {
+      const uint64_t offset_to_content   = segment->file_offset();
+      const uint64_t size                = segment->physical_size();
+      try {
+        const uint8_t* content = static_cast<const uint8_t*>(
+            this->stream_->read(offset_to_content, size));
+        segment->content({content, content + size});
+
+      } catch (const LIEF::read_out_of_bound&) {
+        LOG(WARNING) << "Segment's file offset and/or segment's size is corrupted";
+      } catch(const std::bad_alloc&) {
+        LOG(WARNING) << "Segment's file offset and/or segment's size is corrupted";
+      }
+    }
+
+    for (Section* section : this->binary_->sections_) {
+      if (check_section_in_segment(section, segment)) {
+        section->segments_.push_back(segment);
+        segment->sections_.push_back(section);
+      }
+    }
+    this->binary_->segments_.push_back(segment);
+  }
+
+}
+
+
+
+template<typename ELF_T>
+void Parser::parse_dynamic_relocations(uint64_t relocations_offset, uint64_t size, bool isRela) {
+  LOG(DEBUG) << "[+] Parsing dynamic relocations";
+  using Elf_Rela = typename ELF_T::Elf_Rela;
+  using Elf_Rel  = typename ELF_T::Elf_Rel;
+
+  // Already parsed
+  if (this->binary_->dynamic_relocations_.size() > 0) {
+    return;
+  }
+
+  const uint8_t shift = std::is_same<ELF_T, ELF32>::value ? 8 : 32;
+
+  if (isRela) {
+    const uint32_t nb_entries = static_cast<uint32_t>(size / sizeof(Elf_Rela));
+
+    const Elf_Rela* relocEntry = reinterpret_cast<const Elf_Rela*>(
+        this->stream_->read(relocations_offset, nb_entries * sizeof(Elf_Rela)));
+
+    for (uint32_t i = 0; i < nb_entries; ++i) {
+      Relocation* reloc = new Relocation{relocEntry};
+      reloc->architecture_ = this->binary_->get_header().machine_type();
+      const uint32_t idx =  static_cast<uint32_t>(relocEntry->r_info >> shift);
+      if (idx < this->binary_->dynamic_symbols_.size()) {
+        reloc->symbol_ = this->binary_->dynamic_symbols_[idx];
+      } else {
+        LOG(WARNING) << "Unable to find the symbol associated with the relocation (idx: "
+                     << std::dec << idx << ")" << std::endl
+                     << reloc;
+      }
+
+      this->binary_->dynamic_relocations_.push_back(reloc);
+      relocEntry++;
+    }
+  } else {
+    const uint32_t nb_entries = static_cast<uint32_t>(size / sizeof(Elf_Rel));
+
+    const Elf_Rel* relocEntry = reinterpret_cast<const Elf_Rel*>(
+       this->stream_->read(relocations_offset, nb_entries * sizeof(Elf_Rel)));
+
+    for (uint32_t i = 0; i < nb_entries; ++i) {
+      Relocation* reloc = new Relocation{relocEntry};
+      reloc->architecture_ = this->binary_->get_header().machine_type();
+      uint32_t idx =  static_cast<uint32_t>(relocEntry->r_info >> shift);
+      if (idx < this->binary_->dynamic_symbols_.size()) {
+        reloc->symbol_ = this->binary_->dynamic_symbols_[idx];
+      } else {
+        LOG(WARNING) << "Unable to find the symbol associated with the relocation (idx: "
+                     << std::dec << idx << ")" << std::endl
+                     << reloc;
+      }
+
+      this->binary_->dynamic_relocations_.push_back(reloc);
+      relocEntry++;
+    }
+  }
+} // build_dynamic_reclocations
+
+
+
+template<typename ELF_T>
+void Parser::parse_static_symbols(uint64_t offset, uint32_t nbSymbols, const Section* string_section) {
+
+  using Elf_Sym = typename ELF_T::Elf_Sym;
+  LOG(DEBUG) << "[+] Parsing static symbols";
+
+  const Elf_Sym* symbol_headers = reinterpret_cast<const Elf_Sym*>(
+      this->stream_->read(offset, nbSymbols * sizeof(Elf_Sym)));
+
+  for (uint32_t i = 0; i < nbSymbols; ++i) {
+    Symbol* symbol = new Symbol{&symbol_headers[i]};
+    try {
+      std::string symbol_name = {this->stream_->read_string(
+          string_section->file_offset() + symbol_headers[i].st_name)};
+      symbol->name(symbol_name);
+    } catch (const LIEF::read_out_of_bound& e) {
+      LOG(WARNING) << e.what();
+    }
+    this->binary_->static_symbols_.push_back(symbol);
+  }
+} // build_static_symbols
+
+
+template<typename ELF_T>
+void Parser::parse_dynamic_symbols(uint64_t offset, uint64_t size) {
+  using Elf_Sym = typename ELF_T::Elf_Sym;
+  LOG(DEBUG) << "[+] Parsing dynamics symbols";
+
+
+  auto&& it_dynamic_section = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section)
+      {
+        return section != nullptr and section->type() == SECTION_TYPES::SHT_DYNSYM;
+      });
+
+  //TODO: To improve
+  //uint32_t nbOfSymbols = ~0;
+  uint32_t nb_symbols = static_cast<uint32_t>(size / sizeof(Elf_Sym));
+
+  if (it_dynamic_section != std::end(this->binary_->sections_)) {
+    const uint64_t section_size = (*it_dynamic_section)->size();
+    const uint64_t entry_size   =(*it_dynamic_section)->entry_size();
+    if (entry_size > 0)  {
+      nb_symbols = static_cast<uint32_t>(section_size / entry_size);
+    }
+  }
+
+  const uint64_t dynamic_symbols_offset = offset;
+  const uint64_t string_offset = this->get_dynamic_string_table();
+
+  const Elf_Sym* symbol_headers = reinterpret_cast<const Elf_Sym*>(
+      this->stream_->read(dynamic_symbols_offset, nb_symbols * sizeof(Elf_Sym)));
+
+  if (string_offset == 0) {
+    LOG(WARNING) << "Unable to find the .dynstr section";
+  } else {
+    for (size_t i = 0; i < nb_symbols; ++i) {
+    //while (symbolHdr->st_other == 0 and (idx++) < maxSymbols) { // Check: Could be wrong ?
+      Symbol* symbol = new Symbol{symbol_headers};
+
+      if (symbol_headers->st_name > 0) {
+        std::string name{
+          this->stream_->read_string(string_offset + symbol_headers->st_name)};
+        symbol->name(name);
+      }
+
+      this->binary_->dynamic_symbols_.push_back(symbol);
+      symbol_headers++;
+    }
+  }
+} // build_dynamic_sybols
+
+
+
+
+template<typename ELF_T>
+void Parser::parse_dynamic_entries(uint64_t offset, uint64_t size) {
+  using Elf_Dyn = typename ELF_T::Elf_Dyn;
+  using uint__  = typename ELF_T::uint;
+  LOG(DEBUG) << "[+] Parsing dynamic section";
+
+  const uint64_t nb_entries = size / sizeof(Elf_Dyn);
+
+  LOG(DEBUG) << "Size of the dynamic section: 0x" << std::hex << size;
+  LOG(DEBUG) << "offset of the dynamic section: 0x" << std::hex << offset;
+  LOG(DEBUG) << "Nb of entrie in DynSec = " << std::dec << nb_entries;
+
+  uint64_t dynamic_string_offset = 0;
+  try {
+    dynamic_string_offset = this->get_dynamic_string_table();
+  } catch (const std::exception&) {
+    LOG(WARNING) << "Unable to fetch dynamic string table";
+  }
+  const Elf_Dyn* entries = reinterpret_cast<const Elf_Dyn*>(
+      this->stream_->read(offset, nb_entries * sizeof(Elf_Dyn)));
+
+  for (size_t dynIdx = 0; dynIdx < nb_entries; ++dynIdx) {
+    const Elf_Dyn* entry = &entries[dynIdx];
+
+    DynamicEntry *dynamic_entry = nullptr;
+    switch (static_cast<DYNAMIC_TAGS>(entry->d_tag)) {
+      case DYNAMIC_TAGS::DT_NEEDED :
+        {
+          dynamic_entry = new DynamicEntryLibrary{entry};
+          if (dynamic_string_offset == 0) {
+            LOG(WARNING) << "Unable to find the .dynstr section";
+          } else {
+            std::string library_name = {
+              this->stream_->read_string(dynamic_string_offset + dynamic_entry->value())};
+            dynamic_entry->name(library_name);
+          }
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_SONAME :
+        {
+
+          dynamic_entry = new DynamicSharedObject{entry};
+
+          if (dynamic_string_offset == 0) {
+            LOG(WARNING) << "Unable to find the .dynstr section";
+          } else {
+            std::string sharename = {
+              this->stream_->read_string(dynamic_string_offset + dynamic_entry->value())};
+            dynamic_entry->name(sharename);
+          }
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RPATH:
+        {
+
+          dynamic_entry = new DynamicEntryRpath{entry};
+
+          if (dynamic_string_offset == 0) {
+            LOG(WARNING) << "Unable to find the .dynstr section";
+          } else {
+            std::string name = {
+              this->stream_->read_string(dynamic_string_offset + dynamic_entry->value())};
+            dynamic_entry->name(name);
+          }
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RUNPATH:
+        {
+
+          dynamic_entry = new DynamicEntryRunPath{entry};
+
+          if (dynamic_string_offset == 0) {
+            LOG(WARNING) << "Unable to find the .dynstr section";
+          } else {
+            std::string name = {
+              this->stream_->read_string(dynamic_string_offset + dynamic_entry->value())};
+            dynamic_entry->name(name);
+          }
+          break;
+        }
+
+
+      case DYNAMIC_TAGS::DT_SYMTAB :
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_SYMENT:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RELA:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RELASZ:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+        // Relocations 'Elf64Rel'
+      case DYNAMIC_TAGS::DT_REL:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_RELSZ:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+        // Plt relocations
+      case DYNAMIC_TAGS::DT_JMPREL:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_PLTRELSZ:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_PLTREL:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_VERSYM:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_VERNEED:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_VERNEEDNUM:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_VERDEF:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_VERDEFNUM:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+          break;
+        }
+
+      case DYNAMIC_TAGS::DT_FINI_ARRAY:
+      case DYNAMIC_TAGS::DT_INIT_ARRAY:
+      case DYNAMIC_TAGS::DT_PREINIT_ARRAY:
+        {
+          dynamic_entry = new DynamicEntryArray{entry};
+          break;
+        }
+
+      default:
+        {
+          dynamic_entry = new DynamicEntry{entry};
+        }
+    }
+
+    if (dynamic_entry != nullptr) {
+      this->binary_->dynamic_entries_.push_back(dynamic_entry);
+    } else {
+      LOG(WARNING) << "dynamic_entry is nullptr !";
+    }
+
+  }
+
+  // Check for INIT array
+  // ====================
+  auto&& it_dt_initarray = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_INIT_ARRAY;
+      });
+
+  if (it_dt_initarray != std::end(this->binary_->dynamic_entries_)) {
+
+    auto&& it_dt_initarray_size = std::find_if(
+        std::begin(this->binary_->dynamic_entries_),
+        std::end(this->binary_->dynamic_entries_),
+        [] (const DynamicEntry* entry)
+        {
+          return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_INIT_ARRAYSZ;
+        });
+
+    DynamicEntry* dt_initarray_entry = *it_dt_initarray;
+
+    if (it_dt_initarray_size != std::end(this->binary_->dynamic_entries_)) {
+      std::vector<uint64_t>& array = dt_initarray_entry->array();
+
+      const uint32_t nb_functions = static_cast<uint32_t>((*it_dt_initarray_size)->value() / sizeof(uint__));
+      try {
+        const uint64_t offset = this->binary_->virtual_address_to_offset(dt_initarray_entry->value());
+        const uint__* rawArray = reinterpret_cast<const uint__*>(
+            this->stream_->read(offset, nb_functions * sizeof(uint__)));
+
+        for (size_t i = 0; i < nb_functions; ++i) {
+          array.push_back(rawArray[i]);
+        }
+      } catch (const std::exception&) {
+        LOG(WARNING) << "Unable to fetch init array";
+      }
+    } else {
+      // TODO: Has DT_INIT but not DT_INIT_SIZE
+    }
+  }
+
+
+  // Check for FINI array
+  // ====================
+  auto&& it_dt_finiarray = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_FINI_ARRAY;
+      });
+
+  if (it_dt_finiarray != std::end(this->binary_->dynamic_entries_)) {
+
+    auto&& it_dt_finiarray_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_FINI_ARRAYSZ;
+      });
+
+    if (it_dt_finiarray_size != std::end(this->binary_->dynamic_entries_)) {
+
+      DynamicEntry* dt_finiarray_entry = *it_dt_finiarray;
+
+      std::vector<uint64_t>& array = dt_finiarray_entry->array();
+      const uint32_t nb_functions = static_cast<uint32_t>((*it_dt_finiarray_size)->value() / sizeof(uint__));
+      try {
+        const uint64_t offset = this->binary_->virtual_address_to_offset(dt_finiarray_entry->value());
+        const uint__ *rawArray = reinterpret_cast<const uint__*>(
+            this->stream_->read(offset, nb_functions * sizeof(uint__)));
+
+        for (size_t i = 0; i < nb_functions; ++i) {
+          array.push_back(rawArray[i]);
+        }
+      } catch (const LIEF::exception&) {
+        LOG(WARNING) << "Unable to fetch fini array";
+      }
+    } else {
+      //TOSO
+    }
+  }
+
+
+  // Check for PREINIT array
+  // =======================
+  auto&& it_dt_preinitarray = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_PREINIT_ARRAY;
+      });
+
+  if (it_dt_preinitarray != std::end(this->binary_->dynamic_entries_)) {
+
+    auto&& it_dt_preinitarray_size = std::find_if(
+      std::begin(this->binary_->dynamic_entries_),
+      std::end(this->binary_->dynamic_entries_),
+      [] (const DynamicEntry* entry)
+      {
+        return entry != nullptr and entry->tag() == DYNAMIC_TAGS::DT_PREINIT_ARRAYSZ;
+      });
+
+    if (it_dt_preinitarray_size != std::end(this->binary_->dynamic_entries_)) {
+
+      DynamicEntry* dt_preinitarray_entry = *it_dt_preinitarray;
+
+      std::vector<uint64_t>& array = dt_preinitarray_entry->array();
+      const uint32_t nb_functions = static_cast<uint32_t>((*it_dt_preinitarray_size)->value() / sizeof(uint__));
+      try {
+        const uint64_t offset = this->binary_->virtual_address_to_offset(dt_preinitarray_entry->value());
+        const uint__ *rawArray = reinterpret_cast<const uint__*>(
+            this->stream_->read(offset, nb_functions * sizeof(uint__)));
+
+        for (size_t i = 0; i < nb_functions; ++i) {
+          array.push_back(rawArray[i]);
+        }
+      } catch (const LIEF::exception&) {
+        LOG(WARNING) << "Unable to fetch preinit array";
+      }
+    } else {
+      //TODO: has DT_FINI but not DT_FINISZ
+    }
+  }
+}
+
+
+template<typename ELF_T>
+void Parser::parse_pltgot_relocations(uint64_t offset, uint64_t size, bool isRela) {
+  using Elf_Rela = typename ELF_T::Elf_Rela;
+  using Elf_Rel  = typename ELF_T::Elf_Rel;
+
+  // Already Parsed
+  if (this->binary_->pltgot_relocations_.size() > 0) {
+    return;
+  }
+
+  const uint64_t offset_relocations = offset;
+  const uint8_t shift = std::is_same<ELF_T, ELF32>::value ? 8 : 32;
+
+  if (isRela) {
+    const uint32_t nb_entries = static_cast<uint32_t>(size / sizeof(Elf_Rela));
+    const Elf_Rela* relocEntry = reinterpret_cast<const Elf_Rela*>(
+        this->stream_->read(offset_relocations, nb_entries * sizeof(Elf_Rela)));
+
+    for (uint32_t i = 0; i < nb_entries; ++i) {
+      Relocation* reloc = new Relocation{relocEntry};
+      reloc->architecture_ = this->binary_->header_.machine_type();
+
+      const uint32_t idx  = static_cast<uint32_t>(relocEntry->r_info >> shift);
+      if (idx > 0 and idx < this->binary_->dynamic_symbols_.size()) {
+        reloc->symbol_ = this->binary_->dynamic_symbols_[idx];
+      }
+
+      this->binary_->pltgot_relocations_.push_back(reloc);
+      relocEntry++;
+    }
+  } else {
+    const uint32_t nb_entries = static_cast<uint32_t>(size / sizeof(Elf_Rel));
+    const Elf_Rel* relocEntry = reinterpret_cast<const Elf_Rel*>(
+        this->stream_->read(offset_relocations, nb_entries * sizeof(Elf_Rel)));
+    for (uint32_t i = 0; i < nb_entries; ++i) {
+      Relocation* reloc = new Relocation{relocEntry};
+      reloc->architecture_ = this->binary_->header_.machine_type();
+
+      const uint32_t idx =  static_cast<uint32_t>(relocEntry->r_info >> shift);
+      if (idx > 0 and idx < this->binary_->dynamic_symbols_.size()) {
+        reloc->symbol_ = this->binary_->dynamic_symbols_[idx];
+      }
+
+      this->binary_->pltgot_relocations_.push_back(reloc);
+      relocEntry++;
+    }
+  }
+}
+
+
+template<typename ELF_T>
+void Parser::parse_symbol_version_requirement(uint64_t offset, uint32_t nb_entries) {
+  using Elf_Verneed = typename ELF_T::Elf_Verneed;
+  using Elf_Vernaux = typename ELF_T::Elf_Vernaux;
+
+  LOG(DEBUG) << "[+] Build Symbol version requirement";
+
+  const uint64_t svr_offset = offset;
+
+  LOG(DEBUG) << "Symbol version requirement offset: 0x" << std::hex << svr_offset;
+
+  const uint64_t string_offset = this->get_dynamic_string_table();
+
+  if (string_offset == 0) {
+    LOG(WARNING) << "Unable to find the .dynstr section";
+  }
+
+  uint32_t next_symbol_offset = 0;
+
+  for (uint32_t symbolCnt = 0; symbolCnt < nb_entries; ++symbolCnt) {
+
+    const Elf_Verneed* header = reinterpret_cast<const Elf_Verneed*>(
+        this->stream_->read(
+          svr_offset + next_symbol_offset,
+          sizeof(Elf_Verneed)));
+
+    SymbolVersionRequirement* symbol_version_requirement= new SymbolVersionRequirement{header};
+    if (string_offset != 0) {
+      symbol_version_requirement->name({
+          this->stream_->read_string(string_offset + header->vn_file)});
+    }
+
+    const uint32_t nb_symbol_aux = header->vn_cnt;
+
+    uint32_t next_aux_offset = 0;
+    if (nb_symbol_aux > 0 and header->vn_aux > 0) {
+
+      const Elf_Vernaux* aux_header = reinterpret_cast<const Elf_Vernaux*>(
+          this->stream_->read(
+            svr_offset + next_symbol_offset + header->vn_aux,
+            sizeof(Elf_Vernaux)));
+
+      for (uint32_t j = 0; j < nb_symbol_aux; ++j) {
+        aux_header = reinterpret_cast<const Elf_Vernaux*>(
+            this->stream_->read(
+              svr_offset + next_symbol_offset + header->vn_aux + next_aux_offset,
+              sizeof(Elf_Vernaux)));
+
+
+        SymbolVersionAuxRequirement* svar = new SymbolVersionAuxRequirement{aux_header};
+        if (string_offset != 0) {
+          svar->name({this->stream_->read_string(string_offset + aux_header->vna_name)});
+        }
+
+        symbol_version_requirement->symbol_version_aux_requirement_.push_back(svar);
+        if (aux_header->vna_next == 0) break;
+        next_aux_offset += aux_header->vna_next;
+      }
+
+      this->binary_->symbol_version_requirements_.push_back(symbol_version_requirement);
+    }
+
+    if (header->vn_next == 0) break;
+    next_symbol_offset += header->vn_next;
+
+  }
+
+
+  // Associate Symbol Version with auxiliary symbol
+  // Symbol version requirement is used to map
+  // SymbolVersion::SymbolVersionAux <------> SymbolVersionAuxRequirement
+  //
+  // We mask the 15th (7FFF) bit because it sets if this symbol is a hidden on or not
+  // but we don't care
+  for (SymbolVersionRequirement* svr : this->binary_->symbol_version_requirements_) {
+    for (SymbolVersionAuxRequirement* svar : svr->symbol_version_aux_requirement_) {
+      std::for_each(
+          std::begin(this->binary_->symbol_version_table_),
+          std::end(this->binary_->symbol_version_table_),
+          [&svar] (SymbolVersion* sv)
+          {
+            if ((sv->value() & 0x7FFF) == svar->other()) {
+              sv->symbol_aux_ = svar;
+            }
+          });
+    }
+  }
+}
+
+
+template<typename ELF_T>
+void Parser::parse_symbol_version_definition(uint64_t offset, uint32_t nb_entries) {
+  using Elf_Verdef = typename ELF_T::Elf_Verdef;
+  using Elf_Verdaux = typename ELF_T::Elf_Verdaux;
+
+  const uint64_t string_offset = this->get_dynamic_string_table();
+  uint32_t next_symbol_offset = 0;
+
+  for (uint32_t i = 0; i < nb_entries; ++i) {
+    const Elf_Verdef* svd_header = reinterpret_cast<const Elf_Verdef*>(
+        this->stream_->read(
+        offset + next_symbol_offset,
+        sizeof(Elf_Verdef)));
+
+    SymbolVersionDefinition* symbol_version_definition = new SymbolVersionDefinition{svd_header};
+    uint32_t nb_aux_symbols = svd_header->vd_cnt;
+    uint32_t next_aux_offset = 0;
+    for (uint32_t j = 0; j < nb_aux_symbols; ++j) {
+      const Elf_Verdaux* svda_header = reinterpret_cast<const Elf_Verdaux*>(
+          this->stream_->read(
+          offset + next_symbol_offset + svd_header->vd_aux + next_aux_offset,
+          sizeof(Elf_Verdaux)));
+      if (string_offset != 0) {
+        std::string name  = {this->stream_->read_string(string_offset + svda_header->vda_name)};
+        symbol_version_definition->symbol_version_aux_.push_back(new SymbolVersionAux{name});
+      }
+
+      // Additional check
+      if (svda_header->vda_next == 0) break;
+
+      next_aux_offset += svda_header->vda_next;
+    }
+
+    this->binary_->symbol_version_definition_.push_back(symbol_version_definition);
+
+    // Additional check
+    if (svd_header->vd_next == 0) break;
+
+    next_symbol_offset += svd_header->vd_next;
+  }
+
+  // Associate Symbol Version with auxiliary symbol
+  // We mask the 15th bit because it sets if this symbol is a hidden on or not
+  // but we don't care
+  for (SymbolVersionDefinition& svd : this->binary_->get_symbols_version_definition()) {
+    for (SymbolVersionAux* sva : svd.symbol_version_aux_) {
+      std::for_each(
+          std::begin(this->binary_->symbol_version_table_),
+          std::end(this->binary_->symbol_version_table_),
+          [&sva, &svd] (SymbolVersion* sv)
+          {
+            if (svd.ndx() > 1 and (sv->value() & 0x7FFF) == svd.ndx() ) {
+              sv->symbol_aux_ = sva;
+            }
+
+          });
+    }
+  }
+}
+
+// See: https://github.com/lattera/glibc/blob/master/elf/dl-lookup.c#L860
+// and  https://github.com/lattera/glibc/blob/master/elf/dl-lookup.c#L226
+template<typename ELF_T>
+void Parser::parse_symbol_gnu_hash(uint64_t offset) {
+  using uint__  = typename ELF_T::uint;
+
+  LOG(DEBUG) << "[+] Build symbol GNU hash";
+  GnuHash gnuhash;
+
+  uint64_t current_offset = offset;
+
+  const uint32_t* header = reinterpret_cast<const uint32_t*>(
+      this->stream_->read(current_offset, 4 * sizeof(uint32_t)));
+
+  current_offset += 4 * sizeof(uint32_t);
+
+  const uint32_t nbuckets  = header[0];
+  const uint32_t symndx    = header[1];
+  const uint32_t maskwords = header[2];
+  const uint32_t shift2    = header[3];
+
+  gnuhash.symbol_index_ = symndx;
+  gnuhash.shift2_       = shift2;
+
+  if (maskwords & (maskwords - 1)) {
+    LOG(WARNING) << "maskwords is not a power of 2";
+  }
+
+  //LOG(DEBUG) << "nbuckets: %d",nbuckets;
+  //LOG(DEBUG) << "symndx: %d",  symndx;
+  //LOG(DEBUG) << "maskwords: %" PRIx32 "", maskwords;
+  //LOG(DEBUG) << "shift2: %" PRIx32 "",    shift2;
+
+  try {
+    std::vector<uint64_t> bloom_filters(maskwords);
+
+    for (size_t i = 0; i < maskwords; ++i) {
+      bloom_filters[i] = this->stream_->read_integer<uint__>(current_offset);
+      current_offset += sizeof(uint__);
+    }
+
+    gnuhash.bloom_filters_ = std::move(bloom_filters);
+  }
+  catch (const read_out_of_bound&) {
+    throw corrupted("GNU Hash, maskwords corrupted");
+  }
+  catch (const std::bad_alloc&) {
+    throw corrupted("GNU Hash, maskwords corrupted");
+  }
+
+  std::vector<uint32_t> buckets;
+  buckets.reserve(std::min<uint32_t>(nbuckets, 400));
+  try {
+    const uint32_t* hash_buckets = reinterpret_cast<const uint32_t*>(
+        this->stream_->read(current_offset, nbuckets * sizeof(uint32_t)));
+    current_offset += nbuckets * sizeof(uint32_t);
+
+    buckets = {hash_buckets, hash_buckets + nbuckets};
+  } catch (const read_out_of_bound&) {
+    throw corrupted("GNU Hash, hash_buckets corrupted");
+  }
+
+  gnuhash.buckets_ = std::move(buckets);
+
+  const uint32_t dynsymcount = static_cast<uint32_t>(this->binary_->dynamic_symbols_.size());
+  //LOG(DEBUG) << "dynsymcount: %" PRId32 "", dynsymcount;
+  if (dynsymcount <= symndx) {
+    throw corrupted("GNU Hash, symndx corrupted");
+  }
+
+  uint32_t nb_hash = dynsymcount - symndx;
+
+  std::vector<uint32_t> hashvalues;
+  hashvalues.reserve(std::min<uint32_t>(nb_hash, 400));
+
+  try {
+    const uint32_t* hash_values = reinterpret_cast<const uint32_t*>(
+        this->stream_->read(current_offset, nb_hash * sizeof(uint32_t)));
+
+    hashvalues = {hash_values, hash_values + nb_hash};
+  } catch (const read_out_of_bound&) {
+    throw corrupted("GNU Hash, nb_hash corrupted");
+  }
+
+  gnuhash.hash_values_ = std::move(hashvalues);
+  this->binary_->gnu_hash_ = std::move(gnuhash);
+
+}
+
+
+}
+}
diff --git a/src/ELF/Relocation.cpp b/src/ELF/Relocation.cpp
new file mode 100644
index 0000000..4847d33
--- /dev/null
+++ b/src/ELF/Relocation.cpp
@@ -0,0 +1,227 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/exception.hpp"
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/Relocation.hpp"
+#include "LIEF/ELF/EnumToString.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+Relocation::~Relocation(void) = default;
+
+Relocation::Relocation(void) :
+  address_{0},
+  type_{0},
+  addend_{0},
+  isRela_{false},
+  symbol_{nullptr},
+  architecture_{ARCH::EM_NONE}
+{}
+
+
+Relocation::Relocation(const Relocation& other) :
+  Visitable{other},
+  address_{other.address_},
+  type_{other.type_},
+  addend_{other.addend_},
+  isRela_{other.isRela_},
+  symbol_{nullptr},
+  architecture_{other.architecture_}
+{
+}
+
+
+Relocation& Relocation::operator=(Relocation other) {
+  this->swap(other);
+  return *this;
+}
+
+Relocation::Relocation(const Elf32_Rel* header) :
+  address_{header->r_offset},
+  type_{static_cast<uint32_t>(header->r_info & 0xff)},
+  addend_{0},
+  isRela_{false},
+  symbol_{nullptr},
+  architecture_{ARCH::EM_NONE}
+{}
+
+
+Relocation::Relocation(const Elf32_Rela* header) :
+  address_{header->r_offset},
+  type_{static_cast<uint32_t>(header->r_info & 0xff)},
+  addend_{header->r_addend},
+  isRela_{true},
+  symbol_{nullptr},
+  architecture_{ARCH::EM_NONE}
+{}
+
+
+Relocation::Relocation(const Elf64_Rel* header) :
+  address_{header->r_offset},
+  type_{static_cast<uint32_t>(header->r_info & 0xffffffff)},
+  addend_{0},
+  isRela_{false},
+  symbol_{nullptr},
+  architecture_{ARCH::EM_NONE}
+{}
+
+
+Relocation::Relocation(const Elf64_Rela* header)  :
+  address_{header->r_offset},
+  type_{static_cast<uint32_t>(header->r_info & 0xffffffff)},
+  addend_{header->r_addend},
+  isRela_{true},
+  symbol_{nullptr},
+  architecture_{ARCH::EM_NONE}
+{}
+
+
+Relocation::Relocation(uint64_t address, uint32_t type, int64_t addend, bool isRela) :
+  address_{address},
+  type_{type},
+  addend_{addend},
+  isRela_{isRela},
+  symbol_{nullptr},
+  architecture_{ARCH::EM_NONE}
+{}
+
+
+void Relocation::swap(Relocation& other) {
+  std::swap(this->address_,      other.address_);
+  std::swap(this->type_,         other.type_);
+  std::swap(this->addend_,       other.addend_);
+  std::swap(this->isRela_,       other.isRela_);
+  std::swap(this->symbol_,       other.symbol_);
+  std::swap(this->architecture_, other.architecture_);
+}
+
+uint64_t Relocation::address(void) const {
+  return this->address_;
+}
+
+
+int64_t Relocation::addend(void) const {
+  return this->addend_;
+}
+
+
+uint32_t Relocation::type(void) const {
+  return this->type_;
+}
+
+
+const Symbol& Relocation::symbol(void) const {
+  if (this->symbol_ != nullptr) {
+    return *this->symbol_;
+  } else {
+    throw not_found("No symbol associated with this relocation");
+  }
+}
+
+Symbol& Relocation::symbol(void) {
+  return const_cast<Symbol&>(static_cast<const Relocation*>(this)->symbol());
+}
+
+
+bool Relocation::is_rela(void) const {
+  return this->isRela_;
+}
+
+
+bool Relocation::is_rel(void) const {
+  return not this->isRela_;
+}
+
+
+ARCH Relocation::architecture(void) const {
+  return this->architecture_;
+}
+
+
+bool Relocation::has_symbol(void) const {
+  return this->symbol_ != nullptr;
+}
+
+
+void Relocation::address(uint64_t address) {
+  this->address_ = address;
+}
+
+
+void Relocation::addend(int64_t addend) {
+  this->addend_ = addend;
+}
+
+
+void Relocation::type(uint32_t type) {
+  this->type_ = type;
+}
+
+
+void Relocation::accept(Visitor& visitor) const {
+  visitor.visit(this->address());
+  visitor.visit(this->addend());
+  visitor.visit(this->type());
+  visitor.visit(this->architecture());
+  if (this->has_symbol()) {
+    visitor(this->symbol());
+  }
+
+}
+
+
+bool Relocation::operator==(const Relocation& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Relocation::operator!=(const Relocation& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const Relocation& entry) {
+  std::string symbol_name = "";
+  os << std::hex;
+  os << std::left;
+
+  if (entry.has_symbol()) {
+    const Symbol& symbol = entry.symbol();
+    try {
+      symbol_name = symbol.demangled_name();
+    } catch (const not_supported&) {
+      symbol_name = symbol.name();
+    }
+  }
+
+  std::string relocation_type = "";
+  if (entry.architecture() == ARCH::EM_X86_64) {
+    relocation_type = to_string(static_cast<RELOC_x86_64>(entry.type()));
+  }
+
+  os << std::setw(10) << entry.address()
+     << std::setw(10) << relocation_type
+     << std::setw(10) << symbol_name;
+
+  return os;
+}
+}
+}
diff --git a/src/ELF/Section.cpp b/src/ELF/Section.cpp
new file mode 100644
index 0000000..20acd3a
--- /dev/null
+++ b/src/ELF/Section.cpp
@@ -0,0 +1,343 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdexcept>
+#include <iomanip>
+#include <algorithm>
+#include <numeric>
+#include <functional>
+#include <iterator>
+
+#include "easylogging++.h"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/EnumToString.hpp"
+
+#include "LIEF/ELF/Segment.hpp"
+#include "LIEF/ELF/Section.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+Section::~Section(void) = default;
+
+
+Section::Section(const Elf64_Shdr* header) :
+  LIEF::Section{},
+  name_idx_{header->sh_name},
+  type_{static_cast<SECTION_TYPES>(header->sh_type)},
+  flags_{header->sh_flags},
+  original_size_{header->sh_size},
+  link_{header->sh_link},
+  info_{header->sh_info},
+  address_align_{header->sh_addralign},
+  entry_size_{header->sh_entsize},
+  segments_{},
+  datahandler_{nullptr},
+  content_c_{}
+{
+  this->virtual_address_ = header->sh_addr;
+  this->offset_          = header->sh_offset;
+  this->size_            = header->sh_size;
+}
+
+Section::Section(const Elf32_Shdr* header) :
+  LIEF::Section{},
+  name_idx_{header->sh_name},
+  type_{static_cast<SECTION_TYPES>(header->sh_type)},
+  flags_{header->sh_flags},
+  original_size_{header->sh_size},
+  link_{header->sh_link},
+  info_{header->sh_info},
+  address_align_{header->sh_addralign},
+  entry_size_{header->sh_entsize},
+  segments_{},
+  datahandler_{nullptr},
+  content_c_{}
+{
+  this->virtual_address_ = header->sh_addr;
+  this->offset_          = header->sh_offset;
+  this->size_            = header->sh_size;
+}
+
+Section::Section(void) :
+  LIEF::Section{},
+  name_idx_{0},
+  type_{SECTION_TYPES::SHT_PROGBITS},
+  flags_{0},
+  original_size_{0},
+  link_{0},
+  info_{0},
+  address_align_{16},
+  entry_size_{0},
+  segments_{},
+  datahandler_{nullptr},
+  content_c_{}
+{
+  this->virtual_address_ = 0;
+  this->offset_          = 0;
+  this->size_            = 0;
+}
+
+
+Section::Section(uint8_t *data, ELF_CLASS type) :
+  LIEF::Section{}
+{
+  if (type == ELF_CLASS::ELFCLASS32) {
+    *this = {reinterpret_cast<Elf32_Shdr*>(data)};
+  } else if (type == ELF_CLASS::ELFCLASS64) {
+    *this = {reinterpret_cast<Elf64_Shdr*>(data)};
+  }
+}
+
+Section& Section::operator=(Section other) {
+  this->swap(other);
+  return *this;
+}
+
+Section::Section(const Section& other) :
+  LIEF::Section{other},
+  name_idx_{other.name_idx_},
+  type_{other.type_},
+  flags_{other.flags_},
+  original_size_{other.original_size_},
+  link_{other.link_},
+  info_{other.info_},
+  address_align_{other.address_align_},
+  entry_size_{other.entry_size_},
+  segments_{},
+  datahandler_{nullptr},
+  content_c_{other.content()}
+{
+}
+
+void Section::swap(Section& other) {
+
+  std::swap(this->name_,            other.name_);
+  std::swap(this->virtual_address_, other.virtual_address_);
+  std::swap(this->name_idx_,        other.name_idx_);
+  std::swap(this->offset_,          other.offset_);
+  std::swap(this->size_,            other.size_);
+
+  std::swap(this->name_idx_,       other.name_idx_);
+  std::swap(this->type_,           other.type_);
+  std::swap(this->flags_,          other.flags_);
+  std::swap(this->original_size_,  other.original_size_);
+  std::swap(this->link_,           other.link_);
+  std::swap(this->info_,           other.info_);
+  std::swap(this->address_align_,  other.address_align_);
+  std::swap(this->entry_size_,     other.entry_size_);
+  std::swap(this->segments_,       other.segments_);
+  std::swap(this->datahandler_,    other.datahandler_);
+  std::swap(this->content_c_,      other.content_c_);
+}
+
+uint32_t Section::name_idx(void) const {
+  return this->name_idx_;
+}
+
+SECTION_TYPES Section::type(void) const {
+  return this->type_;
+}
+
+uint64_t Section::flags(void) const {
+  return this->flags_;
+}
+
+bool Section::has_flag(SECTION_FLAGS flag) const {
+  return (this->flags_ & static_cast<uint64_t>(flag)) != 0;
+}
+
+uint64_t Section::file_offset(void) const {
+  return this->offset();
+}
+
+uint64_t Section::original_size(void) const {
+  return this->original_size_;
+}
+
+uint64_t Section::information(void) const {
+  return this->info_;
+}
+
+uint64_t Section::entry_size(void) const {
+  return this->entry_size_;
+}
+
+uint64_t Section::alignment(void) const {
+  return this->address_align_;
+}
+
+std::vector<uint8_t> Section::content(void) const {
+  if (this->size() == 0 or this->type() == SECTION_TYPES::SHT_NOBITS) {
+    LOG(DEBUG) << "Section '" << this->name() << "' is empty";
+    return {};
+  }
+
+  if (this->datahandler_ == nullptr) {
+    LOG(DEBUG) << "Content from cache";
+    return this->content_c_;
+  } else {
+    LOG(DEBUG) << std::hex << "Content from Data Handler [0x" << this->offset_ << ", 0x" << this->size_ << "]";
+    return this->datahandler_->content(this->offset_, this->size_, DataHandler::Node::SECTION);
+  }
+}
+
+uint32_t Section::link(void) const {
+  return this->link_;
+}
+
+std::set<SECTION_FLAGS> Section::flags_list(void) const {
+  std::set<SECTION_FLAGS> flags;
+  std::copy_if(
+      std::begin(section_flags_array),
+      std::end(section_flags_array),
+      std::inserter(flags, std::begin(flags)),
+      std::bind(&Section::has_flag, this, std::placeholders::_1));
+
+  return flags;
+}
+
+void Section::content(const std::vector<uint8_t>& data) {
+  if (this->original_size() > 0 and data.size() > this->original_size()) {
+    LOG(WARNING) << "You insert data in the section "
+              << this->name() << " whose the size it bigger ("
+              << std::dec << data.size() << " > "
+              << this->original_size_ << "). It may lead to overaly" << std::endl;
+  }
+
+  if (this->type() == SECTION_TYPES::SHT_NOBITS) {
+    LOG(WARNING) << "You insert data in section "
+                 << this->name() << " which has SHT_NOBITS type !" << std::endl;
+  }
+
+  if (data.size() > 0) {
+    if (this->datahandler_ == nullptr) {
+      this->content_c_ = data;
+    } else {
+      this->datahandler_->content(this->offset(), data, DataHandler::Node::SECTION);
+    }
+  }
+
+  this->size_ = data.size();
+}
+
+void Section::type(SECTION_TYPES type) {
+  this->type_ = type;
+}
+
+void Section::flags(uint64_t flags) {
+  this->flags_ = flags;
+}
+
+void Section::add_flag(SECTION_FLAGS flag) {
+  this->flags_ = (this->flags_ | static_cast<uint64_t>(flag));
+}
+
+void Section::remove_flag(SECTION_FLAGS flag) {
+  this->flags_ = (this->flags_ & (~ static_cast<uint64_t>(flag)));
+}
+
+void Section::clear_flags(void) {
+  this->flags_ = 0;
+}
+
+void Section::file_offset(uint64_t offset) {
+  this->offset(offset);
+}
+
+void Section::link(uint32_t link) {
+  this->link_ = link;
+}
+
+void Section::information(uint32_t info) {
+  this->info_ = info;
+}
+
+void Section::alignment(uint64_t alignment) {
+  this->address_align_ = alignment;
+}
+
+void Section::entry_size(uint64_t entry_size) {
+  this->entry_size_ = entry_size;
+}
+
+
+it_segments Section::segments(void) {
+  return it_segments{std::ref(this->segments_)};
+}
+
+it_const_segments Section::segments(void) const {
+  return it_const_segments{std::cref(this->segments_)};
+}
+
+void Section::accept(Visitor& visitor) const {
+
+  LIEF::Section::accept(visitor);
+
+  visitor.visit(this->type());
+  visitor.visit(this->flags());
+  visitor.visit(this->link());
+  visitor.visit(this->information());
+  visitor.visit(this->alignment());
+  visitor.visit(this->content());
+}
+
+
+bool Section::operator==(const Section& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Section::operator!=(const Section& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const Section& section)
+{
+  const auto& flags = section.flags_list();
+  std::string flags_str = std::accumulate(
+     std::begin(flags),
+     std::end(flags), std::string{},
+     [] (const std::string& a, SECTION_FLAGS b) {
+         return a.empty() ? to_string(b) : a + " " + to_string(b);
+     });
+
+  it_const_segments segments = section.segments();
+  std::string segments_str = std::accumulate(
+     std::begin(segments),
+     std::end(segments), std::string{},
+     [] (const std::string& a, const Segment& segment) {
+         return a.empty() ? to_string(segment.type()) : a + " " + to_string(segment.type());
+     });
+
+  os << std::hex;
+  os << std::left
+     << std::setw(20) << section.name()
+     << std::setw(15) << to_string(section.type())
+     << std::setw(10) << section.virtual_address()
+     << std::setw(10) << section.size()
+     << std::setw(10) << section.file_offset()
+     << std::setw(10) << section.entropy()
+     << std::setw(30) << flags_str
+     << std::setw(15) << segments_str;
+
+  return os;
+}
+}
+}
diff --git a/src/ELF/Segment.cpp b/src/ELF/Segment.cpp
new file mode 100644
index 0000000..af115f7
--- /dev/null
+++ b/src/ELF/Segment.cpp
@@ -0,0 +1,326 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+#include <algorithm>
+#include <iterator>
+
+#include "easylogging++.h"
+
+#include "LIEF/exception.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/Segment.hpp"
+#include "LIEF/ELF/EnumToString.hpp"
+
+
+namespace LIEF {
+namespace ELF {
+
+Segment::~Segment(void) = default;
+Segment::Segment(const Segment& other) :
+  Visitable{other},
+  type_{other.type_},
+  flags_{other.flags_},
+  file_offset_{other.file_offset_},
+  virtual_address_{other.virtual_address_},
+  physical_address_{other.physical_address_},
+  size_{other.size_},
+  virtual_size_{other.virtual_size_},
+  alignment_{other.alignment_},
+  sections_{},
+  datahandler_{nullptr},
+  content_c_{other.content()}
+{}
+
+
+
+Segment::Segment(const Elf64_Phdr* header) :
+  type_{static_cast<SEGMENT_TYPES>(header->p_type)},
+  flags_{header->p_flags},
+  file_offset_{header->p_offset},
+  virtual_address_{header->p_vaddr},
+  physical_address_{header->p_paddr},
+  size_{header->p_filesz},
+  virtual_size_{header->p_memsz},
+  alignment_{header->p_align},
+  sections_{},
+  datahandler_{nullptr},
+  content_c_{}
+{}
+
+Segment::Segment(const Elf32_Phdr* header) :
+  type_{static_cast<SEGMENT_TYPES>(header->p_type)},
+  flags_{header->p_flags},
+  file_offset_{header->p_offset},
+  virtual_address_{header->p_vaddr},
+  physical_address_{header->p_paddr},
+  size_{header->p_filesz},
+  virtual_size_{header->p_memsz},
+  alignment_{header->p_align},
+  sections_{},
+  datahandler_{nullptr},
+  content_c_{}
+{}
+
+Segment::Segment(void) :
+  type_{static_cast<SEGMENT_TYPES>(0)},
+  flags_{0},
+  file_offset_{0},
+  virtual_address_{0},
+  physical_address_{0},
+  size_{0},
+  virtual_size_{0},
+  alignment_{0},
+  sections_{},
+  datahandler_{nullptr},
+  content_c_{}
+{}
+
+void Segment::swap(Segment& other) {
+  std::swap(this->type_,             other.type_);
+  std::swap(this->flags_,            other.flags_);
+  std::swap(this->file_offset_,      other.file_offset_);
+  std::swap(this->virtual_address_,  other.virtual_address_);
+  std::swap(this->physical_address_, other.physical_address_);
+  std::swap(this->size_,             other.size_);
+  std::swap(this->virtual_size_,     other.virtual_size_);
+  std::swap(this->alignment_,        other.alignment_);
+  std::swap(this->sections_,         other.sections_);
+  std::swap(this->datahandler_,      other.datahandler_);
+  std::swap(this->content_c_,        other.content_c_);
+}
+
+
+Segment& Segment::operator=(Segment other) {
+  this->swap(other);
+  return *this;
+}
+
+
+Segment::Segment(const std::vector<uint8_t>& header, ELF_CLASS type) {
+  if (type == ELF_CLASS::ELFCLASS32) {
+    *this = {reinterpret_cast<const Elf32_Phdr*>(header.data())};
+  } else if (type == ELF_CLASS::ELFCLASS64) {
+    *this = {reinterpret_cast<const Elf64_Phdr*>(header.data())};
+  }
+}
+
+Segment::Segment(const std::vector<uint8_t>& header) {
+  if (header.size() == sizeof(Elf32_Phdr)) {
+    *this = {reinterpret_cast<const Elf32_Phdr*>(header.data())};
+  } else if (header.size() == sizeof(Elf64_Phdr)) {
+    *this = {reinterpret_cast<const Elf64_Phdr*>(header.data())};
+  } else {
+    throw LIEF::corrupted("Unable to determine the header type: 32bits or 64bits (Wrong size)");
+  }
+}
+
+SEGMENT_TYPES Segment::type(void) const {
+  return this->type_;
+}
+
+
+uint32_t Segment::flag(void) const {
+  return this->flags_;
+}
+
+
+uint64_t Segment::file_offset(void) const {
+  return this->file_offset_;
+}
+
+
+uint64_t Segment::virtual_address(void) const {
+  return this->virtual_address_;
+}
+
+
+uint64_t Segment::physical_address(void) const {
+  return this->physical_address_;
+}
+
+
+uint64_t Segment::physical_size(void) const {
+  return this->size_;
+}
+
+
+uint64_t Segment::virtual_size(void) const {
+  return this->virtual_size_;
+}
+
+
+uint64_t Segment::alignment(void) const {
+  return this->alignment_;
+}
+
+std::vector<uint8_t> Segment::content(void) const {
+  if (this->datahandler_ == nullptr) {
+    LOG(DEBUG) << "Content from cache";
+    return this->content_c_;
+  } else {
+    LOG(DEBUG) << std::hex << "Content from Data Handler [0x" << this->file_offset() << ", 0x" << this->physical_size() << "]";
+    return this->datahandler_->content(this->file_offset(), this->physical_size(), DataHandler::Node::SEGMENT);
+  }
+}
+
+
+it_const_sections Segment::sections(void) const {
+  return it_const_sections{this->sections_};
+}
+
+
+it_sections Segment::sections(void) {
+  return it_sections{this->sections_};
+}
+
+bool Segment::has_flag(SEGMENT_FLAGS flag) const {
+  return ((this->flags_ & static_cast<uint32_t>(flag)) != 0);
+}
+
+
+void Segment::flag(uint32_t flags) {
+  this->flags_ = flags;
+}
+
+
+void Segment::add_flag(SEGMENT_FLAGS flag) {
+  this->flags_ |= static_cast<uint32_t>(flag);
+}
+
+
+void Segment::remove_flag(SEGMENT_FLAGS flag) {
+  this->flags_ &= ~ static_cast<uint32_t>(flag);
+}
+
+
+void Segment::clear_flags(void) {
+  this->flags_ = 0;
+}
+
+
+void Segment::file_offset(uint64_t fileOffset) {
+  this->file_offset_ = fileOffset;
+}
+
+
+void Segment::virtual_address(uint64_t virtualAddress) {
+  this->virtual_address_ = virtualAddress;
+}
+
+
+void Segment::physical_address(uint64_t physicalAddress) {
+  this->physical_address_ = physicalAddress;
+}
+
+
+void Segment::physical_size(uint64_t physicalSize) {
+  if (this->datahandler_ != nullptr) {
+    DataHandler::Node& node = this->datahandler_->find(this->file_offset(), this->size_, false, DataHandler::Node::SEGMENT);
+    node.size(physicalSize);
+  }
+  this->size_ = physicalSize;
+}
+
+
+void Segment::virtual_size(uint64_t virtualSize) {
+  this->virtual_size_ = virtualSize;
+}
+
+
+void Segment::alignment(uint64_t alignment) {
+  this->alignment_ = alignment;
+}
+
+void Segment::type(SEGMENT_TYPES type) {
+  this->type_ = type;
+}
+
+void Segment::content(const std::vector<uint8_t>& content) {
+  if (this->datahandler_ == nullptr) {
+    LOG(DEBUG) << "Set content in the cache";
+    this->content_c_ = content;
+  } else {
+    LOG(DEBUG) << "Set content in the data handler [0x" << std::hex << this->file_offset() << ", 0x" << content.size() << "]";
+    this->datahandler_->content(this->file_offset(), content, DataHandler::Node::SEGMENT);
+  }
+
+  this->physical_size(content.size());
+}
+
+void Segment::accept(Visitor& visitor) const {
+
+  visitor.visit(this->type());
+  visitor.visit(this->flag());
+  visitor.visit(this->file_offset());
+  visitor.visit(this->virtual_address());
+  visitor.visit(this->physical_address());
+  visitor.visit(this->physical_size());
+  visitor.visit(this->virtual_size());
+  visitor.visit(this->alignment());
+  visitor.visit(this->content());
+}
+
+bool Segment::operator==(const Segment& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Segment::operator!=(const Segment& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const ELF::Segment& segment) {
+
+
+  std::string flag = "";
+
+  if (segment.has_flag(SEGMENT_FLAGS::PF_R)) {
+    flag += "R";
+  }
+
+  if (segment.has_flag(SEGMENT_FLAGS::PF_W)) {
+    flag += "W";
+  }
+
+  if (segment.has_flag(SEGMENT_FLAGS::PF_X)) {
+    flag += "X";
+  }
+
+  os << std::hex;
+  os << std::left
+     << std::setw(18) << to_string(segment.type())
+     << std::setw(10) << flag
+     << std::setw(10) << segment.file_offset()
+     << std::setw(10) << segment.virtual_address()
+     << std::setw(10) << segment.physical_address()
+     << std::setw(10) << segment.physical_size()
+     << std::setw(10) << segment.virtual_size()
+     << std::setw(10) << segment.alignment()
+     << std::endl;
+
+  if (segment.sections().size() > 0) {
+    os << "Sections in this segment :" << std::endl;
+    for (const Section& section : segment.sections()) {
+      os << "\t" << section.name() << std::endl;
+    }
+  }
+  return os;
+}
+}
+}
diff --git a/src/ELF/Symbol.cpp b/src/ELF/Symbol.cpp
new file mode 100644
index 0000000..a9a590d
--- /dev/null
+++ b/src/ELF/Symbol.cpp
@@ -0,0 +1,264 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/exception.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/Symbol.hpp"
+#include "LIEF/ELF/EnumToString.hpp"
+
+
+namespace LIEF {
+namespace ELF {
+
+Symbol::Symbol(void) :
+  type_{SYMBOL_TYPES::STT_NOTYPE},
+  binding_{SYMBOL_BINDINGS::STB_LOCAL},
+  other_{0},
+  shndx_{0},
+  value_{0},
+  size_{0},
+  symbol_version_{nullptr}
+{}
+
+
+Symbol::~Symbol(void) = default;
+
+Symbol& Symbol::operator=(Symbol other) {
+  this->swap(other);
+  return *this;
+}
+
+Symbol::Symbol(const Symbol& other) : LIEF::Symbol{other},
+  type_{other.type_},
+  binding_{other.binding_},
+  other_{other.other_},
+  shndx_{other.shndx_},
+  value_{other.value_},
+  size_{other.size_},
+  symbol_version_{nullptr}
+{}
+
+
+void Symbol::swap(Symbol& other) {
+  std::swap(this->name_,           other.name_);
+  std::swap(this->type_,           other.type_);
+  std::swap(this->binding_,        other.binding_);
+  std::swap(this->other_,          other.other_);
+  std::swap(this->shndx_,          other.shndx_);
+  std::swap(this->value_,          other.value_);
+  std::swap(this->size_,           other.size_);
+  std::swap(this->symbol_version_, other.symbol_version_);
+}
+
+Symbol::Symbol(const Elf32_Sym* header) :
+  LIEF::Symbol{},
+  type_{static_cast<SYMBOL_TYPES>(header->st_info & 0x0f)},
+  binding_{static_cast<SYMBOL_BINDINGS>(header->st_info >> 4)},
+  other_{header->st_other},
+  shndx_{header->st_shndx},
+  value_{header->st_value},
+  size_{header->st_size},
+  symbol_version_{nullptr}
+{}
+
+Symbol::Symbol(const Elf64_Sym* header) :
+  LIEF::Symbol{},
+  type_{static_cast<SYMBOL_TYPES>(header->st_info & 0x0f)},
+  binding_{static_cast<SYMBOL_BINDINGS>(header->st_info >> 4)},
+  other_{header->st_other},
+  shndx_{header->st_shndx},
+  value_{header->st_value},
+  size_{header->st_size},
+  symbol_version_{nullptr}
+{}
+
+
+Symbol::Symbol(std::string name, SYMBOL_TYPES type, SYMBOL_BINDINGS binding,
+    uint8_t other, uint16_t shndx,
+    uint64_t value, uint64_t size) :
+  LIEF::Symbol{name},
+  type_{type},
+  binding_{binding},
+  other_{other},
+  shndx_{shndx},
+  value_{value},
+  size_{size},
+  symbol_version_{nullptr}
+{}
+
+
+SYMBOL_TYPES Symbol::type(void) const {
+  return this->type_;
+}
+
+SYMBOL_BINDINGS Symbol::binding(void) const {
+  return this->binding_;
+}
+
+uint8_t Symbol::information(void) const {
+  return static_cast<uint8_t>((static_cast<uint8_t>(this->binding_) << 4) | (static_cast<uint8_t>(this->type_) & 0x0f));
+}
+
+uint8_t Symbol::other(void) const {
+  return this->other_;
+}
+
+uint16_t Symbol::section_idx(void) const {
+  return this->shndx();
+}
+
+Section& Symbol::section(void) {
+  if (this->section_ == nullptr) {
+    throw not_found("No section associated with this symbol");
+  } else {
+    return *this->section_;
+  }
+}
+
+uint64_t Symbol::value(void) const {
+  return this->value_;
+}
+
+uint64_t Symbol::size(void) const {
+  return this->size_;
+}
+
+uint16_t Symbol::shndx(void) const {
+  return this->shndx_;
+}
+
+
+bool Symbol::has_version(void) const {
+  return this->symbol_version_ != nullptr;
+}
+
+
+const SymbolVersion& Symbol::symbol_version(void) const {
+  if (this->symbol_version_ != nullptr) {
+    return *this->symbol_version_;
+  } else {
+    throw not_found("There is no symbol version associated with this symbol");
+  }
+}
+
+SymbolVersion& Symbol::symbol_version(void) {
+  return const_cast<SymbolVersion&>(static_cast<const Symbol*>(this)->symbol_version());
+}
+
+void Symbol::type(SYMBOL_TYPES type) {
+  this->type_ = type;
+}
+
+void Symbol::binding(SYMBOL_BINDINGS binding) {
+  this->binding_ = binding;
+}
+
+void Symbol::other(uint8_t other) {
+  this->other_ = other;
+}
+
+void Symbol::value(uint64_t value) {
+  this->value_ = value;
+}
+
+void Symbol::size(uint64_t size) {
+  this->size_ = size;
+}
+
+
+void Symbol::shndx(uint16_t idx) {
+  this->shndx_ = idx;
+}
+
+
+void Symbol::information(uint8_t info) {
+  this->binding_ = static_cast<SYMBOL_BINDINGS>(info >> 4);
+  this->type_    = static_cast<SYMBOL_TYPES>(info & 0x0f);
+}
+
+
+std::string Symbol::demangled_name(void) const {
+#if defined(__unix__)
+  int status;
+  const std::string& name = this->name().c_str();
+  auto realname = abi::__cxa_demangle(name.c_str(), 0, 0, &status);
+
+  if (status == 0) {
+    return realname;
+  } else {
+    return name;
+  }
+#else
+  throw not_supported("Can't demangle name");
+#endif
+}
+
+void Symbol::accept(Visitor& visitor) const {
+
+  LIEF::Symbol::accept(visitor);
+
+  visitor.visit(this->type());
+  visitor.visit(this->binding());
+  visitor.visit(this->information());
+  visitor.visit(this->other());
+  visitor.visit(this->section_idx());
+  visitor.visit(this->value());
+  visitor.visit(this->size());
+
+  if(this->has_version()) {
+    visitor(this->symbol_version());
+  }
+}
+
+bool Symbol::operator==(const Symbol& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Symbol::operator!=(const Symbol& rhs) const {
+  return not (*this == rhs);
+}
+
+
+
+std::ostream& operator<<(std::ostream& os, const Symbol& entry) {
+
+  std::string name;
+  try {
+    name = entry.demangled_name();
+  } catch (const not_supported&) {
+    name = entry.name();
+  }
+  os << std::hex;
+  os << std::left
+     << std::setw(30) << name
+     << std::setw(10) << to_string(entry.type())
+     << std::setw(10) << to_string(entry.binding())
+     << std::setw(10) << entry.value()
+     << std::setw(10) << entry.size();
+
+  if (entry.has_version()) {
+    os << std::setw(10) << entry.symbol_version();
+  }
+
+  return os;
+}
+}
+}
diff --git a/src/ELF/SymbolVersion.cpp b/src/ELF/SymbolVersion.cpp
new file mode 100644
index 0000000..7abe6b2
--- /dev/null
+++ b/src/ELF/SymbolVersion.cpp
@@ -0,0 +1,105 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/exception.hpp"
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/SymbolVersion.hpp"
+
+
+namespace LIEF {
+namespace ELF {
+
+SymbolVersion::SymbolVersion(void) :
+  value_{0},
+  symbol_aux_{nullptr}
+{}
+
+SymbolVersion::~SymbolVersion(void) = default;
+
+SymbolVersion& SymbolVersion::operator=(const SymbolVersion& copy) = default;
+
+SymbolVersion::SymbolVersion(const SymbolVersion& copy) = default;
+
+SymbolVersion::SymbolVersion(uint16_t value) :
+  value_{value},
+  symbol_aux_{nullptr}
+{}
+
+uint16_t SymbolVersion::value(void) const {
+  return this->value_;
+}
+
+
+bool SymbolVersion::has_auxiliary_version(void) const {
+  return this->symbol_aux_ != nullptr;
+}
+
+const SymbolVersionAux& SymbolVersion::symbol_version_auxiliary(void) const {
+  if (this->symbol_aux_ != nullptr) {
+    return *this->symbol_aux_;
+  } else {
+    throw not_found("No auxiliary symbol associated with this version");
+  }
+
+}
+
+SymbolVersionAux& SymbolVersion::symbol_version_auxiliary(void) {
+  return const_cast<SymbolVersionAux&>(static_cast<const SymbolVersion*>(this)->symbol_version_auxiliary());
+}
+
+void SymbolVersion::value(uint16_t value) {
+  this->value_ = value;
+}
+
+void SymbolVersion::accept(Visitor& visitor) const {
+  visitor.visit(this->value());
+
+  if (this->has_auxiliary_version()) {
+    visitor(this->symbol_version_auxiliary());
+  }
+}
+
+bool SymbolVersion::operator==(const SymbolVersion& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool SymbolVersion::operator!=(const SymbolVersion& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const ELF::SymbolVersion& symv) {
+  if (symv.has_auxiliary_version()) {
+    os << symv.symbol_version_auxiliary().name() << "(" << symv.value() << ")";
+  } else {
+    std::string type;
+    if (symv.value() == 0) {
+      type = "* Local *";
+    } else if (symv.value() == 1){
+      type = "* Global *";
+    } else {
+      type = "* ERROR (" + std::to_string(symv.value()) + ") *";
+    }
+    os << type;
+  }
+
+  return os;
+}
+}
+}
diff --git a/src/ELF/SymbolVersionAux.cpp b/src/ELF/SymbolVersionAux.cpp
new file mode 100644
index 0000000..5c8e776
--- /dev/null
+++ b/src/ELF/SymbolVersionAux.cpp
@@ -0,0 +1,64 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/SymbolVersionAux.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+SymbolVersionAux::~SymbolVersionAux(void) = default;
+SymbolVersionAux& SymbolVersionAux::operator=(const SymbolVersionAux&) = default;
+SymbolVersionAux::SymbolVersionAux(const SymbolVersionAux&) = default;
+
+SymbolVersionAux::SymbolVersionAux(void) :
+  name_{""}
+{}
+
+SymbolVersionAux::SymbolVersionAux(const std::string& name) :
+  name_{name}
+{}
+
+const std::string& SymbolVersionAux::name(void) const {
+  return this->name_;
+}
+
+void SymbolVersionAux::name(const std::string& name) {
+  this->name_ = name;
+}
+
+void SymbolVersionAux::accept(Visitor& visitor) const {
+  visitor.visit(this->name());
+}
+
+bool SymbolVersionAux::operator==(const SymbolVersionAux& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool SymbolVersionAux::operator!=(const SymbolVersionAux& rhs) const {
+  return not (*this == rhs);
+}
+
+
+
+std::ostream& operator<<(std::ostream& os, const SymbolVersionAux& symAux) {
+  os << symAux.name();
+  return os;
+}
+}
+}
diff --git a/src/ELF/SymbolVersionAuxRequirement.cpp b/src/ELF/SymbolVersionAuxRequirement.cpp
new file mode 100644
index 0000000..0f7d353
--- /dev/null
+++ b/src/ELF/SymbolVersionAuxRequirement.cpp
@@ -0,0 +1,101 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/SymbolVersionAuxRequirement.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+SymbolVersionAuxRequirement::SymbolVersionAuxRequirement(void) :
+  hash_{0},
+  flags_{0},
+  other_{0}
+{}
+
+SymbolVersionAuxRequirement::~SymbolVersionAuxRequirement(void) = default;
+SymbolVersionAuxRequirement& SymbolVersionAuxRequirement::operator=(const SymbolVersionAuxRequirement&) = default;
+SymbolVersionAuxRequirement::SymbolVersionAuxRequirement(const SymbolVersionAuxRequirement&) = default;
+
+
+SymbolVersionAuxRequirement::SymbolVersionAuxRequirement(const Elf64_Vernaux* header) :
+  hash_{header->vna_hash},
+  flags_{header->vna_flags},
+  other_{header->vna_other}
+{}
+
+
+SymbolVersionAuxRequirement::SymbolVersionAuxRequirement(const Elf32_Vernaux* header) :
+  hash_{header->vna_hash},
+  flags_{header->vna_flags},
+  other_{header->vna_other}
+{}
+
+
+uint32_t SymbolVersionAuxRequirement::hash(void) const {
+  return this->hash_;
+}
+
+
+uint16_t SymbolVersionAuxRequirement::flags(void) const {
+  return this->flags_;
+}
+
+
+uint16_t SymbolVersionAuxRequirement::other(void) const {
+  return this->other_;
+}
+
+
+void SymbolVersionAuxRequirement::hash(uint32_t hash) {
+  this->hash_ = hash;
+}
+
+
+void SymbolVersionAuxRequirement::flags(uint16_t flags) {
+  this->flags_ = flags;
+}
+
+
+void SymbolVersionAuxRequirement::other(uint16_t other) {
+  this->other_ = other;
+}
+
+void SymbolVersionAuxRequirement::accept(Visitor& visitor) const {
+  visitor.visit(this->hash());
+  visitor.visit(this->flags());
+  visitor.visit(this->other());
+
+}
+
+bool SymbolVersionAuxRequirement::operator==(const SymbolVersionAuxRequirement& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool SymbolVersionAuxRequirement::operator!=(const SymbolVersionAuxRequirement& rhs) const {
+  return not (*this == rhs);
+}
+
+
+
+std::ostream& operator<<(std::ostream& os, const SymbolVersionAuxRequirement& symAux) {
+  os << symAux.name();
+  return os;
+}
+}
+}
diff --git a/src/ELF/SymbolVersionDefinition.cpp b/src/ELF/SymbolVersionDefinition.cpp
new file mode 100644
index 0000000..9798812
--- /dev/null
+++ b/src/ELF/SymbolVersionDefinition.cpp
@@ -0,0 +1,156 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <iomanip>
+#include <algorithm>
+#include <iterator>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/SymbolVersionDefinition.hpp"
+#include "LIEF/ELF/SymbolVersionAuxRequirement.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+SymbolVersionDefinition::SymbolVersionDefinition(void) :
+  version_{1},
+  flags_{0},
+  ndx_{0},
+  hash_{0},
+  symbol_version_aux_{}
+{}
+
+SymbolVersionDefinition::SymbolVersionDefinition(const Elf64_Verdef *header) :
+  version_{header->vd_version},
+  flags_{header->vd_flags},
+  ndx_{header->vd_ndx},
+  hash_{header->vd_hash},
+  symbol_version_aux_{}
+{}
+
+SymbolVersionDefinition::SymbolVersionDefinition(const Elf32_Verdef *header) :
+  version_{header->vd_version},
+  flags_{header->vd_flags},
+  ndx_{header->vd_ndx},
+  hash_{header->vd_hash},
+  symbol_version_aux_{}
+{}
+
+
+SymbolVersionDefinition::SymbolVersionDefinition(const SymbolVersionDefinition& other) :
+  Visitable{other},
+  version_{other.version_},
+  flags_{other.flags_},
+  ndx_{other.ndx_},
+  hash_{other.hash_},
+  symbol_version_aux_{}
+{
+  this->symbol_version_aux_.reserve(other.symbol_version_aux_.size());
+  for (const SymbolVersionAux* aux : other.symbol_version_aux_) {
+    this->symbol_version_aux_.push_back(new SymbolVersionAux{*aux});
+  }
+}
+
+SymbolVersionDefinition& SymbolVersionDefinition::operator=(SymbolVersionDefinition other) {
+  this->swap(other);
+  return *this;
+}
+
+SymbolVersionDefinition::~SymbolVersionDefinition(void) {
+  for (SymbolVersionAux* sva : this->symbol_version_aux_) {
+    delete sva;
+  }
+}
+
+void SymbolVersionDefinition::swap(SymbolVersionDefinition& other) {
+  std::swap(this->version_,            other.version_);
+  std::swap(this->flags_,              other.flags_);
+  std::swap(this->ndx_,                other.ndx_);
+  std::swap(this->hash_,               other.hash_);
+  std::swap(this->symbol_version_aux_, other.symbol_version_aux_);
+}
+
+
+uint16_t SymbolVersionDefinition::version(void) const {
+  return this->version_;
+}
+
+uint16_t SymbolVersionDefinition::flags(void) const {
+  return this->flags_;
+}
+
+uint16_t SymbolVersionDefinition::ndx(void) const {
+  return this->ndx_;
+}
+
+uint32_t SymbolVersionDefinition::hash(void) const {
+  return this->hash_;
+}
+
+it_symbols_version_aux SymbolVersionDefinition::symbols_aux(void) {
+  return it_symbols_version_aux{this->symbol_version_aux_};
+}
+
+it_const_symbols_version_aux SymbolVersionDefinition::symbols_aux(void) const {
+  return it_const_symbols_version_aux{this->symbol_version_aux_};
+
+}
+
+void SymbolVersionDefinition::version(uint16_t version) {
+  this->version_ = version;
+}
+
+void SymbolVersionDefinition::flags(uint16_t flags) {
+  this->flags_ = flags;
+}
+
+void SymbolVersionDefinition::hash(uint32_t hash) {
+  this->hash_ = hash;
+}
+
+void SymbolVersionDefinition::accept(Visitor& visitor) const {
+  visitor.visit(this->version());
+  visitor.visit(this->flags());
+  visitor.visit(this->ndx());
+  visitor.visit(this->hash());
+  for (const SymbolVersionAux& sva : this->symbols_aux()) {
+    visitor(sva);
+  }
+}
+
+
+bool SymbolVersionDefinition::operator==(const SymbolVersionDefinition& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool SymbolVersionDefinition::operator!=(const SymbolVersionDefinition& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const SymbolVersionDefinition& sym) {
+  os << std::hex << std::left;
+  os << std::setw(10) << sym.version();
+  os << std::setw(10) << sym.flags();
+  os << std::setw(10) << sym.ndx();
+  os << std::setw(10) << sym.hash();
+
+  return os;
+}
+}
+}
diff --git a/src/ELF/SymbolVersionRequirement.cpp b/src/ELF/SymbolVersionRequirement.cpp
new file mode 100644
index 0000000..2a972b2
--- /dev/null
+++ b/src/ELF/SymbolVersionRequirement.cpp
@@ -0,0 +1,140 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <iterator>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/ELF/SymbolVersionRequirement.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+SymbolVersionRequirement::SymbolVersionRequirement(void) :
+  symbol_version_aux_requirement_{},
+  version_{0},
+  name_{""}
+{}
+
+
+SymbolVersionRequirement::~SymbolVersionRequirement(void) {
+  for (SymbolVersionAuxRequirement* svar : this->symbol_version_aux_requirement_) {
+    delete svar;
+  }
+}
+
+
+SymbolVersionRequirement::SymbolVersionRequirement(const Elf64_Verneed *header) :
+  symbol_version_aux_requirement_{},
+  version_{header->vn_version},
+  name_{""}
+{}
+
+SymbolVersionRequirement::SymbolVersionRequirement(const Elf32_Verneed *header)  :
+  symbol_version_aux_requirement_{},
+  version_{header->vn_version},
+  name_{""}
+{}
+
+
+SymbolVersionRequirement::SymbolVersionRequirement(const SymbolVersionRequirement& other) :
+  Visitable{other},
+  version_{other.version_},
+  name_{other.name_}
+{
+  symbol_version_aux_requirement_.reserve(other.symbol_version_aux_requirement_.size());
+  for (const SymbolVersionAuxRequirement* aux : other.symbol_version_aux_requirement_) {
+    this->symbol_version_aux_requirement_.push_back(new SymbolVersionAuxRequirement{*aux});
+  }
+}
+
+
+SymbolVersionRequirement& SymbolVersionRequirement::operator=(SymbolVersionRequirement other) {
+  this->swap(other);
+  return *this;
+}
+
+void SymbolVersionRequirement::swap(SymbolVersionRequirement& other) {
+  std::swap(this->symbol_version_aux_requirement_, other.symbol_version_aux_requirement_);
+  std::swap(this->version_,                        other.version_);
+  std::swap(this->name_,                           other.name_);
+}
+
+
+uint16_t SymbolVersionRequirement::version(void) const {
+  return this->version_;
+}
+
+
+uint32_t SymbolVersionRequirement::cnt(void) const {
+  return static_cast<uint32_t>(this->symbol_version_aux_requirement_.size());
+}
+
+
+it_symbols_version_aux_requirement SymbolVersionRequirement::get_auxiliary_symbols(void) {
+  return {this->symbol_version_aux_requirement_};
+}
+
+
+it_const_symbols_version_aux_requirement SymbolVersionRequirement::get_auxiliary_symbols(void) const {
+  return {this->symbol_version_aux_requirement_};
+}
+
+
+const std::string& SymbolVersionRequirement::name(void) const {
+  return this->name_;
+}
+
+
+void SymbolVersionRequirement::version(uint16_t version) {
+  this->version_ = version;
+}
+
+
+void SymbolVersionRequirement::name(const std::string& name) {
+  this->name_ = name;
+}
+
+
+void SymbolVersionRequirement::accept(Visitor& visitor) const {
+  visitor.visit(this->version());
+  visitor.visit(this->cnt());
+  visitor.visit(this->name());
+
+  for (const SymbolVersionAuxRequirement& svar : this->get_auxiliary_symbols()) {
+    visitor(svar);
+  }
+}
+
+bool SymbolVersionRequirement::operator==(const SymbolVersionRequirement& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool SymbolVersionRequirement::operator!=(const SymbolVersionRequirement& rhs) const {
+  return not (*this == rhs);
+}
+
+
+
+std::ostream& operator<<(std::ostream& os, const SymbolVersionRequirement& symr) {
+  os << symr.version() << " " << symr.name();
+
+  return os;
+}
+}
+}
diff --git a/src/ELF/utils.cpp b/src/ELF/utils.cpp
new file mode 100644
index 0000000..c060249
--- /dev/null
+++ b/src/ELF/utils.cpp
@@ -0,0 +1,88 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <fstream>
+#include <iterator>
+#include <stdexcept>
+#include <vector>
+
+#include "LIEF/exception.hpp"
+
+#include "LIEF/ELF/utils.hpp"
+#include "LIEF/ELF/Structures.hpp"
+
+namespace LIEF {
+namespace ELF {
+
+bool is_elf(const std::string& file) {
+  std::ifstream binary(file, std::ios::in | std::ios::binary);
+  if (not binary) {
+    throw bad_file("Unable to open the file");
+  }
+  char magic[sizeof(ElfMagic)];
+
+  binary.seekg(0, std::ios::beg);
+  binary.read(magic, sizeof(magic));
+  return std::equal(std::begin(magic), std::end(magic), std::begin(ElfMagic));
+}
+
+//! SYSV hash function
+unsigned long hash32(const char* name) {
+  unsigned long h = 0, g;
+  while (*name) {
+    h = (h << 4) + *name++;
+    if ((g = h & 0xf0000000)) {
+      h ^= g >> 24;
+    }
+    h &= ~g;
+  }
+  return h;
+}
+
+//! SYSV hash function
+//! https://blogs.oracle.com/ali/entry/gnu_hash_elf_sections
+unsigned long hash64(const char* name) {
+  unsigned long h = 0, g;
+  while (*name) {
+    h = (h << 4) + *name++;
+    if ((g = h & 0xf0000000)) {
+      h ^= g >> 24;
+    }
+    h &= 0x0fffffff;
+  }
+  return h;
+}
+
+uint32_t dl_new_hash(const char* name) {
+  uint32_t h = 5381;
+
+  for (unsigned char c = *name; c != '\0'; c = *++name) {
+    h = h * 33 + c;
+  }
+
+  return h & 0xffffffff;
+}
+
+
+
+} // namespace ELF
+} // namespace LIEF
+
+
+
+
+
+
diff --git a/src/MachO/Binary.cpp b/src/MachO/Binary.cpp
new file mode 100644
index 0000000..e879bb1
--- /dev/null
+++ b/src/MachO/Binary.cpp
@@ -0,0 +1,541 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "easylogging++.h"
+
+#include "LIEF/MachO/Binary.hpp"
+#include "LIEF/MachO/Builder.hpp"
+
+#include "LIEF/exception.hpp"
+
+#include <algorithm>
+#include <numeric>
+
+#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
+#include <unistd.h>
+#else
+#define getpagesize() 0x1000
+#endif
+
+namespace LIEF {
+namespace MachO {
+
+Binary::Binary(void) = default;
+
+LIEF::sections_t Binary::get_abstract_sections(void) {
+  LIEF::sections_t result;
+  it_sections sections = this->sections();
+  std::transform(
+      std::begin(sections),
+      std::end(sections),
+      std::back_inserter(result),
+      [] (Section& s) {
+       return &s;
+      });
+
+  return result;
+}
+// LIEF Interface
+// ==============
+
+void Binary::patch_address(uint64_t address, const std::vector<uint8_t>& patch_value) {
+  // Find the segment associated with the virtual address
+  SegmentCommand& segment_topatch = this->segment_from_virtual_address(address);
+  const uint64_t offset = address - segment_topatch.virtual_address();
+  std::vector<uint8_t> content = segment_topatch.content();
+  std::copy(
+      std::begin(patch_value),
+      std::end(patch_value),
+      content.data() + offset);
+  segment_topatch.content(content);
+
+}
+
+void Binary::patch_address(uint64_t address, uint64_t patch_value, size_t size) {
+  if (size > sizeof(patch_value)) {
+    throw std::runtime_error("Invalid size (" + std::to_string(size) + ")");
+  }
+
+  SegmentCommand& segment_topatch = this->segment_from_virtual_address(address);
+  const uint64_t offset = address - segment_topatch.virtual_address();
+  std::vector<uint8_t> content = segment_topatch.content();
+
+  std::copy(
+      reinterpret_cast<uint8_t*>(&patch_value),
+      reinterpret_cast<uint8_t*>(&patch_value) + size,
+      content.data() + offset);
+  segment_topatch.content(content);
+
+}
+
+std::vector<uint8_t> Binary::get_content_from_virtual_address(uint64_t virtual_address, uint64_t size) const {
+  const SegmentCommand& segment = this->segment_from_virtual_address(virtual_address);
+  const std::vector<uint8_t>& content = segment.content();
+  const uint64_t offset = virtual_address - segment.virtual_address();
+  uint64_t checked_size = size;
+  if ((offset + checked_size) > content.size()) {
+    checked_size = checked_size - (offset + checked_size - content.size());
+  }
+
+  return {content.data() + offset, content.data() + offset + checked_size};
+}
+
+
+uint64_t Binary::entrypoint(void) const {
+  // TODO: LC_THREAD
+  auto&& it_main_command = std::find_if(
+      std::begin(this->commands_),
+      std::end(this->commands_),
+      [] (const LoadCommand* command) {
+        return command != nullptr and command->command() == LOAD_COMMAND_TYPES::LC_MAIN;
+      });
+
+  if (it_main_command == std::end(this->commands_)) {
+    throw not_found("Entrypoint not found");
+  }
+
+  const MainCommand* main_command = static_cast<const MainCommand*>(*it_main_command);
+  return this->imagebase() + main_command->entrypoint();
+}
+
+LIEF::symbols_t Binary::get_abstract_symbols(void) {
+  return {std::begin(this->symbols_), std::end(this->symbols_)};
+}
+
+
+std::vector<std::string> Binary::get_abstract_exported_functions(void) const {
+  std::vector<std::string> result;
+  it_const_exported_symbols syms = this->get_exported_symbols();
+  std::transform(
+      std::begin(syms),
+      std::end(syms),
+      std::back_inserter(result),
+      [] (const Symbol& s) {
+        return s.name();
+      });
+  return result;
+}
+
+std::vector<std::string> Binary::get_abstract_imported_functions(void) const {
+  std::vector<std::string> result;
+  it_const_imported_symbols syms = this->get_imported_symbols();
+  std::transform(
+      std::begin(syms),
+      std::end(syms),
+      std::back_inserter(result),
+      [] (const Symbol& s) {
+      return s.name();
+      });
+  return result;
+}
+
+
+std::vector<std::string> Binary::get_abstract_imported_libraries(void) const {
+  std::vector<std::string> result;
+  for (const DylibCommand& lib : this->libraries()) {
+    result.push_back(lib.name());
+  }
+  return result;
+}
+
+
+const Header& Binary::header(void) const {
+  return this->header_;
+}
+
+Header& Binary::header(void) {
+  return const_cast<Header&>(static_cast<const Binary*>(this)->header());
+}
+
+// Commands
+// ========
+
+it_commands Binary::commands(void) {
+  return it_commands{std::ref(this->commands_)};
+}
+
+it_const_commands Binary::commands(void) const {
+  return it_const_commands{std::cref(this->commands_)};
+}
+
+// Symbols
+// =======
+
+it_symbols Binary::symbols(void) {
+  return it_symbols{std::ref(this->symbols_)};
+}
+
+it_const_symbols Binary::symbols(void) const {
+  return it_const_symbols{std::cref(this->symbols_)};
+}
+
+it_libraries Binary::libraries(void) {
+  libraries_t result;
+
+  for (LoadCommand* library: this->commands_) {
+    if (dynamic_cast<DylibCommand*>(library)) {
+      result.push_back(dynamic_cast<DylibCommand*>(library));
+    }
+  }
+  return it_libraries{result};
+}
+
+it_const_libraries Binary::libraries(void) const {
+
+  libraries_t result;
+
+  for (LoadCommand* library: this->commands_) {
+    if (dynamic_cast<DylibCommand*>(library)) {
+      result.push_back(dynamic_cast<DylibCommand*>(library));
+    }
+  }
+  return it_const_libraries{result};
+}
+
+//! @brief Return binary's @link MachO::SegmentCommand segments @endlink
+it_segments Binary::segments(void) {
+  segments_t result{};
+
+  for (LoadCommand* cmd: this->commands_) {
+    if (dynamic_cast<SegmentCommand*>(cmd)) {
+      result.push_back(dynamic_cast<SegmentCommand*>(cmd));
+    }
+  }
+  return it_segments{result};
+}
+
+it_const_segments Binary::segments(void) const {
+  segments_t result{};
+
+  for (LoadCommand* cmd: this->commands_) {
+    if (dynamic_cast<SegmentCommand*>(cmd)) {
+      result.push_back(dynamic_cast<SegmentCommand*>(cmd));
+    }
+  }
+  return it_const_segments{result};
+}
+
+//! @brief Return binary's @link MachO::Section sections @endlink
+it_sections Binary::sections(void) {
+  sections_t result;
+  for (SegmentCommand& segment : this->segments()) {
+    for (Section& s: segment.sections()) {
+      result.push_back(&s);
+    }
+  }
+  return it_sections{result};
+}
+
+it_const_sections Binary::sections(void) const {
+  sections_t result;
+  for (const SegmentCommand& segment : this->segments()) {
+    for (const Section& s: segment.sections()) {
+      result.push_back(const_cast<Section*>(&s));
+    }
+  }
+  return it_const_sections{result};
+}
+
+bool Binary::is_exported(const Symbol& symbol) {
+  return not symbol.is_external();
+}
+
+it_exported_symbols Binary::get_exported_symbols(void) {
+  return filter_iterator<symbols_t>{std::ref(this->symbols_),
+    [] (const Symbol* symbol) { return is_exported(*symbol); }
+  };
+}
+
+
+it_const_exported_symbols Binary::get_exported_symbols(void) const {
+  return const_filter_iterator<symbols_t>{std::cref(this->symbols_),
+    [] (const Symbol* symbol) { return is_exported(*symbol); }
+  };
+}
+
+
+bool Binary::is_imported(const Symbol& symbol) {
+  return symbol.is_external();
+}
+
+it_imported_symbols Binary::get_imported_symbols(void) {
+  return filter_iterator<symbols_t>{std::ref(this->symbols_),
+    [] (const Symbol* symbol) { return is_imported(*symbol); }
+  };
+}
+
+
+it_const_imported_symbols Binary::get_imported_symbols(void) const {
+  return const_filter_iterator<symbols_t>{std::cref(this->symbols_),
+    [] (const Symbol* symbol) { return is_imported(*symbol); }
+  };
+}
+
+// =====
+
+
+void Binary::write(const std::string& filename) {
+  Builder::write(this, filename);
+}
+
+
+const Section& Binary::section_from_offset(uint64_t offset) const {
+  it_const_sections sections = this->sections();
+  auto&& it_section = std::find_if(
+      sections.cbegin(),
+      sections.cend(),
+      [&offset] (const Section& section) {
+        return ((section.offset() <= offset) and
+            offset < (section.offset() + section.size()));
+      });
+
+  if (it_section == sections.cend()) {
+    throw not_found("Unable to find the section");
+  }
+
+  return *it_section;
+}
+
+Section& Binary::section_from_offset(uint64_t offset) {
+  return const_cast<Section&>(static_cast<const Binary*>(this)->section_from_offset(offset));
+}
+
+const SegmentCommand& Binary::segment_from_virtual_address(uint64_t virtual_address) const {
+  it_const_segments segments = this->segments();
+  auto&& it_segment = std::find_if(
+      segments.cbegin(),
+      segments.cend(),
+      [&virtual_address] (const SegmentCommand& segment) {
+        return ((segment.virtual_address() <= virtual_address) and
+            virtual_address < (segment.virtual_address() + segment.virtual_size()));
+      });
+
+  if (it_segment == segments.cend()) {
+    throw not_found("Unable to find the section");
+  }
+
+  return *it_segment;
+}
+
+SegmentCommand& Binary::segment_from_virtual_address(uint64_t virtual_address) {
+  return const_cast<SegmentCommand&>(static_cast<const Binary*>(this)->segment_from_virtual_address(virtual_address));
+}
+
+const SegmentCommand& Binary::segment_from_offset(uint64_t offset) const {
+  it_const_segments segments = this->segments();
+  auto&& it_segment = std::find_if(
+      segments.cbegin(),
+      segments.cend(),
+      [&offset] (const SegmentCommand& segment) {
+        return ((segment.file_offset() <= offset) and
+            offset <= (segment.file_offset() + segment.file_size()));
+      });
+
+  if (it_segment == segments.cend()) {
+    throw not_found("Unable to find the section");
+  }
+
+  return *it_segment;
+}
+
+SegmentCommand& Binary::segment_from_offset(uint64_t offset) {
+  return const_cast<SegmentCommand&>(static_cast<const Binary*>(this)->segment_from_offset(offset));
+}
+
+
+
+LoadCommand& Binary::insert_command(const LoadCommand& command) {
+  LOG(DEBUG) << "Insert command" << std::endl;
+
+  //this->header().nb_cmds(this->header().nb_cmds() + 1);
+
+  //const uint32_t sizeof_header = this->is64_ ? sizeof(mach_header_64) : sizeof(mach_header);
+
+
+  ////align
+  //if (dynamic_cast<const SegmentCommand*>(&command) != nullptr) {
+  //  const SegmentCommand& segment = dynamic_cast<const SegmentCommand&>(command);
+  //  const uint64_t psize = static_cast<uint64_t>(getpagesize());
+  //  if ((segment.file_offset() % psize) > 0) {
+  //    uint64_t offset_aligned = segment.file_offset() + (psize - segment.file_offset() % psize);
+  //    segment.file_offset(offset_aligned);
+  //  }
+  //}
+
+  //// Find last offset
+  //uint64_t last_offset = std::accumulate(
+  //    std::begin(this->commands_),
+  //    std::end(this->commands_),
+  //    sizeof_header,
+  //    [] (uint32_t x, const LoadCommand* cmd) {
+  //      return x + cmd->size();
+  //    });
+
+
+  //LOG(DEBUG) << "Last offset: %x", last_offset << std::endl;
+  //command.command_offset(last_offset);
+  //this->header().sizeof_cmds(this->header().sizeof_cmds() + command.size());
+  //this->commands_.push_back(command);
+  return *this->commands_.back();
+
+}
+
+std::vector<uint8_t> Binary::raw(void) {
+  Builder builder{this};
+  return builder.get_build();
+}
+
+uint64_t Binary::virtual_address_to_offset(uint64_t virtualAddress) const {
+
+  it_const_segments segments = this->segments();
+  auto&& it_segment = std::find_if(
+      segments.cbegin(),
+      segments.cend(),
+      [virtualAddress] (const SegmentCommand& segment)
+      {
+      return (
+          segment.virtual_address() <= virtualAddress and
+          segment.virtual_address() + segment.virtual_size() >= virtualAddress
+          );
+      });
+
+  if (it_segment == segments.cend()) {
+    throw conversion_error("Unable to convert virtual address to offset");
+  }
+  uint64_t baseAddress = (*it_segment).virtual_address() - (*it_segment).file_offset();
+  uint64_t offset      = virtualAddress - baseAddress;
+
+  return offset;
+}
+
+
+bool Binary::disable_pie(void) {
+  if (this->header().has_flag(HEADER_FLAGS::MH_PIE)) {
+    this->header().remove_flag(HEADER_FLAGS::MH_PIE);
+    return true;
+  }
+  return false;
+}
+
+
+uint64_t Binary::imagebase(void) const {
+  it_const_segments segments = this->segments();
+  auto&& it_text_segment = std::find_if(
+      std::begin(segments),
+      std::end(segments),
+      [] (const SegmentCommand& segment) {
+        return segment.name() == "__TEXT";
+      });
+
+  if (it_text_segment == segments.cend()) {
+    throw LIEF::not_found("Unable to find __TEXT");
+  }
+
+  return it_text_segment->virtual_address();
+}
+
+
+const std::string& Binary::get_loader(void) const {
+  auto itDylinker = std::find_if(
+      std::begin(this->commands_),
+      std::end(this->commands_),
+      [] (const LoadCommand* command) {
+        return command->command() == LOAD_COMMAND_TYPES::LC_LOAD_DYLINKER;
+      });
+
+  if (itDylinker == std::end(this->commands_)) {
+    throw LIEF::not_found("LC_LOAD_DYLINKER no found");
+  }
+
+  const DylinkerCommand* dylinkerCommand = dynamic_cast<const DylinkerCommand*>(*itDylinker);
+  return dylinkerCommand->name();
+
+}
+
+
+LIEF::Header Binary::get_abstract_header(void) const {
+  LIEF::Header header;
+  const std::pair<ARCHITECTURES, std::set<MODES>>& am = this->header().abstract_architecture();
+  header.architecture(am.first);
+  header.modes(am.second);
+  header.entrypoint(this->entrypoint());
+
+  return header;
+}
+
+
+void Binary::accept(LIEF::Visitor& visitor) const {
+  visitor(this->header());
+  for (const LoadCommand& cmd : this->commands()) {
+    visitor(cmd);
+  }
+
+  for (const Symbol& symbol : this->symbols()) {
+    visitor(symbol);
+  }
+}
+
+
+Binary::~Binary(void) {
+  for (LoadCommand *cmd : this->commands_) {
+    delete cmd;
+  }
+
+  for (Symbol *symbol : this->symbols_) {
+    delete symbol;
+  }
+
+}
+
+
+std::ostream& Binary::print(std::ostream& os) const {
+  os << "Header" << std::endl;
+  os << "======" << std::endl;
+
+  os << this->header();
+  os << std::endl;
+
+
+  os << "Commands" << std::endl;
+  os << "========" << std::endl;
+  for (const LoadCommand& cmd : this->commands()) {
+    os << cmd << std::endl;
+  }
+
+  os << std::endl;
+
+  os << "Sections" << std::endl;
+  os << "========" << std::endl;
+  for (const Section& section : this->sections()) {
+    os << section << std::endl;
+  }
+
+  os << std::endl;
+
+
+  os << "Symbols" << std::endl;
+  os << "=======" << std::endl;
+  for (const Symbol& symbol : this->symbols()) {
+    os << symbol << std::endl;
+  }
+
+  os << std::endl;
+  return os;
+}
+
+}
+}
+
diff --git a/src/MachO/BinaryParser.cpp b/src/MachO/BinaryParser.cpp
new file mode 100644
index 0000000..fc620de
--- /dev/null
+++ b/src/MachO/BinaryParser.cpp
@@ -0,0 +1,128 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <fstream>
+#include <iterator>
+#include <iostream>
+#include <algorithm>
+#include <regex>
+#include <stdexcept>
+#include <functional>
+
+
+#include "LIEF/BinaryStream/VectorStream.hpp"
+#include "LIEF/filesystem/filesystem.h"
+#include "LIEF/exception.hpp"
+
+
+#include "LIEF/MachO/BinaryParser.hpp"
+#include "BinaryParser.tcc"
+
+#include "LIEF/MachO/utils.hpp"
+#include "LIEF/MachO/Header.hpp"
+#include "LIEF/MachO/LoadCommand.hpp"
+#include "LIEF/MachO/SegmentCommand.hpp"
+#include "LIEF/MachO/Section.hpp"
+#include "LIEF/MachO/UUIDCommand.hpp"
+#include "LIEF/MachO/SymbolCommand.hpp"
+#include "LIEF/MachO/Symbol.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+BinaryParser::BinaryParser(void) = default;
+BinaryParser::~BinaryParser(void) = default;
+
+BinaryParser::BinaryParser(const std::vector<uint8_t>& data) :
+  stream_{new VectorStream{data}}
+{
+
+  this->binary_ = new Binary{};
+  this->parse();
+}
+
+
+BinaryParser::BinaryParser(std::unique_ptr<VectorStream>&& stream) :
+  stream_{std::move(stream)}
+{
+
+  this->binary_ = new Binary{};
+  this->parse();
+}
+
+BinaryParser::BinaryParser(const std::string& file) :
+  LIEF::Parser{file}
+{
+
+  if (not is_macho(file)) {
+    throw bad_file("'" + file + "' is not a MachO binary");
+  }
+
+
+  if (not is_fat(file)) {
+    throw bad_file("'" + file + "' is a FAT MachO, this parser takes fit binary");
+  }
+
+  this->stream_ = std::unique_ptr<VectorStream>(new VectorStream{file});
+
+  this->binary_ = new Binary{};
+  this->binary_->name_ = filesystem::path(file).filename();
+
+  this->parse();
+}
+
+
+void BinaryParser::parse(void) {
+  LOG(DEBUG) << "Parsing MachO" << std::endl;
+  MACHO_TYPES type = static_cast<MACHO_TYPES>(
+      *reinterpret_cast<const uint32_t*>(this->stream_->read(0, sizeof(uint32_t))));
+
+  if (type == MACHO_TYPES::MH_MAGIC_64 or
+      type == MACHO_TYPES::MH_CIGAM_64 )
+  {
+    this->is64_ = true;
+  }
+  else
+  {
+    this->is64_ = false;
+  }
+
+  this->binary_->is64_ = this->is64_;
+  this->type_          = type;
+
+  if (this->is64_) {
+    this->parse_header<MachO64>();
+    if (this->binary_->header().nb_cmds() > 0) {
+      this->parse_load_commands<MachO64>();
+    }
+  } else {
+    this->parse_header<MachO32>();
+
+    if (this->binary_->header().nb_cmds() > 0) {
+      this->parse_load_commands<MachO32>();
+    }
+  }
+
+}
+
+
+Binary* BinaryParser::get_binary(void) {
+  return this->binary_;
+}
+
+
+} // namespace MachO
+} // namespace LIEF
diff --git a/src/MachO/BinaryParser.tcc b/src/MachO/BinaryParser.tcc
new file mode 100644
index 0000000..6ae64dc
--- /dev/null
+++ b/src/MachO/BinaryParser.tcc
@@ -0,0 +1,326 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "easylogging++.h"
+
+namespace LIEF {
+namespace MachO {
+
+
+template<class MACHO_T>
+void BinaryParser::parse_header(void) {
+  using header_t = typename MACHO_T::header;
+  this->binary_->header_ = {reinterpret_cast<const header_t*>(this->stream_->read(0, sizeof(header_t)))};
+}
+
+
+template<class MACHO_T>
+void BinaryParser::parse_load_commands(void) {
+  using header_t          = typename MACHO_T::header;
+  using segment_command_t = typename MACHO_T::segment_command;
+  using section_t         = typename MACHO_T::section;
+
+  LOG(DEBUG) << "[+] Building Load commands";
+  uint64_t loadcommands_offset = sizeof(header_t);
+
+  for (size_t i = 0; i < this->binary_->header().nb_cmds(); ++i) {
+    const load_command* command = reinterpret_cast<const load_command*>(
+        this->stream_->read(loadcommands_offset, sizeof(load_command)));
+
+    LoadCommand* load_command = nullptr;
+    switch (command->cmd) {
+
+      // ===============
+      // Segment command
+      // ===============
+      case LOAD_COMMAND_TYPES::LC_SEGMENT_64:
+      case LOAD_COMMAND_TYPES::LC_SEGMENT:
+        {
+          uint64_t local_offset = loadcommands_offset;
+          load_command = new SegmentCommand{
+                reinterpret_cast<const segment_command_t*>(
+                    this->stream_->read(loadcommands_offset, sizeof(segment_command_t)))};
+
+          local_offset += sizeof(segment_command_t);
+
+          SegmentCommand* segment = dynamic_cast<SegmentCommand*>(load_command);
+
+          const uint8_t* content = static_cast<const uint8_t*>(
+            this->stream_->read(segment->file_offset(), segment->file_size()));
+
+          segment->content({
+              content,
+              content + segment->file_size()
+              });
+
+          // --------
+          // Sections
+          // --------
+          for (size_t j = 0; j < segment->numberof_sections(); ++j) {
+            Section section{reinterpret_cast<const section_t*>(this->stream_->read(local_offset, sizeof(section_t)))};
+            section.segment_ = segment;
+            segment->sections_.push_back(std::move(section));
+            local_offset += sizeof(section_t);
+          }
+          break;
+        }
+
+
+      // =============
+      // DyLib Command
+      // =============
+      case LOAD_COMMAND_TYPES::LC_LOAD_WEAK_DYLIB:
+      case LOAD_COMMAND_TYPES::LC_ID_DYLIB:
+      case LOAD_COMMAND_TYPES::LC_LOAD_DYLIB:
+        {
+          const dylib_command* cmd =
+            reinterpret_cast<const dylib_command*>(
+              this->stream_->read(loadcommands_offset, sizeof(dylib_command)));
+
+          load_command = new DylibCommand{cmd};
+          const uint32_t str_name_offset = cmd->dylib.name;
+          std::string name = {this->stream_->read_string(loadcommands_offset + str_name_offset)};
+
+          dynamic_cast<DylibCommand*>(load_command)->name(name);
+          break;
+        }
+
+      // ====
+      // UUID
+      // ====
+      case LOAD_COMMAND_TYPES::LC_UUID:
+        {
+          LOG(DEBUG) << "[+] Building UUID";
+          const uuid_command* cmd =
+            reinterpret_cast<const uuid_command*>(
+              this->stream_->read(loadcommands_offset, sizeof(uuid_command)));
+          load_command = new UUIDCommand{cmd};
+          break;
+        }
+
+      // ==============
+      // Dynamic Linker
+      // ==============
+      case LOAD_COMMAND_TYPES::LC_LOAD_DYLINKER:
+      case LOAD_COMMAND_TYPES::LC_ID_DYLINKER:
+        {
+          const dylinker_command* cmd =
+            reinterpret_cast<const dylinker_command*>(
+              this->stream_->read(loadcommands_offset, sizeof(dylinker_command)));
+
+          const uint32_t linker_name_offset = cmd->name;
+          std::string name = {this->stream_->read_string(
+             loadcommands_offset +
+             linker_name_offset)};
+
+          load_command = new DylinkerCommand{cmd};
+          dynamic_cast<DylinkerCommand*>(load_command)->name(name);
+          break;
+        }
+
+      // ==============
+      // Prebound Dylib
+      // ==============
+      case LOAD_COMMAND_TYPES::LC_PREBOUND_DYLIB:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_PREBOUND_DYLIB";
+
+          load_command = new LoadCommand{command};
+          const prebound_dylib_command* cmd =
+            reinterpret_cast<const prebound_dylib_command*>(
+              this->stream_->read(loadcommands_offset, sizeof(prebound_dylib_command)));
+
+
+          std::string name = {this->stream_->read_string(
+             loadcommands_offset +
+             cmd->name)};
+
+          //uint32_t sizeof_linked_modules = (cmd->nmodules / 8) + (cmd->nmodules % 8);
+
+          break;
+        }
+
+      // ======
+      // Thread
+      // ======
+      case LOAD_COMMAND_TYPES::LC_THREAD:
+      case LOAD_COMMAND_TYPES::LC_UNIXTHREAD:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_THREAD";
+
+          load_command = new LoadCommand{command};
+          const thread_command* cmd =
+            reinterpret_cast<const thread_command*>(
+              this->stream_->read(loadcommands_offset, sizeof(thread_command)));
+
+          LOG(DEBUG) << "FLAVOR: " << cmd->flavor << std::endl
+                     << "COUNT:  " << cmd->count;
+          break;
+        }
+
+      // ===============
+      // Routine command
+      // ===============
+      case LOAD_COMMAND_TYPES::LC_ROUTINES:
+      case LOAD_COMMAND_TYPES::LC_ROUTINES_64:
+        {
+
+          LOG(DEBUG) << "[+] Parsing LC_ROUTINE";
+
+          load_command = new LoadCommand{command};
+          break;
+        }
+
+      // =============
+      // Symbols table
+      // =============
+      case LOAD_COMMAND_TYPES::LC_SYMTAB:
+        {
+          using nlist_t = typename MACHO_T::nlist;
+          LOG(DEBUG) << "[+] Parsing symbols";
+
+          const symtab_command* cmd =
+            reinterpret_cast<const symtab_command*>(
+              this->stream_->read(loadcommands_offset, sizeof(symtab_command)));
+
+
+          load_command = new SymbolCommand{cmd};
+
+
+          const nlist_t* nlist = reinterpret_cast<const nlist_t*>(
+              this->stream_->read(cmd->symoff, sizeof(nlist_t)));
+
+          for (size_t j = 0; j < cmd->nsyms; ++j) {
+            Symbol* symbol = new Symbol{&nlist[j]};
+            uint32_t idx = nlist[j].n_strx;
+            if (idx > 0) {
+              symbol->name(
+                  this->stream_->read_string(cmd->stroff + idx));
+            }
+            this->binary_->symbols_.push_back(symbol);
+          }
+
+          break;
+        }
+
+      // ===============
+      // Dynamic Symbols
+      // ===============
+      case LOAD_COMMAND_TYPES::LC_DYSYMTAB:
+        {
+          LOG(DEBUG) << "[+] Parsing dynamic symbols";
+          const dysymtab_command* cmd =
+            reinterpret_cast<const dysymtab_command*>(
+              this->stream_->read(loadcommands_offset, sizeof(dysymtab_command)));
+
+          load_command = new DynamicSymbolCommand{cmd};
+          break;
+        }
+
+      case LOAD_COMMAND_TYPES::LC_TWOLEVEL_HINTS:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_TWOLEVEL_HINTS";
+
+          load_command = new LoadCommand{command};
+          break;
+        }
+
+      case LOAD_COMMAND_TYPES::LC_SUB_FRAMEWORK:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_SUB_FRAMEWORK";
+
+          load_command = new LoadCommand{command};
+          break;
+        }
+
+      case LOAD_COMMAND_TYPES::LC_SUB_UMBRELLA:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_SUB_UMBRELLA";
+
+          load_command = new LoadCommand{command};
+          break;
+        }
+
+      case LOAD_COMMAND_TYPES::LC_SUB_LIBRARY:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_SUB_LIBRARY";
+
+          load_command = new LoadCommand{command};
+          break;
+        }
+
+      case LOAD_COMMAND_TYPES::LC_SUB_CLIENT:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_SUB_CLIENT";
+
+          load_command = new LoadCommand{command};
+          break;
+        }
+
+      // =======
+      // LC_MAIN
+      // =======
+      case LOAD_COMMAND_TYPES::LC_MAIN:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_MAIN";
+
+          const entry_point_command* cmd =
+            reinterpret_cast<const entry_point_command*>(
+              this->stream_->read(loadcommands_offset, sizeof(entry_point_command)));
+
+          load_command = new MainCommand{cmd};
+          break;
+        }
+
+      case LOAD_COMMAND_TYPES::LC_FUNCTION_STARTS:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_FUNCTION_STARTS";
+          load_command = new LoadCommand{command};
+          break;
+        }
+
+      case LOAD_COMMAND_TYPES::LC_CODE_SIGNATURE:
+        {
+          LOG(DEBUG) << "[+] Parsing LC_CODE_SIGNATURE";
+          load_command = new LoadCommand{command};
+          break;
+        }
+
+      default:
+        {
+          LOG(WARNING) << "Command '" << to_string(static_cast<LOAD_COMMAND_TYPES>(command->cmd))
+                       << "' not parsed";
+
+          load_command = new LoadCommand{command};
+        }
+    }
+
+    if (load_command != nullptr) {
+      const uint8_t* content = static_cast<const uint8_t*>(
+        this->stream_->read(loadcommands_offset, command->cmdsize));
+
+      load_command->data({
+        content,
+        content + command->cmdsize
+      });
+
+      load_command->command_offset(loadcommands_offset);
+      this->binary_->commands_.push_back(load_command);
+    }
+    loadcommands_offset += command->cmdsize;
+  }
+}
+}
+}
diff --git a/src/MachO/Builder.cpp b/src/MachO/Builder.cpp
new file mode 100644
index 0000000..c423b9f
--- /dev/null
+++ b/src/MachO/Builder.cpp
@@ -0,0 +1,266 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <list>
+#include <fstream>
+#include <iterator>
+
+#include "easylogging++.h"
+
+#include "LIEF/MachO/Builder.hpp"
+#include "Builder.tcc"
+
+#include "LIEF/exception.hpp"
+
+
+namespace LIEF {
+namespace MachO {
+
+Builder::~Builder(void) = default;
+
+Builder::Builder(Binary *binary) {
+  this->binaries_.push_back(std::move(binary));
+  this->binary_ = binary;
+  this->build();
+}
+
+Builder::Builder(std::vector<Binary*> binaries) {
+  this->binaries_ = binaries;
+  this->binary_   = this->binaries_.back();
+  this->build();
+}
+
+void Builder::build(void) {
+  if (this->binaries_.size() > 1) {
+    throw not_supported("Actually, builder only support single binary");
+  }
+
+
+  this->build_load_commands();
+  if (this->binary_->is64_) {
+    this->build_segments<MachO64>();
+    this->build_symbols<MachO64>();
+  } else {
+    this->build_segments<MachO32>();
+    this->build_symbols<MachO32>();
+  }
+
+  this->build_header();
+  this->build_uuid();
+}
+
+
+void Builder::build_header(void) {
+  LOG(DEBUG) << "[+] Building header" << std::endl;
+  const Header& binary_header = this->binary_->header();
+  if (this->binary_->is64_) {
+    mach_header_64 header;
+    header.magic      = static_cast<uint32_t>(binary_header.magic());
+    header.cputype    = static_cast<uint32_t>(binary_header.cpu_type());
+    header.cpusubtype = static_cast<uint32_t>(binary_header.cpu_subtype());
+    header.filetype   = static_cast<uint32_t>(binary_header.file_type());
+    header.ncmds      = static_cast<uint32_t>(binary_header.nb_cmds());
+    header.sizeofcmds = static_cast<uint32_t>(binary_header.sizeof_cmds());
+    header.flags      = static_cast<uint32_t>(binary_header.flags());
+    header.reserved   = static_cast<uint32_t>(binary_header.reserved());
+    std::copy(
+      reinterpret_cast<uint8_t*>(&header),
+      reinterpret_cast<uint8_t*>(&header) + sizeof(mach_header_64),
+      std::begin(this->rawBinary_)
+      );
+  } else {
+    mach_header header;
+    header.magic      = static_cast<uint32_t>(binary_header.magic());
+    header.cputype    = static_cast<uint32_t>(binary_header.cpu_type());
+    header.cpusubtype = static_cast<uint32_t>(binary_header.cpu_subtype());
+    header.filetype   = static_cast<uint32_t>(binary_header.file_type());
+    header.ncmds      = static_cast<uint32_t>(binary_header.nb_cmds());
+    header.sizeofcmds = static_cast<uint32_t>(binary_header.sizeof_cmds());
+    header.flags      = static_cast<uint32_t>(binary_header.flags());
+    std::copy(
+      reinterpret_cast<uint8_t*>(&header),
+      reinterpret_cast<uint8_t*>(&header) + sizeof(mach_header),
+      std::begin(this->rawBinary_)
+      );
+  }
+
+}
+
+
+void Builder::build_load_commands(void) {
+  LOG(DEBUG) << "[+] Building load segments" << std::endl;
+
+  const auto& binary = this->binaries_.back();
+  // Check if the number of segments is correct
+  if (binary->header().nb_cmds() != binary->commands_.size()) {
+    LOG(WARNING) << "Error: header.nb_cmds = " << std::dec << binary->header().nb_cmds()
+                 << " and number of commands is " << binary->commands_.size() << std::endl;
+    throw LIEF::builder_error("");
+  }
+
+  //uint64_t loadCommandsOffset = this->rawBinary_.size();
+
+  uint64_t segments_size = binary->header().sizeof_cmds();
+  if (this->rawBinary_.size() < segments_size) {
+    this->rawBinary_.resize(segments_size, 0);
+  }
+
+  for (const LoadCommand& command : binary->commands()) {
+    auto& data = command.data();
+    LOAD_COMMAND_TYPES cmd_type = command.command();
+    uint64_t loadCommandsOffset = command.command_offset();
+    LOG(DEBUG) << "[+] Command offset: 0x" << std::hex << loadCommandsOffset << std::endl;
+    switch (cmd_type) {
+      //case LOAD_COMMAND_TYPES::LC_SYMTAB:
+      //  {
+      //    LOG(DEBUG) << "\tProcessing Symbols %x", command->command() << std::endl;
+      //    auto symbol_command = static_cast<SymbolCommand*>(command);
+      //    symtab_command command;
+
+      //    command.cmd     = static_cast<uint32_t>(symbol_command->command());
+      //    command.cmdsize = static_cast<uint32_t>(symbol_command->size());
+      //    command.symoff  = static_cast<uint32_t>(symbol_command->symbol_offset());
+      //    command.nsyms   = static_cast<uint32_t>(symbol_command->numberof_symbols());
+      //    command.stroff  = static_cast<uint32_t>(symbol_command->strings_offset());
+      //    command.strsize = static_cast<uint32_t>(symbol_command->strings_size());
+      //    if (this->rawBinary_.size() < (loadCommandsOffset + data.size())) {
+      //      this->rawBinary_.resize(loadCommandsOffset + data.size());
+      //    }
+
+      //    std::copy(
+      //        reinterpret_cast<uint8_t*>(&command),
+      //        reinterpret_cast<uint8_t*>(&command) + sizeof(symtab_command),
+      //        std::next(std::begin(this->rawBinary_), loadCommandsOffset)
+      //        );
+
+      //    if(binary->is64_) {
+      //      uint32_t string_idx = 1;
+      //      for (size_t i = 0; i < binary->symbols_.size(); ++i) {
+      //        nlist_64 symbol;
+      //        auto& binary_symbol = binary->symbols_[i];
+      //        if (not binary_symbol->name().empty()) {
+      //          const auto& name = binary_symbol->name();
+      //          uint32_t name_offset = symbol_command->strings_offset() + string_idx;
+
+      //          if (this->rawBinary_.size() < (name_offset + name.size())) {
+      //            this->rawBinary_.resize(name_offset + name.size());
+      //          }
+
+      //          std::copy(
+      //              std::begin(name),
+      //              std::end(name),
+      //              std::next(std::begin(this->rawBinary_), name_offset)
+      //              );
+
+      //          symbol.n_strx  = string_idx;
+      //          string_idx += name.size() + 1;
+
+      //        }
+      //        symbol.n_type  = static_cast<uint8_t>(binary_symbol->type());
+      //        symbol.n_sect  = static_cast<uint8_t>(binary_symbol->numberof_sections());
+      //        symbol.n_desc  = static_cast<uint16_t>(binary_symbol->description());
+      //        symbol.n_value = static_cast<uint64_t>(binary_symbol->value());
+
+      //        uint32_t offset = symbol_command->symbol_offset() + i * sizeof(nlist_64);
+      //        std::copy(
+      //          reinterpret_cast<uint8_t*>(&symbol),
+      //          reinterpret_cast<uint8_t*>(&symbol) + sizeof(nlist_64),
+      //          std::next(std::begin(this->rawBinary_), offset)
+      //        );
+      //      }
+
+
+      //    } else {
+      //      throw std::runtime_error("todo");
+      //    }
+      //    loadCommandsOffset += sizeof(symtab_command);
+
+
+      //    break;
+      //  }
+
+      case LOAD_COMMAND_TYPES::LC_SEGMENT_64:
+      case LOAD_COMMAND_TYPES::LC_SEGMENT:
+        {
+          LOG(DEBUG) << "\tProcessing Load command " << to_string(cmd_type) << std::endl;
+          if (this->rawBinary_.size() < (loadCommandsOffset + data.size())) {
+            this->rawBinary_.resize(loadCommandsOffset + data.size());
+          }
+
+          std::copy(
+              std::begin(data),
+              std::end(data),
+              this->rawBinary_.data() + loadCommandsOffset);
+
+          const SegmentCommand& segment = static_cast<const SegmentCommand&>(command);
+          auto segment_content = segment.content();
+
+          if (this->rawBinary_.size() < (segment.file_offset() + segment_content.size())) {
+            this->rawBinary_.resize(segment.file_offset() + segment_content.size());
+          }
+
+          std::copy(
+              std::begin(segment_content),
+              std::end(segment_content),
+              this->rawBinary_.data() + segment.file_offset());
+
+          break;
+
+        }
+
+      default:
+        {
+          if (this->rawBinary_.size() < (loadCommandsOffset + data.size())) {
+            this->rawBinary_.resize(loadCommandsOffset + data.size(), 0);
+          }
+
+          std::copy(
+              std::begin(data),
+              std::end(data),
+              this->rawBinary_.data() + loadCommandsOffset);
+
+        }
+    }
+  }
+}
+
+void Builder::build_uuid(void) {
+}
+
+
+const std::vector<uint8_t>& Builder::get_build(void) {
+  return this->rawBinary_;
+}
+
+
+void Builder::write(MachO::Binary *binary, const std::string& filename) {
+  Builder builder{binary};
+  builder.write(filename);
+}
+
+void Builder::write(const std::string& filename) const {
+
+  std::ofstream outputFile{filename, std::ios::out | std::ios::binary | std::ios::trunc};
+  std::copy(
+      std::begin(this->rawBinary_),
+      std::end(this->rawBinary_),
+      std::ostreambuf_iterator<char>(outputFile));
+  outputFile.close();
+
+}
+
+}
+}
diff --git a/src/MachO/Builder.tcc b/src/MachO/Builder.tcc
new file mode 100644
index 0000000..4191d9e
--- /dev/null
+++ b/src/MachO/Builder.tcc
@@ -0,0 +1,180 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "easylogging++.h"
+
+namespace LIEF {
+namespace MachO {
+
+
+template<typename T>
+void Builder::build_segments(void) {
+  using section_t  = typename T::section;
+  using segment_t  = typename T::segment_command;
+  using uint__     = typename T::uint;
+
+  LOG(DEBUG) << "[+] Rebuilding segments" << std::endl;
+  Binary* binary =  this->binaries_.back();
+  for (const SegmentCommand& segment : binary->segments()) {
+    LOG(DEBUG) << segment << std::endl;
+    segment_t segment_header;
+    segment_header.cmd      = static_cast<uint32_t>(segment.command());
+    segment_header.cmdsize  = static_cast<uint32_t>(segment.size());
+    std::copy(
+        segment.name().c_str(),
+        segment.name().c_str() + sizeof(segment_header.segname),
+        segment_header.segname);
+    segment_header.vmaddr   = static_cast<uint__>(segment.virtual_address());
+    segment_header.vmsize   = static_cast<uint__>(segment.virtual_size());
+    segment_header.fileoff  = static_cast<uint__>(segment.file_offset());
+    segment_header.filesize = static_cast<uint__>(segment.file_size());
+    segment_header.maxprot  = static_cast<uint32_t>(segment.max_protection());
+    segment_header.initprot = static_cast<uint32_t>(segment.init_protection());
+    segment_header.nsects   = static_cast<uint32_t>(segment.numberof_sections());
+    segment_header.flags    = static_cast<uint32_t>(segment.flags());
+    LOG(DEBUG) << "[+] Command offset: " << std::hex << segment.command_offset() << std::endl;
+
+    const auto& content = segment.content();
+    if (content.size() != segment.file_size()) {
+      throw LIEF::builder_error("content.size() != segment.file_size()");
+    }
+    std::copy(
+        std::begin(content),
+        std::end(content),
+        this->rawBinary_.data() + segment.file_offset());
+
+    std::copy(
+        reinterpret_cast<uint8_t*>(&segment_header),
+        reinterpret_cast<uint8_t*>(&segment_header) + sizeof(segment_t),
+        this->rawBinary_.data() + segment.command_offset());
+
+
+
+    // --------
+    // Sections
+    // --------
+    if (segment.sections().size() != segment.numberof_sections()) {
+      throw LIEF::builder_error("segment.sections().size() != segment.numberof_sections()");
+    }
+
+    it_const_sections sections = segment.sections();
+    for (uint32_t i = 0; i < segment.numberof_sections(); ++i) {
+      const Section& section = sections[i];
+      LOG(DEBUG) << section << std::endl;
+      section_t header;
+      std::copy(
+          section.name().c_str(),
+          section.name().c_str() + sizeof(header.sectname),
+          header.sectname);
+
+      std::copy(
+          segment.name().c_str(),
+          segment.name().c_str() + sizeof(header.segname),
+          header.segname);
+
+      header.addr      = static_cast<uint__>(section.address());
+      header.size      = static_cast<uint__>(section.size());
+      header.offset    = static_cast<uint32_t>(section.offset());
+      header.align     = static_cast<uint32_t>(section.alignment());
+      header.reloff    = static_cast<uint32_t>(section.relocation_offset());
+      header.nreloc    = static_cast<uint32_t>(section.numberof_relocations());
+      header.flags     = static_cast<uint32_t>(section.raw_flags());
+      header.reserved1 = static_cast<uint32_t>(section.reserved1());
+      header.reserved2 = static_cast<uint32_t>(section.reserved2());
+      if (std::is_same<section_t, section_64>::value) {
+        //header.reserved3 = static_cast<uint32_t>(section.reserved3());
+      }
+      uint64_t section_header_offset =
+        segment.command_offset() +
+        sizeof(segment_t) +
+        i * sizeof(section_t);
+      std::copy(
+          reinterpret_cast<uint8_t*>(&header),
+          reinterpret_cast<uint8_t*>(&header) + sizeof(section_t),
+          this->rawBinary_.data() + section_header_offset);
+    }
+  }
+} // build_segment
+
+
+template<typename T>
+void Builder::build_symbols(void) {
+  using nlist_t  = typename T::nlist;
+
+  auto itSymbolCommand = std::find_if(
+        std::begin(this->binary_->commands_),
+        std::end(this->binary_->commands_),
+        [] (const LoadCommand* command) {
+          return command->command() == LOAD_COMMAND_TYPES::LC_SYMTAB;
+        });
+  if (itSymbolCommand == std::end(this->binary_->commands_)) {
+    LOG(DEBUG) << "[-] No symbols" << std::endl;
+    return;
+  }
+
+  LOG(DEBUG) << "[+] Building symbols" << std::endl;
+  const SymbolCommand* symbol_command = static_cast<const SymbolCommand*>(*itSymbolCommand);
+  symtab_command command;
+
+  command.cmd     = static_cast<uint32_t>(symbol_command->command());
+  command.cmdsize = static_cast<uint32_t>(symbol_command->size());
+  command.symoff  = static_cast<uint32_t>(symbol_command->symbol_offset());
+  command.nsyms   = static_cast<uint32_t>(symbol_command->numberof_symbols());
+  command.stroff  = static_cast<uint32_t>(symbol_command->strings_offset());
+  command.strsize = static_cast<uint32_t>(symbol_command->strings_size());
+
+  uint64_t loadCommandsOffset = symbol_command->command_offset();
+
+  std::copy(
+      reinterpret_cast<uint8_t*>(&command),
+      reinterpret_cast<uint8_t*>(&command) + sizeof(symtab_command),
+      this->rawBinary_.data() + loadCommandsOffset);
+
+  uint32_t string_idx = 1;
+  for (size_t i = 0; i < this->binary_->symbols_.size(); ++i) {
+    nlist_t symbol;
+    const auto& binary_symbol = this->binary_->symbols_[i];
+    if (not binary_symbol->name().empty()) {
+      const std::string& name = binary_symbol->name();
+      const uint32_t name_offset = symbol_command->strings_offset() + string_idx;
+
+      std::copy(
+          std::begin(name),
+          std::end(name),
+          this->rawBinary_.data() + name_offset);
+
+      this->rawBinary_[name_offset + name.size()] = 0;
+      symbol.n_strx  = string_idx;
+      string_idx += name.size() + 1;
+    }
+
+    symbol.n_type  = static_cast<uint8_t>(binary_symbol->type());
+    symbol.n_sect  = static_cast<uint8_t>(binary_symbol->numberof_sections());
+    if (std::is_same<T, MachO32>::value) {
+      symbol.n_desc = static_cast<uint16_t>(binary_symbol->description());
+    } else {
+      symbol.n_desc = static_cast<int16_t>(binary_symbol->description());
+    }
+    symbol.n_value = static_cast<uint32_t>(binary_symbol->value());
+    const uint32_t offset = static_cast<uint32_t>(symbol_command->symbol_offset() + i * sizeof(nlist_t));
+
+    std::copy(
+      reinterpret_cast<uint8_t*>(&symbol),
+      reinterpret_cast<uint8_t*>(&symbol) + sizeof(nlist_t),
+      this->rawBinary_.data() + offset);
+  }
+} // build_symbols
+}
+}
diff --git a/src/MachO/CMakeLists.txt b/src/MachO/CMakeLists.txt
new file mode 100644
index 0000000..6e06751
--- /dev/null
+++ b/src/MachO/CMakeLists.txt
@@ -0,0 +1,38 @@
+set(LIEF_MACHO_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/utils.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Binary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/UUIDCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Symbol.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/EnumToString.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Header.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DynamicSymbolCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Section.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/LoadCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/BinaryParser.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Builder.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/SegmentCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Parser.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/SymbolCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/MainCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DylibCommand.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DylinkerCommand.cpp)
+
+
+target_sources(LIB_LIEF_STATIC PRIVATE ${LIEF_MACHO_SRC})
+target_sources(LIB_LIEF_SHARED PRIVATE ${LIEF_MACHO_SRC})
+
+
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/MachO/enums.inc      LIEF_MACHO_ENUMS)
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/MachO/structures.inc LIEF_MACHO_STRUCTURES)
+
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/MachO/enums.hpp.in
+  ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/MachO/enums.hpp
+  @ONLY
+)
+
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/MachO/Structures.hpp.in
+  ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/MachO/Structures.hpp
+  @ONLY
+)
diff --git a/src/MachO/DylibCommand.cpp b/src/MachO/DylibCommand.cpp
new file mode 100644
index 0000000..5541a78
--- /dev/null
+++ b/src/MachO/DylibCommand.cpp
@@ -0,0 +1,109 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/DylibCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+DylibCommand::DylibCommand(void) = default;
+DylibCommand& DylibCommand::operator=(const DylibCommand&) = default;
+DylibCommand::DylibCommand(const DylibCommand&) = default;
+DylibCommand::~DylibCommand(void) = default;
+
+DylibCommand::DylibCommand(const dylib_command *cmd) :
+  timestamp_{cmd->dylib.timestamp},
+  currentVersion_{cmd->dylib.current_version},
+  compatibilityVersion_{cmd->dylib.compatibility_version}
+{
+  this->command_ = static_cast<LOAD_COMMAND_TYPES>(cmd->cmd);
+  this->size_    = cmd->cmdsize;
+}
+
+const std::string& DylibCommand::name(void) const {
+  return this->name_;
+}
+
+uint32_t DylibCommand::timestamp(void) const {
+  return this->timestamp_;
+}
+
+uint32_t DylibCommand::current_version(void) const {
+  return this->currentVersion_;
+}
+
+uint32_t DylibCommand::compatibility_version(void) const {
+  return this->compatibilityVersion_;
+}
+
+void DylibCommand::name(const std::string& name) {
+  this->name_ = name;
+}
+
+void DylibCommand::timestamp(uint32_t timestamp) {
+  this->timestamp_ = timestamp;
+}
+
+void DylibCommand::current_version(uint32_t currentVersion) {
+  this->currentVersion_ = currentVersion;
+}
+
+void DylibCommand::compatibility_version(uint32_t compatibilityVersion) {
+  this->compatibilityVersion_ = compatibilityVersion;
+}
+
+
+void DylibCommand::accept(Visitor& visitor) const {
+  LoadCommand::accept(visitor);
+
+  visitor.visit(this->name());
+  visitor.visit(this->timestamp());
+  visitor.visit(this->current_version());
+  visitor.visit(this->compatibility_version());
+}
+
+bool DylibCommand::operator==(const DylibCommand& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool DylibCommand::operator!=(const DylibCommand& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& DylibCommand::print(std::ostream& os) const {
+  LoadCommand::print(os);
+  os << std::hex;
+  os << std::left
+     << std::setw(35) << this->name()
+     << std::setw(10) << this->timestamp()
+     << std::setw(10) << this->current_version()
+     << std::setw(10) << this->compatibility_version();
+
+  return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const DylibCommand& command) {
+  return command.print(os);
+}
+
+}
+}
diff --git a/src/MachO/DylinkerCommand.cpp b/src/MachO/DylinkerCommand.cpp
new file mode 100644
index 0000000..24701eb
--- /dev/null
+++ b/src/MachO/DylinkerCommand.cpp
@@ -0,0 +1,71 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/DylinkerCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+DylinkerCommand::DylinkerCommand(void) = default;
+DylinkerCommand& DylinkerCommand::operator=(const DylinkerCommand&) = default;
+DylinkerCommand::DylinkerCommand(const DylinkerCommand&) = default;
+DylinkerCommand::~DylinkerCommand(void) = default;
+
+DylinkerCommand::DylinkerCommand(const dylinker_command *cmd)
+{
+  this->command_ = static_cast<LOAD_COMMAND_TYPES>(cmd->cmd);
+  this->size_    = cmd->cmdsize;
+}
+
+const std::string& DylinkerCommand::name(void) const {
+  return this->name_;
+}
+
+void DylinkerCommand::name(const std::string& name) {
+  this->name_ = name;
+}
+
+
+void DylinkerCommand::accept(Visitor& visitor) const {
+  LoadCommand::accept(visitor);
+
+  visitor.visit(this->name());
+}
+
+
+bool DylinkerCommand::operator==(const DylinkerCommand& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool DylinkerCommand::operator!=(const DylinkerCommand& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& DylinkerCommand::print(std::ostream& os) const {
+  LoadCommand::print(os);
+  os << std::hex;
+  os << std::left
+     << std::setw(35) << this->name();
+  return os;
+}
+
+}
+}
diff --git a/src/MachO/DynamicSymbolCommand.cpp b/src/MachO/DynamicSymbolCommand.cpp
new file mode 100644
index 0000000..3162e68
--- /dev/null
+++ b/src/MachO/DynamicSymbolCommand.cpp
@@ -0,0 +1,143 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/DynamicSymbolCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+DynamicSymbolCommand::DynamicSymbolCommand(void) :
+  idxLocalSymbol_{0},
+  nbLocalSymbol_{0},
+  idxExternalDefineSymbol_{0},
+  nbExternalDefineSymbol_{0},
+  idxUndefineSymbol_{0},
+  nbUndefineSymbol_{0},
+  tocOffset_{0},
+  nbToc_{0},
+  moduleTableOffset_{0},
+  nbModuleTable_{0},
+  externalReferenceSymbolOffset_{0},
+  nbExternalReferenceSymbols_{0},
+  indirectSymOffset_{0},
+  nbIndirectSymbols_{0},
+  externalRelocationOffset_{0},
+  nbExternalRelocation_{0},
+  localRelocationOffset_{0},
+  nbLocRelocation_{0}
+{
+  this->command_ = LOAD_COMMAND_TYPES::LC_DYSYMTAB;
+}
+
+DynamicSymbolCommand::DynamicSymbolCommand(const dysymtab_command *cmd) :
+  idxLocalSymbol_{cmd->ilocalsym},
+  nbLocalSymbol_{cmd->nlocalsym},
+  idxExternalDefineSymbol_{cmd->iextdefsym},
+  nbExternalDefineSymbol_{cmd->nextdefsym},
+  idxUndefineSymbol_{cmd->iundefsym},
+  nbUndefineSymbol_{cmd->nundefsym},
+  tocOffset_{cmd->tocoff},
+  nbToc_{cmd->ntoc},
+  moduleTableOffset_{cmd->modtaboff},
+  nbModuleTable_{cmd->nmodtab},
+  externalReferenceSymbolOffset_{cmd->extrefsymoff},
+  nbExternalReferenceSymbols_{cmd->nextrefsyms},
+  indirectSymOffset_{cmd->indirectsymoff},
+  nbIndirectSymbols_{cmd->nindirectsyms},
+  externalRelocationOffset_{cmd->extreloff},
+  nbExternalRelocation_{cmd->nextrel},
+  localRelocationOffset_{cmd->locreloff},
+  nbLocRelocation_{cmd->nlocrel}
+{
+  this->command_ = static_cast<LOAD_COMMAND_TYPES>(cmd->cmd);
+  this->size_    = cmd->cmdsize;
+}
+
+
+
+DynamicSymbolCommand& DynamicSymbolCommand::operator=(const DynamicSymbolCommand&) = default;
+
+DynamicSymbolCommand::DynamicSymbolCommand(const DynamicSymbolCommand&) = default;
+
+DynamicSymbolCommand::~DynamicSymbolCommand(void) = default;
+
+
+void DynamicSymbolCommand::accept(Visitor& visitor) const {
+  LoadCommand::accept(visitor);
+  //TODO
+}
+
+
+bool DynamicSymbolCommand::operator==(const DynamicSymbolCommand& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool DynamicSymbolCommand::operator!=(const DynamicSymbolCommand& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& DynamicSymbolCommand::print(std::ostream& os) const {
+
+  LoadCommand::print(os);
+  os << std::hex;
+  os << std::left
+     << std::setw(36) << "Local symbol index:"                << this->idxLocalSymbol_
+     << std::endl
+     << std::setw(36) << "Number of local symbols:"           << this->nbLocalSymbol_
+     << std::endl
+     << std::setw(36) << "External symbol index:"             << this->idxExternalDefineSymbol_
+     << std::endl
+     << std::setw(36) << "Number of external symbols:"        << this->nbExternalDefineSymbol_
+     << std::endl
+     << std::setw(36) << "Undefined symbol index:"            << this->idxUndefineSymbol_
+     << std::endl
+     << std::setw(36) << "Number of undefined symbols:"       << this->nbUndefineSymbol_
+     << std::endl
+     << std::setw(36) << "Table of content offset:"           << this->tocOffset_
+     << std::endl
+     << std::setw(36) << "Number of entries in TOC:"          << this->nbToc_
+     << std::endl
+     << std::setw(36) << "Module table offset:"               << this->moduleTableOffset_
+     << std::endl
+     << std::setw(36) << "Number of entries in module table:" << this->nbModuleTable_
+     << std::endl
+     << std::setw(36) << "External reference table offset:"   << this->externalReferenceSymbolOffset_
+     << std::endl
+     << std::setw(36) << "Number of external reference:"      << this->nbExternalReferenceSymbols_
+     << std::endl
+     << std::setw(36) << "Indirect symbols offset:"           << this->indirectSymOffset_
+     << std::endl
+     << std::setw(36) << "Number of indirect symbols:"        << this->nbIndirectSymbols_
+     << std::endl
+     << std::setw(36) << "External relocation offset:"        << this->externalRelocationOffset_
+     << std::endl
+     << std::setw(36) << "Local relocation offset:"           << this->localRelocationOffset_
+     << std::endl
+     << std::setw(36) << "Number of local relocations:"       << this->nbLocRelocation_
+     << std::endl;
+
+  return os;
+}
+
+}
+}
+
diff --git a/src/MachO/EnumToString.cpp b/src/MachO/EnumToString.cpp
new file mode 100644
index 0000000..964e38c
--- /dev/null
+++ b/src/MachO/EnumToString.cpp
@@ -0,0 +1,259 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/MachO/Structures.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+#include <map>
+
+namespace LIEF {
+namespace MachO {
+
+
+const char* to_string(MACHO_TYPES e) {
+  const std::map<MACHO_TYPES, const char*> enumStrings {
+      { MACHO_TYPES::MH_MAGIC,    "MAGIC"},
+      { MACHO_TYPES::MH_CIGAM,    "CIGAM"},
+      { MACHO_TYPES::MH_MAGIC_64, "MAGIC_64"},
+      { MACHO_TYPES::MH_CIGAM_64, "CIGAM_64"},
+      { MACHO_TYPES::FAT_MAGIC,   "FAT_MAGIC"},
+      { MACHO_TYPES::FAT_CIGAM,   "FAT_CIGAM"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(FILE_TYPES e) {
+  const std::map<FILE_TYPES, const char*> enumStrings {
+      { FILE_TYPES::MH_OBJECT,        "OBJECT"},
+      { FILE_TYPES::MH_EXECUTE,       "EXECUTE"},
+      { FILE_TYPES::MH_FVMLIB,        "FVMLIB"},
+      { FILE_TYPES::MH_CORE,          "CORE"},
+      { FILE_TYPES::MH_PRELOAD,       "PRELOAD"},
+      { FILE_TYPES::MH_DYLIB,         "DYLIB"},
+      { FILE_TYPES::MH_DYLINKER,      "DYLINKER"},
+      { FILE_TYPES::MH_BUNDLE,        "BUNDLE"},
+      { FILE_TYPES::MH_DYLIB_STUB,    "DYLIB_STUB"},
+      { FILE_TYPES::MH_DSYM,          "DSYM"},
+      { FILE_TYPES::MH_KEXT_BUNDLE,   "KEXT_BUNDLE"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(LOAD_COMMAND_TYPES e) {
+  const std::map<LOAD_COMMAND_TYPES, const char*> enumStrings {
+      { LOAD_COMMAND_TYPES::LC_SEGMENT,                  "SEGMENT"},
+      { LOAD_COMMAND_TYPES::LC_SYMTAB,                   "SYMTAB"},
+      { LOAD_COMMAND_TYPES::LC_SYMSEG,                   "SYMSEG"},
+      { LOAD_COMMAND_TYPES::LC_THREAD,                   "THREAD"},
+      { LOAD_COMMAND_TYPES::LC_UNIXTHREAD,               "UNIXTHREAD"},
+      { LOAD_COMMAND_TYPES::LC_LOADFVMLIB,               "LOADFVMLIB"},
+      { LOAD_COMMAND_TYPES::LC_IDFVMLIB,                 "IDFVMLIB"},
+      { LOAD_COMMAND_TYPES::LC_IDENT,                    "IDENT"},
+      { LOAD_COMMAND_TYPES::LC_FVMFILE,                  "FVMFILE"},
+      { LOAD_COMMAND_TYPES::LC_PREPAGE,                  "PREPAGE"},
+      { LOAD_COMMAND_TYPES::LC_DYSYMTAB,                 "DYSYMTAB"},
+      { LOAD_COMMAND_TYPES::LC_LOAD_DYLIB,               "LOAD_DYLIB"},
+      { LOAD_COMMAND_TYPES::LC_ID_DYLIB,                 "ID_DYLIB"},
+      { LOAD_COMMAND_TYPES::LC_LOAD_DYLINKER,            "LOAD_DYLINKER"},
+      { LOAD_COMMAND_TYPES::LC_ID_DYLINKER,              "ID_DYLINKER"},
+      { LOAD_COMMAND_TYPES::LC_PREBOUND_DYLIB,           "PREBOUND_DYLIB"},
+      { LOAD_COMMAND_TYPES::LC_ROUTINES,                 "ROUTINES"},
+      { LOAD_COMMAND_TYPES::LC_SUB_FRAMEWORK,            "SUB_FRAMEWORK"},
+      { LOAD_COMMAND_TYPES::LC_SUB_UMBRELLA,             "SUB_UMBRELLA"},
+      { LOAD_COMMAND_TYPES::LC_SUB_CLIENT,               "SUB_CLIENT"},
+      { LOAD_COMMAND_TYPES::LC_SUB_LIBRARY,              "SUB_LIBRARY"},
+      { LOAD_COMMAND_TYPES::LC_TWOLEVEL_HINTS,           "TWOLEVEL_HINTS"},
+      { LOAD_COMMAND_TYPES::LC_PREBIND_CKSUM,            "PREBIND_CKSUM"},
+      { LOAD_COMMAND_TYPES::LC_LOAD_WEAK_DYLIB,          "LOAD_WEAK_DYLIB"},
+      { LOAD_COMMAND_TYPES::LC_SEGMENT_64,               "SEGMENT_64"},
+      { LOAD_COMMAND_TYPES::LC_ROUTINES_64,              "ROUTINES_64"},
+      { LOAD_COMMAND_TYPES::LC_UUID,                     "UUID"},
+      { LOAD_COMMAND_TYPES::LC_RPATH,                    "RPATH"},
+      { LOAD_COMMAND_TYPES::LC_CODE_SIGNATURE,           "CODE_SIGNATURE"},
+      { LOAD_COMMAND_TYPES::LC_SEGMENT_SPLIT_INFO,       "SEGMENT_SPLIT_INFO"},
+      { LOAD_COMMAND_TYPES::LC_REEXPORT_DYLIB,           "REEXPORT_DYLIB"},
+      { LOAD_COMMAND_TYPES::LC_LAZY_LOAD_DYLIB,          "LAZY_LOAD_DYLIB"},
+      { LOAD_COMMAND_TYPES::LC_ENCRYPTION_INFO,          "ENCRYPTION_INFO"},
+      { LOAD_COMMAND_TYPES::LC_DYLD_INFO,                "DYLD_INFO"},
+      { LOAD_COMMAND_TYPES::LC_DYLD_INFO_ONLY,           "DYLD_INFO_ONLY"},
+      { LOAD_COMMAND_TYPES::LC_LOAD_UPWARD_DYLIB,        "LOAD_UPWARD_DYLIB"},
+      { LOAD_COMMAND_TYPES::LC_VERSION_MIN_MACOSX,       "VERSION_MIN_MACOSX"},
+      { LOAD_COMMAND_TYPES::LC_VERSION_MIN_IPHONEOS,     "VERSION_MIN_IPHONEOS"},
+      { LOAD_COMMAND_TYPES::LC_FUNCTION_STARTS,          "FUNCTION_STARTS"},
+      { LOAD_COMMAND_TYPES::LC_DYLD_ENVIRONMENT,         "DYLD_ENVIRONMENT"},
+      { LOAD_COMMAND_TYPES::LC_MAIN,                     "MAIN"},
+      { LOAD_COMMAND_TYPES::LC_DATA_IN_CODE,             "DATA_IN_CODE"},
+      { LOAD_COMMAND_TYPES::LC_SOURCE_VERSION,           "SOURCE_VERSION"},
+      { LOAD_COMMAND_TYPES::LC_DYLIB_CODE_SIGN_DRS,      "DYLIB_CODE_SIGN_DRS"},
+      { LOAD_COMMAND_TYPES::LC_ENCRYPTION_INFO_64,       "ENCRYPTION_INFO_64"},
+      { LOAD_COMMAND_TYPES::LC_LINKER_OPTION,            "LINKER_OPTION"},
+      { LOAD_COMMAND_TYPES::LC_LINKER_OPTIMIZATION_HINT, "LINKER_OPTIMIZATION_HINT"},
+      { LOAD_COMMAND_TYPES::LC_VERSION_MIN_TVOS,         "VERSION_MIN_TVOS"},
+      { LOAD_COMMAND_TYPES::LC_VERSION_MIN_WATCHOS,      "VERSION_MIN_WATCHOS"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(CPU_TYPES e) {
+  const std::map<CPU_TYPES, const char*> enumStrings {
+      { CPU_TYPES::CPU_TYPE_ANY,       "ANY"},
+      { CPU_TYPES::CPU_TYPE_X86,       "x86"},
+      { CPU_TYPES::CPU_TYPE_I386,      "i386"},
+      { CPU_TYPES::CPU_TYPE_X86_64,    "x86_64"},
+      //{ CPU_TYPES::CPU_TYPE_MIPS,      "MIPS"},
+      { CPU_TYPES::CPU_TYPE_MC98000,   "MC98000"},
+      { CPU_TYPES::CPU_TYPE_ARM,       "ARM"},
+      { CPU_TYPES::CPU_TYPE_ARM64,     "ARM64"},
+      { CPU_TYPES::CPU_TYPE_SPARC,     "SPARC"},
+      { CPU_TYPES::CPU_TYPE_POWERPC,   "POWERPC"},
+      { CPU_TYPES::CPU_TYPE_POWERPC64, "POWERPC64"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(HEADER_FLAGS e) {
+  const std::map<HEADER_FLAGS, const char*> enumStrings {
+      { HEADER_FLAGS::MH_NOUNDEFS                ,"NOUNDEFS"},
+      { HEADER_FLAGS::MH_INCRLINK                ,"INCRLINK"},
+      { HEADER_FLAGS::MH_DYLDLINK                ,"DYLDLINK"},
+      { HEADER_FLAGS::MH_BINDATLOAD              ,"BINDATLOAD"},
+      { HEADER_FLAGS::MH_PREBOUND                ,"PREBOUND"},
+      { HEADER_FLAGS::MH_SPLIT_SEGS              ,"SPLIT_SEGS"},
+      { HEADER_FLAGS::MH_LAZY_INIT               ,"LAZY_INIT"},
+      { HEADER_FLAGS::MH_TWOLEVEL                ,"TWOLEVEL"},
+      { HEADER_FLAGS::MH_FORCE_FLAT              ,"FORCE_FLAT"},
+      { HEADER_FLAGS::MH_NOMULTIDEFS             ,"NOMULTIDEFS"},
+      { HEADER_FLAGS::MH_NOFIXPREBINDING         ,"NOFIXPREBINDING"},
+      { HEADER_FLAGS::MH_PREBINDABLE             ,"PREBINDABLE"},
+      { HEADER_FLAGS::MH_ALLMODSBOUND            ,"ALLMODSBOUND"},
+      { HEADER_FLAGS::MH_SUBSECTIONS_VIA_SYMBOLS ,"SUBSECTIONS_VIA_SYMBOLS"},
+      { HEADER_FLAGS::MH_CANONICAL               ,"CANONICAL"},
+      { HEADER_FLAGS::MH_WEAK_DEFINES            ,"WEAK_DEFINES"},
+      { HEADER_FLAGS::MH_BINDS_TO_WEAK           ,"BINDS_TO_WEAK"},
+      { HEADER_FLAGS::MH_ALLOW_STACK_EXECUTION   ,"ALLOW_STACK_EXECUTION"},
+      { HEADER_FLAGS::MH_ROOT_SAFE               ,"ROOT_SAFE"},
+      { HEADER_FLAGS::MH_SETUID_SAFE             ,"SETUID_SAFE"},
+      { HEADER_FLAGS::MH_NO_REEXPORTED_DYLIBS    ,"NO_REEXPORTED_DYLIBS"},
+      { HEADER_FLAGS::MH_PIE                     ,"PIE"},
+      { HEADER_FLAGS::MH_DEAD_STRIPPABLE_DYLIB   ,"DEAD_STRIPPABLE_DYLIB"},
+      { HEADER_FLAGS::MH_HAS_TLV_DESCRIPTORS     ,"HAS_TLV_DESCRIPTORS"},
+      { HEADER_FLAGS::MH_NO_HEAP_EXECUTION       ,"NO_HEAP_EXECUTION"},
+      { HEADER_FLAGS::MH_APP_EXTENSION_SAFE      ,"APP_EXTENSION_SAFE"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(SECTION_TYPES e) {
+  const std::map<SECTION_TYPES, const char*> enumStrings {
+      { SECTION_TYPES::S_REGULAR,                             "REGULAR"},
+      { SECTION_TYPES::S_ZEROFILL,                            "ZEROFILL"},
+      { SECTION_TYPES::S_CSTRING_LITERALS,                    "CSTRING_LITERALS"},
+      { SECTION_TYPES::S_4BYTE_LITERALS,                      "4BYTE_LITERALS"},
+      { SECTION_TYPES::S_8BYTE_LITERALS,                      "8BYTE_LITERALS"},
+      { SECTION_TYPES::S_LITERAL_POINTERS,                    "LITERAL_POINTERS"},
+      { SECTION_TYPES::S_NON_LAZY_SYMBOL_POINTERS,            "NON_LAZY_SYMBOL_POINTERS"},
+      { SECTION_TYPES::S_LAZY_SYMBOL_POINTERS,                "LAZY_SYMBOL_POINTERS"},
+      { SECTION_TYPES::S_SYMBOL_STUBS,                        "SYMBOL_STUBS"},
+      { SECTION_TYPES::S_MOD_INIT_FUNC_POINTERS,              "MOD_INIT_FUNC_POINTERS"},
+      { SECTION_TYPES::S_MOD_TERM_FUNC_POINTERS,              "MOD_TERM_FUNC_POINTERS"},
+      { SECTION_TYPES::S_COALESCED,                           "COALESCED"},
+      { SECTION_TYPES::S_GB_ZEROFILL,                         "GB_ZEROFILL"},
+      { SECTION_TYPES::S_INTERPOSING,                         "INTERPOSING"},
+      { SECTION_TYPES::S_16BYTE_LITERALS,                     "16BYTE_LITERALS"},
+      { SECTION_TYPES::S_DTRACE_DOF,                          "DTRACE_DOF"},
+      { SECTION_TYPES::S_LAZY_DYLIB_SYMBOL_POINTERS,          "LAZY_DYLIB_SYMBOL_POINTERS"},
+      { SECTION_TYPES::S_THREAD_LOCAL_REGULAR,                "THREAD_LOCAL_REGULAR"},
+      { SECTION_TYPES::S_THREAD_LOCAL_ZEROFILL,               "THREAD_LOCAL_ZEROFILL"},
+      { SECTION_TYPES::S_THREAD_LOCAL_VARIABLES,              "THREAD_LOCAL_VARIABLES"},
+      { SECTION_TYPES::S_THREAD_LOCAL_VARIABLE_POINTERS,      "THREAD_LOCAL_VARIABLE_POINTERS"},
+      { SECTION_TYPES::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS, "THREAD_LOCAL_INIT_FUNCTION_POINTERS"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(SECTION_FLAGS e) {
+  const std::map<SECTION_FLAGS, const char*> enumStrings {
+    { SECTION_FLAGS::S_ATTR_PURE_INSTRUCTIONS,   "PURE_INSTRUCTIONS"},
+    { SECTION_FLAGS::S_ATTR_NO_TOC,              "NO_TOC"},
+    { SECTION_FLAGS::S_ATTR_STRIP_STATIC_SYMS,   "STRIP_STATIC_SYMS"},
+    { SECTION_FLAGS::S_ATTR_NO_DEAD_STRIP,       "NO_DEAD_STRIP"},
+    { SECTION_FLAGS::S_ATTR_LIVE_SUPPORT,        "LIVE_SUPPORT"},
+    { SECTION_FLAGS::S_ATTR_SELF_MODIFYING_CODE, "SELF_MODIFYING_CODE"},
+    { SECTION_FLAGS::S_ATTR_DEBUG,               "DEBUG"},
+    { SECTION_FLAGS::S_ATTR_SOME_INSTRUCTIONS,   "SOME_INSTRUCTIONS"},
+    { SECTION_FLAGS::S_ATTR_EXT_RELOC,           "EXT_RELOC"},
+    { SECTION_FLAGS::S_ATTR_LOC_RELOC,           "LOC_RELOC"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(SYMBOL_TYPES e) {
+  const std::map<SYMBOL_TYPES, const char*> enumStrings {
+    { SYMBOL_TYPES::N_STAB, "STAB"},
+    { SYMBOL_TYPES::N_PEXT, "PEXT"},
+    { SYMBOL_TYPES::N_TYPE, "TYPE"},
+    { SYMBOL_TYPES::N_EXT,  "EXT"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(N_LIST_TYPES e) {
+  const std::map<N_LIST_TYPES, const char*> enumStrings {
+    { N_LIST_TYPES::N_UNDF, "UNDF"},
+    { N_LIST_TYPES::N_ABS,  "ABS"},
+    { N_LIST_TYPES::N_SECT, "SECT"},
+    { N_LIST_TYPES::N_PBUD, "PBUD"},
+    { N_LIST_TYPES::N_INDR, "INDR"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(SYMBOL_DESCRIPTIONS e) {
+  const std::map<SYMBOL_DESCRIPTIONS, const char*> enumStrings {
+    { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_UNDEFINED_NON_LAZY,         "FLAG_UNDEFINED_NON_LAZY"},
+    { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_UNDEFINED_LAZY,             "FLAG_UNDEFINED_LAZY"},
+    { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_DEFINED,                    "FLAG_DEFINED"},
+    { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_PRIVATE_DEFINED,            "FLAG_PRIVATE_DEFINED"},
+    { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_PRIVATE_UNDEFINED_NON_LAZY, "FLAG_PRIVATE_UNDEFINED_NON_LAZY"},
+    { SYMBOL_DESCRIPTIONS::REFERENCE_FLAG_PRIVATE_UNDEFINED_LAZY,     "FLAG_PRIVATE_UNDEFINED_LAZY"},
+    { SYMBOL_DESCRIPTIONS::N_ARM_THUMB_DEF,                           "ARM_THUM"},
+    { SYMBOL_DESCRIPTIONS::REFERENCED_DYNAMICALLY,                    "REFERENCED_DYNAMICALLY"},
+    { SYMBOL_DESCRIPTIONS::N_NO_DEAD_STRIP,                           "NO_DEAD_STRIP"},
+    { SYMBOL_DESCRIPTIONS::N_WEAK_REF,                                "WEAK_REF"},
+    { SYMBOL_DESCRIPTIONS::N_WEAK_DEF,                                "WEAK_DEF"},
+    { SYMBOL_DESCRIPTIONS::N_SYMBOL_RESOLVER,                         "SYMBOL_RESOLVER"},
+    { SYMBOL_DESCRIPTIONS::N_ALT_ENTRY,                               "ALT_ENTRY"},
+    { SYMBOL_DESCRIPTIONS::SELF_LIBRARY_ORDINAL,                      "SELF_LIBRARY_ORDINAL"},
+    { SYMBOL_DESCRIPTIONS::MAX_LIBRARY_ORDINAL,                       "MAX_LIBRARY_ORDINAL"},
+    { SYMBOL_DESCRIPTIONS::DYNAMIC_LOOKUP_ORDINAL,                    "DYNAMIC_LOOKUP_ORDINAL"},
+    { SYMBOL_DESCRIPTIONS::EXECUTABLE_ORDINAL,                        "EXECUTABLE_ORDINAL"}
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+}
+}
diff --git a/src/MachO/Header.cpp b/src/MachO/Header.cpp
new file mode 100644
index 0000000..f93f8fc
--- /dev/null
+++ b/src/MachO/Header.cpp
@@ -0,0 +1,230 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <map>
+#include <set>
+#include <iomanip>
+#include <algorithm>
+#include <numeric>
+#include <iterator>
+#include <string>
+
+#include "LIEF/exception.hpp"
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/Header.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+static const std::map<CPU_TYPES, std::pair<ARCHITECTURES, std::set<MODES>>> arch_macho_to_lief {
+  {CPU_TYPES::CPU_TYPE_ANY,       {ARCH_NONE, {}}},
+  {CPU_TYPES::CPU_TYPE_X86_64,    {ARCH_X86,   {MODE_64}}},
+  {CPU_TYPES::CPU_TYPE_ARM,       {ARCH_ARM,   {}}},
+  {CPU_TYPES::CPU_TYPE_ARM64,     {ARCH_ARM64, {}}},
+  {CPU_TYPES::CPU_TYPE_X86,       {ARCH_X86,   {MODE_32}}},
+  {CPU_TYPES::CPU_TYPE_SPARC,     {ARCH_SPARC, {}}},
+  {CPU_TYPES::CPU_TYPE_POWERPC,   {ARCH_PPC,   {MODE_32}}},
+  {CPU_TYPES::CPU_TYPE_POWERPC64, {ARCH_PPC, {MODE_64}}},
+};
+
+Header::Header(void) = default;
+Header& Header::operator=(const Header&) = default;
+Header::Header(const Header&) = default;
+Header::~Header(void) = default;
+
+Header::Header(const mach_header_64 *header) :
+  magic_{header->magic},
+  cputype_(static_cast<CPU_TYPES>(header->cputype)),
+  cpusubtype_{header->cpusubtype},
+  filetype_{static_cast<FILE_TYPES>(header->filetype)},
+  ncmds_{header->ncmds},
+  sizeofcmds_{header->sizeofcmds},
+  flags_{header->flags},
+  reserved_{header->reserved}
+{}
+
+Header::Header(const mach_header *header) :
+  magic_{header->magic},
+  cputype_(static_cast<CPU_TYPES>(header->cputype)),
+  cpusubtype_{header->cpusubtype},
+  filetype_{static_cast<FILE_TYPES>(header->filetype)},
+  ncmds_{header->ncmds},
+  sizeofcmds_{header->sizeofcmds},
+  flags_{header->flags},
+  reserved_{0}
+{}
+
+
+uint32_t Header::magic(void) const {
+  return this->magic_;
+}
+CPU_TYPES Header::cpu_type(void) const {
+  return this->cputype_;
+}
+
+uint32_t Header::cpu_subtype(void) const {
+  return this->cpusubtype_;
+}
+
+FILE_TYPES Header::file_type(void) const {
+  return this->filetype_;
+}
+
+uint32_t Header::nb_cmds(void) const {
+  return this->ncmds_;
+}
+
+uint32_t Header::sizeof_cmds(void) const {
+  return this->sizeofcmds_;
+}
+
+uint32_t Header::flags(void) const {
+  return this->flags_;
+}
+
+uint32_t Header::reserved(void) const {
+  return this->reserved_;
+}
+
+std::pair<ARCHITECTURES, std::set<MODES>> Header::abstract_architecture(void) const {
+  try {
+    return arch_macho_to_lief.at(this->cpu_type());
+  } catch (const std::out_of_range&) {
+    throw not_implemented(to_string(this->cpu_type()));
+  }
+}
+
+std::set<HEADER_FLAGS> Header::flags_list(void) const {
+  std::set<HEADER_FLAGS> flags;
+
+  auto has_flag = [this] (HEADER_FLAGS flag) {
+    return (static_cast<uint32_t>(flag) & this->flags_) > 0;
+  };
+
+  std::copy_if(
+      std::begin(header_flags_array),
+      std::end(header_flags_array),
+      std::inserter(flags, std::begin(flags)),
+      has_flag);
+
+  return flags;
+}
+
+
+bool Header::has_flag(HEADER_FLAGS flag) const {
+  return (this->flags_ & static_cast<uint32_t>(flag)) > 0;
+}
+
+
+void Header::remove_flag(HEADER_FLAGS flag) {
+  this->flags_ &= ~static_cast<uint32_t>(flag);
+}
+
+
+void Header::magic(uint32_t magic) {
+  this->magic_ = magic;
+}
+void Header::cpu_type(CPU_TYPES cputype) {
+  this->cputype_ = cputype;
+}
+
+void Header::cpu_subtype(uint32_t cpusubtype) {
+  this->cpusubtype_ = cpusubtype;
+}
+
+void Header::file_type(FILE_TYPES filetype) {
+  this->filetype_ = filetype;
+}
+
+void Header::nb_cmds(uint32_t ncmds) {
+  this->ncmds_ = ncmds;
+}
+
+void Header::sizeof_cmds(uint32_t sizeofcmds) {
+  this->sizeofcmds_ = sizeofcmds;
+}
+
+void Header::flags(uint32_t flags) {
+  this->flags_ = flags;
+}
+
+void Header::reserved(uint32_t reserved) {
+  this->reserved_ = reserved;
+}
+
+
+void Header::accept(Visitor& visitor) const {
+  visitor.visit(this->magic());
+  visitor.visit(this->cpu_type());
+  visitor.visit(this->cpu_subtype());
+  visitor.visit(this->file_type());
+  visitor.visit(this->nb_cmds());
+  visitor.visit(this->sizeof_cmds());
+  visitor.visit(this->flags());
+  visitor.visit(this->reserved());
+}
+
+bool Header::operator==(const Header& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Header::operator!=(const Header& rhs) const {
+  return not (*this == rhs);
+}
+
+
+
+std::ostream& operator<<(std::ostream& os, const Header& hdr) {
+
+  const auto& flags = hdr.flags_list();
+
+ std::string flags_str = std::accumulate(
+     std::begin(flags),
+     std::end(flags), std::string{},
+     [] (const std::string& a, HEADER_FLAGS b) {
+         return a.empty() ? to_string(b) : a + " " + to_string(b);
+     });
+
+  os << std::hex;
+  os << std::left
+     << std::setw(10) << "Magic"
+     << std::setw(10) << "CPU Type"
+     << std::setw(15) << "CPU subtype"
+     << std::setw(15) << "File type"
+     << std::setw(10) << "NCMDS"
+     << std::setw(15) << "Sizeof cmds"
+     << std::setw(10) << "Reserved"
+     << std::setw(10) << "Flags" << std::endl
+
+     << std::setw(10) << hdr.magic()
+     << std::setw(10) << to_string(hdr.cpu_type())
+     << std::setw(15) << hdr.cpu_subtype()
+     << std::setw(15) << to_string(hdr.file_type())
+     << std::setw(10) << hdr.nb_cmds()
+     << std::setw(15) << hdr.sizeof_cmds()
+     << std::setw(10) << hdr.reserved()
+     << std::setw(10) << flags_str
+     << std::endl;
+
+  return os;
+}
+
+}
+}
diff --git a/src/MachO/LoadCommand.cpp b/src/MachO/LoadCommand.cpp
new file mode 100644
index 0000000..c933de6
--- /dev/null
+++ b/src/MachO/LoadCommand.cpp
@@ -0,0 +1,102 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/LoadCommand.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+LoadCommand::LoadCommand(void) = default;
+LoadCommand& LoadCommand::operator=(const LoadCommand&) = default;
+LoadCommand::LoadCommand(const LoadCommand&) = default;
+LoadCommand::~LoadCommand(void) = default;
+
+LoadCommand::LoadCommand(const load_command* command) :
+  command_{static_cast<LOAD_COMMAND_TYPES>(command->cmd)},
+  size_{command->cmdsize},
+  commandOffset_{0}
+{}
+
+LOAD_COMMAND_TYPES LoadCommand::command(void) const {
+  return this->command_;
+}
+
+uint32_t LoadCommand::size(void) const {
+  return this->size_;
+}
+
+const std::vector<uint8_t>& LoadCommand::data(void) const {
+  return this->originalData_;
+}
+
+
+uint64_t LoadCommand::command_offset(void) const {
+  return this->commandOffset_;
+}
+
+void LoadCommand::data(const std::vector<uint8_t>& data) {
+  this->originalData_ = std::move(data);
+}
+
+void LoadCommand::command(LOAD_COMMAND_TYPES command) {
+  this->command_ = command;
+}
+
+void LoadCommand::size(uint32_t size) {
+  this->size_ = size;
+}
+
+
+void LoadCommand::command_offset(uint64_t offset) {
+  this->commandOffset_ = offset;
+}
+
+
+void LoadCommand::accept(Visitor& visitor) const {
+  visitor.visit(this->command());
+  visitor.visit(this->size());
+  visitor.visit(this->data());
+  visitor.visit(this->command_offset());
+}
+
+bool LoadCommand::operator==(const LoadCommand& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool LoadCommand::operator!=(const LoadCommand& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& LoadCommand::print(std::ostream& os) const {
+  os << std::hex;
+  os << "Command : " << to_string(this->command()) << std::endl;
+  os << "Offset  : " << this->command_offset() << std::endl;
+  os << "Size    : " << this->size() << std::endl;
+  return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const LoadCommand& cmd) {
+  return cmd.print(os);
+}
+
+}
+}
diff --git a/src/MachO/MainCommand.cpp b/src/MachO/MainCommand.cpp
new file mode 100644
index 0000000..c22f79b
--- /dev/null
+++ b/src/MachO/MainCommand.cpp
@@ -0,0 +1,87 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/MainCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+MainCommand& MainCommand::operator=(const MainCommand&) = default;
+MainCommand::MainCommand(const MainCommand&) = default;
+MainCommand::~MainCommand(void) = default;
+
+MainCommand::MainCommand(void) :
+  entrypoint_{0},
+  stackSize_{0}
+{}
+
+MainCommand::MainCommand(const entry_point_command *cmd) :
+  entrypoint_{cmd->entryoff},
+  stackSize_{cmd->stacksize}
+{
+  this->command_ = static_cast<LOAD_COMMAND_TYPES>(cmd->cmd);
+  this->size_    = cmd->cmdsize;
+}
+
+
+uint64_t MainCommand::entrypoint(void) const {
+  return this->entrypoint_;
+}
+
+uint64_t MainCommand::stack_size(void) const {
+  return this->stackSize_;
+}
+
+void MainCommand::entrypoint(uint64_t entrypoint) {
+  this->entrypoint_ = entrypoint;
+}
+
+void MainCommand::stack_size(uint64_t stacksize) {
+  this->stackSize_ = stacksize;
+}
+
+void MainCommand::accept(Visitor& visitor) const {
+  LoadCommand::accept(visitor);
+
+  visitor.visit(this->entrypoint());
+  visitor.visit(this->stack_size());
+}
+
+bool MainCommand::operator==(const MainCommand& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool MainCommand::operator!=(const MainCommand& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& MainCommand::print(std::ostream& os) const {
+  LoadCommand::print(os);
+  os << std::hex;
+  os << std::left
+     << "Entrypoint: " << "0x" << this->entrypoint()
+     << std::endl
+     << "Stack size: " << "0x" << this->stack_size();
+  return os;
+}
+
+}
+}
diff --git a/src/MachO/Parser.cpp b/src/MachO/Parser.cpp
new file mode 100644
index 0000000..c862134
--- /dev/null
+++ b/src/MachO/Parser.cpp
@@ -0,0 +1,110 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <fstream>
+#include <iterator>
+#include <iostream>
+#include <algorithm>
+#include <regex>
+#include <stdexcept>
+#include <functional>
+
+#include "easylogging++.h"
+
+#include "LIEF/filesystem/filesystem.h"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/MachO/Parser.hpp"
+#include "LIEF/MachO/BinaryParser.hpp"
+#include "LIEF/MachO/utils.hpp"
+
+
+namespace LIEF {
+namespace MachO {
+Parser::Parser(void) = default;
+Parser::~Parser(void) = default;
+
+Parser::Parser(const std::string& file) :
+  LIEF::Parser{file}
+{
+
+  if (not is_macho(file)) {
+    throw bad_file("'" + file + "' is not a MachO binary");
+  }
+
+  this->stream_ = std::unique_ptr<VectorStream>(new VectorStream{file});
+  this->build();
+}
+
+
+std::vector<Binary*> Parser::parse(const std::string& filename) {
+  Parser parser{filename};
+  for (Binary* binary : parser.binaries_) {
+    binary->name(filesystem::path(filename).filename());
+  }
+
+  return parser.binaries_;
+}
+
+
+void Parser::build_fat(void) {
+
+  const fat_header *header = reinterpret_cast<const fat_header*>(
+      this->stream_->read(0, sizeof(fat_header)));
+  uint32_t nb_arch = Swap4Bytes(header->nfat_arch);
+  LOG(DEBUG) << "In this Fat binary there is " << std::dec << nb_arch << " archs" << std::endl;
+
+  if (nb_arch > 10) {
+    throw parser_error("Too much architectures");
+  }
+
+  const fat_arch* arch = reinterpret_cast<const fat_arch*>(
+      this->stream_->read(sizeof(fat_header), sizeof(fat_arch)));
+
+  for (size_t i = 0; i < nb_arch; ++i) {
+
+    const uint32_t offset = BinaryStream::swap_endian(arch[i].offset);
+    const uint32_t size   = BinaryStream::swap_endian(arch[i].size);
+
+    LOG(DEBUG) << "Dealing with arch[" << std::dec << i << "]" << std::endl;
+    LOG(DEBUG) << "[" << std::dec << i << "] offset: 0x" << std::hex << offset << std::endl;
+    LOG(DEBUG) << "[" << std::dec << i << "] size:   0x" << std::hex << size << std::endl;
+
+    const uint8_t* raw = reinterpret_cast<const uint8_t*>(
+      this->stream_->read(offset, size));
+
+    std::vector<uint8_t> data = {raw, raw + size};
+
+    Binary *binary = BinaryParser{std::move(data)}.get_binary();
+    this->binaries_.push_back(binary);
+  }
+}
+
+void Parser::build(void) {
+  MACHO_TYPES type = static_cast<MACHO_TYPES>(
+      *reinterpret_cast<const uint32_t*>(this->stream_->read(0, sizeof(uint32_t))));
+
+  // Fat binary
+  if (type == MACHO_TYPES::FAT_MAGIC or
+      type == MACHO_TYPES::FAT_CIGAM) {
+    this->build_fat();
+  } else { // fit binary
+    Binary *binary = BinaryParser(std::move(this->stream_)).get_binary();
+    this->binaries_.push_back(binary);
+  }
+}
+
+} //namespace MachO
+}
diff --git a/src/MachO/Section.cpp b/src/MachO/Section.cpp
new file mode 100644
index 0000000..f544a07
--- /dev/null
+++ b/src/MachO/Section.cpp
@@ -0,0 +1,284 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <numeric>
+#include <iomanip>
+#include <iterator>
+
+#include "LIEF/exception.hpp"
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/Section.hpp"
+#include "LIEF/MachO/SegmentCommand.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+Section& Section::operator=(const Section&) = default;
+Section::Section(const Section&) = default;
+Section::~Section(void) = default;
+
+Section::Section(void) :
+  segmentName_{""},
+  address_{0},
+  original_size_{0},
+  align_{0},
+  relocationOffset_{0},
+  nbRelocations_{0},
+  flags_{0},
+  reserved1_{0},
+  reserved2_{0},
+  reserved3_{0},
+  content_{},
+  segment_{nullptr}
+{
+  this->size_   = 0;
+  this->offset_ = 0;
+}
+
+Section::Section(const section_32 *sectionCmd) :
+  segmentName_{sectionCmd->segname},
+  address_{sectionCmd->addr},
+  original_size_{sectionCmd->size},
+  align_{sectionCmd->align},
+  relocationOffset_{sectionCmd->reloff},
+  nbRelocations_{sectionCmd->nreloc},
+  flags_{sectionCmd->flags},
+  reserved1_{sectionCmd->reserved1},
+  reserved2_{sectionCmd->reserved2},
+  reserved3_{0},
+  segment_{nullptr}
+{
+  this->name_   = sectionCmd->sectname;
+  this->size_   = sectionCmd->size;
+  this->offset_ = sectionCmd->offset;
+}
+
+Section::Section(const section_64 *sectionCmd) :
+  segmentName_{sectionCmd->segname},
+  address_{sectionCmd->addr},
+  original_size_{sectionCmd->size},
+  align_{sectionCmd->align},
+  relocationOffset_{sectionCmd->reloff},
+  nbRelocations_{sectionCmd->nreloc},
+  flags_{sectionCmd->flags},
+  reserved1_{sectionCmd->reserved1},
+  reserved2_{sectionCmd->reserved2},
+  reserved3_{sectionCmd->reserved3},
+  segment_{nullptr}
+{
+  this->name_   = sectionCmd->sectname;
+  this->size_   = sectionCmd->size;
+  this->offset_ = sectionCmd->offset;
+}
+
+
+std::vector<uint8_t> Section::content(void) const {
+  if (this->segment_ == nullptr) {
+    return this->content_;
+  }
+
+  if (this->size_ == 0 or this->offset_ == 0) { // bss section for instance
+    return {};
+  }
+
+  uint64_t relative_offset = this->offset_ - this->segment_->file_offset();
+  const std::vector<uint8_t>& content = this->segment_->content();
+  if ((relative_offset + this->size_) > content.size()) {
+    throw LIEF::corrupted("Section's size is bigger than segment's size");
+  }
+  std::vector<uint8_t> section_content = {
+    content.data() + relative_offset,
+    content.data() + relative_offset + this->size_};
+  return section_content;
+}
+
+const std::string& Section::segment_name(void) const {
+  if (this->segment_ != nullptr) {
+    return this->segment_->name();
+  } else {
+    return this->segmentName_;
+  }
+}
+
+uint64_t Section::address(void) const {
+  return this->virtual_address();
+}
+
+uint32_t Section::alignment(void) const {
+  return this->align_;
+}
+
+uint32_t Section::relocation_offset(void) const {
+  return relocationOffset_;
+}
+
+uint32_t Section::numberof_relocations(void) const {
+  return nbRelocations_;
+}
+
+uint32_t Section::flags(void) const {
+  return (this->flags_ >> 8);
+}
+
+uint32_t Section::reserved1(void) const {
+  return this->reserved1_;
+}
+
+uint32_t Section::reserved2(void) const {
+  return this->reserved2_;
+}
+
+uint32_t Section::reserved3(void) const {
+  return this->reserved3_;
+}
+
+
+uint32_t Section::raw_flags(void) const {
+  return this->flags_;
+}
+
+SECTION_TYPES Section::type(void) const {
+  return static_cast<SECTION_TYPES>(
+      this->flags_ & SECTION_FLAGS_HELPER::SECTION_TYPE_MASK);
+}
+
+std::set<SECTION_FLAGS> Section::flags_list(void) const {
+
+  std::set<SECTION_FLAGS> flags;
+
+  auto has_flag = [this] (SECTION_FLAGS flag) {
+    return (static_cast<uint32_t>(flag) & this->flags_) > 0;
+  };
+
+  std::copy_if(
+      std::begin(section_flags_array),
+      std::end(section_flags_array),
+      std::inserter(flags, std::begin(flags)),
+      has_flag);
+
+  return flags;
+}
+
+void Section::segment_name(const std::string& name) {
+  this->segmentName_ = name;
+  if (this->segment_ != nullptr) {
+    return this->segment_->name(name);
+  }
+}
+
+void Section::address(uint64_t address) {
+  this->virtual_address(address);
+}
+
+void Section::alignment(uint32_t align) {
+  this->align_ = align;
+}
+
+void Section::relocation_offset(uint32_t relocOffset) {
+  this->relocationOffset_ = relocOffset;
+}
+
+void Section::numberof_relocations(uint32_t nbReloc) {
+  this->nbRelocations_ = nbReloc;
+}
+
+void Section::flags(uint32_t flags) {
+  this->flags_ = this->flags_ | (flags << 8);
+}
+
+void Section::reserved1(uint32_t reserved1) {
+  this->reserved1_ = reserved1;
+}
+
+void Section::reserved2(uint32_t reserved2) {
+  this->reserved2_ = reserved2;
+}
+
+void Section::reserved3(uint32_t reserved3) {
+  this->reserved3_ = reserved3;
+}
+
+void Section::type(SECTION_TYPES type) {
+  this->flags_ =
+    (this->flags_ & SECTION_FLAGS_HELPER::SECTION_FLAGS_MASK) | static_cast<uint8_t>(type);
+}
+
+
+void Section::accept(Visitor& visitor) const {
+  LIEF::Section::accept(visitor);
+
+  visitor.visit(this->content());
+  visitor.visit(this->segment_name());
+  visitor.visit(this->address());
+  visitor.visit(this->alignment());
+  visitor.visit(this->relocation_offset());
+  visitor.visit(this->numberof_relocations());
+  visitor.visit(this->flags());
+  visitor.visit(this->type());
+  visitor.visit(this->reserved1());
+  visitor.visit(this->reserved2());
+  visitor.visit(this->reserved3());
+  visitor.visit(this->raw_flags());
+}
+
+bool Section::operator==(const Section& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Section::operator!=(const Section& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const Section& section) {
+  const auto& flags = section.flags_list();
+
+   std::string flags_str = std::accumulate(
+     std::begin(flags),
+     std::end(flags), std::string{},
+     [] (const std::string& a, SECTION_FLAGS b) {
+         return a.empty() ? to_string(b) : a + " " + to_string(b);
+     });
+
+  os << std::hex;
+  os << std::left
+     << std::setw(17) << section.name()
+     << std::setw(17) << section.segment_name()
+     << std::setw(10) << section.address()
+     << std::setw(10) << section.size()
+     << std::setw(10) << section.offset()
+     << std::setw(10) << section.alignment()
+     << std::setw(30) << to_string(section.type())
+     << std::setw(20) << section.relocation_offset()
+     << std::setw(20) << section.numberof_relocations()
+     << std::setw(10) << section.reserved1()
+     << std::setw(10) << section.reserved2()
+     << std::setw(10) << section.reserved3()
+     << std::setw(10) << flags_str;
+
+  if (section.segment_ != nullptr) {
+    //os << std::setw(10) << section.segment_->name();
+  }
+
+  return os;
+}
+
+} // namespace MachO
+} // namespace LIEF
diff --git a/src/MachO/SegmentCommand.cpp b/src/MachO/SegmentCommand.cpp
new file mode 100644
index 0000000..4526d65
--- /dev/null
+++ b/src/MachO/SegmentCommand.cpp
@@ -0,0 +1,226 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/SegmentCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+SegmentCommand::SegmentCommand(void) = default;
+SegmentCommand& SegmentCommand::operator=(const SegmentCommand&) = default;
+SegmentCommand::SegmentCommand(const SegmentCommand&) = default;
+SegmentCommand::~SegmentCommand(void) = default;
+
+SegmentCommand::SegmentCommand(const segment_command_32 *segmentCmd) :
+  name_{segmentCmd->segname},
+  virtualAddress_{segmentCmd->vmaddr},
+  virtualSize_{segmentCmd->vmsize},
+  fileOffset_{segmentCmd->fileoff},
+  fileSize_{segmentCmd->filesize},
+  maxProtection_{segmentCmd->maxprot},
+  initProtection_{segmentCmd->initprot},
+  nbSections_{segmentCmd->nsects},
+  flags_{segmentCmd->flags}
+{
+  this->command_ = LOAD_COMMAND_TYPES::LC_SEGMENT;
+  this->size_    = segmentCmd->cmdsize;
+}
+
+SegmentCommand::SegmentCommand(const segment_command_64 *segmentCmd) :
+  name_{segmentCmd->segname},
+  virtualAddress_{segmentCmd->vmaddr},
+  virtualSize_{segmentCmd->vmsize},
+  fileOffset_{segmentCmd->fileoff},
+  fileSize_{segmentCmd->filesize},
+  maxProtection_{segmentCmd->maxprot},
+  initProtection_{segmentCmd->initprot},
+  nbSections_{segmentCmd->nsects},
+  flags_{segmentCmd->flags}
+{
+  this->command_ = LOAD_COMMAND_TYPES::LC_SEGMENT_64;
+  this->size_    = segmentCmd->cmdsize;
+}
+
+
+const std::string& SegmentCommand::name(void) const {
+  return this->name_;
+}
+
+uint64_t SegmentCommand::virtual_address(void) const {
+  return this->virtualAddress_;
+}
+
+uint64_t SegmentCommand::virtual_size(void) const {
+  return this->virtualSize_;
+}
+
+uint64_t SegmentCommand::file_size(void) const {
+  return this->fileSize_;
+}
+
+uint64_t SegmentCommand::file_offset(void) const {
+  return this->fileOffset_;
+}
+
+uint32_t SegmentCommand::max_protection(void) const {
+  return this->maxProtection_;
+}
+
+uint32_t SegmentCommand::init_protection(void) const {
+  return this->initProtection_;
+}
+
+uint32_t SegmentCommand::numberof_sections(void) const {
+  return this->nbSections_;
+}
+
+uint32_t SegmentCommand::flags(void) const {
+  return this->flags_;
+}
+
+it_sections SegmentCommand::sections(void) {
+  sections_t result;
+  for (Section& s : this->sections_) {
+    result.push_back(&s);
+  }
+  return it_sections{result};
+}
+
+
+it_const_sections SegmentCommand::sections(void) const {
+  sections_t result;
+  for (const Section& s : this->sections_) {
+    result.push_back(const_cast<Section*>(&s));
+  }
+  return it_const_sections{result};
+}
+
+const std::vector<uint8_t>& SegmentCommand::content(void) const {
+  return this->data_;
+}
+
+void SegmentCommand::name(const std::string& name) {
+  this->name_ = name;
+}
+
+void SegmentCommand::virtual_address(uint64_t virtualAddress) {
+  this->virtualAddress_ = virtualAddress;
+}
+
+void SegmentCommand::virtual_size(uint64_t virtualSize) {
+  this->virtualSize_ = virtualSize;
+}
+
+void SegmentCommand::file_size(uint64_t fileSize) {
+  this->fileSize_ = fileSize;
+}
+
+void SegmentCommand::file_offset(uint64_t fileOffset) {
+  this->fileOffset_ = fileOffset;
+}
+
+void SegmentCommand::max_protection(uint32_t maxProtection) {
+  this->maxProtection_ = maxProtection;
+}
+
+void SegmentCommand::init_protection(uint32_t initProtection) {
+  this->initProtection_ = initProtection;
+}
+
+void SegmentCommand::numberof_sections(uint32_t nbSections) {
+  this->nbSections_ = nbSections;
+}
+
+void SegmentCommand::flags(uint32_t flags) {
+  this->flags_ = flags;
+}
+
+
+//void SegmentCommand::add_section(const Section& section) {
+//  this->sections_.push_back(section);
+//}
+
+void SegmentCommand::content(const std::vector<uint8_t>& data) {
+  this->data_ = data;
+}
+
+
+void SegmentCommand::remove_all_sections(void) {
+  this->numberof_sections(0);
+  this->sections_ = {};
+}
+
+
+void SegmentCommand::accept(Visitor& visitor) const {
+  LoadCommand::accept(visitor);
+
+  visitor.visit(this->name());
+  visitor.visit(this->virtual_address());
+  visitor.visit(this->virtual_size());
+  visitor.visit(this->file_size());
+  visitor.visit(this->file_offset());
+  visitor.visit(this->max_protection());
+  visitor.visit(this->init_protection());
+  visitor.visit(this->numberof_sections());
+  visitor.visit(this->flags());
+  visitor.visit(this->content());
+
+  for (const Section& section : this->sections()) {
+    visitor(section);
+  }
+}
+
+bool SegmentCommand::operator==(const SegmentCommand& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool SegmentCommand::operator!=(const SegmentCommand& rhs) const {
+  return not (*this == rhs);
+}
+
+
+
+std::ostream& SegmentCommand::print(std::ostream& os) const {
+
+  LoadCommand::print(os);
+  os << std::hex;
+  os << std::left
+     << std::setw(15) << this->name()
+     << std::setw(15) << this->virtual_address()
+     << std::setw(15) << this->virtual_size()
+     << std::setw(15) << this->file_offset()
+     << std::setw(15) << this->file_size()
+     << std::setw(15) << this->max_protection()
+     << std::setw(15) << this->init_protection()
+     << std::setw(15) << this->numberof_sections()
+     << std::setw(15) << this->flags()
+     << std::endl;
+
+  os << "Sections in this segment :" << std::endl;
+  for (const Section& section : this->sections()) {
+    os << "\t" << section << std::endl;
+  }
+
+  return os;
+}
+
+}
+}
diff --git a/src/MachO/Symbol.cpp b/src/MachO/Symbol.cpp
new file mode 100644
index 0000000..e77399e
--- /dev/null
+++ b/src/MachO/Symbol.cpp
@@ -0,0 +1,131 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/Symbol.hpp"
+#include "LIEF/MachO/EnumToString.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+Symbol::Symbol(void) = default;
+Symbol& Symbol::operator=(const Symbol&) = default;
+Symbol::Symbol(const Symbol&) = default;
+Symbol::~Symbol(void) = default;
+
+Symbol::Symbol(const nlist_32 *cmd) :
+  type_{cmd->n_type},
+  numberof_sections_{cmd->n_sect},
+  description_{static_cast<uint16_t>(cmd->n_desc)},
+  value_{cmd->n_value}
+{}
+
+Symbol::Symbol(const nlist_64 *cmd) :
+  type_{cmd->n_type},
+  numberof_sections_{cmd->n_sect},
+  description_{cmd->n_desc},
+  value_{cmd->n_value}
+{}
+
+uint8_t Symbol::type(void) const {
+  return this->type_;
+}
+
+uint8_t  Symbol::numberof_sections(void) const {
+  return this->numberof_sections_;
+}
+
+uint16_t Symbol::description(void) const {
+  return this->description_;
+}
+
+uint64_t Symbol::value(void) const {
+  return this->value_;
+}
+
+void Symbol::type(uint8_t type) {
+  this->type_ = type;
+}
+
+void Symbol::numberof_sections(uint8_t nbsections) {
+  this->numberof_sections_ = nbsections;
+}
+
+void Symbol::description(uint16_t desc) {
+  this->description_ = desc;
+}
+
+void Symbol::value(uint64_t value) {
+  this->value_ = value;
+}
+
+bool Symbol::is_external(void) const {
+  return (this->type_ & SYMBOL_TYPES::N_TYPE) == N_LIST_TYPES::N_UNDF;
+    //(this->type_ & SYMBOL_TYPES::N_EXT) == SYMBOL_TYPES::N_EXT;
+    //(this->type_ & SYMBOL_TYPES::N_PEXT) == 0;
+}
+
+void Symbol::accept(Visitor& visitor) const {
+
+  LIEF::Symbol::accept(visitor);
+
+  visitor.visit(this->type());
+  visitor.visit(this->numberof_sections());
+  visitor.visit(this->description());
+  visitor.visit(this->value());
+}
+
+
+bool Symbol::operator==(const Symbol& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Symbol::operator!=(const Symbol& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const Symbol& symbol) {
+  std::string type;
+
+  if ((symbol.type_ & SYMBOL_TYPES::N_TYPE) == SYMBOL_TYPES::N_TYPE) {
+    type = to_string(
+        static_cast<N_LIST_TYPES>(symbol.type_ & SYMBOL_TYPES::N_TYPE));
+  } else if((symbol.type_ & SYMBOL_TYPES::N_STAB) > 0) {
+    type = to_string(SYMBOL_TYPES::N_STAB);
+  } else if((symbol.type_ & SYMBOL_TYPES::N_PEXT) == SYMBOL_TYPES::N_PEXT) {
+    type = to_string(SYMBOL_TYPES::N_PEXT);
+  }  else if((symbol.type_ & SYMBOL_TYPES::N_EXT) == SYMBOL_TYPES::N_EXT) {
+    type = to_string(SYMBOL_TYPES::N_EXT);
+  }
+
+
+
+  os << std::hex;
+  os << std::left;
+  os << std::setw(30) << symbol.name_
+     << std::setw(10) << type
+     << std::setw(10) << symbol.description_
+     << std::setw(20) << symbol.value_;
+  return os;
+
+}
+} // namespace MachO
+} // namespace LIEF
diff --git a/src/MachO/SymbolCommand.cpp b/src/MachO/SymbolCommand.cpp
new file mode 100644
index 0000000..6b01c1a
--- /dev/null
+++ b/src/MachO/SymbolCommand.cpp
@@ -0,0 +1,98 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/SymbolCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+SymbolCommand::SymbolCommand(void) = default;
+SymbolCommand& SymbolCommand::operator=(const SymbolCommand&) = default;
+SymbolCommand::SymbolCommand(const SymbolCommand&) = default;
+SymbolCommand::~SymbolCommand(void) = default;
+
+SymbolCommand::SymbolCommand(const symtab_command *command) :
+  symbolOffset_{command->symoff},
+  numberOfSymbols_{command->nsyms},
+  stringsOffset_{command->stroff},
+  stringsSize_{command->strsize}
+{
+  this->command_ = static_cast<LOAD_COMMAND_TYPES>(command->cmd);
+  this->size_    = command->cmdsize;
+}
+
+
+uint32_t SymbolCommand::symbol_offset(void) const {
+  return this->symbolOffset_;
+}
+
+uint32_t SymbolCommand::numberof_symbols(void) const {
+  return this->numberOfSymbols_;
+}
+
+uint32_t SymbolCommand::strings_offset(void) const {
+  return this->stringsOffset_;
+}
+
+uint32_t SymbolCommand::strings_size(void) const {
+  return this->stringsSize_;
+}
+
+void SymbolCommand::symbol_offset(uint32_t offset) {
+  this->symbolOffset_ = offset;
+}
+
+void SymbolCommand::numberof_symbol(uint32_t nb) {
+  this->numberOfSymbols_ = nb;
+}
+
+void SymbolCommand::strings_offset(uint32_t offset) {
+  this->stringsOffset_ = offset;
+}
+
+void SymbolCommand::strings_size(uint32_t size) {
+  this->stringsSize_ = size;
+}
+
+void SymbolCommand::accept(Visitor& visitor) const {
+  LoadCommand::accept(visitor);
+
+  visitor.visit(this->symbol_offset());
+  visitor.visit(this->numberof_symbols());
+  visitor.visit(this->strings_offset());
+  visitor.visit(this->strings_size());
+}
+
+
+bool SymbolCommand::operator==(const SymbolCommand& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool SymbolCommand::operator!=(const SymbolCommand& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& SymbolCommand::print(std::ostream& os) const {
+  LoadCommand::print(os);
+  return os;
+}
+
+
+}
+}
diff --git a/src/MachO/UUIDCommand.cpp b/src/MachO/UUIDCommand.cpp
new file mode 100644
index 0000000..7c8de73
--- /dev/null
+++ b/src/MachO/UUIDCommand.cpp
@@ -0,0 +1,74 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <numeric>
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/MachO/UUIDCommand.hpp"
+
+namespace LIEF {
+namespace MachO {
+
+UUIDCommand::UUIDCommand(void) = default;
+UUIDCommand& UUIDCommand::operator=(const UUIDCommand&) = default;
+UUIDCommand::UUIDCommand(const UUIDCommand&) = default;
+UUIDCommand::~UUIDCommand(void) = default;
+
+UUIDCommand::UUIDCommand(const uuid_command *uuidCmd) {
+  this->command_ = static_cast<LOAD_COMMAND_TYPES>(uuidCmd->cmd);
+  this->size_    = uuidCmd->cmdsize;
+  std::copy(std::begin(uuidCmd->uuid), std::end(uuidCmd->uuid), std::begin(this->uuid_));
+}
+
+uuid_t UUIDCommand::uuid(void) const {
+  return this->uuid_;
+}
+
+void UUIDCommand::uuid(const uuid_t& uuid) {
+  this->uuid_ = uuid;
+}
+
+
+void UUIDCommand::accept(Visitor& visitor) const {
+  LoadCommand::accept(visitor);
+  visitor.visit(this->uuid());
+}
+
+
+bool UUIDCommand::operator==(const UUIDCommand& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool UUIDCommand::operator!=(const UUIDCommand& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& UUIDCommand::print(std::ostream& os) const {
+  LoadCommand::print(os);
+  for (uint32_t x : this->uuid()) {
+    os << std::setw(2) << std::setfill('0') << std::hex << static_cast<uint32_t>(x) << " ";
+  }
+  os << std::setfill(' ');
+  return os;
+}
+
+
+}
+}
diff --git a/src/MachO/utils.cpp b/src/MachO/utils.cpp
new file mode 100644
index 0000000..45abb8c
--- /dev/null
+++ b/src/MachO/utils.cpp
@@ -0,0 +1,103 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/MachO/utils.hpp"
+#include "LIEF/MachO/Structures.hpp"
+
+#include "LIEF/exception.hpp"
+
+#include <fstream>
+#include <iterator>
+#include <string>
+#include <stdexcept>
+#include <vector>
+
+namespace LIEF {
+namespace MachO {
+
+bool is_macho(const std::string& file) {
+  std::ifstream binary(file, std::ios::in | std::ios::binary);
+  if (not binary) {
+    throw LIEF::bad_file("Unable to open the '" + file + "'");
+  }
+
+  MACHO_TYPES magic;
+  binary.seekg(0, std::ios::beg);
+  binary.read(reinterpret_cast<char*>(&magic), sizeof(magic));
+
+  if (magic == MACHO_TYPES::MH_MAGIC or
+      magic == MACHO_TYPES::MH_CIGAM or
+      magic == MACHO_TYPES::MH_MAGIC_64 or
+      magic == MACHO_TYPES::MH_CIGAM_64 or
+      magic == MACHO_TYPES::FAT_MAGIC or
+      magic == MACHO_TYPES::FAT_CIGAM)
+  {
+    return true;
+  }
+  return false;
+}
+
+bool is_fat(const std::string& file) {
+  if (not is_macho(file)) {
+    throw LIEF::bad_format("'" + file + "' is not a MachO");
+  }
+
+  std::ifstream binary(file, std::ios::in | std::ios::binary);
+
+  if (not binary) {
+    throw LIEF::bad_file("Unable to open the '" + file + "'");
+  }
+
+  MACHO_TYPES magic;
+  binary.seekg(0, std::ios::beg);
+  binary.read(reinterpret_cast<char*>(&magic), sizeof(magic));
+
+  if (magic == MACHO_TYPES::FAT_MAGIC or
+      magic == MACHO_TYPES::FAT_CIGAM)
+  {
+    return true;
+  }
+
+  return false;
+}
+
+bool is_64(const std::string& file) {
+ if (not is_macho(file)) {
+    throw LIEF::bad_format("'" + file + "' is not a MachO");
+  }
+
+  std::ifstream binary(file, std::ios::in | std::ios::binary);
+
+  if (not binary) {
+    throw LIEF::bad_file("Unable to open the '" + file + "'");
+  }
+
+  MACHO_TYPES magic;
+  binary.seekg(0, std::ios::beg);
+  binary.read(reinterpret_cast<char*>(&magic), sizeof(magic));
+
+  if (magic == MACHO_TYPES::MH_MAGIC_64 or
+      magic == MACHO_TYPES::MH_CIGAM_64 )
+  {
+    return true;
+  }
+  return false;
+
+}
+
+
+}
+}
+
diff --git a/src/PE/Binary.cpp b/src/PE/Binary.cpp
new file mode 100644
index 0000000..74a3f9c
--- /dev/null
+++ b/src/PE/Binary.cpp
@@ -0,0 +1,1109 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <utility>
+#include <algorithm>
+#include <iterator>
+#include <map>
+#include <numeric>
+#include <limits>
+
+#include "easylogging++.h"
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/exception.hpp"
+#include "LIEF/utils.hpp"
+
+#include "LIEF/PE/Binary.hpp"
+#include "LIEF/PE/Builder.hpp"
+#include "LIEF/PE/utils.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+namespace LIEF {
+namespace PE {
+
+static const std::map<MACHINE_TYPES, std::pair<ARCHITECTURES, std::set<MODES>>> arch_pe_to_lief {
+  {MACHINE_TYPES::IMAGE_FILE_MACHINE_UNKNOWN,   {ARCH_NONE, {}}},
+  {MACHINE_TYPES::IMAGE_FILE_MACHINE_AMD64,     {ARCH_X86,   {MODE_64}}},
+  {MACHINE_TYPES::IMAGE_FILE_MACHINE_ARM,       {ARCH_ARM,   {MODE_LITTLE_ENDIAN}}},
+  {MACHINE_TYPES::IMAGE_FILE_MACHINE_ARMNT,     {ARCH_ARM,   {MODE_V7, MODE_THUMB}}},
+  {MACHINE_TYPES::IMAGE_FILE_MACHINE_ARM64,     {ARCH_ARM64, {MODE_V8}}},
+  {MACHINE_TYPES::IMAGE_FILE_MACHINE_I386,      {ARCH_X86,   {MODE_32}}},
+  {MACHINE_TYPES::IMAGE_FILE_MACHINE_IA64,      {ARCH_INTEL, {MODE_64}}},
+  {MACHINE_TYPES::IMAGE_FILE_MACHINE_THUMB,     {ARCH_ARM,   {MODE_THUMB}}},
+};
+
+Binary::Binary(void) :
+  dos_header_{},
+  header_{},
+  optional_header_{},
+  has_tls_{false},
+  has_imports_{false},
+  has_signature_{false},
+  has_exports_{false},
+  has_resources_{false},
+  has_exceptions_{false},
+  has_relocations_{false},
+  has_debug_{false},
+  has_configuration_{false},
+  tls_{},
+  sections_{},
+  data_directories_{},
+  symbols_{},
+  strings_table_{},
+  relocations_{},
+  resources_{nullptr},
+  imports_{},
+  export_{},
+  debug_{}
+{}
+
+Binary::~Binary(void) {
+  for (Section *section : this->sections_) {
+    delete section;
+  }
+
+  for (DataDirectory *directory : this->data_directories_) {
+    delete directory;
+  }
+
+  if (this->resources_ != nullptr) {
+    delete this->resources_;
+  }
+}
+
+PE_TYPE Binary::type(void) const {
+  return this->type_;
+}
+
+
+Binary::Binary(const std::string& name, PE_TYPE type) :
+  Binary::Binary{}
+{
+  this->type_ = type;
+  this->name_ = name;
+
+  if (type == PE_TYPE::PE32) {
+    this->header().machine(MACHINE_TYPES::IMAGE_FILE_MACHINE_I386);
+
+    this->header().sizeof_optional_header(sizeof(pe32_optional_header) + (DEFAULT_NUMBER_DATA_DIRECTORIES + 1) * sizeof(pe_data_directory));
+    this->header().add_characteristic(HEADER_CHARACTERISTICS::IMAGE_FILE_32BIT_MACHINE);
+
+    this->optional_header().magic(PE_TYPE::PE32);
+  } else {
+    this->header().machine(MACHINE_TYPES::IMAGE_FILE_MACHINE_AMD64);
+    this->header().sizeof_optional_header(sizeof(pe64_optional_header) + (DEFAULT_NUMBER_DATA_DIRECTORIES + 1) * sizeof(pe_data_directory));
+    this->header().add_characteristic(HEADER_CHARACTERISTICS::IMAGE_FILE_LARGE_ADDRESS_AWARE);
+
+    this->optional_header().magic(PE_TYPE::PE32_PLUS);
+  }
+
+  // Add data directories
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::EXPORT_TABLE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::IMPORT_TABLE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::RESOURCE_TABLE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::EXCEPTION_TABLE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::CERTIFICATE_TABLE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::BASE_RELOCATION_TABLE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::DEBUG});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::ARCHITECTURE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::GLOBAL_PTR});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::TLS_TABLE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::LOAD_CONFIG_TABLE});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::BOUND_IMPORT});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::IAT});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::DELAY_IMPORT_DESCRIPTOR});
+  this->data_directories_.emplace_back(new DataDirectory{DATA_DIRECTORY::CLR_RUNTIME_HEADER});
+
+  this->optional_header().sizeof_headers(this->get_sizeof_headers());
+  this->optional_header().sizeof_image(this->get_virtual_size());
+}
+
+void Binary::write(const std::string& filename) {
+  Builder builder{this};
+
+  builder.
+    build_imports(false).
+    patch_imports(false).
+    build_relocations(false).
+    build_tls(false).
+    build_resources(true);
+
+  builder.build();
+  builder.write(filename);
+}
+
+TLS& Binary::tls(void) {
+  return const_cast<TLS&>(static_cast<const Binary*>(this)->tls());
+}
+
+
+const TLS& Binary::tls(void) const {
+  return this->tls_;
+}
+
+void Binary::tls(const TLS& tls) {
+  this->tls_ = tls;
+  this->has_tls_ = true;
+}
+
+uint64_t Binary::va_to_offset(uint64_t VA) {
+
+  //TODO: add checks relocation/va < imagebase
+  uint64_t rva = VA - this->optional_header().imagebase();
+  return this->rva_to_offset(rva);
+}
+
+uint64_t Binary::rva_to_offset(uint64_t RVA) {
+  auto&& it_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [RVA] (const Section* section)
+      {
+        if (section == nullptr) {
+          return false;
+        }
+        return (RVA >= section->virtual_address() and
+            RVA < (section->virtual_address() + section->virtual_size()));
+      });
+
+  if (it_section == std::end(sections_)) {
+    // If not found withint a section,
+    // we assume that rva == offset
+    return static_cast<uint32_t>(RVA);
+  }
+
+  // rva - virtual_address + pointer_to_raw_data
+  uint32_t section_alignment = this->optional_header().section_alignment();
+  uint32_t file_alignment    = this->optional_header().file_alignment();
+  if (section_alignment < 0x1000) {
+    section_alignment = file_alignment;
+  }
+
+  uint64_t section_va     = (*it_section)->virtual_address();
+  uint64_t section_offset = (*it_section)->pointerto_raw_data();
+
+  section_va     = align(section_va, section_alignment);
+  section_offset = align(section_offset, file_alignment);
+  return ((RVA - section_va) + section_offset);
+}
+
+const Section& Binary::section_from_offset(uint64_t offset) const {
+  auto&& it_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [&offset] (const Section* section) {
+        if (section == nullptr) {
+          return false;
+        }
+        return (
+            offset >= section->pointerto_raw_data() and
+            offset < (section->pointerto_raw_data() + section->sizeof_raw_data()));
+      });
+
+  if (it_section == std::end(this->sections_)) {
+    throw LIEF::not_found("Section not found");
+  }
+
+  return **it_section;
+}
+
+Section& Binary::section_from_offset(uint64_t offset) {
+  return const_cast<Section&>(static_cast<const Binary*>(this)->section_from_offset(offset));
+}
+
+
+const Section& Binary::section_from_virtual_address(uint64_t virtual_address) const {
+  auto&& it_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [&virtual_address] (const Section* section) {
+        if (section == nullptr) {
+          return false;
+        }
+        return (
+            virtual_address >= section->virtual_address() and
+            virtual_address < (section->virtual_address() + section->virtual_size()));
+      });
+
+  if (it_section == std::end(this->sections_)) {
+    throw LIEF::not_found("Section not found");
+  }
+
+
+  return **it_section;
+}
+
+Section& Binary::section_from_virtual_address(uint64_t virtual_address) {
+  return const_cast<Section&>(static_cast<const Binary*>(this)->section_from_virtual_address(virtual_address));
+}
+
+
+
+DataDirectory& Binary::data_directory(DATA_DIRECTORY index) {
+  return const_cast<DataDirectory&>(static_cast<const Binary*>(this)->data_directory(index));
+}
+
+const DataDirectory& Binary::data_directory(DATA_DIRECTORY index) const {
+  if (static_cast<size_t>(index) < this->data_directories_.size() and this->data_directories_[static_cast<size_t>(index)] != nullptr) {
+    return *this->data_directories_[index];
+  } else {
+    throw not_found("Data directory doesn't exist");
+  }
+}
+
+bool Binary::has_tls(void) const {
+  return this->has_tls_;
+}
+
+bool Binary::has_imports(void) const {
+  return this->has_imports_;
+}
+
+bool Binary::has_signature(void) const {
+  return this->has_signature_;
+}
+
+bool Binary::has_exports(void) const {
+  return this->has_exports_;
+}
+
+bool Binary::has_resources(void) const {
+  return this->has_resources_;
+}
+
+bool Binary::has_exceptions(void) const {
+  return this->has_exceptions_;
+}
+
+
+bool Binary::has_relocations(void) const {
+  return this->has_relocations_;
+}
+
+bool Binary::has_debug(void) const {
+  return this->has_debug_;
+}
+
+
+bool Binary::has_configuration(void) const {
+  return this->has_configuration_;
+}
+
+//
+// Interface with LIEF::Binary
+//
+LIEF::symbols_t Binary::get_abstract_symbols(void) {
+  LIEF::symbols_t lief_symbols;
+  for (Symbol& s : this->symbols_) {
+    lief_symbols.push_back(&s);
+  }
+  return lief_symbols;
+}
+
+
+// Sections
+// ========
+
+it_sections Binary::get_sections(void) {
+  return it_sections{this->sections_};
+}
+
+
+it_const_sections Binary::get_sections(void) const {
+  return it_const_sections{this->sections_};
+}
+
+LIEF::sections_t Binary::get_abstract_sections(void) {
+  return {std::begin(this->sections_), std::end(this->sections_)};
+}
+
+
+Section& Binary::get_section(const std::string& name) {
+  return const_cast<Section&>(static_cast<const Binary*>(this)->get_section(name));
+}
+
+const Section& Binary::get_section(const std::string& name) const {
+  auto&& section_it = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [&name] (const Section* section)
+      {
+        return section != nullptr and section->name() == name;
+      });
+
+  if (section_it == std::end(this->sections_)) {
+    throw LIEF::not_found("No such section with this name");
+  }
+  return **section_it;
+}
+
+
+const Section& Binary::get_import_section(void) const {
+  if (not this->has_imports()) {
+    throw not_found("Current binary doesn't have Import directory");
+  }
+  const DataDirectory& import_directory = this->data_directory(DATA_DIRECTORY::IMPORT_TABLE);
+  return import_directory.section();
+}
+
+
+Section& Binary::get_import_section(void) {
+  return const_cast<Section&>(static_cast<const Binary*>(this)->get_import_section());
+}
+
+// Headers
+// =======
+
+// Dos Header
+// ----------
+DosHeader& Binary::dos_header(void) {
+  return const_cast<DosHeader&>(static_cast<const Binary*>(this)->dos_header());
+}
+
+
+const DosHeader& Binary::dos_header(void) const {
+  return this->dos_header_;
+}
+
+
+// Standard header
+// ---------------
+Header& Binary::header(void) {
+  return const_cast<Header&>(static_cast<const Binary*>(this)->header());
+}
+
+
+const Header& Binary::header(void) const {
+  return this->header_;
+}
+
+// Optional Header
+// ---------------
+const OptionalHeader& Binary::optional_header(void) const {
+  return this->optional_header_;
+}
+
+
+OptionalHeader& Binary::optional_header(void) {
+  return const_cast<OptionalHeader&>(static_cast<const Binary*>(this)->optional_header());
+}
+
+
+
+
+uint64_t Binary::get_virtual_size(void) const {
+  uint64_t size = 0;
+  size += this->dos_header().addressof_new_exeheader();
+  size += sizeof(pe_header);
+  if (this->type_ == PE_TYPE::PE32) {
+    size += sizeof(pe32_optional_header);
+  } else {
+    size += sizeof(pe64_optional_header);
+  }
+  for (const Section* section : this->sections_) {
+    size = std::max(size, section->virtual_address() + section->virtual_size());
+  }
+  size = LIEF::align(size, this->optional_header().section_alignment());
+  return size;
+}
+
+
+uint32_t Binary::get_sizeof_headers(void) const {
+  uint32_t size = 0;
+  size += this->dos_header().addressof_new_exeheader();
+  size += sizeof(pe_header);
+  if (this->type_ == PE_TYPE::PE32) {
+    size += sizeof(pe32_optional_header);
+  } else {
+    size += sizeof(pe64_optional_header);
+  }
+
+  size += sizeof(pe_data_directory) * (this->data_directories_.size() + 1);
+  size += sizeof(pe_section) * (this->sections_.size() + 1);
+  size = static_cast<uint32_t>(LIEF::align(size, this->optional_header().file_alignment()));
+  return size;
+
+}
+
+void Binary::delete_section(const std::string& name) {
+  Section& section_to_delete = this->get_section(name);
+
+  this->header().numberof_sections(this->header().numberof_sections() - 1);
+
+  this->optional_header().sizeof_headers(this->get_sizeof_headers());
+  this->optional_header().sizeof_image(static_cast<uint32_t>(this->get_virtual_size()));
+
+  this->sections_.erase(
+      std::remove_if(
+        std::begin(this->sections_),
+        std::end(this->sections_),
+        [&section_to_delete](const Section* section)
+        {
+          return section->name() == section_to_delete.name();
+        }),
+      std::end(this->sections_));
+}
+
+Section& Binary::add_section(const Section& section, SECTION_TYPES type) {
+
+  // Check if a section of type **type** already exist
+  auto&& it_section = std::find_if(
+      std::begin(this->sections_),
+      std::end(this->sections_),
+      [&type] (const Section* s) {
+        return s != nullptr and s->is_type(type);
+      });
+
+  if (it_section != std::end(this->sections_)) {
+    Section* s = *it_section;
+    s->remove_type(type);
+  }
+
+  Section* new_section                = new Section{section};
+  std::vector<uint8_t> content        = new_section->content();
+  const uint32_t section_size         = static_cast<uint32_t>(content.size());
+  const uint32_t section_size_aligned = static_cast<uint32_t>(align(section_size, this->optional_header().file_alignment()));
+  const uint32_t virtual_size         = section_size;
+
+  content.insert(std::end(content), section_size_aligned - section_size, 0);
+  new_section->content(content);
+
+  // Compute new section offset
+  uint64_t new_section_offset = align(std::accumulate(
+      std::begin(this->sections_),
+      std::end(this->sections_), this->get_sizeof_headers(),
+      [] (uint64_t offset, const Section* s) {
+        return std::max<uint64_t>(s->pointerto_raw_data() + s->sizeof_raw_data(), offset);
+      }), this->optional_header().file_alignment());
+
+  LOG(DEBUG) << "New section offset: 0x" << std::hex << new_section_offset;
+
+
+  // Compute new section Virtual address
+  const uint64_t new_section_va = align(std::accumulate(
+      std::begin(this->sections_),
+      std::end(this->sections_), this->optional_header().section_alignment(),
+      [] (uint64_t va, const Section* s) {
+        return std::max<uint64_t>(s->virtual_address() + s->virtual_size(), va);
+      }), this->optional_header().section_alignment());
+
+  LOG(DEBUG) << "New section va: 0x" << std::hex << new_section_va;
+
+  new_section->add_type(type);
+
+  if (new_section->pointerto_raw_data() == 0) {
+    new_section->pointerto_raw_data(new_section_offset);
+  }
+
+  if (new_section->sizeof_raw_data() == 0) {
+    new_section->sizeof_raw_data(section_size_aligned);
+  }
+
+  if (new_section->virtual_address() == 0) {
+    new_section->virtual_address(new_section_va);
+  }
+
+  if (new_section->virtual_size() == 0) {
+    new_section->virtual_size(virtual_size);
+  }
+
+  if (new_section->is_type(SECTION_TYPES::TEXT)) {
+    new_section->add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_CODE);
+    new_section->add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_EXECUTE);
+    new_section->add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_READ);
+    this->optional_header().baseof_code(static_cast<uint32_t>(new_section->virtual_address()));
+    this->optional_header().sizeof_code(new_section->sizeof_raw_data());
+  }
+
+  if (new_section->is_type(SECTION_TYPES::DATA)) {
+    new_section->add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_INITIALIZED_DATA);
+    new_section->add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_READ);
+    new_section->add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_WRITE);
+    this->optional_header().baseof_data(static_cast<uint32_t>(new_section->virtual_address()));
+    this->optional_header().sizeof_initialized_data(new_section->sizeof_raw_data());
+  }
+
+
+  if (type == SECTION_TYPES::IMPORT) {
+
+    new_section->add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_READ);
+    new_section->add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_EXECUTE);
+
+    this->data_directory(DATA_DIRECTORY::IMPORT_TABLE).RVA(new_section->virtual_address());
+    this->data_directory(DATA_DIRECTORY::IMPORT_TABLE).size(new_section->sizeof_raw_data());
+    this->data_directory(DATA_DIRECTORY::IMPORT_TABLE).section_ = new_section;
+    this->data_directory(DATA_DIRECTORY::IAT).RVA(0);
+    this->data_directory(DATA_DIRECTORY::IAT).size(0);
+  }
+
+  if (type == SECTION_TYPES::RELOCATION) {
+    this->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).RVA(new_section->virtual_address());
+    this->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).size(new_section->sizeof_raw_data());
+    this->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).section_ = new_section;
+  }
+
+  if (type == SECTION_TYPES::RESOURCE) {
+    this->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).RVA(new_section->virtual_address());
+    this->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).size(new_section->size());
+    this->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).section_ = new_section;
+  }
+
+  if (type == SECTION_TYPES::TLS) {
+    this->data_directory(DATA_DIRECTORY::TLS_TABLE).RVA(new_section->virtual_address());
+    this->data_directory(DATA_DIRECTORY::TLS_TABLE).size(new_section->size());
+    this->data_directory(DATA_DIRECTORY::TLS_TABLE).section_ = new_section;
+  }
+
+
+  if (this->sections_.size() >= std::numeric_limits<uint16_t>::max()) {
+    throw pe_error("Binary reachs its maximum number of sections");
+  }
+  this->sections_.push_back(new_section);
+
+  // Update headers
+  this->header().numberof_sections(static_cast<uint16_t>(this->sections_.size()));
+
+  this->optional_header().sizeof_image(this->get_virtual_size());
+  this->optional_header().sizeof_headers(this->get_sizeof_headers());
+
+  return *(this->sections_.back());
+}
+
+
+//////////////////////////////////
+//
+// Methods to manage relocations
+//
+//////////////////////////////////
+
+it_relocations Binary::relocations(void) {
+  return it_relocations{this->relocations_};
+}
+
+
+it_const_relocations Binary::relocations(void) const {
+  return it_const_relocations{this->relocations_};
+}
+
+
+void Binary::add_relocation(const Relocation& relocation) {
+  this->relocations_.push_back(relocation);
+}
+
+
+//void Binary::remove_relocation(std::vector<Relocation>::iterator it) {
+//  this->relocations_.erase(it);
+//}
+
+
+void Binary::remove_all_relocations(void) {
+  this->relocations_.clear();
+}
+
+// Imports
+// =======
+
+it_imports Binary::imports(void) {
+  return {this->imports_};
+}
+
+it_const_imports Binary::imports(void) const {
+  return {this->imports_};
+}
+
+ImportEntry& Binary::add_import_function(const std::string& library, const std::string& function) {
+  auto&& it_import = std::find_if(
+      std::begin(this->imports_),
+      std::end(this->imports_),
+      [&library] (const Import& import)
+      {
+        return import.name() == library;
+      });
+
+  if (it_import == std::end(this->imports_)) {
+    //TODO: add the library
+    throw not_found("The library doesn't exist");
+  }
+
+  it_import->add_entry({function});
+  return it_import->get_entry(function);
+}
+
+Import& Binary::add_library(const std::string& name) {
+  this->imports_.emplace_back(name);
+  if (this->imports_.size() > 0) {
+    this->has_imports_ = true;
+  }
+  return this->imports_.back();
+}
+
+void Binary::remove_library(const std::string&) {
+  throw LIEF::not_implemented("To implement");
+}
+
+void Binary::remove_all_libraries(void) {
+  this->imports_ = {};
+}
+
+uint32_t Binary::predict_function_rva(const std::string& library, const std::string& function) {
+
+  auto&& it_import = std::find_if(
+      this->imports_.cbegin(),
+      this->imports_.cend(),
+      [&library] (const Import& imp) {
+        return imp.name() == library;
+      });
+
+  if (it_import == std::end(this->imports_)) {
+    throw not_found("Unable to find library '" + library + "'");
+  }
+
+  it_const_import_entries entries = it_import->entries();
+
+  // Some weird library define a function twice
+  size_t nb_functions = std::count_if(
+      entries.cbegin(),
+      entries.cend(),
+      [&function](const ImportEntry& entry )
+      {
+        return not entry.is_ordinal() and entry.name() == function;
+      });
+
+  if (nb_functions == 0) {
+    throw not_found("Unable to find the function '" + function + "' in '" + library + "'.");
+  }
+
+  if (nb_functions > 1) {
+    throw not_supported("'" + function + "' is defined " + std::to_string(nb_functions) + " in '" + library + "'.");
+  }
+
+  uint32_t import_table_size = static_cast<uint32_t>((this->imports().size() + 1) * sizeof(pe_import)); // +1 for the null entry
+
+  uint32_t address = import_table_size;
+
+  uint32_t lookup_table_size = 0;
+  for (const Import& f : this->imports_) {
+    if (this->type_ == PE_TYPE::PE32) {
+      lookup_table_size += (f.entries().size() + 1) * sizeof(uint32_t);
+    } else {
+      lookup_table_size += (f.entries().size() + 1) * sizeof(uint64_t);
+    }
+  }
+
+  address += lookup_table_size;
+
+  for (auto&& it_imp = this->imports_.cbegin();
+      (it_imp->name() != library and it_imp != this->imports_.cend());
+       ++it_imp) {
+    if (this->type_ == PE_TYPE::PE32) {
+      address += sizeof(uint32_t) * (it_imp->entries().size() + 1);
+    } else {
+      address += sizeof(uint64_t) * (it_imp->entries().size() + 1);
+    }
+  }
+
+
+  for (auto&& it_func = entries.cbegin();
+      (it_func->name() != function and it_func != entries.cend());
+       ++it_func) {
+    if (this->type_ == PE_TYPE::PE32) {
+      address += sizeof(uint32_t);
+    } else {
+      address += sizeof(uint64_t);
+    }
+  }
+
+
+  // We assume the the idata section will be the last section
+  const uint64_t next_virtual_address = align(std::accumulate(
+      std::begin(this->sections_),
+      std::end(this->sections_), this->optional_header().section_alignment(),
+      [] (uint64_t va, const Section* s) {
+        return std::max<uint64_t>(s->virtual_address() + s->virtual_size(), va);
+      }), this->optional_header().section_alignment());
+
+  return next_virtual_address + address;
+}
+
+
+Export& Binary::get_export(void) {
+  return const_cast<Export&>(static_cast<const Binary*>(this)->get_export());
+}
+
+
+const Export& Binary::get_export(void) const {
+  if (this->has_exports()) {
+    return this->export_;
+  } else {
+    throw not_found("The binary doesn't have exports");
+  }
+}
+
+/////////////////////////////////////
+//
+// Methods to manage Resources
+//
+/////////////////////////////////////
+
+void Binary::set_resources(ResourceNode* resource) {
+  // TODO: DELETE !!!!!!!!!
+  this->resources_ = resource;
+}
+
+ResourceNode& Binary::get_resources(void) {
+  return const_cast<ResourceNode&>(static_cast<const Binary*>(this)->get_resources());
+}
+
+const ResourceNode& Binary::get_resources(void) const {
+  if (this->resources_ != nullptr) {
+    return *this->resources_;
+  } else {
+    throw not_found("No resources");
+  }
+}
+
+
+/////////////////////////////////////
+//
+// Methods to manage DataDirectories
+//
+/////////////////////////////////////
+it_data_directories Binary::data_directories(void) {
+  return it_data_directories{this->data_directories_};
+}
+
+it_const_data_directories Binary::data_directories(void) const {
+  return it_const_data_directories{this->data_directories_};
+}
+
+
+Debug& Binary::get_debug(void) {
+  return const_cast<Debug&>(static_cast<const Binary*>(this)->get_debug());
+}
+
+
+const Debug& Binary::get_debug(void) const {
+  return this->debug_;
+}
+
+/////////////////////
+//
+// Various methods
+//
+/////////////////////
+
+const Signature& Binary::signature(void) const {
+  if (not this->has_signature()) {
+    throw not_found("Signature not found");
+  }
+  return this->signature_;
+}
+
+
+std::vector<Symbol>& Binary::symbols(void) {
+  return const_cast<std::vector<Symbol>&>(static_cast<const Binary*>(this)->symbols());
+}
+
+
+const std::vector<Symbol>& Binary::symbols(void) const {
+  return this->symbols_;
+}
+
+
+std::vector<std::string> Binary::get_abstract_exported_functions(void) const {
+  std::vector<std::string> result;
+  if (this->has_exports()) {
+    for (const ExportEntry& entry : this->get_export().entries()) {
+      const std::string& name = entry.name();
+      if(not name.empty()) {
+        result.push_back(name);
+      }
+    }
+  }
+  return result;
+}
+
+std::vector<std::string> Binary::get_abstract_imported_functions(void) const {
+  std::vector<std::string> result;
+  if (this->has_imports()) {
+    for (const Import& import : this->imports()) {
+      for (const ImportEntry& entry : import.entries()) {
+        const std::string& name = entry.name();
+        if(not name.empty()) {
+          result.push_back(name);
+        }
+      }
+    }
+  }
+  return result;
+}
+
+
+std::vector<std::string> Binary::get_abstract_imported_libraries(void) const {
+  std::vector<std::string> result;
+  for (const Import& import : this->imports()) {
+    result.push_back(import.name());
+  }
+  return result;
+}
+
+LIEF::Header Binary::get_abstract_header(void) const {
+  LIEF::Header header;
+
+  try {
+    const std::pair<ARCHITECTURES, std::set<MODES>>& am = arch_pe_to_lief.at(this->header().machine());
+    header.architecture(am.first);
+    header.modes(am.second);
+  } catch (const std::out_of_range&) {
+    throw not_implemented(to_string(this->header().machine()));
+  }
+
+  header.entrypoint(this->entrypoint());
+
+  return header;
+}
+
+// LIEF Interface
+// ==============
+uint64_t Binary::entrypoint(void) const {
+  return this->optional_header().imagebase() + this->optional_header().addressof_entrypoint();
+}
+
+void Binary::patch_address(uint64_t address, const std::vector<uint8_t>& patch_value) {
+  // Find the section associated with the virtual address
+  Section& section_topatch = this->section_from_virtual_address(address);
+  const uint64_t offset = address - section_topatch.virtual_address();
+  std::vector<uint8_t> content = section_topatch.content();
+  std::copy(
+      std::begin(patch_value),
+      std::end(patch_value),
+      content.data() + offset);
+  section_topatch.content(content);
+
+}
+
+void Binary::patch_address(uint64_t address, uint64_t patch_value, size_t size) {
+  if (size > sizeof(patch_value)) {
+    throw std::runtime_error("Invalid size (" + std::to_string(size) + ")");
+  }
+
+  Section& section_topatch = this->section_from_virtual_address(address);
+  const uint64_t offset = address - section_topatch.virtual_address();
+  std::vector<uint8_t> content = section_topatch.content();
+
+  std::copy(
+      reinterpret_cast<uint8_t*>(&patch_value),
+      reinterpret_cast<uint8_t*>(&patch_value) + size,
+      content.data() + offset);
+  section_topatch.content(content);
+
+}
+
+std::vector<uint8_t> Binary::get_content_from_virtual_address(uint64_t virtual_address, uint64_t size) const {
+  const Section& section = this->section_from_virtual_address(virtual_address);
+  const std::vector<uint8_t>& content = section.content();
+  const uint64_t offset = virtual_address - section.virtual_address();
+  uint64_t checked_size = size;
+  if ((offset + checked_size) > content.size()) {
+    checked_size = checked_size - (offset + checked_size - content.size());
+  }
+
+  return {content.data() + offset, content.data() + offset + checked_size};
+
+}
+
+// Resource manager
+// ===============
+
+ResourcesManager Binary::get_resources_manager(void) {
+  return ResourcesManager{this->resources_};
+}
+
+const ResourcesManager Binary::get_resources_manager(void) const {
+  return ResourcesManager{this->resources_};
+}
+
+
+void Binary::accept(Visitor& visitor) const {
+  visitor(this->dos_header());
+  visitor(this->header());
+  visitor(this->optional_header());
+
+  for (const DataDirectory& data_directory : this->data_directories()) {
+    visitor(data_directory);
+  }
+
+  for (const Section& section : this->get_sections()) {
+    visitor(section);
+  }
+
+  if (this->has_imports()) {
+    for (const Import& import : this->imports()) {
+      visitor(import);
+    }
+  }
+
+  if (this->has_relocations()) {
+    for (const Relocation& relocation : this->relocations()) {
+      visitor(relocation);
+    }
+  }
+
+  if (this->has_debug()) {
+    visitor(this->get_debug());
+  }
+
+
+  if (this->has_exports()) {
+    visitor(this->get_export());
+  }
+
+  for (const Symbol& symbol : this->symbols()) {
+    visitor(symbol);
+  }
+
+  if (this->has_tls()) {
+    visitor(this->tls());
+  }
+
+}
+
+
+bool Binary::operator==(const Binary& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Binary::operator!=(const Binary& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& Binary::print(std::ostream& os) const {
+
+  os << "Dos Header" << std::endl;
+  os << "==========" << std::endl;
+
+  os << this->dos_header();
+  os << std::endl;
+
+
+  os << "Header" << std::endl;
+  os << "======" << std::endl;
+
+  os << this->header();
+  os << std::endl;
+
+
+  os << "Optional Header" << std::endl;
+  os << "===============" << std::endl;
+
+  os << this->optional_header();
+  os << std::endl;
+
+
+  os << "Data directories" << std::endl;
+  os << "================" << std::endl;
+
+  for (const DataDirectory& data_directory : this->data_directories()) {
+    os << data_directory << std::endl;
+  }
+  os << std::endl;
+
+
+  os << "Sections" << std::endl;
+  os << "========" << std::endl;
+
+  for (const Section& section : this->get_sections()) {
+    os << section << std::endl;;
+  }
+  os << std::endl;
+
+
+  if (this->has_tls()) {
+    os << "TLS" << std::endl;
+    os << "===" << std::endl;
+    os << this->tls() << std::endl;
+    os << std::endl;
+  }
+
+
+  if (this->has_signature()) {
+    os << "Signature" << std::endl;
+    os << "=========" << std::endl;
+    os << this->signature() << std::endl;
+    os << std::endl;
+  }
+
+
+  if (this->has_imports()) {
+    os << "Imports" << std::endl;
+    os << "=======" << std::endl;
+    for (const Import& import : this->imports()) {
+      os << import << std::endl;
+    }
+    os << std::endl;
+  }
+
+
+  if (this->has_debug()) {
+    os << "Debug" << std::endl;
+    os << "=====" << std::endl;
+    os << this->get_debug() << std::endl;
+    os << std::endl;
+  }
+
+
+  if (this->has_relocations()) {
+    os << "Relocations" << std::endl;
+    os << "===========" << std::endl;
+    for (const Relocation& relocation : this->relocations()) {
+      os << relocation << std::endl;
+    }
+    os << std::endl;
+  }
+
+
+  if (this->has_exports()) {
+    os << "Export" << std::endl;
+    os << "======" << std::endl;
+    os << this->get_export() << std::endl;
+    os << std::endl;
+  }
+
+
+  if (this->has_resources()) {
+    os << "Resources" << std::endl;
+    os << "=========" << std::endl;
+    os << this->get_resources_manager() << std::endl;
+    os << std::endl;
+  }
+
+  os << "Symbols" << std::endl;
+  os << "=======" << std::endl;
+
+  for (const Symbol& symbol : this->symbols()) {
+    os << symbol << std::endl;;
+  }
+  os << std::endl;
+
+
+  return os;
+}
+
+} // namesapce PE
+} // namespace LIEF
diff --git a/src/PE/Builder.cpp b/src/PE/Builder.cpp
new file mode 100644
index 0000000..ae5afb9
--- /dev/null
+++ b/src/PE/Builder.cpp
@@ -0,0 +1,527 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <string.h>
+#include <algorithm>
+#include <fstream>
+#include <iterator>
+
+#include "easylogging++.h"
+
+#include "LIEF/utf8.h"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/Builder.hpp"
+#include "Builder.tcc"
+#include "LIEF/PE/ResourceData.hpp"
+#include "LIEF/PE/utils.hpp"
+
+
+
+namespace LIEF {
+namespace PE {
+
+Builder::~Builder(void) = default;
+
+Builder::Builder(Binary* binary) :
+  binary_{binary},
+  build_imports_{false},
+  patch_imports_{false},
+  build_relocations_{false},
+  build_tls_{false},
+  build_resources_{false}
+{}
+
+
+Builder& Builder::build_imports(bool flag) {
+  this->build_imports_ = flag;
+  return *this;
+}
+Builder& Builder::patch_imports(bool flag) {
+  this->patch_imports_ = flag;
+  return *this;
+}
+
+Builder& Builder::build_relocations(bool flag) {
+  this->build_relocations_ = flag;
+  return *this;
+}
+
+Builder& Builder::build_tls(bool flag) {
+  this->build_tls_ = flag;
+  return *this;
+}
+
+Builder& Builder::build_resources(bool flag) {
+  this->build_resources_ = flag;
+  return *this;
+}
+
+
+
+
+void Builder::write(const std::string& filename) const {
+  std::ofstream output_file{filename, std::ios::out | std::ios::binary | std::ios::trunc};
+  if (output_file) {
+    std::vector<uint8_t> content;
+    this->ios_.get(content);
+    std::copy(
+        std::begin(content),
+        std::end(content),
+        std::ostreambuf_iterator<char>(output_file));
+  }
+}
+
+
+
+
+void Builder::build(void) {
+
+  LOG(DEBUG) << "Rebuilding" << std::endl;
+
+  if (this->binary_->has_tls() and this->build_tls_) {
+    LOG(DEBUG) << "[+] Rebuilding TLS" << std::endl;
+    if (this->binary_->type() == PE_TYPE::PE32) {
+      this->build_tls<PE32>();
+    } else {
+      this->build_tls<PE64>();
+    }
+  }
+
+  if (this->binary_->has_relocations() and this->build_relocations_) {
+    LOG(DEBUG) << "[+] Rebuilding relocations" << std::endl;
+    this->build_relocation();
+  }
+
+  if (this->binary_->has_resources() and this->binary_->resources_ != nullptr and this->build_resources_) {
+    LOG(DEBUG) << "[+] Rebuilding resources" << std::endl;
+    try {
+      this->build_resources();
+    } catch (not_found&) {
+    }
+  }
+
+  if (this->binary_->has_imports() and this->build_imports_) {
+    LOG(DEBUG) << "[+] Rebuilding Import" << std::endl;
+    if (this->binary_->type() == PE_TYPE::PE32) {
+      this->build_import_table<PE32>();
+    } else {
+      this->build_import_table<PE64>();
+    }
+  }
+
+  LOG(DEBUG) << "[+] Rebuilding headers" << std::endl;
+
+  *this << this->binary_->dos_header()
+        << this->binary_->header()
+        << this->binary_->optional_header();
+
+  for (const DataDirectory& directory : this->binary_->data_directories()) {
+    *this << directory;
+  }
+
+  DataDirectory last_one;
+  last_one.RVA(0);
+  last_one.size(0);
+
+  *this << last_one;
+
+  LOG(DEBUG) << "[+] Rebuilding sections" << std::endl;
+
+  for (const Section& section : this->binary_->get_sections()) {
+    LOG(DEBUG) << "Building section " << section.name();
+    *this << section;
+  }
+
+  LOG(DEBUG) << "[+] Rebuilding symbols" << std::endl;
+  //this->build_symbols();
+
+
+  LOG(DEBUG) << "[+] Rebuilding string table" << std::endl;
+  //this->build_string_table();
+}
+
+const std::vector<uint8_t>& Builder::get_build(void) {
+  return this->ios_.raw();
+}
+
+//
+// Build relocations
+//
+void Builder::build_relocation(void) {
+  std::vector<uint8_t> content;
+  for (const Relocation& relocation : this->binary_->relocations()) {
+
+    pe_base_relocation_block relocation_header;
+    relocation_header.PageRVA   = static_cast<uint32_t>(relocation.virtual_address());
+
+    uint32_t block_size = static_cast<uint32_t>((relocation.entries().size()) * sizeof(uint16_t) + sizeof(pe_base_relocation_block));
+    relocation_header.BlockSize = align(block_size, sizeof(uint32_t));
+
+    content.insert(
+        std::end(content),
+        reinterpret_cast<uint8_t*>(&relocation_header),
+        reinterpret_cast<uint8_t*>(&relocation_header) + sizeof(pe_base_relocation_block));
+
+    for (const RelocationEntry& entry: relocation.entries()) {
+      uint16_t data = entry.data();
+      content.insert(
+          std::end(content),
+          reinterpret_cast<uint8_t*>(&data),
+          reinterpret_cast<uint8_t*>(&data) + sizeof(uint16_t));
+    }
+
+    content.insert(
+      std::end(content),
+      align(content.size(), sizeof(uint32_t)) - content.size(), 0);
+  }
+
+  // Align on a 32 bits
+
+  //pe_base_relocation_block relocHeader;
+  //relocHeader.PageRVA   = static_cast<uint32_t>(0);
+  //relocHeader.BlockSize = static_cast<uint32_t>(0);
+
+  //content.insert(
+  //    std::end(content),
+  //    reinterpret_cast<uint8_t*>(&relocHeader),
+  //    reinterpret_cast<uint8_t*>(&relocHeader) + sizeof(pe_base_relocation_block));
+
+  Section new_relocation_section{".l" + std::to_string(DATA_DIRECTORY::BASE_RELOCATION_TABLE)}; // .l5 -> lief.relocation
+  new_relocation_section.characteristics(0x42000040);
+  const size_t size_aligned = align(content.size(), this->binary_->optional_header().file_alignment());
+
+  // Pad with 0
+  content.insert(
+      std::end(content),
+      size_aligned - content.size(), 0);
+
+  new_relocation_section.content(content);
+
+  this->binary_->add_section(new_relocation_section, SECTION_TYPES::RELOCATION);
+}
+
+
+//
+// Build resources
+//
+void Builder::build_resources(void) {
+  LOG(DEBUG) << "Building RSRC" << std::endl;
+
+  ResourceNode* node = this->binary_->resources_;
+
+  uint32_t headerSize = 0;
+  uint32_t dataSize   = 0;
+  uint32_t nameSize   = 0;
+
+  this->compute_resources_size(node, &headerSize, &dataSize, &nameSize);
+  std::vector<uint8_t> content(headerSize + dataSize + nameSize, 0);
+  const uint64_t content_size_aligned = align(content.size(), this->binary_->optional_header().file_alignment());
+  content.insert(std::end(content), content_size_aligned - content.size(), 0);
+
+  uint32_t offsetToHeader = 0;
+  uint32_t offsetToName   = headerSize;
+  uint32_t offsetToData   = headerSize + nameSize;
+
+  Section new_section_rsrc{".l" + std::to_string(DATA_DIRECTORY::RESOURCE_TABLE)};
+  new_section_rsrc.characteristics(0x40000040);
+  new_section_rsrc.content(content);
+
+  Section& rsrc_section = this->binary_->add_section(new_section_rsrc, SECTION_TYPES::RESOURCE);
+
+  this->construct_resources(node, &content, &offsetToHeader, &offsetToData, &offsetToName, rsrc_section.virtual_address(), 0);
+
+  rsrc_section.content(content);
+}
+
+//
+// Pre-computation
+//
+void Builder::compute_resources_size(ResourceNode *node, uint32_t *headerSize, uint32_t *dataSize, uint32_t *nameSize) {
+  if (not node->name().empty()) {
+    *nameSize += sizeof(uint16_t) + node->name().size() * sizeof(char16_t) + 1;
+  }
+
+  if (node->type() == RESOURCE_NODE_TYPES::DIRECTORY) {
+    *headerSize += STRUCT_SIZES::ResourceDirectoryTableSize;
+    *headerSize += STRUCT_SIZES::ResourceDirectoryEntriesSize;
+  } else {
+    ResourceData *dataNode = static_cast<ResourceData*>(node);
+    *headerSize += STRUCT_SIZES::ResourceDataEntrySize;
+    *headerSize += STRUCT_SIZES::ResourceDirectoryEntriesSize;
+    *dataSize   += dataNode->content_.size() + 1;
+  }
+
+  for (auto& child : node->childs()) {
+    this->compute_resources_size(child, headerSize, dataSize, nameSize);
+  }
+}
+
+
+//
+// Build level by level
+//
+void Builder::construct_resources(
+    ResourceNode *node,
+    std::vector<uint8_t> *content,
+    uint32_t *offsetToHeader,
+    uint32_t *offsetToData,
+    uint32_t *offsetToName,
+    uint32_t baseRVA,
+    uint32_t depth) {
+
+  // Build Directory
+  // ===============
+
+  if (node->type() == RESOURCE_NODE_TYPES::DIRECTORY) {
+    //LOG(DEBUG) << "Build level " << std::dec << depth << std::endl;
+    ResourceDirectory *rsrcDirectory = static_cast<ResourceDirectory*>(node);
+
+    pe_resource_directory_table rsrcHeader;
+    rsrcHeader.Characteristics     = static_cast<uint32_t>(rsrcDirectory->characteristics_);
+    rsrcHeader.TimeDateStamp       = static_cast<uint32_t>(rsrcDirectory->timeDateStamp_);
+    rsrcHeader.MajorVersion        = static_cast<uint16_t>(rsrcDirectory->majorVersion_);
+    rsrcHeader.MinorVersion        = static_cast<uint16_t>(rsrcDirectory->minorVersion_);
+    rsrcHeader.NumberOfNameEntries = static_cast<uint16_t>(rsrcDirectory->numberOfNameEntries_);
+    rsrcHeader.NumberOfIDEntries   = static_cast<uint16_t>(rsrcDirectory->numberOfIDEntries_);
+
+
+    std::copy(
+        reinterpret_cast<uint8_t*>(&rsrcHeader),
+        reinterpret_cast<uint8_t*>(&rsrcHeader) + STRUCT_SIZES::ResourceDirectoryTableSize,
+        content->data() + *offsetToHeader);
+
+    *offsetToHeader += STRUCT_SIZES::ResourceDirectoryTableSize;
+
+    //Build next level
+    uint32_t currentOffset = *offsetToHeader;
+
+    // Offset to the next RESOURCE_NODE_TYPES::DIRECTORY
+    *offsetToHeader += node->childs().size() * STRUCT_SIZES::ResourceDirectoryEntriesSize;
+
+
+    // Build childs
+    // ============
+    for (ResourceNode* child : node->childs()) {
+      if (static_cast<uint32_t>(child->id_) & 0x80000000) { // There is a name
+
+
+        const std::u16string& name = child->name();
+        child->id_ = 0x80000000 | *offsetToName;
+
+        //for (uint32_t i = 0; i < name.size(); ++i) {
+        //  std::cout << static_cast<char>(name.data()[i]);
+        //}
+        //std::cout << std::endl;
+
+        uint16_t* length_ptr = reinterpret_cast<uint16_t*>(content->data() + *offsetToName);
+        *length_ptr = name.size();
+        char16_t* name_ptr = reinterpret_cast<char16_t*>(content->data() + *offsetToName + sizeof(uint16_t));
+
+        std::copy(
+            reinterpret_cast<const char16_t*>(name.data()),
+            reinterpret_cast<const char16_t*>(name.data()) + name.size(),
+            name_ptr);
+
+        *offsetToName += name.size() * sizeof(char16_t) + sizeof(uint16_t) + 1;
+      }
+
+      if (child->type() == RESOURCE_NODE_TYPES::DIRECTORY) {
+
+        pe_resource_directory_entries entryHeader;
+        entryHeader.NameID.IntegerID = static_cast<uint32_t>(child->id());
+        entryHeader.RVA              = static_cast<uint32_t>((0x80000000 | *offsetToHeader));
+
+        std::copy(
+            reinterpret_cast<uint8_t*>(&entryHeader),
+            reinterpret_cast<uint8_t*>(&entryHeader) + STRUCT_SIZES::ResourceDirectoryEntriesSize,
+            content->data() + currentOffset);
+
+        currentOffset += STRUCT_SIZES::ResourceDirectoryEntriesSize;
+        this->construct_resources(child, content, offsetToHeader, offsetToData, offsetToName, baseRVA, depth + 1);
+      } else { //DATA
+        pe_resource_directory_entries entryHeader;
+
+        entryHeader.NameID.IntegerID = static_cast<uint32_t>(child->id());
+        entryHeader.RVA              = static_cast<uint32_t>(*offsetToHeader);
+
+        std::copy(
+            reinterpret_cast<uint8_t*>(&entryHeader),
+            reinterpret_cast<uint8_t*>(&entryHeader) + STRUCT_SIZES::ResourceDirectoryEntriesSize,
+            content->data() + currentOffset);
+        currentOffset += STRUCT_SIZES::ResourceDirectoryEntriesSize;
+        this->construct_resources(child, content, offsetToHeader, offsetToData, offsetToName, baseRVA, depth + 1);
+      }
+    }
+
+  } else {
+    //LOG(DEBUG) << "Building Data" << std::endl;
+    ResourceData *rsrcData = static_cast<ResourceData*>(node);
+    pe_resource_data_entry dataHeader;
+    dataHeader.DataRVA  = static_cast<uint32_t>(baseRVA + *offsetToData);
+    dataHeader.Size     = static_cast<uint32_t>(rsrcData->content_.size());
+    dataHeader.Codepage = static_cast<uint32_t>(rsrcData->codePage_);
+    dataHeader.Reserved = static_cast<uint32_t>(0);
+
+
+    std::copy(
+        reinterpret_cast<uint8_t*>(&dataHeader),
+        reinterpret_cast<uint8_t*>(&dataHeader) + STRUCT_SIZES::ResourceDataEntrySize,
+        content->data() + *offsetToHeader);
+
+    *offsetToHeader += STRUCT_SIZES::ResourceDirectoryTableSize;
+
+    std::copy(
+        std::begin(rsrcData->content_),
+        std::end(rsrcData->content_),
+        content->data() + *offsetToData);
+
+    *offsetToData += rsrcData->content().size() + 1;
+  }
+}
+
+
+void Builder::build_symbols(void) {
+  //TODO
+}
+
+
+void Builder::build_string_table(void) {
+  //TODO
+}
+
+Builder& Builder::operator<<(const DosHeader& dos_header) {
+
+  pe_dos_header dosHeader;
+  dosHeader.Magic                     = static_cast<uint16_t>(dos_header.magic());
+  dosHeader.UsedBytesInTheLastPage    = static_cast<uint16_t>(dos_header.used_bytes_in_the_last_page());
+  dosHeader.FileSizeInPages           = static_cast<uint16_t>(dos_header.file_size_in_pages());
+  dosHeader.NumberOfRelocationItems   = static_cast<uint16_t>(dos_header.numberof_relocation());
+  dosHeader.HeaderSizeInParagraphs    = static_cast<uint16_t>(dos_header.header_size_in_paragraphs());
+  dosHeader.MinimumExtraParagraphs    = static_cast<uint16_t>(dos_header.minimum_extra_paragraphs());
+  dosHeader.MaximumExtraParagraphs    = static_cast<uint16_t>(dos_header.maximum_extra_paragraphs());
+  dosHeader.InitialRelativeSS         = static_cast<uint16_t>(dos_header.initial_relative_ss());
+  dosHeader.InitialSP                 = static_cast<uint16_t>(dos_header.initial_sp());
+  dosHeader.Checksum                  = static_cast<uint16_t>(dos_header.checksum());
+  dosHeader.InitialIP                 = static_cast<uint16_t>(dos_header.initial_ip());
+  dosHeader.InitialRelativeCS         = static_cast<uint16_t>(dos_header.initial_relative_cs());
+  dosHeader.AddressOfRelocationTable  = static_cast<uint16_t>(dos_header.addressof_relocation_table());
+  dosHeader.OverlayNumber             = static_cast<uint16_t>(dos_header.overlay_number());
+  dosHeader.OEMid                     = static_cast<uint16_t>(dos_header.oem_id());
+  dosHeader.OEMinfo                   = static_cast<uint16_t>(dos_header.oem_info());
+  dosHeader.AddressOfNewExeHeader     = static_cast<uint16_t>(dos_header.addressof_new_exeheader());
+
+  const DosHeader::reserved_t& reserved   = dos_header.reserved();
+  const DosHeader::reserved2_t& reserved2 = dos_header.reserved2();
+
+  std::copy(std::begin(reserved),  std::end(reserved),  std::begin(dosHeader.Reserved));
+  std::copy(std::begin(reserved2), std::end(reserved2), std::begin(dosHeader.Reserved2));
+
+  this->ios_.seekp(0);
+  this->ios_.write(reinterpret_cast<const uint8_t*>(&dosHeader), sizeof(pe_dos_header));
+  return *this;
+}
+
+
+Builder& Builder::operator<<(const Header& bHeader) {
+  LOG(DEBUG) << "Building standard Header" << std::endl;
+  // Standard Header
+  pe_header header;
+  header.Machine               = static_cast<uint16_t>(bHeader.machine());
+  header.NumberOfSections      = static_cast<uint16_t>(this->binary_->sections_.size());
+  //TODO: use current
+  header.TimeDateStamp         = static_cast<uint32_t>(bHeader.time_date_stamp());
+  header.PointerToSymbolTable  = static_cast<uint32_t>(bHeader.pointerto_symbol_table());
+  header.NumberOfSymbols       = static_cast<uint32_t>(bHeader.numberof_symbols());
+  //TODO: Check
+  header.SizeOfOptionalHeader  = static_cast<uint16_t>(bHeader.sizeof_optional_header());
+  header.Characteristics       = static_cast<uint16_t>(bHeader.characteristics());
+
+  const Header::signature_t& signature = this->binary_->header_.signature();
+  std::copy(std::begin(signature), std::end(signature), std::begin(header.signature));
+
+  const uint32_t address_next_header = this->binary_->dos_header().addressof_new_exeheader();
+
+  this->ios_.seekp(address_next_header);
+  this->ios_.write(reinterpret_cast<const uint8_t*>(&header), sizeof(pe_header));
+  return *this;
+}
+
+
+Builder& Builder::operator<<(const OptionalHeader& optional_header) {
+  if (this->binary_->type() == PE_TYPE::PE32) {
+    this->build_optional_header<PE32>(optional_header);
+  } else {
+    this->build_optional_header<PE64>(optional_header);
+  }
+  return *this;
+}
+
+
+Builder& Builder::operator<<(const DataDirectory& data_directory) {
+
+  pe_data_directory header;
+
+  header.RelativeVirtualAddress = data_directory.RVA();
+  header.Size                   = data_directory.size();
+
+  this->ios_.write(reinterpret_cast<uint8_t*>(&header), sizeof(pe_data_directory));
+  return *this;
+}
+
+
+Builder& Builder::operator<<(const Section& section) {
+
+  pe_section header;
+  header.VirtualAddress       = static_cast<uint32_t>(section.virtual_address());
+  header.VirtualSize          = static_cast<uint32_t>(section.virtual_size());
+  header.SizeOfRawData        = static_cast<uint32_t>(section.size());
+  header.PointerToRawData     = static_cast<uint32_t>(section.pointerto_raw_data());
+  header.PointerToRelocations = static_cast<uint32_t>(section.pointerto_relocation());
+  header.PointerToLineNumbers = static_cast<uint32_t>(section.pointerto_line_numbers());
+  header.NumberOfRelocations  = static_cast<uint16_t>(section.numberof_relocations());
+  header.NumberOfLineNumbers  = static_cast<uint16_t>(section.numberof_line_numbers());
+  header.Characteristics      = static_cast<uint32_t>(section.characteristics());
+  const char* name            = section.name().c_str();
+
+  std::copy(name, name + sizeof(header.Name), std::begin(header.Name));
+  this->ios_.write(reinterpret_cast<uint8_t*>(&header), sizeof(pe_section));
+
+  if (section.content().size() > section.size()) {
+    LOG(WARNING) << section.name()
+                 << " content size is bigger than section's header size"
+                 << std::endl;
+  }
+  const size_t saved_offset = this->ios_.tellp();
+  this->ios_.seekp(section.offset());
+  this->ios_.write(section.content());
+  this->ios_.seekp(saved_offset);
+  return *this;
+}
+
+std::ostream& operator<<(std::ostream& os, const Builder& b) {
+  os << std::left;
+  os << std::boolalpha;
+  os << std::setw(20) << "Builde imports:"     << b.build_imports_     << std::endl;
+  os << std::setw(20) << "Patch imports:"      << b.patch_imports_     << std::endl;
+  os << std::setw(20) << "Builde relocations:" << b.build_relocations_ << std::endl;
+  os << std::setw(20) << "Builde TLS:"         << b.build_tls_         << std::endl;
+  os << std::setw(20) << "Builder resources:"  << b.build_resources_   << std::endl;
+  return os;
+}
+
+
+}
+}
diff --git a/src/PE/Builder.tcc b/src/PE/Builder.tcc
new file mode 100644
index 0000000..a6aef12
--- /dev/null
+++ b/src/PE/Builder.tcc
@@ -0,0 +1,526 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+namespace LIEF {
+namespace PE {
+
+template<typename PE_T>
+std::vector<uint8_t> Builder::build_jmp(uint64_t address) {
+  using uint__ = typename PE_T::uint;
+  std::vector<uint8_t> instruction; // 48 A1 XX XX XX XX XX XX XX XX FF E0
+  if (std::is_same<PE_T, PE64>::value) {
+    instruction.push_back(0x48); //x64
+  }
+
+  instruction.push_back(0xa1); // mov rax, [0xc0ffee]
+  for (size_t i = 0; i < sizeof(uint__); ++i) {
+    instruction.push_back(static_cast<uint8_t>((address >> (8 * i)) & 0xFF));
+  }
+  // jmp rax
+  instruction.push_back(0xff);
+  instruction.push_back(0xe0);
+
+  return instruction;
+}
+
+
+/*
+         Original IAT                        New IAT
+     +------------------+             +------------------+
+     |Trampoline 1 addr |------+      |   new address 1  |-+
+     +------------------+      |      +------------------+ |
+     |Trampoline 2 addr |      |      |   new address 1  | |
+     +------------------+      |      +------------------+ |
+     |Trampoline 3 addr |      |      |   new address 1  | |
+     +------------------+      |      +------------------+ |
+                               |                           |
+                               |        Trampoline 1    +--+
+                               |      +-----------------v-----+             Kernel32.dll
+                               +----->|  mov rax, [new addr1] |           +--------------+
+                                      |  jmp rax              |---------->| GetLocalTime |
+                                      +-----------------------+           +--------------+
+                                                                     +--->|  LocalSize   |
+                                        Trampoline 2                 |    +--------------+
+                                      +-----------------------+      |    |  WriteFile   |
+                                      |  mov rax, [new addr2] |      |    +--------------+
+                                      |  jmp rax              |------+
+                                      +-----------------------+
+
+*/
+
+template<typename PE_T>
+void Builder::build_import_table(void) {
+  using uint__ = typename PE_T::uint;
+
+  // Compute size of the the diffrent (sub)sections
+  // inside the future import section
+  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+  // Size of pe_import + 1 for the null entry
+  uint32_t import_table_size  = static_cast<uint32_t>((this->binary_->imports().size() + 1) * sizeof(pe_import)); // +1 for the null entry
+
+  // Size of import entries
+  uint32_t entries_size = 0;
+
+  // Size of the section which will holds imported functions names
+  uint32_t functions_name_size = 0;
+
+  // Size of the section which will holds library name (e.g. kernel32.dll)
+  uint32_t libraries_name_size = 0;
+
+  // Size of the trampoline section
+  uint32_t trampolines_size = 0;
+
+  // Size of the instructions in the trampoline
+  uint32_t trampoline_size = build_jmp<PE_T>(0).size();
+
+  // Compute size of each imports's sections
+  for (const Import& import : this->binary_->imports()) {
+    for (const ImportEntry& entry : import.entries()) {
+
+      functions_name_size += 2 + entry.name().size() + 1; // [Hint] [Name\0]
+      functions_name_size += functions_name_size % 2;     // [padding]
+    }
+
+    libraries_name_size  += import.name().size() + 1; // [Name\0]
+    entries_size += 2 * (import.entries().size() + 1) * sizeof(uint__); // Once for Lookup table and the other for Import Address Table (IAT). +1 for the null entry
+    trampolines_size    += import.entries().size() * trampoline_size;
+  }
+
+  // Offset of the diffrents sections inside *import section*
+  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+  // Offset to the import table (i.e list of pe_import)
+  uint32_t import_table_offset = 0;
+
+  // Offset to the lookup table: After import table
+  uint32_t lookuptable_offset = import_table_offset + import_table_size;
+
+  // Address table (IAT). Identical to the lookup table until the library is bound
+  uint32_t iat_offset = lookuptable_offset + entries_size / 2;
+
+  // Offset to the section which will contains hints/names of the imported functions name
+  uint32_t functions_name_offset = iat_offset + entries_size / 2;
+
+  // Offset of the section which will holds libraries name
+  uint32_t libraries_name_offset = functions_name_offset + functions_name_size;
+
+  // Offset of the section where trampolines will be written
+  uint32_t trampolines_offset = libraries_name_offset + libraries_name_size;
+
+  // Create empty content of the required size and align it
+  std::vector<uint8_t> content(trampolines_offset + trampolines_size, 0);
+  size_t content_size_aligned = align(content.size(), this->binary_->optional_header().file_alignment());
+  content.insert(std::end(content), content_size_aligned - content.size(), 0);
+
+  // Create a new section to handle imports
+  Section new_import_section{".l" + std::to_string(DATA_DIRECTORY::IMPORT_TABLE)};
+  new_import_section.content(content);
+
+  new_import_section.add_characteristic(SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_CODE);
+
+  auto&& it_import_section = std::find_if(
+      std::begin(this->binary_->sections_),
+      std::end(this->binary_->sections_),
+      [] (const Section* section) {
+        return section != nullptr and section->is_type(SECTION_TYPES::IMPORT);
+      });
+
+  // Remove 'import' type from the original section
+  if (it_import_section != std::end(this->binary_->sections_)) {
+    (*it_import_section)->remove_type(SECTION_TYPES::IMPORT);
+  }
+
+  // As add_section will change DATA_DIRECTORY::IMPORT_TABLE we have to save it before
+  uint32_t offset_imports  = this->binary_->rva_to_offset(this->binary_->data_directory(DATA_DIRECTORY::IMPORT_TABLE).RVA());
+  Section& import_section = this->binary_->add_section(new_import_section, SECTION_TYPES::IMPORT);
+
+
+  // Patch the original IAT with the address of the associated trampoline
+  if (this->patch_imports_) {
+    Section& original_import = this->binary_->section_from_offset(offset_imports);
+    std::vector<uint8_t> import_content  = original_import.content();
+    uint32_t roffset_import = offset_imports - original_import.offset();
+
+    pe_import *import_header = reinterpret_cast<pe_import*>(import_content.data() + roffset_import);
+    uint32_t jumpOffsetTmp = trampolines_offset;
+    while (import_header->ImportAddressTableRVA != 0) {
+      uint32_t offsetTable = this->binary_->rva_to_offset(import_header->ImportLookupTableRVA)  - original_import.pointerto_raw_data();
+      uint32_t offsetIAT   = this->binary_->rva_to_offset(import_header->ImportAddressTableRVA) - original_import.pointerto_raw_data();
+      if (offsetTable > import_content.size() or offsetIAT > import_content.size()) {
+        //TODO: Better handle
+        LOG(ERROR) << "Can't patch" << std::endl;
+        break;
+      }
+      uint__ *lookupTable = reinterpret_cast<uint__*>(import_content.data() + offsetTable);
+      uint__ *IAT         = reinterpret_cast<uint__*>(import_content.data() + offsetIAT);
+
+      while (*lookupTable != 0) {
+        *IAT = static_cast<uint__>(this->binary_->optional_header().imagebase() + import_section.virtual_address() + jumpOffsetTmp);
+        *lookupTable = *IAT;
+        jumpOffsetTmp += trampoline_size;
+
+        lookupTable++;
+        IAT++;
+      }
+      import_header++;
+    }
+    original_import.content(import_content);
+  }
+
+  // Process libraries
+  for (const Import& import : this->binary_->imports()) {
+    // Header
+    pe_import header;
+    header.ImportLookupTableRVA  = static_cast<uint__>(import_section.virtual_address() + lookuptable_offset);
+    header.TimeDateStamp         = static_cast<uint32_t>(import.timedatestamp());
+    header.ForwarderChain        = static_cast<uint32_t>(import.forwarder_chain());
+    header.NameRVA               = static_cast<uint__>(import_section.virtual_address() + libraries_name_offset);
+    header.ImportAddressTableRVA = static_cast<uint__>(import_section.virtual_address() + iat_offset);
+
+    // Copy the header in the "header section"
+    std::copy(
+        reinterpret_cast<uint8_t*>(&header),
+        reinterpret_cast<uint8_t*>(&header) + sizeof(pe_import),
+        content.data() + import_table_offset);
+
+    import_table_offset += sizeof(pe_import);
+
+    // Copy the name in the "string section"
+    const std::string& import_name = import.name();
+    std::copy(
+        std::begin(import_name),
+        std::end(import_name),
+        content.data() + libraries_name_offset);
+
+    libraries_name_offset += import_name.size() + 1; // +1 for '\0'
+
+    // Process imported functions
+    for (const ImportEntry& entry : import.entries()) {
+
+      // If patch is enabled, we have to create a trampoline for this function
+      if (this->patch_imports_) {
+        const uint64_t address = this->binary_->optional_header().imagebase() + import_section.virtual_address() + iat_offset;
+        const std::vector<uint8_t>& instructions = Builder::build_jmp<PE_T>(address);
+        std::copy(
+            std::begin(instructions),
+            std::end(instructions),
+            content.data() + trampolines_offset);
+
+        trampolines_offset += trampoline_size;
+      }
+
+      // Default: ordinal case
+      uint__ lookup_table_value = entry.data();
+
+      if (not entry.is_ordinal()) {
+
+        lookup_table_value = import_section.virtual_address() + functions_name_offset;
+
+        // Insert entry in hint/name table
+        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+        // First: hint
+        const uint16_t hint = entry.hint();
+        std::copy(
+            reinterpret_cast<const uint8_t*>(&hint),
+            reinterpret_cast<const uint8_t*>(&hint) + sizeof(uint16_t),
+            content.data() + functions_name_offset); //hintIdx
+
+        functions_name_offset += sizeof(uint16_t);
+
+        // Then: name
+        const std::string& name = entry.name();
+        std::copy(
+            std::begin(name),
+            std::end(name),
+            content.data() + functions_name_offset);
+
+        functions_name_offset += name.size() + 1; // +1 for \0
+
+        functions_name_offset += functions_name_offset % 2; //Require to be even
+      }
+
+      uint__ iat_value = 0;
+
+      // Check if manually set
+      if (entry.data() != entry.iat_value() and entry.iat_value() > 0) {
+        iat_value = entry.iat_value();
+      } else { // default value same that in the lookup table
+        iat_value = lookup_table_value;
+      }
+
+      // Insert entry in lookup table and address table
+      std::copy(
+        reinterpret_cast<const uint8_t*>(&lookup_table_value),
+        reinterpret_cast<const uint8_t*>(&lookup_table_value) + sizeof(uint__),
+        content.data() + lookuptable_offset);
+
+      std::copy(
+        reinterpret_cast<const uint8_t*>(&iat_value),
+        reinterpret_cast<const uint8_t*>(&iat_value) + sizeof(uint__),
+        content.data() + iat_offset);
+
+      lookuptable_offset += sizeof(uint__);
+      iat_offset += sizeof(uint__);
+
+    }
+
+    // Insert null entry at the end
+    std::fill(
+      content.data() + lookuptable_offset,
+      content.data() + lookuptable_offset + sizeof(uint__),
+      0);
+
+    std::fill(
+      content.data() + iat_offset,
+      content.data() + iat_offset + sizeof(uint__),
+      0);
+
+    lookuptable_offset  += sizeof(uint__);
+    iat_offset += sizeof(uint__);
+
+  }
+
+  // Insert null entry at the end
+  std::fill(
+    content.data() + import_table_offset,
+    content.data() + import_table_offset + sizeof(pe_import),
+    0);
+
+  import_table_offset += sizeof(pe_import);
+
+  // Fill the section
+  import_section.content(content);
+
+  // Update IAT data directory
+  const uint32_t rva = static_cast<uint32_t>(import_section.virtual_address() + iat_offset);
+  this->binary_->data_directory(DATA_DIRECTORY::IAT).RVA(rva);
+  this->binary_->data_directory(DATA_DIRECTORY::IAT).size(functions_name_offset - iat_offset + 1);
+}
+
+template<typename PE_T>
+void Builder::build_optional_header(const OptionalHeader& optional_header) {
+  using uint__             = typename PE_T::uint;
+  using pe_optional_header = typename PE_T::pe_optional_header;
+
+  // Build optional header
+  this->binary_->optional_header().sizeof_image(static_cast<uint32_t>(this->binary_->get_virtual_size()));
+  this->binary_->optional_header().sizeof_headers(static_cast<uint32_t>(this->binary_->get_sizeof_headers()));
+
+  pe_optional_header optional_header_raw;
+  optional_header_raw.Magic                   = static_cast<uint16_t>(optional_header.magic());
+  optional_header_raw.MajorLinkerVersion      = static_cast<uint8_t> (optional_header.major_linker_version());
+  optional_header_raw.MinorLinkerVersion      = static_cast<uint8_t> (optional_header.minor_linker_version());
+  optional_header_raw.SizeOfCode              = static_cast<uint32_t>(optional_header.sizeof_code());
+  optional_header_raw.SizeOfInitializedData   = static_cast<uint32_t>(optional_header.sizeof_initialized_data());
+  optional_header_raw.SizeOfUninitializedData = static_cast<uint32_t>(optional_header.sizeof_uninitialized_data());
+  optional_header_raw.AddressOfEntryPoint     = static_cast<uint32_t>(optional_header.addressof_entrypoint());
+  optional_header_raw.BaseOfCode              = static_cast<uint32_t>(optional_header.baseof_code());
+
+  if (std::is_same<PE_T, PE32>::value) {
+    // Trick to avoid compilation error
+    reinterpret_cast<pe32_optional_header*>(&optional_header_raw)->BaseOfData = static_cast<uint32_t>(optional_header.baseof_data());
+  }
+  optional_header_raw.ImageBase                    = static_cast<uint__>(optional_header.imagebase());
+  optional_header_raw.SectionAlignment             = static_cast<uint32_t>(optional_header.section_alignment());
+  optional_header_raw.FileAlignment                = static_cast<uint32_t>(optional_header.file_alignment());
+  optional_header_raw.MajorOperatingSystemVersion  = static_cast<uint16_t>(optional_header.major_operating_system_version());
+  optional_header_raw.MinorOperatingSystemVersion  = static_cast<uint16_t>(optional_header.minor_operating_system_version());
+  optional_header_raw.MajorImageVersion            = static_cast<uint16_t>(optional_header.major_image_version());
+  optional_header_raw.MinorImageVersion            = static_cast<uint16_t>(optional_header.minor_image_version());
+  optional_header_raw.MajorSubsystemVersion        = static_cast<uint16_t>(optional_header.major_subsystem_version());
+  optional_header_raw.MinorSubsystemVersion        = static_cast<uint16_t>(optional_header.minor_subsystem_version());
+  optional_header_raw.Win32VersionValue            = static_cast<uint16_t>(optional_header.win32_version_value());
+  optional_header_raw.SizeOfImage                  = static_cast<uint32_t>(optional_header.sizeof_image());
+  optional_header_raw.SizeOfHeaders                = static_cast<uint32_t>(optional_header.sizeof_headers());
+  optional_header_raw.CheckSum                     = static_cast<uint32_t>(optional_header.checksum());
+  optional_header_raw.Subsystem                    = static_cast<uint16_t>(optional_header.subsystem());
+  optional_header_raw.DLLCharacteristics           = static_cast<uint16_t>(optional_header.dll_characteristics());
+  optional_header_raw.SizeOfStackReserve           = static_cast<uint__>(optional_header.sizeof_stack_reserve());
+  optional_header_raw.SizeOfStackCommit            = static_cast<uint__>(optional_header.sizeof_stack_commit());
+  optional_header_raw.SizeOfHeapReserve            = static_cast<uint__>(optional_header.sizeof_heap_reserve());
+  optional_header_raw.SizeOfHeapCommit             = static_cast<uint__>(optional_header.sizeof_heap_commit());
+  optional_header_raw.LoaderFlags                  = static_cast<uint32_t>(optional_header.loader_flags());
+  optional_header_raw.NumberOfRvaAndSize           = static_cast<uint32_t>(optional_header.numberof_rva_and_size());
+
+
+  const uint32_t address_next_header = this->binary_->dos_header().addressof_new_exeheader() + sizeof(pe_header);
+  this->ios_.seekp(address_next_header);
+  this->ios_.write(reinterpret_cast<const uint8_t*>(&optional_header_raw), sizeof(pe_optional_header));
+
+}
+
+
+template<typename PE_T>
+void Builder::build_tls(void) {
+  using uint__ = typename PE_T::uint;
+  using pe_tls = typename PE_T::pe_tls;
+
+  auto&& it_tls = std::find_if(
+    std::begin(this->binary_->sections_),
+    std::end(this->binary_->sections_),
+    [] (const Section* section)
+    {
+      const std::set<SECTION_TYPES>& types = section->types();
+      return types.size() == 1 and types.find(SECTION_TYPES::TLS) != std::end(types);
+    });
+
+  Section *tls_section = nullptr;
+
+  pe_tls tls_raw;
+  const TLS& tls_obj = this->binary_->tls();
+
+  // No .tls section register in the binary. We have to create it
+  if (it_tls == std::end(this->binary_->sections_)) {
+    Section new_section{".l" + std::to_string(DATA_DIRECTORY::TLS_TABLE)}; // .l9 -> lief.tls
+    new_section.characteristics(0xC0300040);
+    uint64_t tls_section_size = sizeof(pe_tls);
+
+    const uint64_t offset_callbacks = this->binary_->va_to_offset(tls_obj.addressof_callbacks());
+    const uint64_t offset_rawdata   = this->binary_->va_to_offset(tls_obj.addressof_raw_data().first);
+
+    try {
+      const Section& _ [[gnu::unused]] = this->binary_->section_from_offset(offset_callbacks);
+    } catch (const not_found&) { // Callbacks will be in our section (not present yet)
+      tls_section_size += tls_obj.callbacks().size() * sizeof(uint__);
+    }
+
+
+    try {
+      const Section& _ [[gnu::unused]] = this->binary_->section_from_offset(offset_rawdata);
+    } catch (const not_found&) { // data_template will be in our section (not present yet)
+      tls_section_size += tls_obj.data_template().size();
+    }
+
+    tls_section_size = align(tls_section_size, this->binary_->optional_header().file_alignment());
+    new_section.content(std::vector<uint8_t>(tls_section_size, 0));
+
+    tls_section = &(this->binary_->add_section(new_section, SECTION_TYPES::TLS));
+  } else {
+    tls_section = *it_tls;
+  }
+
+  tls_raw.RawDataStartVA    = static_cast<uint__>(tls_obj.addressof_raw_data().first);
+  tls_raw.RawDataEndVA      = static_cast<uint__>(tls_obj.addressof_raw_data().second);
+  tls_raw.AddressOfIndex    = static_cast<uint__>(tls_obj.addressof_index());
+  tls_raw.AddressOfCallback = static_cast<uint__>(tls_obj.addressof_callbacks());
+  tls_raw.SizeOfZeroFill    = static_cast<uint32_t>(tls_obj.sizeof_zero_fill());
+  tls_raw.Characteristics   = static_cast<uint32_t>(tls_obj.characteristics());
+
+  std::vector<uint8_t> data(sizeof(pe_tls), 0);
+
+  std::copy(
+      reinterpret_cast<uint8_t*>(&tls_raw),
+      reinterpret_cast<uint8_t*>(&tls_raw) + sizeof(pe_tls),
+      data.data());
+
+  const uint64_t offset_callbacks = this->binary_->va_to_offset(tls_obj.addressof_callbacks());
+  const uint64_t offset_rawdata   = this->binary_->va_to_offset(tls_obj.addressof_raw_data().first);
+  try {
+    Section& section_callbacks = this->binary_->section_from_offset(offset_callbacks);
+
+    const uint64_t size_needed = (tls_obj.callbacks().size()) * sizeof(uint__);
+
+    if (section_callbacks == *tls_section) {
+      // Case where the section where callbacks are located is the same
+      // than the current .tls section
+
+      uint64_t relative_offset = offset_callbacks - tls_section->offset();
+
+      for (uint__ callback : tls_obj.callbacks()) {
+        data.insert(
+            std::begin(data) + relative_offset,
+            reinterpret_cast<uint8_t*>(&callback),
+            reinterpret_cast<uint8_t*>(&callback) + sizeof(uint__));
+        relative_offset += sizeof(uint__);
+      }
+
+      //data.insert(std::begin(data) + relative_offset + sizeof(uint__), sizeof(uint__), 0);
+
+    } else {
+      // Case where the section where callbacks are located is **not** in the same
+      // current .tls section
+
+      uint64_t relative_offset = offset_callbacks - section_callbacks.offset();
+      std::vector<uint8_t> callback_data = section_callbacks.content();
+
+      if (callback_data.size() < (relative_offset + size_needed)) {
+        throw builder_error("Don't have enough space to write callbacks");
+      }
+
+      for (uint__ callback : tls_obj.callbacks()) {
+        std::copy(
+          reinterpret_cast<uint8_t*>(&callback),
+          reinterpret_cast<uint8_t*>(&callback) + sizeof(uint__),
+          callback_data.data() + relative_offset);
+        relative_offset += sizeof(uint__);
+      }
+      section_callbacks.content(callback_data);
+
+    }
+  } catch (const not_found&) {
+    throw builder_error("Can't find the section which holds callbacks.");
+  }
+
+
+  try {
+    Section& section_rawdata = this->binary_->section_from_offset(offset_rawdata);
+
+    const std::vector<uint8_t>& data_template = tls_obj.data_template();
+    const uint64_t size_needed = data_template.size();
+
+    if (section_rawdata == *tls_section) {
+      // Case where the section where data templates are located in the same
+      // than the current .tls section
+
+      const uint64_t relative_offset = offset_rawdata - tls_section->offset();
+
+      data.insert(
+          std::begin(data) + relative_offset,
+          std::begin(data_template),
+          std::end(data_template));
+
+    } else {
+      const uint64_t relative_offset = offset_rawdata - section_rawdata.offset();
+      std::vector<uint8_t> section_data = section_rawdata.content();
+      const std::vector<uint8_t>& data_template = tls_obj.data_template();
+      if (section_data.size() < (relative_offset + size_needed)) {
+        throw builder_error("Don't have enough space to write data template.");
+      }
+
+      std::copy(
+          std::begin(data_template),
+          std::end(data_template),
+          section_data.data() + relative_offset);
+      section_rawdata.content(section_data);
+
+    }
+  } catch (const not_found&) {
+    throw builder_error("Can't find the section which holds 'data_template'.");
+  }
+
+
+  if (data.size() > tls_section->size()) {
+    throw builder_error("Builder constructed a bigger section that the original one.");
+  }
+
+  data.insert(std::end(data), tls_section->size() - data.size(), 0);
+  tls_section->content(data);
+
+}
+
+}
+}
diff --git a/src/PE/CMakeLists.txt b/src/PE/CMakeLists.txt
new file mode 100644
index 0000000..77fe635
--- /dev/null
+++ b/src/PE/CMakeLists.txt
@@ -0,0 +1,52 @@
+set(LIEF_PE_SRC
+  ${CMAKE_CURRENT_LIST_DIR}/utils.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ExportEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Binary.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Symbol.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/EnumToString.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Header.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DosHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ResourceDirectory.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Import.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ResourceNode.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Export.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Section.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/OptionalHeader.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Builder.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Parser.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ResourcesManager.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Relocation.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/TLS.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/Debug.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ImportEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/ResourceData.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/RelocationEntry.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/DataDirectory.cpp
+
+  ${CMAKE_CURRENT_LIST_DIR}/signature/AuthenticatedAttributes.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/signature/ContentInfo.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/signature/Signature.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/signature/SignerInfo.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/signature/x509.cpp
+  ${CMAKE_CURRENT_LIST_DIR}/signature/OIDToString.cpp
+  )
+
+target_sources(LIB_LIEF_STATIC PRIVATE ${LIEF_PE_SRC})
+target_sources(LIB_LIEF_SHARED PRIVATE ${LIEF_PE_SRC})
+
+
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/enums.inc      LIEF_PE_ENUMS)
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/structures.inc LIEF_PE_STRUCTURES)
+
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/enums.hpp.in
+  ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/PE/enums.hpp
+  @ONLY
+)
+
+configure_file(
+  ${CMAKE_CURRENT_SOURCE_DIR}/include/LIEF/PE/Structures.hpp.in
+  ${CMAKE_CURRENT_BINARY_DIR}/include/LIEF/PE/Structures.hpp
+  @ONLY
+)
+
diff --git a/src/PE/DataDirectory.cpp b/src/PE/DataDirectory.cpp
new file mode 100644
index 0000000..eeb7aca
--- /dev/null
+++ b/src/PE/DataDirectory.cpp
@@ -0,0 +1,149 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iostream>
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/DataDirectory.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+
+namespace LIEF {
+namespace PE {
+
+DataDirectory::~DataDirectory(void) = default;
+
+DataDirectory::DataDirectory(void) :
+  rva_{0},
+  size_{0},
+  type_{},
+  section_{nullptr}
+{}
+
+DataDirectory::DataDirectory(DATA_DIRECTORY type) :
+  rva_{0},
+  size_{0},
+  type_{type},
+  section_{nullptr}
+{}
+
+DataDirectory::DataDirectory(const pe_data_directory *header, DATA_DIRECTORY type) :
+  rva_{header->RelativeVirtualAddress},
+  size_{header->Size},
+  type_{type},
+  section_{nullptr}
+{}
+
+DataDirectory::DataDirectory(const DataDirectory& other) :
+  Visitable{other},
+  rva_{other.rva_},
+  size_{other.size_},
+  type_{other.type_},
+  section_{nullptr}
+{}
+
+DataDirectory& DataDirectory::operator=(DataDirectory other) {
+  this->swap(other);
+  return *this;
+}
+
+void DataDirectory::swap(DataDirectory& other) {
+  std::swap(this->rva_,     other.rva_);
+  std::swap(this->size_,    other.size_);
+  std::swap(this->type_,    other.type_);
+  std::swap(this->section_, other.section_);
+}
+
+
+
+uint32_t DataDirectory::RVA(void) const {
+  return this->rva_;
+}
+
+
+uint32_t DataDirectory::size(void) const {
+  return this->size_;
+}
+
+
+bool DataDirectory::has_section(void) const {
+  return this->section_ != nullptr;
+}
+
+
+const Section& DataDirectory::section(void) const {
+  if (this->section_ != nullptr) {
+    return *this->section_;
+  } else {
+    throw not_found("No section associated with the data directory '" +
+        std::string{to_string(this->type())} + "'");
+  }
+}
+
+Section& DataDirectory::section(void) {
+  return const_cast<Section&>(static_cast<const DataDirectory*>(this)->section());
+}
+
+DATA_DIRECTORY DataDirectory::type(void) const {
+  return this->type_;
+}
+
+void DataDirectory::RVA(uint32_t rva) {
+  this->rva_ = rva;
+}
+
+
+void DataDirectory::size(uint32_t size) {
+  this->size_ = size;
+}
+
+void DataDirectory::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->RVA());
+  visitor.visit(this->size());
+  visitor.visit(this->type());
+  if (this->has_section()) {
+    visitor(this->section());
+  }
+}
+
+
+
+bool DataDirectory::operator==(const DataDirectory& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool DataDirectory::operator!=(const DataDirectory& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const DataDirectory& entry) {
+  os << std::hex;
+  os << "Data directory \"" << to_string(entry.type()) << "\"" << std::endl;
+  os << std::setw(10) << std::left << std::setfill(' ') << "RVA: "  << entry.RVA()  << std::endl;
+  os << std::setw(10) << std::left << std::setfill(' ') << "Size: " << entry.size() << std::endl;
+  if (entry.has_section()) {
+    os << std::setw(10) << std::left << std::setfill(' ') << "Section: " << entry.section().name() << std::endl;
+  }
+
+  return os;
+
+}
+}
+}
diff --git a/src/PE/Debug.cpp b/src/PE/Debug.cpp
new file mode 100644
index 0000000..809f9b1
--- /dev/null
+++ b/src/PE/Debug.cpp
@@ -0,0 +1,160 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/EnumToString.hpp"
+#include "LIEF/PE/Debug.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Debug::Debug(const Debug& other) = default;
+Debug& Debug::operator=(const Debug& other) = default;
+Debug::~Debug(void) = default;
+
+Debug::Debug(void) :
+  characteristics_{0},
+  timestamp_{0},
+  majorversion_{0},
+  minorversion_{0},
+  type_{DEBUG_TYPES::IMAGE_DEBUG_TYPE_UNKNOWN},
+  sizeof_data_{0},
+  addressof_rawdata_{0},
+  pointerto_rawdata_{0}
+{}
+
+Debug::Debug(const pe_debug* debug_s) :
+  characteristics_{debug_s->Characteristics},
+  timestamp_{debug_s->TimeDateStamp},
+  majorversion_{debug_s->MajorVersion},
+  minorversion_{debug_s->MinorVersion},
+  type_{static_cast<DEBUG_TYPES>(debug_s->Type)},
+  sizeof_data_{debug_s->SizeOfData},
+  addressof_rawdata_{debug_s->AddressOfRawData},
+  pointerto_rawdata_{debug_s->PointerToRawData}
+{}
+
+
+
+uint32_t Debug::characteristics(void) const {
+  return this->characteristics_;
+}
+
+uint32_t Debug::timestamp(void) const {
+  return this->timestamp_;
+}
+
+uint16_t Debug::major_version(void) const {
+  return this->majorversion_;
+}
+
+uint16_t Debug::minor_version(void) const {
+  return this->minorversion_;
+}
+
+DEBUG_TYPES Debug::type(void) const {
+  return this->type_;
+}
+
+uint32_t Debug::sizeof_data(void) const {
+  return this->sizeof_data_;
+}
+
+uint32_t Debug::addressof_rawdata(void) const {
+  return this->addressof_rawdata_;
+}
+
+uint32_t Debug::pointerto_rawdata(void) const {
+  return this->pointerto_rawdata_;
+}
+
+
+void Debug::characteristics(uint32_t characteristics) {
+  this->characteristics_ = characteristics;
+}
+
+void Debug::timestamp(uint32_t timestamp) {
+  this->timestamp_ = timestamp;
+}
+
+void Debug::major_version(uint16_t major_version) {
+  this->majorversion_ = major_version;
+}
+
+void Debug::minor_version(uint16_t minor_version) {
+  this->minorversion_ = minor_version;
+}
+
+void Debug::type(DEBUG_TYPES new_type) {
+  this->type_ = new_type;
+}
+
+void Debug::sizeof_data(uint32_t sizeof_data) {
+  this->sizeof_data_ = sizeof_data;
+}
+
+void Debug::addressof_rawdata(uint32_t addressof_rawdata) {
+  this->addressof_rawdata_ = addressof_rawdata;
+}
+
+void Debug::pointerto_rawdata(uint32_t pointerto_rawdata) {
+  this->pointerto_rawdata_ = pointerto_rawdata;
+}
+
+
+void Debug::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->characteristics());
+  visitor.visit(this->timestamp());
+  visitor.visit(this->major_version());
+  visitor.visit(this->minor_version());
+  visitor.visit(this->type());
+  visitor.visit(this->sizeof_data());
+  visitor.visit(this->addressof_rawdata());
+  visitor.visit(this->pointerto_rawdata());
+}
+
+bool Debug::operator==(const Debug& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Debug::operator!=(const Debug& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const Debug& entry) {
+
+  os << std::hex;
+  os << std::left;
+  os << std::setfill(' ');
+
+  os << std::setw(20) << "Characteristics:"    << entry.characteristics()             << std::endl;
+  os << std::setw(20) << "Timestamp:"          << entry.timestamp()                   << std::endl;
+  os << std::setw(20) << "Major version:"      << entry.major_version()               << std::endl;
+  os << std::setw(20) << "Minor version:"      << entry.minor_version()               << std::endl;
+  os << std::setw(20) << "Type:"               << to_string(entry.type()) << std::endl;
+  os << std::setw(20) << "Size of data:"       << entry.sizeof_data()                 << std::endl;
+  os << std::setw(20) << "Address of rawdata:" << entry.addressof_rawdata()           << std::endl;
+  os << std::setw(20) << "Pointer to rawdata:" << entry.pointerto_rawdata()           << std::endl;
+  return os;
+}
+
+} // namespace PE
+} // namespace LIEF
diff --git a/src/PE/DosHeader.cpp b/src/PE/DosHeader.cpp
new file mode 100644
index 0000000..48d870f
--- /dev/null
+++ b/src/PE/DosHeader.cpp
@@ -0,0 +1,325 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/DosHeader.hpp"
+
+namespace LIEF {
+namespace PE {
+
+DosHeader::~DosHeader(void) = default;
+DosHeader::DosHeader(const DosHeader& copy) = default;
+DosHeader& DosHeader::operator=(const DosHeader& copy) = default;
+
+DosHeader::DosHeader(void) :
+  magic_{0x5a4d},
+  usedBytesInTheLastPage_{144},
+  fileSizeInPages_{3},
+  numberOfRelocation_{0},
+  headerSizeInParagraphs_{4},
+  minimumExtraParagraphs_{0},
+  maximumExtraParagraphs_{0xFFFF},
+  initialRelativeSS_{0},
+  initialSP_{0xb8},
+  checksum_{0},
+  initialIP_{0},
+  initialRelativeCS_{0},
+  addressOfRelocationTable_{0x40},
+  overlayNumber_{0},
+  oEMid_{0},
+  oEMinfo_{0},
+  addressOfNewExeHeader_{0xF0} // or 0xE8
+{}
+
+DosHeader::DosHeader(const pe_dos_header *header) :
+  magic_{header->Magic},
+  usedBytesInTheLastPage_{header->UsedBytesInTheLastPage},
+  fileSizeInPages_{header->FileSizeInPages},
+  numberOfRelocation_{header->NumberOfRelocationItems},
+  headerSizeInParagraphs_{header->HeaderSizeInParagraphs},
+  minimumExtraParagraphs_{header->MinimumExtraParagraphs},
+  maximumExtraParagraphs_{header->MaximumExtraParagraphs},
+  initialRelativeSS_{header->InitialRelativeSS},
+  initialSP_{header->InitialSP},
+  checksum_{header->Checksum},
+  initialIP_{header->InitialIP},
+  initialRelativeCS_{header->InitialRelativeCS},
+  addressOfRelocationTable_{header->AddressOfRelocationTable},
+  overlayNumber_{header->OverlayNumber},
+  oEMid_{header->OEMid},
+  oEMinfo_{header->OEMinfo},
+  addressOfNewExeHeader_{header->AddressOfNewExeHeader}
+{
+  std::copy(
+      reinterpret_cast<const uint16_t*>(header->Reserved),
+      reinterpret_cast<const uint16_t*>(header->Reserved)  + 4,
+      std::begin(this->reserved_));
+  std::copy(
+      reinterpret_cast<const uint16_t*>(header->Reserved2),
+      reinterpret_cast<const uint16_t*>(header->Reserved2) + 10,
+      std::begin(this->reserved2_));
+}
+
+
+uint16_t DosHeader::magic(void) const {
+  return this->magic_;
+}
+
+
+uint16_t DosHeader::used_bytes_in_the_last_page(void) const {
+  return this->usedBytesInTheLastPage_;
+}
+
+
+uint16_t DosHeader::file_size_in_pages(void) const {
+  return this->fileSizeInPages_;
+}
+
+
+uint16_t DosHeader::numberof_relocation(void) const {
+  return this->numberOfRelocation_;
+}
+
+
+uint16_t DosHeader::header_size_in_paragraphs(void) const {
+  return this->headerSizeInParagraphs_;
+}
+
+
+uint16_t DosHeader::minimum_extra_paragraphs(void) const {
+  return this->minimumExtraParagraphs_;
+}
+
+
+uint16_t DosHeader::maximum_extra_paragraphs(void) const {
+  return this->maximumExtraParagraphs_;
+}
+
+
+uint16_t DosHeader::initial_relative_ss(void) const {
+  return this->initialRelativeSS_;
+}
+
+
+uint16_t DosHeader::initial_sp(void) const {
+  return this->initialSP_;
+}
+
+
+uint16_t DosHeader::checksum(void) const {
+  return this->checksum_;
+}
+
+
+uint16_t DosHeader::initial_ip(void) const {
+  return this->initialIP_;
+}
+
+
+uint16_t DosHeader::initial_relative_cs(void) const {
+  return this->initialRelativeCS_;
+}
+
+
+uint16_t DosHeader::addressof_relocation_table(void) const {
+  return this->addressOfRelocationTable_;
+}
+
+
+uint16_t DosHeader::overlay_number(void) const {
+  return this->overlayNumber_;
+}
+
+
+std::array<uint16_t, 4> DosHeader::reserved(void) const {
+  return this->reserved_;
+}
+
+
+uint16_t DosHeader::oem_id(void) const {
+  return this->oEMid_;
+}
+
+
+uint16_t DosHeader::oem_info(void) const {
+  return this->oEMinfo_;
+}
+
+
+std::array<uint16_t, 10> DosHeader::reserved2(void) const {
+  return this->reserved2_;
+}
+
+
+uint32_t DosHeader::addressof_new_exeheader(void) const {
+  return this->addressOfNewExeHeader_;
+}
+
+
+
+void DosHeader::magic(uint16_t magic) {
+  this->magic_ = magic;
+}
+
+
+void DosHeader::used_bytes_in_the_last_page(uint16_t usedBytesInTheLastPage) {
+  this->usedBytesInTheLastPage_ = usedBytesInTheLastPage;
+}
+
+
+void DosHeader::file_size_in_pages(uint16_t fileSizeInPages) {
+  this->fileSizeInPages_ = fileSizeInPages;
+}
+
+
+void DosHeader::numberof_relocation(uint16_t numberOfRelocation) {
+  this->numberOfRelocation_ = numberOfRelocation;
+}
+
+
+void DosHeader::header_size_in_paragraphs(uint16_t headerSizeInParagraphs) {
+  this->headerSizeInParagraphs_ = headerSizeInParagraphs;
+}
+
+
+void DosHeader::minimum_extra_paragraphs(uint16_t minimumExtraParagraphs) {
+  this->minimumExtraParagraphs_ = minimumExtraParagraphs;
+}
+
+
+void DosHeader::maximum_extra_paragraphs(uint16_t maximumExtraParagraphs) {
+  this->maximumExtraParagraphs_ = maximumExtraParagraphs;
+}
+
+
+void DosHeader::initial_relative_ss(uint16_t initialRelativeSS) {
+  this->initialRelativeSS_ = initialRelativeSS;
+}
+
+
+void DosHeader::initial_sp(uint16_t initialSP) {
+  this->initialSP_ = initialSP;
+}
+
+
+void DosHeader::checksum(uint16_t checksum) {
+  this->checksum_ = checksum;
+}
+
+
+void DosHeader::initial_ip(uint16_t initialIP) {
+  this->initialIP_ = initialIP;
+}
+
+
+void DosHeader::initial_relative_cs(uint16_t initialRelativeCS) {
+  this->initialRelativeCS_ = initialRelativeCS;
+}
+
+
+void DosHeader::addressof_relocation_table(uint16_t addressOfRelocationTable) {
+  this->addressOfRelocationTable_ = addressOfRelocationTable;
+}
+
+
+void DosHeader::overlay_number(uint16_t overlayNumber) {
+  this->overlayNumber_ = overlayNumber;
+}
+
+
+void DosHeader::reserved(const std::array<uint16_t, 4>& reserved) {
+  this->reserved_ = reserved;
+}
+
+
+void DosHeader::oem_id(uint16_t oEMid) {
+  this->oEMid_ = oEMid;
+}
+
+
+void DosHeader::oem_info(uint16_t oEMinfo) {
+  this->oEMinfo_ = oEMinfo;
+}
+
+
+void DosHeader::reserved2(const std::array<uint16_t, 10>& reserved2) {
+  this->reserved2_ = reserved2;
+}
+
+
+void DosHeader::addressof_new_exeheader(uint32_t addressOfNewExeHeader) {
+  this->addressOfNewExeHeader_ = addressOfNewExeHeader;
+}
+
+void DosHeader::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->magic());
+  visitor.visit(this->used_bytes_in_the_last_page());
+  visitor.visit(this->file_size_in_pages());
+  visitor.visit(this->numberof_relocation());
+  visitor.visit(this->header_size_in_paragraphs());
+  visitor.visit(this->minimum_extra_paragraphs());
+  visitor.visit(this->maximum_extra_paragraphs());
+  visitor.visit(this->initial_relative_ss());
+  visitor.visit(this->initial_sp());
+  visitor.visit(this->checksum());
+  visitor.visit(this->initial_ip());
+  visitor.visit(this->initial_relative_cs());
+  visitor.visit(this->addressof_relocation_table());
+  visitor.visit(this->overlay_number());
+  visitor.visit(this->reserved());
+  visitor.visit(this->oem_id());
+  visitor.visit(this->oem_info());
+  visitor.visit(this->reserved2());
+  visitor.visit(this->addressof_new_exeheader());
+}
+
+bool DosHeader::operator==(const DosHeader& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool DosHeader::operator!=(const DosHeader& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const DosHeader& entry) {
+  os << std::hex;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Magic: "                       << entry.magic_                    << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Used Bytes In The LastPage: "  << entry.usedBytesInTheLastPage_   << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "File Size In Pages: "          << entry.fileSizeInPages_          << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Number Of Relocation: "        << entry.numberOfRelocation_       << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Header Size In Paragraphs: "   << entry.headerSizeInParagraphs_   << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Minimum Extra Paragraphs: "    << entry.minimumExtraParagraphs_   << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Maximum Extra Paragraphs: "    << entry.maximumExtraParagraphs_   << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Initial Relative SS: "         << entry.initialRelativeSS_        << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Initial SP: "                  << entry.initialSP_                << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Checksum: "                    << entry.checksum_                 << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Initial IP: "                  << entry.initialIP_                << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Initial Relative CS: "         << entry.initialRelativeCS_        << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Address Of Relocation Table: " << entry.addressOfRelocationTable_ << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Overlay Number: "              << entry.overlayNumber_            << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "OEM id: "                      << entry.oEMid_                    << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "OEM info: "                    << entry.oEMinfo_                  << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Address Of New Exe Header: "   << entry.addressOfNewExeHeader_    << std::endl;
+  return os;
+}
+
+}
+}
diff --git a/src/PE/EnumToString.cpp b/src/PE/EnumToString.cpp
new file mode 100644
index 0000000..79ad83c
--- /dev/null
+++ b/src/PE/EnumToString.cpp
@@ -0,0 +1,417 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/PE/Structures.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+#include <map>
+
+namespace LIEF {
+namespace PE {
+
+const char* to_string(PE_TYPE e) {
+  const std::map<PE_TYPE, const char*> enumStrings {
+    { PE_TYPE::PE32,     "PE32" },
+    { PE_TYPE::PE32_PLUS,"PE32_PLUS" },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(DATA_DIRECTORY e) {
+  const std::map<DATA_DIRECTORY, const char*> enumStrings {
+    { DATA_DIRECTORY::EXPORT_TABLE,            "EXPORT_TABLE" },
+    { DATA_DIRECTORY::IMPORT_TABLE,            "IMPORT_TABLE" },
+    { DATA_DIRECTORY::RESOURCE_TABLE,          "RESOURCE_TABLE" },
+    { DATA_DIRECTORY::EXCEPTION_TABLE,         "EXCEPTION_TABLE" },
+    { DATA_DIRECTORY::CERTIFICATE_TABLE,       "CERTIFICATE_TABLE" },
+    { DATA_DIRECTORY::BASE_RELOCATION_TABLE,   "BASE_RELOCATION_TABLE" },
+    { DATA_DIRECTORY::DEBUG,                   "DEBUG" },
+    { DATA_DIRECTORY::ARCHITECTURE,            "ARCHITECTURE" },
+    { DATA_DIRECTORY::GLOBAL_PTR,              "GLOBAL_PTR" },
+    { DATA_DIRECTORY::TLS_TABLE,               "TLS_TABLE" },
+    { DATA_DIRECTORY::LOAD_CONFIG_TABLE,       "LOAD_CONFIG_TABLE" },
+    { DATA_DIRECTORY::BOUND_IMPORT,            "BOUND_IMPORT" },
+    { DATA_DIRECTORY::IAT,                     "IAT" },
+    { DATA_DIRECTORY::DELAY_IMPORT_DESCRIPTOR, "DELAY_IMPORT_DESCRIPTOR" },
+    { DATA_DIRECTORY::CLR_RUNTIME_HEADER,      "CLR_RUNTIME_HEADER" }
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(MACHINE_TYPES e) {
+  const std::map<MACHINE_TYPES, const char*> enumStrings {
+    { MACHINE_TYPES::MT_Invalid,                   "INVALID" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_UNKNOWN,   "UNKNOWN" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_AM33,      "AM33" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_AMD64,     "AMD64" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_ARM,       "ARM" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_ARMNT,     "ARMNT" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_EBC,       "EBC" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_I386,      "I386" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_IA64,      "IA64" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_M32R,      "M32R" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_MIPS16,    "MIPS16" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_MIPSFPU,   "MIPSFPU" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_MIPSFPU16, "MIPSFPU16" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_POWERPC,   "POWERPC" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_POWERPCFP, "POWERPCFP" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_R4000,     "R4000" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_SH3,       "SH3" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_SH3DSP,    "SH3DSP" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_SH4,       "SH4" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_SH5,       "SH5" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_THUMB,     "THUMB" },
+    { MACHINE_TYPES::IMAGE_FILE_MACHINE_WCEMIPSV2, "WCEMIPSV2" }
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+
+const char* to_string(HEADER_CHARACTERISTICS e) {
+  const std::map<HEADER_CHARACTERISTICS, const char*> enumStrings {
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_RELOCS_STRIPPED,         "RELOCS_STRIPPED" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_EXECUTABLE_IMAGE,        "EXECUTABLE_IMAGE" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_LINE_NUMS_STRIPPED,      "LINE_NUMS_STRIPPED" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_LOCAL_SYMS_STRIPPED,     "LOCAL_SYMS_STRIPPED" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_AGGRESSIVE_WS_TRIM,      "AGGRESSIVE_WS_TRIM" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_LARGE_ADDRESS_AWARE,     "LARGE_ADDRESS_AWARE" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_BYTES_REVERSED_LO,       "BYTES_REVERSED_LO" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_32BIT_MACHINE,           "32BIT_MACHINE" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_DEBUG_STRIPPED,          "DEBUG_STRIPPED" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP, "REMOVABLE_RUN_FROM_SWAP" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_NET_RUN_FROM_SWAP,       "NET_RUN_FROM_SWAP" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_SYSTEM,                  "SYSTEM" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_DLL,                     "DLL" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_UP_SYSTEM_ONLY,          "UP_SYSTEM_ONLY" },
+    { HEADER_CHARACTERISTICS::IMAGE_FILE_BYTES_REVERSED_HI,       "BYTES_REVERSED_HI" }
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(SUBSYSTEM e) {
+  const std::map<SUBSYSTEM, const char*> enumStrings {
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_UNKNOWN,                  "UNKNOWN" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_NATIVE,                   "NATIVE" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_GUI,              "WINDOWS_GUI" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_CUI,              "WINDOWS_CUI" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_OS2_CUI,                  "OS2_CUI" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_POSIX_CUI,                "POSIX_CUI" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_NATIVE_WINDOWS,           "NATIVE_WINDOWS" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI,           "WINDOWS_CE_GUI" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_EFI_APPLICATION,          "EFI_APPLICATION" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER,  "EFI_BOOT_SERVICE_DRIVER" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER,       "EFI_RUNTIME_DRIVER" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_EFI_ROM,                  "EFI_ROM" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_XBOX,                     "XBOX" },
+    { SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION, "WINDOWS_BOOT_APPLICATION" },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(DLL_CHARACTERISTICS e) {
+  const std::map<DLL_CHARACTERISTICS, const char*> enumStrings {
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA,       "HIGH_ENTROPY_VA" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE,          "DYNAMIC_BASE" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY,       "FORCE_INTEGRITY" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_NX_COMPAT,             "NX_COMPAT" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION,          "NO_ISOLATION" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_NO_SEH,                "NO_SEH" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_NO_BIND,               "NO_BIND" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_APPCONTAINER,          "APPCONTAINER" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER,            "WDM_DRIVER" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_GUARD_CF,              "GUARD_CF" },
+    { DLL_CHARACTERISTICS::IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE, "TERMINAL_SERVER_AWARE" },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(SECTION_CHARACTERISTICS e) {
+  const std::map<SECTION_CHARACTERISTICS, const char*> enumStrings {
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_TYPE_NO_PAD,            "TYPE_NO_PAD" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_CODE,               "CNT_CODE" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_INITIALIZED_DATA,   "CNT_INITIALIZED_DATA" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_CNT_UNINITIALIZED_DATA, "CNT_UNINITIALIZED_DATA" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_OTHER,              "LNK_OTHER" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_INFO,               "LNK_INFO" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_REMOVE,             "LNK_REMOVE" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_COMDAT,             "LNK_COMDAT" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_GPREL,                  "GPREL" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_PURGEABLE,          "MEM_PURGEABLE" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_16BIT,              "MEM_16BIT" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_LOCKED,             "MEM_LOCKED" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_PRELOAD,            "MEM_PRELOAD" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_1BYTES,           "ALIGN_1BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_2BYTES,           "ALIGN_2BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_4BYTES,           "ALIGN_4BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_8BYTES,           "ALIGN_8BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_16BYTES,          "ALIGN_16BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_32BYTES,          "ALIGN_32BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_64BYTES,          "ALIGN_64BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_128BYTES,         "ALIGN_128BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_256BYTES,         "ALIGN_256BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_512BYTES,         "ALIGN_512BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_1024BYTES,        "ALIGN_1024BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_2048BYTES,        "ALIGN_2048BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_4096BYTES,        "ALIGN_4096BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_ALIGN_8192BYTES,        "ALIGN_8192BYTES" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_LNK_NRELOC_OVFL,        "LNK_NRELOC_OVFL" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_DISCARDABLE,        "MEM_DISCARDABLE" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_NOT_CACHED,         "MEM_NOT_CACHED" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_NOT_PAGED,          "MEM_NOT_PAGED" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_SHARED,             "MEM_SHARED" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_EXECUTE,            "MEM_EXECUTE" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_READ,               "MEM_READ" },
+      { SECTION_CHARACTERISTICS::IMAGE_SCN_MEM_WRITE,              "MEM_WRITE" }
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(SECTION_TYPES e) {
+  const std::map<SECTION_TYPES, const char*> enumStrings {
+    { SECTION_TYPES::TEXT,       "TEXT"       },
+    { SECTION_TYPES::TLS,        "TLS"        },
+    { SECTION_TYPES::IMPORT,     "IDATA"      },
+    { SECTION_TYPES::DATA,       "DATA"       },
+    { SECTION_TYPES::BSS,        "BSS"        },
+    { SECTION_TYPES::RESOURCE,   "RESOURCE"   },
+    { SECTION_TYPES::RELOCATION, "RELOCATION" },
+    { SECTION_TYPES::EXPORT,     "EXPORT"     },
+    { SECTION_TYPES::UNKNOWN,    "UNKNOWN"    },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(SYMBOL_BASE_TYPES e) {
+  const std::map<SYMBOL_BASE_TYPES, const char*> enumStrings {
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_NULL,   "NULL"   },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_VOID,   "VOID"   },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_CHAR,   "CHAR"   },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_SHORT,  "SHORT"  },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_INT,    "INT"    },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_LONG,   "LONG"   },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_FLOAT,  "FLOAT"  },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_DOUBLE, "DOUBLE" },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_STRUCT, "STRUCT" },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_UNION,  "UNION"  },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_ENUM,   "ENUM"   },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_MOE,    "MOE"    },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_BYTE,   "BYTE"   },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_WORD,   "WORD"   },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_UINT,   "UINT"   },
+    { SYMBOL_BASE_TYPES::IMAGE_SYM_TYPE_DWORD,  "DWORD"  },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+const char* to_string(SYMBOL_COMPLEX_TYPES e) {
+  const std::map<SYMBOL_COMPLEX_TYPES, const char*> enumStrings {
+    { SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_NULL,     "NULL"               },
+    { SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_POINTER,  "POINTER"            },
+    { SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_FUNCTION, "FUNCTION"           },
+    { SYMBOL_COMPLEX_TYPES::IMAGE_SYM_DTYPE_ARRAY,    "ARRAY"              },
+    { SYMBOL_COMPLEX_TYPES::SCT_COMPLEX_TYPE_SHIFT,   "COMPLEX_TYPE_SHIFT" },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(SYMBOL_SECTION_NUMBER e) {
+  const std::map<SYMBOL_SECTION_NUMBER, const char*> enumStrings {
+    { SYMBOL_SECTION_NUMBER::IMAGE_SYM_DEBUG,     "DEBUG"     },
+    { SYMBOL_SECTION_NUMBER::IMAGE_SYM_ABSOLUTE,  "ABSOLUTE"  },
+    { SYMBOL_SECTION_NUMBER::IMAGE_SYM_UNDEFINED, "UNDEFINED" },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(SYMBOL_STORAGE_CLASS e) {
+  const std::map<SYMBOL_STORAGE_CLASS, const char*> enumStrings {
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_END_OF_FUNCTION,  "END_OF_FUNCTION"  },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_NULL,             "NULL"             },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_AUTOMATIC,        "AUTOMATIC"        },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_EXTERNAL,         "EXTERNAL"         },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_STATIC,           "STATIC"           },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_REGISTER,         "REGISTER"         },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_EXTERNAL_DEF,     "EXTERNAL_DEF"     },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_LABEL,            "LABEL"            },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_UNDEFINED_LABEL,  "UNDEFINED_LABEL"  },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_MEMBER_OF_STRUCT, "MEMBER_OF_STRUCT" },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_UNION_TAG,        "UNION_TAG"        },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_TYPE_DEFINITION,  "TYPE_DEFINITION"  },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_UNDEFINED_STATIC, "UDEFINED_STATIC"  },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_ENUM_TAG,         "ENUM_TAG"         },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_MEMBER_OF_ENUM,   "MEMBER_OF_ENUM"   },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_REGISTER_PARAM,   "REGISTER_PARAM"   },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_BIT_FIELD,        "BIT_FIELD"        },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_BLOCK,            "BLOCK"            },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_FUNCTION,         "FUNCTION"         },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_END_OF_STRUCT,    "END_OF_STRUCT"    },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_FILE,             "FILE"             },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_SECTION,          "SECTION"          },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_WEAK_EXTERNAL,    "WEAK_EXTERNAL"    },
+    { SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_CLR_TOKEN,        "CLR_TOKEN"        },
+  };
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(RELOCATIONS_I386 e) {
+  const std::map<RELOCATIONS_I386, const char*> enumStrings {
+    { RELOCATIONS_I386::IMAGE_REL_I386_ABSOLUTE,  "ABSOLUTE" },
+    { RELOCATIONS_I386::IMAGE_REL_I386_DIR16,     "DIR16"    },
+    { RELOCATIONS_I386::IMAGE_REL_I386_REL16,     "REL16"    },
+    { RELOCATIONS_I386::IMAGE_REL_I386_DIR32,     "DIR32"    },
+    { RELOCATIONS_I386::IMAGE_REL_I386_DIR32NB,   "DIR32NB"  },
+    { RELOCATIONS_I386::IMAGE_REL_I386_SEG12,     "SEG12"    },
+    { RELOCATIONS_I386::IMAGE_REL_I386_SECTION,   "SECTION"  },
+    { RELOCATIONS_I386::IMAGE_REL_I386_SECREL,    "SECREL"   },
+    { RELOCATIONS_I386::IMAGE_REL_I386_TOKEN,     "TOKEN"    },
+    { RELOCATIONS_I386::IMAGE_REL_I386_SECREL7,   "SECREL7"  },
+    { RELOCATIONS_I386::IMAGE_REL_I386_REL32,     "REL32"    },
+  };
+
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+
+const char* to_string(RELOCATIONS_AMD64 e) {
+  const std::map<RELOCATIONS_AMD64, const char*> enumStrings {
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_ABSOLUTE, "ABSOLUTE" },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_ADDR64,   "ADDR64"   },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_ADDR32,   "ADDR32"   },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_ADDR32NB, "ADDR32NB" },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_REL32,    "REL32"    },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_REL32_1,  "REL32_1"  },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_REL32_2,  "REL32_2"  },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_REL32_3,  "REL32_3"  },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_REL32_4,  "REL32_4"  },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_REL32_5,  "REL32_5"  },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_SECTION,  "SECTION"  },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_SECREL,   "SECREL"   },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_SECREL7,  "SECREL7"  },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_TOKEN,    "TOKEN"    },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_SREL32,   "SREL32"   },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_PAIR,     "PAIR"     },
+    { RELOCATIONS_AMD64::IMAGE_REL_AMD64_SSPAN32,  "SSPAN32"  },
+  };
+
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+
+const char* to_string(RELOCATIONS_ARM e) {
+  const std::map<RELOCATIONS_ARM, const char*> enumStrings {
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_ABSOLUTE,  "ABSOLUTE"  },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_ADDR32,    "ADDR32"    },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_ADDR32NB,  "ADDR32NB"  },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_BRANCH24,  "BRANCH24"  },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_BRANCH11,  "BRANCH11"  },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_TOKEN,     "TOKEN"     },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_BLX24,     "BLX24"     },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_BLX11,     "BLX11"     },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_SECTION,   "SECTION"   },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_SECREL,    "SECREL"    },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_MOV32A,    "MOV32A"    },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_MOV32T,    "MOV32T"    },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_BRANCH20T, "BRANCH20T" },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_BRANCH24T, "BRANCH24T" },
+    { RELOCATIONS_ARM::IMAGE_REL_ARM_BLX23T,    "BLX23T"    },
+  };
+
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+const char* to_string(RELOCATIONS_BASE_TYPES e) {
+  const std::map<RELOCATIONS_BASE_TYPES, const char*> enumStrings {
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_ABSOLUTE,       "ABSOLUTE"  },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGH,           "HIGH"      },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_LOW,            "LOW"       },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGHLOW,        "HIGHLOW"   },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGHADJ,        "HIGHADJ"   },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_MIPS_JMPADDR,   "JMPADDR"   },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_SECTION,        "SECTION"   },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_REL,            "REL"       },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_MIPS_JMPADDR16, "JMPADDR16" },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_IA64_IMM64,     "IMM64"     },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_DIR64,          "DIR64"     },
+    { RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_HIGH3ADJ,       "HIGH3ADJ"  }
+  };
+
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+
+const char* to_string(DEBUG_TYPES e) {
+  const std::map<DEBUG_TYPES, const char*> enumStrings {
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_UNKNOWN,       "UNKNOWN"   },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_COFF,          "COFF"      },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_CODEVIEW,      "CODEVIEW"  },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_FPO,           "FPO"       },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_MISC,          "MISC"      },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_EXCEPTION,     "EXCEPTION" },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_FIXUP,         "FIXUP"     },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_OMAP_TO_SRC,   "SRC"       },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_OMAP_FROM_SRC, "SRC"       },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_BORLAND,       "BORLAND"   },
+    { DEBUG_TYPES::IMAGE_DEBUG_TYPE_CLSID,         "CLSID"     },
+  };
+
+  auto   it  = enumStrings.find(e);
+  return it == enumStrings.end() ? "Out of range" : it->second;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+} // namespace PE
+} // namespace LIEF
diff --git a/src/PE/Export.cpp b/src/PE/Export.cpp
new file mode 100644
index 0000000..bec8116
--- /dev/null
+++ b/src/PE/Export.cpp
@@ -0,0 +1,136 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/Export.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Export::~Export(void) = default;
+Export::Export(const Export& copy) = default;
+Export& Export::operator=(const Export& copy) = default;
+
+Export::Export(void) :
+  exportFlags_{0},
+  timestamp_{0},
+  majorVersion_{0},
+  minorVersion_{0},
+  ordinalBase_{0}
+{}
+
+Export::Export(const pe_export_directory_table *header) :
+  exportFlags_{header->ExportFlags},
+  timestamp_{header->Timestamp},
+  majorVersion_{header->MajorVersion},
+  minorVersion_{header->MinorVersion},
+  ordinalBase_{header->OrdinalBase}
+{}
+
+uint32_t Export::export_flags(void) const {
+  return this->exportFlags_;
+}
+
+uint32_t Export::timestamp(void) const {
+  return this->timestamp_;
+}
+
+uint16_t Export::major_version(void) const {
+  return this->majorVersion_;
+}
+
+uint16_t Export::minor_version(void) const {
+  return this->minorVersion_;
+}
+
+uint32_t Export::ordinal_base(void) const {
+  return this->ordinalBase_;
+}
+
+const std::string& Export::name(void) const {
+  return this->name_;
+}
+
+it_export_entries Export::entries(void) {
+  return it_export_entries{std::ref(this->entries_)};
+}
+
+it_const_export_entries Export::entries(void) const {
+  return it_const_export_entries{std::cref(this->entries_)};
+}
+
+void Export::export_flags(uint32_t flags) {
+  this->exportFlags_ = flags;
+}
+
+void Export::timestamp(uint32_t timestamp) {
+  this->timestamp_ = timestamp;
+}
+
+void Export::major_version(uint16_t major_version) {
+  this->majorVersion_ = major_version;
+}
+
+void Export::minor_version(uint16_t minor_version) {
+  this->minorVersion_ = minor_version;
+}
+
+void Export::ordinal_base(uint32_t ordinal_base) {
+  this->ordinalBase_ = ordinal_base;
+}
+
+void Export::name(const std::string& name) {
+  this->name_ = name;
+}
+
+void Export::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->export_flags());
+  visitor.visit(this->timestamp());
+  visitor.visit(this->major_version());
+  visitor.visit(this->minor_version());
+  visitor.visit(this->ordinal_base());
+  visitor.visit(this->name());
+
+  for (const ExportEntry& entry : this->entries()) {
+    visitor(entry);
+  }
+}
+
+bool Export::operator==(const Export& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Export::operator!=(const Export& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const Export& exp) {
+
+  os << std::hex;
+  os << std::left;
+  os << exp.name() << std::endl;
+  for (const ExportEntry& entry : exp.entries()) {
+    os << "  " << entry << std::endl;
+  }
+  return os;
+}
+
+}
+}
diff --git a/src/PE/ExportEntry.cpp b/src/PE/ExportEntry.cpp
new file mode 100644
index 0000000..4399d36
--- /dev/null
+++ b/src/PE/ExportEntry.cpp
@@ -0,0 +1,103 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/PE/ExportEntry.hpp"
+
+namespace LIEF {
+namespace PE {
+ExportEntry::~ExportEntry(void) = default;
+ExportEntry::ExportEntry(const ExportEntry& copy) = default;
+ExportEntry& ExportEntry::operator=(const ExportEntry& copy) = default;
+
+ExportEntry::ExportEntry(void) :
+  name_{""},
+  ordinal_{0},
+  address_{0},
+  is_extern_{false}
+{}
+
+
+const std::string& ExportEntry::name(void) const {
+  return this->name_;
+}
+
+uint16_t ExportEntry::ordinal(void) const {
+  return this->ordinal_;
+}
+
+uint32_t ExportEntry::address(void) const {
+  return this->address_;
+}
+
+bool ExportEntry::is_extern(void) const {
+  return this->is_extern_;
+}
+
+void ExportEntry::name(const std::string& name) {
+  this->name_ = name;
+}
+
+void ExportEntry::ordinal(uint16_t ordinal) {
+  this->ordinal_ = ordinal;
+}
+
+void ExportEntry::address(uint32_t address) {
+  this->address_ = address;
+}
+
+void ExportEntry::is_extern(bool is_extern) {
+  this->is_extern_ = is_extern;
+}
+
+void ExportEntry::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->name());
+  visitor.visit(this->ordinal());
+  visitor.visit(this->address());
+  visitor.visit(this->is_extern());
+}
+
+bool ExportEntry::operator==(const ExportEntry& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool ExportEntry::operator!=(const ExportEntry& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const ExportEntry& export_entry) {
+  os << std::hex;
+  os << std::left;
+  std::string name = export_entry.name();
+  if (name.size() > 20) {
+    name = name.substr(0, 17) + "...";
+  }
+  os << std::setw(23) << name;
+  os << std::setw(5)  << export_entry.ordinal();
+
+  if (not export_entry.is_extern()) {
+    os << std::setw(10) << export_entry.address();
+  } else {
+    os << std::setw(10) << "[Extern]";
+  }
+  return os;
+}
+
+}
+}
diff --git a/src/PE/Header.cpp b/src/PE/Header.cpp
new file mode 100644
index 0000000..1c79f67
--- /dev/null
+++ b/src/PE/Header.cpp
@@ -0,0 +1,230 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <numeric>
+#include <iomanip>
+#include <sstream>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/EnumToString.hpp"
+#include "LIEF/PE/Header.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Header::~Header(void) = default;
+Header& Header::operator=(const Header& copy) = default;
+Header::Header(const Header& copy) = default;
+
+Header::Header(void) :
+  machine_{MACHINE_TYPES::IMAGE_FILE_MACHINE_UNKNOWN},
+  numberOfSections_{0},
+  timeDateStamp_{0},
+  pointerToSymbolTable_{0},
+  numberOfSymbols_{0},
+  sizeOfOptionalHeader_{0},
+  characteristics_{IMAGE_FILE_EXECUTABLE_IMAGE}
+{
+  std::copy(
+      std::begin(PE_Magic),
+      std::end(PE_Magic),
+      std::begin(this->signature_));
+}
+
+
+Header::Header(const pe_header *header) :
+  machine_(static_cast<MACHINE_TYPES>(header->Machine)),
+  numberOfSections_(header->NumberOfSections),
+  timeDateStamp_(header->TimeDateStamp),
+  pointerToSymbolTable_(header->PointerToSymbolTable),
+  numberOfSymbols_(header->NumberOfSymbols),
+  sizeOfOptionalHeader_(header->SizeOfOptionalHeader),
+  characteristics_(header->Characteristics)
+
+{
+  std::copy(
+      reinterpret_cast<const uint8_t*>(header->signature),
+      reinterpret_cast<const uint8_t*>(header->signature) + sizeof(PE_Magic),
+      std::begin(this->signature_));
+}
+
+const Header::signature_t& Header::signature(void) const {
+  return this->signature_;
+}
+
+
+MACHINE_TYPES Header::machine(void) const {
+  return this->machine_;
+}
+
+
+uint16_t Header::numberof_sections(void) const {
+  return this->numberOfSections_;
+}
+
+
+uint32_t Header::time_date_stamp(void) const {
+  return this->timeDateStamp_;
+}
+
+
+uint32_t Header::pointerto_symbol_table(void) const {
+  return this->pointerToSymbolTable_;
+}
+
+
+uint32_t Header::numberof_symbols(void) const {
+  return this->numberOfSymbols_;
+}
+
+
+uint16_t Header::sizeof_optional_header(void) const {
+  return this->sizeOfOptionalHeader_;
+}
+
+
+uint16_t Header::characteristics(void) const {
+  return this->characteristics_;
+}
+
+
+bool Header::has_characteristic(HEADER_CHARACTERISTICS c) const {
+  return this->characteristics_ & static_cast<uint16_t>(c);
+}
+
+
+std::set<HEADER_CHARACTERISTICS> Header::characteristics_list(void) const {
+
+  std::set<HEADER_CHARACTERISTICS> charac;
+  std::copy_if(
+      std::begin(header_characteristics_array),
+      std::end(header_characteristics_array),
+      std::inserter(charac, std::begin(charac)),
+      std::bind(&Header::has_characteristic, this, std::placeholders::_1));
+
+  return charac;
+}
+
+void Header::machine(MACHINE_TYPES type) {
+  this->machine_ = type;
+}
+
+
+void Header::numberof_sections(uint16_t nbOfSections) {
+  this->numberOfSections_ = nbOfSections;
+}
+
+
+void Header::time_date_stamp(uint32_t timestamp) {
+  this->timeDateStamp_ = timestamp;
+}
+
+
+void Header::pointerto_symbol_table(uint32_t pointerToSymbol) {
+  this->pointerToSymbolTable_ = pointerToSymbol;
+}
+
+
+void Header::numberof_symbols(uint32_t nbOfSymbols) {
+  this->numberOfSymbols_ = nbOfSymbols;
+}
+
+
+void Header::sizeof_optional_header(uint16_t sizeOfOptionalHdr) {
+  this->sizeOfOptionalHeader_ = sizeOfOptionalHdr;
+}
+
+
+void Header::characteristics(uint16_t characteristics) {
+  this->characteristics_ = characteristics;
+}
+
+
+void Header::add_characteristic(HEADER_CHARACTERISTICS c) {
+  this->characteristics_ |= static_cast<uint16_t>(c);
+}
+
+
+void Header::remove_characteristic(HEADER_CHARACTERISTICS c) {
+  this->characteristics_ &= ~static_cast<uint16_t>(c);
+}
+
+
+void Header::signature(const Header::signature_t& sig) {
+  std::copy(
+      std::begin(sig),
+      std::end(sig),
+      std::begin(this->signature_));
+}
+
+void Header::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->signature());
+  visitor.visit(this->machine());
+  visitor.visit(this->numberof_sections());
+  visitor.visit(this->time_date_stamp());
+  visitor.visit(this->pointerto_symbol_table());
+  visitor.visit(this->numberof_symbols());
+  visitor.visit(this->sizeof_optional_header());
+  visitor.visit(this->characteristics());
+}
+
+bool Header::operator==(const Header& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Header::operator!=(const Header& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const Header& entry) {
+
+
+  const Header::signature_t& signature = entry.signature();
+  std::stringstream ss;
+  ss << std::hex;
+  ss << static_cast<uint32_t>(signature[0]) << " ";
+  ss << static_cast<uint32_t>(signature[1]) << " ";
+  ss << static_cast<uint32_t>(signature[2]) << " ";
+  ss << static_cast<uint32_t>(signature[3]) << " ";
+  const std::string& signature_str = ss.str();
+
+  const auto& chara = entry.characteristics_list();
+
+  std::string chara_str = std::accumulate(
+     std::begin(chara),
+     std::end(chara), std::string{},
+     [] (const std::string& a, HEADER_CHARACTERISTICS b) {
+         return a.empty() ?
+         to_string(b) :
+         a + " - " + to_string(b);
+     });
+  os << std::hex;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Signature: "               << signature_str                               << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Machine: "                 << to_string(entry.machine_)       << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Number Of Sections: "      << entry.numberOfSections_                     << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Pointer To Symbol Table: " << entry.pointerToSymbolTable_                 << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Number Of Symbols: "       << entry.numberOfSymbols_                      << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Size Of Optional Header: " << entry.sizeOfOptionalHeader_                 << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Characteristics: "         << chara_str                                   << std::endl;
+  os << std::setw(30) << std::left << std::setfill(' ') << "Time Date Stamp: "         << entry.timeDateStamp_                        << std::endl;
+
+  return os;
+
+}
+}
+}
diff --git a/src/PE/Import.cpp b/src/PE/Import.cpp
new file mode 100644
index 0000000..b0ff8f3
--- /dev/null
+++ b/src/PE/Import.cpp
@@ -0,0 +1,279 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/Import.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Import::~Import(void) = default;
+
+Import::Import(const Import& other) :
+  Visitable{other},
+  entries_{other.entries_},
+  directory_{nullptr},
+  iat_directory_{nullptr},
+  import_lookup_table_RVA_{other.import_lookup_table_RVA_},
+  timedatestamp_{other.timedatestamp_},
+  forwarder_chain_{other.forwarder_chain_},
+  name_RVA_{other.name_RVA_},
+  import_address_table_RVA_{other.import_address_table_RVA_},
+  name_{other.name_},
+  type_{other.type_}
+{}
+
+
+Import& Import::operator=(Import other) {
+  this->swap(other);
+  return *this;
+}
+
+void Import::swap(Import& other) {
+  std::swap(this->entries_,                  other.entries_);
+  std::swap(this->directory_,                other.directory_);
+  std::swap(this->iat_directory_,            other.iat_directory_);
+  std::swap(this->import_lookup_table_RVA_,  other.import_lookup_table_RVA_);
+  std::swap(this->timedatestamp_,            other.timedatestamp_);
+  std::swap(this->forwarder_chain_,          other.forwarder_chain_);
+  std::swap(this->name_RVA_,                 other.name_RVA_);
+  std::swap(this->import_address_table_RVA_, other.import_address_table_RVA_);
+  std::swap(this->name_,                     other.name_);
+  std::swap(this->type_,                     other.type_);
+}
+
+Import::Import(void) :
+  entries_{},
+  directory_{nullptr},
+  iat_directory_{nullptr},
+  import_lookup_table_RVA_{0},
+  timedatestamp_{0},
+  forwarder_chain_{0},
+  name_RVA_{0},
+  import_address_table_RVA_{0},
+  name_{""},
+  type_{PE_TYPE::PE32} // Arbitrary value
+
+{}
+
+Import::Import(const pe_import *import) :
+  entries_{},
+  directory_{nullptr},
+  iat_directory_{nullptr},
+  import_lookup_table_RVA_(import->ImportLookupTableRVA),
+  timedatestamp_(import->TimeDateStamp),
+  forwarder_chain_(import->ForwarderChain),
+  name_RVA_(import->NameRVA),
+  import_address_table_RVA_(import->ImportAddressTableRVA),
+  name_{""},
+  type_{PE_TYPE::PE32} // Arbitrary value
+{}
+
+
+Import::Import(const std::string& name) :
+  entries_{},
+  directory_{nullptr},
+  iat_directory_{nullptr},
+  import_lookup_table_RVA_{0},
+  timedatestamp_{0},
+  forwarder_chain_{0},
+  name_RVA_{0},
+  import_address_table_RVA_{0},
+  name_{name},
+  type_{PE_TYPE::PE32} // Arbitrary value
+{}
+
+
+const ImportEntry& Import::get_entry(const std::string& name) const {
+  auto&& it_entry = std::find_if(
+      std::begin(this->entries_),
+      std::end(this->entries_),
+      [&name] (const ImportEntry& entry) {
+        return entry.name() == name;
+      });
+  if (it_entry == std::end(this->entries_)) {
+    throw LIEF::not_found("Unable to find the entry '" + name + "'.");
+  }
+  return *it_entry;
+}
+
+ImportEntry& Import::get_entry(const std::string& name) {
+  return const_cast<ImportEntry&>(static_cast<const Import*>(this)->get_entry(name));
+}
+
+it_import_entries Import::entries(void) {
+  return {this->entries_};
+}
+
+
+it_const_import_entries Import::entries(void) const {
+  return {this->entries_};
+}
+
+
+uint32_t Import::import_address_table_rva(void) const {
+  return this->import_address_table_RVA_;
+}
+
+
+uint32_t Import::import_lookup_table_rva(void) const {
+  return this->import_lookup_table_RVA_;
+}
+
+
+uint32_t Import::get_function_rva_from_iat(const std::string& function) const {
+  auto&& it_function = std::find_if(
+      std::begin(this->entries_),
+      std::end(this->entries_),
+      [&function] (const ImportEntry& entry)
+      {
+        return entry.name() == function;
+      });
+
+  if (it_function == std::end(this->entries_)) {
+    throw LIEF::not_found("No such function ('" + function + "')");
+  }
+
+  // Index of the function in the imported functions
+  uint32_t idx = std::distance(std::begin(this->entries_), it_function);
+
+  if (this->type_ == PE_TYPE::PE32) {
+    return idx * sizeof(uint32_t);
+  } else {
+    return idx * sizeof(uint64_t);
+  }
+}
+
+
+const std::string& Import::name(void) const {
+  return this->name_;
+}
+
+std::string& Import::name(void) {
+  return const_cast<std::string&>(static_cast<const Import*>(this)->name());
+}
+
+
+const DataDirectory& Import::directory(void) const {
+  if (this->directory_ != nullptr) {
+    return *this->directory_;
+  } else {
+    throw not_found("Unable to find the Data Directory");
+  }
+}
+
+DataDirectory& Import::directory(void) {
+  return const_cast<DataDirectory&>(static_cast<const Import*>(this)->directory());
+}
+
+
+const DataDirectory& Import::iat_directory(void) const {
+  if (this->iat_directory_ != nullptr) {
+    return *this->iat_directory_;
+  } else {
+    throw not_found("Unable to find the IAT Data Directory");
+  }
+}
+
+DataDirectory& Import::iat_directory(void) {
+  return const_cast<DataDirectory&>(static_cast<const Import*>(this)->iat_directory());
+}
+
+
+void Import::import_lookup_table_rva(uint32_t rva) {
+  this->import_lookup_table_RVA_ = rva;
+}
+
+
+void Import::import_address_table_rva(uint32_t rva) {
+  this->import_address_table_RVA_ = rva;
+}
+
+ImportEntry& Import::add_entry(const ImportEntry& entry) {
+  this->entries_.push_back(entry);
+  return this->entries_.back();
+}
+
+
+ImportEntry& Import::add_entry(const std::string& name) {
+  this->entries_.emplace_back(name);
+  return this->entries_.back();
+}
+
+uint32_t Import::forwarder_chain(void) const {
+  return this->forwarder_chain_;
+}
+
+uint32_t Import::timedatestamp(void) const {
+  return this->timedatestamp_;
+}
+
+void Import::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->forwarder_chain());
+  visitor.visit(this->timedatestamp());
+  visitor.visit(this->import_address_table_rva());
+  visitor.visit(this->import_lookup_table_rva());
+  visitor.visit(this->name());
+
+  try {
+    visitor(this->directory());
+  } catch (const not_found&) {
+  }
+
+
+  try {
+    visitor(this->iat_directory());
+  } catch (const not_found&) {
+  }
+
+
+  for (const ImportEntry& entry : this->entries()) {
+    visitor(entry);
+  }
+}
+
+bool Import::operator==(const Import& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Import::operator!=(const Import& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const Import& entry) {
+  os << std::hex;
+  os << std::left
+     << std::setw(20) << entry.name()
+     << std::setw(10) << entry.import_lookup_table_rva()
+     << std::setw(10) << entry.import_address_table_rva()
+     << std::setw(10) << entry.forwarder_chain()
+     << std::setw(10) << entry.timedatestamp()
+     << std::endl;
+
+  for (const ImportEntry& functions: entry.entries()) {
+    os << "\t - " << functions << std::endl;
+  }
+
+  return os;
+}
+}
+}
diff --git a/src/PE/ImportEntry.cpp b/src/PE/ImportEntry.cpp
new file mode 100644
index 0000000..016c23e
--- /dev/null
+++ b/src/PE/ImportEntry.cpp
@@ -0,0 +1,138 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/ImportEntry.hpp"
+
+
+namespace LIEF {
+namespace PE {
+ImportEntry::ImportEntry(const ImportEntry&) = default;
+ImportEntry& ImportEntry::operator=(const ImportEntry&) = default;
+ImportEntry::~ImportEntry(void) = default;
+
+ImportEntry::ImportEntry(void) :
+  data_{0},
+  name_{""},
+  hint_{0},
+  iat_value_{0},
+  rva_{0},
+  type_{PE_TYPE::PE32}
+{}
+
+ImportEntry::ImportEntry(uint64_t data, const std::string& name) :
+  data_{data},
+  name_{name},
+  hint_{0},
+  iat_value_{0},
+  rva_{0},
+  type_{PE_TYPE::PE32}
+{}
+
+
+ImportEntry::ImportEntry(const std::string& name) :
+  ImportEntry{0, name}
+{}
+
+bool ImportEntry::is_ordinal(void) const {
+  if (this->type_ == PE_TYPE::PE32) {
+    return this->data_ & 0x80000000;
+  } else {
+    return this->data_ & 0x8000000000000000;
+  }
+}
+
+uint16_t ImportEntry::ordinal(void) const {
+  if (not this->is_ordinal()) {
+    throw LIEF::not_found("This import is not ordinal");
+  }
+
+  return this->data_ & 0xFFFF;
+}
+
+uint16_t ImportEntry::hint(void) const {
+  return this->hint_;
+}
+
+uint64_t ImportEntry::iat_value(void) const {
+  return this->iat_value_;
+}
+
+
+uint64_t ImportEntry::hint_name_rva(void) const {
+  return this->data();
+}
+
+const std::string& ImportEntry::name(void) const {
+  return this->name_;
+}
+
+uint64_t ImportEntry::data(void) const {
+  return this->data_;
+}
+
+uint64_t ImportEntry::iat_address(void) const {
+  return this->rva_;
+}
+
+void ImportEntry::name(const std::string& name) {
+  this->name_ = name;
+}
+
+void ImportEntry::data(uint64_t data) {
+  this->data_ = data;
+}
+
+
+void ImportEntry::accept(LIEF::Visitor& visitor) const {
+  if(this->is_ordinal()) {
+    visitor.visit(this->ordinal());
+  }
+  visitor.visit(this->hint_name_rva());
+  visitor.visit(this->hint());
+  visitor.visit(this->iat_value());
+  visitor.visit(this->name());
+  visitor.visit(this->data());
+}
+
+bool ImportEntry::operator==(const ImportEntry& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool ImportEntry::operator!=(const ImportEntry& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const ImportEntry& entry) {
+  os << std::hex;
+  os << std::left;
+  if (not entry.is_ordinal()) {
+    os << std::setw(33) << entry.name();
+  }
+  os << std::setw(20) << entry.data();
+  os << std::setw(20) << entry.iat_value();
+  os << std::setw(20) << entry.hint();
+  return os;
+}
+
+} // namespace PE
+} // namepsace LIEF
diff --git a/src/PE/OptionalHeader.cpp b/src/PE/OptionalHeader.cpp
new file mode 100644
index 0000000..c2341bf
--- /dev/null
+++ b/src/PE/OptionalHeader.cpp
@@ -0,0 +1,559 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdexcept>
+#include <iomanip>
+#include <functional>
+#include <algorithm>
+#include <numeric>
+#include <iterator>
+#include <string>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/utils.hpp"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/OptionalHeader.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+#include "LIEF/PE/utils.hpp"
+
+
+namespace LIEF {
+namespace PE {
+
+OptionalHeader::~OptionalHeader(void) = default;
+OptionalHeader& OptionalHeader::operator=(const OptionalHeader& copy) = default;
+OptionalHeader::OptionalHeader(const OptionalHeader& copy) = default;
+
+OptionalHeader::OptionalHeader(void) :
+  magic_{},
+  majorLinkerVersion_(9), // Arbitrary value
+  minorLinkerVersion_(0),
+  sizeOfCode_(0),
+  sizeOfInitializedData_(0),
+  sizeOfUninitializedData_(0),
+  addressOfEntryPoint_(0),
+  baseOfCode_(0),
+  baseOfData_(0),
+  imageBase_(0x00400000),
+  sectionAlignment_(0x1000),
+  fileAlignment_(0x200),
+  majorOperatingSystemVersion_(5), // Windows 2000
+  minorOperatingSystemVersion_(0),
+  majorImageVersion_(0),
+  minorImageVersion_(0),
+  majorSubsystemVersion_(5),
+  minorSubsystemVersion_(0),
+  win32VersionValue_(0),
+  sizeOfImage_(0),
+  sizeOfHeaders_(0),
+  checkSum_(0),
+  subsystem_(SUBSYSTEM::IMAGE_SUBSYSTEM_WINDOWS_CUI),
+  DLLCharacteristics_{},
+  sizeOfStackReserve_(0x200000),
+  sizeOfStackCommit_(0x1000),
+  sizeOfHeapReserve_(0x100000),
+  sizeOfHeapCommit_(0x1000),
+  loaderFlags_(0),
+  numberOfRvaAndSize_(DEFAULT_NUMBER_DATA_DIRECTORIES + 1)
+{
+  this->sizeOfHeaders_ = sizeof(pe_dos_header) + sizeof(pe_header);
+  this->sizeOfHeaders_ = LIEF::align(this->sizeOfHeaders_, this->fileAlignment_);
+}
+
+
+OptionalHeader::OptionalHeader(const pe32_optional_header *header):
+  magic_(static_cast<PE_TYPE>(header->Magic)),
+  majorLinkerVersion_(header->MajorLinkerVersion),
+  minorLinkerVersion_(header->MinorLinkerVersion),
+  sizeOfCode_(header->SizeOfCode),
+  sizeOfInitializedData_(header->SizeOfInitializedData),
+  sizeOfUninitializedData_(header->SizeOfUninitializedData),
+  addressOfEntryPoint_(header->AddressOfEntryPoint),
+  baseOfCode_(header->BaseOfCode),
+  baseOfData_(header->BaseOfData),
+  imageBase_(header->ImageBase),
+  sectionAlignment_(header->SectionAlignment),
+  fileAlignment_(header->FileAlignment),
+  majorOperatingSystemVersion_(header->MajorOperatingSystemVersion),
+  minorOperatingSystemVersion_(header->MinorOperatingSystemVersion),
+  majorImageVersion_(header->MajorImageVersion),
+  minorImageVersion_(header->MinorImageVersion),
+  majorSubsystemVersion_(header->MajorSubsystemVersion),
+  minorSubsystemVersion_(header->MinorSubsystemVersion),
+  win32VersionValue_(header->Win32VersionValue),
+  sizeOfImage_(header->SizeOfImage),
+  sizeOfHeaders_(header->SizeOfHeaders),
+  checkSum_(header->CheckSum),
+  subsystem_(static_cast<SUBSYSTEM>(header->Subsystem)),
+  DLLCharacteristics_(header->DLLCharacteristics),
+  sizeOfStackReserve_(header->SizeOfStackReserve),
+  sizeOfStackCommit_(header->SizeOfStackCommit),
+  sizeOfHeapReserve_(header->SizeOfHeapReserve),
+  sizeOfHeapCommit_(header->SizeOfHeapCommit),
+  loaderFlags_(header->LoaderFlags),
+  numberOfRvaAndSize_(header->NumberOfRvaAndSize)
+{}
+
+OptionalHeader::OptionalHeader(const pe64_optional_header *header):
+  magic_(static_cast<PE_TYPE>(header->Magic)),
+  majorLinkerVersion_(header->MajorLinkerVersion),
+  minorLinkerVersion_(header->MinorLinkerVersion),
+  sizeOfCode_(header->SizeOfCode),
+  sizeOfInitializedData_(header->SizeOfInitializedData),
+  sizeOfUninitializedData_(header->SizeOfUninitializedData),
+  addressOfEntryPoint_(header->AddressOfEntryPoint),
+  baseOfCode_(header->BaseOfCode),
+  baseOfData_(0), // Not in PE64
+  imageBase_(header->ImageBase),
+  sectionAlignment_(header->SectionAlignment),
+  fileAlignment_(header->FileAlignment),
+  majorOperatingSystemVersion_(header->MajorOperatingSystemVersion),
+  minorOperatingSystemVersion_(header->MinorOperatingSystemVersion),
+  majorImageVersion_(header->MajorImageVersion),
+  minorImageVersion_(header->MinorImageVersion),
+  majorSubsystemVersion_(header->MajorSubsystemVersion),
+  minorSubsystemVersion_(header->MinorSubsystemVersion),
+  win32VersionValue_(header->Win32VersionValue),
+  sizeOfImage_(header->SizeOfImage),
+  sizeOfHeaders_(header->SizeOfHeaders),
+  checkSum_(header->CheckSum),
+  subsystem_(static_cast<SUBSYSTEM>(header->Subsystem)),
+  DLLCharacteristics_(header->DLLCharacteristics),
+  sizeOfStackReserve_(header->SizeOfStackReserve),
+  sizeOfStackCommit_(header->SizeOfStackCommit),
+  sizeOfHeapReserve_(header->SizeOfHeapReserve),
+  sizeOfHeapCommit_(header->SizeOfHeapCommit),
+  loaderFlags_(header->LoaderFlags),
+  numberOfRvaAndSize_(header->NumberOfRvaAndSize)
+{}
+
+PE_TYPE OptionalHeader::magic(void) const {
+  return this->magic_;
+}
+
+
+uint8_t OptionalHeader::major_linker_version(void) const {
+  return this->majorLinkerVersion_;
+}
+
+
+uint8_t OptionalHeader::minor_linker_version(void) const {
+  return this->minorLinkerVersion_;
+}
+
+
+uint32_t OptionalHeader::sizeof_code(void) const {
+  return this->sizeOfCode_;
+}
+
+
+uint32_t OptionalHeader::sizeof_initialized_data(void) const {
+  return this->sizeOfInitializedData_;
+}
+
+
+uint32_t OptionalHeader::sizeof_uninitialized_data(void) const {
+  return this->sizeOfUninitializedData_;
+}
+
+
+uint32_t OptionalHeader::addressof_entrypoint(void) const {
+  return this->addressOfEntryPoint_;
+}
+
+
+uint32_t OptionalHeader::baseof_code(void) const {
+  return this->baseOfCode_;
+}
+
+
+uint32_t OptionalHeader::baseof_data(void) const {
+  if (this->magic() == PE_TYPE::PE32) {
+    return this->baseOfData_;
+  } else {
+    throw LIEF::bad_format("There isn't this attribute in PE32+");
+  }
+}
+
+
+uint64_t OptionalHeader::imagebase(void) const {
+  return this->imageBase_;
+}
+
+
+uint32_t OptionalHeader::section_alignment(void) const {
+  return this->sectionAlignment_;
+}
+
+
+uint32_t OptionalHeader::file_alignment(void) const {
+  return this->fileAlignment_;
+}
+
+
+uint16_t OptionalHeader::major_operating_system_version(void) const {
+  return this->majorOperatingSystemVersion_;
+}
+
+
+uint16_t OptionalHeader::minor_operating_system_version(void) const {
+  return this->minorOperatingSystemVersion_;
+}
+
+
+uint16_t OptionalHeader::major_image_version(void) const {
+  return this->majorImageVersion_;
+}
+
+
+uint16_t OptionalHeader::minor_image_version(void) const {
+  return this->minorImageVersion_;
+}
+
+
+uint16_t OptionalHeader::major_subsystem_version(void) const {
+  return this->majorSubsystemVersion_;
+}
+
+
+uint16_t OptionalHeader::minor_subsystem_version(void) const {
+  return this->minorSubsystemVersion_;
+}
+
+
+uint32_t OptionalHeader::win32_version_value(void) const {
+  return this->win32VersionValue_;
+}
+
+
+uint32_t OptionalHeader::sizeof_image(void) const {
+  return this->sizeOfImage_;
+}
+
+
+uint32_t OptionalHeader::sizeof_headers(void) const {
+  return this->sizeOfHeaders_;
+}
+
+
+uint32_t OptionalHeader::checksum(void) const {
+  return this->checkSum_;
+}
+
+
+SUBSYSTEM OptionalHeader::subsystem(void) const {
+  return this->subsystem_;
+}
+
+
+uint32_t OptionalHeader::dll_characteristics(void) const {
+  return this->DLLCharacteristics_;
+}
+
+
+uint64_t OptionalHeader::sizeof_stack_reserve(void) const {
+  return this->sizeOfStackReserve_;
+}
+
+
+uint64_t OptionalHeader::sizeof_stack_commit(void) const {
+  return this->sizeOfStackCommit_;
+}
+
+
+uint64_t OptionalHeader::sizeof_heap_reserve(void) const {
+  return this->sizeOfHeapReserve_;
+}
+
+
+uint64_t OptionalHeader::sizeof_heap_commit(void) const {
+  return this->sizeOfHeapCommit_;
+}
+
+
+uint32_t OptionalHeader::loader_flags(void) const {
+  return this->loaderFlags_;
+}
+
+
+uint32_t OptionalHeader::numberof_rva_and_size(void) const {
+  return this->numberOfRvaAndSize_;
+}
+
+bool OptionalHeader::has_dll_characteristics(DLL_CHARACTERISTICS c) const {
+  return (this->DLLCharacteristics_ & static_cast<uint32_t>(c)) > 0;
+}
+
+std::set<DLL_CHARACTERISTICS> OptionalHeader::dll_characteristics_list(void) const {
+  std::set<DLL_CHARACTERISTICS> dll_charac;
+  std::copy_if(
+      std::begin(dll_characteristics_array),
+      std::end(dll_characteristics_array),
+      std::inserter(dll_charac, std::begin(dll_charac)),
+      std::bind(&OptionalHeader::has_dll_characteristics, this, std::placeholders::_1));
+
+  return dll_charac;
+}
+
+
+
+void OptionalHeader::magic(PE_TYPE magic) {
+  this->magic_ = static_cast<PE_TYPE>(magic);
+}
+
+
+void OptionalHeader::major_linker_version(uint8_t majorLinkerVersion) {
+  this->majorLinkerVersion_ = majorLinkerVersion;
+}
+
+
+void OptionalHeader::minor_linker_version(uint8_t minorLinkerVersion) {
+  this->minorLinkerVersion_ = minorLinkerVersion;
+}
+
+
+void OptionalHeader::sizeof_code(uint32_t sizeOfCode) {
+  this->sizeOfCode_ = sizeOfCode;
+}
+
+
+void OptionalHeader::sizeof_initialized_data(uint32_t sizeOfInitializedData) {
+  this->sizeOfInitializedData_ = sizeOfInitializedData;
+}
+
+
+void OptionalHeader::sizeof_uninitialized_data(uint32_t sizeOfUninitializedData) {
+  this->sizeOfUninitializedData_ = sizeOfUninitializedData;
+}
+
+
+void OptionalHeader::addressof_entrypoint(uint32_t addressOfEntryPoint) {
+  this->addressOfEntryPoint_ = addressOfEntryPoint;
+}
+
+
+void OptionalHeader::baseof_code(uint32_t baseOfCode) {
+  this->baseOfCode_ = baseOfCode;
+}
+
+
+void OptionalHeader::baseof_data(uint32_t baseOfData) {
+  if (this->magic() == PE_TYPE::PE32) {
+    this->baseOfData_ = baseOfData;
+  } else {
+    throw LIEF::bad_format("There isn't this attribute in PE32+");
+  }
+
+}
+
+
+void OptionalHeader::imagebase(uint64_t imageBase) {
+  this->imageBase_ = imageBase;
+}
+
+
+void OptionalHeader::section_alignment(uint32_t sectionAlignment) {
+  this->sectionAlignment_ = sectionAlignment;
+}
+
+
+void OptionalHeader::file_alignment(uint32_t fileAlignment) {
+  this->fileAlignment_ = fileAlignment;
+}
+
+
+void OptionalHeader::major_operating_system_version(uint16_t majorOperatingSystemVersion) {
+  this->majorOperatingSystemVersion_ = majorOperatingSystemVersion;
+}
+
+
+void OptionalHeader::minor_operating_system_version(uint16_t minorOperatingSystemVersion) {
+  this->minorOperatingSystemVersion_ = minorOperatingSystemVersion;
+}
+
+
+void OptionalHeader::major_image_version(uint16_t majorImageVersion) {
+  this->majorImageVersion_ = majorImageVersion;
+}
+
+
+void OptionalHeader::minor_image_version(uint16_t minorImageVersion) {
+  this->minorImageVersion_ = minorImageVersion;
+}
+
+
+void OptionalHeader::major_subsystem_version(uint16_t majorSubsystemVersion) {
+  this->majorSubsystemVersion_ = majorSubsystemVersion;
+}
+
+
+void OptionalHeader::minor_subsystem_version(uint16_t minorSubsystemVersion) {
+  this->minorSubsystemVersion_ = minorSubsystemVersion;
+}
+
+
+void OptionalHeader::win32_version_value(uint32_t win32VersionValue) {
+  this->win32VersionValue_ = win32VersionValue;
+}
+
+
+void OptionalHeader::sizeof_image(uint32_t sizeOfImage) {
+  this->sizeOfImage_ = sizeOfImage;
+}
+
+
+void OptionalHeader::sizeof_headers(uint32_t sizeOfHeaders) {
+  this->sizeOfHeaders_ = sizeOfHeaders;
+}
+
+
+void OptionalHeader::checksum(uint32_t checkSum) {
+  this->checkSum_ = checkSum;
+}
+
+
+void OptionalHeader::subsystem(SUBSYSTEM subsystem) {
+  this->subsystem_ = subsystem;
+}
+
+
+void OptionalHeader::dll_characteristics(uint32_t DLLCharacteristics) {
+  this->DLLCharacteristics_ = DLLCharacteristics;
+}
+
+
+void OptionalHeader::sizeof_stack_reserve(uint64_t sizeOfStackReserve) {
+  this->sizeOfStackReserve_ = sizeOfStackReserve;
+}
+
+
+void OptionalHeader::sizeof_stack_commit(uint64_t sizeOfStackCommit) {
+  this->sizeOfStackCommit_ = sizeOfStackCommit;
+}
+
+
+void OptionalHeader::sizeof_heap_reserve(uint64_t sizeOfHeapReserve) {
+  this->sizeOfHeapReserve_ = sizeOfHeapReserve;
+}
+
+
+void OptionalHeader::sizeof_heap_commit(uint64_t sizeOfHeapCommit) {
+  this->sizeOfHeapCommit_ = sizeOfHeapCommit;
+}
+
+
+void OptionalHeader::loader_flags(uint32_t loaderFlags) {
+  this->loaderFlags_ = loaderFlags;
+}
+
+
+void OptionalHeader::numberof_rva_and_size(uint32_t numberOfRvaAndSize) {
+  this->numberOfRvaAndSize_ = numberOfRvaAndSize;
+}
+
+void OptionalHeader::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(static_cast<uint8_t>(this->magic()));
+  visitor.visit(this->major_linker_version());
+  visitor.visit(this->minor_linker_version());
+  visitor.visit(this->sizeof_code());
+  visitor.visit(this->sizeof_initialized_data());
+  visitor.visit(this->sizeof_uninitialized_data());
+  visitor.visit(this->addressof_entrypoint());
+  visitor.visit(this->baseof_code());
+  if (this->magic() == PE_TYPE::PE32) {
+    visitor.visit(this->baseof_data());
+  }
+  visitor.visit(this->imagebase());
+  visitor.visit(this->section_alignment());
+  visitor.visit(this->file_alignment());
+  visitor.visit(this->major_operating_system_version());
+  visitor.visit(this->minor_operating_system_version());
+  visitor.visit(this->major_image_version());
+  visitor.visit(this->minor_image_version());
+  visitor.visit(this->major_subsystem_version());
+  visitor.visit(this->minor_subsystem_version());
+  visitor.visit(this->win32_version_value());
+  visitor.visit(this->sizeof_image());
+  visitor.visit(this->sizeof_headers());
+  visitor.visit(this->checksum());
+  visitor.visit(this->subsystem());
+  visitor.visit(this->dll_characteristics());
+  visitor.visit(this->sizeof_stack_reserve());
+  visitor.visit(this->sizeof_stack_commit());
+  visitor.visit(this->sizeof_heap_reserve());
+  visitor.visit(this->sizeof_heap_commit());
+  visitor.visit(this->loader_flags());
+  visitor.visit(this->numberof_rva_and_size());
+}
+
+bool OptionalHeader::operator==(const OptionalHeader& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool OptionalHeader::operator!=(const OptionalHeader& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const OptionalHeader& entry) {
+  const auto& dll_chara = entry.dll_characteristics_list();
+
+  std::string dll_chara_str = std::accumulate(
+     std::begin(dll_chara),
+     std::end(dll_chara), std::string{},
+     [] (const std::string& a, DLL_CHARACTERISTICS b) {
+         return a.empty() ? std::string("\n- ") + to_string(b) : a + "\n- " + to_string(b);
+     });
+
+  os << std::hex;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Magic: "                          << static_cast<uint32_t>(entry.magic_)                                     << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Major Linker Version: "           << static_cast<uint32_t>(entry.majorLinkerVersion_) << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Minor Linker Version: "           << static_cast<uint32_t>(entry.minorLinkerVersion_) << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Code: "                   << entry.sizeOfCode_                                << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Initialized Data: "       << entry.sizeOfInitializedData_                     << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Uninitialized Data: "     << entry.sizeOfUninitializedData_                   << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Address Of Entry Point: "         << entry.addressOfEntryPoint_                       << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Base Of Code: "                   << entry.baseOfCode_                                << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Base Of Data: "                   << entry.baseOfData_                                << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Image Base: "                     << entry.imageBase_                                 << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Section Alignment: "              << entry.sectionAlignment_                          << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "File Alignment: "                 << entry.fileAlignment_                             << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Major Operating System Version: " << entry.majorOperatingSystemVersion_               << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Minor Operating System Version: " << entry.minorOperatingSystemVersion_               << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Major Image Version: "            << entry.majorImageVersion_                         << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Minor Image Version: "            << entry.minorImageVersion_                         << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Major Subsystem Version: "        << entry.majorSubsystemVersion_                     << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Minor Subsystem Version: "        << entry.minorSubsystemVersion_                     << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Win32 Version Value: "            << entry.win32VersionValue_                         << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Image: "                  << entry.sizeOfImage_                               << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Headers: "                << entry.sizeOfHeaders_                             << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "CheckSum: "                       << entry.checkSum_                                  << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Subsystem: "                      << to_string(entry.subsystem_)          << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "DLL Characteristics: "            << dll_chara_str                                    << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Stack Reserve: "          << entry.sizeOfStackReserve_                        << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Stack Commit: "           << entry.sizeOfStackCommit_                         << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Heap Reserve: "           << entry.sizeOfHeapReserve_                         << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Size Of Heap Commit: "            << entry.sizeOfHeapCommit_                          << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Loader Flags: "                   << entry.loaderFlags_                               << std::endl;
+  os << std::setw(33) << std::left << std::setfill(' ') << "Number Of RVA And Size: "         << entry.numberOfRvaAndSize_                        << std::endl;
+
+  return os;
+}
+
+}
+}
diff --git a/src/PE/Parser.cpp b/src/PE/Parser.cpp
new file mode 100644
index 0000000..9db2b15
--- /dev/null
+++ b/src/PE/Parser.cpp
@@ -0,0 +1,1036 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <fstream>
+#include <iterator>
+#include <iostream>
+#include <string>
+
+#include <mbedtls/platform.h>
+#include <mbedtls/oid.h>
+#include <mbedtls/x509_crt.h>
+
+#include "easylogging++.h"
+
+#include "LIEF/filesystem/filesystem.h"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/BinaryStream/VectorStream.hpp"
+
+#include "LIEF/PE/signature/Signature.hpp"
+
+#include "LIEF/PE/Parser.hpp"
+#include "Parser.tcc"
+
+#include "LIEF/PE/utils.hpp"
+
+#include "pkcs7.h"
+
+namespace LIEF {
+namespace PE {
+
+Parser::~Parser(void) = default;
+Parser::Parser(void) = default;
+
+//
+// CTOR
+//
+Parser::Parser(const std::string& file) :
+  LIEF::Parser{file}
+{
+
+  if (not is_pe(file)) {
+    throw LIEF::bad_format("'" + file + "' is not an PE");
+  }
+
+  // Read from file
+  this->stream_ = std::unique_ptr<VectorStream>(new VectorStream{file});
+  this->init(filesystem::path(file).filename());
+}
+
+Parser::Parser(const std::vector<uint8_t>& data, const std::string& name) :
+  stream_{std::unique_ptr<VectorStream>(new VectorStream{data})}
+{
+  this->init(name);
+}
+
+
+void Parser::init(const std::string& name) {
+
+  this->type_   = get_type(this->stream_->content());
+  this->binary_ = new Binary{};
+  this->binary_->name(name);
+  this->binary_->type_ = this->type_;
+
+  if (this->type_ == PE_TYPE::PE32) {
+    this->build<PE32>();
+  } else {
+    this->build<PE64>();
+  }
+
+}
+
+
+
+
+
+//
+// Build PE sections
+//
+// TODO: Check offset etc
+void Parser::build_sections(void) {
+
+  LOG(DEBUG) << "[+] Parsing sections";
+
+  const uint32_t sections_offset  =
+    this->binary_->dos_header().addressof_new_exeheader() +
+    sizeof(pe_header) +
+    this->binary_->header().sizeof_optional_header();
+
+  const uint32_t numberof_sections = this->binary_->header().numberof_sections();
+  const pe_section* sections = [&]() {
+    try {
+      return reinterpret_cast<const pe_section*>(
+        this->stream_->read(sections_offset, numberof_sections * sizeof(pe_section)));
+    } catch (const read_out_of_bound&) {
+      throw corrupted("Sections corrupted");
+    }
+  }();
+
+  for (size_t i = 0; i < numberof_sections; ++i) {
+    Section* section = new Section{&sections[i]};
+
+    try {
+      const uint8_t* ptr_to_rawdata = reinterpret_cast<const uint8_t*>(this->stream_->read(
+        sections[i].PointerToRawData,
+        sections[i].SizeOfRawData));
+
+      section->content_ = {
+        ptr_to_rawdata,
+        ptr_to_rawdata + sections[i].SizeOfRawData
+      };
+
+      this->binary_->sections_.push_back(section);
+    } catch (const std::bad_alloc& e) {
+      LOG(WARNING) << "Section " << section->name() << " corrupted: " << e.what();
+      delete section;
+    } catch (const read_out_of_bound& e) {
+      LOG(WARNING) << "Section " << section->name() << " corrupted: " << e.what();
+      delete section;
+    }
+  }
+}
+
+
+//
+// Build relocations
+//
+void Parser::build_relocations(void) {
+  LOG(DEBUG) << "[+] Parsing relocations";
+
+  this->binary_->has_relocations_ = true;
+
+  const uint32_t offset = this->binary_->rva_to_offset(
+      this->binary_->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).RVA());
+
+  const uint32_t max_size = this->binary_->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).size();
+  const uint32_t max_offset = offset + max_size;
+
+  const pe_base_relocation_block* relocation_headers = reinterpret_cast<const pe_base_relocation_block*>(
+      this->stream_->read(offset, sizeof(pe_base_relocation_block)));
+
+
+  uint32_t current_offset = offset;
+  while (current_offset < max_offset and relocation_headers->PageRVA != 0) {
+    Relocation relocation{relocation_headers};
+
+    if (relocation_headers->BlockSize > this->binary_->optional_header().sizeof_image()) {
+      throw corrupted("Relocation corrupted: BlockSize is out of bound the binary's virtual size");
+    }
+
+    const uint32_t numberof_entries = (relocation_headers->BlockSize - sizeof(pe_base_relocation_block)) / sizeof(uint16_t);
+    const uint16_t* entries = reinterpret_cast<const uint16_t*>(reinterpret_cast<const uint8_t*>(relocation_headers) + sizeof(pe_base_relocation_block));
+    for (size_t i = 0; i < numberof_entries; ++i) {
+      relocation.entries_.emplace_back(entries[i]);
+    }
+
+    this->binary_->relocations_.push_back(relocation);
+
+    current_offset += relocation_headers->BlockSize;
+
+    relocation_headers = reinterpret_cast<const pe_base_relocation_block*>(
+      this->stream_->read(current_offset, sizeof(pe_base_relocation_block)));
+  }
+}
+
+
+//
+// Build ressources
+//
+void Parser::build_resources(void) {
+  LOG(DEBUG) << "[+] Parsing resources";
+
+  this->binary_->has_resources_ = true;
+
+  const uint32_t resources_rva = this->binary_->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).RVA();
+  LOG(DEBUG) << "Resources RVA: 0x" << std::hex << resources_rva;
+  const uint32_t offset = this->binary_->rva_to_offset(resources_rva);
+  LOG(DEBUG) << "Resources Offset: 0x" << std::hex << offset;
+
+  const pe_resource_directory_table* directoryTable = reinterpret_cast<const pe_resource_directory_table*>(
+      this->stream_->read(offset, sizeof(pe_resource_directory_table)));
+
+  this->binary_->resources_ = this->build_resource_node(directoryTable, offset);
+}
+
+
+//
+// Build the resources tree
+//
+ResourceNode* Parser::build_resource_node(
+    const pe_resource_directory_table *directoryTable,
+    uint32_t baseOffset) {
+
+  const uint32_t numberOfIDEntries   = directoryTable->NumberOfIDEntries;
+  const uint32_t numberOfNameEntries = directoryTable->NumberOfNameEntries;
+
+  const auto *entriesArray = reinterpret_cast<const pe_resource_directory_entries*>(directoryTable + 1);
+
+  ResourceDirectory* directory = new ResourceDirectory{directoryTable};
+
+  for (uint32_t idx = 0; idx < (numberOfNameEntries + numberOfIDEntries); ++idx) {
+
+    uint32_t rvaToData = entriesArray[idx].RVA;
+    uint32_t id        = entriesArray[idx].NameID.IntegerID;
+    std::u16string name;
+
+    if (id & 0x80000000) {
+      uint32_t offset = id & (~ 0x80000000);
+      uint32_t string_offset = baseOffset + offset;
+      try {
+        const uint16_t length = *reinterpret_cast<const uint16_t*>(
+            this->stream_->read(string_offset, sizeof(uint16_t)));
+
+        if (length > 100) {
+          LOG(DEBUG) << "Size: " << std::dec << length;
+          throw LIEF::corrupted("Size error");
+        }
+        name = std::u16string{reinterpret_cast<const char16_t*>(
+            this->stream_->read(
+              baseOffset + offset + sizeof(uint16_t),
+              length * sizeof(uint16_t))),
+             length};
+      } catch (const LIEF::read_out_of_bound&) {
+        LOG(WARNING) << "Resource name is corrupted";
+      }
+    }
+
+    if ((0x80000000 & rvaToData) == 0) { // We are on a leaf
+      uint32_t offset = baseOffset + rvaToData;
+      try {
+        const auto *dataEntry = reinterpret_cast<const pe_resource_data_entry*>(
+            this->stream_->read(offset, sizeof(pe_resource_data_entry)));
+
+        uint32_t offsetToContent = this->binary_->rva_to_offset(dataEntry->DataRVA);
+        uint32_t sizeOfContent   = dataEntry->Size;
+        uint32_t codePage        = dataEntry->Codepage;
+        const uint8_t* content_ptr = reinterpret_cast<const uint8_t*>(
+            this->stream_->read(offsetToContent, sizeOfContent));
+        std::vector<uint8_t> content = {
+          content_ptr,
+          content_ptr + sizeOfContent};
+        ResourceNode* node = new ResourceData{content, codePage};
+        node->id_   = id;
+        node->name_ = name;
+        directory->add_child(node);
+      } catch (const LIEF::read_out_of_bound&) { // Corrupted
+        LOG(WARNING) << "The leaf is corrupted";
+        break;
+      }
+    } else { // We are on a directory
+      uint32_t rvaToDirectory = rvaToData & (~ 0x80000000);
+      uint32_t offset = baseOffset + rvaToDirectory;
+      try {
+        const auto* nextDirectoryTable = reinterpret_cast<const pe_resource_directory_table*>(
+            this->stream_->read(offset, sizeof(pe_resource_directory_table)));
+
+        ResourceNode* node = this->build_resource_node(nextDirectoryTable, baseOffset);
+        node->id_   = id;
+        node->name_ = name;
+        directory->add_child(node);
+      } catch (const LIEF::read_out_of_bound&) { // Corrupted
+        LOG(WARNING) << "The directory is corrupted";
+        break;
+      }
+    }
+  }
+
+  return std::move(directory);
+}
+
+//
+// Build string table
+//
+void Parser::build_string_table(void) {
+  LOG(DEBUG) << "[+] Parsing string table";
+  uint32_t stringTableOffset =
+    this->binary_->header().pointerto_symbol_table() +
+    this->binary_->header().numberof_symbols() * STRUCT_SIZES::Symbol16Size;
+
+  uint32_t size = *reinterpret_cast<const uint32_t*>(
+      this->stream_->read(stringTableOffset, sizeof(uint32_t))) - 4;
+
+  uint32_t currentSize = 0;
+
+  const char *table = this->stream_->read_string(stringTableOffset + 4);
+
+  while (currentSize < size) {
+    std::string name{table + currentSize};
+    currentSize += name.size() + 1;
+    this->binary_->strings_table_.push_back(name);
+  }
+}
+
+
+//
+// Build Symbols
+//
+void Parser::build_symbols(void) {
+  LOG(DEBUG) << "[+] Parsing symbols";
+  uint32_t symbolTableOffset = this->binary_->header().pointerto_symbol_table();
+  uint32_t numberOfSymbols   = this->binary_->header().numberof_symbols();
+  uint32_t offsetToNextSymbol = symbolTableOffset;
+
+  uint32_t idx = 0;
+  while (idx < numberOfSymbols) {
+    //if (offsetToNextSymbol >= this->rawBinary_.size()) {
+    //  throw LIEF::exception("Parser::build_symbols(): Symbol offset corrupted",
+    //      LIEF::EXCEPTION_TYPES::CORRUPTED_OFFSET);
+    //}
+    //TODO: try catch
+    pe_symbol *symbolPtr;
+    try {
+      symbolPtr = reinterpret_cast<pe_symbol*>(const_cast<void*>(
+        this->stream_->read(offsetToNextSymbol, sizeof(pe_symbol))));
+
+    } catch (const LIEF::read_out_of_bound&) { // Corrupted
+      LOG(WARNING) << "Symbol is corrupted (idx: " << std::dec << idx << ")";
+      break;
+    }
+
+
+    Symbol symbol{reinterpret_cast<const pe_symbol*>(symbolPtr)};
+
+    std::string name;
+    if ((symbolPtr->Name.Name.Zeroes & 0xffff) != 0) {
+      name = symbolPtr->Name.ShortName;
+    } else {
+      uint32_t offset = symbolPtr->Name.Name.Offset;
+      uint64_t offset_name =
+        this->binary_->header().pointerto_symbol_table() +
+        this->binary_->header().numberof_symbols() * STRUCT_SIZES::Symbol16Size +
+        offset;
+      try {
+        symbol.name_ = this->stream_->read_string(offset_name);
+      } catch (const LIEF::read_out_of_bound&) { // Corrupted
+        LOG(WARNING) << "Symbol name is corrupted";
+      }
+    }
+    if (symbol.section_number() > 0 and
+        static_cast<uint32_t>(symbol.section_number()) < this->binary_->sections_.size()) {
+      symbol.section_ = this->binary_->sections_[symbol.section_number()];
+    }
+
+    for (uint32_t i = 0; i < symbolPtr->NumberOfAuxSymbols; ++i) {
+      // Auxiliary Format 1: Function Definitions
+      // * Storage class : EXTERNAL
+      // * Type          : 0x20 (Function)
+      // * Section Number: > 0
+      if (symbol.storage_class() == IMAGE_SYM_CLASS_EXTERNAL and
+          symbol.type() == 0x20 and symbol.section_number() > 0) {
+        LOG(DEBUG) << "Format1";
+      }
+
+
+      // Auxiliary Format 2: .bf and .ef Symbols
+      // * Storage class : FUNCTION
+      if (symbol.storage_class() == IMAGE_SYM_CLASS_FUNCTION) {
+        LOG(DEBUG) << "Function";
+      }
+
+      // Auxiliary Format 3: Weak Externals
+      // * Storage class : EXTERNAL
+      // * Section Number: UNDEF
+      // * Value         : 0
+      if (symbol.storage_class() == IMAGE_SYM_CLASS_EXTERNAL and
+          symbol.value() == 0 and symbol.section_number() == IMAGE_SYM_UNDEFINED) {
+        LOG(DEBUG) << "Format 3";
+      }
+
+      // Auxiliary Format 4: Files
+      // * Storage class     : FILE
+      // * Name **SHOULD** be: .file
+      if (symbol.storage_class() == IMAGE_SYM_CLASS_FILE) {
+        LOG(DEBUG) << "Format 4";
+        //std::cout << reinterpret_cast<char*>(
+      }
+
+      // Auxiliary Format 5: Section Definitions
+      // * Storage class     : STATIC
+      if (symbol.storage_class() == IMAGE_SYM_CLASS_STATIC) {
+        LOG(DEBUG) << "Format 5";
+      }
+
+      offsetToNextSymbol += STRUCT_SIZES::Symbol16Size;
+    }
+
+    offsetToNextSymbol += STRUCT_SIZES::Symbol16Size;
+    idx += 1 + symbolPtr->NumberOfAuxSymbols;
+    this->binary_->symbols_.push_back(std::move(symbol));
+  }
+
+
+}
+
+
+//
+// Build Debug
+//
+
+void Parser::build_debug(void) {
+  LOG(DEBUG) << "[+] Parsing Debug";
+
+  this->binary_->has_debug_ = true;
+
+  uint32_t debugRVA    = this->binary_->data_directory(DATA_DIRECTORY::DEBUG).RVA();
+  uint32_t debugoffset = this->binary_->rva_to_offset(debugRVA);
+  //uint32_t debugsize   = this->binary_->dataDirectories_[DATA_DIRECTORY::DEBUG]->size();
+
+  const pe_debug* debug_struct = reinterpret_cast<const pe_debug*>(
+      this->stream_->read(debugoffset, sizeof(pe_debug)));
+
+  this->binary_->debug_ = {debug_struct};
+}
+
+//
+// Build configuration
+//
+void Parser::build_configuration(void) {
+  LOG(DEBUG) << "[+] Parsing Load config";
+  this->binary_->has_configuration_ = true;
+  //uint32_t offset = rva_to_offset(this->binary_->sectionsList_, this->binary_->dataDirList_[LOAD_CONFIG_TABLE].getRVA());
+  //this->binary_->loadConfigure_ = *(reinterpret_cast<LoadConfiguration<uint32_t>*>(this->rawBinary_.data() + offset));
+}
+
+
+//
+// Build Export
+//
+void Parser::build_exports(void) {
+  LOG(DEBUG) << "[+] Parsing exports";
+
+  this->binary_->has_exports_ = true;
+
+  uint32_t exportsRVA    = this->binary_->data_directory(DATA_DIRECTORY::EXPORT_TABLE).RVA();
+  uint32_t exportsOffset = this->binary_->rva_to_offset(exportsRVA);
+  uint32_t exportsSize   = this->binary_->data_directory(DATA_DIRECTORY::EXPORT_TABLE).size();
+  std::pair<uint32_t, uint32_t> range = {exportsOffset, exportsOffset + exportsSize};
+
+  // First Export directory
+  const auto* exportDirectoryTable = reinterpret_cast<const pe_export_directory_table*>(
+      this->stream_->read(exportsOffset, sizeof(pe_export_directory_table)));
+
+  Export exportObject = {exportDirectoryTable};
+  uint32_t nameOffset = this->binary_->rva_to_offset(exportDirectoryTable->NameRVA);
+
+  try {
+    exportObject.name_  = this->stream_->read_string(nameOffset);
+  } catch (const LIEF::read_out_of_bound& e) {
+    LOG(WARNING) << e.what();
+    //TODO
+  }
+
+
+  // Parse ordinal name table
+  uint32_t ordinalNameTableOffset  = this->binary_->rva_to_offset(exportDirectoryTable->OrdinalTableRVA);
+  const uint32_t nbof_name_ptr = exportDirectoryTable->NumberOfNamePointers;
+  const uint16_t *ordinalTable     = reinterpret_cast<const uint16_t*>(
+      this->stream_->read(ordinalNameTableOffset, nbof_name_ptr * sizeof(uint16_t)));
+
+
+  // Parse Address table
+  uint32_t offsetExportTableAddress = this->binary_->rva_to_offset(
+      exportDirectoryTable->ExportAddressTableRVA);
+  const uint32_t nbof_addr_entries = exportDirectoryTable->AddressTableEntries;
+  const uint32_t *addressTable = reinterpret_cast<const uint32_t*>(
+      this->stream_->read(offsetExportTableAddress, nbof_addr_entries * sizeof(uint32_t)));
+
+  for (size_t i = 0; i < nbof_addr_entries; ++i) {
+    const uint32_t value = addressTable[i];
+    // If value is inside export directory => 'external' function
+    if (value >= range.first and value < range.second) {
+      uint32_t nameOffset = this->binary_->rva_to_offset(value);
+
+      ExportEntry entry;
+      try {
+        entry.name_   = this->stream_->read_string(nameOffset);
+      } catch (const LIEF::read_out_of_bound& e) {
+        LOG(WARNING) << e.what();
+      }
+
+      entry.is_extern_ = true;
+      entry.address_  = 0;
+      entry.ordinal_  = i + exportDirectoryTable->OrdinalBase;
+      exportObject.entries_.push_back(std::move(entry));
+
+    }
+  }
+
+  // Parse export name table
+  uint32_t offsetToNamePointer = this->binary_->rva_to_offset(exportDirectoryTable->NamePointerRVA);
+  const uint32_t *pointerName  = reinterpret_cast<const uint32_t*>(
+      this->stream_->read(offsetToNamePointer, nbof_name_ptr * sizeof(uint32_t)));
+
+  for (size_t i = 0; i < nbof_name_ptr; ++i) {
+    uint32_t nameOffset = this->binary_->rva_to_offset(pointerName[i]);
+    std::string name  = "";
+    try {
+      name = this->stream_->read_string(nameOffset);
+    } catch (const LIEF::read_out_of_bound& e) {
+      LOG(WARNING) << e.what();
+    }
+
+    ExportEntry entry;
+    entry.name_     = name;
+    entry.is_extern_ = false;
+    entry.ordinal_  = ordinalTable[i] + exportDirectoryTable->OrdinalBase;
+    entry.address_  = addressTable[ordinalTable[i]];
+    exportObject.entries_.push_back(std::move(entry));
+  }
+
+  this->binary_->export_ = std::move(exportObject);
+
+}
+
+void Parser::build_signature(void) {
+  LOG(DEBUG) << "[+] Parsing signature";
+
+  /*** /!\ In this data directory, RVA is used as an **OFFSET** /!\ ****/
+  /*********************************************************************/
+  const uint32_t signature_offset  = this->binary_->data_directory(DATA_DIRECTORY::CERTIFICATE_TABLE).RVA();
+  const uint32_t signature_size = this->binary_->data_directory(DATA_DIRECTORY::CERTIFICATE_TABLE).size();
+  LOG(DEBUG) << "Signature Offset: 0x" << std::hex << signature_offset;
+  LOG(DEBUG) << "Signature Size: 0x" << std::hex << signature_size;
+
+  //TODO: Deal with header (+8)
+  const uint8_t* signature_ptr = reinterpret_cast<const uint8_t*>(this->stream_->read(signature_offset + 8, signature_size));
+  const uint8_t* end = signature_ptr + signature_size;
+  Signature signature;
+  mbedtls_asn1_buf buf;
+  int ret = 0;
+  size_t tag;
+
+  uint8_t* p = const_cast<uint8_t*>(signature_ptr);
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  buf.tag = *p;
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &buf.len, MBEDTLS_ASN1_OID)) != 0) {
+    throw corrupted("Error while reading tag");
+  }
+
+  buf.p = p;
+  char oid_str[256] = { 0 };
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &buf);
+  LOG(DEBUG) << "OID (signedData): " << oid_str;
+  p += buf.len;
+
+
+  if (MBEDTLS_OID_CMP(MBEDTLS_OID_PKCS7_SIGNED_DATA, &buf) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  // Version
+  // =======
+  int version;
+  if ((ret = mbedtls_asn1_get_int(&p, end, &version)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  LOG(DEBUG) << "Version: " << std::dec << version;
+  LOG_IF(version != 1, WARNING) << "Version should be equal to 1 (" << std::dec << version << ")";
+  signature.version_ = static_cast<uint32_t>(version);
+
+
+  // Algo (digestAlgorithms)
+  // =======================
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  mbedtls_asn1_buf alg_oid;
+  if ((ret = mbedtls_asn1_get_alg_null(&p, end, &alg_oid)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &alg_oid);
+
+  LOG(DEBUG) << "digestAlgorithms: " << oid_str;
+
+  signature.digest_algorithm_ = oid_str;
+
+  // contentInfo
+  // |_ contentType
+  // |_ content (SpcIndirectDataContent)
+  // ===================================
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  ContentInfo content_info;
+
+
+  // Content type
+  // ------------
+  mbedtls_asn1_buf content_type_oid;
+  content_type_oid.tag = *p;
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  content_type_oid.p = p;
+
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
+
+  if (MBEDTLS_OID_CMP(MBEDTLS_SPC_INDIRECT_DATA_OBJID, &content_type_oid) != 0) {
+    throw corrupted(std::string(oid_str) + " is not SPC_INDIRECT_DATA_OBJID");
+  }
+  LOG(DEBUG) << "contentType: " << oid_str;
+  content_info.content_type_ = oid_str;
+  p += content_type_oid.len;
+
+  // content - SpcIndirectDataContent
+  // |_ SpcAttributeTypeAndOptionalValue
+  // |_ DigestInfo
+  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  LOG(DEBUG) << "Parsing SpcIndirectDataContent (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  // SpcAttributeTypeAndOptionalValue
+  // |_ SPC_PE_IMAGE_DATAOBJ
+  // |_ SpcPeImageData
+  // ++++++++++++++++++++++++++++++++
+  LOG(DEBUG) << "Parsing SpcAttributeTypeAndOptionalValue (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  content_type_oid.tag = *p;
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  content_type_oid.p = p;
+
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
+  LOG(DEBUG) << "SpcAttributeTypeAndOptionalValue->type " << oid_str;
+
+  content_info.type_ = oid_str;
+  p += content_type_oid.len;
+
+  // SpcPeImageData
+  // |_ SpcPeImageFlags
+  // |_ SpcLink
+  // ++++++++++++++
+  LOG(DEBUG) << "Parsing SpcPeImageData (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  // SpcPeImageFlags
+  // ^^^^^^^^^^^^^^^
+  LOG(DEBUG) << "Parsing SpcPeImageFlags (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_BIT_STRING)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  p += tag; // skip
+
+  // SpcLink
+  // ^^^^^^^
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  p += tag; // skip
+
+  // DigestInfo
+  // ++++++++++
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  if ((ret = mbedtls_asn1_get_alg_null(&p, end, &alg_oid)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &alg_oid);
+  LOG(DEBUG) << "DigestInfo->digestAlgorithm: " << oid_str;
+
+  content_info.digest_algorithm_ = oid_str;
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_OCTET_STRING)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  content_info.digest_ = {p, p + tag};
+
+  //TODO: Read hash
+  p += tag;
+
+  signature.content_info_ = std::move(content_info);
+
+  // Certificates
+  // ============
+  LOG(DEBUG) << "Parsing Certificates (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  uint8_t* cert_end = p + tag;
+  char buffer[1024];
+  while (p < cert_end) {
+    std::memset(buffer, 0, sizeof(buffer));
+
+    mbedtls_x509_crt* ca = new mbedtls_x509_crt{};
+    mbedtls_x509_crt_init(ca);
+    mbedtls_x509_crt_parse_der(ca, p, end - p);
+
+    signature.certificates_.emplace_back(ca);
+
+    mbedtls_x509_crt_info(buffer, sizeof(buffer), "", ca);
+    LOG(DEBUG) << std::endl << buffer << std::endl;
+    p += ca->raw.len;
+  }
+
+
+  // signerInfo
+  // ==========
+  SignerInfo signer_info;
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SET | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  if ((ret = mbedtls_asn1_get_int(&p, end, &version)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  LOG(DEBUG) << "Version: " << std::dec << version;
+  LOG_IF(version != 1, WARNING) << "SignerInfo's version should be equal to 1 (" << std::dec << version << ")";
+  signer_info.version_ = version;
+
+  // issuerAndSerialNumber
+  // ---------------------
+  LOG(DEBUG) << "Parsing issuerAndSerialNumber (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  // Name
+  // ~~~~
+  std::vector<std::pair<std::string, std::string>> issuer_name;
+  uint8_t* p_end = p + tag;
+  while(p < p_end) {
+    if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SET | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+      throw corrupted("Signature corrupted");
+    }
+
+    if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+      throw corrupted("Signature corrupted");
+    }
+
+    content_type_oid.tag = *p;
+
+    if ((ret = mbedtls_asn1_get_tag(&p, end, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
+      throw corrupted("Signature corrupted");
+    }
+    content_type_oid.p = p;
+
+    std::memset(oid_str, 0, sizeof(oid_str));
+    mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
+
+    LOG(DEBUG) << "Component ID: " << oid_str;
+    p += content_type_oid.len;
+
+    if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_PRINTABLE_STRING)) != 0) {
+      throw corrupted("Signature corrupted");
+    }
+
+    std::string name{reinterpret_cast<char*>(p), tag};
+    issuer_name.emplace_back(oid_str, name);
+    LOG(DEBUG) << "Name: " << name;
+    p += tag;
+  }
+
+  // CertificateSerialNumber (issuer SN)
+  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  mbedtls_mpi certificate_number;
+  mbedtls_mpi_init(&certificate_number);
+  if ((ret = mbedtls_asn1_get_mpi(&p, end, &certificate_number)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  std::vector<uint8_t> certificate_sn(mbedtls_mpi_size(&certificate_number), 0);
+  mbedtls_mpi_write_binary(&certificate_number, certificate_sn.data(), certificate_sn.size());
+  mbedtls_mpi_free(&certificate_number);
+
+  signer_info.issuer_ = {issuer_name, certificate_sn};
+
+
+
+  // digestAlgorithm
+  // ---------------
+  LOG(DEBUG) << "Parsing digestAlgorithm (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+  if ((ret = mbedtls_asn1_get_alg_null(&p, end, &alg_oid)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &alg_oid);
+  LOG(DEBUG) << "signerInfo->digestAlgorithm " << oid_str;
+
+  signer_info.digest_algorithm_ = oid_str;
+
+  // authenticatedAttributes
+  // |_ contentType
+  // |_ messageDigest
+  // |_ SpcSpOpusInfo
+  // -----------------------
+  AuthenticatedAttributes authenticated_attributes;
+
+  LOG(DEBUG) << "Parsing authenticatedAttributes (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  // contentType (1.2.840.113549.1.9.3)
+  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  content_type_oid.tag = *p;
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  content_type_oid.p = p;
+
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
+
+  LOG(DEBUG) << oid_str; // 1.2.840.113549.1.9.3 (PKCS #9 contentType)
+
+  p += content_type_oid.len;
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SET | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  content_type_oid.tag = *p;
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  content_type_oid.p = p;
+
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
+
+  LOG(DEBUG) << oid_str; // 1.2.840.113549.1.9.4
+  p += content_type_oid.len;
+  //authenticated_attributes.content_type_ = oid_str;
+
+  // TODO
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  p += tag;
+
+
+  // messageDigest (Octet string)
+  // |_ OID (PKCS #9 Message Disgest)
+  // |_ SET -> OCTET STING
+  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  LOG(DEBUG) << "Parsing messageDigest (offset: " << std::dec << (reinterpret_cast<size_t>(p) - reinterpret_cast<size_t>(signature_ptr)) << ")";
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  content_type_oid.tag = *p;
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  content_type_oid.p = p;
+
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
+  LOG(DEBUG) << oid_str; // 1.2.840.113549.1.9.4
+  p += content_type_oid.len;
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SET | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_OCTET_STRING)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  authenticated_attributes.message_digest_ = {p, p + tag};
+  p += tag;
+
+
+  // SpcSpOpusInfo
+  // |_ programName (utf16)
+  // |_ moreInfo
+  // ~~~~~~~~~~~~~~~~~~~~~~
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  content_type_oid.tag = *p;
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &content_type_oid.len, MBEDTLS_ASN1_OID)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  content_type_oid.p = p;
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &content_type_oid);
+  LOG(DEBUG) << oid_str; // 1.3.6.1.4.1.311.2.1.12 (SpcSpOpusInfoObjId)
+  p += content_type_oid.len;
+
+  // programName
+  // +++++++++++
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SET | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONTEXT_SPECIFIC)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  std::u16string progname{reinterpret_cast<char16_t*>(p + 1), tag / 2}; // programName
+  authenticated_attributes.program_name_ = progname;
+  LOG(DEBUG) << "ProgName " << u16tou8(progname);
+  p += tag;
+
+  // moreInfo
+  // ++++++++
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_BOOLEAN )) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_CONTEXT_SPECIFIC)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  std::string more_info{reinterpret_cast<char*>(p), tag}; // moreInfo
+  authenticated_attributes.more_info_ = more_info;
+  LOG(DEBUG) << more_info;
+  p += tag;
+
+  signer_info.authenticated_attributes_ = std::move(authenticated_attributes);
+
+  // digestEncryptionAlgorithm
+  // -------------------------
+  if ((ret = mbedtls_asn1_get_alg_null(&p, end, &alg_oid)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+  std::memset(oid_str, 0, sizeof(oid_str));
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &alg_oid);
+  signer_info.signature_algorithm_ = oid_str;
+
+  LOG(DEBUG) << "digestEncryptionAlgorithm: " << oid_str;
+
+  // encryptedDigest
+  // ---------------
+  if ((ret = mbedtls_asn1_get_tag(&p, end, &tag, MBEDTLS_ASN1_OCTET_STRING)) != 0) {
+    throw corrupted("Signature corrupted");
+  }
+
+  signer_info.encrypted_digest_ = {p, p + tag};
+  p += tag;
+
+  //TODO:
+  // unauthenticatedAttributes
+
+
+  signature.signer_info_ = std::move(signer_info);
+  LOG(DEBUG) << "Signature: " << std::endl << signature;
+  this->binary_->signature_ = std::move(signature);
+  this->binary_->has_signature_ = true;
+}
+
+//
+// Return the Binary constructed
+//
+Binary* Parser::parse(const std::string& filename) {
+  Parser parser{filename};
+  return parser.binary_;
+}
+
+
+Binary* Parser::parse(const std::vector<uint8_t>& data, const std::string& name) {
+  Parser parser{data, name};
+  return parser.binary_;
+}
+
+}
+}
diff --git a/src/PE/Parser.tcc b/src/PE/Parser.tcc
new file mode 100644
index 0000000..1e8a64e
--- /dev/null
+++ b/src/PE/Parser.tcc
@@ -0,0 +1,376 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "easylogging++.h"
+
+namespace LIEF {
+namespace PE {
+
+template<typename PE_T>
+void Parser::build(void) {
+
+  try {
+    this->build_headers<PE_T>();
+  } catch (const corrupted& e) {
+    LOG(WARNING) << e.what();
+  }
+
+  LOG(DEBUG) << "[+] Decomposing Sections";
+
+  try {
+    this->build_sections();
+  } catch (const corrupted& e) {
+    LOG(WARNING) << e.what();
+  }
+
+  LOG(DEBUG) << "[+] Decomposing Data directories";
+  try {
+    this->build_data_directories<PE_T>();
+  } catch (const corrupted& e) {
+    LOG(WARNING) << e.what();
+  }
+
+  try {
+    this->build_symbols();
+  } catch (const corrupted& e) {
+    LOG(WARNING) << e.what();
+  }
+}
+
+template<typename PE_T>
+void Parser::build_headers(void) {
+  using pe_optional_header = typename PE_T::pe_optional_header;
+
+  //DOS Header
+  try {
+    this->binary_->dos_header_ = {reinterpret_cast<const pe_dos_header*>(
+        this->stream_->read(0, sizeof(pe_dos_header)))};
+
+  } catch (const read_out_of_bound&) {
+    throw corrupted("Dos Header corrupted");
+  }
+
+
+  //PE32 Header
+  try {
+    this->binary_->header_ = {reinterpret_cast<const pe_header*>(
+      this->stream_->read(
+        this->binary_->dos_header().addressof_new_exeheader(),
+        sizeof(pe_header)))};
+  } catch (const read_out_of_bound&) {
+    throw corrupted("PE32 Header corrupted");
+  }
+
+  // Optional Header
+  try {
+    this->binary_->optional_header_ = {reinterpret_cast<const pe_optional_header*>(
+        this->stream_->read(
+          this->binary_->dos_header().addressof_new_exeheader() + sizeof(pe_header),
+          sizeof(pe_optional_header)))};
+  } catch (const read_out_of_bound&) {
+    throw corrupted("Optional header corrupted");
+  }
+}
+
+template<typename PE_T>
+void Parser::build_data_directories(void) {
+  using pe_optional_header = typename PE_T::pe_optional_header;
+
+  LOG(DEBUG) << "[+] Parsing data directories";
+
+  const uint32_t dirOffset =
+      this->binary_->dos_header().addressof_new_exeheader() +
+      sizeof(pe_header) +
+      sizeof(pe_optional_header);
+  const uint32_t nbof_datadir = DATA_DIRECTORY::NUM_DATA_DIRECTORIES;
+
+  const pe_data_directory* dataDirectory = [&] () {
+    try {
+      return reinterpret_cast<const pe_data_directory*>(
+        this->stream_->read(dirOffset, nbof_datadir * sizeof(pe_data_directory)));
+    } catch (const read_out_of_bound&) {
+      throw corrupted("Data directories corrupted");
+    }
+  }();
+
+  this->binary_->data_directories_.reserve(nbof_datadir);
+  for (size_t i = 0; i < nbof_datadir; ++i) {
+    DataDirectory* directory = new DataDirectory{&dataDirectory[i], static_cast<DATA_DIRECTORY>(i)};
+
+    LOG(DEBUG) << "Processing directory: " << to_string(static_cast<DATA_DIRECTORY>(i));
+    LOG(DEBUG) << "- RVA: 0x" << std::hex << dataDirectory[i].RelativeVirtualAddress;
+    LOG(DEBUG) << "- Size: 0x" << std::hex << dataDirectory[i].Size;
+    if (directory->RVA() > 0) {
+      // Data directory is not always associated with section
+      const uint64_t offset = this->binary_->rva_to_offset(directory->RVA());
+      try {
+        directory->section_ = &(this->binary_->section_from_offset(offset));
+      } catch (const LIEF::not_found&) {
+          LOG(WARNING) << "Unable to find the section associated with "
+                       << to_string(static_cast<DATA_DIRECTORY>(i));
+      }
+    }
+    this->binary_->data_directories_.push_back(directory);
+  }
+
+  // Import Table
+  if (this->binary_->data_directory(DATA_DIRECTORY::IMPORT_TABLE).RVA() > 0) {
+    LOG(DEBUG) << "[+] Decomposing Import Table";
+    const uint32_t import_rva = this->binary_->data_directory(DATA_DIRECTORY::IMPORT_TABLE).RVA();
+    const uint64_t offset     = this->binary_->rva_to_offset(import_rva);
+
+    try {
+      Section& section = this->binary_->section_from_offset(offset);
+      section.add_type(SECTION_TYPES::IMPORT);
+    } catch (const not_found&) {
+      LOG(WARNING) << "Unable to find the section associated with Import Table";
+    }
+    this->build_import_table<PE_T>();
+  }
+
+  // Exports
+  if (this->binary_->data_directory(DATA_DIRECTORY::EXPORT_TABLE).RVA() > 0) {
+    LOG(DEBUG) << "[+] Decomposing Exports";
+    this->build_exports();
+  }
+
+  if (this->binary_->data_directory(DATA_DIRECTORY::CERTIFICATE_TABLE).RVA() > 0) {
+    try {
+      this->build_signature();
+    } catch (const exception& e) {
+      LOG(WARNING) << e.what();
+    }
+  }
+
+
+  // TLS
+  if (this->binary_->data_directory(DATA_DIRECTORY::TLS_TABLE).RVA() > 0) {
+    LOG(DEBUG) << "[+] Decomposing TLS";
+
+    const uint32_t import_rva = this->binary_->data_directory(DATA_DIRECTORY::TLS_TABLE).RVA();
+    const uint64_t offset     = this->binary_->rva_to_offset(import_rva);
+    try {
+      Section& section = this->binary_->section_from_offset(offset);
+      section.add_type(SECTION_TYPES::TLS);
+      this->build_tls<PE_T>();
+    } catch (const not_found&) {
+      LOG(WARNING) << "Unable to find the section associated with TLS";
+    } catch (const corrupted& e) {
+      LOG(WARNING) << e.what();
+    }
+  }
+
+  // Relocations
+  if (this->binary_->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).RVA() > 0) {
+
+    LOG(DEBUG) << "[+] Decomposing relocations";
+    const uint32_t relocation_rva = this->binary_->data_directory(DATA_DIRECTORY::BASE_RELOCATION_TABLE).RVA();
+    const uint64_t offset         = this->binary_->rva_to_offset(relocation_rva);
+    try {
+      Section& section = this->binary_->section_from_offset(offset);
+      section.add_type(SECTION_TYPES::RELOCATION);
+      this->build_relocations();
+    } catch (const not_found&) {
+      LOG(WARNING) << "Unable to find the section associated with relocations";
+    } catch (const corrupted& e) {
+      LOG(WARNING) << e.what();
+    }
+  }
+
+
+  // Debug
+  if (this->binary_->data_directory(DATA_DIRECTORY::DEBUG).RVA() > 0) {
+
+    LOG(DEBUG) << "[+] Decomposing debug";
+    const uint32_t rva    = this->binary_->data_directory(DATA_DIRECTORY::DEBUG).RVA();
+    const uint64_t offset = this->binary_->rva_to_offset(rva);
+    try {
+      Section& section = this->binary_->section_from_offset(offset);
+      section.add_type(SECTION_TYPES::DEBUG);
+      this->build_debug();
+    } catch (const not_found&) {
+      LOG(WARNING) << "Unable to find the section associated with debug";
+    } catch (const corrupted& e) {
+      LOG(WARNING) << e.what();
+    }
+  }
+
+
+  // Resources
+  if (this->binary_->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).RVA() > 0) {
+
+    LOG(DEBUG) << "[+] Decomposing resources";
+    const uint32_t resources_rva = this->binary_->data_directory(DATA_DIRECTORY::RESOURCE_TABLE).RVA();
+    const uint64_t offset        = this->binary_->rva_to_offset(resources_rva);
+    try {
+      Section& section  = this->binary_->section_from_offset(offset);
+      section.add_type(SECTION_TYPES::RESOURCE);
+      this->build_resources();
+    } catch (const not_found&) {
+      LOG(WARNING) << "Unable to find the section associated with resources";
+    } catch (const corrupted& e) {
+      LOG(WARNING) << e.what();
+    }
+
+  }
+}
+
+template<typename PE_T>
+void Parser::build_import_table(void) {
+  using uint__ = typename PE_T::uint;
+
+  this->binary_->has_imports_ = true;
+
+  const uint32_t import_rva = this->binary_->data_directory(DATA_DIRECTORY::IMPORT_TABLE).RVA();
+  const uint64_t offset     = this->binary_->rva_to_offset(import_rva);
+
+  const pe_import* header = reinterpret_cast<const pe_import*>(
+    this->stream_->read(offset, sizeof(pe_import)));
+
+  while (header->ImportAddressTableRVA != 0) {
+    Import import           = {header};
+    import.directory_       = &(this->binary_->data_directory(DATA_DIRECTORY::IMPORT_TABLE));
+    import.iat_directory_   = &(this->binary_->data_directory(DATA_DIRECTORY::IAT));
+    import.type_            = this->type_;
+    if (import.name_RVA_ == 0) {
+      throw parser_error("Name's RVA is null");
+    }
+    // Offset to the Import (Library) name
+    const uint64_t offsetName = this->binary_->rva_to_offset(import.name_RVA_);
+    import.name_              = this->stream_->read_string(offsetName);
+
+    // Offset to import lookup table
+    uint64_t LT_offset      = 0;
+    if (import.import_lookup_table_RVA_ > 0) {
+      LT_offset = this->binary_->rva_to_offset(import.import_lookup_table_RVA_);
+    }
+
+    // Offset to the import address table
+    uint64_t IAT_offset        = 0;
+    if (import.import_address_table_RVA_ > 0) {
+      IAT_offset = this->binary_->rva_to_offset(import.import_address_table_RVA_);
+    }
+
+    const uint__ *lookupTable = nullptr, *IAT = nullptr, *table = nullptr;
+
+    if (IAT_offset > 0) {
+      try {
+        IAT = reinterpret_cast<const uint__*>(
+            this->stream_->read(IAT_offset, sizeof(uint__)));
+        table = IAT;
+      } catch (const LIEF::exception&) {
+      }
+    }
+
+    if (LT_offset > 0) {
+      try {
+        lookupTable = reinterpret_cast<const uint__*>(
+            this->stream_->read(LT_offset, sizeof(uint__)));
+
+        table = lookupTable;
+      } catch (const LIEF::exception&) {
+      }
+
+    }
+    size_t idx = 0;
+    while (table != nullptr and *table != 0) {
+      ImportEntry entry;
+      entry.iat_value_ = IAT != nullptr ? *(IAT++) : 0;
+      entry.data_      = *table;
+      entry.type_      = this->type_;
+      entry.rva_       = import.import_address_table_RVA_ + sizeof(uint__) * (idx++);
+
+      if(not entry.is_ordinal()) {
+
+        entry.name_ = this->stream_->read_string(
+            this->binary_->rva_to_offset(entry.hint_name_rva()) + sizeof(uint16_t));
+
+        entry.hint_ = *reinterpret_cast<const uint16_t*>(
+            this->stream_->read(
+              this->binary_->rva_to_offset(entry.hint_name_rva()),
+              sizeof(uint16_t)));
+      }
+
+      import.entries_.push_back(std::move(entry));
+
+      table++;
+    }
+    this->binary_->imports_.push_back(std::move(import));
+    header++;
+  }
+
+}
+
+template<typename PE_T>
+void Parser::build_tls(void) {
+  using pe_tls = typename PE_T::pe_tls;
+  using uint__ = typename PE_T::uint;
+
+  LOG(DEBUG) << "[+] Parsing TLS";
+
+  this->binary_->has_tls_ = true;
+
+  const uint32_t tls_rva = this->binary_->data_directory(DATA_DIRECTORY::TLS_TABLE).RVA();
+  const uint64_t offset  = this->binary_->rva_to_offset(tls_rva);
+
+  const pe_tls *tls_header = reinterpret_cast<const pe_tls*>(
+      this->stream_->read(offset, sizeof(pe_tls)));
+
+  this->binary_->tls_ = {tls_header};
+  TLS& tls = this->binary_->tls_;
+
+  const uint64_t imagebase = this->binary_->optional_header().imagebase();
+
+  try {
+    const uint64_t startDataRVA = tls_header->RawDataStartVA - imagebase;
+    const uint64_t stopDataRVA  = tls_header->RawDataEndVA - imagebase;
+    const uint__ offsetStartTemplate  = this->binary_->rva_to_offset(startDataRVA);
+    const uint__ offsetEndTemplate    = this->binary_->rva_to_offset(stopDataRVA);
+
+    const uint8_t* template_ptr = reinterpret_cast<const uint8_t*>(
+        this->stream_->read(offsetStartTemplate, offsetEndTemplate - offsetStartTemplate));
+    std::vector<uint8_t> templateData = {
+      template_ptr,
+      template_ptr + offsetEndTemplate - offsetStartTemplate
+    };
+    tls.data_template(templateData);
+
+  } catch (const read_out_of_bound&) {
+    throw corrupted("TLS corrupted (data template)");
+  } catch (const std::bad_alloc&) {
+    throw corrupted("TLS corrupted (data template)");
+  }
+
+  const uint64_t offsetToCallbacks  = this->binary_->rva_to_offset(tls.addressof_callbacks() - imagebase);
+  const uint__ *rvaCallbacksAddress = reinterpret_cast<const uint__*>(
+      this->stream_->read(offsetToCallbacks, sizeof(uint__)));
+
+  while (*rvaCallbacksAddress != 0) {
+    tls.callbacks_.push_back(static_cast<uint64_t>(*rvaCallbacksAddress));
+    rvaCallbacksAddress++;
+  }
+
+  tls.directory_ = &(this->binary_->data_directory(DATA_DIRECTORY::TLS_TABLE));
+
+  try {
+    Section& section = this->binary_->section_from_offset(offset);
+    tls.section_     = &section;
+  } catch (const not_found&) {
+    LOG(WARNING) << "No section associated with TLS";
+  }
+
+}
+}
+}
diff --git a/src/PE/Relocation.cpp b/src/PE/Relocation.cpp
new file mode 100644
index 0000000..2195090
--- /dev/null
+++ b/src/PE/Relocation.cpp
@@ -0,0 +1,105 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/Relocation.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Relocation::Relocation(const Relocation& other)            = default;
+Relocation& Relocation::operator=(const Relocation& other) = default;
+Relocation::~Relocation(void)                              = default;
+
+
+Relocation::Relocation(void) :
+  block_size_{0},
+  virtual_address_{0},
+  entries_{}
+{}
+
+
+Relocation::Relocation(const pe_base_relocation_block* header) :
+  block_size_{header->BlockSize},
+  virtual_address_{header->PageRVA},
+  entries_{}
+{}
+
+
+uint32_t Relocation::virtual_address(void) const {
+  return this->virtual_address_;
+}
+
+
+uint32_t Relocation::block_size(void) const {
+  return this->block_size_;
+}
+
+const std::vector<RelocationEntry>& Relocation::entries(void) const {
+  return this->entries_;
+}
+
+
+void Relocation::add_entry(const RelocationEntry& entry) {
+  return this->entries_.push_back(entry);
+}
+
+
+void Relocation::virtual_address(uint32_t virtual_address) {
+  this->virtual_address_ = virtual_address;
+}
+
+
+void Relocation::block_size(uint32_t block_size) {
+  this->block_size_ = block_size;
+}
+
+
+void Relocation::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->virtual_address());
+  for (const RelocationEntry& entry : this->entries_) {
+    visitor(entry);
+  }
+}
+
+bool Relocation::operator==(const Relocation& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Relocation::operator!=(const Relocation& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const Relocation& relocation) {
+
+  os << std::hex << std::left;
+  os << std::setw(10) << relocation.virtual_address();
+  os << std::setw(10) << relocation.block_size();
+  os << std::endl;
+  for (const RelocationEntry& entry : relocation.entries()) {
+    os << "    - " << entry << std::endl;
+  }
+
+  return os;
+}
+
+}
+}
diff --git a/src/PE/RelocationEntry.cpp b/src/PE/RelocationEntry.cpp
new file mode 100644
index 0000000..b31e468
--- /dev/null
+++ b/src/PE/RelocationEntry.cpp
@@ -0,0 +1,103 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/RelocationEntry.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+
+namespace LIEF {
+namespace PE {
+
+RelocationEntry::RelocationEntry(const RelocationEntry&) = default;
+RelocationEntry& RelocationEntry::operator=(const RelocationEntry&) = default;
+RelocationEntry::~RelocationEntry(void) = default;
+
+RelocationEntry::RelocationEntry(void) :
+  position_{0},
+  type_{RELOCATIONS_BASE_TYPES::IMAGE_REL_BASED_ABSOLUTE}
+{}
+
+RelocationEntry::RelocationEntry(uint16_t data) :
+  position_{static_cast<uint16_t>(data & 0x0FFF)},
+  type_{static_cast<RELOCATIONS_BASE_TYPES>(data >> 12)}
+{}
+
+
+RelocationEntry::RelocationEntry(uint16_t position, RELOCATIONS_BASE_TYPES type) :
+  position_{position},
+  type_{type}
+{}
+
+
+uint16_t RelocationEntry::data(void) const {
+  return (static_cast<uint8_t>(this->type_) << 12 | static_cast<uint16_t>(this->position_));
+}
+
+
+uint16_t RelocationEntry::position(void) const {
+  return this->position_;
+}
+
+
+RELOCATIONS_BASE_TYPES RelocationEntry::type(void) const {
+  return this->type_;
+}
+
+void RelocationEntry::data(uint16_t data) {
+  this->position_ = static_cast<uint16_t>(data & 0x0FFF);
+  this->type_     = static_cast<RELOCATIONS_BASE_TYPES>(data >> 12);
+}
+
+void RelocationEntry::position(uint16_t position) {
+  this->position_ = position;
+}
+
+
+void RelocationEntry::type(RELOCATIONS_BASE_TYPES type) {
+  this->type_ = type;
+}
+
+
+void RelocationEntry::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->data());
+  visitor.visit(this->position());
+  visitor.visit(this->type());
+}
+
+bool RelocationEntry::operator==(const RelocationEntry& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool RelocationEntry::operator!=(const RelocationEntry& rhs) const {
+  return not (*this == rhs);
+}
+
+std::ostream& operator<<(std::ostream& os, const RelocationEntry& entry) {
+  os << std::hex << std::left;
+  os << std::setw(10) << to_string(entry.type());
+  os << std::setw(6) << static_cast<uint32_t>(entry.position());
+
+  return os;
+
+}
+
+}
+}
diff --git a/src/PE/ResourceData.cpp b/src/PE/ResourceData.cpp
new file mode 100644
index 0000000..285157e
--- /dev/null
+++ b/src/PE/ResourceData.cpp
@@ -0,0 +1,72 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/ResourceData.hpp"
+
+namespace LIEF {
+namespace PE {
+ResourceData::ResourceData(void) = default;
+ResourceData::~ResourceData(void) = default;
+ResourceData& ResourceData::operator=(const ResourceData&) = default;
+ResourceData::ResourceData(const ResourceData&) = default;
+
+ResourceData::ResourceData(const std::vector<uint8_t>& content, uint32_t codePage) :
+  content_(content),
+  codePage_(codePage)
+{
+  this->type_ = RESOURCE_NODE_TYPES::DATA;
+}
+
+uint32_t ResourceData::code_page(void) const {
+  return this->codePage_;
+}
+
+
+const std::vector<uint8_t>& ResourceData::content(void) const {
+  return this->content_;
+}
+
+
+void ResourceData::code_page(uint32_t codePage) {
+  this->codePage_ = codePage;
+}
+
+
+void ResourceData::content(const std::vector<uint8_t>& content) {
+  this->content_ = content;
+}
+
+void ResourceData::accept(Visitor& visitor) const {
+
+  visitor.visit(this->code_page());
+  visitor.visit(this->content());
+
+}
+
+bool ResourceData::operator==(const ResourceData& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool ResourceData::operator!=(const ResourceData& rhs) const {
+  return not (*this == rhs);
+}
+
+
+}
+}
diff --git a/src/PE/ResourceDirectory.cpp b/src/PE/ResourceDirectory.cpp
new file mode 100644
index 0000000..da2b4e1
--- /dev/null
+++ b/src/PE/ResourceDirectory.cpp
@@ -0,0 +1,98 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/ResourceDirectory.hpp"
+
+namespace LIEF {
+namespace PE {
+
+
+ResourceDirectory::~ResourceDirectory(void) = default;
+ResourceDirectory& ResourceDirectory::operator=(const ResourceDirectory&) = default;
+ResourceDirectory::ResourceDirectory(const ResourceDirectory&) = default;
+
+ResourceDirectory::ResourceDirectory(void) :
+  characteristics_{0},
+  timeDateStamp_{0},
+  majorVersion_{0},
+  minorVersion_{0},
+  numberOfNameEntries_{0},
+  numberOfIDEntries_{0}
+{}
+
+ResourceDirectory::ResourceDirectory(const pe_resource_directory_table* header) :
+  characteristics_(header->Characteristics),
+  timeDateStamp_(header->TimeDateStamp),
+  majorVersion_(header->MajorVersion),
+  minorVersion_(header->MajorVersion),
+  numberOfNameEntries_(header->NumberOfNameEntries),
+  numberOfIDEntries_(header->NumberOfIDEntries)
+{
+  this->type_ = RESOURCE_NODE_TYPES::DIRECTORY ;
+}
+
+
+uint32_t ResourceDirectory::characteristics(void) const {
+  return this->characteristics_;
+}
+
+
+uint32_t ResourceDirectory::time_date_stamp(void) const {
+  return this->timeDateStamp_;
+}
+
+
+uint16_t ResourceDirectory::major_version(void) const {
+  return this->majorVersion_;
+}
+
+
+uint16_t ResourceDirectory::minor_version(void) const {
+  return this->minorVersion_;
+}
+
+
+uint16_t ResourceDirectory::numberof_name_entries(void) const {
+  return this->numberOfNameEntries_;
+}
+
+
+uint16_t ResourceDirectory::numberof_id_entries(void) const {
+  return this->numberOfIDEntries_;
+}
+
+void ResourceDirectory::accept(Visitor& visitor) const {
+  visitor.visit(this->characteristics());
+  visitor.visit(this->time_date_stamp());
+  visitor.visit(this->major_version());
+  visitor.visit(this->minor_version());
+  visitor.visit(this->numberof_name_entries());
+  visitor.visit(this->numberof_id_entries());
+}
+
+bool ResourceDirectory::operator==(const ResourceDirectory& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool ResourceDirectory::operator!=(const ResourceDirectory& rhs) const {
+  return not (*this == rhs);
+}
+
+}
+}
diff --git a/src/PE/ResourceNode.cpp b/src/PE/ResourceNode.cpp
new file mode 100644
index 0000000..1f58268
--- /dev/null
+++ b/src/PE/ResourceNode.cpp
@@ -0,0 +1,138 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "LIEF/visitors/Hash.hpp"
+
+#include "LIEF/PE/ResourceNode.hpp"
+#include "LIEF/PE/ResourceDirectory.hpp"
+#include "LIEF/PE/ResourceData.hpp"
+
+namespace LIEF {
+namespace PE {
+
+ResourceNode::ResourceNode(void) = default;
+
+ResourceNode& ResourceNode::operator=(const ResourceNode& other) {
+  if (this != &other) {
+    this->type_ = other.type_;
+    this->id_   = other.id_;
+    this->name_ = other.name_;
+
+    for (const ResourceNode* node : this->childs_) {
+      if (const ResourceDirectory* directory = dynamic_cast<const ResourceDirectory*>(node)) {
+        this->childs_.push_back(new ResourceDirectory{*directory});
+      }
+
+      if (const ResourceData* data = dynamic_cast<const ResourceData*>(node)) {
+        this->childs_.push_back(new ResourceData{*data});
+      }
+    }
+  }
+  return *this;
+}
+
+ResourceNode::ResourceNode(const ResourceNode& other) {
+  this->type_ = other.type_;
+  this->id_   = other.id_;
+  this->name_ = other.name_;
+
+  for (const ResourceNode* node : this->childs_) {
+    if (const ResourceDirectory* directory = dynamic_cast<const ResourceDirectory*>(node)) {
+      this->childs_.push_back(new ResourceDirectory{*directory});
+    }
+
+    if (const ResourceData* data = dynamic_cast<const ResourceData*>(node)) {
+      this->childs_.push_back(new ResourceData{*data});
+    }
+  }
+}
+
+ResourceNode::~ResourceNode(void) {
+  for (ResourceNode* node : this->childs_) {
+    delete node;
+  }
+}
+
+
+RESOURCE_NODE_TYPES ResourceNode::type(void) const {
+  return this->type_;
+}
+
+
+uint32_t ResourceNode::id(void) const {
+  return this->id_;
+}
+
+
+std::vector<ResourceNode*>& ResourceNode::childs(void) {
+  return this->childs_;
+}
+
+
+const std::vector<ResourceNode*>& ResourceNode::childs(void) const {
+  return this->childs_;
+}
+
+
+const std::u16string& ResourceNode::name(void) const {
+  return this->name_;
+}
+
+
+bool ResourceNode::has_name(void) const {
+  return static_cast<bool>(this->id() & 0x80000000);
+}
+
+
+void ResourceNode::add_child(ResourceNode* child) {
+  this->childs_.push_back(child);
+}
+
+void ResourceNode::accept(Visitor& visitor) const {
+
+  visitor.visit(this->id());
+  visitor.visit(static_cast<size_t>(this->type()));
+  if (this->has_name()) {
+    visitor.visit(this->name());
+  }
+
+  if (const ResourceDirectory* directory = dynamic_cast<const ResourceDirectory*>(this)) {
+    visitor(*directory);
+  }
+
+  if (const ResourceData* data = dynamic_cast<const ResourceData*>(this)) {
+    visitor(*data);
+  }
+
+  for (const ResourceNode* child : this->childs()) {
+    visitor(*child);
+  }
+
+}
+
+bool ResourceNode::operator==(const ResourceNode& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool ResourceNode::operator!=(const ResourceNode& rhs) const {
+  return not (*this == rhs);
+}
+
+
+}
+}
diff --git a/src/PE/ResourcesManager.cpp b/src/PE/ResourcesManager.cpp
new file mode 100644
index 0000000..e392bf8
--- /dev/null
+++ b/src/PE/ResourcesManager.cpp
@@ -0,0 +1,110 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <iomanip>
+
+#include "rang.hpp"
+
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/utils.hpp"
+#include "LIEF/PE/ResourcesManager.hpp"
+
+namespace LIEF {
+namespace PE {
+
+ResourcesManager::ResourcesManager(const ResourcesManager&) = default;
+ResourcesManager& ResourcesManager::operator=(const ResourcesManager&) = default;
+ResourcesManager::~ResourcesManager(void) = default;
+
+ResourcesManager::ResourcesManager(ResourceNode *rsrc) :
+  resources_{rsrc}
+{}
+
+
+ResourceDirectory* ResourcesManager::cursor(void) {
+  std::vector<ResourceNode*> childs = this->resources_->childs();
+  auto&& it_cursor = std::find_if(
+      std::begin(childs),
+      std::end(childs),
+      [] (const ResourceNode* node) {
+        return (
+            node->type() == RESOURCE_NODE_TYPES::DIRECTORY and
+            node->id() == RESOURCE_TYPES::CURSOR);
+      });
+  if (it_cursor == std::end(childs)) {
+    throw not_found("Unable to find the resource directory associated with 'cursor'");
+  }
+
+  return static_cast<ResourceDirectory*>(*it_cursor);
+
+}
+
+std::string ResourcesManager::print(uint32_t depth) const {
+  std::ostringstream oss;
+  oss << rang::control::forceColor;
+  uint32_t current_depth = 0;
+  this->print_tree(*this->resources_, oss, current_depth, depth);
+  return oss.str();
+}
+
+void ResourcesManager::print_tree(
+    const ResourceNode& node,
+    std::ostringstream& output,
+    uint32_t current_depth,
+    uint32_t max_depth) const {
+
+  if (max_depth < current_depth) {
+    return;
+  }
+
+  for (const ResourceNode* child_node : const_cast<ResourceNode&>(node).childs()) {
+    output << std::string(2 * (current_depth + 1), ' ');
+    output << "[";
+    if (child_node->type() == RESOURCE_NODE_TYPES::DIRECTORY) {
+      output << rang::fg::cyan;
+      output << "Directory";
+    } else {
+      output << rang::fg::yellow;
+      output << "Data";
+    }
+
+    output << rang::style::reset;
+    output << "] ";
+
+    if (child_node->has_name()) {
+
+      output << rang::bg::blue;
+      output << u16tou8(child_node->name());
+      output << rang::style::reset;
+    } else {
+      output << "ID: " << std::setw(2) << std::setfill('0') << std::dec << child_node->id();
+      output << std::setfill(' ');
+    }
+    output << std::endl;
+    print_tree(*child_node, output, current_depth + 1, max_depth);
+  }
+
+}
+
+std::ostream& operator<<(std::ostream& os, const ResourcesManager& m) {
+  os << m.print(3);
+  //os << m.print(static_cast<uint32_t>(-1));
+  return os;
+}
+
+} // namespace PE
+} // namespace LIEF
diff --git a/src/PE/Section.cpp b/src/PE/Section.cpp
new file mode 100644
index 0000000..e8e4691
--- /dev/null
+++ b/src/PE/Section.cpp
@@ -0,0 +1,282 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stdexcept>
+#include <string.h>
+#include <iomanip>
+#include <functional>
+#include <algorithm>
+#include <numeric>
+#include <iterator>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/Abstract/Section.hpp"
+
+#include "LIEF/PE/Section.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Section::~Section(void) = default;
+
+Section::Section(void) :
+  virtualSize_{0},
+  content_{},
+  pointerToRelocations_{0},
+  pointerToLineNumbers_{0},
+  numberOfRelocations_{0},
+  numberOfLineNumbers_{0},
+  characteristics_{0},
+  types_{SECTION_TYPES::UNKNOWN}
+{}
+
+
+Section& Section::operator=(const Section& copy) = default;
+Section::Section(const Section& copy) = default;
+
+Section::Section(const pe_section* header) :
+  virtualSize_{header->VirtualSize},
+  pointerToRelocations_{header->PointerToRelocations},
+  pointerToLineNumbers_{header->PointerToLineNumbers},
+  numberOfRelocations_{header->NumberOfRelocations},
+  numberOfLineNumbers_{header->NumberOfLineNumbers},
+  characteristics_{header->Characteristics},
+  types_{SECTION_TYPES::UNKNOWN}
+{
+  this->name_            = header->Name;
+  this->virtual_address_ = header->VirtualAddress;
+  this->size_            = header->SizeOfRawData;
+  this->offset_          = header->PointerToRawData;
+
+}
+
+Section::Section(const std::vector<uint8_t>& data, const std::string& name, uint32_t characteristics) :
+  Section::Section{}
+{
+  this->characteristics_ = characteristics;
+  this->name_            = name;
+  this->size_            = data.size();
+}
+
+Section::Section(const std::string& name) :
+  Section::Section{}
+{
+  this->name_ = name;
+}
+
+
+uint32_t Section::virtual_size(void) const {
+  return this->virtualSize_;
+}
+
+
+
+uint32_t Section::sizeof_raw_data(void) const {
+  return this->size();
+}
+
+
+std::vector<uint8_t> Section::content(void) const {
+  return this->content_;
+}
+
+
+
+uint32_t Section::pointerto_raw_data(void) const {
+  return this->offset();
+}
+
+
+uint32_t Section::pointerto_relocation(void) const {
+  return this->pointerToRelocations_;
+}
+
+
+uint32_t Section::pointerto_line_numbers(void) const {
+  return this->pointerToLineNumbers_;
+}
+
+uint16_t Section::numberof_relocations(void) const {
+  return this->numberOfRelocations_;
+}
+
+uint16_t Section::numberof_line_numbers(void) const {
+  return this->numberOfLineNumbers_;
+}
+
+uint32_t Section::characteristics(void) const {
+  return this->characteristics_;
+}
+
+
+const std::set<SECTION_TYPES>& Section::types(void) const {
+  return this->types_;
+}
+
+
+bool Section::is_type(SECTION_TYPES type) const {
+  return this->types_.count(type) != 0;
+}
+
+
+void Section::name(const std::string& name) {
+  if (name.size() > STRUCT_SIZES::NameSize - 1) {
+    throw LIEF::pe_bad_section_name("Name is too big");
+  }
+  this->name_  = name;
+}
+
+bool Section::has_characteristic(SECTION_CHARACTERISTICS c) const {
+  return (this->characteristics_ & static_cast<uint32_t>(c)) > 0;
+}
+
+std::set<SECTION_CHARACTERISTICS> Section::characteristics_list(void) const {
+  std::set<SECTION_CHARACTERISTICS> charac;
+  std::copy_if(
+      std::begin(section_characteristics_array),
+      std::end(section_characteristics_array),
+      std::inserter(charac, std::begin(charac)),
+      std::bind(&Section::has_characteristic, this, std::placeholders::_1));
+
+  return charac;
+}
+
+
+
+void Section::content(const std::vector<uint8_t>& data) {
+  this->content_ = data;
+}
+
+
+void Section::virtual_size(uint32_t virtualSize) {
+  this->virtualSize_ = virtualSize;
+}
+
+
+void Section::pointerto_raw_data(uint32_t pointerToRawData) {
+  this->offset(pointerToRawData);
+}
+
+
+void Section::pointerto_relocation(uint32_t pointerToRelocation) {
+  this->pointerToRelocations_ = pointerToRelocation;
+}
+
+
+void Section::pointerto_line_numbers(uint32_t pointerToLineNumbers) {
+  this->pointerToLineNumbers_ = pointerToLineNumbers;
+}
+
+
+void Section::numberof_relocations(uint16_t numberOfRelocations) {
+  this->numberOfRelocations_ = numberOfRelocations;
+}
+
+
+void Section::numberof_line_numbers(uint16_t numberOfLineNumbers) {
+  this->numberOfLineNumbers_ = numberOfLineNumbers;
+}
+
+void Section::sizeof_raw_data(uint32_t sizeOfRawData) {
+  this->size(sizeOfRawData);
+}
+
+
+void Section::type(SECTION_TYPES type) {
+  this->types_ = {type};
+}
+
+
+void Section::remove_type(SECTION_TYPES type) {
+  this->types_.erase(type);
+}
+
+
+void Section::add_type(SECTION_TYPES type) {
+  this->types_.insert(type);
+}
+
+
+void Section::characteristics(uint32_t characteristics) {
+  this->characteristics_ = characteristics;
+}
+
+
+void Section::remove_characteristic(SECTION_CHARACTERISTICS characteristic) {
+  this->characteristics_ &= ~ static_cast<uint32_t>(characteristic);
+}
+
+
+void Section::add_characteristic(SECTION_CHARACTERISTICS characteristic) {
+  this->characteristics_ |= static_cast<uint32_t>(characteristic);
+}
+
+void Section::accept(LIEF::Visitor& visitor) const {
+
+  LIEF::Section::accept(visitor);
+
+  visitor.visit(this->sizeof_raw_data());
+  visitor.visit(this->virtual_size());
+  visitor.visit(this->virtual_address());
+  visitor.visit(this->pointerto_raw_data());
+  visitor.visit(this->pointerto_relocation());
+  visitor.visit(this->pointerto_line_numbers());
+  visitor.visit(this->numberof_relocations());
+  visitor.visit(this->numberof_line_numbers());
+  visitor.visit(this->characteristics());
+  visitor.visit(this->content());
+}
+
+bool Section::operator==(const Section& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Section::operator!=(const Section& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const Section& section) {
+  const auto& chara = section.characteristics_list();
+
+  std::string chara_str = std::accumulate(
+     std::begin(chara),
+     std::end(chara), std::string{},
+     [] (const std::string& a, SECTION_CHARACTERISTICS b) {
+         return a.empty() ?
+         to_string(b) :
+         a + " - " + to_string(b);
+     });
+  os << std::hex;
+  os << std::left
+     << std::setw(10) << section.name()
+     << std::setw(10) << section.virtual_size()
+     << std::setw(10) << section.virtual_address()
+     << std::setw(10) << section.size()
+     << std::setw(10) << section.offset()
+     << std::setw(10) << section.pointerto_relocation()
+     << std::setw(10) << section.entropy()
+     << std::setw(10) << chara_str;
+
+  return os;
+}
+
+}
+}
diff --git a/src/PE/Symbol.cpp b/src/PE/Symbol.cpp
new file mode 100644
index 0000000..f7fb4f1
--- /dev/null
+++ b/src/PE/Symbol.cpp
@@ -0,0 +1,192 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+#include <algorithm>
+#include <iostream>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/Symbol.hpp"
+#include "LIEF/PE/EnumToString.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Symbol::Symbol(void) :
+  value_{0},
+  section_number_{0},
+  type_{0},
+  storage_class_{SYMBOL_STORAGE_CLASS::IMAGE_SYM_CLASS_INVALID},
+  numberof_aux_symbols_{0},
+  section_{nullptr}
+{}
+
+Symbol::~Symbol(void) = default;
+
+Symbol::Symbol(const Symbol& other) :
+  LIEF::Symbol{other},
+  value_{other.value_},
+  section_number_{other.section_number_},
+  type_{other.type_},
+  storage_class_{other.storage_class_},
+  numberof_aux_symbols_{other.numberof_aux_symbols_},
+  section_{nullptr}
+{}
+
+
+Symbol& Symbol::operator=(Symbol other) {
+  this->swap(other);
+  return *this;
+}
+
+void Symbol::swap(Symbol& other) {
+  std::swap(this->value_,                 other.value_);
+  std::swap(this->section_number_,        other.section_number_);
+  std::swap(this->type_,                  other.type_);
+  std::swap(this->storage_class_,         other.storage_class_);
+  std::swap(this->numberof_aux_symbols_,  other.numberof_aux_symbols_);
+  std::swap(this->section_,               other.section_);
+}
+
+Symbol::Symbol(const pe_symbol* header) :
+  value_(header->Value),
+  section_number_(header->SectionNumber),
+  type_(header->Type),
+  storage_class_(static_cast<SYMBOL_STORAGE_CLASS>(header->StorageClass)),
+  numberof_aux_symbols_(header->NumberOfAuxSymbols),
+  section_{nullptr}
+{}
+
+
+uint32_t Symbol::value(void) const {
+  return this->value_;
+}
+
+int16_t Symbol::section_number(void) const {
+  return this->section_number_;
+}
+
+uint16_t Symbol::type(void) const {
+  return this->type_;
+}
+
+SYMBOL_BASE_TYPES Symbol::base_type(void) const {
+  return static_cast<SYMBOL_BASE_TYPES>(this->type_ & 0x0F);
+}
+
+SYMBOL_COMPLEX_TYPES Symbol::complex_type(void) const {
+  return static_cast<SYMBOL_COMPLEX_TYPES>((this->type_ >> 4) & 0x0F);
+}
+
+
+SYMBOL_STORAGE_CLASS Symbol::storage_class(void) const {
+  return this->storage_class_;
+}
+
+
+uint8_t Symbol::numberof_aux_symbols(void) const {
+  return this->numberof_aux_symbols_;
+}
+
+
+std::wstring Symbol::wname(void) const {
+  return {std::begin(this->name_), std::end(this->name_)};
+}
+
+
+const Section& Symbol::section(void) const {
+  if (this->section_ != nullptr) {
+    return *(this->section_);
+  } else {
+    throw not_found("No section associated with this symbol");
+  }
+}
+
+Section& Symbol::section(void) {
+  return const_cast<Section&>(static_cast<const Symbol*>(this)->section());
+}
+
+void Symbol::accept(LIEF::Visitor& visitor) const {
+
+  LIEF::Symbol::accept(visitor);
+
+  visitor.visit(this->value());
+  visitor.visit(this->section_number());
+  visitor.visit(this->type());
+  visitor.visit(this->base_type());
+  visitor.visit(this->complex_type());
+  visitor.visit(this->storage_class());
+  visitor.visit(this->numberof_aux_symbols());
+  try {
+    visitor(this->section());
+  } catch (const not_found&) {
+  }
+}
+
+bool Symbol::operator==(const Symbol& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool Symbol::operator!=(const Symbol& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const Symbol& entry) {
+  std::string section_number_str = "";
+  if (entry.section_number() <= 0) {
+    section_number_str = to_string(
+        static_cast<SYMBOL_SECTION_NUMBER>(entry.section_number()));
+  } else {
+    try {
+      section_number_str = entry.section().name();
+    } catch (const not_found&) {
+      section_number_str = std::to_string(static_cast<uint32_t>(entry.section_number())); // section
+    }
+  }
+
+  std::string name = entry.name();
+  // UTF8 -> ASCII
+  std::transform(
+      std::begin(name),
+      std::end(name),
+      std::begin(name),
+      [] (char c) {
+        return (c <= '~' and c >= '!') ? c : ' ';
+      });
+
+  if (name.size() > 20) {
+    name = name.substr(0, 17) + "...";
+  }
+
+
+  os << std::hex;
+  os << std::left
+     << std::setw(30) << name
+     << std::setw(10) << entry.value()
+     << std::setw(20) << section_number_str
+     << std::setw(10) << to_string(entry.base_type())
+     << std::setw(10) << to_string(entry.complex_type())
+     << std::setw(10) << to_string(entry.storage_class());
+
+  return os;
+}
+
+}
+}
diff --git a/src/PE/TLS.cpp b/src/PE/TLS.cpp
new file mode 100644
index 0000000..676762a
--- /dev/null
+++ b/src/PE/TLS.cpp
@@ -0,0 +1,246 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/visitors/Hash.hpp"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/TLS.hpp"
+
+namespace LIEF {
+namespace PE {
+
+TLS::~TLS(void) = default;
+
+TLS::TLS(void) :
+  callbacks_{},
+  VAOfRawData_{std::make_pair<uint64_t>(0, 0)},
+  addressof_index_{0},
+  addressof_callbacks_{0},
+  sizeof_zero_fill_{0},
+  characteristics_{0},
+  directory_{nullptr},
+  section_{nullptr},
+  data_template_{}
+{}
+
+TLS::TLS(const TLS& copy) :
+  Visitable{copy},
+  callbacks_{copy.callbacks_},
+  VAOfRawData_{copy.VAOfRawData_},
+  addressof_index_{copy.addressof_index_},
+  addressof_callbacks_{copy.addressof_callbacks_},
+  sizeof_zero_fill_{copy.sizeof_zero_fill_},
+  characteristics_{copy.characteristics_},
+  directory_{nullptr},
+  section_{nullptr},
+  data_template_{copy.data_template_}
+{}
+
+TLS& TLS::operator=(TLS copy) {
+  this->swap(copy);
+  return *this;
+}
+
+void TLS::swap(TLS& other) {
+  std::swap(this->callbacks_,           other.callbacks_);
+  std::swap(this->VAOfRawData_,         other.VAOfRawData_);
+  std::swap(this->addressof_index_,     other.addressof_index_);
+  std::swap(this->addressof_callbacks_, other.addressof_callbacks_);
+  std::swap(this->sizeof_zero_fill_,    other.sizeof_zero_fill_);
+  std::swap(this->characteristics_,     other.characteristics_);
+  std::swap(this->directory_,           other.directory_);
+  std::swap(this->section_,             other.section_);
+  std::swap(this->data_template_,       other.data_template_);
+}
+
+TLS::TLS(const pe32_tls *header) :
+  callbacks_{},
+  VAOfRawData_{header->RawDataStartVA, header->RawDataEndVA},
+  addressof_index_{header->AddressOfIndex},
+  addressof_callbacks_{header->AddressOfCallback},
+  sizeof_zero_fill_{header->SizeOfZeroFill},
+  characteristics_{header->Characteristics},
+  directory_{nullptr},
+  section_{nullptr},
+  data_template_{}
+{}
+
+
+TLS::TLS(const pe64_tls *header) :
+  callbacks_{},
+  VAOfRawData_{header->RawDataStartVA, header->RawDataEndVA},
+  addressof_index_{header->AddressOfIndex},
+  addressof_callbacks_{header->AddressOfCallback},
+  sizeof_zero_fill_{header->SizeOfZeroFill},
+  characteristics_{header->Characteristics},
+  directory_{nullptr},
+  section_{nullptr},
+  data_template_{}
+{}
+
+const std::vector<uint64_t>& TLS::callbacks(void) const {
+  return this->callbacks_;
+}
+
+
+std::pair<uint64_t, uint64_t> TLS::addressof_raw_data(void) const {
+  return this->VAOfRawData_;
+}
+
+uint64_t TLS::addressof_index(void) const {
+  return this->addressof_index_;
+}
+
+
+uint64_t TLS::addressof_callbacks(void) const {
+  return this->addressof_callbacks_;
+}
+
+
+uint32_t TLS::sizeof_zero_fill(void) const {
+  return this->sizeof_zero_fill_;
+}
+
+
+uint32_t TLS::characteristics(void) const {
+  return this->characteristics_;
+}
+
+
+const DataDirectory& TLS::directory(void) const {
+  if (this->directory_ != nullptr) {
+    return *(this->directory_);
+  } else {
+    throw not_found("There is no directory associated with TLS");
+  }
+}
+
+DataDirectory& TLS::directory(void) {
+  return const_cast<DataDirectory&>(static_cast<const TLS*>(this)->directory());
+}
+
+
+const Section& TLS::section(void) const {
+  if (this->section_ != nullptr) {
+    return *(this->section_);
+  } else {
+    throw not_found("There is no section associated with TLS");
+  }
+}
+
+Section& TLS::section(void) {
+  return const_cast<Section&>(static_cast<const TLS*>(this)->section());
+}
+
+
+const std::vector<uint8_t>& TLS::data_template(void) const {
+  return this->data_template_;
+}
+
+
+void TLS::callbacks(const std::vector<uint64_t>& callbacks) {
+  this->callbacks_ = callbacks;
+}
+
+
+void TLS::addressof_raw_data(std::pair<uint64_t, uint64_t> VAOfRawData) {
+  this->VAOfRawData_ = VAOfRawData;
+}
+
+
+void TLS::addressof_index(uint64_t addressOfIndex) {
+  this->addressof_index_ = addressOfIndex;
+}
+
+
+void TLS::addressof_callbacks(uint64_t addressOfCallbacks) {
+  this->addressof_callbacks_ = addressOfCallbacks;
+}
+
+
+void TLS::sizeof_zero_fill(uint32_t sizeOfZeroFill) {
+  this->sizeof_zero_fill_ = sizeOfZeroFill;
+}
+
+
+void TLS::characteristics(uint32_t characteristics) {
+  this->characteristics_ = characteristics;
+}
+
+
+void TLS::data_template(const std::vector<uint8_t>& dataTemplate) {
+  this->data_template_ = dataTemplate;
+}
+
+
+void TLS::accept(LIEF::Visitor& visitor) const {
+  visitor.visit(this->addressof_raw_data().first);
+  visitor.visit(this->addressof_raw_data().second);
+  visitor.visit(this->addressof_index());
+  visitor.visit(this->addressof_callbacks());
+  visitor.visit(this->sizeof_zero_fill());
+  visitor.visit(this->characteristics());
+  visitor.visit(this->data_template());
+
+  try {
+    visitor(this->section());
+  } catch (const not_found&) {
+  }
+
+  try {
+    visitor(this->directory());
+  } catch (const not_found&) {
+  }
+
+  for (uint64_t callback : this->callbacks()) {
+    visitor.visit(callback);
+  }
+}
+
+bool TLS::operator==(const TLS& rhs) const {
+  size_t hash_lhs = Hash::hash(*this);
+  size_t hash_rhs = Hash::hash(rhs);
+  return hash_lhs == hash_rhs;
+}
+
+bool TLS::operator!=(const TLS& rhs) const {
+  return not (*this == rhs);
+}
+
+
+std::ostream& operator<<(std::ostream& os, const TLS& entry) {
+  os << std::hex;
+  os << std::setw(40) << std::left << std::setfill(' ') << "Address Of Index: "                     << entry.addressof_index()        << std::endl;
+  os << std::setw(40) << std::left << std::setfill(' ') << "Address Of Callbacks: "                 << entry.addressof_callbacks()    << std::endl;
+
+  for (auto& value : entry.callbacks_) {
+    os << "\t - " << value << std::endl;
+  }
+
+  os << std::setw(40) << std::left << std::setfill(' ') << "Virtual Address of RawData (start): "   << entry.VAOfRawData_.first     << std::endl;
+  os << std::setw(40) << std::left << std::setfill(' ') << "Virtual Address of RawData (end): "     << entry.VAOfRawData_.second    << std::endl;
+  os << std::setw(40) << std::left << std::setfill(' ') << "Size Of Zero Fill: "                    << entry.sizeof_zero_fill()        << std::endl;
+
+  if (entry.section_ != nullptr) {
+    os << std::setw(40) << std::left << std::setfill(' ') << "Associated section: "                 << entry.section_->name() << std::endl;
+  }
+  return os;
+}
+
+} // namespace PE
+} // namespace LIEF
+
diff --git a/src/PE/pkcs7.h b/src/PE/pkcs7.h
new file mode 100644
index 0000000..12206a3
--- /dev/null
+++ b/src/PE/pkcs7.h
@@ -0,0 +1,40 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PKCS7_H_
+#define LIEF_PKCS7_H_
+
+#include "mbedtls/oid.h"
+
+#define MBEDTLS_OID_PKCS7 MBEDTLS_OID_PKCS "\x07" /**< pkcs-7 OBJECT IDENTIFIER ::= { iso(1) member-body(2) US(840) rsadsi(113549) pkcs(1) 7 } */
+
+/*
+ * PKCS#7 OIDs
+ */
+#define MBEDTLS_OID_PKCS7_DATA                      MBEDTLS_OID_PKCS7 "\x01" /**< data OBJECT IDENTIFIER ::= { pkcs-7 1 } */
+#define MBEDTLS_OID_PKCS7_SIGNED_DATA               MBEDTLS_OID_PKCS7 "\x02" /**< signedData OBJECT IDENTIFIER ::= { pkcs-7 2 } */
+#define MBEDTLS_OID_PKCS7_ENVELOPED_DATA            MBEDTLS_OID_PKCS7 "\x03" /**< data OBJECT IDENTIFIER ::= { pkcs-7 1 } */
+#define MBEDTLS_OID_PKCS7_SIGNED_AND_ENVELOPED_DATA MBEDTLS_OID_PKCS7 "\x04" /**< data OBJECT IDENTIFIER ::= { pkcs-7 1 } */
+#define MBEDTLS_OID_PKCS7_DIGESTED_DATA             MBEDTLS_OID_PKCS7 "\x05" /**< data OBJECT IDENTIFIER ::= { pkcs-7 1 } */
+#define MBEDTLS_OID_PKCS7_ENCRYPTED_DATA            MBEDTLS_OID_PKCS7 "\x06" /**< data OBJECT IDENTIFIER ::= { pkcs-7 1 } */
+
+
+/*
+ * PE Authenticode OID
+ */
+#define MBEDTLS_SPC_INDIRECT_DATA_OBJID "\x2B\x06\x01\x04\x01\x82\x37\x02\x01\x04"
+//#define MBEDTLS_SPC_PE_IMAGE_DATAOBJ    "\x2B\x06\x01\x04\x01\x82\x37\x02\x01\x04"
+
+#endif
diff --git a/src/PE/signature/AuthenticatedAttributes.cpp b/src/PE/signature/AuthenticatedAttributes.cpp
new file mode 100644
index 0000000..1303759
--- /dev/null
+++ b/src/PE/signature/AuthenticatedAttributes.cpp
@@ -0,0 +1,59 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+#include "LIEF/PE/utils.hpp"
+#include "LIEF/PE/signature/AuthenticatedAttributes.hpp"
+
+namespace LIEF {
+namespace PE {
+
+AuthenticatedAttributes::AuthenticatedAttributes(void) = default;
+AuthenticatedAttributes::AuthenticatedAttributes(const AuthenticatedAttributes&) = default;
+AuthenticatedAttributes& AuthenticatedAttributes::operator=(const AuthenticatedAttributes&) = default;
+AuthenticatedAttributes::~AuthenticatedAttributes(void) = default;
+
+
+const oid_t& AuthenticatedAttributes::content_type(void) const {
+  return this->content_type_;
+}
+
+const std::vector<uint8_t>& AuthenticatedAttributes::message_digest(void) const {
+  return this->message_digest_;
+}
+
+const std::u16string& AuthenticatedAttributes::program_name(void) const {
+  return this->program_name_;
+}
+
+const std::string& AuthenticatedAttributes::more_info(void) const {
+  return this->more_info_;
+}
+
+void AuthenticatedAttributes::accept(Visitor& visitor) const {
+}
+
+std::ostream& operator<<(std::ostream& os, const AuthenticatedAttributes& authenticated_attributes) {
+  constexpr uint8_t wsize = 30;
+  os << std::hex << std::left;
+  os << std::setw(wsize) << std::setfill(' ') << "Content type: " << authenticated_attributes.content_type()          << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Program name: " << u16tou8(authenticated_attributes.program_name()) << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "URL : "         << authenticated_attributes.more_info()             << std::endl;
+
+  return os;
+}
+
+}
+}
diff --git a/src/PE/signature/ContentInfo.cpp b/src/PE/signature/ContentInfo.cpp
new file mode 100644
index 0000000..8f9ee90
--- /dev/null
+++ b/src/PE/signature/ContentInfo.cpp
@@ -0,0 +1,64 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/PE/signature/OIDToString.hpp"
+#include "LIEF/PE/signature/ContentInfo.hpp"
+
+namespace LIEF {
+namespace PE {
+
+ContentInfo::ContentInfo(void) = default;
+ContentInfo::ContentInfo(const ContentInfo&) = default;
+ContentInfo& ContentInfo::operator=(const ContentInfo&) = default;
+ContentInfo::~ContentInfo(void) = default;
+
+const oid_t& ContentInfo::content_type(void) const {
+  return this->content_type_;
+}
+
+const oid_t& ContentInfo::type(void) const {
+  return this->type_;
+}
+
+
+const oid_t& ContentInfo::digest_algorithm(void) const {
+  return this->digest_algorithm_;
+}
+
+
+const std::vector<uint8_t>& ContentInfo::digest(void) const {
+  return this->digest_;
+}
+
+
+void ContentInfo::accept(Visitor& visitor) const {
+}
+
+
+std::ostream& operator<<(std::ostream& os, const ContentInfo& content_info) {
+  constexpr uint8_t wsize = 30;
+
+  os << std::hex << std::left;
+  os << std::setw(wsize) << std::setfill(' ') << "Content Type: "     << oid_to_string(content_info.content_type()) << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Type: "             << oid_to_string(content_info.type())         << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Digest Algorithm: " << oid_to_string(content_info.digest_algorithm()) << std::endl;
+
+  return os;
+}
+
+}
+}
diff --git a/src/PE/signature/OIDToString.cpp b/src/PE/signature/OIDToString.cpp
new file mode 100644
index 0000000..039a996
--- /dev/null
+++ b/src/PE/signature/OIDToString.cpp
@@ -0,0 +1,2250 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <map>
+
+#include "LIEF/PE/signature/OIDToString.hpp"
+
+namespace LIEF {
+namespace PE {
+const char* oid_to_string(const oid_t& oid) {
+  const std::map<oid_t, const char*> oid_to_str  {
+    { "0.2.262.1.10",                     "TELESEC" },
+    { "0.2.262.1.10.0",                   "EXTENSION" },
+    { "0.2.262.1.10.1",                   "MECHANISM" },
+    { "0.2.262.1.10.1.0",                 "AUTHENTICATION" },
+    { "0.2.262.1.10.1.0.1",               "PASSWORD_AUTHENTICATION" },
+    { "0.2.262.1.10.1.0.2",               "PROTECTED_PASSWORD_AUTHENTICATION" },
+    { "0.2.262.1.10.1.0.3",               "ONE_WAY_X509_AUTHENTICATION" },
+    { "0.2.262.1.10.1.0.4",               "TWO_WAY_X509_AUTHENTICATION" },
+    { "0.2.262.1.10.1.0.5",               "THREE_WAY_X509_AUTHENTICATION" },
+    { "0.2.262.1.10.1.0.6",               "ONE_WAY_ISO9798_AUTHENTICATION" },
+    { "0.2.262.1.10.1.0.7",               "TWO_WAY_ISO9798_AUTHENTICATION" },
+    { "0.2.262.1.10.1.0.8",               "TELEKOM_AUTHENTICATION" },
+    { "0.2.262.1.10.1.1",                 "SIGNATURE" },
+    { "0.2.262.1.10.1.1.1",               "MD4_WITH_RSA_AND_ISO9697" },
+    { "0.2.262.1.10.1.1.2",               "MD4_WITH_RSA_AND_TELESEC_SIGNATURE_STANDARD" },
+    { "0.2.262.1.10.1.1.3",               "MD5_WITH_RSA_AND_ISO9697" },
+    { "0.2.262.1.10.1.1.4",               "MD5_WITH_RSA_AND_TELESEC_SIGNATURE_STANDARD" },
+    { "0.2.262.1.10.1.1.5",               "RIPEMD160_WITH_RSA_AND_TELEKOM_SIGNATURE_STANDARD" },
+    { "0.2.262.1.10.1.1.9",               "HBCI_RSA_SIGNATURE" },
+    { "0.2.262.1.10.1.2",                 "ENCRYPTION" },
+    { "0.2.262.1.10.1.2.0",               "NONE" },
+    { "0.2.262.1.10.1.2.1",               "RSA_TELESEC" },
+    { "0.2.262.1.10.1.2.2",               "DES" },
+    { "0.2.262.1.10.1.2.2.1",             "DES_ECB" },
+    { "0.2.262.1.10.1.2.2.2",             "DES_CBC" },
+    { "0.2.262.1.10.1.2.2.3",             "DES_OFB" },
+    { "0.2.262.1.10.1.2.2.4",             "DES_CFB8" },
+    { "0.2.262.1.10.1.2.2.5",             "DES_CFB64" },
+    { "0.2.262.1.10.1.2.3",               "DES3" },
+    { "0.2.262.1.10.1.2.3.1",             "DES3_ECB" },
+    { "0.2.262.1.10.1.2.3.2",             "DES3_CBC" },
+    { "0.2.262.1.10.1.2.3.3",             "DES3_OFB" },
+    { "0.2.262.1.10.1.2.3.4",             "DES3_CFB8" },
+    { "0.2.262.1.10.1.2.3.5",             "DES3_CFB64" },
+    { "0.2.262.1.10.1.2.4",               "MAGENTA" },
+    { "0.2.262.1.10.1.2.5",               "IDEA" },
+    { "0.2.262.1.10.1.2.5.1",             "IDEA_ECB" },
+    { "0.2.262.1.10.1.2.5.2",             "IDEA_CBC" },
+    { "0.2.262.1.10.1.2.5.3",             "IDEA_OFB" },
+    { "0.2.262.1.10.1.2.5.4",             "IDEA_CFB8" },
+    { "0.2.262.1.10.1.2.5.5",             "IDEA_CFB64" },
+    { "0.2.262.1.10.1.3",                 "ONE_WAY_FUNCTION" },
+    { "0.2.262.1.10.1.3.1",               "MD4" },
+    { "0.2.262.1.10.1.3.2",               "MD5" },
+    { "0.2.262.1.10.1.3.3",               "SQ_MOD_NX509" },
+    { "0.2.262.1.10.1.3.4",               "SQ_MOD_NISO" },
+    { "0.2.262.1.10.1.3.5",               "RIPEMD128" },
+    { "0.2.262.1.10.1.3.6",               "HASH_USING_BLOCK_CIPHER" },
+    { "0.2.262.1.10.1.3.7",               "MAC" },
+    { "0.2.262.1.10.1.3.8",               "RIPEMD160" },
+    { "0.2.262.1.10.1.4",                 "FEC_FUNCTION" },
+    { "0.2.262.1.10.1.4.1",               "REED_SOLOMON" },
+    { "0.2.262.1.10.2",                   "MODULE" },
+    { "0.2.262.1.10.2.0",                 "ALGORITHMS" },
+    { "0.2.262.1.10.2.1",                 "ATTRIBUTE_TYPES" },
+    { "0.2.262.1.10.2.2",                 "CERTIFICATE_TYPES" },
+    { "0.2.262.1.10.2.3",                 "MESSAGE_TYPES" },
+    { "0.2.262.1.10.2.4",                 "PL_PROTOCOL" },
+    { "0.2.262.1.10.2.5",                 "SME_AND_COMPONENTS_OF_SME" },
+    { "0.2.262.1.10.2.6",                 "FEC" },
+    { "0.2.262.1.10.2.7",                 "USEFUL_DEFINITIONS" },
+    { "0.2.262.1.10.2.8",                 "STEFILES" },
+    { "0.2.262.1.10.2.9",                 "SADMIB" },
+    { "0.2.262.1.10.2.10",                "ELECTRONIC_ORDER" },
+    { "0.2.262.1.10.2.11",                "TELESEC_TTP_ASYMMETRIC_APPLICATION" },
+    { "0.2.262.1.10.2.12",                "TELESEC_TTP_BASIS_APPLICATION" },
+    { "0.2.262.1.10.2.13",                "TELESEC_TTP_MESSAGES" },
+    { "0.2.262.1.10.2.14",                "TELESEC_TTP_TIME_STAMP_APPLICATION" },
+    { "0.2.262.1.10.3",                   "OBJECT_CLASS" },
+    { "0.2.262.1.10.3.0",                 "TELESEC_OTHER_NAME" },
+    { "0.2.262.1.10.3.1",                 "DIRECTORY" },
+    { "0.2.262.1.10.3.2",                 "DIRECTORY_TYPE" },
+    { "0.2.262.1.10.3.3",                 "DIRECTORY_GROUP" },
+    { "0.2.262.1.10.3.4",                 "DIRECTORY_USER" },
+    { "0.2.262.1.10.3.5",                 "SYMMETRIC_KEY_ENTRY" },
+    { "0.2.262.1.10.4",                   "PACKAGE" },
+    { "0.2.262.1.10.5",                   "PARAMETER" },
+    { "0.2.262.1.10.6",                   "NAME_BINDING" },
+    { "0.2.262.1.10.7",                   "ATTRIBUTE" },
+    { "0.2.262.1.10.7.0",                 "APPLICATION_GROUP_IDENTIFIER" },
+    { "0.2.262.1.10.7.1",                 "CERTIFICATE_TYPE" },
+    { "0.2.262.1.10.7.2",                 "TELESEC_CERTIFICATE" },
+    { "0.2.262.1.10.7.3",                 "CERTIFICATE_NUMBER" },
+    { "0.2.262.1.10.7.4",                 "CERTIFICATE_REVOCATION_LIST" },
+    { "0.2.262.1.10.7.5",                 "CREATION_DATE" },
+    { "0.2.262.1.10.7.6",                 "ISSUER" },
+    { "0.2.262.1.10.7.7",                 "NAMING_AUTHORITY" },
+    { "0.2.262.1.10.7.8",                 "PUBLIC_KEY_DIRECTORY" },
+    { "0.2.262.1.10.7.9",                 "SECURITY_DOMAIN" },
+    { "0.2.262.1.10.7.10",                "SUBJECT" },
+    { "0.2.262.1.10.7.11",                "TIME_OF_REVOCATION" },
+    { "0.2.262.1.10.7.12",                "USER_GROUP_REFERENCE" },
+    { "0.2.262.1.10.7.13",                "VALIDITY" },
+    { "0.2.262.1.10.7.14",                "ZERT93" },
+    { "0.2.262.1.10.7.15",                "SECURITY_MESS_ENV" },
+    { "0.2.262.1.10.7.16",                "ANONYMIZED_PUBLIC_KEY_DIRECTORY" },
+    { "0.2.262.1.10.7.17",                "TELESEC_GIVEN_NAME" },
+    { "0.2.262.1.10.7.18",                "NAME_ADDITIONS" },
+    { "0.2.262.1.10.7.19",                "TELESEC_POSTAL_CODE" },
+    { "0.2.262.1.10.7.20",                "NAME_DISTINGUISHER" },
+    { "0.2.262.1.10.7.21",                "TELESEC_CERTIFICATE_LIST" },
+    { "0.2.262.1.10.7.22",                "TELETRUST_CERTIFICATE_LIST" },
+    { "0.2.262.1.10.7.23",                "X509_CERTIFICATE_LIST" },
+    { "0.2.262.1.10.7.24",                "TIME_OF_ISSUE" },
+    { "0.2.262.1.10.7.25",                "PHYSICAL_CARD_NUMBER" },
+    { "0.2.262.1.10.7.26",                "FILE_TYPE" },
+    { "0.2.262.1.10.7.27",                "CTL_FILE_IS_ARCHIVE" },
+    { "0.2.262.1.10.7.28",                "EMAIL_ADDRESS" },
+    { "0.2.262.1.10.7.29",                "CERTIFICATE_TEMPLATE_LIST" },
+    { "0.2.262.1.10.7.30",                "DIRECTORY_NAME" },
+    { "0.2.262.1.10.7.31",                "DIRECTORY_TYPE_NAME" },
+    { "0.2.262.1.10.7.32",                "DIRECTORY_GROUP_NAME" },
+    { "0.2.262.1.10.7.33",                "DIRECTORY_USER_NAME" },
+    { "0.2.262.1.10.7.34",                "REVOCATION_FLAG" },
+    { "0.2.262.1.10.7.35",                "SYMMETRIC_KEY_ENTRY_NAME" },
+    { "0.2.262.1.10.7.36",                "GL_NUMBER" },
+    { "0.2.262.1.10.7.37",                "GO_NUMBER" },
+    { "0.2.262.1.10.7.38",                "G_KEY_DATA" },
+    { "0.2.262.1.10.7.39",                "Z_KEY_DATA" },
+    { "0.2.262.1.10.7.40",                "KT_KEY_DATA" },
+    { "0.2.262.1.10.7.41",                "KT_KEY_NUMBER" },
+    { "0.2.262.1.10.7.51",                "TIME_OF_REVOCATION_GEN" },
+    { "0.2.262.1.10.7.52",                "LIABILITY_TEXT" },
+    { "0.2.262.1.10.8",                   "ATTRIBUTE_GROUP" },
+    { "0.2.262.1.10.9",                   "ACTION" },
+    { "0.2.262.1.10.10",                  "NOTIFICATION" },
+    { "0.2.262.1.10.11",                  "SNMP_MIBS" },
+    { "0.2.262.1.10.11.1",                "SECURITY_APPLICATION" },
+    { "0.2.262.1.10.12",                  "CERT_AND_CRL_EXTENSION_DEFINITIONS" },
+    { "0.2.262.1.10.12.0",                "LIABILITY_LIMITATION_FLAG" },
+    { "0.2.262.1.10.12.1",                "TELESEC_CERT_ID_EXT" },
+    { "0.2.262.1.10.12.2",                "TELESEC_POLICY_IDENTIFIER" },
+    { "0.2.262.1.10.12.3",                "TELESEC_POLICY_QUALIFIER_ID" },
+    { "0.2.262.1.10.12.4",                "TELESEC_CRL_FILTERED_EXT" },
+    { "0.2.262.1.10.12.5",                "TELESEC_CRL_FILTER_EXT" },
+    { "0.2.262.1.10.12.6",                "TELESEC_NAMING_AUTHORITY_EXT" },
+    { "0.4.0.127.0.7",                    "BSI" },
+    { "0.4.0.127.0.7.1",                  "BSI_ECC" },
+    { "0.4.0.127.0.7.1.1",                "BSIFIELD_TYPE" },
+    { "0.4.0.127.0.7.1.1.1",              "BSI_PRIME_FIELD" },
+    { "0.4.0.127.0.7.1.1.2",              "BSI_CHARACTERISTIC_TWO_FIELD" },
+    { "0.4.0.127.0.7.1.1.2.2",            "BSI_ECTLV_KEY_FORMAT" },
+    { "0.4.0.127.0.7.1.1.2.2.1",          "BSI_ECTLV_PUBLIC_KEY" },
+    { "0.4.0.127.0.7.1.1.2.3",            "BSI_CHARACTERISTIC_TWO_BASIS" },
+    { "0.4.0.127.0.7.1.1.2.3.1",          "BSI_GN_BASIS" },
+    { "0.4.0.127.0.7.1.1.2.3.2",          "BSI_TP_BASIS" },
+    { "0.4.0.127.0.7.1.1.2.3.3",          "BSI_PP_BASIS" },
+    { "0.4.0.127.0.7.1.1.4.1",            "BSI_ECDSA_SIGNATURES" },
+    { "0.4.0.127.0.7.1.1.4.1.1",          "BSI_ECDSA_WITH_SHA1" },
+    { "0.4.0.127.0.7.1.1.4.1.2",          "BSI_ECDSA_WITH_SHA224" },
+    { "0.4.0.127.0.7.1.1.4.1.3",          "BSI_ECDSA_WITH_SHA256" },
+    { "0.4.0.127.0.7.1.1.4.1.4",          "BSI_ECDSA_WITH_SHA384" },
+    { "0.4.0.127.0.7.1.1.4.1.5",          "BSI_ECDSA_WITH_SHA512" },
+    { "0.4.0.127.0.7.1.1.4.1.6",          "BSI_ECDSA_WITH_RIPEMD160" },
+    { "0.4.0.127.0.7.1.1.5.1.1",          "BSI_ECKA_EG_X963_KDF" },
+    { "0.4.0.127.0.7.1.1.5.1.1.1",        "BSI_ECKA_EG_X963_KDF_WITH_SHA1" },
+    { "0.4.0.127.0.7.1.1.5.1.1.2",        "BSI_ECKA_EG_X963_KDF_WITH_SHA224" },
+    { "0.4.0.127.0.7.1.1.5.1.1.3",        "BSI_ECKA_EG_X963_KDF_WITH_SHA256" },
+    { "0.4.0.127.0.7.1.1.5.1.1.4",        "BSI_ECKA_EG_X963_KDF_WITH_SHA384" },
+    { "0.4.0.127.0.7.1.1.5.1.1.5",        "BSI_ECKA_EG_X963_KDF_WITH_SHA512" },
+    { "0.4.0.127.0.7.1.1.5.1.1.6",        "BSI_ECKA_EG_X963_KDF_WITH_RIPEMD160" },
+    { "0.4.0.127.0.7.1.1.5.1.2",          "BSI_ECKA_EG_SESSION_KDF" },
+    { "0.4.0.127.0.7.1.1.5.1.2.1",        "BSI_ECKA_EG_SESSION_KDF_WITH3_DES" },
+    { "0.4.0.127.0.7.1.1.5.1.2.2",        "BSI_ECKA_EG_SESSION_KDF_WITH_AES128" },
+    { "0.4.0.127.0.7.1.1.5.1.2.3",        "BSI_ECKA_EG_SESSION_KDF_WITH_AES192" },
+    { "0.4.0.127.0.7.1.1.5.1.2.4",        "BSI_ECKA_EG_SESSION_KDF_WITH_AES256" },
+    { "0.4.0.127.0.7.1.1.5.2",            "BSI_ECKA_DH" },
+    { "0.4.0.127.0.7.1.1.5.2.1",          "BSI_ECKA_DHX963_KDF" },
+    { "0.4.0.127.0.7.1.1.5.2.1.1",        "BSI_ECKA_DHX963_KDF_WITH_SHA1" },
+    { "0.4.0.127.0.7.1.1.5.2.1.2",        "BSI_ECKA_DHX963_KDF_WITH_SHA224" },
+    { "0.4.0.127.0.7.1.1.5.2.1.3",        "BSI_ECKA_DHX963_KDF_WITH_SHA256" },
+    { "0.4.0.127.0.7.1.1.5.2.1.4",        "BSI_ECKA_DHX963_KDF_WITH_SHA384" },
+    { "0.4.0.127.0.7.1.1.5.2.1.5",        "BSI_ECKA_DHX963_KDF_WITH_SHA512" },
+    { "0.4.0.127.0.7.1.1.5.2.1.6",        "BSI_ECKA_DHX963_KDF_WITH_RIPEMD160" },
+    { "0.4.0.127.0.7.1.1.5.2.2",          "BSI_ECKA_DH_SESSION_KDF" },
+    { "0.4.0.127.0.7.1.1.5.2.2.1",        "BSI_ECKA_DH_SESSION_KDF_WITH3_DES" },
+    { "0.4.0.127.0.7.1.1.5.2.2.2",        "BSI_ECKA_DH_SESSION_KDF_WITH_AES128" },
+    { "0.4.0.127.0.7.1.1.5.2.2.3",        "BSI_ECKA_DH_SESSION_KDF_WITH_AES192" },
+    { "0.4.0.127.0.7.1.1.5.2.2.4",        "BSI_ECKA_DH_SESSION_KDF_WITH_AES256" },
+    { "0.4.0.127.0.7.1.2",                "BSI_EC_KEY_TYPE" },
+    { "0.4.0.127.0.7.1.2.1",              "BSI_EC_PUBLIC_KEY" },
+    { "0.4.0.127.0.7.1.5.1",              "BSI_KAEG" },
+    { "0.4.0.127.0.7.1.5.1.1",            "BSI_KAEG_WITH_X963_KDF" },
+    { "0.4.0.127.0.7.1.5.1.2",            "BSI_KAEG_WITH3_DESKDF" },
+    { "0.4.0.127.0.7.2.2.1",              "BSI_PK" },
+    { "0.4.0.127.0.7.2.2.1.1",            "BSI_PK_DH" },
+    { "0.4.0.127.0.7.2.2.1.2",            "BSI_PK_ECDH" },
+    { "0.4.0.127.0.7.2.2.2",              "BSI_TA" },
+    { "0.4.0.127.0.7.2.2.2.1",            "BSI_TA_RSA" },
+    { "0.4.0.127.0.7.2.2.2.1.1",          "BSI_TA_RS_AV1_5_SHA1" },
+    { "0.4.0.127.0.7.2.2.2.1.2",          "BSI_TA_RS_AV1_5_SHA256" },
+    { "0.4.0.127.0.7.2.2.2.1.3",          "BSI_TA_RSAPSS_SHA1" },
+    { "0.4.0.127.0.7.2.2.2.1.4",          "BSI_TA_RSAPSS_SHA256" },
+    { "0.4.0.127.0.7.2.2.2.1.5",          "BSI_TA_RS_AV1_5_SHA512" },
+    { "0.4.0.127.0.7.2.2.2.1.6",          "BSI_TA_RSAPSS_SHA512" },
+    { "0.4.0.127.0.7.2.2.2.2",            "BSI_TA_ECDSA" },
+    { "0.4.0.127.0.7.2.2.2.2.1",          "BSI_TA_ECDSA_SHA1" },
+    { "0.4.0.127.0.7.2.2.2.2.2",          "BSI_TA_ECDSA_SHA224" },
+    { "0.4.0.127.0.7.2.2.2.2.3",          "BSI_TA_ECDSA_SHA256" },
+    { "0.4.0.127.0.7.2.2.2.2.4",          "BSI_TA_ECDSA_SHA384" },
+    { "0.4.0.127.0.7.2.2.2.2.5",          "BSI_TA_ECDSA_SHA512" },
+    { "0.4.0.127.0.7.2.2.3",              "BSI_CA" },
+    { "0.4.0.127.0.7.2.2.3.1",            "BSI_CA_DH" },
+    { "0.4.0.127.0.7.2.2.3.1.1",          "BSI_CA_DH_3_DES_CBC_CBC" },
+    { "0.4.0.127.0.7.2.2.3.1.2",          "BSI_CA_DH_AES_CBC_CMAC_128" },
+    { "0.4.0.127.0.7.2.2.3.1.3",          "BSI_CA_DH_AES_CBC_CMAC_192" },
+    { "0.4.0.127.0.7.2.2.3.1.4",          "BSI_CA_DH_AES_CBC_CMAC_256" },
+    { "0.4.0.127.0.7.2.2.3.2",            "BSI_CA_ECDH" },
+    { "0.4.0.127.0.7.2.2.3.2.1",          "BSI_CA_ECDH_3_DES_CBC_CBC" },
+    { "0.4.0.127.0.7.2.2.3.2.2",          "BSI_CA_ECDH_AES_CBC_CMAC_128" },
+    { "0.4.0.127.0.7.2.2.3.2.3",          "BSI_CA_ECDH_AES_CBC_CMAC_192" },
+    { "0.4.0.127.0.7.2.2.3.2.4",          "BSI_CA_ECDH_AES_CBC_CMAC_256" },
+    { "0.4.0.127.0.7.2.2.4",              "BSI_PACE" },
+    { "0.4.0.127.0.7.2.2.4.1",            "BSI_PACE_DH_GM" },
+    { "0.4.0.127.0.7.2.2.4.1.1",          "BSI_PACE_DH_GM_3_DES_CBC_CBC" },
+    { "0.4.0.127.0.7.2.2.4.1.2",          "BSI_PACE_DH_GM_AES_CBC_CMAC_128" },
+    { "0.4.0.127.0.7.2.2.4.1.3",          "BSI_PACE_DH_GM_AES_CBC_CMAC_192" },
+    { "0.4.0.127.0.7.2.2.4.1.4",          "BSI_PACE_DH_GM_AES_CBC_CMAC_256" },
+    { "0.4.0.127.0.7.2.2.4.2",            "BSI_PACE_ECDH_GM" },
+    { "0.4.0.127.0.7.2.2.4.2.1",          "BSI_PACE_ECDH_GM_3_DES_CBC_CBC" },
+    { "0.4.0.127.0.7.2.2.4.2.2",          "BSI_PACE_ECDH_GM_AES_CBC_CMAC_128" },
+    { "0.4.0.127.0.7.2.2.4.2.3",          "BSI_PACE_ECDH_GM_AES_CBC_CMAC_192" },
+    { "0.4.0.127.0.7.2.2.4.2.4",          "BSI_PACE_ECDH_GM_AES_CBC_CMAC_256" },
+    { "0.4.0.127.0.7.2.2.4.3",            "BSI_PACE_DH_IM" },
+    { "0.4.0.127.0.7.2.2.4.3.1",          "BSI_PACE_DH_IM_3_DES_CBC_CBC" },
+    { "0.4.0.127.0.7.2.2.4.3.2",          "BSI_PACE_DH_IM_AES_CBC_CMAC_128" },
+    { "0.4.0.127.0.7.2.2.4.3.3",          "BSI_PACE_DH_IM_AES_CBC_CMAC_192" },
+    { "0.4.0.127.0.7.2.2.4.3.4",          "BSI_PACE_DH_IM_AES_CBC_CMAC_256" },
+    { "0.4.0.127.0.7.2.2.4.4",            "BSI_PACE_ECDH_IM" },
+    { "0.4.0.127.0.7.2.2.4.4.1",          "BSI_PACE_ECDH_IM_3_DES_CBC_CBC" },
+    { "0.4.0.127.0.7.2.2.4.4.2",          "BSI_PACE_ECDH_IM_AES_CBC_CMAC_128" },
+    { "0.4.0.127.0.7.2.2.4.4.3",          "BSI_PACE_ECDH_IM_AES_CBC_CMAC_192" },
+    { "0.4.0.127.0.7.2.2.4.4.4",          "BSI_PACE_ECDH_IM_AES_CBC_CMAC_256" },
+    { "0.4.0.127.0.7.2.2.5",              "BSI_RI" },
+    { "0.4.0.127.0.7.2.2.5.1",            "BSI_RI_DH" },
+    { "0.4.0.127.0.7.2.2.5.1.1",          "BSI_RI_DH_SHA1" },
+    { "0.4.0.127.0.7.2.2.5.1.2",          "BSI_RI_DH_SHA224" },
+    { "0.4.0.127.0.7.2.2.5.1.3",          "BSI_RI_DH_SHA256" },
+    { "0.4.0.127.0.7.2.2.5.1.4",          "BSI_RI_DH_SHA384" },
+    { "0.4.0.127.0.7.2.2.5.1.5",          "BSI_RI_DH_SHA512" },
+    { "0.4.0.127.0.7.2.2.5.2",            "BSI_RI_ECDH" },
+    { "0.4.0.127.0.7.2.2.5.2.1",          "BSI_RI_ECDH_SHA1" },
+    { "0.4.0.127.0.7.2.2.5.2.2",          "BSI_RI_ECDH_SHA224" },
+    { "0.4.0.127.0.7.2.2.5.2.3",          "BSI_RI_ECDH_SHA256" },
+    { "0.4.0.127.0.7.2.2.5.2.4",          "BSI_RI_ECDH_SHA384" },
+    { "0.4.0.127.0.7.2.2.5.2.5",          "BSI_RI_ECDH_SHA512" },
+    { "0.4.0.127.0.7.2.2.6",              "BSI_CARD_INFO" },
+    { "0.4.0.127.0.7.2.2.7",              "BSI_EID_SECURITY" },
+    { "0.4.0.127.0.7.2.2.8",              "BSI_PT" },
+    { "0.4.0.127.0.7.3.1.2",              "BSI_EAC_ROLES" },
+    { "0.4.0.127.0.7.3.1.2.1",            "BSI_EAC_ROLES_IS" },
+    { "0.4.0.127.0.7.3.1.2.2",            "BSI_EAC_ROLES_AT" },
+    { "0.4.0.127.0.7.3.1.2.3",            "BSI_EAC_ROLES_ST" },
+    { "0.4.0.127.0.7.3.1.3",              "BSI_T_AV2CE" },
+    { "0.4.0.127.0.7.3.1.3.1",            "BSI_T_AV2CE_DESCRIPTION" },
+    { "0.4.0.127.0.7.3.1.3.1.1",          "BSI_T_AV2CE_DESCRIPTION_PLAIN_TEXT" },
+    { "0.4.0.127.0.7.3.1.3.1.2",          "BSI_T_AV2CE_DESCRIPTION_IA5_STRING" },
+    { "0.4.0.127.0.7.3.1.3.1.3",          "BSI_T_AV2CE_DESCRIPTION_OCTET_STRING" },
+    { "0.4.0.127.0.7.3.1.3.2",            "BSI_T_AV2CE_TERMINAL_SECTOR" },
+    { "0.4.0.127.0.7.3.1.4",              "BSI_AUX_DATA" },
+    { "0.4.0.127.0.7.3.1.4.1",            "BSI_AUX_DATA_BIRTHDAY" },
+    { "0.4.0.127.0.7.3.1.4.2",            "BSI_AUX_DATA_EXPIRE_DATE" },
+    { "0.4.0.127.0.7.3.1.4.3",            "BSI_AUX_DATA_COMMUNITY_ID" },
+    { "0.4.0.127.0.7.3.1.5",              "BSI_DEFECT_LIST" },
+    { "0.4.0.127.0.7.3.1.5.1",            "BSI_DEFECT_AUTH_DEFECT" },
+    { "0.4.0.127.0.7.3.1.5.1.1",          "BSI_DEFECT_CERT_REVOKED" },
+    { "0.4.0.127.0.7.3.1.5.1.2",          "BSI_DEFECT_CERT_REPLACED" },
+    { "0.4.0.127.0.7.3.1.5.1.3",          "BSI_DEFECT_CHIP_AUTH_KEY_REVOKED" },
+    { "0.4.0.127.0.7.3.1.5.1.4",          "BSI_DEFECT_ACTIVE_AUTH_KEY_REVOKED" },
+    { "0.4.0.127.0.7.3.1.5.2",            "BSI_DEFECT_E_PASSPORT_DEFECT" },
+    { "0.4.0.127.0.7.3.1.5.2.1",          "BSI_DEFECT_E_PASSPORT_DG_MALFORMED" },
+    { "0.4.0.127.0.7.3.1.5.2.2",          "BSI_DEFECT_SOD_INVALID" },
+    { "0.4.0.127.0.7.3.1.5.3",            "BSI_DEFECT_EID_DEFECT" },
+    { "0.4.0.127.0.7.3.1.5.3.1",          "BSI_DEFECT_EIDDG_MALFORMED" },
+    { "0.4.0.127.0.7.3.1.5.3.2",          "BSI_DEFECT_EID_INTEGRITY" },
+    { "0.4.0.127.0.7.3.1.5.4",            "BSI_DEFECT_DOCUMENT_DEFECT" },
+    { "0.4.0.127.0.7.3.1.5.4.1",          "BSI_DEFECT_CARD_SECURITY_MALFORMED" },
+    { "0.4.0.127.0.7.3.1.5.4.2",          "BSI_DEFECT_CHIP_SECURITY_MALFORMED" },
+    { "0.4.0.127.0.7.3.1.5.4.3",          "BSI_DEFECT_POWER_DOWN_REQ" },
+    { "0.4.0.127.0.7.3.1.6",              "BSI_LIST_CONTENT_DESCRIPTION" },
+    { "0.4.0.127.0.7.3.2.1",              "BSI_SECURITY_OBJECT" },
+    { "0.4.0.127.0.7.3.2.2",              "BSI_BLACK_LIST" },
+    { "0.4.0.1862",                       "ETSI_QCS_PROFILE" },
+    { "0.4.0.1862.1",                     "ETSI_QCS" },
+    { "0.4.0.1862.1.1",                   "ETSI_QCS_COMPLIANCE" },
+    { "0.4.0.1862.1.2",                   "ETSI_QCS_LIMIT_VALUE" },
+    { "0.4.0.1862.1.3",                   "ETSI_QCS_RETENTION_PERIOD" },
+    { "0.4.0.1862.1.4",                   "ETSI_QCS_QC_SSCD" },
+    { "0.9.2342.19200300.100.1.1",        "USER_ID" },
+    { "0.9.2342.19200300.100.1.3",        "RFC822_MAILBOX" },
+    { "0.9.2342.19200300.100.1.25",       "DOMAIN_COMPONENT" },
+    { "1.0.10118.3.0.49",                 "RIPEMD160" },
+    { "1.0.10118.3.0.50",                 "RIPEMD128" },
+    { "1.0.10118.3.0.55",                 "WHIRLPOOL" },
+    { "1.2.36.1.3.1.1.1",                 "QGPKI" },
+    { "1.2.36.1.3.1.1.1.1",               "QGPKI_POLICIES" },
+    { "1.2.36.1.3.1.1.1.1.1",             "QGPKI_MED_INTERMED_CA" },
+    { "1.2.36.1.3.1.1.1.1.1.1",           "QGPKI_MED_INTERMED_INDIVIDUAL" },
+    { "1.2.36.1.3.1.1.1.1.1.2",           "QGPKI_MED_INTERMED_DEVICE_CONTROL" },
+    { "1.2.36.1.3.1.1.1.1.1.3",           "QGPKI_MED_INTERMED_DEVICE" },
+    { "1.2.36.1.3.1.1.1.1.1.4",           "QGPKI_MED_INTERMED_AUTHORISED_PARTY" },
+    { "1.2.36.1.3.1.1.1.1.1.5",           "QGPKI_MED_INTERMED_DEVICE_SYSTEM" },
+    { "1.2.36.1.3.1.1.1.1.2",             "QGPKI_MED_ISSUING_CA" },
+    { "1.2.36.1.3.1.1.1.1.2.1",           "QGPKI_MED_ISSUING_INDIVIDUAL" },
+    { "1.2.36.1.3.1.1.1.1.2.2",           "QGPKI_MED_ISSUING_DEVICE_CONTROL" },
+    { "1.2.36.1.3.1.1.1.1.2.3",           "QGPKI_MED_ISSUING_DEVICE" },
+    { "1.2.36.1.3.1.1.1.1.2.4",           "QGPKI_MED_ISSUING_AUTHORISED_PARTY" },
+    { "1.2.36.1.3.1.1.1.1.2.5",           "QGPKI_MED_ISSUING_CLIENT_AUTH" },
+    { "1.2.36.1.3.1.1.1.1.2.6",           "QGPKI_MED_ISSUING_SERVER_AUTH" },
+    { "1.2.36.1.3.1.1.1.1.2.7",           "QGPKI_MED_ISSUING_DATA_PROT" },
+    { "1.2.36.1.3.1.1.1.1.2.8",           "QGPKI_MED_ISSUING_TOKEN_AUTH" },
+    { "1.2.36.1.3.1.1.1.1.3",             "QGPKI_BASIC_INTERMED_CA" },
+    { "1.2.36.1.3.1.1.1.1.3.1",           "QGPKI_BASIC_INTERMED_DEVICE_SYSTEM" },
+    { "1.2.36.1.3.1.1.1.1.4",             "QGPKI_BASIC_ISSUING_CA" },
+    { "1.2.36.1.3.1.1.1.1.4.1",           "QGPKI_BASIC_ISSUING_CLIENT_AUTH" },
+    { "1.2.36.1.3.1.1.1.1.4.2",           "QGPKI_BASIC_ISSUING_SERVER_AUTH" },
+    { "1.2.36.1.3.1.1.1.1.4.3",           "QGPKI_BASIC_ISSUING_DATA_SIGNING" },
+    { "1.2.36.1.3.1.1.1.2",               "QGPKI_ASSURANCE_LEVEL" },
+    { "1.2.36.1.3.1.1.1.2.1",             "QGPKI_ASSURANCE_RUDIMENTARY" },
+    { "1.2.36.1.3.1.1.1.2.2",             "QGPKI_ASSURANCE_BASIC" },
+    { "1.2.36.1.3.1.1.1.2.3",             "QGPKI_ASSURANCE_MEDIUM" },
+    { "1.2.36.1.3.1.1.1.2.4",             "QGPKI_ASSURANCE_HIGH" },
+    { "1.2.36.1.3.1.1.1.3",               "QGPKI_CERT_FUNCTION" },
+    { "1.2.36.1.3.1.1.1.3.1",             "QGPKI_FUNCTION_INDIVIDUAL" },
+    { "1.2.36.1.3.1.1.1.3.2",             "QGPKI_FUNCTION_DEVICE" },
+    { "1.2.36.1.3.1.1.1.3.3",             "QGPKI_FUNCTION_AUTHORISED_PARTY" },
+    { "1.2.36.1.3.1.1.1.3.4",             "QGPKI_FUNCTION_DEVICE_CONTROL" },
+    { "1.2.36.1.3.1.2",                   "QPSPKI" },
+    { "1.2.36.1.3.1.2.1",                 "QPSPKI_POLICIES" },
+    { "1.2.36.1.3.1.2.1.2",               "QPSPKI_POLICY_BASIC" },
+    { "1.2.36.1.3.1.2.1.3",               "QPSPKI_POLICY_MEDIUM" },
+    { "1.2.36.1.3.1.2.1.4",               "QPSPKI_POLICY_HIGH" },
+    { "1.2.36.1.3.1.3.2",                 "QTMRPKI" },
+    { "1.2.36.1.3.1.3.2.1",               "QTMRPKI_POLICIES" },
+    { "1.2.36.1.3.1.3.2.2",               "QTMRPKI_PURPOSE" },
+    { "1.2.36.1.3.1.3.2.2.1",             "QTMRPKI_INDIVIDUAL" },
+    { "1.2.36.1.3.1.3.2.2.2",             "QTMRPKI_DEVICE_CONTROL" },
+    { "1.2.36.1.3.1.3.2.2.3",             "QTMRPKI_DEVICE" },
+    { "1.2.36.1.3.1.3.2.2.4",             "QTMRPKI_AUTHORISED_PARTY" },
+    { "1.2.36.1.3.1.3.2.2.5",             "QTMRPKI_DEVICE_SYSTEM" },
+    { "1.2.36.1.3.1.3.2.3",               "QTMRPKI_DEVICE" },
+    { "1.2.36.1.3.1.3.2.3.1",             "QTMRPKI_DRIVER_LICENSE" },
+    { "1.2.36.1.3.1.3.2.3.2",             "QTMRPKI_INDUSTRY_AUTHORITY" },
+    { "1.2.36.1.3.1.3.2.3.3",             "QTMRPKI_MARINE_LICENSE" },
+    { "1.2.36.1.3.1.3.2.3.4",             "QTMRPKI_ADULT_PROOF_OF_AGE" },
+    { "1.2.36.1.3.1.3.2.3.5",             "QTMRPKI_SAM" },
+    { "1.2.36.1.3.1.3.2.4",               "QTMRPKI_AUTHORISED_PARTY" },
+    { "1.2.36.1.3.1.3.2.4.1",             "QTMRPKI_TRANSPORT_INSPECTOR" },
+    { "1.2.36.1.3.1.3.2.4.2",             "QTMRPKI_POLICE_OFFICER" },
+    { "1.2.36.1.3.1.3.2.4.3",             "QTMRPKI_SYSTEM" },
+    { "1.2.36.1.3.1.3.2.4.4",             "QTMRPKI_LIQUOR_LICENSING_INSPECTOR" },
+    { "1.2.36.1.3.1.3.2.4.5",             "QTMRPKI_MARINE_ENFORCEMENT_OFFICER" },
+    { "1.2.36.1.333.1",                   "AUSTRALIAN_BUSINESS_NUMBER" },
+    { "1.2.36.68980861.1.1.2",            "SIGNET_PERSONAL" },
+    { "1.2.36.68980861.1.1.3",            "SIGNET_BUSINESS" },
+    { "1.2.36.68980861.1.1.4",            "SIGNET_LEGAL" },
+    { "1.2.36.68980861.1.1.10",           "SIGNET_PILOT" },
+    { "1.2.36.68980861.1.1.11",           "SIGNET_INTRA_NET" },
+    { "1.2.36.68980861.1.1.20",           "SIGNET_POLICY" },
+    { "1.2.36.75878867.1.100.1.1",        "CERTIFICATES_AUSTRALIA_POLICY" },
+    { "1.2.392.200011.61.1.1.1",          "MITSUBISHI_SECURITY_ALGORITHM" },
+    { "1.2.392.200011.61.1.1.1.1",        "MISTY1_CBC" },
+    { "1.2.410.200004.1",                 "KISA_ALGORITHM" },
+    { "1.2.410.200004.1.1",               "KCDSA" },
+    { "1.2.410.200004.1.2",               "HAS160" },
+    { "1.2.410.200004.1.3",               "SEED_ECB" },
+    { "1.2.410.200004.1.4",               "SEED_CBC" },
+    { "1.2.410.200004.1.5",               "SEED_OFB" },
+    { "1.2.410.200004.1.6",               "SEED_CFB" },
+    { "1.2.410.200004.1.7",               "SEED_MAC" },
+    { "1.2.410.200004.1.8",               "KCDSA_WITH_HAS160" },
+    { "1.2.410.200004.1.9",               "KCDSA_WITH_SHA1" },
+    { "1.2.410.200004.1.10",              "PBE_WITH_HAS160_AND_SEED_ECB" },
+    { "1.2.410.200004.1.11",              "PBE_WITH_HAS160_AND_SEED_CBC" },
+    { "1.2.410.200004.1.12",              "PBE_WITH_HAS160_AND_SEED_CFB" },
+    { "1.2.410.200004.1.13",              "PBE_WITH_HAS160_AND_SEED_OFB" },
+    { "1.2.410.200004.1.14",              "PBE_WITH_SHA1_AND_SEED_ECB" },
+    { "1.2.410.200004.1.15",              "PBE_WITH_SHA1_AND_SEED_CBC" },
+    { "1.2.410.200004.1.16",              "PBE_WITH_SHA1_AND_SEED_CFB" },
+    { "1.2.410.200004.1.17",              "PBE_WITH_SHA1_AND_SEED_OFB" },
+    { "1.2.410.200004.1.20",              "RSA_WITH_HAS160" },
+    { "1.2.410.200004.1.21",              "KCDSA1" },
+    { "1.2.410.200004.2",                 "NPKI_CP" },
+    { "1.2.410.200004.2.1",               "NPKI_SIGNATURE_POLICY" },
+    { "1.2.410.200004.3",                 "NPKI_KP" },
+    { "1.2.410.200004.4",                 "NPKI_AT" },
+    { "1.2.410.200004.5",                 "NPKI_LCA" },
+    { "1.2.410.200004.5.1",               "NPKI_SIGN_KOREA" },
+    { "1.2.410.200004.5.2",               "NPKI_SIGN_GATE" },
+    { "1.2.410.200004.5.3",               "NPKI_NCA_SIGN" },
+    { "1.2.410.200004.6",                 "NPKI_ON" },
+    { "1.2.410.200004.7",                 "NPKI_APP" },
+    { "1.2.410.200004.7.1",               "NPKI_SMIME" },
+    { "1.2.410.200004.7.1.1",             "NPKI_SMIME_ALGO" },
+    { "1.2.410.200004.7.1.1.1",           "NPKI_CMS_SEED_WRAP" },
+    { "1.2.410.200004.10",                "NPKI" },
+    { "1.2.410.200004.10.1",              "NPKI_ATTRIBUTE" },
+    { "1.2.410.200004.10.1.1",            "NPKI_IDENTIFY_DATA" },
+    { "1.2.410.200004.10.1.1.1",          "NPKI_VID" },
+    { "1.2.410.200004.10.1.1.2",          "NPKI_ENCRYPTED_VID" },
+    { "1.2.410.200004.10.1.1.3",          "NPKI_RANDOM_NUM" },
+    { "1.2.410.200004.10.1.1.4",          "NPKI_VID" },
+    { "1.2.410.200046.1.1",               "ARIA1_ALGORITHM_MODES" },
+    { "1.2.410.200046.1.1.1",             "ARIA128_ECB" },
+    { "1.2.410.200046.1.1.2",             "ARIA128_CBC" },
+    { "1.2.410.200046.1.1.3",             "ARIA128_CFB" },
+    { "1.2.410.200046.1.1.4",             "ARIA128_OFB" },
+    { "1.2.410.200046.1.1.5",             "ARIA128_CTR" },
+    { "1.2.410.200046.1.1.6",             "ARIA192_ECB" },
+    { "1.2.410.200046.1.1.7",             "ARIA192_CBC" },
+    { "1.2.410.200046.1.1.8",             "ARIA192_CFB" },
+    { "1.2.410.200046.1.1.9",             "ARIA192_OFB" },
+    { "1.2.410.200046.1.1.10",            "ARIA192_CTR" },
+    { "1.2.410.200046.1.1.11",            "ARIA256_ECB" },
+    { "1.2.410.200046.1.1.12",            "ARIA256_CBC" },
+    { "1.2.410.200046.1.1.13",            "ARIA256_CFB" },
+    { "1.2.410.200046.1.1.14",            "ARIA256_OFB" },
+    { "1.2.410.200046.1.1.15",            "ARIA256_CTR" },
+    { "1.2.410.200046.1.1.21",            "ARIA128_CMAC" },
+    { "1.2.410.200046.1.1.22",            "ARIA192_CMAC" },
+    { "1.2.410.200046.1.1.23",            "ARIA256_CMAC" },
+    { "1.2.410.200046.1.1.31",            "ARIA128_OCB2" },
+    { "1.2.410.200046.1.1.32",            "ARIA192_OCB2" },
+    { "1.2.410.200046.1.1.33",            "ARIA256_OCB2" },
+    { "1.2.410.200046.1.1.34",            "ARIA128_GCM" },
+    { "1.2.410.200046.1.1.35",            "ARIA192_GCM" },
+    { "1.2.410.200046.1.1.36",            "ARIA256_GCM" },
+    { "1.2.410.200046.1.1.37",            "ARIA128_CCM" },
+    { "1.2.410.200046.1.1.38",            "ARIA192_CCM" },
+    { "1.2.410.200046.1.1.39",            "ARIA256_CCM" },
+    { "1.2.410.200046.1.1.40",            "ARIA128_KEYWRAP" },
+    { "1.2.410.200046.1.1.41",            "ARIA192_KEYWRAP" },
+    { "1.2.410.200046.1.1.42",            "ARIA256_KEYWRAP" },
+    { "1.2.410.200046.1.1.43",            "ARIA128_KEYWRAP_WITH_PAD" },
+    { "1.2.410.200046.1.1.44",            "ARIA192_KEYWRAP_WITH_PAD" },
+    { "1.2.410.200046.1.1.45",            "ARIA256_KEYWRAP_WITH_PAD" },
+    { "1.2.643.2.2.3",                    "GOST_SIGNATURE" },
+    { "1.2.643.2.2.4",                    "GOST94_SIGNATURE" },
+    { "1.2.643.2.2.19",                   "GOST_PUBLIC_KEY" },
+    { "1.2.643.2.2.20",                   "GOST94_PUBLIC_KEY" },
+    { "1.2.643.2.2.21",                   "GOST_CIPHER" },
+    { "1.2.643.2.2.31.0",                 "TEST_CIPHER_PARAMS" },
+    { "1.2.643.2.2.31.1",                 "CRYPTO_PRO_CIPHER_A" },
+    { "1.2.643.2.2.31.2",                 "CRYPTO_PRO_CIPHER_B" },
+    { "1.2.643.2.2.31.3",                 "CRYPTO_PRO_CIPHER_C" },
+    { "1.2.643.2.2.31.4",                 "CRYPTO_PRO_CIPHER_D" },
+    { "1.2.643.2.2.31.5",                 "OSCAR11_CIPHER" },
+    { "1.2.643.2.2.31.6",                 "OSCAR10_CIPHER" },
+    { "1.2.643.2.2.31.7",                 "RIC1_CIPHER" },
+    { "1.2.643.2.2.9",                    "GOST_DIGEST" },
+    { "1.2.643.2.2.30.0",                 "TEST_DIGEST_PARAMS" },
+    { "1.2.643.2.2.30.1",                 "CRYPTO_PRO_DIGEST_A" },
+    { "1.2.643.2.2.35.0",                 "TEST_SIGN_PARAMS" },
+    { "1.2.643.2.2.35.1",                 "CRYPTO_PRO_SIGN_A" },
+    { "1.2.643.2.2.35.2",                 "CRYPTO_PRO_SIGN_B" },
+    { "1.2.643.2.2.35.3",                 "CRYPTO_PRO_SIGN_C" },
+    { "1.2.643.2.2.36.0",                 "CRYPTO_PRO_SIGN_XA" },
+    { "1.2.643.2.2.36.1",                 "CRYPTO_PRO_SIGN_XB" },
+    { "1.2.643.2.2.14.0",                 "NULL_MESHING" },
+    { "1.2.643.2.2.14.1",                 "CRYPTO_PRO_MESHING" },
+    { "1.2.643.2.2.10",                   "HMAC_GOST" },
+    { "1.2.643.2.2.13.0",                 "GOST_WRAP" },
+    { "1.2.643.2.2.13.1",                 "CRYPTO_PRO_WRAP" },
+    { "1.2.643.2.2.96",                   "CRYPTO_PRO_ECDH_WRAP" },
+    { "1.2.752.34.1",                     "SEIS_CP" },
+    { "1.2.752.34.1.1",                   "SEIS_HIGH_ASSURANCE_POLICY_IDENTIFIER" },
+    { "1.2.752.34.1.2",                   "SEIS_GAK_POLICY_IDENTIFIER" },
+    { "1.2.752.34.2",                     "SEIS_PE" },
+    { "1.2.752.34.3",                     "SEIS_AT" },
+    { "1.2.752.34.3.1",                   "SEIS_AT_PERSONAL_IDENTIFIER" },
+    { "1.2.840.10040.1",                  "MODULE" },
+    { "1.2.840.10040.1.1",                "X9F1_CERT_MGMT" },
+    { "1.2.840.10040.2",                  "HOLDINSTRUCTION" },
+    { "1.2.840.10040.2.1",                "HOLDINSTRUCTION_NONE" },
+    { "1.2.840.10040.2.2",                "CALLISSUER" },
+    { "1.2.840.10040.2.3",                "REJECT" },
+    { "1.2.840.10040.2.4",                "PICKUP_TOKEN" },
+    { "1.2.840.10040.3",                  "ATTRIBUTE" },
+    { "1.2.840.10040.3.1",                "COUNTERSIGNATURE" },
+    { "1.2.840.10040.3.2",                "ATTRIBUTE_CERT" },
+    { "1.2.840.10040.4",                  "ALGORITHM" },
+    { "1.2.840.10040.4.1",                "DSA" },
+    { "1.2.840.10040.4.2",                "DSA_MATCH" },
+    { "1.2.840.10040.4.3",                "DSA_WITH_SHA1" },
+    { "1.2.840.10045.1",                  "FIELD_TYPE" },
+    { "1.2.840.10045.1.1",                "PRIME_FIELD" },
+    { "1.2.840.10045.1.2",                "CHARACTERISTIC_TWO_FIELD" },
+    { "1.2.840.10045.1.2.3",              "CHARACTERISTIC_TWO_BASIS" },
+    { "1.2.840.10045.1.2.3.1",            "ON_BASIS" },
+    { "1.2.840.10045.1.2.3.2",            "TP_BASIS" },
+    { "1.2.840.10045.1.2.3.3",            "PP_BASIS" },
+    { "1.2.840.10045.2",                  "PUBLIC_KEY_TYPE" },
+    { "1.2.840.10045.2.1",                "EC_PUBLIC_KEY" },
+    { "1.2.840.10045.3.0.1",              "C2PNB163V1" },
+    { "1.2.840.10045.3.0.2",              "C2PNB163V2" },
+    { "1.2.840.10045.3.0.3",              "C2PNB163V3" },
+    { "1.2.840.10045.3.0.5",              "C2TNB191V1" },
+    { "1.2.840.10045.3.0.6",              "C2TNB191V2" },
+    { "1.2.840.10045.3.0.7",              "C2TNB191V3" },
+    { "1.2.840.10045.3.0.10",             "C2PNB208W1" },
+    { "1.2.840.10045.3.0.11",             "C2TNB239V1" },
+    { "1.2.840.10045.3.0.12",             "C2TNB239V2" },
+    { "1.2.840.10045.3.0.13",             "C2TNB239V3" },
+    { "1.2.840.10045.3.0.16",             "C2PNB272W1" },
+    { "1.2.840.10045.3.0.18",             "C2TNB359V1" },
+    { "1.2.840.10045.3.0.19",             "C2PNB368W1" },
+    { "1.2.840.10045.3.0.20",             "C2TNB431R1" },
+    { "1.2.840.10045.3.1.1",              "PRIME192V1" },
+    { "1.2.840.10045.3.1.2",              "PRIME192V2" },
+    { "1.2.840.10045.3.1.3",              "PRIME192V3" },
+    { "1.2.840.10045.3.1.4",              "PRIME239V1" },
+    { "1.2.840.10045.3.1.5",              "PRIME239V2" },
+    { "1.2.840.10045.3.1.6",              "PRIME239V3" },
+    { "1.2.840.10045.3.1.7",              "PRIME256V1" },
+    { "1.2.840.10045.4.1",                "ECDSA_WITH_SHA1" },
+    { "1.2.840.10045.4.2",                "ECDSA_WITH_RECOMMENDED" },
+    { "1.2.840.10045.4.3",                "ECDSA_WITH_SPECIFIED" },
+    { "1.2.840.10045.4.3.1",              "ECDSA_WITH_SHA224" },
+    { "1.2.840.10045.4.3.2",              "ECDSA_WITH_SHA256" },
+    { "1.2.840.10045.4.3.3",              "ECDSA_WITH_SHA384" },
+    { "1.2.840.10045.4.3.4",              "ECDSA_WITH_SHA512" },
+    { "1.2.840.10046.1",                  "FIELD_TYPE" },
+    { "1.2.840.10046.1.1",                "GF_PRIME" },
+    { "1.2.840.10046.2",                  "NUMBER_TYPE" },
+    { "1.2.840.10046.2.1",                "DH_PUBLIC_KEY" },
+    { "1.2.840.10046.3",                  "SCHEME" },
+    { "1.2.840.10046.3.1",                "DH_STATIC" },
+    { "1.2.840.10046.3.2",                "DH_EPHEM" },
+    { "1.2.840.10046.3.3",                "DH_HYBRID1" },
+    { "1.2.840.10046.3.4",                "DH_HYBRID2" },
+    { "1.2.840.10046.3.5",                "MQV2" },
+    { "1.2.840.10046.3.6",                "MQV1" },
+    { "1.2.840.10065.2.2",                "?" },
+    { "1.2.840.10065.2.3",                "HEALTHCARE_LICENSE" },
+    { "1.2.840.10065.2.3.1.1",            "LICENSE?" },
+    { "1.2.840.10070.",                   "IEC62351" },
+    { "1.2.840.10070.8",                  "IEC62351_8" },
+    { "1.2.840.10070.8.1",                "IEC_USER_ROLES" },
+    { "1.2.840.113533.7",                 "NSN" },
+    { "1.2.840.113533.7.65",              "NSN_CE" },
+    { "1.2.840.113533.7.65.0",            "ENTRUST_VERS_INFO" },
+    { "1.2.840.113533.7.66",              "NSN_ALG" },
+    { "1.2.840.113533.7.66.3",            "CAST3_CBC" },
+    { "1.2.840.113533.7.66.10",           "CAST5_CBC" },
+    { "1.2.840.113533.7.66.11",           "CAST5_MAC" },
+    { "1.2.840.113533.7.66.12",           "PBE_WITH_MD5_AND_CAST5_CBC" },
+    { "1.2.840.113533.7.66.13",           "PASSWORD_BASED_MAC" },
+    { "1.2.840.113533.7.67",              "NSN_OC" },
+    { "1.2.840.113533.7.67.0",            "ENTRUST_USER" },
+    { "1.2.840.113533.7.68",              "NSN_AT" },
+    { "1.2.840.113533.7.68.0",            "ENTRUST_CA_INFO" },
+    { "1.2.840.113533.7.68.10",           "ATTRIBUTE_CERTIFICATE" },
+    { "1.2.840.113549.1.1",               "PKCS_1" },
+    { "1.2.840.113549.1.1.1",             "RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.2",             "MD2_WITH_RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.3",             "MD4_WITH_RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.4",             "MD5_WITH_RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.5",             "SHA1_WITH_RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.7",             "RSA_OAEP" },
+    { "1.2.840.113549.1.1.8",             "PKCS1_MGF" },
+    { "1.2.840.113549.1.1.9",             "RSA_OAEP_P_SPECIFIED" },
+    { "1.2.840.113549.1.1.10",            "RSA_PSS" },
+    { "1.2.840.113549.1.1.11",            "SHA256_WITH_RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.12",            "SHA384_WITH_RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.13",            "SHA512_WITH_RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.14",            "SHA224_WITH_RSA_ENCRYPTION" },
+    { "1.2.840.113549.1.1.6",             "RSA_OAEP_ENCRYPTION_SET" },
+    { "1.2.840.113549.1.2",               "BSAFE_RSA_ENCR" },
+    { "1.2.840.113549.1.3",               "PKCS_3" },
+    { "1.2.840.113549.1.3.1",             "DH_KEY_AGREEMENT" },
+    { "1.2.840.113549.1.5",               "PKCS_5" },
+    { "1.2.840.113549.1.5.1",             "PBE_WITH_MD2_AND_DES_CBC" },
+    { "1.2.840.113549.1.5.3",             "PBE_WITH_MD5_AND_DES_CBC" },
+    { "1.2.840.113549.1.5.4",             "PBE_WITH_MD2_AND_RC2_CBC" },
+    { "1.2.840.113549.1.5.6",             "PBE_WITH_MD5_AND_RC2_CBC" },
+    { "1.2.840.113549.1.5.9",             "PBE_WITH_MD5_AND_XOR" },
+    { "1.2.840.113549.1.5.10",            "PBE_WITH_SHA_AND_DES_CBC" },
+    { "1.2.840.113549.1.5.12",            "PKCS5_PBKDF2" },
+    { "1.2.840.113549.1.5.13",            "PKCS5_PBES2" },
+    { "1.2.840.113549.1.5.14",            "PKCS5_PBMAC1" },
+    { "1.2.840.113549.1.7",               "PKCS_7" },
+    { "1.2.840.113549.1.7.1",             "DATA" },
+    { "1.2.840.113549.1.7.2",             "SIGNED_DATA" },
+    { "1.2.840.113549.1.7.3",             "ENVELOPED_DATA" },
+    { "1.2.840.113549.1.7.4",             "SIGNED_AND_ENVELOPED_DATA" },
+    { "1.2.840.113549.1.7.5",             "DIGESTED_DATA" },
+    { "1.2.840.113549.1.7.6",             "ENCRYPTED_DATA" },
+    { "1.2.840.113549.1.7.7",             "DATA_WITH_ATTRIBUTES" },
+    { "1.2.840.113549.1.7.8",             "ENCRYPTED_PRIVATE_KEY_INFO" },
+    { "1.2.840.113549.1.9",               "PKCS_9" },
+    { "1.2.840.113549.1.9.1",             "EMAIL_ADDRESS" },
+    { "1.2.840.113549.1.9.2",             "UNSTRUCTURED_NAME" },
+    { "1.2.840.113549.1.9.3",             "CONTENT_TYPE" },
+    { "1.2.840.113549.1.9.4",             "MESSAGE_DIGEST" },
+    { "1.2.840.113549.1.9.5",             "SIGNING_TIME" },
+    { "1.2.840.113549.1.9.6",             "COUNTERSIGNATURE" },
+    { "1.2.840.113549.1.9.7",             "CHALLENGE_PASSWORD" },
+    { "1.2.840.113549.1.9.8",             "UNSTRUCTURED_ADDRESS" },
+    { "1.2.840.113549.1.9.9",             "EXTENDED_CERTIFICATE_ATTRIBUTES" },
+    { "1.2.840.113549.1.9.10",            "ISSUER_AND_SERIAL_NUMBER" },
+    { "1.2.840.113549.1.9.11",            "PASSWORD_CHECK" },
+    { "1.2.840.113549.1.9.12",            "PUBLIC_KEY" },
+    { "1.2.840.113549.1.9.13",            "SIGNING_DESCRIPTION" },
+    { "1.2.840.113549.1.9.14",            "EXTENSION_REQUEST" },
+    { "1.2.840.113549.1.9.15",            "S_MIME_CAPABILITIES" },
+    { "1.2.840.113549.1.9.15.1",          "PREFER_SIGNED_DATA" },
+    { "1.2.840.113549.1.9.15.2",          "CAN_NOT_DECRYPT_ANY" },
+    { "1.2.840.113549.1.9.15.3",          "RECEIPT_REQUEST" },
+    { "1.2.840.113549.1.9.15.4",          "RECEIPT" },
+    { "1.2.840.113549.1.9.15.5",          "CONTENT_HINTS" },
+    { "1.2.840.113549.1.9.15.6",          "ML_EXPANSION_HISTORY" },
+    { "1.2.840.113549.1.9.16",            "ID_S_MIME" },
+    { "1.2.840.113549.1.9.16.0",          "ID_MOD" },
+    { "1.2.840.113549.1.9.16.0.1",        "ID_MOD_CMS" },
+    { "1.2.840.113549.1.9.16.0.2",        "ID_MOD_ESS" },
+    { "1.2.840.113549.1.9.16.0.3",        "ID_MOD_OID" },
+    { "1.2.840.113549.1.9.16.0.4",        "ID_MOD_MSG_V3" },
+    { "1.2.840.113549.1.9.16.0.5",        "ID_MOD_ETS_E_SIGNATURE_88" },
+    { "1.2.840.113549.1.9.16.0.6",        "ID_MOD_ETS_E_SIGNATURE_97" },
+    { "1.2.840.113549.1.9.16.0.7",        "ID_MOD_ETS_E_SIG_POLICY_88" },
+    { "1.2.840.113549.1.9.16.0.8",        "ID_MOD_ETS_E_SIG_POLICY_88" },
+    { "1.2.840.113549.1.9.16.1",          "CONTENT_TYPE" },
+    { "1.2.840.113549.1.9.16.1.1",        "RECEIPT" },
+    { "1.2.840.113549.1.9.16.1.2",        "AUTH_DATA" },
+    { "1.2.840.113549.1.9.16.1.3",        "PUBLISH_CERT" },
+    { "1.2.840.113549.1.9.16.1.4",        "T_ST_INFO" },
+    { "1.2.840.113549.1.9.16.1.5",        "T_DT_INFO" },
+    { "1.2.840.113549.1.9.16.1.6",        "CONTENT_INFO" },
+    { "1.2.840.113549.1.9.16.1.7",        "D_VCS_REQUEST_DATA" },
+    { "1.2.840.113549.1.9.16.1.8",        "D_VCS_RESPONSE_DATA" },
+    { "1.2.840.113549.1.9.16.1.9",        "COMPRESSED_DATA" },
+    { "1.2.840.113549.1.9.16.1.10",       "SCVP_CERT_VAL_REQUEST" },
+    { "1.2.840.113549.1.9.16.1.11",       "SCVP_CERT_VAL_RESPONSE" },
+    { "1.2.840.113549.1.9.16.1.12",       "SCVP_VAL_POL_REQUEST" },
+    { "1.2.840.113549.1.9.16.1.13",       "SCVP_VAL_POL_RESPONSE" },
+    { "1.2.840.113549.1.9.16.1.14",       "ATTR_CERT_ENC_ATTRS" },
+    { "1.2.840.113549.1.9.16.1.15",       "T_S_REQ" },
+    { "1.2.840.113549.1.9.16.1.16",       "FIRMWARE_PACKAGE" },
+    { "1.2.840.113549.1.9.16.1.17",       "FIRMWARE_LOAD_RECEIPT" },
+    { "1.2.840.113549.1.9.16.1.18",       "FIRMWARE_LOAD_ERROR" },
+    { "1.2.840.113549.1.9.16.1.19",       "CONTENT_COLLECTION" },
+    { "1.2.840.113549.1.9.16.1.20",       "CONTENT_WITH_ATTRS" },
+    { "1.2.840.113549.1.9.16.1.21",       "ENC_KEY_WITH_ID" },
+    { "1.2.840.113549.1.9.16.1.22",       "ENC_PEPSI" },
+    { "1.2.840.113549.1.9.16.1.23",       "AUTH_ENVELOPED_DATA" },
+    { "1.2.840.113549.1.9.16.1.24",       "ROUTE_ORIGIN_ATTEST" },
+    { "1.2.840.113549.1.9.16.1.25",       "SYMMETRIC_KEY_PACKAGE" },
+    { "1.2.840.113549.1.9.16.1.26",       "RPKI_MANIFEST" },
+    { "1.2.840.113549.1.9.16.1.27",       "ASCII_TEXT_WITH_CRLF" },
+    { "1.2.840.113549.1.9.16.1.28",       "XML" },
+    { "1.2.840.113549.1.9.16.1.29",       "PDF" },
+    { "1.2.840.113549.1.9.16.1.30",       "POSTSCRIPT" },
+    { "1.2.840.113549.1.9.16.1.31",       "TIMESTAMPED_DATA" },
+    { "1.2.840.113549.1.9.16.1.32",       "AS_ADJACENCY_ATTEST" },
+    { "1.2.840.113549.1.9.16.1.33",       "RPKI_TRUST_ANCHOR" },
+    { "1.2.840.113549.1.9.16.1.34",       "TRUST_ANCHOR_LIST" },
+    { "1.2.840.113549.1.9.16.2",          "AUTHENTICATED_ATTRIBUTES" },
+    { "1.2.840.113549.1.9.16.2.1",        "RECEIPT_REQUEST" },
+    { "1.2.840.113549.1.9.16.2.2",        "SECURITY_LABEL" },
+    { "1.2.840.113549.1.9.16.2.3",        "ML_EXPAND_HISTORY" },
+    { "1.2.840.113549.1.9.16.2.4",        "CONTENT_HINT" },
+    { "1.2.840.113549.1.9.16.2.5",        "MSG_SIG_DIGEST" },
+    { "1.2.840.113549.1.9.16.2.6",        "ENCAP_CONTENT_TYPE" },
+    { "1.2.840.113549.1.9.16.2.7",        "CONTENT_IDENTIFIER" },
+    { "1.2.840.113549.1.9.16.2.8",        "MAC_VALUE" },
+    { "1.2.840.113549.1.9.16.2.9",        "EQUIVALENT_LABELS" },
+    { "1.2.840.113549.1.9.16.2.10",       "CONTENT_REFERENCE" },
+    { "1.2.840.113549.1.9.16.2.11",       "ENCRYP_KEY_PREF" },
+    { "1.2.840.113549.1.9.16.2.12",       "SIGNING_CERTIFICATE" },
+    { "1.2.840.113549.1.9.16.2.13",       "SMIME_ENCRYPT_CERTS" },
+    { "1.2.840.113549.1.9.16.2.14",       "TIME_STAMP_TOKEN" },
+    { "1.2.840.113549.1.9.16.2.15",       "SIG_POLICY_ID" },
+    { "1.2.840.113549.1.9.16.2.16",       "COMMITMENT_TYPE" },
+    { "1.2.840.113549.1.9.16.2.17",       "SIGNER_LOCATION" },
+    { "1.2.840.113549.1.9.16.2.18",       "SIGNER_ATTR" },
+    { "1.2.840.113549.1.9.16.2.19",       "OTHER_SIG_CERT" },
+    { "1.2.840.113549.1.9.16.2.20",       "CONTENT_TIMESTAMP" },
+    { "1.2.840.113549.1.9.16.2.21",       "CERTIFICATE_REFS" },
+    { "1.2.840.113549.1.9.16.2.22",       "REVOCATION_REFS" },
+    { "1.2.840.113549.1.9.16.2.23",       "CERT_VALUES" },
+    { "1.2.840.113549.1.9.16.2.24",       "REVOCATION_VALUES" },
+    { "1.2.840.113549.1.9.16.2.25",       "ESC_TIME_STAMP" },
+    { "1.2.840.113549.1.9.16.2.26",       "CERT_CRL_TIMESTAMP" },
+    { "1.2.840.113549.1.9.16.2.27",       "ARCHIVE_TIME_STAMP" },
+    { "1.2.840.113549.1.9.16.2.28",       "SIGNATURE_TYPE" },
+    { "1.2.840.113549.1.9.16.2.29",       "DVCS_DVC" },
+    { "1.2.840.113549.1.9.16.2.30",       "CEK_REFERENCE" },
+    { "1.2.840.113549.1.9.16.2.31",       "MAX_CEK_DECRYPTS" },
+    { "1.2.840.113549.1.9.16.2.32",       "KEK_DERIVATION_ALG" },
+    { "1.2.840.113549.1.9.16.2.33",       "INTENDED_RECIPIENTS" },
+    { "1.2.840.113549.1.9.16.2.34",       "CMC_UNSIGNED_DATA" },
+    { "1.2.840.113549.1.9.16.2.35",       "FW_PACKAGE_ID" },
+    { "1.2.840.113549.1.9.16.2.36",       "FW_TARGET_HARDWARE_I_DS" },
+    { "1.2.840.113549.1.9.16.2.37",       "FW_DECRYPT_KEY_ID" },
+    { "1.2.840.113549.1.9.16.2.38",       "FW_IMPL_CRYPT_ALGS" },
+    { "1.2.840.113549.1.9.16.2.39",       "FW_WRAPPED_FIRMWARE_KEY" },
+    { "1.2.840.113549.1.9.16.2.40",       "FW_COMMUNITY_IDENTIFIERS" },
+    { "1.2.840.113549.1.9.16.2.41",       "FW_PKG_MESSAGE_DIGEST" },
+    { "1.2.840.113549.1.9.16.2.42",       "FW_PACKAGE_INFO" },
+    { "1.2.840.113549.1.9.16.2.43",       "FW_IMPL_COMPRESS_ALGS" },
+    { "1.2.840.113549.1.9.16.2.44",       "ETS_ATTR_CERTIFICATE_REFS" },
+    { "1.2.840.113549.1.9.16.2.45",       "ETS_ATTR_REVOCATION_REFS" },
+    { "1.2.840.113549.1.9.16.2.46",       "BINARY_SIGNING_TIME" },
+    { "1.2.840.113549.1.9.16.2.47",       "SIGNING_CERTIFICATE_V2" },
+    { "1.2.840.113549.1.9.16.2.48",       "ETS_ARCHIVE_TIME_STAMP_V2" },
+    { "1.2.840.113549.1.9.16.2.49",       "ER_INTERNAL" },
+    { "1.2.840.113549.1.9.16.2.50",       "ER_EXTERNAL" },
+    { "1.2.840.113549.1.9.16.2.51",       "MULTIPLE_SIGNATURES" },
+    { "1.2.840.113549.1.9.16.3.1",        "ES_D_HWITH3_DES" },
+    { "1.2.840.113549.1.9.16.3.2",        "ES_D_HWITH_RC2" },
+    { "1.2.840.113549.1.9.16.3.3",        "3DES_WRAP" },
+    { "1.2.840.113549.1.9.16.3.4",        "RC2_WRAP" },
+    { "1.2.840.113549.1.9.16.3.5",        "ES_DH" },
+    { "1.2.840.113549.1.9.16.3.6",        "CMS3_DE_SWRAP" },
+    { "1.2.840.113549.1.9.16.3.7",        "CMS_RC2WRAP" },
+    { "1.2.840.113549.1.9.16.3.8",        "ZLIB" },
+    { "1.2.840.113549.1.9.16.3.9",        "PWRI_KEK" },
+    { "1.2.840.113549.1.9.16.3.10",       "SS_DH" },
+    { "1.2.840.113549.1.9.16.3.11",       "HMAC_WITH3_DE_SWRAP" },
+    { "1.2.840.113549.1.9.16.3.12",       "HMAC_WITH_AE_SWRAP" },
+    { "1.2.840.113549.1.9.16.3.13",       "MD5_XOR_EXPERIMENT" },
+    { "1.2.840.113549.1.9.16.3.14",       "RSA_KEM" },
+    { "1.2.840.113549.1.9.16.3.15",       "AUTH_ENC128" },
+    { "1.2.840.113549.1.9.16.3.16",       "AUTH_ENC256" },
+    { "1.2.840.113549.1.9.16.4.1",        "CERT_DIST_LDAP" },
+    { "1.2.840.113549.1.9.16.5.1",        "SIG_POLICY_QUALIFIER_SPURI_X" },
+    { "1.2.840.113549.1.9.16.5.2",        "SIG_POLICY_QUALIFIER_SP_USER_NOTICE" },
+    { "1.2.840.113549.1.9.16.6.1",        "PROOF_OF_ORIGIN" },
+    { "1.2.840.113549.1.9.16.6.2",        "PROOF_OF_RECEIPT" },
+    { "1.2.840.113549.1.9.16.6.3",        "PROOF_OF_DELIVERY" },
+    { "1.2.840.113549.1.9.16.6.4",        "PROOF_OF_SENDER" },
+    { "1.2.840.113549.1.9.16.6.5",        "PROOF_OF_APPROVAL" },
+    { "1.2.840.113549.1.9.16.6.6",        "PROOF_OF_CREATION" },
+    { "1.2.840.113549.1.9.16.8.1",        "GL_USE_KEK" },
+    { "1.2.840.113549.1.9.16.8.2",        "GL_DELETE" },
+    { "1.2.840.113549.1.9.16.8.3",        "GL_ADD_MEMBER" },
+    { "1.2.840.113549.1.9.16.8.4",        "GL_DELETE_MEMBER" },
+    { "1.2.840.113549.1.9.16.8.5",        "GL_REKEY" },
+    { "1.2.840.113549.1.9.16.8.6",        "GL_ADD_OWNER" },
+    { "1.2.840.113549.1.9.16.8.7",        "GL_REMOVE_OWNER" },
+    { "1.2.840.113549.1.9.16.8.8",        "GLK_COMPROMISE" },
+    { "1.2.840.113549.1.9.16.8.9",        "GLK_REFRESH" },
+    { "1.2.840.113549.1.9.16.8.10",       "GL_FAIL_INFO" },
+    { "1.2.840.113549.1.9.16.8.11",       "GLA_QUERY_REQUEST" },
+    { "1.2.840.113549.1.9.16.8.12",       "GLA_QUERY_RESPONSE" },
+    { "1.2.840.113549.1.9.16.8.13",       "GL_PROVIDE_CERT" },
+    { "1.2.840.113549.1.9.16.8.14",       "GL_UPDATE_CERT" },
+    { "1.2.840.113549.1.9.16.8.15",       "GL_KEY" },
+    { "1.2.840.113549.1.9.16.9",          "SIGNATURE_TYPE_IDENTIFIER" },
+    { "1.2.840.113549.1.9.16.9.1",        "ORIGINATOR_SIG" },
+    { "1.2.840.113549.1.9.16.9.2",        "DOMAIN_SIG" },
+    { "1.2.840.113549.1.9.16.9.3",        "ADDITIONAL_ATTRIBUTES_SIG" },
+    { "1.2.840.113549.1.9.16.9.4",        "REVIEW_SIG" },
+    { "1.2.840.113549.1.9.16.11",         "CAPABILITIES" },
+    { "1.2.840.113549.1.9.16.11.1",       "PREFER_BINARY_INSIDE" },
+    { "1.2.840.113549.1.9.20",            "FRIENDLY_NAME_(FOR_PKCS_#12)" },
+    { "1.2.840.113549.1.9.21",            "LOCAL_KEY_ID_(FOR_PKCS_#12)" },
+    { "1.2.840.113549.1.9.22",            "CERT_TYPES_(FOR_PKCS_#12)" },
+    { "1.2.840.113549.1.9.22.1",          "X509_CERTIFICATE_(FOR_PKCS_#12)" },
+    { "1.2.840.113549.1.9.22.2",          "SDSI_CERTIFICATE_(FOR_PKCS_#12)" },
+    { "1.2.840.113549.1.9.23",            "CRL_TYPES_(FOR_PKCS_#12)" },
+    { "1.2.840.113549.1.9.23.1",          "X509_CRL_(FOR_PKCS_#12)" },
+    { "1.2.840.113549.1.9.24",            "PKCS9OBJECT_CLASS" },
+    { "1.2.840.113549.1.9.25",            "PKCS9ATTRIBUTES" },
+    { "1.2.840.113549.1.9.25.1",          "PKCS15_TOKEN" },
+    { "1.2.840.113549.1.9.25.2",          "ENCRYPTED_PRIVATE_KEY_INFO" },
+    { "1.2.840.113549.1.9.25.3",          "RANDOM_NONCE" },
+    { "1.2.840.113549.1.9.25.4",          "SEQUENCE_NUMBER" },
+    { "1.2.840.113549.1.9.25.5",          "PKCS7_PDU" },
+    { "1.2.840.113549.1.9.26",            "PKCS9SYNTAX" },
+    { "1.2.840.113549.1.9.27",            "PKCS9MATCHING_RULES" },
+    { "1.2.840.113549.1.12",              "PKCS_12" },
+    { "1.2.840.113549.1.12.1",            "PKCS_12_PBE_IDS" },
+    { "1.2.840.113549.1.12.1.1",          "PBE_WITH_SHA_AND128_BIT_RC4" },
+    { "1.2.840.113549.1.12.1.2",          "PBE_WITH_SHA_AND40_BIT_RC4" },
+    { "1.2.840.113549.1.12.1.3",          "PBE_WITH_SHA_AND3_KEY_TRIPLE_DES_CBC" },
+    { "1.2.840.113549.1.12.1.4",          "PBE_WITH_SHA_AND2_KEY_TRIPLE_DES_CBC" },
+    { "1.2.840.113549.1.12.1.5",          "PBE_WITH_SHA_AND128_BIT_RC2_CBC" },
+    { "1.2.840.113549.1.12.1.6",          "PBE_WITH_SHA_AND40_BIT_RC2_CBC" },
+    { "1.2.840.113549.1.12.2",            "PKCS_12_ESPVKID" },
+    { "1.2.840.113549.1.12.2.1",          "PKCS_12_PKCS8_KEY_SHROUDING" },
+    { "1.2.840.113549.1.12.3",            "PKCS_12_BAG_IDS" },
+    { "1.2.840.113549.1.12.3.1",          "PKCS_12_KEY_BAG_ID" },
+    { "1.2.840.113549.1.12.3.2",          "PKCS_12_CERT_AND_CRL_BAG_ID" },
+    { "1.2.840.113549.1.12.3.3",          "PKCS_12_SECRET_BAG_ID" },
+    { "1.2.840.113549.1.12.3.4",          "PKCS_12_SAFE_CONTENTS_ID" },
+    { "1.2.840.113549.1.12.3.5",          "PKCS_12_PKCS_8_SHROUDED_KEY_BAG_ID" },
+    { "1.2.840.113549.1.12.4",            "PKCS_12_CERT_BAG_ID" },
+    { "1.2.840.113549.1.12.4.1",          "PKCS_12_X509_CERT_CRL_BAG_ID" },
+    { "1.2.840.113549.1.12.4.2",          "PKCS_12_SDSI_CERT_BAG_ID" },
+    { "1.2.840.113549.1.12.5",            "PKCS_12_OID" },
+    { "1.2.840.113549.1.12.5.1",          "PKCS_12_PBEID" },
+    { "1.2.840.113549.1.12.5.1.1",        "PKCS_12_PBE_WITH_SHA1_AND128_BIT_RC4" },
+    { "1.2.840.113549.1.12.5.1.2",        "PKCS_12_PBE_WITH_SHA1_AND40_BIT_RC4" },
+    { "1.2.840.113549.1.12.5.1.3",        "PKCS_12_PBE_WITH_SHA1_AND_TRIPLE_DESCBC" },
+    { "1.2.840.113549.1.12.5.1.4",        "PKCS_12_PBE_WITH_SHA1_AND128_BIT_RC2_CBC" },
+    { "1.2.840.113549.1.12.5.1.5",        "PKCS_12_PBE_WITH_SHA1_AND40_BIT_RC2_CBC" },
+    { "1.2.840.113549.1.12.5.1.6",        "PKCS_12_PBE_WITH_SHA1_AND_RC4" },
+    { "1.2.840.113549.1.12.5.1.7",        "PKCS_12_PBE_WITH_SHA1_AND_RC2_CBC" },
+    { "1.2.840.113549.1.12.5.2",          "PKCS_12_ENVELOPING_ID" },
+    { "1.2.840.113549.1.12.5.2.1",        "PKCS_12_RSA_ENCRYPTION_WITH128_BIT_RC4" },
+    { "1.2.840.113549.1.12.5.2.2",        "PKCS_12_RSA_ENCRYPTION_WITH40_BIT_RC4" },
+    { "1.2.840.113549.1.12.5.2.3",        "PKCS_12_RSA_ENCRYPTION_WITH_TRIPLE_DES" },
+    { "1.2.840.113549.1.12.5.3",          "PKCS_12_SIGNATURE_ID" },
+    { "1.2.840.113549.1.12.5.3.1",        "PKCS_12_RSA_SIGNATURE_WITH_SHA1_DIGEST" },
+    { "1.2.840.113549.1.12.10",           "PKCS_12_VERSION1" },
+    { "1.2.840.113549.1.12.10.1",         "PKCS_12_BAD_IDS" },
+    { "1.2.840.113549.1.12.10.1.1",       "PKCS_12_KEY_BAG" },
+    { "1.2.840.113549.1.12.10.1.2",       "PKCS_12_PKCS_8_SHROUDED_KEY_BAG" },
+    { "1.2.840.113549.1.12.10.1.3",       "PKCS_12_CERT_BAG" },
+    { "1.2.840.113549.1.12.10.1.4",       "PKCS_12_CRL_BAG" },
+    { "1.2.840.113549.1.12.10.1.5",       "PKCS_12_SECRET_BAG" },
+    { "1.2.840.113549.1.12.10.1.6",       "PKCS_12_SAFE_CONTENTS_BAG" },
+    { "1.2.840.113549.1.15.1",            "PKCS15MODULES" },
+    { "1.2.840.113549.1.15.2",            "PKCS15ATTRIBUTES" },
+    { "1.2.840.113549.1.15.3",            "PKCS15CONTENT_TYPE" },
+    { "1.2.840.113549.1.15.3.1",          "PKCS15CONTENT" },
+    { "1.2.840.113549.2",                 "DIGEST_ALGORITHM" },
+    { "1.2.840.113549.2.2",               "MD2" },
+    { "1.2.840.113549.2.4",               "MD4" },
+    { "1.2.840.113549.2.5",               "MD5" },
+    { "1.2.840.113549.2.7",               "HMAC_WITH_SHA1" },
+    { "1.2.840.113549.2.8",               "HMAC_WITH_SHA224" },
+    { "1.2.840.113549.2.9",               "HMAC_WITH_SHA256" },
+    { "1.2.840.113549.2.10",              "HMAC_WITH_SHA384" },
+    { "1.2.840.113549.2.11",              "HMAC_WITH_SHA512" },
+    { "1.2.840.113549.3",                 "ENCRYPTION_ALGORITHM" },
+    { "1.2.840.113549.3.2",               "RC2_CBC" },
+    { "1.2.840.113549.3.3",               "RC2_ECB" },
+    { "1.2.840.113549.3.4",               "RC4" },
+    { "1.2.840.113549.3.5",               "RC4_WITH_MAC" },
+    { "1.2.840.113549.3.6",               "DESX_CBC" },
+    { "1.2.840.113549.3.7",               "DES_EDE3_CBC" },
+    { "1.2.840.113549.3.8",               "RC5_CBC" },
+    { "1.2.840.113549.3.9",               "RC5_CBC_PAD" },
+    { "1.2.840.113549.3.10",              "DES_CDMF" },
+    { "1.2.840.114021.1.6.1",             "IDENTRUS_UNKNOWN_POLICY_IDENTIFIER" },
+    { "1.2.840.114021.4.1",               "IDENTRUS_OCSP" },
+    { "1.2.840.113556.1.2.241",           "DELIVERY_MECHANISM" },
+    { "1.2.840.113556.1.2.281",           "NT_SECURITY_DESCRIPTOR" },
+    { "1.2.840.113556.1.3.0",             "SITE_ADDRESSING" },
+    { "1.2.840.113556.1.3.13",            "CLASS_SCHEMA" },
+    { "1.2.840.113556.1.3.14",            "ATTRIBUTE_SCHEMA" },
+    { "1.2.840.113556.1.3.17",            "MAILBOX_AGENT" },
+    { "1.2.840.113556.1.3.22",            "MAILBOX" },
+    { "1.2.840.113556.1.3.23",            "CONTAINER" },
+    { "1.2.840.113556.1.3.46",            "MAIL_RECIPIENT" },
+    { "1.2.840.113556.1.4.145",           "REVISION" },
+    { "1.2.840.113556.1.4.1327",          "P_KI_DEFAULT_KEY_SPEC" },
+    { "1.2.840.113556.1.4.1328",          "P_KI_KEY_USAGE" },
+    { "1.2.840.113556.1.4.1329",          "P_KI_MAX_ISSUING_DEPTH" },
+    { "1.2.840.113556.1.4.1330",          "P_KI_CRITICAL_EXTENSIONS" },
+    { "1.2.840.113556.1.4.1331",          "P_KI_EXPIRATION_PERIOD" },
+    { "1.2.840.113556.1.4.1332",          "P_KI_OVERLAP_PERIOD" },
+    { "1.2.840.113556.1.4.1333",          "P_KI_EXTENDED_KEY_USAGE" },
+    { "1.2.840.113556.1.4.1334",          "P_KI_DEFAULT_CS_PS" },
+    { "1.2.840.113556.1.4.1335",          "P_KI_ENROLLMENT_ACCESS" },
+    { "1.2.840.113556.1.4.1429",          "MS_PKI_RA_SIGNATURE" },
+    { "1.2.840.113556.1.4.1430",          "MS_PKI_ENROLLMENT_FLAG" },
+    { "1.2.840.113556.1.4.1431",          "MS_PKI_PRIVATE_KEY_FLAG" },
+    { "1.2.840.113556.1.4.1432",          "MS_PKI_CERTIFICATE_NAME_FLAG" },
+    { "1.2.840.113556.1.4.1433",          "MS_PKI_MINIMAL_KEY_SIZE" },
+    { "1.2.840.113556.1.4.1434",          "MS_PKI_TEMPLATE_SCHEMA_VERSION" },
+    { "1.2.840.113556.1.4.1435",          "MS_PKI_TEMPLATE_MINOR_REVISION" },
+    { "1.2.840.113556.1.4.1436",          "MS_PKI_CERT_TEMPLATE_OID" },
+    { "1.2.840.113556.1.4.1437",          "MS_PKI_SUPERSEDE_TEMPLATES" },
+    { "1.2.840.113556.1.4.1438",          "MS_PKI_RA_POLICIES" },
+    { "1.2.840.113556.1.4.1439",          "MS_PKI_CERTIFICATE_POLICY" },
+    { "1.2.840.113556.1.4.1674",          "MS_PKI_CERTIFICATE_APPLICATION_POLICY" },
+    { "1.2.840.113556.1.4.1675",          "MS_PKI_RA_APPLICATION_POLICIES" },
+    { "1.2.840.113556.4.3",               "MICROSOFT_EXCEL" },
+    { "1.2.840.113556.4.4",               "TITLED_WITH_OID" },
+    { "1.2.840.113556.4.5",               "MICROSOFT_POWER_POINT" },
+    { "1.2.840.113583.1",                 "ADOBE_ACROBAT" },
+    { "1.2.840.113583.1.1",               "ACROBAT_SECURITY" },
+    { "1.2.840.113583.1.1.1",             "PDF_PASSWORD" },
+    { "1.2.840.113583.1.1.2",             "PDF_DEFAULT_SIGNING_CREDENTIAL" },
+    { "1.2.840.113583.1.1.3",             "PDF_DEFAULT_ENCRYPTION_CREDENTIAL" },
+    { "1.2.840.113583.1.1.4",             "PDF_PASSWORD_TIMEOUT" },
+    { "1.2.840.113583.1.1.5",             "PDF_AUTHENTIC_DOCUMENTS_TRUST" },
+    { "1.2.840.113583.1.1.6",             "PDF_DYNAMIC_CONTENT_TRUST" },
+    { "1.2.840.113583.1.1.7",             "PDF_UBIQUITY_TRUST" },
+    { "1.2.840.113583.1.1.8",             "PDF_REVOCATION_INFO_ARCHIVAL" },
+    { "1.2.840.113583.1.1.9",             "PDF_X509_EXTENSION" },
+    { "1.2.840.113583.1.1.9.1",           "PDF_TIME_STAMP" },
+    { "1.2.840.113583.1.1.9.2",           "PDF_ARCHIVE_REV_INFO" },
+    { "1.2.840.113583.1.1.10",            "PDF_PPLK_LITE_CREDENTIAL" },
+    { "1.2.840.113583.1.2.",              "ACROBAT_CPS" },
+    { "1.2.840.113583.1.2.1",             "PDF_AUTHENTIC_DOCUMENTS_CPS" },
+    { "1.2.840.113583.1.2.2",             "PDF_TEST_CPS" },
+    { "1.2.840.113583.1.2.3",             "PDF_UBIQUITY_CPS" },
+    { "1.2.840.113583.1.2.4",             "PDF_ADHOC_CPS" },
+    { "1.2.840.113583.1.7",               "ACROBAT_UBIQUITY" },
+    { "1.2.840.113583.1.7.1",             "PDF_UBIQUITY_SUB_RIGHTS" },
+    { "1.2.840.113583.1.9",               "ACROBAT_EXTENSION" },
+    { "1.2.840.113628.114.1.7",           "ADOBE_PKCS7" },
+    { "1.2.840.113635.100",               "APPLE_DATA_SECURITY" },
+    { "1.2.840.113635.100.1",             "APPLE_TRUST_POLICY" },
+    { "1.2.840.113635.100.1.1",           "APPLE_I_SIGN_TP" },
+    { "1.2.840.113635.100.1.2",           "APPLE_X509_BASIC" },
+    { "1.2.840.113635.100.1.3",           "APPLE_SSL_POLICY" },
+    { "1.2.840.113635.100.1.4",           "APPLE_LOCAL_CERT_GEN_POLICY" },
+    { "1.2.840.113635.100.1.5",           "APPLE_CSR_GEN_POLICY" },
+    { "1.2.840.113635.100.1.6",           "APPLE_CRL_POLICY" },
+    { "1.2.840.113635.100.1.7",           "APPLE_OCSP_POLICY" },
+    { "1.2.840.113635.100.1.8",           "APPLE_SMIME_POLICY" },
+    { "1.2.840.113635.100.1.9",           "APPLE_EAP_POLICY" },
+    { "1.2.840.113635.100.1.10",          "APPLE_SW_UPDATE_SIGNING_POLICY" },
+    { "1.2.840.113635.100.1.11",          "APPLE_IP_SEC_POLICY" },
+    { "1.2.840.113635.100.1.12",          "APPLE_I_CHAT_POLICY" },
+    { "1.2.840.113635.100.1.13",          "APPLE_RESOURCE_SIGN_POLICY" },
+    { "1.2.840.113635.100.1.14",          "APPLE_PKINIT_CLIENT_POLICY" },
+    { "1.2.840.113635.100.1.15",          "APPLE_PKINIT_SERVER_POLICY" },
+    { "1.2.840.113635.100.1.16",          "APPLE_CODE_SIGNING_POLICY" },
+    { "1.2.840.113635.100.1.17",          "APPLE_PACKAGE_SIGNING_POLICY" },
+    { "1.2.840.113635.100.2",             "APPLE_SECURITY_ALGORITHM" },
+    { "1.2.840.113635.100.2.1",           "APPLE_FEE" },
+    { "1.2.840.113635.100.2.2",           "APPLE_ASC" },
+    { "1.2.840.113635.100.2.3",           "APPLE_FEE_MD5" },
+    { "1.2.840.113635.100.2.4",           "APPLE_FEE_SHA1" },
+    { "1.2.840.113635.100.2.5",           "APPLE_FEED" },
+    { "1.2.840.113635.100.2.6",           "APPLE_FEEDEXP" },
+    { "1.2.840.113635.100.2.7",           "APPLE_ECDSA" },
+    { "1.2.840.113635.100.3",             "APPLE_DOT_MAC_CERTIFICATE" },
+    { "1.2.840.113635.100.3.1",           "APPLE_DOT_MAC_CERTIFICATE_REQUEST" },
+    { "1.2.840.113635.100.3.2",           "APPLE_DOT_MAC_CERTIFICATE_EXTENSION" },
+    { "1.2.840.113635.100.3.3",           "APPLE_DOT_MAC_CERTIFICATE_REQUEST_VALUES" },
+    { "1.2.840.113635.100.4",             "APPLE_EXTENDED_KEY_USAGE" },
+    { "1.2.840.113635.100.4.1",           "APPLE_CODE_SIGNING" },
+    { "1.2.840.113635.100.4.1.1",         "APPLE_CODE_SIGNING_DEVELOPMENT" },
+    { "1.2.840.113635.100.4.1.2",         "APPLE_SOFTWARE_UPDATE_SIGNING" },
+    { "1.2.840.113635.100.4.1.3",         "APPLE_CODE_SIGNING_THIRD_PARTY" },
+    { "1.2.840.113635.100.4.1.4",         "APPLE_RESOURCE_SIGNING" },
+    { "1.2.840.113635.100.4.2",           "APPLE_I_CHAT_SIGNING" },
+    { "1.2.840.113635.100.4.3",           "APPLE_I_CHAT_ENCRYPTION" },
+    { "1.2.840.113635.100.4.4",           "APPLE_SYSTEM_IDENTITY" },
+    { "1.2.840.113635.100.4.5",           "APPLE_CRYPTO_ENV" },
+    { "1.2.840.113635.100.4.5.1",         "APPLE_CRYPTO_PRODUCTION_ENV" },
+    { "1.2.840.113635.100.4.5.2",         "APPLE_CRYPTO_MAINTENANCE_ENV" },
+    { "1.2.840.113635.100.4.5.3",         "APPLE_CRYPTO_TEST_ENV" },
+    { "1.2.840.113635.100.4.5.4",         "APPLE_CRYPTO_DEVELOPMENT_ENV" },
+    { "1.2.840.113635.100.4.6",           "APPLE_CRYPTO_QO_S" },
+    { "1.2.840.113635.100.4.6.1",         "APPLE_CRYPTO_TIER0_QO_S" },
+    { "1.2.840.113635.100.4.6.2",         "APPLE_CRYPTO_TIER1_QO_S" },
+    { "1.2.840.113635.100.4.6.3",         "APPLE_CRYPTO_TIER2_QO_S" },
+    { "1.2.840.113635.100.4.6.4",         "APPLE_CRYPTO_TIER3_QO_S" },
+    { "1.2.840.113635.100.5",             "APPLE_CERTIFICATE_POLICIES" },
+    { "1.2.840.113635.100.5.1",           "APPLE_CERTIFICATE_POLICY_ID" },
+    { "1.2.840.113635.100.5.2",           "APPLE_DOT_MAC_CERTIFICATE_POLICY_ID" },
+    { "1.2.840.113635.100.5.3",           "APPLE_ADC_CERTIFICATE_POLICY_ID" },
+    { "1.2.840.113635.100.6",             "APPLE_CERTIFICATE_EXTENSIONS" },
+    { "1.2.840.113635.100.6.1",           "APPLE_CERTIFICATE_EXTENSION_CODE_SIGNING" },
+    { "1.2.840.113635.100.6.1.1",         "APPLE_CERTIFICATE_EXTENSION_APPLE_SIGNING" },
+    { "1.2.840.113635.100.6.1.2",         "APPLE_CERTIFICATE_EXTENSION_ADC_DEVELOPER_SIGNING" },
+    { "1.2.840.113635.100.6.1.3",         "APPLE_CERTIFICATE_EXTENSION_ADC_APPLE_SIGNING" },
+    { "1.3.6.1.4.1.311.2.1.4",            "SPC_INDIRECT_DATA_CONTEXT" },
+    { "1.3.6.1.4.1.311.2.1.10",           "SPC_AGENCY_INFO" },
+    { "1.3.6.1.4.1.311.2.1.11",           "SPC_STATEMENT_TYPE" },
+    { "1.3.6.1.4.1.311.2.1.12",           "SPC_SP_OPUS_INFO" },
+    { "1.3.6.1.4.1.311.2.1.14",           "CERT_REQ_EXTENSIONS" },
+    { "1.3.6.1.4.1.311.2.1.15",           "SPC_PE_IMAGE_DATA" },
+    { "1.3.6.1.4.1.311.2.1.18",           "SPC_RAW_FILE_DATA" },
+    { "1.3.6.1.4.1.311.2.1.19",           "SPC_STRUCTURED_STORAGE_DATA" },
+    { "1.3.6.1.4.1.311.2.1.20",           "SPC_JAVA_CLASS_DATA_(TYPE_1)" },
+    { "1.3.6.1.4.1.311.2.1.21",           "INDIVIDUAL_CODE_SIGNING" },
+    { "1.3.6.1.4.1.311.2.1.22",           "COMMERCIAL_CODE_SIGNING" },
+    { "1.3.6.1.4.1.311.2.1.25",           "SPC_LINK_(TYPE_2)" },
+    { "1.3.6.1.4.1.311.2.1.26",           "SPC_MINIMAL_CRITERIA_INFO" },
+    { "1.3.6.1.4.1.311.2.1.27",           "SPC_FINANCIAL_CRITERIA_INFO" },
+    { "1.3.6.1.4.1.311.2.1.28",           "SPC_LINK_(TYPE_3)" },
+    { "1.3.6.1.4.1.311.2.1.29",           "SPC_HASH_INFO_OBJ_ID" },
+    { "1.3.6.1.4.1.311.2.1.30",           "SPC_SIP_INFO_OBJ_ID" },
+    { "1.3.6.1.4.1.311.2.2",              "CTL" },
+    { "1.3.6.1.4.1.311.2.2.1",            "CTL_TRUSTED_CODESIGNING_CA_LIST" },
+    { "1.3.6.1.4.1.311.2.2.2",            "CTL_TRUSTED_CLIENT_AUTH_CA_LIST" },
+    { "1.3.6.1.4.1.311.2.2.3",            "CTL_TRUSTED_SERVER_AUTH_CA_LIST" },
+    { "1.3.6.1.4.1.311.3.2.1",            "TIMESTAMP_REQUEST" },
+    { "1.3.6.1.4.1.311.10.1",             "CERT_TRUST_LIST" },
+    { "1.3.6.1.4.1.311.10.1.1",           "SORTED_CTL" },
+    { "1.3.6.1.4.1.311.10.2",             "NEXT_UPDATE_LOCATION" },
+    { "1.3.6.1.4.1.311.10.3.1",           "CERT_TRUST_LIST_SIGNING" },
+    { "1.3.6.1.4.1.311.10.3.2",           "TIME_STAMP_SIGNING" },
+    { "1.3.6.1.4.1.311.10.3.3",           "SERVER_GATED_CRYPTO" },
+    { "1.3.6.1.4.1.311.10.3.3.1",         "SERIALIZED" },
+    { "1.3.6.1.4.1.311.10.3.4",           "ENCRYPTED_FILE_SYSTEM" },
+    { "1.3.6.1.4.1.311.10.3.5",           "WHQL_CRYPTO" },
+    { "1.3.6.1.4.1.311.10.3.6",           "NT5_CRYPTO" },
+    { "1.3.6.1.4.1.311.10.3.7",           "OEM_WHQL_CRYPTO" },
+    { "1.3.6.1.4.1.311.10.3.8",           "EMBEDDED_NT_CRYPTO" },
+    { "1.3.6.1.4.1.311.10.3.9",           "ROOT_LIST_SIGNER" },
+    { "1.3.6.1.4.1.311.10.3.10",          "QUALIFIED_SUBORDINATION" },
+    { "1.3.6.1.4.1.311.10.3.11",          "KEY_RECOVERY" },
+    { "1.3.6.1.4.1.311.10.3.12",          "DOCUMENT_SIGNING" },
+    { "1.3.6.1.4.1.311.10.3.13",          "LIFETIME_SIGNING" },
+    { "1.3.6.1.4.1.311.10.3.14",          "MOBILE_DEVICE_SOFTWARE" },
+    { "1.3.6.1.4.1.311.10.3.15",          "SMART_DISPLAY" },
+    { "1.3.6.1.4.1.311.10.3.16",          "CSP_SIGNATURE" },
+    { "1.3.6.1.4.1.311.10.3.4.1",         "EFS_RECOVERY" },
+    { "1.3.6.1.4.1.311.10.4.1",           "YESNO_TRUST_ATTR" },
+    { "1.3.6.1.4.1.311.10.5.1",           "DRM" },
+    { "1.3.6.1.4.1.311.10.5.2",           "DRM_INDIVIDUALIZATION" },
+    { "1.3.6.1.4.1.311.10.6.1",           "LICENSES" },
+    { "1.3.6.1.4.1.311.10.6.2",           "LICENSE_SERVER" },
+    { "1.3.6.1.4.1.311.10.7.1",           "KEYID_RDN" },
+    { "1.3.6.1.4.1.311.10.8.1",           "REMOVE_CERTIFICATE" },
+    { "1.3.6.1.4.1.311.10.9.1",           "CROSS_CERT_DIST_POINTS" },
+    { "1.3.6.1.4.1.311.10.10.1",          "CMC_ADD_ATTRIBUTES" },
+    { "1.3.6.1.4.1.311.10.11",            "CERT_PROP_ID_PREFIX" },
+    { "1.3.6.1.4.1.311.10.11.4",          "CERT_MD5_HASH_PROP_ID" },
+    { "1.3.6.1.4.1.311.10.11.20",         "CERT_KEY_IDENTIFIER_PROP_ID" },
+    { "1.3.6.1.4.1.311.10.11.28",         "CERT_ISSUER_SERIAL_NUMBER_MD5_HASH_PROP_ID" },
+    { "1.3.6.1.4.1.311.10.11.29",         "CERT_SUBJECT_NAME_MD5_HASH_PROP_ID" },
+    { "1.3.6.1.4.1.311.10.12.1",          "ANY_APPLICATION_POLICY" },
+    { "1.3.6.1.4.1.311.12",               "CATALOG" },
+    { "1.3.6.1.4.1.311.12.1.1",           "CATALOG_LIST" },
+    { "1.3.6.1.4.1.311.12.1.2",           "CATALOG_LIST_MEMBER" },
+    { "1.3.6.1.4.1.311.12.2.1",           "CATALOG_NAME_VALUE_OBJ_ID" },
+    { "1.3.6.1.4.1.311.12.2.2",           "CATALOG_MEMBER_INFO_OBJ_ID" },
+    { "1.3.6.1.4.1.311.13.1",             "RENEWAL_CERTIFICATE" },
+    { "1.3.6.1.4.1.311.13.2.1",           "ENROLMENT_NAME_VALUE_PAIR" },
+    { "1.3.6.1.4.1.311.13.2.2",           "ENROLMENT_CSP" },
+    { "1.3.6.1.4.1.311.13.2.3",           "OS_VERSION" },
+    { "1.3.6.1.4.1.311.16.4",             "MICROSOFT_RECIPIENT_INFO" },
+    { "1.3.6.1.4.1.311.17.1",             "PKCS12_KEY_PROVIDER_NAME_ATTR" },
+    { "1.3.6.1.4.1.311.17.2",             "LOCAL_MACHINE_KEYSET" },
+    { "1.3.6.1.4.1.311.17.3",             "PKCS12_EXTENDED_ATTRIBUTES" },
+    { "1.3.6.1.4.1.311.20.1",             "AUTO_ENROLL_CTL_USAGE" },
+    { "1.3.6.1.4.1.311.20.2",             "ENROLL_CERTTYPE_EXTENSION" },
+    { "1.3.6.1.4.1.311.20.2.1",           "ENROLLMENT_AGENT" },
+    { "1.3.6.1.4.1.311.20.2.2",           "SMARTCARD_LOGON" },
+    { "1.3.6.1.4.1.311.20.2.3",           "UNIVERSAL_PRINCIPAL_NAME" },
+    { "1.3.6.1.4.1.311.20.3",             "CERT_MANIFOLD" },
+    { "1.3.6.1.4.1.311.21.1",             "C_A_KEY_CERT_INDEX_PAIR" },
+    { "1.3.6.1.4.1.311.21.2",             "CERT_SRV_PREVIOUS_CERT_HASH" },
+    { "1.3.6.1.4.1.311.21.3",             "CRL_VIRTUAL_BASE" },
+    { "1.3.6.1.4.1.311.21.4",             "CRL_NEXT_PUBLISH" },
+    { "1.3.6.1.4.1.311.21.5",             "CA_EXCHANGE" },
+    { "1.3.6.1.4.1.311.21.6",             "KEY_RECOVERY" },
+    { "1.3.6.1.4.1.311.21.7",             "CERTIFICATE_TEMPLATE" },
+    { "1.3.6.1.4.1.311.21.9",             "RDN_DUMMY_SIGNER" },
+    { "1.3.6.1.4.1.311.21.10",            "APPLICATION_CERT_POLICIES" },
+    { "1.3.6.1.4.1.311.21.11",            "APPLICATION_POLICY_MAPPINGS" },
+    { "1.3.6.1.4.1.311.21.12",            "APPLICATION_POLICY_CONSTRAINTS" },
+    { "1.3.6.1.4.1.311.21.13",            "ARCHIVED_KEY" },
+    { "1.3.6.1.4.1.311.21.14",            "CRL_SELF_CDP" },
+    { "1.3.6.1.4.1.311.21.15",            "REQUIRE_CERT_CHAIN_POLICY" },
+    { "1.3.6.1.4.1.311.21.16",            "ARCHIVED_KEY_CERT_HASH" },
+    { "1.3.6.1.4.1.311.21.17",            "ISSUED_CERT_HASH" },
+    { "1.3.6.1.4.1.311.21.19",            "DS_EMAIL_REPLICATION" },
+    { "1.3.6.1.4.1.311.21.20",            "REQUEST_CLIENT_INFO" },
+    { "1.3.6.1.4.1.311.21.21",            "ENCRYPTED_KEY_HASH" },
+    { "1.3.6.1.4.1.311.21.22",            "CERTSRV_CROSS_CA_VERSION" },
+    { "1.3.6.1.4.1.311.25.1",             "NTDS_REPLICATION" },
+    { "1.3.6.1.4.1.311.31.1",             "PRODUCT_UPDATE" },
+    { "1.3.6.1.4.1.311.47.1.1",           "SYSTEM_HEALTH" },
+    { "1.3.6.1.4.1.311.47.1.3",           "SYSTEM_HEALTH_LOOPHOLE" },
+    { "1.3.6.1.4.1.311.60.1.1",           "ROOT_PROGRAM_FLAGS" },
+    { "1.3.6.1.4.1.311.61.1.1",           "KERNEL_MODE_CODE_SIGNING" },
+    { "1.3.6.1.4.1.311.60.2.1.1",         "JURISDICTION_OF_INCORPORATION_L" },
+    { "1.3.6.1.4.1.311.60.2.1.2",         "JURISDICTION_OF_INCORPORATION_SP" },
+    { "1.3.6.1.4.1.311.60.2.1.3",         "JURISDICTION_OF_INCORPORATION_C" },
+    { "1.3.6.1.4.1.311.88",               "CAPI_COM" },
+    { "1.3.6.1.4.1.311.88.1",             "CAPI_COM_VERSION" },
+    { "1.3.6.1.4.1.311.88.2",             "CAPI_COM_ATTRIBUTE" },
+    { "1.3.6.1.4.1.311.88.2.1",           "CAPI_COM_DOCUMENT_NAME" },
+    { "1.3.6.1.4.1.311.88.2.2",           "CAPI_COM_DOCUMENT_DESCRIPTION" },
+    { "1.3.6.1.4.1.311.88.3",             "CAPI_COM_ENCRYPTED_DATA" },
+    { "1.3.6.1.4.1.311.88.3.1",           "CAPI_COM_ENCRYPTED_CONTENT" },
+    { "1.3.6.1.4.1.188.7.1.1",            "ASCOM" },
+    { "1.3.6.1.4.1.188.7.1.1.1",          "IDEA_ECB" },
+    { "1.3.6.1.4.1.188.7.1.1.2",          "IDEA_CBC" },
+    { "1.3.6.1.4.1.188.7.1.1.3",          "IDEA_CFB" },
+    { "1.3.6.1.4.1.188.7.1.1.4",          "IDEA_OFB" },
+    { "1.3.6.1.4.1.2428.10.1.1",          "UNINETT_POLICY_IDENTIFIER" },
+    { "1.3.6.1.4.1.2712.10",              "ICE_TEL_POLICY_IDENTIFIER" },
+    { "1.3.6.1.4.1.2786.1.1.1",           "ICE_TEL_ITALIAN_POLICY_IDENTIFIER" },
+    { "1.3.6.1.4.1.3029.1.1.1",           "BLOWFISH_ECB" },
+    { "1.3.6.1.4.1.3029.1.1.2",           "BLOWFISH_CBC" },
+    { "1.3.6.1.4.1.3029.1.1.3",           "BLOWFISH_CFB" },
+    { "1.3.6.1.4.1.3029.1.1.4",           "BLOWFISH_OFB" },
+    { "1.3.6.1.4.1.3029.1.2.1",           "ELGAMAL" },
+    { "1.3.6.1.4.1.3029.1.2.1.1",         "ELGAMAL_WITH_SHA_1" },
+    { "1.3.6.1.4.1.3029.1.2.1.2",         "ELGAMAL_WITH_RIPEMD_160" },
+    { "1.3.6.1.4.1.3029.3.1.1",           "CRYPTLIB_PRESENCE_CHECK" },
+    { "1.3.6.1.4.1.3029.3.1.2",           "PKI_BOOT" },
+    { "1.3.6.1.4.1.3029.3.1.4",           "CRL_EXT_REASON" },
+    { "1.3.6.1.4.1.3029.3.1.5",           "KEY_FEATURES" },
+    { "1.3.6.1.4.1.3029.4.1",             "CRYPTLIB_CONTENT" },
+    { "1.3.6.1.4.1.3029.4.1.1",           "CRYPTLIB_CONFIG_DATA" },
+    { "1.3.6.1.4.1.3029.4.1.2",           "CRYPTLIB_USER_INDEX" },
+    { "1.3.6.1.4.1.3029.4.1.3",           "CRYPTLIB_USER_INFO" },
+    { "1.3.6.1.4.1.3029.4.1.4",           "RTCS_REQUEST" },
+    { "1.3.6.1.4.1.3029.4.1.5",           "RTCS_RESPONSE" },
+    { "1.3.6.1.4.1.3029.4.1.6",           "RTCS_RESPONSE_EXT" },
+    { "1.3.6.1.4.1.3029.42.11172.1",      "MPEG_1" },
+    { "1.3.6.1.4.1.3029.54.11940.54",     "TSA_POLICY" },
+    { "1.3.6.1.4.1.3029.88.89.90.90.89",  "X_YZZY_POLICY_IDENTIFIER" },
+    { "1.3.6.1.4.1.3401.8.1.1",           "PGP_EXTENSION" },
+    { "1.3.6.1.4.1.3576.7",               "ECIA_ASC_X12_EDI" },
+    { "1.3.6.1.4.1.3576.7.1",             "PLAIN_ED_IMESSAGE" },
+    { "1.3.6.1.4.1.3576.7.2",             "SIGNED_ED_IMESSAGE" },
+    { "1.3.6.1.4.1.3576.7.5",             "INTEGRITY_ED_IMESSAGE" },
+    { "1.3.6.1.4.1.3576.7.65",            "IA_RECEIPT_MESSAGE" },
+    { "1.3.6.1.4.1.3576.7.97",            "IA_STATUS_MESSAGE" },
+    { "1.3.6.1.4.1.3576.8",               "ECIA_EDIFACT" },
+    { "1.3.6.1.4.1.3576.9",               "ECIA_NON_EDI" },
+    { "1.3.6.1.4.1.4146",                 "GLOBALSIGN" },
+    { "1.3.6.1.4.1.4146.1",               "GLOBALSIGN_POLICY" },
+    { "1.3.6.1.4.1.4146.1.10",            "GLOBALSIGN_DV_POLICY" },
+    { "1.3.6.1.4.1.4146.1.20",            "GLOBALSIGN_OV_POLICY" },
+    { "1.3.6.1.4.1.4146.1.30",            "GLOBALSIGN_TSA_POLICY" },
+    { "1.3.6.1.4.1.4146.1.40",            "GLOBALSIGN_CLIENT_CERT_POLICY" },
+    { "1.3.6.1.4.1.4146.1.50",            "GLOBALSIGN_CODE_SIGN_POLICY" },
+    { "1.3.6.1.4.1.4146.1.60",            "GLOBALSIGN_ROOT_SIGN_POLICY" },
+    { "1.3.6.1.4.1.4146.1.70",            "GLOBALSIGN_TRUSTED_ROOT_POLICY" },
+    { "1.3.6.1.4.1.4146.1.80",            "GLOBALSIGN_EDI_CLIENT_POLICY" },
+    { "1.3.6.1.4.1.4146.1.81",            "GLOBALSIGN_EDI_SERVER_POLICY" },
+    { "1.3.6.1.4.1.4146.1.90",            "GLOBALSIGN_TPM_ROOT_POLICY" },
+    { "1.3.6.1.4.1.4146.1.95",            "GLOBALSIGN_OCSP_POLICY" },
+    { "1.3.6.1.4.1.5309.1",               "EDEL_WEB_POLICY" },
+    { "1.3.6.1.4.1.5309.1.2",             "EDEL_WEB_CUSTOMER_POLICY" },
+    { "1.3.6.1.4.1.5309.1.2.1",           "EDEL_WEB_CLEPSYDRE_POLICY" },
+    { "1.3.6.1.4.1.5309.1.2.2",           "EDEL_WEB_EXPERIMENTAL_TSA_POLICY" },
+    { "1.3.6.1.4.1.5309.1.2.3",           "EDEL_WEB_OPEN_EVIDENCE_TSA_POLICY" },
+    { "1.3.6.1.4.1.5472",                 "TIMEPROOF" },
+    { "1.3.6.1.4.1.5472.1",               "TSS" },
+    { "1.3.6.1.4.1.5472.1.1",             "TSS80" },
+    { "1.3.6.1.4.1.5472.1.2",             "TSS380" },
+    { "1.3.6.1.4.1.5472.1.3",             "TSS400" },
+    { "1.3.6.1.4.1.5770.0.3",             "SECONDARY_PRACTICES" },
+    { "1.3.6.1.4.1.5770.0.4",             "PHYSICIAN_IDENTIFIERS" },
+    { "1.3.6.1.4.1.6449.1.2.1.3.1",       "COMODO_POLICY" },
+    { "1.3.6.1.4.1.6449.1.2.2.15",        "WOTRUST_POLICY" },
+    { "1.3.6.1.4.1.6449.1.3.5.2",         "COMODO_CERTIFIED_DELIVERY_SERVICE" },
+    { "1.3.6.1.4.1.6449.2.1.1",           "COMODO_TIMESTAMPING_POLICY" },
+    { "1.3.6.1.4.1.8301.3.5.1",           "VALIDITY_MODEL_CHAIN" },
+    { "1.3.6.1.4.1.8301.3.5.2",           "VALIDITY_MODEL_SHELL" },
+    { "1.3.6.1.4.1.8231.1",               "ROL_UNICO_NACIONAL" },
+    { "1.3.6.1.4.1.11591",                "GNU" },
+    { "1.3.6.1.4.1.11591.1",              "GNU_RADIUS" },
+    { "1.3.6.1.4.1.11591.3",              "GNU_RADAR" },
+    { "1.3.6.1.4.1.11591.12",             "GNU_DIGEST_ALGORITHM" },
+    { "1.3.6.1.4.1.11591.12.2",           "TIGER" },
+    { "1.3.6.1.4.1.11591.13",             "GNU_ENCRYPTION_ALGORITHM" },
+    { "1.3.6.1.4.1.11591.13.2",           "SERPENT" },
+    { "1.3.6.1.4.1.11591.13.2.1",         "SERPENT128_ECB" },
+    { "1.3.6.1.4.1.11591.13.2.2",         "SERPENT128_CBC" },
+    { "1.3.6.1.4.1.11591.13.2.3",         "SERPENT128_OFB" },
+    { "1.3.6.1.4.1.11591.13.2.4",         "SERPENT128_CFB" },
+    { "1.3.6.1.4.1.11591.13.2.21",        "SERPENT192_ECB" },
+    { "1.3.6.1.4.1.11591.13.2.22",        "SERPENT192_CBC" },
+    { "1.3.6.1.4.1.11591.13.2.23",        "SERPENT192_OFB" },
+    { "1.3.6.1.4.1.11591.13.2.24",        "SERPENT192_CFB" },
+    { "1.3.6.1.4.1.11591.13.2.41",        "SERPENT256_ECB" },
+    { "1.3.6.1.4.1.11591.13.2.42",        "SERPENT256_CBC" },
+    { "1.3.6.1.4.1.11591.13.2.43",        "SERPENT256_OFB" },
+    { "1.3.6.1.4.1.11591.13.2.44",        "SERPENT256_CFB" },
+    { "1.3.6.1.4.1.16334.509.1.1",        "NORTHROP_GRUMMAN_EXT_KEY_USAGE?" },
+    { "1.3.6.1.4.1.16334.509.2.1",        "NGC_CLASS1" },
+    { "1.3.6.1.4.1.16334.509.2.2",        "NGC_CLASS2" },
+    { "1.3.6.1.4.1.16334.509.2.3",        "NGC_CLASS3" },
+    { "1.3.6.1.4.1.23629.1.4.2.1.1",      "SAFENET_USAGE_LIMIT" },
+    { "1.3.6.1.4.1.23629.1.4.2.1.2",      "SAFENET_END_DATE" },
+    { "1.3.6.1.4.1.23629.1.4.2.1.3",      "SAFENET_START_DATE" },
+    { "1.3.6.1.4.1.23629.1.4.2.1.4",      "SAFENET_ADMIN_CERT" },
+    { "1.3.6.1.4.1.23629.1.4.2.2.1",      "SAFENET_KEY_DIGEST" },
+    { "1.3.6.1.5.5.7",                    "PKIX" },
+    { "1.3.6.1.5.5.7.0.12",               "ATTRIBUTE_CERT" },
+    { "1.3.6.1.5.5.7.1",                  "PRIVATE_EXTENSION" },
+    { "1.3.6.1.5.5.7.1.1",                "AUTHORITY_INFO_ACCESS" },
+    { "1.3.6.1.5.5.7.1.2",                "BIOMETRIC_INFO" },
+    { "1.3.6.1.5.5.7.1.3",                "QC_STATEMENTS" },
+    { "1.3.6.1.5.5.7.1.4",                "AC_AUDIT_IDENTITY" },
+    { "1.3.6.1.5.5.7.1.5",                "AC_TARGETING" },
+    { "1.3.6.1.5.5.7.1.6",                "AC_AA_CONTROLS" },
+    { "1.3.6.1.5.5.7.1.7",                "IP_ADDR_BLOCKS" },
+    { "1.3.6.1.5.5.7.1.8",                "AUTONOMOUS_SYS_IDS" },
+    { "1.3.6.1.5.5.7.1.9",                "ROUTER_IDENTIFIER" },
+    { "1.3.6.1.5.5.7.1.10",               "AC_PROXYING" },
+    { "1.3.6.1.5.5.7.1.11",               "SUBJECT_INFO_ACCESS" },
+    { "1.3.6.1.5.5.7.1.12",               "LOGO_TYPE" },
+    { "1.3.6.1.5.5.7.1.13",               "WLAN_SSID" },
+    { "1.3.6.1.5.5.7.2",                  "POLICY_QUALIFIER_IDS" },
+    { "1.3.6.1.5.5.7.2.1",                "CPS" },
+    { "1.3.6.1.5.5.7.2.2",                "UNOTICE" },
+    { "1.3.6.1.5.5.7.2.3",                "TEXT_NOTICE" },
+    { "1.3.6.1.5.5.7.3",                  "KEY_PURPOSE" },
+    { "1.3.6.1.5.5.7.3.1",                "SERVER_AUTH" },
+    { "1.3.6.1.5.5.7.3.2",                "CLIENT_AUTH" },
+    { "1.3.6.1.5.5.7.3.3",                "CODE_SIGNING" },
+    { "1.3.6.1.5.5.7.3.4",                "EMAIL_PROTECTION" },
+    { "1.3.6.1.5.5.7.3.5",                "IPSEC_END_SYSTEM" },
+    { "1.3.6.1.5.5.7.3.6",                "IPSEC_TUNNEL" },
+    { "1.3.6.1.5.5.7.3.7",                "IPSEC_USER" },
+    { "1.3.6.1.5.5.7.3.8",                "TIME_STAMPING" },
+    { "1.3.6.1.5.5.7.3.9",                "OCSP_SIGNING" },
+    { "1.3.6.1.5.5.7.3.10",               "DVCS" },
+    { "1.3.6.1.5.5.7.3.11",               "SBGP_CERT_AA_SERVER_AUTH" },
+    { "1.3.6.1.5.5.7.3.13",               "EAP_OVER_PPP" },
+    { "1.3.6.1.5.5.7.3.14",               "EAP_OVER_LAN" },
+    { "1.3.6.1.5.5.7.4",                  "CMP_INFORMATION_TYPES" },
+    { "1.3.6.1.5.5.7.4.1",                "CA_PROT_ENC_CERT" },
+    { "1.3.6.1.5.5.7.4.2",                "SIGN_KEY_PAIR_TYPES" },
+    { "1.3.6.1.5.5.7.4.3",                "ENC_KEY_PAIR_TYPES" },
+    { "1.3.6.1.5.5.7.4.4",                "PREFERRED_SYMM_ALG" },
+    { "1.3.6.1.5.5.7.4.5",                "CA_KEY_UPDATE_INFO" },
+    { "1.3.6.1.5.5.7.4.6",                "CURRENT_CRL" },
+    { "1.3.6.1.5.5.7.4.7",                "UNSUPPORTED_OI_DS" },
+    { "1.3.6.1.5.5.7.4.10",               "KEY_PAIR_PARAM_REQ" },
+    { "1.3.6.1.5.5.7.4.11",               "KEY_PAIR_PARAM_REP" },
+    { "1.3.6.1.5.5.7.4.12",               "REV_PASSPHRASE" },
+    { "1.3.6.1.5.5.7.4.13",               "IMPLICIT_CONFIRM" },
+    { "1.3.6.1.5.5.7.4.14",               "CONFIRM_WAIT_TIME" },
+    { "1.3.6.1.5.5.7.4.15",               "ORIG_PKI_MESSAGE" },
+    { "1.3.6.1.5.5.7.4.16",               "SUPP_LANG_TAGS" },
+    { "1.3.6.1.5.5.7.5",                  "CRMF_REGISTRATION" },
+    { "1.3.6.1.5.5.7.5.1",                "REG_CTRL" },
+    { "1.3.6.1.5.5.7.5.1.1",              "REG_TOKEN" },
+    { "1.3.6.1.5.5.7.5.1.2",              "AUTHENTICATOR" },
+    { "1.3.6.1.5.5.7.5.1.3",              "PKI_PUBLICATION_INFO" },
+    { "1.3.6.1.5.5.7.5.1.4",              "PKI_ARCHIVE_OPTIONS" },
+    { "1.3.6.1.5.5.7.5.1.5",              "OLD_CERT_ID" },
+    { "1.3.6.1.5.5.7.5.1.6",              "PROTOCOL_ENCR_KEY" },
+    { "1.3.6.1.5.5.7.5.1.7",              "ALT_CERT_TEMPLATE" },
+    { "1.3.6.1.5.5.7.5.1.8",              "WTLS_TEMPLATE" },
+    { "1.3.6.1.5.5.7.5.2",                "UTF8_PAIRS" },
+    { "1.3.6.1.5.5.7.5.2.1",              "UTF8_PAIRS" },
+    { "1.3.6.1.5.5.7.5.2.2",              "CERT_REQ" },
+    { "1.3.6.1.5.5.7.6",                  "ALGORITHMS" },
+    { "1.3.6.1.5.5.7.6.1",                "DES40" },
+    { "1.3.6.1.5.5.7.6.2",                "NO_SIGNATURE" },
+    { "1.3.6.1.5.5.7.6.3",                "DH_SIG_HMAC_SHA1" },
+    { "1.3.6.1.5.5.7.6.4",                "DH_POP" },
+    { "1.3.6.1.5.5.7.7",                  "CMC_CONTROLS" },
+    { "1.3.6.1.5.5.7.8",                  "OTHER_NAMES" },
+    { "1.3.6.1.5.5.7.8.1",                "PERSONAL_DATA" },
+    { "1.3.6.1.5.5.7.8.2",                "USER_GROUP" },
+    { "1.3.6.1.5.5.7.8.5",                "XMPP_ADDR" },
+    { "1.3.6.1.5.5.7.9",                  "PERSONAL_DATA" },
+    { "1.3.6.1.5.5.7.9.1",                "DATE_OF_BIRTH" },
+    { "1.3.6.1.5.5.7.9.2",                "PLACE_OF_BIRTH" },
+    { "1.3.6.1.5.5.7.9.3",                "GENDER" },
+    { "1.3.6.1.5.5.7.9.4",                "COUNTRY_OF_CITIZENSHIP" },
+    { "1.3.6.1.5.5.7.9.5",                "COUNTRY_OF_RESIDENCE" },
+    { "1.3.6.1.5.5.7.10",                 "ATTRIBUTE_CERTIFICATE" },
+    { "1.3.6.1.5.5.7.10.1",               "AUTHENTICATION_INFO" },
+    { "1.3.6.1.5.5.7.10.2",               "ACCESS_IDENTITY" },
+    { "1.3.6.1.5.5.7.10.3",               "CHARGING_IDENTITY" },
+    { "1.3.6.1.5.5.7.10.4",               "GROUP" },
+    { "1.3.6.1.5.5.7.10.5",               "ROLE" },
+    { "1.3.6.1.5.5.7.10.6",               "WLAN_SSID" },
+    { "1.3.6.1.5.5.7.11",                 "PERSONAL_DATA" },
+    { "1.3.6.1.5.5.7.11.1",               "PKIX_QC_SYNTAX_V1" },
+    { "1.3.6.1.5.5.7.14.2",               "RESOURCE_CERTIFICATE_POLICY" },
+    { "1.3.6.1.5.5.7.20",                 "LOGO" },
+    { "1.3.6.1.5.5.7.20.1",               "LOGO_LOYALTY" },
+    { "1.3.6.1.5.5.7.20.2",               "LOGO_BACKGROUND" },
+    { "1.3.6.1.5.5.7.48.1",               "OCSP" },
+    { "1.3.6.1.5.5.7.48.1.1",             "OCSP_BASIC" },
+    { "1.3.6.1.5.5.7.48.1.2",             "OCSP_NONCE" },
+    { "1.3.6.1.5.5.7.48.1.3",             "OCSP_CRL" },
+    { "1.3.6.1.5.5.7.48.1.4",             "OCSP_RESPONSE" },
+    { "1.3.6.1.5.5.7.48.1.5",             "OCSP_NO_CHECK" },
+    { "1.3.6.1.5.5.7.48.1.6",             "OCSP_ARCHIVE_CUTOFF" },
+    { "1.3.6.1.5.5.7.48.1.7",             "OCSP_SERVICE_LOCATOR" },
+    { "1.3.6.1.5.5.7.48.2",               "CA_ISSUERS" },
+    { "1.3.6.1.5.5.7.48.3",               "TIME_STAMPING" },
+    { "1.3.6.1.5.5.7.48.4",               "DVCS" },
+    { "1.3.6.1.5.5.7.48.5",               "CA_REPOSITORY" },
+    { "1.3.6.1.5.5.7.48.7",               "SIGNED_OBJECT_REPOSITORY" },
+    { "1.3.6.1.5.5.7.48.10",              "RPKI_MANIFEST" },
+    { "1.3.6.1.5.5.7.48.11",              "SIGNED_OBJECT" },
+    { "1.3.6.1.5.5.8.1.1",                "HMAC_MD5" },
+    { "1.3.6.1.5.5.8.1.2",                "HMAC_SHA" },
+    { "1.3.6.1.5.5.8.1.3",                "HMAC_TIGER" },
+    { "1.3.6.1.5.5.8.2.2",                "I_KE_INTERMEDIATE" },
+    { "1.3.12.2.1011.7.1",                "DEC_ENCRYPTION_ALGORITHM" },
+    { "1.3.12.2.1011.7.1.2",              "DEC_DEA" },
+    { "1.3.12.2.1011.7.2",                "DEC_HASH_ALGORITHM" },
+    { "1.3.12.2.1011.7.2.1",              "DEC_MD2" },
+    { "1.3.12.2.1011.7.2.2",              "DEC_MD4" },
+    { "1.3.12.2.1011.7.3",                "DEC_SIGNATURE_ALGORITHM" },
+    { "1.3.12.2.1011.7.3.1",              "DEC_MD2WITH_RSA" },
+    { "1.3.12.2.1011.7.3.2",              "DEC_MD4WITH_RSA" },
+    { "1.3.12.2.1011.7.3.3",              "DEC_DEAMAC" },
+    { "1.3.14.2.26.5",                    "SHA" },
+    { "1.3.14.3.2.1.1",                   "RSA" },
+    { "1.3.14.3.2.2",                     "MD4_WIT_RSA" },
+    { "1.3.14.3.2.3",                     "MD5_WITH_RSA" },
+    { "1.3.14.3.2.4",                     "MD4_WITH_RSA_ENCRYPTION" },
+    { "1.3.14.3.2.2.1",                   "SQMOD_N" },
+    { "1.3.14.3.2.3.1",                   "SQMOD_NWITH_RSA" },
+    { "1.3.14.3.2.6",                     "DES_ECB" },
+    { "1.3.14.3.2.7",                     "DES_CBC" },
+    { "1.3.14.3.2.8",                     "DES_OFB" },
+    { "1.3.14.3.2.9",                     "DES_CFB" },
+    { "1.3.14.3.2.10",                    "DES_MAC" },
+    { "1.3.14.3.2.11",                    "RSA_SIGNATURE" },
+    { "1.3.14.3.2.12",                    "DSA" },
+    { "1.3.14.3.2.13",                    "DSA_WITH_SHA" },
+    { "1.3.14.3.2.14",                    "MDC2_WITH_RSA_SIGNATURE" },
+    { "1.3.14.3.2.15",                    "SHA_WITH_RSA_SIGNATURE" },
+    { "1.3.14.3.2.16",                    "DH_WITH_COMMON_MODULUS" },
+    { "1.3.14.3.2.17",                    "DES_EDE" },
+    { "1.3.14.3.2.18",                    "SHA" },
+    { "1.3.14.3.2.19",                    "MDC_2" },
+    { "1.3.14.3.2.20",                    "DSA_COMMON" },
+    { "1.3.14.3.2.21",                    "DSA_COMMON_WITH_SHA" },
+    { "1.3.14.3.2.22",                    "RSA_KEY_TRANSPORT" },
+    { "1.3.14.3.2.23",                    "KEYED_HASH_SEAL" },
+    { "1.3.14.3.2.24",                    "MD2_WITH_RSA_SIGNATURE" },
+    { "1.3.14.3.2.25",                    "MD5_WITH_RSA_SIGNATURE" },
+    { "1.3.14.3.2.26",                    "SHA1" },
+    { "1.3.14.3.2.27",                    "DSA_WITH_SHA1" },
+    { "1.3.14.3.2.28",                    "DSA_WITH_COMMON_SHA1" },
+    { "1.3.14.3.2.29",                    "SHA_1_WITH_RSA_ENCRYPTION" },
+    { "1.3.14.3.3.1",                     "SIMPLE_STRONG_AUTH_MECHANISM" },
+    { "1.3.14.7.2.1.1",                   "EL_GAMAL" },
+    { "1.3.14.7.2.3.1",                   "MD2_WITH_RSA" },
+    { "1.3.14.7.2.3.2",                   "MD2_WITH_EL_GAMAL" },
+    { "1.3.36.1",                         "DOCUMENT" },
+    { "1.3.36.1.1",                       "FINAL_VERSION" },
+    { "1.3.36.1.2",                       "DRAFT" },
+    { "1.3.36.2",                         "SIO" },
+    { "1.3.36.2.1",                       "SEDU" },
+    { "1.3.36.3",                         "ALGORITHM" },
+    { "1.3.36.3.1",                       "ENCRYPTION_ALGORITHM" },
+    { "1.3.36.3.1.1",                     "DES" },
+    { "1.3.36.3.1.1.1",                   "DES_ECB_PAD" },
+    { "1.3.36.3.1.1.1.1",                 "DES_ECB_IS_OPAD" },
+    { "1.3.36.3.1.1.2.1",                 "DES_CBC_PAD" },
+    { "1.3.36.3.1.1.2.1.1",               "DES_CBC_IS_OPAD" },
+    { "1.3.36.3.1.3",                     "DES_3" },
+    { "1.3.36.3.1.3.1.1",                 "DES_3_ECB_PAD" },
+    { "1.3.36.3.1.3.1.1.1",               "DES_3_ECB_IS_OPAD" },
+    { "1.3.36.3.1.3.2.1",                 "DES_3_CBC_PAD" },
+    { "1.3.36.3.1.3.2.1.1",               "DES_3_CBC_IS_OPAD" },
+    { "1.3.36.3.1.2",                     "IDEA" },
+    { "1.3.36.3.1.2.1",                   "IDEA_ECB" },
+    { "1.3.36.3.1.2.1.1",                 "IDEA_ECB_PAD" },
+    { "1.3.36.3.1.2.1.1.1",               "IDEA_ECB_IS_OPAD" },
+    { "1.3.36.3.1.2.2",                   "IDEA_CBC" },
+    { "1.3.36.3.1.2.2.1",                 "IDEA_CBC_PAD" },
+    { "1.3.36.3.1.2.2.1.1",               "IDEA_CBC_IS_OPAD" },
+    { "1.3.36.3.1.2.3",                   "IDEA_OFB" },
+    { "1.3.36.3.1.2.4",                   "IDEA_CFB" },
+    { "1.3.36.3.1.4",                     "RSA_ENCRYPTION" },
+    { "1.3.36.3.1.4.512.17",              "RSA_ENCRYPTION_WITHLMOD512EXPE17" },
+    { "1.3.36.3.1.5",                     "BSI_1" },
+    { "1.3.36.3.1.5.1",                   "BSI_1_ECB_PAD" },
+    { "1.3.36.3.1.5.2",                   "BSI_1_CBC_PAD" },
+    { "1.3.36.3.1.5.2.1",                 "BSI_1_CBC_PE_MPAD" },
+    { "1.3.36.3.2",                       "HASH_ALGORITHM" },
+    { "1.3.36.3.2.1",                     "RIPEMD160" },
+    { "1.3.36.3.2.2",                     "RIPEMD128" },
+    { "1.3.36.3.2.3",                     "RIPEMD256" },
+    { "1.3.36.3.2.4",                     "MDC2SINGLE_LENGTH" },
+    { "1.3.36.3.2.5",                     "MDC2DOUBLE_LENGTH" },
+    { "1.3.36.3.3",                       "SIGNATURE_ALGORITHM" },
+    { "1.3.36.3.3.1",                     "RSA_SIGNATURE" },
+    { "1.3.36.3.3.1.1",                   "RSA_SIGNATURE_WITHSHA1" },
+    { "1.3.36.3.3.1.1.1024.11",           "RSA_SIGNATURE_WITHSHA1_L1024_L11" },
+    { "1.3.36.3.3.1.2",                   "RSA_SIGNATURE_WITHRIPEMD160" },
+    { "1.3.36.3.3.1.2.1024.11",           "RSA_SIGNATURE_WITHRIPEMD160_L1024_L11" },
+    { "1.3.36.3.3.1.3",                   "RSA_SIGNATURE_WITHRIMPEMD128" },
+    { "1.3.36.3.3.1.4",                   "RSA_SIGNATURE_WITHRIMPEMD256" },
+    { "1.3.36.3.3.2",                     "ECSIE_SIGN" },
+    { "1.3.36.3.3.2.1",                   "ECSIE_SIGN_WITHSHA1" },
+    { "1.3.36.3.3.2.2",                   "ECSIE_SIGN_WITHRIPEMD160" },
+    { "1.3.36.3.3.2.3",                   "ECSIE_SIGN_WITHMD2" },
+    { "1.3.36.3.3.2.4",                   "ECSIE_SIGN_WITHMD5" },
+    { "1.3.36.3.3.2.8.1.1.1",             "BRAINPOOL_P160R1" },
+    { "1.3.36.3.3.2.8.1.1.2",             "BRAINPOOL_P160T1" },
+    { "1.3.36.3.3.2.8.1.1.3",             "BRAINPOOL_P192R1" },
+    { "1.3.36.3.3.2.8.1.1.4",             "BRAINPOOL_P192T1" },
+    { "1.3.36.3.3.2.8.1.1.5",             "BRAINPOOL_P224R1" },
+    { "1.3.36.3.3.2.8.1.1.6",             "BRAINPOOL_P224T1" },
+    { "1.3.36.3.3.2.8.1.1.7",             "BRAINPOOL_P256R1" },
+    { "1.3.36.3.3.2.8.1.1.8",             "BRAINPOOL_P256T1" },
+    { "1.3.36.3.3.2.8.1.1.9",             "BRAINPOOL_P320R1" },
+    { "1.3.36.3.3.2.8.1.1.10",            "BRAINPOOL_P320T1" },
+    { "1.3.36.3.3.2.8.1.1.11",            "BRAINPOOL_P384R1" },
+    { "1.3.36.3.3.2.8.1.1.12",            "BRAINPOOL_P384T1" },
+    { "1.3.36.3.3.2.8.1.1.13",            "BRAINPOOL_P512R1" },
+    { "1.3.36.3.3.2.8.1.1.14",            "BRAINPOOL_P512T1" },
+    { "1.3.36.3.4",                       "SIGNATURE_SCHEME" },
+    { "1.3.36.3.4.1",                     "SIG_S_ISO9796_1" },
+    { "1.3.36.3.4.2",                     "SIG_S_ISO9796_2" },
+    { "1.3.36.3.4.2.1",                   "SIG_S_ISO9796_2_WITHRED" },
+    { "1.3.36.3.4.2.2",                   "SIG_S_ISO9796_2_WITHRSA" },
+    { "1.3.36.3.4.2.3",                   "SIG_S_ISO9796_2_WITHRND" },
+    { "1.3.36.4",                         "ATTRIBUTE" },
+    { "1.3.36.5",                         "POLICY" },
+    { "1.3.36.6",                         "API" },
+    { "1.3.36.6.1",                       "MANUFACTURER_SPECIFIC_API" },
+    { "1.3.36.6.1.1",                     "UTIMACO_API" },
+    { "1.3.36.6.2",                       "FUNCTIONALITY_SPECIFIC_API" },
+    { "1.3.36.7",                         "KEYMGMNT" },
+    { "1.3.36.7.1",                       "KEYAGREE" },
+    { "1.3.36.7.1.1",                     "BSI_PKE" },
+    { "1.3.36.7.2",                       "KEYTRANS" },
+    { "1.3.36.7.2.1",                     "ENC_ISO9796_2_WITHRSA" },
+    { "1.3.36.8.1.1",                     "TELETRUST_SIG_G_CONFORM_POLICY_IDENTIFIER" },
+    { "1.3.36.8.2.1",                     "DIRECTORY_SERVICE" },
+    { "1.3.36.8.3.1",                     "DATE_OF_CERT_GEN" },
+    { "1.3.36.8.3.2",                     "PROCURATION" },
+    { "1.3.36.8.3.3",                     "ADMISSION" },
+    { "1.3.36.8.3.4",                     "MONETARY_LIMIT" },
+    { "1.3.36.8.3.5",                     "DECLARATION_OF_MAJORITY" },
+    { "1.3.36.8.3.6",                     "INTEGRATED_CIRCUIT_CARD_SERIAL_NUMBER" },
+    { "1.3.36.8.3.7",                     "P_K_REFERENCE" },
+    { "1.3.36.8.3.8",                     "RESTRICTION" },
+    { "1.3.36.8.3.9",                     "RETRIEVE_IF_ALLOWED" },
+    { "1.3.36.8.3.10",                    "REQUESTED_CERTIFICATE" },
+    { "1.3.36.8.3.11",                    "NAMING_AUTHORITIES" },
+    { "1.3.36.8.3.11.1",                  "RECHT_WIRTSCHAFT_STEUERN" },
+    { "1.3.36.8.3.11.1.1",                "RECHTSANWAELTIN" },
+    { "1.3.36.8.3.11.1.2",                "RECHTSANWALT" },
+    { "1.3.36.8.3.11.1.3",                "RECHTS_BEISTAND" },
+    { "1.3.36.8.3.11.1.4",                "STEUER_BERATERIN" },
+    { "1.3.36.8.3.11.1.5",                "STEUER_BERATER" },
+    { "1.3.36.8.3.11.1.6",                "STEUER_BEVOLLMAECHTIGTE" },
+    { "1.3.36.8.3.11.1.7",                "STEUER_BEVOLLMAECHTIGTER" },
+    { "1.3.36.8.3.11.1.8",                "NOTARIN" },
+    { "1.3.36.8.3.11.1.9",                "NOTAR" },
+    { "1.3.36.8.3.11.1.10",               "NOTAR_VERTRETERIN" },
+    { "1.3.36.8.3.11.1.11",               "NOTAR_VERTRETER" },
+    { "1.3.36.8.3.11.1.12",               "NOTARIATS_VERWALTERIN" },
+    { "1.3.36.8.3.11.1.13",               "NOTARIATS_VERWALTER" },
+    { "1.3.36.8.3.11.1.14",               "WIRTSCHAFTS_PRUEFERIN" },
+    { "1.3.36.8.3.11.1.15",               "WIRTSCHAFTS_PRUEFER" },
+    { "1.3.36.8.3.11.1.16",               "VEREIDIGTE_BUCHPRUEFERIN" },
+    { "1.3.36.8.3.11.1.17",               "VEREIDIGTER_BUCHPRUEFER" },
+    { "1.3.36.8.3.11.1.18",               "PATENT_ANWAELTIN" },
+    { "1.3.36.8.3.11.1.19",               "PATENT_ANWALT" },
+    { "1.3.36.8.3.12",                    "CERT_IN_DIR_SINCE" },
+    { "1.3.36.8.3.13",                    "CERT_HASH" },
+    { "1.3.36.8.3.14",                    "NAME_AT_BIRTH" },
+    { "1.3.36.8.3.15",                    "ADDITIONAL_INFORMATION" },
+    { "1.3.36.8.4.1",                     "PERSONAL_DATA" },
+    { "1.3.36.8.4.8",                     "RESTRICTION" },
+    { "1.3.36.8.5.1.1.1",                 "RSA_INDICATE_SHA1" },
+    { "1.3.36.8.5.1.1.2",                 "RSA_INDICATE_RIPEMD160" },
+    { "1.3.36.8.5.1.1.3",                 "RSA_WITH_SHA1" },
+    { "1.3.36.8.5.1.1.4",                 "RSA_WITH_RIPEMD160" },
+    { "1.3.36.8.5.1.2.1",                 "DSA_EXTENDED" },
+    { "1.3.36.8.5.1.2.2",                 "DSA_WITH_RIPEMD160" },
+    { "1.3.36.8.6.1",                     "CERT" },
+    { "1.3.36.8.6.2",                     "CERT_REF" },
+    { "1.3.36.8.6.3",                     "ATTR_CERT" },
+    { "1.3.36.8.6.4",                     "ATTR_REF" },
+    { "1.3.36.8.6.5",                     "FILE_NAME" },
+    { "1.3.36.8.6.6",                     "STORAGE_TIME" },
+    { "1.3.36.8.6.7",                     "FILE_SIZE" },
+    { "1.3.36.8.6.8",                     "LOCATION" },
+    { "1.3.36.8.6.9",                     "SIG_NUMBER" },
+    { "1.3.36.8.6.10",                    "AUTO_GEN" },
+    { "1.3.36.8.7.1.1",                   "PT_ADOBE_ILL" },
+    { "1.3.36.8.7.1.2",                   "PT_AMI_PRO" },
+    { "1.3.36.8.7.1.3",                   "PT_AUTO_CAD" },
+    { "1.3.36.8.7.1.4",                   "PT_BINARY" },
+    { "1.3.36.8.7.1.5",                   "PT_BMP" },
+    { "1.3.36.8.7.1.6",                   "PT_CGM" },
+    { "1.3.36.8.7.1.7",                   "PT_COREL_CRT" },
+    { "1.3.36.8.7.1.8",                   "PT_COREL_DRW" },
+    { "1.3.36.8.7.1.9",                   "PT_COREL_EXC" },
+    { "1.3.36.8.7.1.10",                  "PT_COREL_PHT" },
+    { "1.3.36.8.7.1.11",                  "PT_DRAW" },
+    { "1.3.36.8.7.1.12",                  "PT_DVI" },
+    { "1.3.36.8.7.1.13",                  "PT_EPS" },
+    { "1.3.36.8.7.1.14",                  "PT_EXCEL" },
+    { "1.3.36.8.7.1.15",                  "PT_GEM" },
+    { "1.3.36.8.7.1.16",                  "PT_GIF" },
+    { "1.3.36.8.7.1.17",                  "PT_HPGL" },
+    { "1.3.36.8.7.1.18",                  "PT_JPEG" },
+    { "1.3.36.8.7.1.19",                  "PT_KODAK" },
+    { "1.3.36.8.7.1.20",                  "PT_LA_TE_X" },
+    { "1.3.36.8.7.1.21",                  "PT_LOTUS" },
+    { "1.3.36.8.7.1.22",                  "PT_LOTUS_PIC" },
+    { "1.3.36.8.7.1.23",                  "PT_MAC_PICT" },
+    { "1.3.36.8.7.1.24",                  "PT_MAC_WORD" },
+    { "1.3.36.8.7.1.25",                  "PT_MS_WF_D" },
+    { "1.3.36.8.7.1.26",                  "PT_MS_WORD" },
+    { "1.3.36.8.7.1.27",                  "PT_MS_WORD2" },
+    { "1.3.36.8.7.1.28",                  "PT_MS_WORD6" },
+    { "1.3.36.8.7.1.29",                  "PT_MS_WORD8" },
+    { "1.3.36.8.7.1.30",                  "PT_PDF" },
+    { "1.3.36.8.7.1.31",                  "PT_PIF" },
+    { "1.3.36.8.7.1.32",                  "PT_POSTSCRIPT" },
+    { "1.3.36.8.7.1.33",                  "PT_RTF" },
+    { "1.3.36.8.7.1.34",                  "PT_SCITEX" },
+    { "1.3.36.8.7.1.35",                  "PT_TAR" },
+    { "1.3.36.8.7.1.36",                  "PT_TARGA" },
+    { "1.3.36.8.7.1.37",                  "PT_TE_X" },
+    { "1.3.36.8.7.1.38",                  "PT_TEXT" },
+    { "1.3.36.8.7.1.39",                  "PT_TIFF" },
+    { "1.3.36.8.7.1.40",                  "PT_TIFF_FC" },
+    { "1.3.36.8.7.1.41",                  "PT_UID" },
+    { "1.3.36.8.7.1.42",                  "PT_UU_ENCODE" },
+    { "1.3.36.8.7.1.43",                  "PT_WMF" },
+    { "1.3.36.8.7.1.44",                  "PT_WORD_PERFECT" },
+    { "1.3.36.8.7.1.45",                  "PT_WP_GRPH" },
+    { "1.3.101.1.4",                      "THAWTE_CE" },
+    { "1.3.101.1.4.1",                    "STRONG_EXTRANET" },
+    { "1.3.132.0.1",                      "SECT163K1" },
+    { "1.3.132.0.2",                      "SECT163R1" },
+    { "1.3.132.0.3",                      "SECT239K1" },
+    { "1.3.132.0.4",                      "SECT113R1" },
+    { "1.3.132.0.5",                      "SECT113R2" },
+    { "1.3.132.0.6",                      "SECP112R1" },
+    { "1.3.132.0.7",                      "SECP112R2" },
+    { "1.3.132.0.8",                      "SECP160R1" },
+    { "1.3.132.0.9",                      "SECP160K1" },
+    { "1.3.132.0.10",                     "SECP256K1" },
+    { "1.3.132.0.15",                     "SECT163R2" },
+    { "1.3.132.0.16",                     "SECT283K1" },
+    { "1.3.132.0.17",                     "SECT283R1" },
+    { "1.3.132.0.22",                     "SECT131R1" },
+    { "1.3.132.0.23",                     "SECT131R2" },
+    { "1.3.132.0.24",                     "SECT193R1" },
+    { "1.3.132.0.25",                     "SECT193R2" },
+    { "1.3.132.0.26",                     "SECT233K1" },
+    { "1.3.132.0.27",                     "SECT233R1" },
+    { "1.3.132.0.28",                     "SECP128R1" },
+    { "1.3.132.0.29",                     "SECP128R2" },
+    { "1.3.132.0.30",                     "SECP160R2" },
+    { "1.3.132.0.31",                     "SECP192K1" },
+    { "1.3.132.0.32",                     "SECP224K1" },
+    { "1.3.132.0.33",                     "SECP224R1" },
+    { "1.3.132.0.34",                     "SECP384R1" },
+    { "1.3.132.0.35",                     "SECP521R1" },
+    { "1.3.132.0.36",                     "SECT409K1" },
+    { "1.3.132.0.37",                     "SECT409R1" },
+    { "1.3.132.0.38",                     "SECT571K1" },
+    { "1.3.132.0.39",                     "SECT571R1" },
+    { "1.3.133.16.840.9.84",              "X984" },
+    { "1.3.133.16.840.9.84.0",            "X984_MODULE" },
+    { "1.3.133.16.840.9.84.0.1",          "X984_BIOMETRICS" },
+    { "1.3.133.16.840.9.84.0.2",          "X984_CMS" },
+    { "1.3.133.16.840.9.84.0.3",          "X984_IDENTIFIERS" },
+    { "1.3.133.16.840.9.84.1",            "X984_BIOMETRIC" },
+    { "1.3.133.16.840.9.84.1.0",          "BIOMETRIC_UNKNOWN_TYPE" },
+    { "1.3.133.16.840.9.84.1.1",          "BIOMETRIC_BODY_ODOR" },
+    { "1.3.133.16.840.9.84.1.2",          "BIOMETRIC_DNA" },
+    { "1.3.133.16.840.9.84.1.3",          "BIOMETRIC_EAR_SHAPE" },
+    { "1.3.133.16.840.9.84.1.4",          "BIOMETRIC_FACIAL_FEATURES" },
+    { "1.3.133.16.840.9.84.1.5",          "BIOMETRIC_FINGER_IMAGE" },
+    { "1.3.133.16.840.9.84.1.6",          "BIOMETRIC_FINGER_GEOMETRY" },
+    { "1.3.133.16.840.9.84.1.7",          "BIOMETRIC_HAND_GEOMETRY" },
+    { "1.3.133.16.840.9.84.1.8",          "BIOMETRIC_IRIS_FEATURES" },
+    { "1.3.133.16.840.9.84.1.9",          "BIOMETRIC_KEYSTROKE_DYNAMICS" },
+    { "1.3.133.16.840.9.84.1.10",         "BIOMETRIC_PALM" },
+    { "1.3.133.16.840.9.84.1.11",         "BIOMETRIC_RETINA" },
+    { "1.3.133.16.840.9.84.1.12",         "BIOMETRIC_SIGNATURE" },
+    { "1.3.133.16.840.9.84.1.13",         "BIOMETRIC_SPEECH_PATTERN" },
+    { "1.3.133.16.840.9.84.1.14",         "BIOMETRIC_THERMAL_IMAGE" },
+    { "1.3.133.16.840.9.84.1.15",         "BIOMETRIC_VEIN_PATTERN" },
+    { "1.3.133.16.840.9.84.1.16",         "BIOMETRIC_THERMAL_FACE_IMAGE" },
+    { "1.3.133.16.840.9.84.1.17",         "BIOMETRIC_THERMAL_HAND_IMAGE" },
+    { "1.3.133.16.840.9.84.1.18",         "BIOMETRIC_LIP_MOVEMENT" },
+    { "1.3.133.16.840.9.84.1.19",         "BIOMETRIC_GAIT" },
+    { "1.3.133.16.840.9.84.3",            "X984_MATCHING_METHOD" },
+    { "1.3.133.16.840.9.84.4",            "X984_FORMAT_OWNER" },
+    { "1.3.133.16.840.9.84.4.0",          "X984_CBEFF_OWNER" },
+    { "1.3.133.16.840.9.84.4.1",          "X984_IBIA_OWNER" },
+    { "1.3.133.16.840.9.84.4.1.1",        "IBIA_OWNER_SAFLINK" },
+    { "1.3.133.16.840.9.84.4.1.2",        "IBIA_OWNER_BIOSCRYPT" },
+    { "1.3.133.16.840.9.84.4.1.3",        "IBIA_OWNER_VISIONICS" },
+    { "1.3.133.16.840.9.84.4.1.4",        "IBIA_OWNER_INFINEON_TECHNOLOGIES_AG" },
+    { "1.3.133.16.840.9.84.4.1.5",        "IBIA_OWNER_IRIDIAN_TECHNOLOGIES" },
+    { "1.3.133.16.840.9.84.4.1.6",        "IBIA_OWNER_VERIDICOM" },
+    { "1.3.133.16.840.9.84.4.1.7",        "IBIA_OWNER_CYBER_SIGN" },
+    { "1.3.133.16.840.9.84.4.1.8",        "IBIA_OWNERE_CRYP" },
+    { "1.3.133.16.840.9.84.4.1.9",        "IBIA_OWNER_FINGERPRINT_CARDS_AB" },
+    { "1.3.133.16.840.9.84.4.1.10",       "IBIA_OWNER_SECU_GEN" },
+    { "1.3.133.16.840.9.84.4.1.11",       "IBIA_OWNER_PRECISE_BIOMETRIC" },
+    { "1.3.133.16.840.9.84.4.1.12",       "IBIA_OWNER_IDENTIX" },
+    { "1.3.133.16.840.9.84.4.1.13",       "IBIA_OWNER_DERMALOG" },
+    { "1.3.133.16.840.9.84.4.1.14",       "IBIA_OWNER_LOGICO" },
+    { "1.3.133.16.840.9.84.4.1.15",       "IBIA_OWNER_NIST" },
+    { "1.3.133.16.840.9.84.4.1.16",       "IBIA_OWNER_A3_VISION" },
+    { "1.3.133.16.840.9.84.4.1.17",       "IBIA_OWNER_NEC" },
+    { "1.3.133.16.840.9.84.4.1.18",       "IBIA_OWNER_ST_MICROELECTRONICS" },
+    { "2.5.4.0",                          "OBJECT_CLASS" },
+    { "2.5.4.1",                          "ALIASED_ENTRY_NAME" },
+    { "2.5.4.2",                          "KNOWLEDGE_INFORMATION" },
+    { "2.5.4.3",                          "COMMON_NAME" },
+    { "2.5.4.4",                          "SURNAME" },
+    { "2.5.4.5",                          "SERIAL_NUMBER" },
+    { "2.5.4.6",                          "COUNTRY_NAME" },
+    { "2.5.4.7",                          "LOCALITY_NAME" },
+    { "2.5.4.7.1",                        "COLLECTIVE_LOCALITY_NAME" },
+    { "2.5.4.8",                          "STATE_OR_PROVINCE_NAME" },
+    { "2.5.4.8.1",                        "COLLECTIVE_STATE_OR_PROVINCE_NAME" },
+    { "2.5.4.9",                          "STREET_ADDRESS" },
+    { "2.5.4.9.1",                        "COLLECTIVE_STREET_ADDRESS" },
+    { "2.5.4.10",                         "ORGANIZATION_NAME" },
+    { "2.5.4.10.1",                       "COLLECTIVE_ORGANIZATION_NAME" },
+    { "2.5.4.11",                         "ORGANIZATIONAL_UNIT_NAME" },
+    { "2.5.4.11.1",                       "COLLECTIVE_ORGANIZATIONAL_UNIT_NAME" },
+    { "2.5.4.12",                         "TITLE" },
+    { "2.5.4.13",                         "DESCRIPTION" },
+    { "2.5.4.14",                         "SEARCH_GUIDE" },
+    { "2.5.4.15",                         "BUSINESS_CATEGORY" },
+    { "2.5.4.16",                         "POSTAL_ADDRESS" },
+    { "2.5.4.16.1",                       "COLLECTIVE_POSTAL_ADDRESS" },
+    { "2.5.4.17",                         "POSTAL_CODE" },
+    { "2.5.4.17.1",                       "COLLECTIVE_POSTAL_CODE" },
+    { "2.5.4.18",                         "POST_OFFICE_BOX" },
+    { "2.5.4.18.1",                       "COLLECTIVE_POST_OFFICE_BOX" },
+    { "2.5.4.19",                         "PHYSICAL_DELIVERY_OFFICE_NAME" },
+    { "2.5.4.19.1",                       "COLLECTIVE_PHYSICAL_DELIVERY_OFFICE_NAME" },
+    { "2.5.4.20",                         "TELEPHONE_NUMBER" },
+    { "2.5.4.20.1",                       "COLLECTIVE_TELEPHONE_NUMBER" },
+    { "2.5.4.21",                         "TELEX_NUMBER" },
+    { "2.5.4.21.1",                       "COLLECTIVE_TELEX_NUMBER" },
+    { "2.5.4.22",                         "TELETEX_TERMINAL_IDENTIFIER" },
+    { "2.5.4.22.1",                       "COLLECTIVE_TELETEX_TERMINAL_IDENTIFIER" },
+    { "2.5.4.23",                         "FACSIMILE_TELEPHONE_NUMBER" },
+    { "2.5.4.23.1",                       "COLLECTIVE_FACSIMILE_TELEPHONE_NUMBER" },
+    { "2.5.4.24",                         "X121_ADDRESS" },
+    { "2.5.4.25",                         "INTERNATIONAL_ISDN_NUMBER" },
+    { "2.5.4.25.1",                       "COLLECTIVE_INTERNATIONAL_ISDN_NUMBER" },
+    { "2.5.4.26",                         "REGISTERED_ADDRESS" },
+    { "2.5.4.27",                         "DESTINATION_INDICATOR" },
+    { "2.5.4.28",                         "PREFERRED_DELIVERY_MEHTOD" },
+    { "2.5.4.29",                         "PRESENTATION_ADDRESS" },
+    { "2.5.4.30",                         "SUPPORTED_APPLICATION_CONTEXT" },
+    { "2.5.4.31",                         "MEMBER" },
+    { "2.5.4.32",                         "OWNER" },
+    { "2.5.4.33",                         "ROLE_OCCUPANT" },
+    { "2.5.4.34",                         "SEE_ALSO" },
+    { "2.5.4.35",                         "USER_PASSWORD" },
+    { "2.5.4.36",                         "USER_CERTIFICATE" },
+    { "2.5.4.37",                         "CA_CERTIFICATE" },
+    { "2.5.4.38",                         "AUTHORITY_REVOCATION_LIST" },
+    { "2.5.4.39",                         "CERTIFICATE_REVOCATION_LIST" },
+    { "2.5.4.40",                         "CROSS_CERTIFICATE_PAIR" },
+    { "2.5.4.41",                         "NAME" },
+    { "2.5.4.42",                         "GIVEN_NAME" },
+    { "2.5.4.43",                         "INITIALS" },
+    { "2.5.4.44",                         "GENERATION_QUALIFIER" },
+    { "2.5.4.45",                         "UNIQUE_IDENTIFIER" },
+    { "2.5.4.46",                         "DN_QUALIFIER" },
+    { "2.5.4.47",                         "ENHANCED_SEARCH_GUIDE" },
+    { "2.5.4.48",                         "PROTOCOL_INFORMATION" },
+    { "2.5.4.49",                         "DISTINGUISHED_NAME" },
+    { "2.5.4.50",                         "UNIQUE_MEMBER" },
+    { "2.5.4.51",                         "HOUSE_IDENTIFIER" },
+    { "2.5.4.52",                         "SUPPORTED_ALGORITHMS" },
+    { "2.5.4.53",                         "DELTA_REVOCATION_LIST" },
+    { "2.5.4.54",                         "DMD_NAME" },
+    { "2.5.4.55",                         "CLEARANCE" },
+    { "2.5.4.56",                         "DEFAULT_DIR_QOP" },
+    { "2.5.4.57",                         "ATTRIBUTE_INTEGRITY_INFO" },
+    { "2.5.4.58",                         "ATTRIBUTE_CERTIFICATE" },
+    { "2.5.4.59",                         "ATTRIBUTE_CERTIFICATE_REVOCATION_LIST" },
+    { "2.5.4.60",                         "CONF_KEY_INFO" },
+    { "2.5.4.61",                         "A_A_CERTIFICATE" },
+    { "2.5.4.62",                         "ATTRIBUTE_DESCRIPTOR_CERTIFICATE" },
+    { "2.5.4.63",                         "ATTRIBUTE_AUTHORITY_REVOCATION_LIST" },
+    { "2.5.4.64",                         "FAMILY_INFORMATION" },
+    { "2.5.4.65",                         "PSEUDONYM" },
+    { "2.5.4.66",                         "COMMUNICATIONS_SERVICE" },
+    { "2.5.4.67",                         "COMMUNICATIONS_NETWORK" },
+    { "2.5.4.68",                         "CERTIFICATION_PRACTICE_STMT" },
+    { "2.5.4.69",                         "CERTIFICATE_POLICY" },
+    { "2.5.4.70",                         "PKI_PATH" },
+    { "2.5.4.71",                         "PRIV_POLICY" },
+    { "2.5.4.72",                         "ROLE" },
+    { "2.5.4.73",                         "DELEGATION_PATH" },
+    { "2.5.4.74",                         "PROT_PRIV_POLICY" },
+    { "2.5.4.75",                         "X_ML_PRIVILEGE_INFO" },
+    { "2.5.4.76",                         "XML_PRIV_POLICY" },
+    { "2.5.4.82",                         "PERMISSION" },
+    { "2.5.6.0",                          "TOP" },
+    { "2.5.6.1",                          "ALIAS" },
+    { "2.5.6.2",                          "COUNTRY" },
+    { "2.5.6.3",                          "LOCALITY" },
+    { "2.5.6.4",                          "ORGANIZATION" },
+    { "2.5.6.5",                          "ORGANIZATIONAL_UNIT" },
+    { "2.5.6.6",                          "PERSON" },
+    { "2.5.6.7",                          "ORGANIZATIONAL_PERSON" },
+    { "2.5.6.8",                          "ORGANIZATIONAL_ROLE" },
+    { "2.5.6.9",                          "GROUP_OF_NAMES" },
+    { "2.5.6.10",                         "RESIDENTIAL_PERSON" },
+    { "2.5.6.11",                         "APPLICATION_PROCESS" },
+    { "2.5.6.12",                         "APPLICATION_ENTITY" },
+    { "2.5.6.13",                         "D_SA" },
+    { "2.5.6.14",                         "DEVICE" },
+    { "2.5.6.15",                         "STRONG_AUTHENTICATION_USER" },
+    { "2.5.6.16",                         "CERTIFICATE_AUTHORITY" },
+    { "2.5.6.17",                         "GROUP_OF_UNIQUE_NAMES" },
+    { "2.5.6.21",                         "PKI_USER" },
+    { "2.5.6.22",                         "PKI_CA" },
+    { "2.5.8.1.1",                        "RSA" },
+    { "2.5.29.1",                         "AUTHORITY_KEY_IDENTIFIER" },
+    { "2.5.29.2",                         "KEY_ATTRIBUTES" },
+    { "2.5.29.3",                         "CERTIFICATE_POLICIES" },
+    { "2.5.29.4",                         "KEY_USAGE_RESTRICTION" },
+    { "2.5.29.5",                         "POLICY_MAPPING" },
+    { "2.5.29.6",                         "SUBTREES_CONSTRAINT" },
+    { "2.5.29.7",                         "SUBJECT_ALT_NAME" },
+    { "2.5.29.8",                         "ISSUER_ALT_NAME" },
+    { "2.5.29.9",                         "SUBJECT_DIRECTORY_ATTRIBUTES" },
+    { "2.5.29.10",                        "BASIC_CONSTRAINTS" },
+    { "2.5.29.11",                        "NAME_CONSTRAINTS" },
+    { "2.5.29.12",                        "POLICY_CONSTRAINTS" },
+    { "2.5.29.13",                        "BASIC_CONSTRAINTS" },
+    { "2.5.29.14",                        "SUBJECT_KEY_IDENTIFIER" },
+    { "2.5.29.15",                        "KEY_USAGE" },
+    { "2.5.29.16",                        "PRIVATE_KEY_USAGE_PERIOD" },
+    { "2.5.29.17",                        "SUBJECT_ALT_NAME" },
+    { "2.5.29.18",                        "ISSUER_ALT_NAME" },
+    { "2.5.29.19",                        "BASIC_CONSTRAINTS" },
+    { "2.5.29.20",                        "C_RL_NUMBER" },
+    { "2.5.29.21",                        "C_RL_REASON" },
+    { "2.5.29.22",                        "EXPIRATION_DATE" },
+    { "2.5.29.23",                        "INSTRUCTION_CODE" },
+    { "2.5.29.24",                        "INVALIDITY_DATE" },
+    { "2.5.29.25",                        "C_RL_DISTRIBUTION_POINTS" },
+    { "2.5.29.26",                        "ISSUING_DISTRIBUTION_POINT" },
+    { "2.5.29.27",                        "DELTA_CRL_INDICATOR" },
+    { "2.5.29.28",                        "ISSUING_DISTRIBUTION_POINT" },
+    { "2.5.29.29",                        "CERTIFICATE_ISSUER" },
+    { "2.5.29.30",                        "NAME_CONSTRAINTS" },
+    { "2.5.29.31",                        "C_RL_DISTRIBUTION_POINTS" },
+    { "2.5.29.32",                        "CERTIFICATE_POLICIES" },
+    { "2.5.29.32.0",                      "ANY_POLICY" },
+    { "2.5.29.33",                        "POLICY_MAPPINGS" },
+    { "2.5.29.34",                        "POLICY_CONSTRAINTS" },
+    { "2.5.29.35",                        "AUTHORITY_KEY_IDENTIFIER" },
+    { "2.5.29.36",                        "POLICY_CONSTRAINTS" },
+    { "2.5.29.37",                        "EXT_KEY_USAGE" },
+    { "2.5.29.37.0",                      "ANY_EXTENDED_KEY_USAGE" },
+    { "2.5.29.38",                        "AUTHORITY_ATTRIBUTE_IDENTIFIER" },
+    { "2.5.29.39",                        "ROLE_SPEC_CERT_IDENTIFIER" },
+    { "2.5.29.40",                        "C_RL_STREAM_IDENTIFIER" },
+    { "2.5.29.41",                        "BASIC_ATT_CONSTRAINTS" },
+    { "2.5.29.42",                        "DELEGATED_NAME_CONSTRAINTS" },
+    { "2.5.29.43",                        "TIME_SPECIFICATION" },
+    { "2.5.29.44",                        "C_RL_SCOPE" },
+    { "2.5.29.45",                        "STATUS_REFERRALS" },
+    { "2.5.29.46",                        "FRESHEST_CRL" },
+    { "2.5.29.47",                        "ORDERED_LIST" },
+    { "2.5.29.48",                        "ATTRIBUTE_DESCRIPTOR" },
+    { "2.5.29.49",                        "USER_NOTICE" },
+    { "2.5.29.50",                        "S_OA_IDENTIFIER" },
+    { "2.5.29.51",                        "BASE_UPDATE_TIME" },
+    { "2.5.29.52",                        "ACCEPTABLE_CERT_POLICIES" },
+    { "2.5.29.53",                        "DELTA_INFO" },
+    { "2.5.29.54",                        "INHIBIT_ANY_POLICY" },
+    { "2.5.29.55",                        "TARGET_INFORMATION" },
+    { "2.5.29.56",                        "NO_REV_AVAIL" },
+    { "2.5.29.57",                        "ACCEPTABLE_PRIVILEGE_POLICIES" },
+    { "2.5.29.58",                        "TO_BE_REVOKED" },
+    { "2.5.29.59",                        "REVOKED_GROUPS" },
+    { "2.5.29.60",                        "EXPIRED_CERTS_ON_CRL" },
+    { "2.5.29.61",                        "INDIRECT_ISSUER" },
+    { "2.5.29.62",                        "NO_ASSERTION" },
+    { "2.5.29.63",                        "A_AISSUING_DISTRIBUTION_POINT" },
+    { "2.5.29.64",                        "ISSUED_ON_BEHALF_OF" },
+    { "2.5.29.65",                        "SINGLE_USE" },
+    { "2.5.29.66",                        "GROUP_AC" },
+    { "2.5.29.67",                        "ALLOWED_ATT_ASS" },
+    { "2.5.29.68",                        "ATTRIBUTE_MAPPINGS" },
+    { "2.5.29.69",                        "HOLDER_NAME_CONSTRAINTS" },
+    { "2.16.724.1.2.2.4.1",               "PERSONAL_DATA_INFO" },
+    { "2.16.840.1.101.2.1.1.1",           "SDNS_SIGNATURE_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.2",           "FORTEZZA_SIGNATURE_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.3",           "SDNS_CONFIDENTIALITY_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.4",           "FORTEZZA_CONFIDENTIALITY_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.5",           "SDNS_INTEGRITY_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.6",           "FORTEZZA_INTEGRITY_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.7",           "SDNS_TOKEN_PROTECTION_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.8",           "FORTEZZA_TOKEN_PROTECTION_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.9",           "SDNS_KEY_MANAGEMENT_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.10",          "FORTEZZA_KEY_MANAGEMENT_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.11",          "SDNS_K_MAND_SIG_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.12",          "FORTEZZA_K_MAND_SIG_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.13",          "SUITE_A_SIGNATURE_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.14",          "SUITE_A_CONFIDENTIALITY_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.15",          "SUITE_A_INTEGRITY_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.16",          "SUITE_A_TOKEN_PROTECTION_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.17",          "SUITE_A_KEY_MANAGEMENT_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.18",          "SUITE_AK_MAND_SIG_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.19",          "FORTEZZA_UPDATED_SIG_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.20",          "FORTEZZA_K_MAND_UPD_SIG_ALGORITHMS" },
+    { "2.16.840.1.101.2.1.1.21",          "FORTEZZA_UPDATED_INTEG_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.22",          "KEY_EXCHANGE_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.23",          "FORTEZZA_WRAP80_ALGORITHM" },
+    { "2.16.840.1.101.2.1.1.24",          "K_EA_KEY_ENCRYPTION_ALGORITHM" },
+    { "2.16.840.1.101.2.1.2.1",           "RFC822_MESSAGE_FORMAT" },
+    { "2.16.840.1.101.2.1.2.2",           "EMPTY_CONTENT" },
+    { "2.16.840.1.101.2.1.2.3",           "CSP_CONTENT_TYPE" },
+    { "2.16.840.1.101.2.1.2.42",          "MSP_REV3_CONTENT_TYPE" },
+    { "2.16.840.1.101.2.1.2.48",          "MSP_CONTENT_TYPE" },
+    { "2.16.840.1.101.2.1.2.49",          "MSP_REKEY_AGENT_PROTOCOL" },
+    { "2.16.840.1.101.2.1.2.50",          "MSP_MMP" },
+    { "2.16.840.1.101.2.1.2.66",          "MSP_REV3_1_CONTENT_TYPE" },
+    { "2.16.840.1.101.2.1.2.72",          "FORWARDED_MSP_MESSAGE_BODY_PART" },
+    { "2.16.840.1.101.2.1.2.73",          "MSP_FORWARDED_MESSAGE_PARAMETERS" },
+    { "2.16.840.1.101.2.1.2.74",          "FORWARDED_CSP_MSG_BODY_PART" },
+    { "2.16.840.1.101.2.1.2.75",          "CSP_FORWARDED_MESSAGE_PARAMETERS" },
+    { "2.16.840.1.101.2.1.2.76",          "MSP_MMP2" },
+    { "2.16.840.1.101.2.1.3.1",           "SDNS_SECURITY_POLICY" },
+    { "2.16.840.1.101.2.1.3.2",           "SDNS_PRBAC" },
+    { "2.16.840.1.101.2.1.3.3",           "MOSAIC_PRBAC" },
+    { "2.16.840.1.101.2.1.3.10",          "SI_SECURITY_POLICY" },
+    { "2.16.840.1.101.2.1.3.10.0",        "SI_NASP" },
+    { "2.16.840.1.101.2.1.3.10.1",        "SI_ELCO" },
+    { "2.16.840.1.101.2.1.3.10.2",        "SI_TK" },
+    { "2.16.840.1.101.2.1.3.10.3",        "SI_DSAP" },
+    { "2.16.840.1.101.2.1.3.10.4",        "SI_SSSS" },
+    { "2.16.840.1.101.2.1.3.10.5",        "SI_DNASP" },
+    { "2.16.840.1.101.2.1.3.10.6",        "SI_BYEMAN" },
+    { "2.16.840.1.101.2.1.3.10.7",        "SI_REL_US" },
+    { "2.16.840.1.101.2.1.3.10.8",        "SI_REL_AUS" },
+    { "2.16.840.1.101.2.1.3.10.9",        "SI_REL_CAN" },
+    { "2.16.840.1.101.2.1.3.10.10",       "SI_REL_UK" },
+    { "2.16.840.1.101.2.1.3.10.11",       "SI_REL_NZ" },
+    { "2.16.840.1.101.2.1.3.10.12",       "SI_GENERIC" },
+    { "2.16.840.1.101.2.1.3.11",          "GENSER" },
+    { "2.16.840.1.101.2.1.3.11.0",        "GENSER_NATIONS" },
+    { "2.16.840.1.101.2.1.3.11.1",        "GENSER_COMSEC" },
+    { "2.16.840.1.101.2.1.3.11.2",        "GENSER_ACQUISITION" },
+    { "2.16.840.1.101.2.1.3.11.3",        "GENSER_SECURITY_CATEGORIES" },
+    { "2.16.840.1.101.2.1.3.11.3.0",      "GENSER_TAG_SET_NAME" },
+    { "2.16.840.1.101.2.1.3.12",          "DEFAULT_SECURITY_POLICY" },
+    { "2.16.840.1.101.2.1.3.13",          "CAPCO_MARKINGS" },
+    { "2.16.840.1.101.2.1.3.13.0",        "CAPCO_SECURITY_CATEGORIES" },
+    { "2.16.840.1.101.2.1.3.13.0.1",      "CAPCO_TAG_SET_NAME1" },
+    { "2.16.840.1.101.2.1.3.13.0.2",      "CAPCO_TAG_SET_NAME2" },
+    { "2.16.840.1.101.2.1.3.13.0.3",      "CAPCO_TAG_SET_NAME3" },
+    { "2.16.840.1.101.2.1.3.13.0.4",      "CAPCO_TAG_SET_NAME4" },
+    { "2.16.840.1.101.2.1.5.1",           "SDNS_KEY_MANAGEMENT_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.2",           "SDNS_USER_SIGNATURE_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.3",           "SDNS_K_MAND_SIG_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.4",           "FORTEZZA_KEY_MANAGEMENT_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.5",           "FORTEZZA_K_MAND_SIG_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.6",           "FORTEZZA_USER_SIGNATURE_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.7",           "FORTEZZA_CA_SIGNATURE_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.8",           "SDNS_CA_SIGNATURE_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.10",          "AUXILIARY_VECTOR" },
+    { "2.16.840.1.101.2.1.5.11",          "ML_RECEIPT_POLICY" },
+    { "2.16.840.1.101.2.1.5.12",          "ML_MEMBERSHIP" },
+    { "2.16.840.1.101.2.1.5.13",          "ML_ADMINISTRATORS" },
+    { "2.16.840.1.101.2.1.5.14",          "ALID" },
+    { "2.16.840.1.101.2.1.5.20",          "JAN_UK_MS" },
+    { "2.16.840.1.101.2.1.5.21",          "FEB_UK_MS" },
+    { "2.16.840.1.101.2.1.5.22",          "MAR_UK_MS" },
+    { "2.16.840.1.101.2.1.5.23",          "APR_UK_MS" },
+    { "2.16.840.1.101.2.1.5.24",          "MAY_UK_MS" },
+    { "2.16.840.1.101.2.1.5.25",          "JUN_UK_MS" },
+    { "2.16.840.1.101.2.1.5.26",          "JUL_UK_MS" },
+    { "2.16.840.1.101.2.1.5.27",          "AUG_UK_MS" },
+    { "2.16.840.1.101.2.1.5.28",          "SEP_UK_MS" },
+    { "2.16.840.1.101.2.1.5.29",          "OCT_UK_MS" },
+    { "2.16.840.1.101.2.1.5.30",          "NOV_UK_MS" },
+    { "2.16.840.1.101.2.1.5.31",          "DEC_UK_MS" },
+    { "2.16.840.1.101.2.1.5.40",          "META_SDN_SCKL" },
+    { "2.16.840.1.101.2.1.5.41",          "SDNS_CKL" },
+    { "2.16.840.1.101.2.1.5.42",          "META_SDN_SSIGNATURE_CKL" },
+    { "2.16.840.1.101.2.1.5.43",          "SDNS_SIGNATURE_CKL" },
+    { "2.16.840.1.101.2.1.5.44",          "SDNS_CERTIFICATE_REVOCATION_LIST" },
+    { "2.16.840.1.101.2.1.5.45",          "FORTEZZA_CERTIFICATE_REVOCATION_LIST" },
+    { "2.16.840.1.101.2.1.5.46",          "FORTEZZA_CKL" },
+    { "2.16.840.1.101.2.1.5.47",          "AL_EXEMPTED_ADDRESS_PROCESSOR" },
+    { "2.16.840.1.101.2.1.5.48",          "GUARD" },
+    { "2.16.840.1.101.2.1.5.49",          "ALGORITHMS_SUPPORTED" },
+    { "2.16.840.1.101.2.1.5.50",          "SUITE_A_KEY_MANAGEMENT_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.51",          "SUITE_AK_MAND_SIG_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.52",          "SUITE_A_USER_SIGNATURE_CERTIFICATE" },
+    { "2.16.840.1.101.2.1.5.53",          "PRBAC_INFO" },
+    { "2.16.840.1.101.2.1.5.54",          "PRBAC_CA_CONSTRAINTS" },
+    { "2.16.840.1.101.2.1.5.55",          "SIG_OR_KM_PRIVILEGES" },
+    { "2.16.840.1.101.2.1.5.56",          "COMM_PRIVILEGES" },
+    { "2.16.840.1.101.2.1.5.57",          "LABELED_ATTRIBUTE" },
+    { "2.16.840.1.101.2.1.5.58",          "POLICY_INFORMATION_FILE" },
+    { "2.16.840.1.101.2.1.5.59",          "SEC_POLICY_INFORMATION_FILE" },
+    { "2.16.840.1.101.2.1.5.60",          "C_A_CLEARANCE_CONSTRAINT" },
+    { "2.16.840.1.101.2.1.7.1",           "CSP_EXTNS" },
+    { "2.16.840.1.101.2.1.7.1.0",         "CSP_CS_EXTN" },
+    { "2.16.840.1.101.2.1.8.1",           "M_ISSI_SECURITY_CATEGORIES" },
+    { "2.16.840.1.101.2.1.8.2",           "STANDARD_SECURITY_LABEL_PRIVILEGES" },
+    { "2.16.840.1.101.2.1.10.1",          "SIG_PRIVILEGES" },
+    { "2.16.840.1.101.2.1.10.2",          "KM_PRIVILEGES" },
+    { "2.16.840.1.101.2.1.10.3",          "NAMED_TAG_SET_PRIVILEGE" },
+    { "2.16.840.1.101.2.1.11.1",          "UK_DEMO" },
+    { "2.16.840.1.101.2.1.11.2",          "US_DOD_CLASS2" },
+    { "2.16.840.1.101.2.1.11.3",          "US_MEDIUM_PILOT" },
+    { "2.16.840.1.101.2.1.11.4",          "US_DOD_CLASS4" },
+    { "2.16.840.1.101.2.1.11.5",          "US_DOD_CLASS3" },
+    { "2.16.840.1.101.2.1.11.6",          "US_DOD_CLASS5" },
+    { "2.16.840.1.101.2.1.12.0",          "TEST_SECURITY_POLICY" },
+    { "2.16.840.1.101.2.1.12.0.1",        "TSP1" },
+    { "2.16.840.1.101.2.1.12.0.1.0",      "TSP1_SECURITY_CATEGORIES" },
+    { "2.16.840.1.101.2.1.12.0.1.0.0",    "TSP1_TAG_SET_ZERO" },
+    { "2.16.840.1.101.2.1.12.0.1.0.1",    "TSP1_TAG_SET_ONE" },
+    { "2.16.840.1.101.2.1.12.0.1.0.2",    "TSP1_TAG_SET_TWO" },
+    { "2.16.840.1.101.2.1.12.0.2",        "TSP2" },
+    { "2.16.840.1.101.2.1.12.0.2.0",      "TSP2_SECURITY_CATEGORIES" },
+    { "2.16.840.1.101.2.1.12.0.2.0.0",    "TSP2_TAG_SET_ZERO" },
+    { "2.16.840.1.101.2.1.12.0.2.0.1",    "TSP2_TAG_SET_ONE" },
+    { "2.16.840.1.101.2.1.12.0.2.0.2",    "TSP2_TAG_SET_TWO" },
+    { "2.16.840.1.101.2.1.12.0.3",        "KAFKA" },
+    { "2.16.840.1.101.2.1.12.0.3.0",      "KAFKA_SECURITY_CATEGORIES" },
+    { "2.16.840.1.101.2.1.12.0.3.0.1",    "KAFKA_TAG_SET_NAME1" },
+    { "2.16.840.1.101.2.1.12.0.3.0.2",    "KAFKA_TAG_SET_NAME2" },
+    { "2.16.840.1.101.2.1.12.0.3.0.3",    "KAFKA_TAG_SET_NAME3" },
+    { "2.16.840.1.101.2.1.12.1.1",        "TCP1" },
+    { "2.16.840.1.101.3.1",               "SLABEL" },
+    { "2.16.840.1.101.3.2",               "PKI" },
+    { "2.16.840.1.101.3.2.1",             "NIST_POLICY_IDENTIFIER" },
+    { "2.16.840.1.101.3.2.1.3.1",         "FBCA_RUDIMENTARY_POLICY" },
+    { "2.16.840.1.101.3.2.1.3.2",         "FBCA_BASIC_POLICY" },
+    { "2.16.840.1.101.3.2.1.3.3",         "FBCA_MEDIUM_POLICY" },
+    { "2.16.840.1.101.3.2.1.3.4",         "FBCA_HIGH_POLICY" },
+    { "2.16.840.1.101.3.2.1.48.1",        "NIST_TEST_POLICY1" },
+    { "2.16.840.1.101.3.2.1.48.2",        "NIST_TEST_POLICY2" },
+    { "2.16.840.1.101.3.2.1.48.3",        "NIST_TEST_POLICY3" },
+    { "2.16.840.1.101.3.2.1.48.4",        "NIST_TEST_POLICY4" },
+    { "2.16.840.1.101.3.2.1.48.5",        "NIST_TEST_POLICY5" },
+    { "2.16.840.1.101.3.2.1.48.6",        "NIST_TEST_POLICY6" },
+    { "2.16.840.1.101.3.2.2",             "GAK" },
+    { "2.16.840.1.101.3.2.2.1",           "K_RA_KEY" },
+    { "2.16.840.1.101.3.2.3",             "EXTENSIONS" },
+    { "2.16.840.1.101.3.2.3.1",           "K_R_TECHNIQUE" },
+    { "2.16.840.1.101.3.2.3.2",           "K_RECOVERY_CAPABLE" },
+    { "2.16.840.1.101.3.2.3.3",           "K_R" },
+    { "2.16.840.1.101.3.2.4",             "KEY_RECOVERY_SCHEMES" },
+    { "2.16.840.1.101.3.2.5",             "KRAPOLA" },
+    { "2.16.840.1.101.3.3",               "ARPA" },
+    { "2.16.840.1.101.3.4",               "NIST_ALGORITHM" },
+    { "2.16.840.1.101.3.4.1",             "AES" },
+    { "2.16.840.1.101.3.4.1.1",           "AES128_ECB" },
+    { "2.16.840.1.101.3.4.1.2",           "AES128_CBC" },
+    { "2.16.840.1.101.3.4.1.3",           "AES128_OFB" },
+    { "2.16.840.1.101.3.4.1.4",           "AES128_CFB" },
+    { "2.16.840.1.101.3.4.1.5",           "AES128_WRAP" },
+    { "2.16.840.1.101.3.4.1.6",           "AES128_GCM" },
+    { "2.16.840.1.101.3.4.1.7",           "AES128_CCM" },
+    { "2.16.840.1.101.3.4.1.8",           "AES128_WRAP_PAD" },
+    { "2.16.840.1.101.3.4.1.21",          "AES192_ECB" },
+    { "2.16.840.1.101.3.4.1.22",          "AES192_CBC" },
+    { "2.16.840.1.101.3.4.1.23",          "AES192_OFB" },
+    { "2.16.840.1.101.3.4.1.24",          "AES192_CFB" },
+    { "2.16.840.1.101.3.4.1.25",          "AES192_WRAP" },
+    { "2.16.840.1.101.3.4.1.26",          "AES192_GCM" },
+    { "2.16.840.1.101.3.4.1.27",          "AES192_CCM" },
+    { "2.16.840.1.101.3.4.1.28",          "AES192_WRAP_PAD" },
+    { "2.16.840.1.101.3.4.1.41",          "AES256_ECB" },
+    { "2.16.840.1.101.3.4.1.42",          "AES256_CBC" },
+    { "2.16.840.1.101.3.4.1.43",          "AES256_OFB" },
+    { "2.16.840.1.101.3.4.1.44",          "AES256_CFB" },
+    { "2.16.840.1.101.3.4.1.45",          "AES256_WRAP" },
+    { "2.16.840.1.101.3.4.1.46",          "AES256_GCM" },
+    { "2.16.840.1.101.3.4.1.47",          "AES256_CCM" },
+    { "2.16.840.1.101.3.4.1.48",          "AES256_WRAP_PAD" },
+    { "2.16.840.1.101.3.4.2",             "HASH_ALGOS" },
+    { "2.16.840.1.101.3.4.2.1",           "SHA_256" },
+    { "2.16.840.1.101.3.4.2.2",           "SHA_384" },
+    { "2.16.840.1.101.3.4.2.3",           "SHA_512" },
+    { "2.16.840.1.101.3.4.2.4",           "SHA_224" },
+    { "2.16.840.1.101.3.4.3.1",           "DSA_WITH_SHA224" },
+    { "2.16.840.1.101.3.4.3.2",           "DSA_WITH_SHA256" },
+    { "2.16.840.1.113719.1.2.8",          "NOVELL_ALGORITHM" },
+    { "2.16.840.1.113719.1.2.8.22",       "DES_CBC_IV8" },
+    { "2.16.840.1.113719.1.2.8.23",       "DES_CBC_PAD_IV8" },
+    { "2.16.840.1.113719.1.2.8.24",       "DES_EDE2_CBC_IV8" },
+    { "2.16.840.1.113719.1.2.8.25",       "DES_EDE2_CBC_PAD_IV8" },
+    { "2.16.840.1.113719.1.2.8.26",       "DES_EDE3_CBC_IV8" },
+    { "2.16.840.1.113719.1.2.8.27",       "DES_EDE3_CBC_PAD_IV8" },
+    { "2.16.840.1.113719.1.2.8.28",       "RC5_CBC_PAD" },
+    { "2.16.840.1.113719.1.2.8.29",       "MD2_WITH_RSA_ENCRYPTION_B_SAFE1" },
+    { "2.16.840.1.113719.1.2.8.30",       "MD5_WITH_RSA_ENCRYPTION_B_SAFE1" },
+    { "2.16.840.1.113719.1.2.8.31",       "SHA1_WITH_RSA_ENCRYPTION_B_SAFE1" },
+    { "2.16.840.1.113719.1.2.8.32",       "LM_DIGEST" },
+    { "2.16.840.1.113719.1.2.8.40",       "MD2" },
+    { "2.16.840.1.113719.1.2.8.50",       "MD5" },
+    { "2.16.840.1.113719.1.2.8.51",       "IKE_HMAC_WITH_SHA1_RSA" },
+    { "2.16.840.1.113719.1.2.8.52",       "IKE_HMAC_WITH_MD5_RSA" },
+    { "2.16.840.1.113719.1.2.8.69",       "RC2_CBC_PAD" },
+    { "2.16.840.1.113719.1.2.8.82",       "SHA_1" },
+    { "2.16.840.1.113719.1.2.8.92",       "RC2_B_SAFE1_CBC" },
+    { "2.16.840.1.113719.1.2.8.95",       "MD4" },
+    { "2.16.840.1.113719.1.2.8.130",      "MD4_PACKET" },
+    { "2.16.840.1.113719.1.2.8.131",      "RSA_ENCRYPTION_BSAFE1" },
+    { "2.16.840.1.113719.1.2.8.132",      "NW_PASSWORD" },
+    { "2.16.840.1.113719.1.2.8.133",      "NOVELL_OBFUSCATE_1" },
+    { "2.16.840.1.113719.1.9",            "PKI" },
+    { "2.16.840.1.113719.1.9.4",          "PKI_ATTRIBUTE_TYPE" },
+    { "2.16.840.1.113719.1.9.4.1",        "SECURITY_ATTRIBUTES" },
+    { "2.16.840.1.113719.1.9.4.2",        "RELIANCE_LIMIT" },
+    { "2.16.840.1.113730.1",              "CERT_EXTENSION" },
+    { "2.16.840.1.113730.1.1",            "NETSCAPE_CERT_TYPE" },
+    { "2.16.840.1.113730.1.2",            "NETSCAPE_BASE_URL" },
+    { "2.16.840.1.113730.1.3",            "NETSCAPE_REVOCATION_URL" },
+    { "2.16.840.1.113730.1.4",            "NETSCAPE_CA_REVOCATION_URL" },
+    { "2.16.840.1.113730.1.7",            "NETSCAPE_CERT_RENEWAL_URL" },
+    { "2.16.840.1.113730.1.8",            "NETSCAPE_CA_POLICY_URL" },
+    { "2.16.840.1.113730.1.9",            "HOME_PAGE_URL" },
+    { "2.16.840.1.113730.1.10",           "ENTITY_LOGO" },
+    { "2.16.840.1.113730.1.11",           "USER_PICTURE" },
+    { "2.16.840.1.113730.1.12",           "NETSCAPE_SSL_SERVER_NAME" },
+    { "2.16.840.1.113730.1.13",           "NETSCAPE_COMMENT" },
+    { "2.16.840.1.113730.2",              "DATA_TYPE" },
+    { "2.16.840.1.113730.2.1",            "DATA_GIF" },
+    { "2.16.840.1.113730.2.2",            "DATA_JPEG" },
+    { "2.16.840.1.113730.2.3",            "DATA_URL" },
+    { "2.16.840.1.113730.2.4",            "DATA_HTML" },
+    { "2.16.840.1.113730.2.5",            "CERT_SEQUENCE" },
+    { "2.16.840.1.113730.2.6",            "CERT_URL" },
+    { "2.16.840.1.113730.3",              "DIRECTORY" },
+    { "2.16.840.1.113730.3.1",            "LDAP_DEFINITIONS" },
+    { "2.16.840.1.113730.3.1.1",          "CAR_LICENSE" },
+    { "2.16.840.1.113730.3.1.2",          "DEPARTMENT_NUMBER" },
+    { "2.16.840.1.113730.3.1.3",          "EMPLOYEE_NUMBER" },
+    { "2.16.840.1.113730.3.1.4",          "EMPLOYEE_TYPE" },
+    { "2.16.840.1.113730.3.2.2",          "INET_ORG_PERSON" },
+    { "2.16.840.1.113730.4.1",            "SERVER_GATED_CRYPTO" },
+    { "2.16.840.1.113733.1.6.3",          "VERISIGN_CZAG" },
+    { "2.16.840.1.113733.1.6.6",          "VERISIGN_IN_BOX" },
+    { "2.16.840.1.113733.1.6.11",         "VERISIGN_ONSITE_JURISDICTION_HASH" },
+    { "2.16.840.1.113733.1.6.13",         "UNKNOWN_VERISIGN_VPN_EXTENSION" },
+    { "2.16.840.1.113733.1.6.15",         "VERISIGN_SERVER_ID" },
+    { "2.16.840.1.113733.1.7.1.1",        "VERISIGN_CERT_POLICIES95_QUALIFIER1" },
+    { "2.16.840.1.113733.1.7.1.1.1",      "VERISIGN_CP_SV1NOTICE" },
+    { "2.16.840.1.113733.1.7.1.1.2",      "VERISIGN_CP_SV1NSI" },
+    { "2.16.840.1.113733.1.8.1",          "VERISIGN_ISS_STRONG_CRYPTO" },
+    { "2.16.840.1.113733.1",              "PKI" },
+    { "2.16.840.1.113733.1.9",            "PKCS7_ATTRIBUTE" },
+    { "2.16.840.1.113733.1.9.2",          "MESSAGE_TYPE" },
+    { "2.16.840.1.113733.1.9.3",          "PKI_STATUS" },
+    { "2.16.840.1.113733.1.9.4",          "FAIL_INFO" },
+    { "2.16.840.1.113733.1.9.5",          "SENDER_NONCE" },
+    { "2.16.840.1.113733.1.9.6",          "RECIPIENT_NONCE" },
+    { "2.16.840.1.113733.1.9.7",          "TRANS_ID" },
+    { "2.16.840.1.113733.1.9.8",          "EXTENSION_REQ" },
+    { "2.16.840.1.113741.2",              "INTEL_CDSA" },
+    { "2.16.840.1.114412.1",              "DIGI_CERT_NON_EV_CERTS" },
+    { "2.16.840.1.114412.1.1",            "DIGI_CERT_OV_CERT" },
+    { "2.16.840.1.114412.1.2",            "DIGI_CERT_DV_CERT" },
+    { "2.16.840.1.114412.1.11",           "DIGI_CERT_FEDERATED_DEVICE_CERT" },
+    { "2.16.840.1.114412.1.3.0.1",        "DIGI_CERT_GLOBAL_CA_POLICY" },
+    { "2.16.840.1.114412.1.3.0.2",        "DIGI_CERT_HIGH_ASSURANCE_EVCA_POLICY" },
+    { "2.16.840.1.114412.1.3.0.3",        "DIGI_CERT_GLOBAL_ROOT_CA_POLICY" },
+    { "2.16.840.1.114412.1.3.0.4",        "DIGI_CERT_ASSURED_ID_ROOT_CA_POLICY" },
+    { "2.16.840.1.114412.2.2",            "DIGI_CERT_EV_CERT" },
+    { "2.16.840.1.114412.2.3",            "DIGI_CERT_OBJECT_SIGNING_CERT" },
+    { "2.16.840.1.114412.2.3.1",          "DIGI_CERT_CODE_SIGNING_CERT" },
+    { "2.16.840.1.114412.2.3.2",          "DIGI_CERT_EV_CODE_SIGNING_CERT" },
+    { "2.16.840.1.114412.2.3.11",         "DIGI_CERT_KERNEL_CODE_SIGNING_CERT" },
+    { "2.16.840.1.114412.2.3.21",         "DIGI_CERT_DOCUMENT_SIGNING_CERT" },
+    { "2.16.840.1.114412.2.4",            "DIGI_CERT_CLIENT_CERT" },
+    { "2.16.840.1.114412.2.4.1.1",        "DIGI_CERT_LEVEL1_PERSONAL_CLIENT_CERT" },
+    { "2.16.840.1.114412.2.4.1.2",        "DIGI_CERT_LEVEL1_ENTERPRISE_CLIENT_CERT" },
+    { "2.16.840.1.114412.2.4.2",          "DIGI_CERT_LEVEL2_CLIENT_CERT" },
+    { "2.16.840.1.114412.2.4.3.1",        "DIGI_CERT_LEVEL3_US_CLIENT_CERT" },
+    { "2.16.840.1.114412.2.4.3.2",        "DIGI_CERT_LEVEL3_CBP_CLIENT_CERT" },
+    { "2.16.840.1.114412.2.4.4.1",        "DIGI_CERT_LEVEL4_US_CLIENT_CERT" },
+    { "2.16.840.1.114412.2.4.4.2",        "DIGI_CERT_LEVEL4_CBP_CLIENT_CERT" },
+    { "2.16.840.1.114412.2.4.5.1",        "DIGI_CERT_PIV_HARDWARE_CERT" },
+    { "2.16.840.1.114412.2.4.5.2",        "DIGI_CERT_PIV_CARD_AUTH_CERT" },
+    { "2.16.840.1.114412.2.4.5.3",        "DIGI_CERT_PIV_CONTENT_SIGNING_CERT" },
+    { "2.16.840.1.114412.4.31",           "DIGI_CERT_GRID_CLASSIC_CERT" },
+    { "2.16.840.1.114412.4.31.5",         "DIGI_CERT_GRID_INTEGRATED_CERT" },
+    { "2.16.840.1.114412.31.4.31.1",      "DIGI_CERT_GRID_HOST_CERT" },
+    { "2.23.42.0",                        "CONTENT_TYPE" },
+    { "2.23.42.0.0",                      "PAN_DATA" },
+    { "2.23.42.0.1",                      "PAN_TOKEN" },
+    { "2.23.42.0.2",                      "PAN_ONLY" },
+    { "2.23.42.1",                        "MSG_EXT" },
+    { "2.23.42.2",                        "FIELD" },
+    { "2.23.42.2.0",                      "FULL_NAME" },
+    { "2.23.42.2.1",                      "GIVEN_NAME" },
+    { "2.23.42.2.2",                      "FAMILY_NAME" },
+    { "2.23.42.2.3",                      "BIRTH_FAMILY_NAME" },
+    { "2.23.42.2.4",                      "PLACE_NAME" },
+    { "2.23.42.2.5",                      "IDENTIFICATION_NUMBER" },
+    { "2.23.42.2.6",                      "MONTH" },
+    { "2.23.42.2.7",                      "DATE" },
+    { "2.23.42.2.8",                      "ADDRESS" },
+    { "2.23.42.2.9",                      "TELEPHONE" },
+    { "2.23.42.2.10",                     "AMOUNT" },
+    { "2.23.42.2.11",                     "ACCOUNT_NUMBER" },
+    { "2.23.42.2.12",                     "PASS_PHRASE" },
+    { "2.23.42.3",                        "ATTRIBUTE" },
+    { "2.23.42.3.0",                      "CERT" },
+    { "2.23.42.3.0.0",                    "ROOT_KEY_THUMB" },
+    { "2.23.42.3.0.1",                    "ADDITIONAL_POLICY" },
+    { "2.23.42.4",                        "ALGORITHM" },
+    { "2.23.42.5",                        "POLICY" },
+    { "2.23.42.5.0",                      "ROOT" },
+    { "2.23.42.6",                        "MODULE" },
+    { "2.23.42.7",                        "CERT_EXT" },
+    { "2.23.42.7.0",                      "HASHED_ROOT_KEY" },
+    { "2.23.42.7.1",                      "CERTIFICATE_TYPE" },
+    { "2.23.42.7.2",                      "MERCHANT_DATA" },
+    { "2.23.42.7.3",                      "CARD_CERT_REQUIRED" },
+    { "2.23.42.7.4",                      "TUNNELING" },
+    { "2.23.42.7.5",                      "SET_EXTENSIONS" },
+    { "2.23.42.7.6",                      "SET_QUALIFIER" },
+    { "2.23.42.8",                        "BRAND" },
+    { "2.23.42.8.1",                      "IATA_ATA" },
+    { "2.23.42.8.4",                      "VISA" },
+    { "2.23.42.8.5",                      "MASTER_CARD" },
+    { "2.23.42.8.30",                     "DINERS" },
+    { "2.23.42.8.34",                     "AMERICAN_EXPRESS" },
+    { "2.23.42.8.6011",                   "NOVUS" },
+    { "2.23.42.9",                        "VENDOR" },
+    { "2.23.42.9.0",                      "GLOBE_SET" },
+    { "2.23.42.9.1",                      "IBM" },
+    { "2.23.42.9.2",                      "CYBER_CASH" },
+    { "2.23.42.9.3",                      "TERISA" },
+    { "2.23.42.9.4",                      "RSADSI" },
+    { "2.23.42.9.5",                      "VERI_FONE" },
+    { "2.23.42.9.6",                      "TRIN_TECH" },
+    { "2.23.42.9.7",                      "BANK_GATE" },
+    { "2.23.42.9.8",                      "GTE" },
+    { "2.23.42.9.9",                      "COMPU_SOURCE" },
+    { "2.23.42.9.10",                     "GRIFFIN" },
+    { "2.23.42.9.11",                     "CERTICOM" },
+    { "2.23.42.9.12",                     "OSS" },
+    { "2.23.42.9.13",                     "TENTH_MOUNTAIN" },
+    { "2.23.42.9.14",                     "ANTARES" },
+    { "2.23.42.9.15",                     "ECC" },
+    { "2.23.42.9.16",                     "MAITHEAN" },
+    { "2.23.42.9.17",                     "NETSCAPE" },
+    { "2.23.42.9.18",                     "VERISIGN" },
+    { "2.23.42.9.19",                     "BLUE_MONEY" },
+    { "2.23.42.9.20",                     "LACERTE" },
+    { "2.23.42.9.21",                     "FUJITSU" },
+    { "2.23.42.9.22",                     "E_LAB" },
+    { "2.23.42.9.23",                     "ENTRUST" },
+    { "2.23.42.9.24",                     "VI_ANET" },
+    { "2.23.42.9.25",                     "III" },
+    { "2.23.42.9.26",                     "OPEN_MARKET" },
+    { "2.23.42.9.27",                     "LEXEM" },
+    { "2.23.42.9.28",                     "INTERTRADER" },
+    { "2.23.42.9.29",                     "PERSIMMON" },
+    { "2.23.42.9.30",                     "NABLE" },
+    { "2.23.42.9.31",                     "ESPACE_NET" },
+    { "2.23.42.9.32",                     "HITACHI" },
+    { "2.23.42.9.33",                     "MICROSOFT" },
+    { "2.23.42.9.34",                     "NEC" },
+    { "2.23.42.9.35",                     "MITSUBISHI" },
+    { "2.23.42.9.36",                     "NCR" },
+    { "2.23.42.9.37",                     "E_COMM" },
+    { "2.23.42.9.38",                     "GEMPLUS" },
+    { "2.23.42.10",                       "NATIONAL" },
+    { "2.23.42.10.392",                   "JAPAN" },
+    { "2.23.43.1.4",                      "W_TLS_ECC" },
+    { "2.23.43.1.4.1",                    "W_TLS_ECC_CURVE1" },
+    { "2.23.43.1.4.6",                    "W_TLS_ECC_CURVE6" },
+    { "2.23.43.1.4.8",                    "W_TLS_ECC_CURVE8" },
+    { "2.23.43.1.4.9",                    "W_TLS_ECC_CURVE9" },
+    { "2.23.133",                         "T_CPA" },
+    { "2.23.133.1",                       "TCPA_SPEC_VERSION" },
+    { "2.23.133.2",                       "TCPA_ATTRIBUTE" },
+    { "2.23.133.2.1",                     "TCPA_TPM_MANUFACTURER" },
+    { "2.23.133.2.2",                     "TCPA_TPM_MODEL" },
+    { "2.23.133.2.3",                     "TCPA_TPM_VERSION" },
+    { "2.23.133.2.4",                     "TCPA_PLATFORM_MANUFACTURER" },
+    { "2.23.133.2.5",                     "TCPA_PLATFORM_MODEL" },
+    { "2.23.133.2.6",                     "TCPA_PLATFORM_VERSION" },
+    { "2.23.133.2.7",                     "TCPA_COMPONENT_MANUFACTURER" },
+    { "2.23.133.2.8",                     "TCPA_COMPONENT_MODEL" },
+    { "2.23.133.2.9",                     "TCPA_COMPONENT_VERSION" },
+    { "2.23.133.2.10",                    "TCPA_SECURITY_QUALITIES" },
+    { "2.23.133.2.11",                    "TCPA_TPM_PROTECTION_PROFILE" },
+    { "2.23.133.2.12",                    "TCPA_TPM_SECURITY_TARGET" },
+    { "2.23.133.2.13",                    "TCPA_FOUNDATION_PROTECTION_PROFILE" },
+    { "2.23.133.2.14",                    "TCPA_FOUNDATION_SECURITY_TARGET" },
+    { "2.23.133.2.15",                    "TCPA_TPM_ID_LABEL" },
+    { "2.23.133.3",                       "TCPA_PROTOCOL" },
+    { "2.23.133.3.1",                     "TCPA_PRTT_TPM_ID_PROTOCOL" },
+    { "2.23.134.1.4.2.1",                 "POST_SIGNUM_ROOT_QCA" },
+    { "2.23.134.1.2.2.3",                 "POST_SIGNUM_PUBLIC_CA" },
+    { "2.23.134.1.2.1.8.210",             "POST_SIGNUM_COMMERCIAL_SERVER_POLICY" },
+    { "2.23.136.1.1.1",                   "M_RTD_SIGNATURE_DATA" },
+    { "2.54.1775.2",                      "HASHED_ROOT_KEY" },
+    { "2.54.1775.3",                      "CERTIFICATE_TYPE" },
+    { "2.54.1775.4",                      "MERCHANT_DATA" },
+    { "2.54.1775.5",                      "CARD_CERT_REQUIRED" },
+    { "2.54.1775.6",                      "TUNNELING" },
+    { "2.54.1775.7",                      "SET_QUALIFIER" },
+    { "2.54.1775.99",                     "SET_DATA" },
+    { "1.2.40.0.17.1.22",                 "A_TRUST_EV_POLICY" },
+    { "1.3.6.1.4.1.34697.2.1",            "AFFIRM_TRUST_EV_POLICY" },
+    { "1.3.6.1.4.1.34697.2.2",            "AFFIRM_TRUST_EV_POLICY" },
+    { "1.3.6.1.4.1.34697.2.3",            "AFFIRM_TRUST_EV_POLICY" },
+    { "1.3.6.1.4.1.34697.2.4",            "AFFIRM_TRUST_EV_POLICY" },
+    { "2.16.578.1.26.1.3.3",              "BUY_PASS_EV_POLICY" },
+    { "1.3.6.1.4.1.17326.10.14.2.1.2",    "CAMERFIRMA_EV_POLICY" },
+    { "1.3.6.1.4.1.17326.10.8.12.1.2",    "CAMERFIRMA_EV_POLICY" },
+    { "1.3.6.1.4.1.22234.2.5.2.3.1",      "CERT_PLUS_EV_POLICY" },
+    { "1.3.6.1.4.1.6449.1.2.1.5.1",       "COMODO_EV_POLICY" },
+    { "1.3.6.1.4.1.6334.1.100.1",         "CYBERTRUST_EV_POLICY" },
+    { "1.3.6.1.4.1.4788.2.202.1",         "D_TRUST_EV_POLICY" },
+    { "2.16.840.1.114412.2.1",            "DIGI_CERT_EV_POLICY" },
+    { "2.16.528.1.1001.1.1.1.12.6.1.1.1", "DIGI_NOTAR_EV_POLICY" },
+    { "2.16.840.1.114028.10.1.2",         "ENTRUST_EV_POLICY" },
+    { "1.3.6.1.4.1.14370.1.6",            "GEO_TRUST_EV_POLICY" },
+    { "1.3.6.1.4.1.4146.1.1",             "GLOBAL_SIGN_EV_POLICY" },
+    { "2.16.840.1.114413.1.7.23.3",       "GO_DADDY_EV_POLICY" },
+    { "1.3.6.1.4.1.14777.6.1.1",          "IZENPE_EV_POLICY" },
+    { "1.3.6.1.4.1.14777.6.1.2",          "IZENPE_EV_POLICY" },
+    { "1.3.6.1.4.1.782.1.2.1.8.1",        "NETWORK_SOLUTIONS_EV_POLICY" },
+    { "1.3.6.1.4.1.8024.0.2.100.1.2",     "QUO_VADIS_EV_POLICY" },
+    { "1.2.392.200091.100.721.1",         "SECURITY_COMMUNICATION_(SECOM)_EV_POLICY" },
+    { "2.16.840.1.114414.1.7.23.3",       "STARFIELD_EV_POLICY" },
+    { "1.3.6.1.4.1.23223.1.1.1",          "START_COM_EV_POLICY" },
+    { "2.16.756.1.89.1.2.1.1",            "SWISS_SIGN_EV_POLICY" },
+    { "1.3.6.1.4.1.7879.13.24.1",         "T_TELE_SEC_EV_POLICY" },
+    { "2.16.840.1.113733.1.7.48.1",       "THAWTE_EV_POLICY" },
+    { "2.16.840.1.114404.1.1.2.4.1",      "TRUST_WAVE_EV_POLICY" },
+    { "1.3.6.1.4.1.40869.1.1.22.3",       "TWCA_EV_POLICY" },
+    { "2.16.840.1.113733.1.7.23.6",       "VERI_SIGN_EV_POLICY" },
+    { "2.16.840.1.114171.500.9",          "WELLS_FARGO_EV_POLICY" }
+  };
+  auto   it  = oid_to_str.find(oid);
+  return it == oid_to_str.end() ? "Out of range" : it->second;
+}
+
+}
+}
diff --git a/src/PE/signature/Signature.cpp b/src/PE/signature/Signature.cpp
new file mode 100644
index 0000000..0ad608f
--- /dev/null
+++ b/src/PE/signature/Signature.cpp
@@ -0,0 +1,83 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+
+#include "LIEF/PE/signature/Signature.hpp"
+#include "LIEF/PE/signature/OIDToString.hpp"
+
+namespace LIEF {
+namespace PE {
+
+Signature::Signature(void) = default; // TODO
+Signature::Signature(const Signature&) = default;
+Signature& Signature::operator=(const Signature&) = default;
+Signature::~Signature(void) = default;
+
+uint32_t Signature::version(void) const {
+  return this->version_;
+}
+
+const oid_t& Signature::digest_algorithm(void) const {
+  return this->digest_algorithm_;
+}
+
+const ContentInfo& Signature::content_info(void) const {
+  return this->content_info_;
+}
+
+it_const_crt Signature::certificates(void) const {
+  return {this->certificates_};
+}
+
+const SignerInfo& Signature::signer_info(void) const {
+  return this->signer_info_;
+}
+
+const std::vector<uint8_t>& Signature::original_signature(void) const {
+  return this->original_raw_signature_;
+}
+
+void Signature::accept(Visitor& visitor) const {
+}
+
+std::ostream& operator<<(std::ostream& os, const Signature& signature) {
+  constexpr uint8_t wsize = 30;
+  os << std::hex << std::left;
+  os << std::setw(wsize) << std::setfill(' ') << "Version: "          << signature.version() << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Digest Algorithm: " << oid_to_string(signature.digest_algorithm()) << std::endl;
+
+  os << "Content Info" << std::endl;
+  os << "============" << std::endl;
+  os << signature.content_info() << std::endl << std::endl;
+
+
+  os << "Certificates" << std::endl;
+  os << "============" << std::endl;
+  for (const x509& crt : signature.certificates()) {
+    os << crt << std::endl;;
+  }
+  os << std::endl;
+
+  os << "Signer Info" << std::endl;
+  os << "===========" << std::endl;
+  os << signature.signer_info() << std::endl << std::endl;
+
+  return os;
+}
+
+
+}
+}
diff --git a/src/PE/signature/SignerInfo.cpp b/src/PE/signature/SignerInfo.cpp
new file mode 100644
index 0000000..70b4ea5
--- /dev/null
+++ b/src/PE/signature/SignerInfo.cpp
@@ -0,0 +1,93 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iomanip>
+#include <type_traits>
+#include <numeric>
+
+#include "LIEF/PE/signature/OIDToString.hpp"
+#include "LIEF/PE/signature/SignerInfo.hpp"
+
+namespace LIEF {
+namespace PE {
+
+SignerInfo::SignerInfo(void) = default;
+SignerInfo::SignerInfo(const SignerInfo&) = default;
+SignerInfo& SignerInfo::operator=(const SignerInfo&) = default;
+SignerInfo::~SignerInfo(void) = default;
+
+
+uint32_t SignerInfo::version(void) const {
+  return this->version_;
+}
+
+
+const issuer_t& SignerInfo::issuer(void) const {
+  return this->issuer_;
+}
+
+
+const oid_t& SignerInfo::digest_algorithm(void) const {
+  return this->digest_algorithm_;
+}
+
+
+const AuthenticatedAttributes& SignerInfo::authenticated_attributes(void) const {
+  return this->authenticated_attributes_;
+}
+
+
+const oid_t& SignerInfo::signature_algorithm(void) const {
+  return this->signature_algorithm_;
+}
+
+
+const std::vector<uint8_t>& SignerInfo::encrypted_digest(void) const {
+  return this->encrypted_digest_;
+}
+
+void SignerInfo::accept(Visitor& visitor) const {
+}
+
+
+std::ostream& operator<<(std::ostream& os, const SignerInfo& signer_info) {
+
+  constexpr uint8_t wsize = 30;
+  const issuer_t& issuer = signer_info.issuer();
+
+  std::string issuer_str = std::accumulate(
+      std::begin(std::get<0>(issuer)),
+      std::end(std::get<0>(issuer)),
+      std::string(""),
+      [] (std::string lhs, const std::pair<std::string, std::string>& p) {
+        std::string s = oid_to_string(std::get<0>(p)) + std::string("=") + std::get<1>(p);
+        return lhs.empty() ? s : lhs + " " + s;
+      });
+
+  os << std::hex << std::left;
+
+  os << std::setw(wsize) << std::setfill(' ') << "Version: "             << signer_info.version() << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Issuer: "              << issuer_str << std::endl;
+
+  os << std::setw(wsize) << std::setfill(' ') << "Digest Algorithm: "    << oid_to_string(signer_info.digest_algorithm()) << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Signature algorithm: " << oid_to_string(signer_info.signature_algorithm()) << std::endl;
+
+  os << signer_info.authenticated_attributes() << std::endl;
+
+  return os;
+}
+
+}
+}
diff --git a/src/PE/signature/x509.cpp b/src/PE/signature/x509.cpp
new file mode 100644
index 0000000..3e4ebe3
--- /dev/null
+++ b/src/PE/signature/x509.cpp
@@ -0,0 +1,179 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <cstring>
+#include <iomanip>
+#include <numeric>
+#include <sstream>
+
+#include "mbedtls/x509_crt.h"
+#include "mbedtls/asn1.h"
+#include <mbedtls/oid.h>
+
+#include "LIEF/PE/signature/OIDToString.hpp"
+#include "LIEF/PE/signature/x509.hpp"
+
+namespace LIEF {
+namespace PE {
+
+x509::x509(void) :
+  x509_cert_{nullptr}
+{}
+
+
+x509::x509(mbedtls_x509_crt* ca) :
+  x509_cert_{ca}
+{}
+
+x509::x509(const x509& other) :
+  Visitable::Visitable{other}
+{
+  mbedtls_x509_crt* crt = new mbedtls_x509_crt{};
+  mbedtls_x509_crt_init(crt);
+  mbedtls_x509_crt_parse_der(crt, other.x509_cert_->raw.p, other.x509_cert_->raw.len);
+
+  this->x509_cert_ = crt;
+
+}
+
+x509& x509::operator=(x509 other) {
+  this->swap(other);
+  return *this;
+}
+
+
+void x509::swap(x509& other) {
+  std::swap(this->x509_cert_, other.x509_cert_);
+}
+
+uint32_t x509::version(void) const {
+  return this->x509_cert_->version;
+}
+
+std::vector<uint8_t> x509::serial_number(void) const {
+  return {this->x509_cert_->serial.p, this->x509_cert_->serial.p + this->x509_cert_->serial.len};
+}
+
+oid_t x509::signature_alogrithm(void) const {
+  char oid_str[256];
+  mbedtls_oid_get_numeric_string(oid_str, sizeof(oid_str), &this->x509_cert_->sig_oid);
+  return oid_t{oid_str};
+
+}
+
+x509::date_t x509::valid_from(void) const {
+  return std::make_tuple(
+    this->x509_cert_->valid_from.year,
+    this->x509_cert_->valid_from.mon,
+    this->x509_cert_->valid_from.day,
+    this->x509_cert_->valid_from.hour,
+    this->x509_cert_->valid_from.min,
+    this->x509_cert_->valid_from.sec
+    );
+}
+
+x509::date_t x509::valid_to(void) const {
+  return std::make_tuple(
+    this->x509_cert_->valid_to.year,
+    this->x509_cert_->valid_to.mon,
+    this->x509_cert_->valid_to.day,
+    this->x509_cert_->valid_to.hour,
+    this->x509_cert_->valid_to.min,
+    this->x509_cert_->valid_to.sec
+    );
+}
+
+
+std::string x509::issuer(void) const {
+  char buffer[1024];
+  mbedtls_x509_dn_gets(buffer, sizeof(buffer), &this->x509_cert_->issuer);
+  return {buffer};
+}
+
+std::string x509::subject(void) const {
+  char buffer[1024];
+  mbedtls_x509_dn_gets(buffer, sizeof(buffer), &this->x509_cert_->subject);
+  return {buffer};
+}
+
+
+void x509::accept(Visitor& visitor) const {
+}
+
+x509::~x509(void) {
+  mbedtls_x509_crt_free(this->x509_cert_);
+  delete this->x509_cert_;
+}
+
+std::ostream& operator<<(std::ostream& os, const x509& x509_cert) {
+
+  constexpr uint8_t wsize = 30;
+  const std::vector<uint8_t>& sn = x509_cert.serial_number();
+  std::string sn_str = std::accumulate(
+      std::begin(sn),
+      std::end(sn),
+      std::string(""),
+      [] (std::string lhs, uint8_t x) {
+        std::stringstream ss;
+        ss << std::setw(2) << std::setfill('0') << std::hex << static_cast<uint32_t>(x);
+        return lhs.empty() ? ss.str() : lhs + ":" + ss.str();
+      });
+
+
+  const x509::date_t& valid_from = x509_cert.valid_from();
+  const x509::date_t& valid_to   = x509_cert.valid_to();
+  //// 2018-01-11 20:39:31
+  std::string valid_from_str =
+    std::to_string(std::get<0>(valid_from)) + "-" +
+    std::to_string(std::get<1>(valid_from)) + "-" +
+    std::to_string(std::get<2>(valid_from)) + " " +
+    std::to_string(std::get<3>(valid_from)) + ":" +
+    std::to_string(std::get<4>(valid_from)) + ":" +
+    std::to_string(std::get<5>(valid_from));
+
+
+  std::string valid_to_str =
+    std::to_string(std::get<0>(valid_to)) + "-" +
+    std::to_string(std::get<1>(valid_to)) + "-" +
+    std::to_string(std::get<2>(valid_to)) + " " +
+    std::to_string(std::get<3>(valid_to)) + ":" +
+    std::to_string(std::get<4>(valid_to)) + ":" +
+    std::to_string(std::get<5>(valid_to));
+
+
+  os << std::hex << std::left;
+  os << std::setw(wsize) << std::setfill(' ') << "Version:       "       << x509_cert.version() << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Serial Number: "       << sn_str << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Signature Alogrithm: " << oid_to_string(x509_cert.signature_alogrithm()) << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Valid from: "          << valid_from_str << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Valid to: "            << valid_to_str << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Issuer: "              << x509_cert.issuer() << std::endl;
+  os << std::setw(wsize) << std::setfill(' ') << "Subject: "             << x509_cert.subject() << std::endl;
+
+
+
+
+
+
+  //os << std::endl << std::endl;
+  //std::vector<char> buffer(2048, 0);
+  //mbedtls_x509_crt_info(buffer.data(), buffer.size(), "", x509_cert.x509_cert_);
+  //std::string foo(buffer.data());
+  //os << foo;
+  return os;
+}
+
+}
+}
diff --git a/src/PE/utils.cpp b/src/PE/utils.cpp
new file mode 100644
index 0000000..646a0cd
--- /dev/null
+++ b/src/PE/utils.cpp
@@ -0,0 +1,151 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <algorithm>
+#include <fstream>
+#include <iterator>
+#include <exception>
+#include <string.h>
+
+#include "LIEF/utf8.h"
+#include "LIEF/exception.hpp"
+
+#include "LIEF/PE/utils.hpp"
+
+namespace LIEF {
+namespace PE {
+
+bool is_pe(const std::string& file) {
+  std::ifstream binary(file, std::ios::in | std::ios::binary);
+  if (not binary) {
+    throw LIEF::bad_file("Unable to open the file");
+  }
+
+  uint64_t file_size;
+  binary.unsetf(std::ios::skipws);
+  binary.seekg(0, std::ios::end);
+  file_size = binary.tellg();
+  binary.seekg(0, std::ios::beg);
+
+  char magic[2];
+  pe_dos_header dos_header;
+  binary.read(magic, sizeof(magic));
+  if (magic[0] != 'M' or magic[1] != 'Z') {
+    return false;
+  }
+
+  binary.seekg(0, std::ios::beg);
+  binary.read(reinterpret_cast<char*>(&dos_header), sizeof(pe_dos_header));
+  if (dos_header.AddressOfNewExeHeader >= file_size) {
+    return false;
+  }
+  char signature[sizeof(PE_Magic)];
+  binary.seekg(dos_header.AddressOfNewExeHeader, std::ios::beg);
+  binary.read(signature, sizeof(PE_Magic));
+  return std::equal(std::begin(signature), std::end(signature), std::begin(PE_Magic));
+}
+
+
+bool is_pe(const std::vector<uint8_t>& raw) {
+
+  if (raw.size() < sizeof(pe_dos_header)) {
+    return false;
+  }
+
+  const pe_dos_header* dos_header = reinterpret_cast<const pe_dos_header*>(raw.data());
+  if (raw[0] != 'M' or raw[1] != 'Z') {
+    return false;
+  }
+
+  if ((dos_header->AddressOfNewExeHeader + sizeof(pe_header)) >= raw.size()) {
+    return false;
+  }
+
+  char signature[sizeof(PE_Magic)];
+  std::copy(
+    reinterpret_cast<const uint8_t*>(raw.data() + dos_header->AddressOfNewExeHeader),
+    reinterpret_cast<const uint8_t*>(raw.data() + dos_header->AddressOfNewExeHeader) + sizeof(signature),
+    signature);
+
+  return std::equal(std::begin(signature), std::end(signature), std::begin(PE_Magic));
+}
+
+
+
+PE_TYPE get_type(const std::string& file) {
+  if (not is_pe(file)) {
+    throw LIEF::bad_format("This file is not a PE binary");
+  }
+
+  std::ifstream binary(file, std::ios::in | std::ios::binary);
+  if (not binary) {
+    throw LIEF::bad_file("Unable to open the file");
+  }
+
+
+  pe_dos_header          dos_header;
+  pe32_optional_header   optional_header;
+  binary.seekg(0, std::ios::beg);
+
+  binary.read(reinterpret_cast<char*>(&dos_header), sizeof(pe_dos_header));
+
+  binary.seekg(dos_header.AddressOfNewExeHeader + sizeof(pe_header), std::ios::beg);
+  binary.read(reinterpret_cast<char*>(&optional_header), sizeof(pe32_optional_header));
+  PE_TYPE type = static_cast<PE_TYPE>(optional_header.Magic);
+
+  if (type == PE_TYPE::PE32 or type == PE_TYPE::PE32_PLUS) {
+    return type;
+  } else {
+    throw LIEF::bad_format("This file is not PE32 or PE32+");
+  }
+
+}
+
+PE_TYPE get_type(const std::vector<uint8_t>& raw) {
+  if (not is_pe(raw)) {
+    throw LIEF::bad_format("This file is not a PE binary");
+  }
+
+  const pe_dos_header*          dos_header;
+  const pe32_optional_header*   optional_header;
+
+  dos_header      = reinterpret_cast<const pe_dos_header*>(raw.data());
+  optional_header = reinterpret_cast<const pe32_optional_header*>(
+      raw.data() +
+      dos_header->AddressOfNewExeHeader +
+      sizeof(pe_header));
+
+  PE_TYPE type = static_cast<PE_TYPE>(optional_header->Magic);
+
+  if (type == PE_TYPE::PE32 or type == PE_TYPE::PE32_PLUS) {
+    return type;
+  } else {
+    throw LIEF::bad_format("This file is not PE32 or PE32+");
+  }
+
+}
+
+
+
+//! @brief Return `PE32` or `PE32+`
+DLL_PUBLIC PE_TYPE get_type(const std::vector<uint8_t>& raw);
+
+std::string u16tou8(const std::u16string& string) {
+  std::string name;
+  utf8::utf16to8(std::begin(string), std::end(string), std::back_inserter(name));
+  return name;
+}
+}
+}
diff --git a/src/Visitable.cpp b/src/Visitable.cpp
new file mode 100644
index 0000000..e8e2fbe
--- /dev/null
+++ b/src/Visitable.cpp
@@ -0,0 +1,23 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/Visitable.hpp"
+
+namespace LIEF {
+Visitable::Visitable(void) = default;
+Visitable::Visitable(const Visitable&) = default;
+Visitable& Visitable::operator=(const Visitable&) = default;
+Visitable::~Visitable(void) = default;
+}
diff --git a/src/Visitor.cpp b/src/Visitor.cpp
new file mode 100644
index 0000000..07ab4c8
--- /dev/null
+++ b/src/Visitor.cpp
@@ -0,0 +1,265 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/Visitor.hpp"
+
+#include "LIEF/Abstract/Abstract.hpp"
+
+#include "LIEF/ELF.hpp"
+#include "LIEF/PE.hpp"
+#include "LIEF/MachO.hpp"
+
+namespace LIEF {
+Visitor::Visitor(void) = default;
+Visitor::~Visitor(void) = default;
+
+
+void Visitor::operator()(void) {
+}
+
+
+// visit methods
+// =============
+
+// Fundamental types
+// =================
+void Visitor::visit(size_t) {
+}
+
+void Visitor::visit(const std::string&) {
+}
+
+void Visitor::visit(const std::u16string&) {
+}
+
+void Visitor::visit(const std::vector<uint8_t>&) {
+}
+
+// Abstract part
+// -------------
+void Visitor::visit(const Binary& binary) {
+  binary.accept(*this);
+}
+
+void Visitor::visit(const Header& header) {
+  header.accept(*this);
+}
+
+void Visitor::visit(const Section& section) {
+  section.accept(*this);
+}
+
+void Visitor::visit(const Symbol& symbol) {
+  symbol.accept(*this);
+}
+
+
+// ELF part
+// --------
+void Visitor::visit(const ELF::Binary& binary) {
+  binary.accept(*this);
+}
+
+void Visitor::visit(const ELF::Header& header) {
+  header.accept(*this);
+}
+
+void Visitor::visit(const ELF::Section& section) {
+  section.accept(*this);
+}
+
+void Visitor::visit(const ELF::Segment& segment) {
+  segment.accept(*this);
+}
+
+void Visitor::visit(const ELF::DynamicEntry& entry) {
+  entry.accept(*this);
+}
+
+void Visitor::visit(const ELF::DynamicEntryArray& array) {
+  array.accept(*this);
+}
+
+void Visitor::visit(const ELF::DynamicEntryLibrary& library) {
+  library.accept(*this);
+}
+
+void Visitor::visit(const ELF::DynamicSharedObject& shared) {
+  shared.accept(*this);
+}
+
+void Visitor::visit(const ELF::DynamicEntryRunPath& runpath) {
+  runpath.accept(*this);
+}
+
+void Visitor::visit(const ELF::DynamicEntryRpath& rpath) {
+  rpath.accept(*this);
+}
+
+void Visitor::visit(const ELF::Symbol& symbol) {
+  symbol.accept(*this);
+}
+
+void Visitor::visit(const ELF::Relocation& relocation) {
+  relocation.accept(*this);
+}
+
+void Visitor::visit(const ELF::SymbolVersion& sv) {
+  sv.accept(*this);
+}
+
+void Visitor::visit(const ELF::SymbolVersionRequirement& svr) {
+  svr.accept(*this);
+}
+
+void Visitor::visit(const ELF::SymbolVersionDefinition& svd) {
+  svd.accept(*this);
+}
+
+void Visitor::visit(const ELF::SymbolVersionAux& sva) {
+  sva.accept(*this);
+}
+
+void Visitor::visit(const ELF::SymbolVersionAuxRequirement& svar) {
+  svar.accept(*this);
+}
+
+// PE Part
+// -------
+void Visitor::visit(const PE::Binary& binary) {
+  binary.accept(*this);
+}
+
+void Visitor::visit(const PE::DosHeader& dos_header) {
+  dos_header.accept(*this);
+}
+
+void Visitor::visit(const PE::Header& header) {
+  header.accept(*this);
+}
+
+void Visitor::visit(const PE::OptionalHeader& optional_header) {
+  optional_header.accept(*this);
+}
+
+void Visitor::visit(const PE::DataDirectory& data_directory) {
+  data_directory.accept(*this);
+}
+
+void Visitor::visit(const PE::TLS& tls) {
+  tls.accept(*this);
+}
+
+void Visitor::visit(const PE::Symbol& symbol) {
+  symbol.accept(*this);
+}
+
+void Visitor::visit(const PE::Relocation& relocation) {
+  relocation.accept(*this);
+}
+
+void Visitor::visit(const PE::RelocationEntry& relocation_entry) {
+  relocation_entry.accept(*this);
+}
+
+void Visitor::visit(const PE::Export& exp) {
+  exp.accept(*this);
+}
+
+void Visitor::visit(const PE::ExportEntry& export_entry) {
+  export_entry.accept(*this);
+}
+
+void Visitor::visit(const PE::Debug& debug) {
+  debug.accept(*this);
+}
+
+void Visitor::visit(const PE::Import& import) {
+  import.accept(*this);
+}
+
+void Visitor::visit(const PE::ImportEntry& import_entry) {
+  import_entry.accept(*this);
+}
+
+void Visitor::visit(const PE::ResourceNode& node) {
+  node.accept(*this);
+}
+
+void Visitor::visit(const PE::ResourceData& data) {
+  data.accept(*this);
+}
+
+void Visitor::visit(const PE::ResourceDirectory& directory) {
+  directory.accept(*this);
+}
+
+// MachO part
+// ----------
+
+
+void Visitor::visit(const MachO::Binary& binary) {
+  binary.accept(*this);
+}
+
+void Visitor::visit(const MachO::Header& header) {
+  header.accept(*this);
+}
+
+void Visitor::visit(const MachO::LoadCommand& load_command) {
+  load_command.accept(*this);
+}
+
+void Visitor::visit(const MachO::UUIDCommand& uuid_command) {
+  uuid_command.accept(*this);
+}
+
+void Visitor::visit(const MachO::SymbolCommand& symbol_command) {
+  symbol_command.accept(*this);
+}
+
+void Visitor::visit(const MachO::SegmentCommand& segment_command) {
+  segment_command.accept(*this);
+}
+
+void Visitor::visit(const MachO::Section& section) {
+  section.accept(*this);
+}
+
+void Visitor::visit(const MachO::MainCommand& main_command) {
+  main_command.accept(*this);
+}
+
+void Visitor::visit(const MachO::DynamicSymbolCommand& dyn_sym_cmd) {
+  dyn_sym_cmd.accept(*this);
+}
+
+void Visitor::visit(const MachO::DylinkerCommand& dylinker_command) {
+  dylinker_command.accept(*this);
+}
+
+void Visitor::visit(const MachO::DylibCommand& dylib_command) {
+  dylib_command.accept(*this);
+}
+
+void Visitor::visit(const MachO::Symbol& symbol) {
+  symbol.accept(*this);
+}
+
+
+
+
+
+}
diff --git a/src/exception.cpp b/src/exception.cpp
new file mode 100644
index 0000000..247d061
--- /dev/null
+++ b/src/exception.cpp
@@ -0,0 +1,47 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <sstream>
+
+#include "LIEF/exception.hpp"
+
+
+namespace LIEF {
+exception::exception(const exception&) = default;
+exception::~exception() noexcept = default;
+
+exception::exception(const std::string& msg) : msg_{msg} {}
+exception::exception(const char* msg)        : msg_{msg} {}
+
+const char* exception::what(void) const noexcept {
+  return this->msg_.c_str();
+}
+
+
+read_out_of_bound::read_out_of_bound(uint64_t offset, uint64_t size) : LIEF::exception("") {
+  std::ostringstream oss;
+  oss << "Try to read 0x" << std::hex << size
+      << " bytes from 0x" << std::hex << offset
+      << " (" << std::hex << offset + size << ") which is bigger than the binary's size";
+  this->msg_ = oss.str();
+}
+
+read_out_of_bound::read_out_of_bound(uint64_t offset) : LIEF::exception("") {
+  std::ostringstream oss;
+  oss << "Offset: 0x" << std::hex << offset << " is bigger than the binary size";
+  this->msg_ = oss.str();
+}
+
+}
diff --git a/src/iostream.cpp b/src/iostream.cpp
new file mode 100644
index 0000000..58ad691
--- /dev/null
+++ b/src/iostream.cpp
@@ -0,0 +1,127 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <iterator>
+#include "LIEF/iostream.hpp"
+
+namespace LIEF {
+vector_iostream::vector_iostream(void) = default;
+
+void vector_iostream::reserve(size_t size) {
+  this->raw_.reserve(size);
+}
+vector_iostream& vector_iostream::put(uint8_t c) {
+
+  if (this->raw_.size() < (static_cast<size_t>(this->tellp()) + 1)) {
+    this->raw_.resize(static_cast<size_t>(this->tellp()) + 1);
+  }
+  this->raw_[this->tellp()] = c;
+  this->current_pos_ += 1;
+  return *this;
+}
+vector_iostream& vector_iostream::write(const uint8_t* s, std::streamsize n) {
+  if (this->raw_.size() < (static_cast<size_t>(this->tellp()) + n)) {
+    this->raw_.resize(static_cast<size_t>(this->tellp()) + n);
+  }
+
+  auto&& it = std::begin(this->raw_);
+  std::advance(it, static_cast<size_t>(this->tellp()));
+  std::copy(s, s + n, it);
+
+  this->current_pos_ += n;
+  return *this;
+}
+
+vector_iostream& vector_iostream::write(const std::vector<uint8_t>& s) {
+  if (this->raw_.size() < (static_cast<size_t>(this->tellp()) + s.size())) {
+    this->raw_.resize(static_cast<size_t>(this->tellp()) + s.size());
+  }
+  auto&& it = std::begin(this->raw_);
+  std::advance(it, static_cast<size_t>(this->tellp()));
+  std::copy(std::begin(s), std::end(s), it);
+
+  this->current_pos_ += s.size();
+  return *this;
+}
+
+
+vector_iostream& vector_iostream::write(std::vector<uint8_t>&& s) {
+  if (this->raw_.size() < (static_cast<size_t>(this->tellp()) + s.size())) {
+    this->raw_.resize(static_cast<size_t>(this->tellp()) + s.size());
+  }
+  auto&& it = std::begin(this->raw_);
+  std::advance(it, static_cast<size_t>(this->tellp()));
+  std::copy(
+      std::make_move_iterator(std::begin(s)),
+      std::make_move_iterator(std::end(s)), it);
+
+  this->current_pos_ += s.size();
+  return *this;
+}
+
+
+vector_iostream& vector_iostream::get(std::vector<uint8_t>& c) {
+  c = this->raw_;
+  return *this;
+}
+
+vector_iostream& vector_iostream::flush() {
+  return *this;
+}
+
+const std::vector<uint8_t>& vector_iostream::raw(void) const {
+  return this->raw_;
+}
+
+// seeks:
+vector_iostream::pos_type vector_iostream::tellp(void) {
+  return this->current_pos_;
+}
+vector_iostream& vector_iostream::seekp(vector_iostream::pos_type p) {
+  this->current_pos_ = p;
+  return *this;
+}
+vector_iostream& vector_iostream::seekp(vector_iostream::off_type p, std::ios_base::seekdir dir) {
+  switch (dir) {
+    case std::ios_base::beg:
+      {
+        this->current_pos_ = p;
+        break;
+      }
+
+
+    case std::ios_base::end:
+      {
+        //this->current_pos_ = p;
+        break;
+      }
+
+
+    case std::ios_base::cur:
+      {
+        this->current_pos_ += p;
+        break;
+      }
+
+    default:
+      {
+        break;
+      }
+  }
+
+  return *this;
+}
+}
+
diff --git a/src/logging.cpp b/src/logging.cpp
new file mode 100644
index 0000000..aff1eea
--- /dev/null
+++ b/src/logging.cpp
@@ -0,0 +1,39 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "easylogging++.h"
+#include "LIEF/logging.hpp"
+
+INITIALIZE_EASYLOGGINGPP
+
+static LIEF::Logger logger;
+
+namespace LIEF {
+
+Logger::Logger(void)
+{
+  el::Logger* default_logger = el::Loggers::getLogger("default");
+  el::Configurations conf;
+  conf.setToDefault();
+  conf.parseFromText(logging_config);
+  el::Loggers::setDefaultConfigurations(conf, true);
+}
+
+Logger::~Logger(void) = default;
+
+}
+
+
+
diff --git a/src/utils.cpp b/src/utils.cpp
new file mode 100644
index 0000000..8f81c0b
--- /dev/null
+++ b/src/utils.cpp
@@ -0,0 +1,25 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/utils.hpp"
+namespace LIEF {
+uint64_t align(uint64_t value, uint64_t align_on) {
+  if ((align_on > 0) and (value % align_on) > 0) {
+    return  value + (align_on - (value % align_on));
+  } else {
+    return value;
+  }
+}
+}
diff --git a/src/visitors/elf_json.cpp b/src/visitors/elf_json.cpp
new file mode 100644
index 0000000..e893fde
--- /dev/null
+++ b/src/visitors/elf_json.cpp
@@ -0,0 +1,337 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/visitors/elf_json.hpp"
+#include "LIEF/ELF.hpp"
+namespace LIEF {
+namespace ELF {
+
+void JsonVisitor::visit(const Binary& binary) {
+  JsonVisitor header_visitor;
+  header_visitor(binary.get_header());
+
+  // Sections
+  std::vector<json> sections;
+  for (const Section& section : binary.get_sections()) {
+    JsonVisitor visitor;
+    visitor(section);
+    sections.emplace_back(visitor.get());
+  }
+
+  // Segments
+  std::vector<json> segments;
+  for (const Segment& segment : binary.get_segments()) {
+    JsonVisitor visitor;
+    visitor(segment);
+    segments.emplace_back(visitor.get());
+  }
+
+  // Dynamic entries
+  std::vector<json> dynamic_entries;
+  for (const DynamicEntry& entry : binary.get_dynamic_entries()) {
+    JsonVisitor visitor;
+    entry.accept(visitor);
+    dynamic_entries.emplace_back(visitor.get());
+  }
+
+
+  // Dynamic symbols
+  std::vector<json> dynamic_symbols;
+  for (const Symbol& symbol : binary.get_dynamic_symbols()) {
+    JsonVisitor visitor;
+    visitor(symbol);
+    dynamic_symbols.emplace_back(visitor.get());
+  }
+
+
+  // Static symbols
+  std::vector<json> static_symbols;
+  for (const Symbol& symbol : binary.get_static_symbols()) {
+    JsonVisitor visitor;
+    visitor(symbol);
+    static_symbols.emplace_back(visitor.get());
+  }
+
+
+  // Dynamic relocations
+  std::vector<json> dynamic_relocations;
+  for (const Relocation& reloc : binary.get_dynamic_relocations()) {
+    JsonVisitor visitor;
+    visitor(reloc);
+    dynamic_relocations.emplace_back(visitor.get());
+  }
+
+
+  // pltgot relocations
+  std::vector<json> pltgot_relocations;
+  for (const Relocation& reloc : binary.get_pltgot_relocations()) {
+    JsonVisitor visitor;
+    visitor(reloc);
+    pltgot_relocations.emplace_back(visitor.get());
+  }
+
+
+  // Symbol version
+  std::vector<json> symbols_version;
+  for (const SymbolVersion& s : binary.get_symbols_version()) {
+    JsonVisitor visitor;
+    visitor(s);
+    symbols_version.emplace_back(visitor.get());
+  }
+
+
+  // Symbols version requirement
+  std::vector<json> symbols_version_requirement;
+  for (const SymbolVersionRequirement& s : binary.get_symbols_version_requirement()) {
+    JsonVisitor visitor;
+    visitor(s);
+    symbols_version_requirement.emplace_back(visitor.get());
+  }
+
+
+  // Symbols version definition
+  std::vector<json> symbols_version_definition;
+  for (const SymbolVersionDefinition& s : binary.get_symbols_version_definition()) {
+    JsonVisitor visitor;
+    visitor(s);
+    symbols_version_definition.emplace_back(visitor.get());
+  }
+
+
+
+  this->node_["name"]         = binary.name();
+  this->node_["entrypoint"]   = binary.entrypoint();
+  this->node_["imagebase"]    = binary.get_imagebase();
+  this->node_["virtual_size"] = binary.get_virtual_size();
+  this->node_["is_pie"]       = binary.is_pie();
+
+  if (binary.has_interpreter()) {
+    this->node_["interpreter"] = binary.get_interpreter();
+  }
+
+  this->node_["header"]                      = header_visitor.get();
+  this->node_["sections"]                    = sections;
+  this->node_["segments"]                    = segments;
+  this->node_["dynamic_entries"]             = dynamic_entries;
+  this->node_["dynamic_symbols"]             = dynamic_symbols;
+  this->node_["static_symbols"]              = static_symbols;
+  this->node_["dynamic_relocations"]         = dynamic_relocations;
+  this->node_["pltgot_relocations"]          = pltgot_relocations;
+  this->node_["symbols_version"]             = symbols_version;
+  this->node_["symbols_version_requirement"] = symbols_version_requirement;
+  this->node_["symbols_version_definition"]  = symbols_version_definition;
+}
+
+
+void JsonVisitor::visit(const Header& header) {
+  this->node_["file_type"]                       = to_string(header.file_type());
+  this->node_["machine_type"]                    = to_string(header.machine_type());
+  this->node_["object_file_version"]             = to_string(header.object_file_version());
+  this->node_["entrypoint"]                      = header.entrypoint();
+  this->node_["program_headers_offset"]          = header.program_headers_offset();
+  this->node_["section_headers_offset"]          = header.section_headers_offset();
+  this->node_["processor_flag"]                  = header.processor_flag();
+  this->node_["header_size"]                     = header.header_size();
+  this->node_["program_header_size"]             = header.program_header_size();
+  this->node_["processornumberof_segments_flag"] = header.numberof_segments();
+  this->node_["sizeof_section_header"]           = header.sizeof_section_header();
+  this->node_["numberof_sections"]               = header.numberof_sections();
+  this->node_["section_name_table_idx"]          = header.section_name_table_idx();
+  this->node_["identity_class"]                  = to_string(header.identity_class());
+  this->node_["identity_data"]                   = to_string(header.identity_data());
+  this->node_["identity_version"]                = to_string(header.identity_version());
+  this->node_["identity_os_abi"]                 = to_string(header.identity_os_abi());
+}
+
+
+void JsonVisitor::visit(const Section& section) {
+  std::vector<json> flags;
+  for (SECTION_FLAGS f : section.flags_list()) {
+    flags.emplace_back(to_string(f));
+  }
+
+  this->node_["name"]            = section.name();
+  this->node_["virtual_address"] = section.virtual_address();
+  this->node_["size"]            = section.size();
+  this->node_["offset"]          = section.offset();
+  this->node_["alignment"]       = section.alignment();
+  this->node_["information"]     = section.information();
+  this->node_["entry_size"]      = section.entry_size();
+  this->node_["link"]            = section.link();
+  this->node_["type"]            = to_string(section.type());
+  this->node_["flags"]           = flags;
+}
+
+void JsonVisitor::visit(const Segment& segment) {
+
+  std::vector<json> sections;
+  for (const Section& section : segment.sections()) {
+    sections.emplace_back(section.name());
+  }
+
+  // TODO: sections
+  this->node_["type"]             = to_string(segment.type());
+  this->node_["flag"]             = segment.flag();
+  this->node_["file_offset"]      = segment.file_offset();
+  this->node_["virtual_address"]  = segment.virtual_address();
+  this->node_["physical_address"] = segment.physical_address();
+  this->node_["physical_size"]    = segment.physical_size();
+  this->node_["virtual_size"]     = segment.virtual_size();
+  this->node_["alignment"]        = segment.alignment();
+  this->node_["sections"]         = sections;
+
+}
+
+void JsonVisitor::visit(const DynamicEntry& entry) {
+  this->node_["tag"]   = to_string(entry.tag());
+  this->node_["value"] = entry.value();
+
+}
+
+
+void JsonVisitor::visit(const DynamicEntryArray& entry) {
+  this->node_["array"] = entry.array();
+}
+
+
+void JsonVisitor::visit(const DynamicEntryLibrary& entry) {
+  this->node_["library"] = entry.name();
+}
+
+
+void JsonVisitor::visit(const DynamicEntryRpath& entry) {
+  this->node_["rpath"] = entry.rpath();
+}
+
+
+void JsonVisitor::visit(const DynamicEntryRunPath& entry) {
+  this->node_["runpath"] = entry.runpath();
+}
+
+
+void JsonVisitor::visit(const DynamicSharedObject& entry) {
+  this->node_["library"] = entry.name();
+}
+
+void JsonVisitor::visit(const Symbol& symbol) {
+  this->node_["type"]        = to_string(symbol.type());
+  this->node_["binding"]     = to_string(symbol.binding());
+  this->node_["information"] = symbol.information();
+  this->node_["other"]       = symbol.other();
+  this->node_["value"]       = symbol.value();
+  this->node_["size"]        = symbol.size();
+  this->node_["name"]        = symbol.name();
+
+  try {
+    this->node_["demangled_name"] = symbol.demangled_name();
+  } catch (const not_supported&) {
+  }
+}
+
+void JsonVisitor::visit(const Relocation& relocation) {
+  std::string relocation_type = "NOT_TO_STRING";
+  std::string symbol_name     = "";
+
+  if (relocation.has_symbol()) {
+    const Symbol& s = relocation.symbol();
+    try {
+      symbol_name = s.demangled_name();
+    } catch(const not_supported&) {
+      symbol_name = s.name();
+    }
+  }
+
+
+  if (relocation.architecture() == ARCH::EM_X86_64) {
+    relocation_type = to_string(static_cast<RELOC_x86_64>(relocation.type()));
+  }
+
+  this->node_["symbol_name"] = symbol_name;
+  this->node_["address"]     = relocation.address();
+  this->node_["type"]        = relocation_type;
+
+}
+
+void JsonVisitor::visit(const SymbolVersion& sv) {
+  this->node_["value"] = sv.value();
+  if (sv.has_auxiliary_version()) {
+   this->node_["symbol_version_auxiliary"] = sv.symbol_version_auxiliary().name();
+  }
+
+}
+
+void JsonVisitor::visit(const SymbolVersionRequirement& svr) {
+
+  std::vector<json> svar_json;
+
+  for (const SymbolVersionAuxRequirement& svar : svr.get_auxiliary_symbols()) {
+    JsonVisitor visitor;
+    visitor(svar);
+    svar_json.emplace_back(visitor.get());
+  }
+
+  this->node_["version"]                              = svr.version();
+  this->node_["name"]                                 = svr.name();
+  this->node_["symbol_version_auxiliary_requirement"] = svar_json;
+
+}
+
+void JsonVisitor::visit(const SymbolVersionDefinition& svd) {
+
+  std::vector<json> sva_json;
+
+  for (const SymbolVersionAux& sva : svd.symbols_aux()) {
+    JsonVisitor visitor;
+    visitor(sva);
+    sva_json.emplace_back(visitor.get());
+  }
+
+  this->node_["version"]                  = svd.version();
+  this->node_["flags"]                    = svd.flags();
+  this->node_["hash"]                     = svd.hash();
+  this->node_["symbol_version_auxiliary"] = sva_json;
+}
+
+void JsonVisitor::visit(const SymbolVersionAux& sv) {
+  this->node_["name"] = sv.name();
+}
+
+void JsonVisitor::visit(const SymbolVersionAuxRequirement& svar) {
+  this->node_["hash"]  = svar.hash();
+  this->node_["flags"] = svar.flags();
+  this->node_["other"] = svar.other();
+}
+
+
+// LIEF Abstract
+void JsonVisitor::visit(const LIEF::Binary& binary) {
+  // It should be a ELF::Binary so we don't catch "std::bad_cast"
+  this->visit(*dynamic_cast<const LIEF::ELF::Binary*>(&binary));
+}
+
+
+void JsonVisitor::visit(const LIEF::Symbol& symbol) {
+  // It should be a ELF::Binary so we don't catch "std::bad_cast"
+  this->visit(*dynamic_cast<const LIEF::ELF::Symbol*>(&symbol));
+}
+
+
+void JsonVisitor::visit(const LIEF::Section& section) {
+  // It should be a ELF::Binary so we don't catch "std::bad_cast"
+  this->visit(*dynamic_cast<const LIEF::ELF::Section*>(&section));
+}
+
+} // namespace ELF
+} // namespace LIEF
diff --git a/src/visitors/hash.cpp b/src/visitors/hash.cpp
new file mode 100644
index 0000000..61b51f4
--- /dev/null
+++ b/src/visitors/hash.cpp
@@ -0,0 +1,75 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <functional>
+#include <numeric>
+
+#include "mbedtls/sha256.h"
+
+#include "LIEF/visitors/Hash.hpp"
+
+namespace LIEF {
+
+Hash::Hash(void) :
+  value_{0}
+{}
+
+Hash::Hash(size_t init_value) :
+  value_{init_value}
+{}
+
+void Hash::visit(size_t n) {
+  this->value_ = combine(this->value_, std::hash<size_t>{}(n));
+}
+
+void Hash::visit(const std::string& str) {
+  this->value_ = combine(this->value_, std::hash<std::string>{}(str));
+}
+
+void Hash::visit(const std::u16string& str) {
+  this->value_ = combine(this->value_, std::hash<std::u16string>{}(str));
+}
+
+void Hash::visit(const std::vector<uint8_t>& raw) {
+  this->value_ = combine(this->value_, Hash::hash(raw));
+}
+
+size_t Hash::value(void) const {
+  return this->value_;
+}
+
+
+// Static methods
+// ==============
+size_t Hash::hash(const std::vector<uint8_t>& raw) {
+  std::vector<uint8_t> sha256(32, 0);
+  mbedtls_sha256(raw.data(), raw.size(), sha256.data(), 0);
+
+  return std::accumulate(
+     std::begin(sha256),
+     std::end(sha256), 0,
+     [] (size_t v, uint8_t n) {
+        size_t r = v;
+        return (r << sizeof(uint8_t) * 8) | n;
+     });
+}
+
+
+size_t Hash::hash(const void* raw, size_t size) {
+  const uint8_t* start = reinterpret_cast<const uint8_t*>(raw);
+  return Hash::hash(std::vector<uint8_t>{start, start + size});
+}
+
+}
diff --git a/src/visitors/json.cpp b/src/visitors/json.cpp
new file mode 100644
index 0000000..e55fec2
--- /dev/null
+++ b/src/visitors/json.cpp
@@ -0,0 +1,86 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "LIEF/Abstract/Abstract.hpp"
+#include "LIEF/visitors/json.hpp"
+#include "LIEF/Abstract/EnumToString.hpp"
+namespace LIEF {
+
+JsonVisitor::JsonVisitor(void) :
+  node_{}
+{}
+
+JsonVisitor::JsonVisitor(const json& node) :
+  node_{node}
+{}
+
+JsonVisitor::JsonVisitor(const JsonVisitor& other)            = default;
+JsonVisitor& JsonVisitor::operator=(const JsonVisitor& other) = default;
+
+void JsonVisitor::visit(const Binary& binary) {
+  JsonVisitor header_visitor;
+  header_visitor(binary.get_header());
+  std::vector<json> sections_json, symbols_json;
+
+  for (const Section& section : const_cast<Binary*>(&binary)->get_sections()) {
+    JsonVisitor section_visitor;
+    section_visitor(section);
+    sections_json.emplace_back(section_visitor.get());
+  }
+
+
+  for (const Symbol& symbol : const_cast<Binary*>(&binary)->get_symbols()) {
+    JsonVisitor visitor;
+    visitor(symbol);
+    symbols_json.emplace_back(visitor.get());
+  }
+
+
+  this->node_["name"]               = binary.name();
+  this->node_["entrypoint"]         = binary.entrypoint();
+  this->node_["original_size"]      = binary.original_size();
+  this->node_["exported_functions"] = binary.get_exported_functions();
+  this->node_["imported_libraries"] = binary.get_imported_libraries();
+  this->node_["imported_functions"] = binary.get_imported_functions();
+  this->node_["header"]             = header_visitor.get();
+  this->node_["sections"]           = sections_json;
+  this->node_["symbols"]            = symbols_json;
+}
+
+
+void JsonVisitor::visit(const Header& header) {
+  this->node_["architecture"] = to_string(header.architecture());
+  this->node_["object_type"]  = to_string(header.object_type());
+}
+
+
+void JsonVisitor::visit(const Section& section) {
+  this->node_["name"]            = section.name();
+  this->node_["size"]            = section.size();
+  this->node_["offset"]          = section.offset();
+  this->node_["virtual_address"] = section.virtual_address();
+}
+
+
+void JsonVisitor::visit(const Symbol& symbol) {
+  this->node_["name"] = symbol.name();
+}
+
+
+const json& JsonVisitor::get(void) const {
+  return this->node_;
+}
+
+}
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
new file mode 100644
index 0000000..9bc7bc3
--- /dev/null
+++ b/tests/CMakeLists.txt
@@ -0,0 +1,285 @@
+# Tests options
+# =============
+option(LIEF_FUZZING "Fuzz LIEF" OFF)
+
+if (NOT LIEF_ELF OR NOT LIEF_PE OR NOT LIEF_MACHO)
+  message(FATAL_ERROR "Tests require all LIEF's modules activated" )
+endif()
+
+set(LIEF_EXAMPLES_DIRECTORY  ${PROJECT_SOURCE_DIR}/examples)
+set(LIEF_EXAMPLES_BINARY_DIR ${PROJECT_BINARY_DIR}/examples)
+set(LIEF_SAMPLES_DIRECTORY   ${CMAKE_CURRENT_SOURCE_DIR}/samples)
+
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.yaml.in
+  "${CMAKE_CURRENT_BINARY_DIR}/config.yaml" @ONLY)
+
+add_definitions(-DPATH_TO_CONFIG="${CMAKE_CURRENT_BINARY_DIR}")
+add_definitions(-DPATH_TO_SAMPLES="${LIEF_SAMPLES_DIRECTORY}")
+
+find_package(Git REQUIRED)
+
+# YAML CPP
+# ========
+set(YAMLCPP_PREFIX      "${CMAKE_CURRENT_BINARY_DIR}/YAMLCPP")
+set(YAMLCPP_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/YAMLCPP")
+
+set(
+  YAMLCPP_CMAKE_ARGS
+  -DCMAKE_INSTALL_PREFIX=${YAMLCPP_INSTALL_DIR}
+  -DCMAKE_BUILD_TYPE=Release
+  -DYAML_CPP_BUILD_TOOLS=off
+  -DYAML_CPP_BUILD_CONTRIB=off
+  )
+
+if(LIEF_FORCE32)
+  set(YAMLCPP_CMAKE_ARGS ${YAMLCPP_CMAKE_ARGS}
+    -DCMAKE_CXX_FLAGS="${CMAKE_CXX_FLAGS} -m32"
+    -DCMAKE_C_FLAGS="${CMAKE_C_FLAGS} -m32")
+endif()
+
+
+if (WIN32)
+set(CXX_FLAGS "/MT /EHsc")
+  set(YAMLCPP_CMAKE_ARGS ${YAMLCPP_CMAKE_ARGS} -DCMAKE_CXX_FLAGS=${CXX_FLAGS} )
+endif()
+
+set(YAMLCPP_GIT_URL "https://github.com/jbeder/yaml-cpp.git" CACHE STRING "URL to the YAMLCPP repo")
+
+ExternalProject_Add(YAMLCPP
+  PREFIX         ${YAMLCPP_PREFIX}
+  GIT_REPOSITORY ${YAMLCPP_GIT_URL}
+  UPDATE_COMMAND ${GIT_EXECUTABLE} pull
+  INSTALL_DIR    ${YAMLCPP_INSTALL_DIR}
+  CMAKE_ARGS     ${YAMLCPP_CMAKE_ARGS}
+  LOG_DOWNLOAD ON
+  )
+
+set(YAMLCPP_INCLUDE_DIRS "${YAMLCPP_INSTALL_DIR}/include")
+if(WIN32)
+  set(YAMLCPP_LIBRARY_RELEASE "${YAMLCPP_INSTALL_DIR}/lib/libyaml-cppmd${CMAKE_STATIC_LIBRARY_SUFFIX}")
+else()
+  set(YAMLCPP_LIBRARY_RELEASE "${YAMLCPP_INSTALL_DIR}/lib/libyaml-cpp${CMAKE_STATIC_LIBRARY_SUFFIX}")
+endif()
+
+# Catch
+# =====
+
+set(CATCH_PREFIX  ${CMAKE_CURRENT_BINARY_DIR}/catch)
+set(CATCH_GIT_URL https://github.com/philsquared/Catch.git CACHE STRING "URL to the Catch repo")
+
+ExternalProject_Add(catch
+    PREFIX         ${CATCH_PREFIX}
+    GIT_REPOSITORY ${CATCH_GIT_URL}
+    TIMEOUT 10
+    UPDATE_COMMAND ${GIT_EXECUTABLE} pull
+    CONFIGURE_COMMAND ""
+    BUILD_COMMAND ""
+    INSTALL_COMMAND ""
+    LOG_DOWNLOAD ON
+)
+ExternalProject_Get_Property(catch source_dir)
+set(CATCH_INCLUDE_DIR ${source_dir}/include CACHE INTERNAL "Path to include folder for Catch")
+
+
+# Dirent
+# ======
+set(DIRENT_INCLUDE_DIR "")
+if (WIN32)
+  set(DIRENT_PREFIX  ${CMAKE_CURRENT_BINARY_DIR}/dirent)
+  set(DIRENT_GIT_URL https://github.com/tronkko/dirent.git CACHE STRING "URL to the dirent repo")
+
+  ExternalProject_Add(dirent
+      PREFIX         ${DIRENT_PREFIX}
+      GIT_REPOSITORY ${DIRENT_GIT_URL}
+      TIMEOUT 10
+      UPDATE_COMMAND ${GIT_EXECUTABLE} pull
+      CONFIGURE_COMMAND ""
+      BUILD_COMMAND ""
+      INSTALL_COMMAND ""
+      LOG_DOWNLOAD ON
+  )
+
+  ExternalProject_Get_Property(dirent source_dir)
+  set(DIRENT_INCLUDE_DIR ${source_dir}/include CACHE INTERNAL "Path to include folder for dirent")
+endif()
+
+
+
+
+# Code covergage
+# ==============
+if(LIEF_COVERAGE)
+  find_program(GCOV_PATH gcov)
+  find_program(LCOV_PATH lcov)
+  find_program(GENHTML_PATH genhtml)
+  find_program(GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/tests)
+
+  set(output_name "lief_coverage")
+	set(coverage_info "${CMAKE_BINARY_DIR}/${output_name}.info")
+	set(coverage_cleaned "${coverage_info}.cleaned")
+
+  add_custom_target(lief_coverage
+
+		# Cleanup lcov
+		${LCOV_PATH} --zerocounters --directory .
+
+		# Run tests
+    COMMAND make check-lief
+    #COMMAND ctest -R test_iterators
+
+		# Capturing lcov counters and generating report
+		COMMAND ${LCOV_PATH} --directory . --capture --output-file ${coverage_info}
+    COMMAND ${LCOV_PATH} --remove ${coverage_info} 'utf8/*' 'filesystem/*' 'libjson/*' 'tests/*' '/usr/*' 'pybind11/*' '*mbedtls*' rang_cpp_color/* easyloggingpp/* -output-file ${coverage_cleaned}
+		COMMAND ${GENHTML_PATH} -o ${output_name} ${coverage_cleaned}
+    #COMMAND ${CMAKE_COMMAND} -E remove ${coverage_info} ${coverage_cleaned}
+
+		WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+	)
+
+endif()
+
+
+# Fuzzing
+# =======
+if(UNIX AND NOT APPLE)
+  set(MELKOR_REPO "https://github.com/IOActive/Melkor_ELF_Fuzzer.git")
+
+  set(MELKOR_PREFIX      "${CMAKE_CURRENT_BINARY_DIR}/Melkor")
+  set(MELKOR_INSTALL_DIR "${CMAKE_CURRENT_BINARY_DIR}/Melkor")
+  ExternalProject_Add(MELKOR
+   PREFIX         ${MELKOR_PREFIX}
+   GIT_REPOSITORY ${MELKOR_REPO}
+   INSTALL_DIR    ${MELKOR_INSTALL_DIR}
+   UPDATE_COMMAND    ""
+   CONFIGURE_COMMAND ""
+   INSTALL_COMMAND   ""
+   BUILD_COMMAND     make clean && make
+   BUILD_IN_SOURCE   ON)
+
+  ExternalProject_get_property(MELKOR SOURCE_DIR)
+  set(MELKOR_BINARY ${SOURCE_DIR}/melkor)
+  message(STATUS "${MELKOR_BINARY}")
+endif()
+
+# Tests
+# =====
+add_executable(test_iterators ${CMAKE_CURRENT_SOURCE_DIR}/test_iterators.cpp)
+
+if (MSVC)
+  target_compile_options(test_iterators PUBLIC /FIiso646.h)
+  set_property(TARGET test_iterators PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
+endif()
+
+set_property(TARGET test_iterators PROPERTY CXX_STANDARD          11)
+set_property(TARGET test_iterators PROPERTY CXX_STANDARD_REQUIRED ON)
+
+target_include_directories(test_iterators PUBLIC
+  $<TARGET_PROPERTY:LIB_LIEF_STATIC,INCLUDE_DIRECTORIES>
+  ${CATCH_INCLUDE_DIR})
+
+if (LIEF_COVERAGE)
+  target_compile_options(test_iterators PRIVATE -g -O0 --coverage -fprofile-arcs -ftest-coverage)
+  target_link_libraries(test_iterators gcov)
+endif()
+
+add_dependencies(test_iterators catch LIB_LIEF_STATIC)
+
+target_link_libraries(test_iterators LIB_LIEF_STATIC)
+
+add_test(test_iterators ${CMAKE_CURRENT_BINARY_DIR}/test_iterators)
+
+# Python
+# ======
+if(WIN32)
+  configure_file(${CMAKE_CURRENT_SOURCE_DIR}/run_python_test.bat.in
+  "${CMAKE_CURRENT_BINARY_DIR}/run_python_test.bat" @ONLY)
+endif()
+
+macro(ADD_PYTHON_TEST name command)
+if(UNIX)
+	add_test(${name}
+      "bash"
+      "-c"
+      "PYTHONPATH=\"${PROJECT_BINARY_DIR}/api/python\" ${command} ${ARGN}")
+endif()
+
+if(WIN32)
+   add_test(${name}
+      "${PROJECT_BINARY_DIR}/tests/run_python_test.bat"
+	  "${command}"
+	  "${ARGN}")
+endif()
+endmacro()
+
+if (LIEF_PYTHON_API)
+  set(PYTHON_TESTS_ENABLED OFF)
+  get_target_property(PYTHON_VERSION pyLIEF PYTHON_VERSION)
+  if ((${PYTHON_VERSION} VERSION_GREATER "3") OR (${PYTHON_VERSION} VERSION_EQUAL "3"))
+
+    find_package(PythonInterp 3)
+    if (NOT PythonInterp_FOUND)
+      string(REPLACE "m" "" PYTHON_VERSION_CLEAN ${PYTHON_VERSION})
+      set(PYTHON_EXECUTABLE "/usr/bin/python${PYTHON_VERSION_CLEAN}")
+    endif()
+
+  else()
+    find_package(PythonInterp 2 REQUIRED)
+  endif()
+
+  message(STATUS "Python executable: ${PYTHON_EXECUTABLE}")
+
+  if (PYTHONINTERP_FOUND)
+    set(PYTHON_TESTS_ENABLED ON)
+  endif()
+
+  if (PYTHON_TESTS_ENABLED)
+
+    # nm
+    # --
+    ADD_PYTHON_TEST(EXAMPLE_PYTHON_nm_elf
+      ${PYTHON_EXECUTABLE}
+      "${LIEF_EXAMPLES_DIRECTORY}/python/nm.py \
+      ${LIEF_SAMPLES_DIRECTORY}/MachO/MachO64_x86-64_binary_ls.bin")
+
+    ADD_PYTHON_TEST(EXAMPLE_PYTHON_nm_pe
+      ${PYTHON_EXECUTABLE}
+      "${LIEF_EXAMPLES_DIRECTORY}/python/nm.py \
+      ${LIEF_SAMPLES_DIRECTORY}/PE/PE32_x86_binary_winhello-mingw.exe")
+
+    ADD_PYTHON_TEST(EXAMPLE_PYTHON_nm_macho
+      ${PYTHON_EXECUTABLE}
+      "${LIEF_EXAMPLES_DIRECTORY}/python/nm.py \
+      ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_ARM_binary_ls.bin")
+
+    # Abstract
+    # --------
+    ADD_PYTHON_TEST(EXAMPLE_PYTHON_abstract_reader_pe
+      ${PYTHON_EXECUTABLE}
+      "${LIEF_EXAMPLES_DIRECTORY}/python/abstract_reader.py \
+      ${LIEF_SAMPLES_DIRECTORY}/PE/PE32_x86_binary_cmd-upx.exe")
+
+    ADD_PYTHON_TEST(EXAMPLE_PYTHON_abstract_reader_elf
+      ${PYTHON_EXECUTABLE}
+      "${LIEF_EXAMPLES_DIRECTORY}/python/abstract_reader.py \
+      ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_ARM_binary_ls.bin")
+
+    ADD_PYTHON_TEST(EXAMPLE_PYTHON_abstract_reader_macho
+      ${PYTHON_EXECUTABLE}
+      "${LIEF_EXAMPLES_DIRECTORY}/python/abstract_reader.py \
+      ${LIEF_SAMPLES_DIRECTORY}/MachO/MachO64_x86-64_binary_id.bin")
+
+
+    ADD_PYTHON_TEST(EXAMPLE_PYTHON_abstract_json
+      ${PYTHON_EXECUTABLE}
+      "${LIEF_EXAMPLES_DIRECTORY}/python/abstract_json.py \
+      ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF64_x86-64_binary_ls.bin")
+  endif()
+
+
+endif()
+
+enable_testing()
+
+add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/elf)
+add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/pe)
+add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/macho)
diff --git a/tests/GenerateConfigELF.py b/tests/GenerateConfigELF.py
new file mode 100644
index 0000000..c27334a
--- /dev/null
+++ b/tests/GenerateConfigELF.py
@@ -0,0 +1,234 @@
+#!/usr/bin/env python2
+#-*- coding: utf-8 -*-
+
+# This file is used to generate config file for LIEF test
+# Basically it parse it parse the output of readelf
+
+import re
+import yaml
+import subprocess
+import sys
+import hashlib
+
+p = subprocess.Popen(["readelf", "-a", sys.argv[1]], stdout=subprocess.PIPE)
+(output, err) = p.communicate()
+
+data = output
+binary = dict()
+header = dict()
+
+#ELF64
+elf64_regex = {
+        "entrypoint"    : "Adresse du point d'entrée:\s+0x([0-9a-f]+)",
+        "sectionoffset" : "Début des en-têtes de section\s*:\s+([0-9]+)",
+        "offsetToPhdr"  : "Début des en-têtes de programme :\s+([0-9]+)",
+        "nbShdr"        : "Nombre d'en-têtes de section\s*:\s+([0-9]+)",
+        "nbPhdr"        : "Nombre d'en-tête du programme\s*:\s+([0-9]+)",
+
+        "sections"      : ur'\[\s*(\d+)\]\s?(\S+|\s*)\s+\S+\s+([0-9A-Fa-f]+)\s+([0-9A-Fa-f]+)\n\s+([0-9A-Fa-f]+)\s+([0-9A-Fa-f]+)',
+        "segments"      : ur'\s+(\w+)\s+0x([0-9A-Fa-f]+)\s+0x([0-9A-Fa-f]+)\s+0x([0-9A-Fa-f]+)\n\s+0x([0-9A-Fa-f]+)\s+0x([0-9A-Fa-f]+)',
+
+        "dynamicSymGlob": ur'^T(?:.*)\.dynsym.*\n((?:\s{2,}(?:.*)\n)+)',
+        "dynamicSymLoc" : ur'([0-9]+):\s+[0-9a-fA-F]+\s+[0-9]+\s+\S+\s+\S+\s+\S+\s+\S+\s?([^@\n]*)',
+
+        "staticSymGlob" : ur'^T(?:.*)\.symtab.*\n((?:.*\n)+)$\s',
+        "staticSymLoc"  : ur'([0-9]+):\s+[0-9a-fA-F]+\s+[0-9]+\s+\S+\s+\S+\s+\S+\s+\S+ (\S*)[@\n]+',
+
+        "dynRelocaGlob" : ur'^S(?:.*)\.rel[a]*\.dyn.*\n((?:.{2,}(?:.*)\n)+)',
+        "dynRelocaLoc"  : ur'^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+\S+\s+([0-9a-fA-F]+)\s*(?:\n|(?:\s+(\S+)))',
+
+        "pltRelocaGlob" : ur'^S(?:.*)\.rel[a]*\.plt.*\n((?:.{2,}(?:.*)\n)+)',
+        "pltRelocaLoc"  : ur'^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+\S+\s+([0-9a-fA-F]+)\s*(?:\n|(?:\s+(\S+)))'
+    }
+
+
+# ELF32
+elf64_regex = {
+        "entrypoint"    : "Adresse du point d'entrée:\s+0x([0-9a-f]+)",
+        "sectionoffset" : "Début des en-têtes de section\s*:\s+([0-9]+)",
+        "offsetToPhdr"  : "Début des en-têtes de programme :\s+([0-9]+)",
+        "nbShdr"        : "Nombre d'en-têtes de section\s*:\s+([0-9]+)",
+        "nbPhdr"        : "Nombre d'en-tête du programme\s*:\s+([0-9]+)",
+
+        "sections"      : ur'\s+\[\s*([0-9]+)\]\s?(\s|\S+)\s+\S+\s+([0-9A-Fa-f]+)\s+([0-9A-Fa-f]+)\s+([0-9A-Fa-f]+)\s+([0-9A-Fa-f]+)',
+        "segments"      : ur'\s+(\w+)\s+0x([0-9A-Fa-f]+)\s+0x([0-9A-Fa-f]+)\s0x([0-9A-Fa-f]+)\s0x([0-9A-Fa-f]+)\s0x([0-9A-Fa-f]+)',
+
+        "dynamicSymGlob": ur'^T(?:.*)\.dynsym.*\n((?:\s{2,}(?:.*)\n)+)',
+        "dynamicSymLoc" : ur'([0-9]+):\s+[0-9a-fA-F]+\s+[0-9]+\s+\S+\s+\S+\s+\S+\s+\S+\s?([^@\n]*)',
+
+        "staticSymGlob" : ur'^T(?:.*)\.symtab.*\n((?:.*\n)+)$\s',
+        "staticSymLoc"  : ur'([0-9]+):\s+[0-9a-fA-F]+\s+[0-9]+\s+\S+\s+\S+\s+\S+\s+\S+ (\S*)[@\n]+',
+
+        "dynRelocaGlob" : ur'^S(?:.*)\.rel[a]*\.dyn.*\n((?:.{2,}(?:.*)\n)+)',
+        "dynRelocaLoc"  : ur'^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+\S+\s+([0-9a-fA-F]+)\s*(?:\n|(?:\s+([^@\n]+)))',
+
+        "pltRelocaGlob" : ur'^S(?:.*)\.rel[a]*\.plt.*\n((?:.{2,}(?:.*)\n)+)',
+        "pltRelocaLoc"  : ur'^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+\S+\s+([0-9a-fA-F]+)\s*(?:\n|(?:\s+([^@\n]+)))'
+    }
+
+
+
+
+#
+# File info
+#
+binary["filename"] = str(sys.argv[1]).split("/")[-1]
+binary["hash"]     = hashlib.md5(sys.argv[1]).hexdigest()
+#path: "@CMAKE_CURRENT_SOURCE_DIR@/samples/ELF/x86-64/binaries/ls"
+
+#
+# header
+#
+entrypoint    = re.search(elf64_regex["entrypoint"], data).groups()[0]
+sectionoffset = re.search(elf64_regex["sectionoffset"], data).groups()[0]
+offsetToPhdr  = re.search(elf64_regex["offsetToPhdr"], data).groups()[0]
+nbShdr        = re.search(elf64_regex["nbShdr"], data).groups()[0]
+nbPhdr        = re.search(elf64_regex["nbPhdr"], data).groups()[0]
+header['entryPoint']   = int(entrypoint, 16)
+header['offsetToShdr'] = int(sectionoffset)
+header['offsetToPhdr'] = int(offsetToPhdr)
+header['nbShdr']       = int(nbShdr)
+header['nbPhdr']       = int(nbPhdr)
+
+#
+# Sections
+#
+section_regexp   = re.compile(elf64_regex["sections"], re.MULTILINE)
+sections_yaml = []
+sections = re.findall(section_regexp, data)
+for section in sections:
+    section_yaml = {
+            'nb'     : int(section[0]),
+            'name'   : '%s' % (section[1].strip()),
+            'address': int(section[2],16),
+            'offset' : int(section[3],16),
+            'size'   : int(section[4],16)
+            }
+
+    sections_yaml.append(section_yaml)
+
+#
+# Segments
+#
+segment_regexp  = re.compile(elf64_regex["segments"], re.MULTILINE)
+segments        = re.findall(segment_regexp, data)
+segments_yaml   = []
+for segment in segments:
+    segment_yaml = {
+            'offset'  : int(segment[1], 16),
+            'vAddress': int(segment[2], 16),
+            'pAddress': int(segment[3], 16),
+            'fSize'   : int(segment[4], 16),
+            'vSize'   : int(segment[5], 16)
+            }
+    segments_yaml.append(segment_yaml)
+
+#
+# Relocations
+#
+#relocations_regexp  = re.compile(ur'^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+(.\S+)\s+([0-9a-fA-F]+)\s+(.\S+)', re.MULTILINE)
+#relocations         = re.findall(relocations_regexp, data)
+#relocations_yaml    = []
+#for relocation in relocations:
+#    relocation_yaml = {
+#        'offset': int(relocation[0], 16),
+#        'info'  : int(relocation[1], 16),
+#        'name'  : relocation[4]
+#    }
+#    if relocation_yaml not in relocations_yaml:
+#        relocations_yaml.append(relocation_yaml);
+
+#
+# Dynamic symboles
+#
+extract_regexp = re.compile(elf64_regex["dynamicSymGlob"], re.MULTILINE)
+dynsyms_yaml   = []
+if len(re.findall(extract_regexp, data)) > 0:
+    extracted      = re.findall(extract_regexp, data)[0]
+    dynsyms_regexp = re.compile(elf64_regex["dynamicSymLoc"], re.MULTILINE)
+    dynsyms        = re.findall(dynsyms_regexp, extracted)
+    dynsyms_yaml   = []
+    for dynsym in dynsyms:
+        dynsym_yaml = {
+            'num' : int(dynsym[0]),
+            'name': dynsym[1]
+        }
+        dynsyms_yaml.append(dynsym_yaml)
+
+#
+# Static symbols
+#
+extract_regexp = re.compile(elf64_regex["staticSymGlob"], re.MULTILINE)
+staticsyms = []
+extracted = ""
+
+if len(re.findall(extract_regexp, data)) > 0:
+    extracted         = re.findall(extract_regexp, data)[0]
+    staticsyms_regexp = re.compile(elf64_regex["staticSymLoc"], re.MULTILINE)
+    staticsyms        = re.findall(staticsyms_regexp, extracted)
+
+staticsyms_yaml = []
+
+for staticsym in staticsyms:
+    staticsym_yaml = {
+        'num' : int(staticsym[0]),
+        'name': staticsym[1]
+    }
+    staticsyms_yaml.append(staticsym_yaml)
+
+
+#
+# Dynamic Relocations
+#
+extract_regexp       = re.compile(elf64_regex["dynRelocaGlob"], re.MULTILINE)
+relocations_dyn_yaml = []
+if len(re.findall(extract_regexp, data)) > 0:
+    extracted          = re.findall(extract_regexp, data)[0]
+    regexp             = re.compile(elf64_regex["dynRelocaLoc"], re.MULTILINE)
+    relocations        = re.findall(regexp, extracted)
+    relocations_dyn_yaml   = []
+    for reloc in relocations:
+        relocation_yaml = {
+            'offset' : int(reloc[0], 16),
+            'info'   : int(reloc[1], 16),
+            'value'  : int(reloc[2], 16),
+            'name'   : reloc[3]
+        }
+        relocations_dyn_yaml.append(relocation_yaml)
+
+#
+# .plt.got relocations
+#
+extract_regexp     = re.compile(elf64_regex["pltRelocaGlob"], re.MULTILINE)
+extracted          = re.findall(extract_regexp, data)[0]
+regexp             = re.compile(elf64_regex["pltRelocaLoc"], re.MULTILINE)
+relocations        = re.findall(regexp, extracted)
+relocations_plt_yaml   = []
+for reloc in relocations:
+    relocation_yaml = {
+        'offset' : int(reloc[0], 16),
+        'info'   : int(reloc[1], 16),
+        'value'  : int(reloc[2], 16),
+        'name'   : reloc[3]
+    }
+    relocations_plt_yaml.append(relocation_yaml)
+
+binary['Header']          = header
+binary['Sections']        = sections_yaml
+binary['Segments']        = segments_yaml
+#binary['Relocations']     = relocations_yaml
+if len(relocations_plt_yaml) > 0:
+    binary['PltGotReloc']     = relocations_plt_yaml
+
+if len(dynsyms_yaml) > 0:
+    binary['DynamicSymbols'] = dynsyms_yaml
+
+if len(relocations_dyn_yaml) > 0:
+    binary['DynamicReloc'] = relocations_dyn_yaml
+
+if len(staticsyms_yaml) > 0:
+    binary['StaticSymbols'] = staticsyms_yaml
+
+output = open(binary["filename"] + ".yaml", "w")
+yaml.dump(binary, stream=output)
+output.close()
diff --git a/tests/GenerateConfigELF32.py b/tests/GenerateConfigELF32.py
new file mode 100644
index 0000000..f7ad6db
--- /dev/null
+++ b/tests/GenerateConfigELF32.py
@@ -0,0 +1,180 @@
+#!/usr/bin/env python2
+#-*- coding: utf-8 -*-
+
+# This file is used to generate config file for LIEF test
+# Basically it parse it parse the output of readelf
+
+import re
+import yaml
+import subprocess
+import sys
+import hashlib
+
+p = subprocess.Popen(["readelf", "-a", sys.argv[1]], stdout=subprocess.PIPE)
+(output, err) = p.communicate()
+
+data = output
+binary = dict()
+header = dict()
+
+#
+# File info
+#
+binary["filename"] = str(sys.argv[1]).split("/")[-1]
+binary["hash"]     = hashlib.md5(sys.argv[1]).hexdigest()
+#path: "@CMAKE_CURRENT_SOURCE_DIR@/samples/ELF/x86-64/binaries/ls"
+
+#
+# header
+#
+entrypoint    = re.search("Adresse du point d'entrée:\s+0x([0-9a-f]+)", data).groups()[0]
+sectionoffset = re.search("Début des en-têtes de section\s*:\s+([0-9]+)", data).groups()[0]
+offsetToPhdr  = re.search("Début des en-têtes de programme :\s+([0-9]+)", data).groups()[0]
+nbShdr        = re.search("Nombre d'en-têtes de section\s*:\s+([0-9]+)", data).groups()[0]
+nbPhdr        = re.search("Nombre d'en-tête du programme\s*:\s+([0-9]+)", data).groups()[0]
+header['entryPoint']   = int(entrypoint, 16)
+header['offsetToShdr'] = int(sectionoffset)
+header['offsetToPhdr'] = int(offsetToPhdr)
+header['nbShdr']       = int(nbShdr)
+header['nbPhdr']       = int(nbPhdr)
+
+#
+# Sections
+#
+section_regexp   = re.compile(ur'\[\s*(\d+)\]\s?(\S+|\s*)\s+\S+\s+([0-9A-Fa-f]+)\s+([0-9A-Fa-f]+)\n\s+([0-9A-Fa-f]+)\s+([0-9A-Fa-f]+)', re.MULTILINE)
+sections_yaml = []
+sections = re.findall(section_regexp, data)
+for section in sections:
+    section_yaml = {
+            'nb'     : int(section[0]),
+            'name'   : '%s' % (section[1].strip()),
+            'address': int(section[2],16),
+            'offset' : int(section[3],16),
+            'size'   : int(section[4],16)
+            }
+
+    sections_yaml.append(section_yaml)
+
+#
+# Segments
+#
+segment_regexp  = re.compile(ur'\s+(\w+)\s+0x([0-9A-Fa-f]+)\s+0x([0-9A-Fa-f]+)\s+0x([0-9A-Fa-f]+)\n\s+0x([0-9A-Fa-f]+)\s+0x([0-9A-Fa-f]+)', re.MULTILINE)
+segments        = re.findall(segment_regexp, data)
+segments_yaml   = []
+for segment in segments:
+    segment_yaml = {
+            'offset'  : int(segment[1], 16),
+            'vAddress': int(segment[2], 16),
+            'pAddress': int(segment[3], 16),
+            'fSize'   : int(segment[4], 16),
+            'vSize'   : int(segment[5], 16)
+            }
+    segments_yaml.append(segment_yaml)
+
+#
+# Relocations
+#
+#relocations_regexp  = re.compile(ur'^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+(.\S+)\s+([0-9a-fA-F]+)\s+(.\S+)', re.MULTILINE)
+#relocations         = re.findall(relocations_regexp, data)
+#relocations_yaml    = []
+#for relocation in relocations:
+#    relocation_yaml = {
+#        'offset': int(relocation[0], 16),
+#        'info'  : int(relocation[1], 16),
+#        'name'  : relocation[4]
+#    }
+#    if relocation_yaml not in relocations_yaml:
+#        relocations_yaml.append(relocation_yaml);
+
+#
+# Dynamic symboles
+#
+extract_regexp = re.compile(ur'^T(?:.*)\.dynsym.*\n((?:\s{2,}(?:.*)\n)+)', re.MULTILINE)
+dynsyms_yaml   = []
+if len(re.findall(extract_regexp, data)) > 0:
+    extracted      = re.findall(extract_regexp, data)[0]
+    dynsyms_regexp = re.compile(ur'([0-9]+):\s+[0-9a-fA-F]+\s+[0-9]+\s+\S+\s+\S+\s+\S+\s+\S+\s?([^@\n]*)', re.MULTILINE)
+    dynsyms        = re.findall(dynsyms_regexp, extracted)
+    dynsyms_yaml   = []
+    for dynsym in dynsyms:
+        dynsym_yaml = {
+            'num' : int(dynsym[0]),
+            'name': dynsym[1]
+        }
+        dynsyms_yaml.append(dynsym_yaml)
+
+#
+# Static symbols
+#
+extract_regexp = re.compile(ur'^T(?:.*)\.symtab.*\n((?:.*\n)+)$\s', re.MULTILINE)
+staticsyms = []
+extracted = ""
+if len(re.findall(extract_regexp, data)) > 0:
+    extracted      = re.findall(extract_regexp, data)[0]
+    staticsyms_regexp = re.compile(ur'([0-9]+):\s+[0-9a-fA-F]+\s+[0-9]+\s+\S+\s+\S+\s+\S+\s+\S+ (\S*)[@\n]+', re.MULTILINE)
+    staticsyms        = re.findall(staticsyms_regexp, extracted)
+staticsyms_yaml   = []
+
+for staticsym in staticsyms:
+    staticsym_yaml = {
+        'num' : int(staticsym[0]),
+        'name': staticsym[1]
+    }
+    staticsyms_yaml.append(staticsym_yaml)
+
+
+#
+# Dynamic Relocations
+#
+extract_regexp     = re.compile(ur'^S(?:.*)\.rel[a]*\.dyn.*\n((?:.{2,}(?:.*)\n)+)', re.MULTILINE)
+relocations_dyn_yaml = []
+if len(re.findall(extract_regexp, data)) > 0:
+    extracted          = re.findall(extract_regexp, data)[0]
+    regexp             = re.compile(ur'^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+\S+\s+([0-9a-fA-F]+)\s*(?:\n|(?:\s+(\S+)))', re.MULTILINE)
+    relocations        = re.findall(regexp, extracted)
+    relocations_dyn_yaml   = []
+    for reloc in relocations:
+        relocation_yaml = {
+            'offset' : int(reloc[0], 16),
+            'info'   : int(reloc[1], 16),
+            'value'  : int(reloc[2], 16),
+            'name'   : reloc[3]
+        }
+        relocations_dyn_yaml.append(relocation_yaml)
+
+#
+# .plt.got relocations
+#
+extract_regexp     = re.compile(ur'^S(?:.*)\.rel[a]*\.plt.*\n((?:.{2,}(?:.*)\n)+)', re.MULTILINE)
+extracted          = re.findall(extract_regexp, data)[0]
+regexp             = re.compile(ur'^([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+\S+\s+([0-9a-fA-F]+)\s*(?:\n|(?:\s+(\S+)))', re.MULTILINE)
+relocations        = re.findall(regexp, extracted)
+relocations_plt_yaml   = []
+for reloc in relocations:
+    relocation_yaml = {
+        'offset' : int(reloc[0], 16),
+        'info'   : int(reloc[1], 16),
+        'value'  : int(reloc[2], 16),
+        'name'   : reloc[3]
+    }
+    relocations_plt_yaml.append(relocation_yaml)
+
+binary['Header']          = header
+binary['Sections']        = sections_yaml
+binary['Segments']        = segments_yaml
+#binary['Relocations']     = relocations_yaml
+if len(relocations_plt_yaml) > 0:
+    binary['PltGotReloc']     = relocations_plt_yaml
+
+if len(dynsyms_yaml) > 0:
+    binary['DynamicSymbols'] = dynsyms_yaml
+
+if len(relocations_dyn_yaml) > 0:
+    binary['DynamicReloc'] = relocations_dyn_yaml
+
+if len(staticsyms_yaml) > 0:
+    binary['StaticSymbols'] = staticsyms_yaml
+
+output = open(binary["filename"] + ".yaml", "w")
+yaml.dump(binary, stream=output)
+output.close()
diff --git a/tests/GenerateConfigMachO.py b/tests/GenerateConfigMachO.py
new file mode 100644
index 0000000..8ac08c7
--- /dev/null
+++ b/tests/GenerateConfigMachO.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python2
+#-*- coding: utf-8 -*-
+
+# This file is used to generate config file for LIEF test
+# It uses `Macholib`(https://pypi.python.org/pypi/macholib/) to generate yaml config file
+
+import re
+import yaml
+import hashlib
+from macholib.MachO import MachO
+import sys
+
+
+macho   = MachO(sys.argv[1])
+# Not FAT for now
+assert(len(macho.headers) == 1)
+
+binary = dict()
+
+header = dict()
+
+m_header = macho.headers[0]
+header["magic"]      = m_header.MH_MAGIC
+header["cputype"]    = m_header.header.cputype
+header["cpusubtype"] = m_header.header.cpusubtype
+header["filetype"]   = m_header.header.filetype
+header["ncmds"]      = m_header.header.ncmds
+header["sizeofcmds"] = m_header.header.sizeofcmds
+header["flags"]      = m_header.header.flags
+header["reserved"]   = m_header.header.reserved
+
+binary["header"] = header
+
+for lc, cmd, data in m_header.commands:
+    print lc.get_cmd_name()
+    print cmd.describe()
+    print len(data)
+
+
+print header
diff --git a/tests/GenerateConfigPE.py b/tests/GenerateConfigPE.py
new file mode 100644
index 0000000..76a0a57
--- /dev/null
+++ b/tests/GenerateConfigPE.py
@@ -0,0 +1,188 @@
+#!/usr/bin/env python2
+#-*- coding: utf-8 -*-
+
+# This file is used to generate config file for LIEF test
+# It use `pefile`(https://github.com/erocarrera/pefile) to generate yaml config file
+
+import re
+import yaml
+import hashlib
+import pefile
+import sys
+import os
+import copy
+
+def generate_node_config(node):
+    node_y = dict()
+    node_y["childs"] = []
+    if type(node) == pefile.ResourceDirData:
+        node_y["type"] = 0
+        node_y["Characteristics"]      = node.struct.Characteristics
+        node_y["TimeDateStamp"]        = node.struct.TimeDateStamp
+        node_y["MajorVersion"]         = node.struct.MajorVersion
+        node_y["MinorVersion"]         = node.struct.MinorVersion
+        node_y["NumberOfNamedEntries"] = node.struct.NumberOfNamedEntries
+        node_y["NumberOfIdEntries"]    = node.struct.NumberOfIdEntries
+        for rsrc in node.entries:
+            node_y["childs"].append(generate_node_config(rsrc))
+
+    elif type(node) == pefile.ResourceDirEntryData:
+        node_y["type"]          = 1
+        node_y["Name"]          = str(node.name)
+        node_y["id"]            = node.id
+        node_y["OffsetToData"]  = node.struct.OffsetToData
+        if hasattr(node, "directory"):
+            node_y["childs"].append(generate_node_config(node.directory))
+        else:
+            node_y["childs"].append(generate_node_config(node.data))
+    elif type(node) == pefile.ResourceDataEntryData:
+        node_y["type"] = 2
+        node_y["OffsetToData"] = node.struct.OffsetToData
+        node_y["Size"]         = node.struct.Size
+        node_y["CodePage"]     = node.struct.CodePage
+        node_y["Reserved"]     = node.struct.Reserved
+        node_y["Reserved"]     = node.struct.Reserved
+        node_y["lang"]         = node.lang
+        node_y["sublang"]      = node.sublang
+    else:
+        print "Unknown type"
+        return
+
+    return node_y
+
+def generate_config(binary_path):
+    pe     = pefile.PE(binary_path)
+
+    binary = dict()
+
+    dos_header = dict()
+
+    dos_header["e_magic"]    = pe.DOS_HEADER.e_magic
+    dos_header["e_cblp"]     = pe.DOS_HEADER.e_cblp
+    dos_header["e_crlc"]     = pe.DOS_HEADER.e_crlc
+    dos_header["e_cparhdr"]  = pe.DOS_HEADER.e_cparhdr
+    dos_header["e_minalloc"] = pe.DOS_HEADER.e_minalloc
+    dos_header["e_maxalloc"] = pe.DOS_HEADER.e_maxalloc
+    dos_header["e_ss"]       = pe.DOS_HEADER.e_ss
+    dos_header["e_sp"]       = pe.DOS_HEADER.e_sp
+    dos_header["e_csum"]     = pe.DOS_HEADER.e_csum
+
+    header = dict()
+
+    header["Machine"]              = pe.FILE_HEADER.Machine
+    header["NumberOfSections"]     = pe.FILE_HEADER.NumberOfSections
+    header["TimeDateStamp"]        = pe.FILE_HEADER.TimeDateStamp
+    header["PointerToSymbolTable"] = pe.FILE_HEADER.PointerToSymbolTable
+    header["NumberOfSymbols"]      = pe.FILE_HEADER.NumberOfSymbols
+    header["SizeOfOptionalHeader"] = pe.FILE_HEADER.SizeOfOptionalHeader
+    header["Characteristics"]      = pe.FILE_HEADER.Characteristics
+
+    optional_header = dict()
+
+    optional_header["Magic"]                       = pe.OPTIONAL_HEADER.Magic
+    optional_header["MajorLinkerVersion"]          = pe.OPTIONAL_HEADER.MajorLinkerVersion
+    optional_header["MinorLinkerVersion"]          = pe.OPTIONAL_HEADER.MinorLinkerVersion
+    optional_header["SizeOfCode"]                  = pe.OPTIONAL_HEADER.SizeOfCode
+    optional_header["SizeOfInitializedData"]       = pe.OPTIONAL_HEADER.SizeOfInitializedData
+    optional_header["SizeOfUninitializedData"]     = pe.OPTIONAL_HEADER.SizeOfUninitializedData
+    optional_header["AddressOfEntryPoint"]         = pe.OPTIONAL_HEADER.AddressOfEntryPoint
+    optional_header["BaseOfCode"]                  = pe.OPTIONAL_HEADER.BaseOfCode
+    if pe.OPTIONAL_HEADER.Magic == pefile.OPTIONAL_HEADER_MAGIC_PE:
+        optional_header["BaseOfData"]                  = pe.OPTIONAL_HEADER.BaseOfData
+    optional_header["ImageBase"]                   = pe.OPTIONAL_HEADER.ImageBase
+    optional_header["SectionAlignment"]            = pe.OPTIONAL_HEADER.SectionAlignment
+    optional_header["FileAlignment"]               = pe.OPTIONAL_HEADER.FileAlignment
+    optional_header["MajorOperatingSystemVersion"] = pe.OPTIONAL_HEADER.MajorOperatingSystemVersion
+    optional_header["MinorOperatingSystemVersion"] = pe.OPTIONAL_HEADER.MinorOperatingSystemVersion
+    optional_header["MajorImageVersion"]           = pe.OPTIONAL_HEADER.MajorImageVersion
+    optional_header["MinorImageVersion"]           = pe.OPTIONAL_HEADER.MinorImageVersion
+    optional_header["MajorSubsystemVersion"]       = pe.OPTIONAL_HEADER.MajorSubsystemVersion
+    optional_header["MinorSubsystemVersion"]       = pe.OPTIONAL_HEADER.MinorSubsystemVersion
+    optional_header["Reserved1"]                   = pe.OPTIONAL_HEADER.Reserved1
+    optional_header["SizeOfImage"]                 = pe.OPTIONAL_HEADER.SizeOfImage
+    optional_header["SizeOfHeaders"]               = pe.OPTIONAL_HEADER.SizeOfHeaders
+    optional_header["CheckSum"]                    = pe.OPTIONAL_HEADER.CheckSum
+    optional_header["Subsystem"]                   = pe.OPTIONAL_HEADER.Subsystem
+    optional_header["DllCharacteristics"]          = pe.OPTIONAL_HEADER.DllCharacteristics
+    optional_header["SizeOfStackReserve"]          = pe.OPTIONAL_HEADER.SizeOfStackReserve
+    optional_header["SizeOfStackCommit"]           = pe.OPTIONAL_HEADER.SizeOfStackCommit
+    optional_header["SizeOfHeapReserve"]           = pe.OPTIONAL_HEADER.SizeOfHeapReserve
+    optional_header["SizeOfHeapCommit"]            = pe.OPTIONAL_HEADER.SizeOfHeapCommit
+    optional_header["LoaderFlags"]                 = pe.OPTIONAL_HEADER.LoaderFlags
+    optional_header["NumberOfRvaAndSizes"]         = pe.OPTIONAL_HEADER.NumberOfRvaAndSizes
+
+    sections = []
+    for section in pe.sections:
+        sec = dict()
+        sec["name"] = str(section.Name).replace("\0", "")
+        sec["Misc_VirtualSize"]     = section.Misc_VirtualSize
+        sec["VirtualAddress"]       = section.VirtualAddress
+        sec["SizeOfRawData"]        = section.SizeOfRawData
+        sec["PointerToRawData"]     = section.PointerToRawData
+        sec["PointerToRelocations"] = section.PointerToRelocations
+        sec["PointerToLinenumbers"] = section.PointerToLinenumbers
+        sec["NumberOfRelocations"]  = section.NumberOfRelocations
+        sec["NumberOfLinenumbers"]  = section.NumberOfLinenumbers
+        sec["Characteristics"]      = section.Characteristics
+        sections.append(sec)
+
+    imports = []
+    for entry in pe.DIRECTORY_ENTRY_IMPORT:
+        import_ = dict()
+        import_["name"]           = entry.dll
+        import_["TimeDateStamp"]  = entry.struct.TimeDateStamp
+        import_["ForwarderChain"] = entry.struct.ForwarderChain
+        entries = []
+        for imp in entry.imports:
+            impo = dict()
+            if not imp.import_by_ordinal:
+                impo["name"] = imp.name
+            else:
+                impo["name"] = None
+
+            entries.append(impo)
+        import_["entries"] = entries
+        imports.append(import_)
+
+    tls = dict()
+    if hasattr(pe, "DIRECTORY_ENTRY_TLS"):
+        tls["StartAddressOfRawData"] = pe.DIRECTORY_ENTRY_TLS.struct.StartAddressOfRawData
+        tls["EndAddressOfRawData"]   = pe.DIRECTORY_ENTRY_TLS.struct.EndAddressOfRawData
+        tls["AddressOfIndex"]        = pe.DIRECTORY_ENTRY_TLS.struct.AddressOfIndex
+        tls["AddressOfCallBacks"]    = pe.DIRECTORY_ENTRY_TLS.struct.AddressOfCallBacks
+        tls["SizeOfZeroFill"]        = pe.DIRECTORY_ENTRY_TLS.struct.SizeOfZeroFill
+        tls["Characteristics"]       = pe.DIRECTORY_ENTRY_TLS.struct.Characteristics
+
+    resources = dict()
+    if hasattr(pe, "DIRECTORY_ENTRY_RESOURCE"):
+        node = pe.DIRECTORY_ENTRY_RESOURCE
+        resources = generate_node_config(node)
+
+    binary["dos_header"]      = dos_header
+    binary["header"]          = header
+    binary["optional_header"] = optional_header
+    binary["sections"]        = sections
+    binary["imports"]         = imports
+    binary["tls"]             = tls
+    binary["resources"]       = resources
+
+    binary["filename"] = str(binary_path).split("/")[-1]
+    binary["hash"]     = hashlib.md5(binary_path).hexdigest()
+
+    output = open(binary_path + ".yaml", "w")
+    yaml.dump(binary, stream=output)
+    output.close()
+
+if __name__ == "__main__":
+    path_pe32_binaries = "./samples/PE/win32/"
+    path_pe64_binaries = "./samples/PE/win64/"
+
+    for binary in os.listdir(path_pe32_binaries):
+        if binary.endswith(".exe") or binary.endswith(".dll"):
+            print "[PE32] Dealing with:", binary
+            generate_config(path_pe32_binaries + binary)
+
+    for binary in os.listdir(path_pe64_binaries):
+        if binary.endswith(".exe") or binary.endswith(".dll"):
+            print "[PE64] Dealing with:", binary
+            generate_config(path_pe64_binaries + binary)
diff --git a/tests/config.yaml.in b/tests/config.yaml.in
new file mode 100644
index 0000000..a808a7f
--- /dev/null
+++ b/tests/config.yaml.in
@@ -0,0 +1,205 @@
+
+#
+# Tests ELF
+#
+
+# ELF64
+# =====
+"test_ls":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_ls.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_ls.bin"
+  arguments  : "--version"
+  regexp     : "ls (GNU coreutils)"
+
+"test_ld":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_ld.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_ld.bin"
+  arguments  : "--version"
+  regexp     : "ld (GNU coreutils)"
+
+"test_gcc":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_gcc.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_gcc.bin"
+  arguments  : "--version"
+  regexp     : "(GCC)"
+
+"test_hello_c":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_hello-c.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_hello-c.bin"
+  regexp     : "Hello from"
+
+"test_hello_cpp":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_hello-cpp.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_hello-cpp.bin"
+  regexp     : "Hello from"
+
+"test_nm":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_nm.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_nm.bin"
+  arguments  : "--version"
+  regexp     : "GNU nm (GNU Binutils)"
+
+"test_openssl":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_openssl.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_binary_openssl.bin"
+  arguments  : "version"
+  regexp     : "OpenSSL"
+
+
+#"test_static_binary":
+#  format: ELF
+#  type: binary
+#  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/x86-64/binaries/static_binary.yaml"
+#  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/x86-64/binaries/static_binary"
+
+"test_libadd":
+  format: ELF
+  type: library
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_library_libadd.so.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_library_libadd.so"
+
+"test_libtriton":
+  format: ELF
+  type: library
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_library_libtriton.so.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_library_libtriton.so"
+
+"test_libm-2.22":
+  format: ELF
+  type: library
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_library_libm-2.22.so.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF64_x86-64_library_libm-2.22.so"
+
+
+# ELF32
+# =====
+"test_ls_32":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF32_x86_binary_ls.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF32_x86_binary_ls.bin"
+  arguments  : "--version"
+  regexp     : "ls (GNU coreutils)"
+
+"test_gcc_32":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF32_x86_binary_gcc.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF32_x86_binary_gcc.bin"
+  arguments  : "--version"
+  regexp     : "(GCC)"
+
+# TODO: Fail
+#"test_cmake_32":
+#  format: ELF
+#  type: binary
+#  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/x86-32/binaries/cmake.yaml"
+#  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/x86-32/binaries/cmake"
+
+# Very slow     
+#"test_clang-3.7_32":
+#  format: ELF
+#  type: binary
+#  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/x86-32/binaries/clang-3.7.yaml"
+#  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/x86-32/binaries/clang-3.7"
+
+"test_bzip2_32":
+  format: ELF
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF32_x86_binary_bzip2.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/ELF/ELF32_x86_binary_bzip2.bin"
+  arguments  : "--version"
+  regexp     : "bzip2, a block-sorting file compressor."
+
+#
+# Tests PE
+#
+
+## PE32 ##
+"test_cmd_x86":
+  format: PE
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_binary_cmd.exe.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_binary_cmd.exe"
+
+"test_winhello_mingw_x86":
+  format: PE
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_binary_winhello-mingw.exe.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_binary_winhello-mingw.exe"
+
+"test_regedit_x86":
+  format: PE
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_binary_regedit.exe.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_binary_regedit.exe"
+
+
+"test_msvcrt_x86":
+  format: PE
+  type: library
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_library_msvcrt.dll.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_library_msvcrt.dll"
+
+
+"test_kernel32_x86":
+  format: PE
+  type: library
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_library_kernel32.dll.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE32_x86_library_kernel32.dll"
+
+
+## PE64 ##
+"test_cmd_x64":
+  format: PE
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_cmd.exe.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_cmd.exe"
+
+"test_notepad_x64":
+  format: PE
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_notepad.exe.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_notepad.exe"
+
+"test_wordpad_x64":
+  format: PE
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_wordpad.exe.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_wordpad.exe"
+
+"test_winhello64_mingw_x64":
+  format: PE
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_winhello64-mingw.exe.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_winhello64-mingw.exe"
+
+"test_KernelBase_x64":
+  format: PE
+  type: library
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_library_KernelBase.dll.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_library_KernelBase.dll"
+
+"test_MFC_Application_x64":
+  format: PE
+  type: binary
+  config_file: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_mfc-application.exe.yaml"
+  binary_path: "@LIEF_SAMPLES_DIRECTORY@/PE/PE64_x86-64_binary_mfc-application.exe"
+
+#
+# Tests MachO
+#
diff --git a/tests/elf/CMakeLists.txt b/tests/elf/CMakeLists.txt
new file mode 100644
index 0000000..cefbb2c
--- /dev/null
+++ b/tests/elf/CMakeLists.txt
@@ -0,0 +1,225 @@
+cmake_minimum_required(VERSION 3.1)
+include(ExternalProject)
+
+macro(ADD_ELF_TEST name sources)
+
+  add_executable(${name}        ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/utils.cpp)
+  add_executable(${name}_shared ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/utils.cpp)
+
+  set_property(TARGET ${name} ${name}_shared PROPERTY INCLUDE_DIRECTORIES "")
+
+  if (MSVC)
+    target_compile_options(${name}        PUBLIC /FIiso646.h)
+    target_compile_options(${name}_shared PUBLIC /FIiso646.h)
+
+	  target_compile_options(${name}_shared PUBLIC /MT)
+	  set_property(TARGET ${name} ${name}_shared PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
+  endif()
+
+  set_property(TARGET ${name} PROPERTY CXX_STANDARD          11)
+  set_property(TARGET ${name} PROPERTY CXX_STANDARD_REQUIRED ON)
+
+  set_property(TARGET ${name}_shared PROPERTY CXX_STANDARD          11)
+  set_property(TARGET ${name}_shared PROPERTY CXX_STANDARD_REQUIRED ON)
+
+
+  target_include_directories(${name} PUBLIC
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${YAMLCPP_INCLUDE_DIRS}
+    ${DIRENT_INCLUDE_DIR}
+    ${CATCH_INCLUDE_DIR})
+
+  target_include_directories(${name}_shared PUBLIC
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${YAMLCPP_INCLUDE_DIRS}
+    ${DIRENT_INCLUDE_DIR}
+    ${CATCH_INCLUDE_DIR})
+
+  add_dependencies(${name}        catch YAMLCPP)
+  add_dependencies(${name}_shared catch YAMLCPP)
+
+  if (WIN32)
+    add_dependencies(${name}        dirent)
+    add_dependencies(${name}_shared dirent)
+  endif()
+
+  target_link_libraries(${name}        PUBLIC LIB_LIEF_STATIC ${YAMLCPP_LIBRARY_RELEASE})
+  target_link_libraries(${name}_shared PUBLIC LIB_LIEF_SHARED ${YAMLCPP_LIBRARY_RELEASE})
+
+  add_test(${name}         ${CMAKE_CURRENT_BINARY_DIR}/${name})
+  add_test(${name}_shared  ${CMAKE_CURRENT_BINARY_DIR}/${name}_shared)
+
+endmacro()
+
+
+# Targets
+# =======
+
+set(test_parser_sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/test_parser.cpp)
+
+set(test_equality_sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/test_equality.cpp)
+
+set(test_builder_sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/test_builder.cpp)
+
+set(test_modifier_sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/test_modifier.cpp)
+
+
+ADD_ELF_TEST(elf_test_parser   ${test_parser_sources})
+ADD_ELF_TEST(elf_test_equality ${test_equality_sources})
+ADD_ELF_TEST(elf_test_builder  ${test_builder_sources})
+ADD_ELF_TEST(elf_test_modifier ${test_modifier_sources})
+
+# Examples tests
+# ==============
+if (LIEF_EXAMPLES)
+  file(GLOB_RECURSE SAMPLES_ELF
+    "${LIEF_SAMPLES_DIRECTORY}/ELF/*.bin"
+    "${LIEF_SAMPLES_DIRECTORY}/ELF/*.so"
+  )
+
+  list(REMOVE_ITEM SAMPLES_ELF
+    "${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_x86_binary_tiny.bin"
+    "${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_x86_binary_tiny01.bin"
+    "${LIEF_SAMPLES_DIRECTORY}/ELF/ELF64_x86-64_binary_tiny-hello.bin"
+    "${LIEF_SAMPLES_DIRECTORY}/ELF/ELF64_x86-64_binary_tiny.bin")
+
+
+  foreach(ELF_PATH ${SAMPLES_ELF})
+    get_filename_component(ELF_NAME ${ELF_PATH} NAME)
+
+    if (LIEF_C_API)
+      add_test(
+        NAME EXAMPLES_C_elf_reader_${ELF_NAME}
+        COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/c/elf_reader
+        ${ELF_PATH})
+    endif()
+
+    # ELF Reader
+    add_test(
+      NAME EXAMPLES_CPP_elf_reader_${ELF_NAME}
+      COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/cpp/elf_reader
+      ${ELF_PATH})
+
+    # ELF Strip
+    add_test(
+      NAME EXAMPLES_CPP_elf_strip_${ELF_NAME}
+      COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/cpp/elf_strip
+      ${ELF_PATH}
+      ${CMAKE_CURRENT_BINARY_DIR}/${ELF_NAME}.strip)
+
+    # Abstract Reader
+    add_test(
+      NAME EXAMPLES_CPP_abstract_reader_${ELF_NAME}
+      COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/cpp/abstract_reader
+      ${ELF_PATH})
+
+    # Add section
+    if(${ELF_NAME} MATCHES "(.*)_binary_(.*)")
+      if (NOT ${ELF_NAME} MATCHES "ELF64_x86-64_binary_systemd-resolve.bin") # TODO
+      add_test(
+        NAME EXAMPLES_CPP_add_section_${ELF_NAME}
+        COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/cpp/elf_add_section
+        ${ELF_PATH}
+        ${CMAKE_CURRENT_BINARY_DIR}/${ELF_NAME}.section)
+      endif()
+    endif()
+
+    # Elf Symbol
+    add_test(
+      NAME EXAMPLES_CPP_elf_symbols_${ELF_NAME}
+      COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/cpp/elf_symbols
+      ${ELF_PATH})
+
+  endforeach()
+endif()
+
+# Python tests
+# ============
+if (PYTHON_TESTS_ENABLED)
+
+  # Fuzzer
+  # ------
+  if (UNIX AND NOT APPLE)
+    configure_file("${CMAKE_CURRENT_SOURCE_DIR}/fuzzing.py.in" "${CMAKE_CURRENT_BINARY_DIR}/fuzzing.py")
+    ADD_PYTHON_TEST(FUZZER_ELF_bin_ls_x86
+        ${PYTHON_EXECUTABLE}
+        "${CMAKE_CURRENT_BINARY_DIR}/fuzzing.py \
+        --input-seed=${LIEF_SAMPLES_DIRECTORY}/ELF/ELF64_x86-64_binary_ls.bin -n 100")
+
+
+    ADD_PYTHON_TEST(FUZZER_ELF_bin_ls_arm
+        ${PYTHON_EXECUTABLE}
+        "${CMAKE_CURRENT_BINARY_DIR}/fuzzing.py \
+        --input-seed=${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_ARM_binary_ls.bin -n 100")
+
+
+    ADD_PYTHON_TEST(FUZZER_ELF_bin_nm_x86
+        ${PYTHON_EXECUTABLE}
+        "${CMAKE_CURRENT_BINARY_DIR}/fuzzing.py \
+        --input-seed=${LIEF_SAMPLES_DIRECTORY}/ELF/ELF64_x86-64_binary_nm.bin -n 100")
+  endif()
+
+  # Unit tests
+  # ----------
+  ADD_PYTHON_TEST(UNITTEST_PYTHON_elf
+    ${PYTHON_EXECUTABLE}
+    "${CMAKE_CURRENT_SOURCE_DIR}/elf_test.py")
+
+
+  ADD_PYTHON_TEST(ELF_PYTHON_add_section
+    ${PYTHON_EXECUTABLE}
+    "${CMAKE_CURRENT_SOURCE_DIR}/add_section.py")
+
+  ADD_PYTHON_TEST(ELF_PYTHON_add_segment
+    ${PYTHON_EXECUTABLE}
+    "${CMAKE_CURRENT_SOURCE_DIR}/add_segment.py")
+
+
+  ADD_PYTHON_TEST(ELF_PYTHON_add_content
+    ${PYTHON_EXECUTABLE}
+    "${CMAKE_CURRENT_SOURCE_DIR}/add_content.py")
+
+
+  ADD_PYTHON_TEST(ELF_PYTHON_hash_test
+    ${PYTHON_EXECUTABLE}
+    "${CMAKE_CURRENT_SOURCE_DIR}/hash_tests.py")
+
+  # Examples
+  # --------
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_elf_reader_ls
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/elf_reader.py --all \
+    ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_x86_binary_ls.bin")
+
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_elf_reader_arm
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/elf_reader.py --all \
+    ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_ARM_binary_ls.bin")
+
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_elf_remove_sections_table
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/elf_remove_section_table.py \
+    ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_x86_binary_ls.bin \
+    ${CMAKE_CURRENT_BINARY_DIR}/ls_without_sections")
+
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_elf_symbol_obfuscation
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/elf_symbol_obfuscation.py \
+    ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF32_x86_binary_ls.bin \
+    ${CMAKE_CURRENT_BINARY_DIR}/ls_symbol_obfuscated")
+
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_elf_unstrip
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/elf_unstrip.py \
+    ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF64_x86-64_binary_ls.bin \
+    ${CMAKE_CURRENT_BINARY_DIR}/ls_unstriped")
+
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_elf_json
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/elf_json.py \
+    ${LIEF_SAMPLES_DIRECTORY}/ELF/ELF64_x86-64_binary_ls.bin")
+endif()
diff --git a/tests/elf/add_content.py b/tests/elf/add_content.py
new file mode 100644
index 0000000..ab1d71c
--- /dev/null
+++ b/tests/elf/add_content.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python
+import unittest
+import logging
+import os
+import sys
+import stat
+import re
+import subprocess
+import tempfile
+import shutil
+from subprocess import Popen
+
+import lief
+from lief.ELF import Section
+
+from unittest import TestCase
+from utils import get_sample
+
+CURRENT_DIRECTORY = os.path.dirname(os.path.abspath(__file__))
+STUB = lief.parse(os.path.join(CURRENT_DIRECTORY, "hello_lief.bin"))
+
+LIBADD_C = """\
+#include <stdlib.h>
+#include <stdio.h>
+
+int add(int a, int b);
+
+int add(int a, int b) {
+  printf("%d + %d = %d\\n", a, b, a+b);
+  return a + b;
+}
+"""
+
+BINADD_C = """\
+#include <stdio.h>
+#include <stdlib.h>
+
+int add(int a, int b);
+
+int main(int argc, char **argv) {
+  if (argc != 3) {
+    printf("Usage: %s <a> <b>\\n", argv[0]);
+    exit(-1);
+  }
+
+  int res = add(atoi(argv[1]), atoi(argv[2]));
+  printf("From myLIb, a + b = %d\\n", res);
+  return 0;
+}
+"""
+
+
+class TestAddContent(TestCase):
+    def setUp(self):
+        self.logger = logging.getLogger(__name__)
+        self.tmp_dir = tempfile.mkdtemp(suffix='_lief_test_content')
+        self.logger.debug("temp dir: {}".format(self.tmp_dir))
+
+        self.binadd_path = os.path.join(self.tmp_dir, "binadd.c")
+        self.libadd_path = os.path.join(self.tmp_dir, "libadd.c")
+
+        self.libadd_so  = os.path.join(self.tmp_dir, "libadd.so")
+        self.binadd_bin = os.path.join(self.tmp_dir, "binadd.bin")
+
+        # self.compiler = shutil.which(os.environ.get('CC', 'cc')) # only for Python > 3
+        self.compiler = '/usr/bin/cc'
+        if self.compiler is None:
+            self.logger.error("Unable to find a compiler")
+            sys.exit(0)
+
+        self.logger.debug("Compiler: {}".format(self.compiler))
+
+        with open(self.binadd_path, 'w') as f:
+            f.write(BINADD_C)
+
+        with open(self.libadd_path, 'w') as f:
+            f.write(LIBADD_C)
+
+    def compile_libadd(self, input, extra_flags=[]):
+        if os.path.isfile(self.libadd_so):
+            os.remove(self.libadd_so)
+        CC_FLAGS = ['-fPIC', '-shared'] + extra_flags
+        cmd = [self.compiler, '-o', self.libadd_so] + CC_FLAGS + [input]
+        self.logger.debug("Compile 'libadd' with: {}".format(" ".join(cmd)))
+        p = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout)
+
+
+    def compile_binadd(self, input, extra_flags=[]):
+        if os.path.isfile(self.binadd_bin):
+            os.remove(self.binadd_bin)
+
+        CC_FLAGS = ['-L', self.tmp_dir] + extra_flags
+        cmd = [self.compiler, '-o', self.binadd_bin] + CC_FLAGS + [input, '-ladd']
+        self.logger.debug("Compile 'binadd' with: {}".format(" ".join(cmd)))
+        p = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout)
+
+
+    @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
+    def test_simple(self):
+        self.compile_libadd(self.libadd_path)
+        self.compile_binadd(self.binadd_path)
+
+        libadd = lief.parse(self.libadd_so)
+        offset, size = libadd.insert_content(STUB.segments[0].data)
+
+        dt_init = list(filter(lambda e : e.tag == lief.ELF.DYNAMIC_TAGS.INIT, libadd.dynamic_entries))[0]
+        dt_init.value = offset + STUB.header.entrypoint
+        libadd.write(self.libadd_so)
+
+        st = os.stat(self.libadd_so)
+        os.chmod(self.libadd_so, st.st_mode | stat.S_IEXEC)
+
+        p = Popen([self.binadd_bin, '1', '2'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env={"LD_LIBRARY_PATH": self.tmp_dir})
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout.decode("utf8"))
+
+        self.assertIsNotNone(re.search(r'LIEF is Working', stdout.decode("utf8")))
+
+    def tearDown(self):
+        # Delete it
+        if os.path.isdir(self.tmp_dir):
+            shutil.rmtree(self.tmp_dir)
+
+if __name__ == '__main__':
+
+    root_logger = logging.getLogger()
+    root_logger.setLevel(logging.DEBUG)
+
+    ch = logging.StreamHandler()
+    ch.setLevel(logging.DEBUG)
+    root_logger.addHandler(ch)
+
+    unittest.main(verbosity=2)
+
diff --git a/tests/elf/add_section.py b/tests/elf/add_section.py
new file mode 100644
index 0000000..4704a37
--- /dev/null
+++ b/tests/elf/add_section.py
@@ -0,0 +1,96 @@
+#!/usr/bin/env python
+import unittest
+import logging
+import os
+import sys
+import stat
+import re
+import subprocess
+import tempfile
+import shutil
+from subprocess import Popen
+
+import lief
+from lief.ELF import Section
+
+from unittest import TestCase
+from utils import get_sample
+
+CURRENT_DIRECTORY = os.path.dirname(os.path.abspath(__file__))
+STUB = lief.parse(os.path.join(CURRENT_DIRECTORY, "hello_lief.bin"))
+
+class TestAddSection(TestCase):
+    def setUp(self):
+        self.logger = logging.getLogger(__name__)
+        self.tmp_dir = tempfile.mkdtemp(suffix='_lief_test_section')
+        self.logger.debug("temp dir: {}".format(self.tmp_dir))
+
+
+    @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
+    def test_simple(self):
+        sample_path = get_sample('ELF/ELF64_x86-64_binary_ls.bin')
+        output      = os.path.join(self.tmp_dir, "ls.section")
+
+        ls = lief.parse(sample_path)
+        section = Section()
+        section.name      = "test"
+        section.type      = lief.ELF.SECTION_TYPES.PROGBITS
+        section.content   = STUB.segments[0].data # First LOAD segment which holds payload
+        section.alignment = 8
+        section = ls.add_section(section, True)
+
+        ls.header.entrypoint = section.virtual_address + STUB.header.entrypoint
+
+        ls.write(output)
+
+        st = os.stat(output)
+        os.chmod(output, st.st_mode | stat.S_IEXEC)
+
+        p = Popen(output, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout.decode("utf8"))
+        self.assertIsNotNone(re.search(r'LIEF is Working', stdout.decode("utf8")))
+
+
+    @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
+    def test_gcc(self):
+        sample_path = get_sample('ELF/ELF64_x86-64_binary_gcc.bin')
+        output      = os.path.join(self.tmp_dir, "gcc.section")
+
+        gcc = lief.parse(sample_path)
+        section = Section()
+        section.name      = "test"
+        section.type      = lief.ELF.SECTION_TYPES.PROGBITS
+        section.content   = STUB.segments[0].data # First LOAD segment which holds payload
+        section.alignment = 8
+        section = gcc.add_section(section, True)
+
+        gcc.header.entrypoint = section.virtual_address + STUB.header.entrypoint
+
+        gcc.write(output)
+
+        st = os.stat(output)
+        os.chmod(output, st.st_mode | stat.S_IEXEC)
+
+        p = Popen(output, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout.decode("utf8"))
+        self.assertIsNotNone(re.search(r'LIEF is Working', stdout.decode("utf8")))
+
+
+    def tearDown(self):
+        # Delete it
+        if os.path.isdir(self.tmp_dir):
+            shutil.rmtree(self.tmp_dir)
+
+if __name__ == '__main__':
+
+    root_logger = logging.getLogger()
+    root_logger.setLevel(logging.DEBUG)
+
+    ch = logging.StreamHandler()
+    ch.setLevel(logging.DEBUG)
+    root_logger.addHandler(ch)
+
+    unittest.main(verbosity=2)
+
diff --git a/tests/elf/add_segment.py b/tests/elf/add_segment.py
new file mode 100644
index 0000000..c12bc45
--- /dev/null
+++ b/tests/elf/add_segment.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python
+import unittest
+import logging
+import os
+import sys
+import stat
+import re
+import subprocess
+import tempfile
+import shutil
+from subprocess import Popen
+
+import lief
+from lief.ELF import Segment
+
+from unittest import TestCase
+from utils import get_sample
+
+CURRENT_DIRECTORY = os.path.dirname(os.path.abspath(__file__))
+STUB = lief.parse(os.path.join(CURRENT_DIRECTORY, "hello_lief.bin"))
+
+class TestAddSegment(TestCase):
+    def setUp(self):
+        self.logger = logging.getLogger(__name__)
+        self.tmp_dir = tempfile.mkdtemp(suffix='_lief_testhash')
+        self.logger.debug("temp dir: {}".format(self.tmp_dir))
+
+
+    @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
+    def test_simple(self):
+        sample_path = get_sample('ELF/ELF64_x86-64_binary_ls.bin')
+        output      = os.path.join(self.tmp_dir, "ls.segment")
+
+        ls = lief.parse(sample_path)
+        segment = Segment()
+        segment.type      = lief.ELF.SEGMENT_TYPES.LOAD
+        segment.flag      = lief.ELF.SEGMENT_FLAGS.PF_R | lief.ELF.SEGMENT_FLAGS.PF_W | lief.ELF.SEGMENT_FLAGS.PF_X
+        segment.data      = STUB.segments[0].data # First LOAD segment which holds payload
+        segment.alignment = 8
+        segment           = ls.add_segment(segment, base=0xA00000, force_note=True)
+
+        ls.header.entrypoint = segment.virtual_address + STUB.header.entrypoint
+        ls.write(output)
+
+        st = os.stat(output)
+        os.chmod(output, st.st_mode | stat.S_IEXEC)
+
+        p = Popen(output, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout.decode("utf8"))
+        self.assertIsNotNone(re.search(r'LIEF is Working', stdout.decode("utf8")))
+
+
+    @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
+    def test_gcc(self):
+        sample_path = get_sample('ELF/ELF64_x86-64_binary_gcc.bin')
+        output      = os.path.join(self.tmp_dir, "gcc.segment")
+
+        gcc = lief.parse(sample_path)
+        segment = Segment()
+        segment.type      = lief.ELF.SEGMENT_TYPES.LOAD
+        segment.flag      = lief.ELF.SEGMENT_FLAGS.PF_R | lief.ELF.SEGMENT_FLAGS.PF_W | lief.ELF.SEGMENT_FLAGS.PF_X
+        segment.data      = STUB.segments[0].data # First LOAD segment which holds payload
+        segment.alignment = 8
+        segment           = gcc.add_segment(segment, base=0xA00000, force_note=True)
+
+        gcc.header.entrypoint = segment.virtual_address + STUB.header.entrypoint
+
+        gcc.write(output)
+
+        st = os.stat(output)
+        os.chmod(output, st.st_mode | stat.S_IEXEC)
+
+        p = Popen(output, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout.decode("utf8"))
+        self.assertIsNotNone(re.search(r'LIEF is Working', stdout.decode("utf8")))
+
+
+    def tearDown(self):
+        # Delete it
+        if os.path.isdir(self.tmp_dir):
+            shutil.rmtree(self.tmp_dir)
+
+if __name__ == '__main__':
+
+    root_logger = logging.getLogger()
+    root_logger.setLevel(logging.DEBUG)
+
+    ch = logging.StreamHandler()
+    ch.setLevel(logging.DEBUG)
+    root_logger.addHandler(ch)
+
+    unittest.main(verbosity=2)
+
diff --git a/tests/elf/elf_test.py b/tests/elf/elf_test.py
new file mode 100644
index 0000000..7f50c0e
--- /dev/null
+++ b/tests/elf/elf_test.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+import unittest
+import lief
+
+from unittest import TestCase
+from utils import get_sample
+
+class TestELF(TestCase):
+
+    def test_rpath(self):
+        etterlog = lief.parse(get_sample('ELF/ELF64_x86-64_binary_etterlog.bin'))
+
+        dynamic_entries = etterlog.dynamic_entries
+
+        rpath = [e for e in dynamic_entries if e.tag == lief.ELF.DYNAMIC_TAGS.RPATH]
+
+        self.assertEqual(len(rpath), 1)
+        rpath = rpath.pop()
+
+        self.assertEqual(rpath.name, "/usr/lib")
+
+    def test_runpath(self):
+        etterlog = lief.parse(get_sample('ELF/ELF64_x86-64_binary_systemd-resolve.bin'))
+
+        dynamic_entries = etterlog.dynamic_entries
+
+        runpath = [e for e in dynamic_entries if e.tag == lief.ELF.DYNAMIC_TAGS.RUNPATH]
+
+        self.assertEqual(len(runpath), 1)
+        runpath = runpath.pop()
+
+        self.assertEqual(runpath.name, "/usr/lib/systemd")
+
+
+    def test_gnuhash(self):
+        ls = lief.parse(get_sample('ELF/ELF64_x86-64_binary_ls.bin'))
+        gnu_hash = ls.gnu_hash
+
+        self.assertEqual(gnu_hash.nb_buckets, 33)
+        self.assertEqual(gnu_hash.symbol_index, 109)
+        self.assertEqual(gnu_hash.shift2, 7)
+
+        bloom_filters = gnu_hash.bloom_filters
+
+        self.assertEqual(len(bloom_filters), 2)
+        self.assertIn(0x3FAE01120C48A1A6, bloom_filters)
+        self.assertIn(0x900004A81310D428, bloom_filters)
+
+        buckets = gnu_hash.buckets
+        self.assertEqual(len(buckets), 33)
+
+        buckets_test = [109, 110, 0, 0, 0, 0, 0, 111, 113, 114, 0, 0, 0, 115, 0, 116, 0, 0, 117, 118, 119, 0, 120, 0, 0, 121, 123, 124, 126, 128, 129, 130, 0]
+        self.assertEqual(buckets_test, buckets)
+
+
+        hash_values = gnu_hash.hash_values
+        hash_values_test = [0x60E0C78D, 0xF54162E5, 0x7FFD8E4E, 0x1C8BF239, 0xEEFD3EB, 0x1C8C1D29, 0x1C5871D9,
+                0x5B7F3E03, 0x759A6A7F, 0xEF18DB9, 0xBA53E4D, 0x9789A097, 0x9E7650BC, 0xD39AD3D,
+                0x12F7C433, 0xEB01FAB6, 0xECD54543, 0xAD3C9892, 0x72632CCF, 0x12F7A2B3, 0x7C92E3BB, 0x7C96F087]
+        self.assertEqual(hash_values, hash_values_test)
+
+
+
+
+
+
+
+
+
+if __name__ == '__main__':
+    unittest.main(verbosity = 2)
+
diff --git a/tests/elf/fuzzing.py.in b/tests/elf/fuzzing.py.in
new file mode 100644
index 0000000..ab21e71
--- /dev/null
+++ b/tests/elf/fuzzing.py.in
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+import subprocess
+import lief
+import os
+import shutil
+import argparse
+
+MELKOR_BIN = "@MELKOR_BINARY@"
+
+def generate_samples(seed = '/usr/bin/ls', nb = 100):
+    cmd = [MELKOR_BIN, '-A', seed, '-n', '{:d}'.format(nb), '-q']
+    output_dir = "orcs_{}".format(os.path.basename(seed))
+    output_dir = os.path.join(os.path.dirname(MELKOR_BIN), output_dir)
+
+    if os.path.exists(output_dir) and os.path.isdir(output_dir):
+        shutil.rmtree(output_dir)
+    p = subprocess.Popen(cmd, stdout = subprocess.PIPE, stderr = subprocess.PIPE, cwd = os.path.dirname(MELKOR_BIN))
+    out, err = p.communicate()
+
+    return output_dir
+
+
+
+def fuzz(seed, nb):
+    outputdir = generate_samples(seed, nb)
+    for _, __, filesname in os.walk(outputdir):
+        for file in filesname:
+            filepath = os.path.join(outputdir, file)
+            if lief.is_elf(filepath):
+                print("Try to parse {}".format(filepath))
+                try:
+                    b = lief.parse(filepath)
+                except lief.exception as e:
+                    pass
+
+
+if __name__ == '__main__':
+
+    parser = argparse.ArgumentParser(description = "LIEF ELF Fuzzer")
+    parser.add_argument("--input-seed",
+            dest = 'input_seed',
+            type = str,
+            default = '/usr/bin/ls')
+
+    parser.add_argument("--numberof_samples", "-n",
+            dest = 'nb_samples',
+            type = int,
+            default = 100)
+
+    args = parser.parse_args()
+
+    fuzz(args.input_seed, args.nb_samples)
+    print(lief)
+
+
diff --git a/tests/elf/hash_tests.py b/tests/elf/hash_tests.py
new file mode 100644
index 0000000..867f385
--- /dev/null
+++ b/tests/elf/hash_tests.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python3
+import unittest
+import logging
+import os
+import stat
+import sys
+import re
+import subprocess
+import platform
+import tempfile
+import shutil
+
+from subprocess import Popen
+
+import lief
+
+from unittest import TestCase
+from utils import get_sample
+
+LIBADD_C = """\
+#include <stdlib.h>
+#include <stdio.h>
+
+int add(int a, int b);
+
+int add(int a, int b) {
+  printf("%d + %d = %d\\n", a, b, a+b);
+  return a + b;
+}
+"""
+
+BINADD_C = """\
+#include <stdio.h>
+#include <stdlib.h>
+
+int add(int a, int b);
+
+int main(int argc, char **argv) {
+  if (argc != 3) {
+    printf("Usage: %s <a> <b>\\n", argv[0]);
+    exit(-1);
+  }
+
+  int res = add(atoi(argv[1]), atoi(argv[2]));
+  printf("From myLIb, a + b = %d\\n", res);
+  return 0;
+}
+"""
+
+class TestHash(TestCase):
+
+    def setUp(self):
+        self.logger  = logging.getLogger(__name__)
+        self.tmp_dir = tempfile.mkdtemp(suffix='_lief_testhash')
+        self.logger.debug("temp dir: {}".format(self.tmp_dir))
+
+        self.binadd_path = os.path.join(self.tmp_dir, "binadd.c")
+        self.libadd_path = os.path.join(self.tmp_dir, "libadd.c")
+
+        self.libadd_so  = os.path.join(self.tmp_dir, "libadd.so")
+        self.binadd_bin = os.path.join(self.tmp_dir, "binadd.bin")
+
+        self.compiler = shutil.which(os.environ.get('CC', 'cc'))
+        if self.compiler is None:
+            self.logger.error("Unable to find a compiler")
+            sys.exit(0)
+
+        self.logger.debug("Compiler: {}".format(self.compiler))
+
+        with open(self.binadd_path, 'w') as f:
+            f.write(BINADD_C)
+
+        with open(self.libadd_path, 'w') as f:
+            f.write(LIBADD_C)
+
+    def compile_libadd(self, input, extra_flags=[]):
+        if os.path.isfile(self.libadd_so):
+            os.remove(self.libadd_so)
+        CC_FLAGS = ['-fPIC', '-shared'] + extra_flags
+        cmd = [self.compiler, '-o', self.libadd_so] + CC_FLAGS + [input]
+        self.logger.debug("Compile 'libadd' with: {}".format(" ".join(cmd)))
+        p = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout)
+
+
+    def compile_binadd(self, input, extra_flags=[]):
+
+        if os.path.isfile(self.binadd_bin):
+            os.remove(self.binadd_bin)
+
+        CC_FLAGS = ['-L', self.tmp_dir] + extra_flags
+        cmd = [self.compiler, '-o', self.binadd_bin] + CC_FLAGS + [input, '-ladd']
+        self.logger.debug("Compile 'binadd' with: {}".format(" ".join(cmd)))
+        p = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        stdout, _ = p.communicate()
+        self.logger.debug(stdout)
+
+    def obfuscate(self):
+
+        libadd = lief.parse(self.libadd_so)
+        binadd = lief.parse(self.binadd_bin)
+
+        libadd_dynsym = libadd.dynamic_symbols
+        binadd_dynsym = binadd.dynamic_symbols
+
+        # Change add in the libary
+        for sym in libadd_dynsym:
+            if sym.name == "add":
+                sym.name = "abc"
+
+        # Change "add" in the binary
+        for sym in binadd_dynsym:
+            if sym.name == "add":
+                sym.name = "abc"
+
+
+        # change library name in the binary
+        for entry in binadd.dynamic_entries:
+            if entry.tag == lief.ELF.NEEDED and entry.name == "libadd.so":
+                entry.name = "libabc.so"
+
+        libadd_modified = os.path.join(self.tmp_dir, "libabc.so")
+        binadd_modified = os.path.join(self.tmp_dir, "binadd_obf.bin")
+
+        libadd.write(libadd_modified);
+        binadd.write(binadd_modified)
+
+        st = os.stat(libadd_modified)
+        os.chmod(libadd_modified, st.st_mode | stat.S_IEXEC)
+
+        st = os.stat(binadd_modified)
+        os.chmod(binadd_modified, st.st_mode | stat.S_IEXEC)
+
+        p = Popen([binadd_modified, '1', '2'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, env={"LD_LIBRARY_PATH": self.tmp_dir})
+        stdout, _ = p.communicate()
+
+        self.assertIn('From myLIb, a + b = 3', stdout.decode("utf8"))
+
+
+    @unittest.skipUnless(sys.platform.startswith("linux") and sys.version_info >= (3, 5), "requires Linux")
+    def test_gnuhash(self):
+        self.compile_libadd(self.libadd_path, ['-Wl,--hash-style=gnu'])
+        self.compile_binadd(self.binadd_path, ['-Wl,--hash-style=gnu'])
+        self.obfuscate()
+
+
+    @unittest.skipUnless(sys.platform.startswith("linux") and sys.version_info >= (3, 5), "requires Linux")
+    def test_sysv(self):
+        self.compile_libadd(self.libadd_path, ['-Wl,--hash-style=sysv'])
+        self.compile_binadd(self.binadd_path, ['-Wl,--hash-style=sysv'])
+        self.obfuscate()
+
+
+
+    def tearDown(self):
+        # Delete it
+        if os.path.isdir(self.tmp_dir):
+            shutil.rmtree(self.tmp_dir)
+
+if __name__ == '__main__':
+
+    root_logger = logging.getLogger()
+    root_logger.setLevel(logging.DEBUG)
+
+    ch = logging.StreamHandler()
+    ch.setLevel(logging.DEBUG)
+    root_logger.addHandler(ch)
+
+    unittest.main(verbosity=2)
+
diff --git a/tests/elf/hello_lief.bin b/tests/elf/hello_lief.bin
new file mode 100644
index 0000000..969a3e7
Binary files /dev/null and b/tests/elf/hello_lief.bin differ
diff --git a/tests/elf/test.py b/tests/elf/test.py
new file mode 100644
index 0000000..6c4d797
--- /dev/null
+++ b/tests/elf/test.py
@@ -0,0 +1,18 @@
+import lief
+from lief.ELF import Section
+
+ls   = lief.parse("/bin/clang")
+stub = lief.parse("hello_lief.bin")
+
+section            = Section()
+section.name       = "test"
+section.type       = lief.ELF.SECTION_TYPES.PROGBITS
+section.content    = stub.segments[0].data # First LOAD segment which holds payload
+section.entry_size = 0
+section.alignment  = 8
+section = ls.add_section(section, True)
+
+ls.header.entrypoint = section.virtual_address + stub.header.entrypoint
+
+ls.write("lst.section")
+# Have fun !
diff --git a/tests/elf/test_builder.cpp b/tests/elf/test_builder.cpp
new file mode 100644
index 0000000..212d7ff
--- /dev/null
+++ b/tests/elf/test_builder.cpp
@@ -0,0 +1,158 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+#include <yaml-cpp/yaml.h>
+
+#include <LIEF/ELF.hpp>
+
+#include "utils.hpp"
+
+extern const YAML::Node config = YAML::LoadFile(std::string(PATH_TO_CONFIG) + "/config.yaml");
+
+using namespace LIEF::ELF;
+
+TEST_CASE("Test parse", "[elf][builder]")
+{
+
+  using namespace Catch::Generators;
+  std::vector<std::string> elf_files = Test::get_elf_files();
+
+  // Get one
+  std::vector<std::string>::iterator elf_file = between(
+      std::begin(elf_files),
+      std::prev(std::end(elf_files)));
+  const std::string& elf_file_str = *elf_file;
+  if (elf_file_str.find("binary_tiny") != std::string::npos) {
+    INFO("Skip " << elf_file_str);
+    return;
+  }
+  INFO("Binary used: " << elf_file_str);
+
+  std::unique_ptr<Binary> binary_original;
+  try {
+     binary_original = std::unique_ptr<Binary>{Parser::parse(elf_file_str)};
+  } catch (const LIEF::exception& e) {
+    WARN("Can't parse: '" << elf_file_str << "' (" << e.what() << ")");
+    return;
+  }
+
+  std::string output_name = binary_original->name() + "_built";
+  binary_original->write(output_name);
+  std::unique_ptr<Binary> binary_build{Parser::parse(output_name)};
+
+  SECTION("Header") {
+    REQUIRE(binary_original->get_header() == binary_build->get_header());
+  }
+
+
+  SECTION("Sections") {
+    it_sections sections_lhs = binary_original->get_sections();
+    it_sections sections_rhs = binary_build->get_sections();
+    REQUIRE(sections_lhs.size() == sections_rhs.size());
+
+    for (size_t i = 0; i < sections_lhs.size(); ++i) {
+      REQUIRE(sections_lhs[i] == sections_rhs[i]);
+    }
+  }
+
+  SECTION("Segments") {
+    it_segments segment_lhs = binary_original->get_segments();
+    it_segments segment_rhs = binary_build->get_segments();
+    REQUIRE(segment_lhs.size() == segment_rhs.size());
+
+    //TODO:
+    //for (size_t i = 0; i < segment_rhs.size(); ++i) {
+    //  REQUIRE(segment_lhs[i] == segment_rhs[i]);
+    //}
+  }
+
+  SECTION("Dynamic symbols") {
+    it_symbols symbols_lhs = binary_original->get_dynamic_symbols();
+    it_symbols symbols_rhs = binary_build->get_dynamic_symbols();
+    REQUIRE(symbols_lhs.size() == symbols_rhs.size());
+
+    for (size_t i = 0; i < symbols_rhs.size(); ++i) {
+      REQUIRE(symbols_lhs[i] == symbols_rhs[i]);
+    }
+  }
+
+  SECTION("Static symbols") {
+    it_symbols symbols_lhs = binary_original->get_static_symbols();
+    it_symbols symbols_rhs = binary_build->get_static_symbols();
+    REQUIRE(symbols_lhs.size() == symbols_rhs.size());
+
+    for (size_t i = 0; i < symbols_rhs.size(); ++i) {
+      REQUIRE(symbols_lhs[i] == symbols_rhs[i]);
+    }
+  }
+
+
+  SECTION("Symbols version") {
+    it_symbols_version symbols_version_lhs = binary_original->get_symbols_version();
+    it_symbols_version symbols_version_rhs = binary_build->get_symbols_version();
+    REQUIRE(symbols_version_lhs.size() == symbols_version_rhs.size());
+
+    for (size_t i = 0; i < symbols_version_rhs.size(); ++i) {
+      REQUIRE(symbols_version_lhs[i] == symbols_version_rhs[i]);
+    }
+  }
+
+
+  SECTION("Symbols version definition") {
+    it_symbols_version_definition symbols_version_definition_lhs = binary_original->get_symbols_version_definition();
+    it_symbols_version_definition symbols_version_definition_rhs = binary_build->get_symbols_version_definition();
+    REQUIRE(symbols_version_definition_lhs.size() == symbols_version_definition_rhs.size());
+
+    for (size_t i = 0; i < symbols_version_definition_lhs.size(); ++i) {
+      REQUIRE(symbols_version_definition_lhs[i] == symbols_version_definition_rhs[i]);
+    }
+  }
+
+
+  SECTION("Symbols version requirement") {
+    it_symbols_version_requirement symbols_version_requirement_lhs = binary_original->get_symbols_version_requirement();
+    it_symbols_version_requirement symbols_version_requirement_rhs = binary_build->get_symbols_version_requirement();
+    REQUIRE(symbols_version_requirement_lhs.size() == symbols_version_requirement_rhs.size());
+
+    for (size_t i = 0; i < symbols_version_requirement_lhs.size(); ++i) {
+      REQUIRE(symbols_version_requirement_lhs[i] == symbols_version_requirement_lhs[i]);
+    }
+  }
+
+  SECTION("Dynamic relocations") {
+    it_relocations dynamic_relocations_lhs = binary_original->get_dynamic_relocations();
+    it_relocations dynamic_relocations_rhs = binary_build->get_dynamic_relocations();
+    REQUIRE(dynamic_relocations_lhs.size() == dynamic_relocations_rhs.size());
+
+    for (size_t i = 0; i < dynamic_relocations_lhs.size(); ++i) {
+      REQUIRE(dynamic_relocations_lhs[i] == dynamic_relocations_rhs[i]);
+    }
+  }
+
+  SECTION(".plt.got relocations") {
+    it_relocations pltgot_relocations_lhs = binary_original->get_pltgot_relocations();
+    it_relocations pltgot_relocations_rhs = binary_build->get_pltgot_relocations();
+    REQUIRE(pltgot_relocations_lhs.size() == pltgot_relocations_rhs.size());
+
+    for (size_t i = 0; i < pltgot_relocations_lhs.size(); ++i) {
+      REQUIRE(pltgot_relocations_lhs[i] == pltgot_relocations_rhs[i]);
+    }
+  }
+
+
+
+}
diff --git a/tests/elf/test_equality.cpp b/tests/elf/test_equality.cpp
new file mode 100644
index 0000000..e7b234e
--- /dev/null
+++ b/tests/elf/test_equality.cpp
@@ -0,0 +1,200 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+#include <yaml-cpp/yaml.h>
+
+#include <LIEF/exception.hpp>
+#include <LIEF/ELF.hpp>
+
+#include "utils.hpp"
+
+extern const YAML::Node config = YAML::LoadFile(std::string(PATH_TO_CONFIG) + "/config.yaml");
+
+using namespace LIEF::ELF;
+
+TEST_CASE("Test operator==", "[elf][internal]") {
+
+  using namespace Catch::Generators;
+  std::vector<std::string> elf_files = Test::get_elf_files();
+
+  // Get one
+  std::vector<std::string>::iterator elf_file = between(
+      std::begin(elf_files),
+      std::prev(std::end(elf_files)));
+
+  INFO("Binary used: " << *elf_file);
+  std::unique_ptr<const Binary> binary;
+  try {
+     binary = std::unique_ptr<const Binary>{Parser::parse(*elf_file)};
+  } catch (const LIEF::exception& e) {
+    WARN("Can't parse: '" << *elf_file << "' (" << e.what() << ")");
+    return;
+  }
+
+  SECTION("Header") {
+    const Header& header_lhs = binary->get_header();
+    Header header_rhs = header_lhs;
+    REQUIRE(header_lhs == header_rhs);
+
+    header_rhs.entrypoint(0xDEADBEEF);
+    REQUIRE(header_lhs != header_rhs);
+  }
+
+  SECTION("Section") {
+    for (const Section& section : binary->get_sections()) {
+      {
+        const Section& section_lhs = section;
+        const Section& section_rhs = section;
+        REQUIRE(section_lhs == section_rhs);
+      }
+
+      {
+        Section section_lhs = section;
+        const Section& section_rhs = section;
+        REQUIRE(section_lhs == section_rhs);
+      }
+    }
+  }
+
+
+  SECTION("Segments") {
+    for (const Segment& segment: binary->get_segments()) {
+      {
+        const Segment& segment_lhs = segment;
+        const Segment& segment_rhs = segment;
+        REQUIRE(segment_lhs == segment_rhs);
+      }
+
+      {
+        Segment segment_lhs = segment;
+        const Segment& segment_rhs = segment;
+        REQUIRE(segment_lhs == segment_rhs);
+      }
+    }
+  }
+
+
+  SECTION("Static Symbols") {
+    for (const Symbol& symbol: binary->get_static_symbols()) {
+      {
+        const Symbol& symbol_lhs = symbol;
+        const Symbol& symbol_rhs = symbol;
+        REQUIRE(symbol_lhs == symbol_rhs);
+      }
+
+      {
+        Symbol symbol_lhs = symbol;
+        const Symbol& symbol_rhs = symbol;
+        //CHECK(symbol_lhs == symbol_rhs);
+      }
+    }
+  }
+
+
+  SECTION("Dynamic Symbols") {
+    for (const Symbol& symbol: binary->get_dynamic_symbols()) {
+      {
+        const Symbol& symbol_lhs = symbol;
+        const Symbol& symbol_rhs = symbol;
+        REQUIRE(symbol_lhs == symbol_rhs);
+      }
+
+      {
+        Symbol symbol_lhs = symbol;
+        const Symbol& symbol_rhs = symbol;
+        //CHECK(symbol_lhs == symbol_rhs);
+      }
+    }
+  }
+
+  SECTION("Dynamic Relocations") {
+    for (const Relocation& relocation: binary->get_dynamic_relocations()) {
+      {
+        const Relocation& relocation_lhs = relocation;
+        const Relocation& relocation_rhs = relocation;
+        REQUIRE(relocation_lhs == relocation_rhs);
+      }
+      {
+        Relocation relocation_lhs = relocation;
+        const Relocation& relocation_rhs = relocation;
+        //CHECK(symbol_lhs == symbol_rhs);
+      }
+
+    }
+  }
+
+
+  SECTION(".plt.got Relocations") {
+    for (const Relocation& relocation: binary->get_pltgot_relocations()) {
+      {
+        const Relocation& relocation_lhs = relocation;
+        const Relocation& relocation_rhs = relocation;
+        REQUIRE(relocation_lhs == relocation_rhs);
+      }
+      {
+        Relocation relocation_lhs = relocation;
+        const Relocation& relocation_rhs = relocation;
+        //CHECK(symbol_lhs == symbol_rhs);
+      }
+    }
+  }
+
+  SECTION("Symbols version") {
+    for (const SymbolVersion& sv: binary->get_symbols_version()) {
+      {
+        const SymbolVersion& sv_lhs = sv;
+        const SymbolVersion& sv_rhs = sv;
+        REQUIRE(sv_lhs == sv_rhs);
+      }
+      {
+        SymbolVersion sv_lhs = sv;
+        const SymbolVersion& sv_rhs = sv;
+        //REQUIRE(sv_lhs == sv_rhs);
+      }
+    }
+  }
+
+  SECTION("Symbols version definition") {
+    for (const SymbolVersionDefinition& svd: binary->get_symbols_version_definition()) {
+      {
+        const SymbolVersionDefinition& svd_lhs = svd;
+        const SymbolVersionDefinition& svd_rhs = svd;
+        REQUIRE(svd_lhs == svd_rhs);
+      }
+      {
+        SymbolVersionDefinition svd_lhs = svd;
+        const SymbolVersionDefinition& svd_rhs = svd;
+        //CHECK(svd_lhs == svd_rhs);
+      }
+    }
+  }
+
+  SECTION("Symbols version requirement") {
+    for (const SymbolVersionRequirement& svr: binary->get_symbols_version_requirement()) {
+      {
+        const SymbolVersionRequirement& svr_lhs = svr;
+        const SymbolVersionRequirement& svr_rhs = svr;
+        REQUIRE(svr_lhs == svr_rhs);
+      }
+      {
+        SymbolVersionRequirement svr_lhs = svr;
+        const SymbolVersionRequirement& svr_rhs = svr;
+        //CHECK(svd_lhs == svd_rhs);
+      }
+    }
+  }
+}
diff --git a/tests/elf/test_modifier.cpp b/tests/elf/test_modifier.cpp
new file mode 100644
index 0000000..1a644f1
--- /dev/null
+++ b/tests/elf/test_modifier.cpp
@@ -0,0 +1,114 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+#include <yaml-cpp/yaml.h>
+
+#include <LIEF/ELF.hpp>
+
+#include "utils.hpp"
+
+
+extern const YAML::Node config = YAML::LoadFile(std::string(PATH_TO_CONFIG) + "/config.yaml");
+
+
+using namespace LIEF::ELF;
+
+
+TEST_CASE("Test remove dynamic symbol", "[elf][modifier][symbol][dynamic]")
+{
+
+  using namespace Catch::Generators;
+  std::vector<std::string> elf_files = Test::get_elf_files();
+
+  // Get one
+  std::vector<std::string>::iterator elf_file = between(
+      std::begin(elf_files),
+      std::prev(std::end(elf_files)));
+
+  const std::string& elf_file_str = *elf_file;
+
+
+  //if (elf_file_str.find("systemd-resolve.bin") == std::string::npos) {
+  if (elf_file_str.find("binary_tiny") != std::string::npos) {
+    INFO("Skip " << elf_file_str);
+    return;
+  }
+  INFO("Binary used: " << elf_file_str);
+
+  std::unique_ptr<Binary> binary = std::unique_ptr<Binary>{Parser::parse(elf_file_str)};
+  it_symbols dynamic_symbols = binary->get_dynamic_symbols();
+
+  auto&& it_symbol = std::find_if(
+      std::begin(dynamic_symbols),
+      std::end(dynamic_symbols),
+      [] (const Symbol& symbol) {
+        return symbol.name().length() > 2;
+      });
+
+  if (it_symbol == std::end(dynamic_symbols)) {
+    return;
+  }
+
+  auto&& it_symbol_bis = std::find_if(
+      std::begin(dynamic_symbols),
+      std::end(dynamic_symbols),
+      [&it_symbol] (const Symbol& symbol) {
+        return symbol.name().length() > 2 and *it_symbol != symbol;
+      });
+
+  if (it_symbol_bis == std::end(dynamic_symbols)) {
+    return;
+  }
+
+
+
+  const std::string symbol_removed_name     = it_symbol->name();
+  const std::string symbol_bis_removed_name = it_symbol_bis->name();
+
+  INFO("Symbol that will be removed: " << symbol_removed_name << " and " << symbol_bis_removed_name);
+
+  Symbol* symbol = &(*it_symbol);
+
+  binary->remove_dynamic_symbol(symbol);
+  binary->remove_dynamic_symbol(symbol_bis_removed_name);
+
+  std::string output_name = binary->name() + "_test_remove_symbol";
+  binary->write(output_name);
+
+  std::unique_ptr<Binary> binary_updated = std::unique_ptr<Binary>{Parser::parse(output_name)};
+  dynamic_symbols = binary_updated->get_dynamic_symbols();
+  it_symbol = std::find_if(
+      std::begin(dynamic_symbols),
+      std::end(dynamic_symbols),
+      [&symbol_removed_name] (const Symbol& symbol) {
+        return symbol.name() == symbol_removed_name;
+      });
+
+  it_symbol_bis = std::find_if(
+      std::begin(dynamic_symbols),
+      std::end(dynamic_symbols),
+      [&symbol_bis_removed_name] (const Symbol& symbol) {
+        return symbol.name() == symbol_bis_removed_name;
+      });
+
+
+  REQUIRE(it_symbol == std::end(dynamic_symbols));
+  REQUIRE(it_symbol_bis == std::end(dynamic_symbols));
+
+}
+
+
diff --git a/tests/elf/test_parser.cpp b/tests/elf/test_parser.cpp
new file mode 100644
index 0000000..5569a83
--- /dev/null
+++ b/tests/elf/test_parser.cpp
@@ -0,0 +1,184 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+#include <yaml-cpp/yaml.h>
+
+#include <LIEF/ELF.hpp>
+
+#include "utils.hpp"
+
+extern const YAML::Node config = YAML::LoadFile(std::string(PATH_TO_CONFIG) + "/config.yaml");
+
+using namespace LIEF::ELF;
+
+TEST_CASE("Test parse", "[elf][parser]")
+{
+
+  using namespace Catch::Generators;
+  // Get test cases
+  std::vector<std::string> elf_test_cases = Test::get_test_cases();
+
+  // Get one
+  std::vector<std::string>::iterator test_case = between(
+      std::begin(elf_test_cases),
+      std::prev(std::end(elf_test_cases)));
+
+
+  YAML::Node parameters = YAML::LoadFile(config[*test_case]["config_file"].as<std::string>());
+
+  // Parse binary
+  std::unique_ptr<const Binary> binary{Parser::parse(config[*test_case]["binary_path"].as<std::string>())};
+
+  // Raw data
+  std::ifstream binfile(config[*test_case]["binary_path"].as<std::string>(), std::ios::in | std::ios::binary);
+  REQUIRE(binfile);
+  std::vector<uint8_t> raw = {std::istreambuf_iterator<char>(binfile), std::istreambuf_iterator<char>()};
+
+  // Header
+  // ======
+  SECTION("Header") {
+    const Header& header = binary->get_header();
+    REQUIRE(header.numberof_sections()      == parameters["Header"]["nbShdr"].as<unsigned int>());
+    REQUIRE(header.numberof_segments()      == parameters["Header"]["nbPhdr"].as<unsigned int>());
+    REQUIRE(header.entrypoint()             == parameters["Header"]["entryPoint"].as<unsigned long long>());
+    REQUIRE(header.program_headers_offset() == parameters["Header"]["offsetToPhdr"].as<unsigned long long>());
+    REQUIRE(header.section_headers_offset() == parameters["Header"]["offsetToShdr"].as<unsigned long long>());
+  }
+
+  // Sections
+  // ========
+  SECTION("Sections") {
+
+    REQUIRE(binary->get_sections().size() == parameters["Header"]["nbShdr"].as<unsigned int>());
+
+    if (parameters["Sections"]) {
+      it_const_sections sections = binary->get_sections();
+      for (size_t i = 0; i < parameters["Sections"].size(); ++i) {
+        const Section& section = sections[i];
+        //name[:17] because readelf provide only the first 16 char
+        REQUIRE(parameters["Sections"][i]["name"].as<std::string>() == section.name().substr(0,17));
+
+        REQUIRE(parameters["Sections"][i]["offset"].as<unsigned long long>() == section.file_offset());
+
+        REQUIRE(parameters["Sections"][i]["address"].as<unsigned long long>() == section.virtual_address());
+
+        REQUIRE(parameters["Sections"][i]["size"].as<unsigned long long>() == section.size());
+
+        REQUIRE(parameters["Sections"][i]["nb"].as<unsigned int>() == i);
+
+        if (parameters["Sections"][i]["size"].as<unsigned long long>() > 0 and
+            section.type() != LIEF::ELF::SECTION_TYPES::SHT_NOBITS) {
+          REQUIRE(
+            std::vector<uint8_t>(
+              raw.data() + parameters["Sections"][i]["offset"].as<unsigned long long>(),
+              raw.data() + parameters["Sections"][i]["offset"].as<unsigned long long>() + parameters["Sections"][i]["size"].as<unsigned long long>()) ==
+              section.content()
+            );
+        }
+      }
+    }
+  }
+
+  // Segments
+  // ========
+  SECTION("Segments") {
+    REQUIRE(binary->get_segments().size() == parameters["Header"]["nbPhdr"].as<unsigned int>());
+    if (parameters["Segments"]) {
+      it_const_segments segments = binary->get_segments();
+      for (size_t i = 0; i < parameters["Segments"].size(); ++i) {
+        const Segment& segment = segments[i];
+        REQUIRE(parameters["Segments"][i]["fSize"].as<unsigned long long>()    == segment.physical_size());
+        REQUIRE(parameters["Segments"][i]["offset"].as<unsigned long long>()   == segment.file_offset());
+        REQUIRE(parameters["Segments"][i]["pAddress"].as<unsigned long long>() == segment.physical_address());
+        REQUIRE(parameters["Segments"][i]["vAddress"].as<unsigned long long>() == segment.virtual_address());
+        REQUIRE(parameters["Segments"][i]["fSize"].as<unsigned long long>()    == segment.physical_size());
+        REQUIRE(parameters["Segments"][i]["vSize"].as<unsigned long long>()    == segment.virtual_size());
+        if (parameters["Segments"][i]["fSize"].as<unsigned long long>() > 0) {
+          REQUIRE(
+            std::vector<uint8_t>(
+              raw.data() + parameters["Segments"][i]["offset"].as<unsigned long long>(),
+              raw.data() + parameters["Segments"][i]["offset"].as<unsigned long long>() + parameters["Segments"][i]["fSize"].as<unsigned long long>()) ==
+            segment.content());
+        }
+      }
+    }
+  }
+
+  // Dynamic symbols
+  // ===============
+  SECTION("Dynamic Symbols") {
+    if (parameters["DynamicSymbols"]) {
+      // +1 for the null entry
+      REQUIRE(parameters["DynamicSymbols"].size() == binary->get_dynamic_symbols().size());
+
+      it_const_symbols dynamic_symbols = binary->get_dynamic_symbols();
+      for (size_t i = 0; i < parameters["DynamicSymbols"].size(); ++i) {
+        const Symbol& symbol = dynamic_symbols[i];
+        REQUIRE(parameters["DynamicSymbols"][i]["name"].as<std::string>() == symbol.name().substr(0, 25));
+      }
+    }
+  }
+
+  // Static symbols
+  // ===============
+  SECTION("Static Symbols") {
+    if (parameters["StaticSymbols"]) {
+      it_const_symbols static_symbols = binary->get_static_symbols();
+      for (size_t i = 0; i < parameters["StaticSymbols"].size(); ++i) {
+        const Symbol& symbol = static_symbols[parameters["StaticSymbols"][i]["num"].as<size_t>()];
+        REQUIRE(parameters["StaticSymbols"][i]["name"].as<std::string>() == symbol.name().substr(0, 25));
+      }
+    }
+  }
+
+
+  // Dynamic relocations
+  // ===================
+  SECTION("Dynamic relocations") {
+    if (parameters["DynamicReloc"]) {
+      REQUIRE(parameters["DynamicReloc"].size() == binary->get_dynamic_relocations().size());
+      it_const_relocations relocations = binary->get_dynamic_relocations();
+      for (size_t i = 0; i < parameters["DynamicReloc"].size(); ++i) {
+        const Relocation& relocation = relocations[i];
+        REQUIRE(parameters["DynamicReloc"][i]["name"].as<std::string>() == relocation.symbol().name().substr(0, 22));
+        REQUIRE(parameters["DynamicReloc"][i]["offset"].as<uint64_t>()  == relocation.address());
+      }
+    }
+  }
+
+
+  // .plt.got relocations
+  // ====================
+  SECTION(".plt.got relocations") {
+    if (parameters["PltGotReloc"]) {
+      REQUIRE(parameters["PltGotReloc"].size() == binary->get_pltgot_relocations().size());
+      it_const_relocations relocations = binary->get_pltgot_relocations();
+      for (size_t i = 0; i < parameters["PltGotReloc"].size(); ++i) {
+        const Relocation& relocation = relocations[i];
+        if (parameters["PltGotReloc"][i]["name"].as<std::string>().size() > 0) {
+          REQUIRE(parameters["PltGotReloc"][i]["name"].as<std::string>() == relocation.symbol().name().substr(0, 22));
+        }
+        REQUIRE(parameters["PltGotReloc"][i]["offset"].as<uint64_t>() == relocation.address());
+      }
+    }
+  }
+
+
+
+}
+
+
diff --git a/tests/elf/utils.cpp b/tests/elf/utils.cpp
new file mode 100644
index 0000000..459030e
--- /dev/null
+++ b/tests/elf/utils.cpp
@@ -0,0 +1,89 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <dirent.h>
+#include <iostream>
+
+#include <yaml-cpp/yaml.h>
+
+#include "utils.hpp"
+
+extern const YAML::Node config;
+
+namespace LIEF {
+namespace ELF {
+namespace Test {
+std::vector<std::string> get_test_cases(void) {
+  std::vector<std::string> elf_samples;
+  for (auto it = std::begin(config) ;it != std::end(config); ++it) {
+    std::string key = it->first.as<std::string>();
+    if (config[key]["format"].as<std::string>() == "ELF") {
+      elf_samples.push_back(key);
+    }
+  }
+  return elf_samples;
+}
+
+std::vector<std::string> get_binary_test_cases(void) {
+  std::vector<std::string> elf_samples;
+  for (auto it = std::begin(config) ;it != std::end(config); ++it) {
+    std::string key = it->first.as<std::string>();
+    if (config[key]["format"].as<std::string>() == "ELF" && config[key]["type"].as<std::string>() == "binary") {
+      elf_samples.push_back(key);
+    }
+  }
+  return elf_samples;
+
+}
+
+std::vector<std::string> get_library_test_cases(void) {
+  std::vector<std::string> elf_samples;
+  for (auto it = std::begin(config) ;it != std::end(config); ++it) {
+    std::string key = it->first.as<std::string>();
+    if (config[key]["format"].as<std::string>() == "ELF" && config[key]["type"].as<std::string>() == "library") {
+      elf_samples.push_back(key);
+    }
+  }
+  return elf_samples;
+
+}
+
+std::vector<std::string> get_elf_files(void) {
+  auto endswith = [] (const std::string& string, const std::string& end) {
+    size_t pos = string.rfind(end);
+    return pos != std::string::npos and pos == (string.length() - end.length());
+  };
+  std::vector<std::string> filespath;
+  DIR *dir;
+  struct dirent *ent;
+  std::string samples_path = PATH_TO_SAMPLES;
+  samples_path += "/ELF";
+  if ((dir = opendir(samples_path.c_str())) != NULL) {
+    while ((ent = readdir (dir)) != NULL) {
+      const std::string name = ent->d_name;
+      if (endswith(name, ".bin") or endswith(name, ".so")) {
+        filespath.emplace_back(samples_path + "/" + name);
+      }
+    }
+    closedir (dir);
+  } else {
+    std::cerr << "Can't open '" << samples_path << "'." << std::endl;
+  }
+  return filespath;
+}
+
+}
+}
+}
diff --git a/tests/elf/utils.hpp b/tests/elf/utils.hpp
new file mode 100644
index 0000000..09aedb4
--- /dev/null
+++ b/tests/elf/utils.hpp
@@ -0,0 +1,32 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_ELF_TEST_UTILS_H_
+#define LIEF_ELF_TEST_UTILS_H_
+#include <vector>
+#include <string>
+
+namespace LIEF {
+namespace ELF {
+namespace Test {
+std::vector<std::string> get_test_cases(void);
+std::vector<std::string> get_binary_test_cases(void);
+std::vector<std::string> get_library_test_cases(void);
+std::vector<std::string> get_elf_files(void);
+}
+}
+}
+
+#endif
diff --git a/tests/elf/utils.py b/tests/elf/utils.py
new file mode 100644
index 0000000..cd70f32
--- /dev/null
+++ b/tests/elf/utils.py
@@ -0,0 +1,12 @@
+#!/usr/bin/env python
+import os
+
+def get_sample(filename):
+    current_dir = os.path.dirname(os.path.abspath(__file__))
+    fullpath = os.path.join(current_dir, '..', 'samples', filename)
+
+    assert os.path.exists(fullpath)
+    assert os.path.isfile(fullpath)
+
+    return fullpath
+
diff --git a/tests/macho/CMakeLists.txt b/tests/macho/CMakeLists.txt
new file mode 100644
index 0000000..a87d0b4
--- /dev/null
+++ b/tests/macho/CMakeLists.txt
@@ -0,0 +1,54 @@
+cmake_minimum_required(VERSION 3.1)
+
+
+# Examples tests
+# ==============
+if (LIEF_EXAMPLES)
+  file(GLOB_RECURSE SAMPLES_MACHO
+    "${LIEF_SAMPLES_DIRECTORY}/MachO/*.bin"
+    "${LIEF_SAMPLES_DIRECTORY}/MachO/*.dylib"
+  )
+
+
+  foreach(MACHO_PATH ${SAMPLES_MACHO})
+    get_filename_component(MACHO_NAME ${MACHO_PATH} NAME)
+
+    if (LIEF_C_API)
+      add_test(
+        NAME EXAMPLES_C_macho_reader_${MACHO_NAME}
+        COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/c/macho_reader
+        ${MACHO_PATH})
+    endif()
+
+    # MachO Reader
+    add_test(
+      NAME EXAMPLES_CPP_macho_reader_${MACHO_NAME}
+      COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/cpp/macho_reader
+      ${MACHO_PATH})
+
+
+    # MachO builder
+    #add_test(
+    #  NAME EXAMPLES_CPP_macho_builder_${MACHO_NAME}
+    #  COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/cpp/macho_reader
+    #  ${MACHO_PATH})
+  endforeach()
+endif()
+
+# Python tests
+# ============
+if (PYTHON_TESTS_ENABLED)
+
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_macho_reader_ls
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/macho_reader.py \
+    ${LIEF_SAMPLES_DIRECTORY}/MachO/MachO64_x86-64_binary_ls.bin")
+
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_macho_reader_libc
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/macho_reader.py \
+    ${LIEF_SAMPLES_DIRECTORY}/MachO/FAT_MachO_x86_x86-64_library_libc.dylib")
+
+endif()
+
+
diff --git a/tests/pe/CMakeLists.txt b/tests/pe/CMakeLists.txt
new file mode 100644
index 0000000..c87f8ff
--- /dev/null
+++ b/tests/pe/CMakeLists.txt
@@ -0,0 +1,122 @@
+cmake_minimum_required(VERSION 3.1)
+include(ExternalProject)
+
+macro(ADD_PE_TEST name sources)
+
+  add_executable(${name}        ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/utils.cpp)
+  add_executable(${name}_shared ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/utils.cpp)
+
+  set_property(TARGET ${name} ${name}_shared PROPERTY INCLUDE_DIRECTORIES "")
+
+  if (MSVC)
+    target_compile_options(${name}        PUBLIC /FIiso646.h)
+    target_compile_options(${name}_shared PUBLIC /FIiso646.h)
+	target_compile_options(${name}_shared PUBLIC /MT)
+	set_property(TARGET ${name} ${name}_shared PROPERTY LINK_FLAGS /NODEFAULTLIB:MSVCRT)
+  endif()
+
+  set_property(TARGET ${name} PROPERTY CXX_STANDARD          11)
+  set_property(TARGET ${name} PROPERTY CXX_STANDARD_REQUIRED ON)
+
+  set_property(TARGET ${name}_shared PROPERTY CXX_STANDARD          11)
+  set_property(TARGET ${name}_shared PROPERTY CXX_STANDARD_REQUIRED ON)
+
+  target_include_directories(${name} PUBLIC
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${DIRENT_INCLUDE_DIR}
+    ${YAMLCPP_INCLUDE_DIRS}
+    ${CATCH_INCLUDE_DIR})
+
+  target_include_directories(${name}_shared PUBLIC
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${YAMLCPP_INCLUDE_DIRS}
+    ${DIRENT_INCLUDE_DIR}
+    ${CATCH_INCLUDE_DIR})
+
+  add_dependencies(${name}        catch YAMLCPP)
+  add_dependencies(${name}_shared catch YAMLCPP)
+
+  if (WIN32)
+    add_dependencies(${name}        dirent)
+    add_dependencies(${name}_shared dirent)
+  endif()
+
+  target_link_libraries(${name}        PUBLIC LIB_LIEF_STATIC ${YAMLCPP_LIBRARY_RELEASE})
+  target_link_libraries(${name}_shared PUBLIC LIB_LIEF_SHARED ${YAMLCPP_LIBRARY_RELEASE})
+
+  add_test(${name}         ${CMAKE_CURRENT_BINARY_DIR}/${name})
+  add_test(${name}_shared  ${CMAKE_CURRENT_BINARY_DIR}/${name}_shared)
+
+endmacro()
+
+
+# Targets
+# =======
+
+set(test_parser_sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/test_parser.cpp)
+
+
+set(test_equality_sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/test_equality.cpp)
+
+
+set(test_builder_sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/test_builder.cpp)
+
+
+set(test_binary_sources
+  ${CMAKE_CURRENT_SOURCE_DIR}/test_binary.cpp)
+
+ADD_PE_TEST(pe_test_parser   ${test_parser_sources})
+ADD_PE_TEST(pe_test_equality ${test_equality_sources})
+ADD_PE_TEST(pe_test_builder  ${test_builder_sources})
+ADD_PE_TEST(pe_test_binary   ${test_binary_sources})
+
+
+
+# Examples tests
+# ==============
+if (LIEF_EXAMPLES)
+
+  file(GLOB_RECURSE SAMPLES_PE
+    "${LIEF_SAMPLES_DIRECTORY}/PE/*.exe"
+    "${LIEF_SAMPLES_DIRECTORY}/PE/*.dll")
+
+  foreach(PE_PATH ${SAMPLES_PE})
+    get_filename_component(PE_NAME ${PE_PATH} NAME)
+    # PE Reader
+    add_test(
+      NAME EXAMPLES_CPP_pe_reader_${PE_NAME}
+      COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/cpp/pe_reader
+      ${PE_PATH})
+
+    if (LIEF_C_API)
+      add_test(
+        NAME EXAMPLES_C_pe_reader_${PE_NAME}
+        COMMAND ${LIEF_EXAMPLES_BINARY_DIR}/c/pe_reader
+        ${PE_PATH})
+    endif()
+
+
+    if (PYTHON_TESTS_ENABLED)
+
+      ADD_PYTHON_TEST(EXAMPLE_PYTHON_pe_reader_${PE_NAME}
+        ${PYTHON_EXECUTABLE}
+        "${LIEF_EXAMPLES_DIRECTORY}/python/pe_reader.py \
+        ${PE_PATH}")
+    endif()
+  endforeach()
+endif()
+# Python tests
+# ============
+if (PYTHON_TESTS_ENABLED)
+
+  ADD_PYTHON_TEST(EXAMPLE_PYTHON_pe_reader_kernel32
+    ${PYTHON_EXECUTABLE}
+    "${LIEF_EXAMPLES_DIRECTORY}/python/pe_reader.py \
+    ${LIEF_SAMPLES_DIRECTORY}/PE/PE32_x86_library_kernel32.dll")
+
+endif()
+
+
diff --git a/tests/pe/builder.py b/tests/pe/builder.py
new file mode 100644
index 0000000..99facdb
--- /dev/null
+++ b/tests/pe/builder.py
@@ -0,0 +1,14 @@
+#!/usr/bin/env python
+import lief
+import sys
+
+binary = lief.parse(sys.argv[1])
+builder = lief.PE.Builder(binary)
+builder.build_imports(True)
+builder.patch_imports(True)
+builder.build_relocations(False)
+builder.build_tls(False)
+builder.build_resources(False)
+builder.build();
+
+builder.write(sys.argv[2])
diff --git a/tests/pe/test_binary.cpp b/tests/pe/test_binary.cpp
new file mode 100644
index 0000000..c05d909
--- /dev/null
+++ b/tests/pe/test_binary.cpp
@@ -0,0 +1,112 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+#include <yaml-cpp/yaml.h>
+
+#include <LIEF/PE.hpp>
+#include <LIEF/visitors/Hash.hpp>
+
+#include "utils.hpp"
+
+extern const YAML::Node config = YAML::LoadFile(std::string(PATH_TO_CONFIG) + "/config.yaml");
+
+using namespace LIEF::PE;
+
+TEST_CASE("Test parse", "[pe][parser]")
+{
+  using namespace Catch::Generators;
+  std::vector<std::string> pe_files = Test::get_pe_files();
+
+  // Get one
+  std::vector<std::string>::iterator pe_file = between(
+      std::begin(pe_files),
+      std::prev(std::end(pe_files)));
+  const std::string& pe_file_str = *pe_file;
+
+  if (pe_file_str.find("winenotepad.exe") != std::string::npos) {
+    return;
+  }
+
+  if (pe_file_str.find("PE32_x86_binary_winhello-mingw.exe") != std::string::npos) {
+    return;
+  }
+
+  INFO("Binary used: " << pe_file_str);
+
+  std::unique_ptr<Binary> binary_original;
+  try {
+     binary_original = std::unique_ptr<Binary>{Parser::parse(pe_file_str)};
+  } catch (const LIEF::exception& e) {
+    WARN("Can't parse: '" << pe_file_str << "' (" << e.what() << ")");
+    return;
+  }
+
+  std::string output_name = binary_original->name() + "_built_binary";
+
+  Builder builder{binary_original.get()};
+
+  builder.
+    build_imports(true).
+    patch_imports(false).
+    build_relocations(false).
+    build_tls(false).
+    build_resources(false);
+
+  try {
+    builder.build();
+  } catch (const LIEF::exception& e) {
+    FAIL("Can't build: '" << pe_file_str << "' (" << e.what() << ")");
+    return;
+  }
+  builder.write(output_name);
+
+  std::unique_ptr<Binary> binary_built{Parser::parse(output_name)};
+
+  binary_original = std::unique_ptr<Binary>{Parser::parse(pe_file_str)};
+
+  SECTION("Imports") {
+    if (not binary_original->has_imports()) {
+      return;
+    }
+
+    it_imports imports_lhs = binary_original->imports();
+    it_imports imports_rhs = binary_built->imports();
+
+    for (size_t i = 0; i < imports_lhs.size(); ++i) {
+
+      it_import_entries entries_lhs = imports_lhs[i].entries();
+      it_import_entries entries_rhs = imports_rhs[i].entries();
+      for (size_t j = 0; j < entries_lhs.size(); ++j) {
+        if (not entries_lhs[j].is_ordinal()) {
+          INFO("Library: " << imports_lhs[i].name() << ". Function: " << entries_lhs[j].name());
+          try {
+            uint64_t address = binary_original->predict_function_rva(imports_lhs[i].name(), entries_lhs[j].name());
+            CHECK(address == entries_rhs[j].iat_address());
+          } catch (const LIEF::not_supported& e) {
+            WARN(e.what());
+
+          }
+        }
+      }
+    }
+
+
+  }
+
+
+
+}
diff --git a/tests/pe/test_builder.cpp b/tests/pe/test_builder.cpp
new file mode 100644
index 0000000..b0f2a19
--- /dev/null
+++ b/tests/pe/test_builder.cpp
@@ -0,0 +1,198 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+#include <yaml-cpp/yaml.h>
+
+#include <LIEF/PE.hpp>
+#include <LIEF/visitors/Hash.hpp>
+
+#include "utils.hpp"
+
+extern const YAML::Node config = YAML::LoadFile(std::string(PATH_TO_CONFIG) + "/config.yaml");
+
+using namespace LIEF::PE;
+
+TEST_CASE("Test parse", "[pe][builder]")
+{
+
+  using namespace Catch::Generators;
+  std::vector<std::string> pe_files = Test::get_pe_files();
+
+  // Get one
+  std::vector<std::string>::iterator pe_file = between(
+      std::begin(pe_files),
+      std::prev(std::end(pe_files)));
+  const std::string& pe_file_str = *pe_file;
+
+  if (pe_file_str.find("winenotepad.exe") != std::string::npos) {
+    return;
+  }
+
+  if (pe_file_str.find("PE32_x86_binary_winhello-mingw.exe") != std::string::npos) {
+    return;
+  }
+
+  INFO("Binary used: " << pe_file_str);
+
+  std::unique_ptr<Binary> binary_original;
+  try {
+     binary_original = std::unique_ptr<Binary>{Parser::parse(pe_file_str)};
+  } catch (const LIEF::exception& e) {
+    WARN("Can't parse: '" << pe_file_str << "' (" << e.what() << ")");
+    return;
+  }
+
+  std::string output_name = binary_original->name() + "_built";
+
+  Builder builder{binary_original.get()};
+
+  builder.
+    build_imports(true).
+    patch_imports(true).
+    build_relocations(true).
+    build_tls(true).
+    build_resources(true);
+  try {
+    builder.build();
+  } catch (const LIEF::exception& e) {
+    FAIL("Can't build: '" << pe_file_str << "' (" << e.what() << ")");
+    return;
+  }
+  builder.write(output_name);
+
+  std::unique_ptr<Binary> binary_built{Parser::parse(output_name)};
+
+  SECTION("Checks functions") {
+    REQUIRE(binary_original->get_virtual_size() == binary_original->optional_header().sizeof_image());
+    REQUIRE(binary_original->get_sizeof_headers() == binary_original->optional_header().sizeof_headers());
+
+    REQUIRE(binary_original->get_virtual_size() == binary_original->optional_header().sizeof_image());
+    REQUIRE(binary_original->get_sizeof_headers() == binary_original->optional_header().sizeof_headers());
+  }
+
+  SECTION("Dos Header") {
+    REQUIRE(binary_original->dos_header() == binary_built->dos_header());
+  }
+
+
+  SECTION("Header") {
+    REQUIRE(binary_original->header() == binary_built->header());
+  }
+
+
+  SECTION("Optional Header") {
+    REQUIRE(binary_original->optional_header() == binary_built->optional_header());
+  }
+
+  SECTION("Section") {
+
+    for (const Section& section_lhs : binary_original->get_sections()) {
+
+      INFO("Section " << section_lhs.name());
+      const Section& section_rhs = binary_built->get_section(section_lhs.name());
+      REQUIRE(section_lhs.name() == section_rhs.name());
+      REQUIRE(section_lhs.virtual_size() == section_rhs.virtual_size());
+      REQUIRE(section_lhs.virtual_address() == section_rhs.virtual_address());
+      REQUIRE(section_lhs.size() == section_rhs.size());
+      REQUIRE(section_lhs.offset() == section_rhs.offset());
+      REQUIRE(section_lhs.pointerto_relocation() == section_rhs.pointerto_relocation());
+      REQUIRE(LIEF::Hash::hash(section_lhs.content()) == LIEF::Hash::hash(section_rhs.content()));
+    }
+
+
+  }
+
+  SECTION("TLS") {
+    const TLS& tls_lhs = binary_original->tls();
+    const TLS& tls_rhs = binary_built->tls();
+    REQUIRE(tls_lhs.callbacks()           == tls_rhs.callbacks());
+    REQUIRE(tls_lhs.addressof_raw_data()  == tls_rhs.addressof_raw_data());
+    REQUIRE(tls_lhs.addressof_index()     == tls_rhs.addressof_index());
+    REQUIRE(tls_lhs.addressof_callbacks() == tls_rhs.addressof_callbacks());
+    REQUIRE(tls_lhs.sizeof_zero_fill()    == tls_rhs.sizeof_zero_fill());
+    REQUIRE(tls_lhs.characteristics()     == tls_rhs.characteristics());
+    REQUIRE(tls_lhs.data_template()       == tls_rhs.data_template());
+  }
+
+
+  SECTION("Debug") {
+    REQUIRE(binary_original->get_debug() == binary_built->get_debug());
+  }
+
+
+  SECTION("Resources") {
+    if (not binary_original->has_resources()) {
+      return;
+    }
+    const ResourceNode& root_lhs = binary_original->get_resources();
+    const ResourceNode& root_rhs = binary_built->get_resources();
+
+    REQUIRE(root_lhs == root_rhs);
+  }
+
+  SECTION("Relocations") {
+
+    if (not binary_original->has_relocations()) {
+      return;
+    }
+
+    it_relocations relocations_lhs = binary_original->relocations();
+    it_relocations relocations_rhs = binary_built->relocations();
+    REQUIRE(relocations_lhs.size() == relocations_rhs.size());
+
+    for (size_t i = 0; i < relocations_lhs.size(); ++i) {
+      REQUIRE(relocations_lhs[i] == relocations_rhs[i]);
+    }
+  }
+
+
+  SECTION("Imports") {
+    if (not binary_original->has_imports()) {
+      return;
+    }
+
+    it_imports imports_lhs = binary_original->imports();
+    it_imports imports_rhs = binary_built->imports();
+    REQUIRE(imports_lhs.size() == imports_rhs.size());
+
+    for (size_t i = 0; i < imports_lhs.size(); ++i) {
+      REQUIRE(imports_lhs[i].name() == imports_rhs[i].name());
+      REQUIRE(imports_lhs[i].forwarder_chain() == imports_rhs[i].forwarder_chain());
+      REQUIRE(imports_lhs[i].timedatestamp() == imports_rhs[i].timedatestamp());
+
+      it_import_entries entries_lhs = imports_lhs[i].entries();
+      it_import_entries entries_rhs = imports_rhs[i].entries();
+      REQUIRE(entries_lhs.size() == entries_rhs.size());
+      for (size_t j = 0; j < entries_lhs.size(); ++j) {
+        REQUIRE(entries_lhs[j].is_ordinal() == entries_rhs[j].is_ordinal());
+
+        if (entries_lhs[j].is_ordinal()) {
+          REQUIRE(entries_lhs[j].ordinal() == entries_rhs[j].ordinal());
+        } else {
+
+          REQUIRE(entries_lhs[j].hint() == entries_rhs[j].hint());
+          REQUIRE(entries_lhs[j].name() == entries_rhs[j].name());
+        }
+      }
+    }
+
+
+  }
+
+
+
+}
diff --git a/tests/pe/test_equality.cpp b/tests/pe/test_equality.cpp
new file mode 100644
index 0000000..de6bdcf
--- /dev/null
+++ b/tests/pe/test_equality.cpp
@@ -0,0 +1,148 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+#include <yaml-cpp/yaml.h>
+
+#include <LIEF/exception.hpp>
+#include <LIEF/PE.hpp>
+
+#include "utils.hpp"
+
+extern const YAML::Node config = YAML::LoadFile(std::string(PATH_TO_CONFIG) + "/config.yaml");
+
+using namespace LIEF::PE;
+
+TEST_CASE("Test operator== and operator!=", "[pe][internal]") {
+
+  using namespace Catch::Generators;
+  std::vector<std::string> pe_files = Test::get_pe_files();
+
+  // Get one
+  std::vector<std::string>::iterator pe_file = between(
+      std::begin(pe_files),
+      std::prev(std::end(pe_files)));
+
+  INFO("Binary used: " << *pe_file);
+  std::unique_ptr<const Binary> binary_lhs;
+  std::unique_ptr<const Binary> binary_rhs;
+  try {
+     binary_lhs = std::unique_ptr<const Binary>{Parser::parse(*pe_file)};
+     binary_rhs = std::unique_ptr<const Binary>{Parser::parse(*pe_file)};
+  } catch (const LIEF::exception& e) {
+    WARN("Can't parse: '" << *pe_file << "' (" << e.what() << ")");
+    return;
+  }
+
+
+
+  SECTION("DosHeader") {
+    const DosHeader& dos_header_lhs = binary_lhs->dos_header();
+    DosHeader dos_header_rhs = dos_header_lhs;
+    REQUIRE(dos_header_lhs == dos_header_rhs);
+
+    dos_header_rhs.file_size_in_pages(123);
+    REQUIRE(dos_header_lhs != dos_header_rhs);
+  }
+
+  SECTION("Header") {
+    const Header& header_lhs = binary_lhs->header();
+    Header header_rhs = header_lhs;
+    REQUIRE(header_lhs == header_rhs);
+
+    header_rhs.sizeof_optional_header(456);
+    REQUIRE(header_lhs != header_rhs);
+  }
+
+  SECTION("OptionalHeader") {
+    const OptionalHeader& optional_header_lhs = binary_lhs->optional_header();
+    OptionalHeader optional_header_rhs = optional_header_lhs;
+    REQUIRE(optional_header_lhs == optional_header_rhs);
+
+    optional_header_rhs.addressof_entrypoint(0xDEADBEEF);
+    REQUIRE(optional_header_lhs != optional_header_rhs);
+  }
+
+  SECTION("Sections") {
+    for (const Section& section_lhs : binary_lhs->get_sections()) {
+      Section section_rhs = section_lhs;
+      REQUIRE(section_lhs == section_rhs);
+
+      section_rhs.name("toto");
+      REQUIRE(section_lhs != section_rhs);
+    }
+  }
+
+  SECTION("Data Directories") {
+    for (size_t i = 0; i < binary_lhs->data_directories().size(); ++i) {
+      REQUIRE(binary_lhs->data_directories()[i] == binary_rhs->data_directories()[i]);
+    }
+  }
+
+  SECTION("Imports") {
+    if (not binary_lhs->has_imports()) {
+      return;
+    }
+    for (const Import& import_lhs : binary_lhs->imports()) {
+      const Import& import_rhs = import_lhs;
+      REQUIRE(import_lhs == import_rhs);
+    }
+  }
+
+  SECTION("Relocations") {
+    if (not binary_lhs->has_relocations()) {
+      return;
+    }
+
+    for (const Relocation& relocation_lhs : binary_lhs->relocations()) {
+      Relocation relocation_rhs = relocation_lhs;
+      REQUIRE(relocation_lhs == relocation_rhs);
+
+      relocation_rhs.virtual_address(123);
+      REQUIRE(relocation_lhs != relocation_rhs);
+
+    }
+  }
+
+
+  SECTION("Exports") {
+    if (not binary_lhs->has_exports()) {
+      return;
+    }
+
+    const Export& export_lhs = binary_lhs->get_export();
+    const Export& export_rhs = binary_rhs->get_export();
+
+    REQUIRE(export_lhs == export_rhs);
+  }
+
+
+  SECTION("TLS") {
+    if (not binary_lhs->has_tls()) {
+      return;
+    }
+
+    const TLS& tls_lhs = binary_lhs->tls();
+    const TLS& tls_rhs = binary_rhs->tls();
+    REQUIRE(tls_lhs == tls_rhs);
+
+  }
+
+
+
+
+
+}
diff --git a/tests/pe/test_parser.cpp b/tests/pe/test_parser.cpp
new file mode 100644
index 0000000..2f3984b
--- /dev/null
+++ b/tests/pe/test_parser.cpp
@@ -0,0 +1,350 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+#include <yaml-cpp/yaml.h>
+
+#include <LIEF/PE.hpp>
+
+#include "utils.hpp"
+
+extern const YAML::Node config = YAML::LoadFile(std::string(PATH_TO_CONFIG) + "/config.yaml");
+
+using namespace LIEF::PE;
+
+TEST_CASE("Test parse", "[pe][parser]")
+{
+
+  using namespace Catch::Generators;
+  // Get test cases
+  std::vector<std::string> pe_test_cases = Test::get_test_cases();
+
+  // Get one
+  std::vector<std::string>::iterator test_case = between(
+      std::begin(pe_test_cases),
+      std::prev(std::end(pe_test_cases)));
+
+
+  YAML::Node parameters = YAML::LoadFile(config[*test_case]["config_file"].as<std::string>());
+
+  // Parse binary
+  std::unique_ptr<const Binary> binary{Parser::parse(config[*test_case]["binary_path"].as<std::string>())};
+
+  // Raw data
+  std::ifstream binfile(config[*test_case]["binary_path"].as<std::string>(), std::ios::in | std::ios::binary);
+  REQUIRE(binfile);
+  std::vector<uint8_t> raw = {std::istreambuf_iterator<char>(binfile), std::istreambuf_iterator<char>()};
+
+  // Dos Header
+  // ==========
+  SECTION("Dos Header") {
+    REQUIRE(binary->dos_header().magic() == parameters["dos_header"]["e_magic"].as<unsigned int>());
+  }
+
+
+  // Header
+  // ======
+  SECTION("Header") {
+    const Header& header = binary->header();
+    REQUIRE(
+      static_cast<uint32_t>(header.machine()) ==
+      parameters["header"]["Machine"].as<uint32_t>());
+
+    REQUIRE(
+        static_cast<uint16_t>(header.numberof_sections()) ==
+        parameters["header"]["NumberOfSections"].as<uint16_t>());
+
+    REQUIRE(
+        static_cast<uint32_t>(header.time_date_stamp()) ==
+        parameters["header"]["TimeDateStamp"].as<uint32_t>());
+
+    REQUIRE(
+        static_cast<uint32_t>(header.pointerto_symbol_table()) ==
+        parameters["header"]["PointerToSymbolTable"].as<uint32_t>());
+
+    REQUIRE(
+        static_cast<uint32_t>(header.numberof_symbols()) ==
+        parameters["header"]["NumberOfSymbols"].as<uint32_t>());
+
+    REQUIRE(
+        static_cast<uint16_t>(header.sizeof_optional_header()) ==
+        parameters["header"]["SizeOfOptionalHeader"].as<uint16_t>());
+
+    REQUIRE(
+        static_cast<uint16_t>(header.characteristics()) ==
+        parameters["header"]["Characteristics"].as<uint16_t>());
+  }
+
+
+  // Optional Header
+  // ===============
+  SECTION("Optional Header") {
+    const OptionalHeader& optional_header = binary->optional_header();
+
+    REQUIRE(
+        static_cast<uint32_t>(optional_header.magic()) ==
+        parameters["optional_header"]["Magic"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.major_linker_version() ==
+        parameters["optional_header"]["MajorLinkerVersion"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.minor_linker_version() ==
+        parameters["optional_header"]["MinorLinkerVersion"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.sizeof_code() ==
+        parameters["optional_header"]["SizeOfCode"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.sizeof_initialized_data() ==
+        parameters["optional_header"]["SizeOfInitializedData"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.sizeof_uninitialized_data() ==
+        parameters["optional_header"]["SizeOfUninitializedData"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.addressof_entrypoint() ==
+        parameters["optional_header"]["AddressOfEntryPoint"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.baseof_code() ==
+        parameters["optional_header"]["BaseOfCode"].as<uint32_t>());
+
+    if (binary->type() == LIEF::PE::PE_TYPE::PE32) {
+      REQUIRE(
+          optional_header.baseof_data() ==
+          parameters["optional_header"]["BaseOfData"].as<uint32_t>());
+    }
+
+    REQUIRE(
+        optional_header.imagebase() ==
+        parameters["optional_header"]["ImageBase"].as<uint64_t>());
+
+    REQUIRE(
+        optional_header.section_alignment() ==
+        parameters["optional_header"]["SectionAlignment"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.file_alignment() ==
+        parameters["optional_header"]["FileAlignment"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.major_operating_system_version() ==
+        parameters["optional_header"]["MajorOperatingSystemVersion"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.minor_operating_system_version() ==
+        parameters["optional_header"]["MinorOperatingSystemVersion"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.major_image_version() ==
+        parameters["optional_header"]["MajorImageVersion"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.minor_image_version() ==
+        parameters["optional_header"]["MinorImageVersion"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.major_subsystem_version() ==
+        parameters["optional_header"]["MajorSubsystemVersion"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.minor_subsystem_version() ==
+        parameters["optional_header"]["MinorSubsystemVersion"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.win32_version_value() ==
+        parameters["optional_header"]["Reserved1"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.sizeof_image() ==
+        parameters["optional_header"]["SizeOfImage"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.sizeof_headers() ==
+        parameters["optional_header"]["SizeOfHeaders"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.checksum() ==
+        parameters["optional_header"]["CheckSum"].as<uint32_t>());
+
+    REQUIRE(
+        static_cast<uint32_t>(optional_header.subsystem()) ==
+        parameters["optional_header"]["Subsystem"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.dll_characteristics() ==
+        parameters["optional_header"]["DllCharacteristics"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.sizeof_stack_reserve() ==
+        parameters["optional_header"]["SizeOfStackReserve"].as<uint64_t>());
+
+    REQUIRE(
+        optional_header.sizeof_stack_commit() ==
+        parameters["optional_header"]["SizeOfStackCommit"].as<uint64_t>());
+
+    REQUIRE(
+        optional_header.sizeof_heap_reserve() ==
+        parameters["optional_header"]["SizeOfHeapReserve"].as<uint64_t>());
+
+    REQUIRE(
+        optional_header.sizeof_heap_commit() ==
+        parameters["optional_header"]["SizeOfHeapCommit"].as<uint64_t>());
+
+    REQUIRE(
+        optional_header.loader_flags() ==
+        parameters["optional_header"]["LoaderFlags"].as<uint32_t>());
+
+    REQUIRE(
+        optional_header.numberof_rva_and_size() ==
+        parameters["optional_header"]["NumberOfRvaAndSizes"].as<uint32_t>());
+  }
+
+  // Sections
+  // ========
+  SECTION("Section") {
+    it_const_sections sections = binary->get_sections();
+
+    REQUIRE(
+      sections.size() ==
+      parameters["header"]["NumberOfSections"].as<uint16_t>());
+
+    if(parameters["sections"]) {
+      for (size_t i = 0; i < parameters["sections"].size(); ++i) {
+        const Section& section = sections[i];
+        REQUIRE(
+            parameters["sections"][i]["name"].as<std::string>() ==
+            section.name());
+
+        REQUIRE(
+            parameters["sections"][i]["Misc_VirtualSize"].as<uint32_t>() ==
+            section.virtual_size());
+
+        REQUIRE(
+            parameters["sections"][i]["VirtualAddress"].as<uint32_t>() ==
+            section.virtual_address());
+
+        REQUIRE(
+            parameters["sections"][i]["SizeOfRawData"].as<uint32_t>() ==
+            section.sizeof_raw_data());
+
+        REQUIRE(
+            parameters["sections"][i]["PointerToRawData"].as<uint32_t>() ==
+            section.pointerto_raw_data());
+
+        REQUIRE(
+            parameters["sections"][i]["PointerToRelocations"].as<uint32_t>() ==
+            section.pointerto_relocation());
+
+        REQUIRE(
+            parameters["sections"][i]["PointerToLinenumbers"].as<uint32_t>() ==
+            section.pointerto_line_numbers());
+
+        REQUIRE(
+            parameters["sections"][i]["NumberOfRelocations"].as<uint32_t>() ==
+            section.numberof_relocations());
+
+        REQUIRE(
+            parameters["sections"][i]["NumberOfLinenumbers"].as<uint32_t>() ==
+            section.numberof_line_numbers());
+
+        REQUIRE(
+            parameters["sections"][i]["Characteristics"].as<uint32_t>() ==
+            section.characteristics());
+      }
+    }
+  }
+
+
+  // Imports
+  // =======
+  SECTION("Imports") {
+    if (not binary->has_imports()) {
+      return;
+    }
+
+    it_const_imports imports = binary->imports();
+
+    REQUIRE(
+        imports.size() ==
+        parameters["imports"].size());
+
+    for (size_t i = 0; i < parameters["imports"].size(); ++i) {
+      const Import& import = imports[i];
+      it_const_import_entries entries = import.entries();
+
+      REQUIRE(
+          parameters["imports"][i]["name"].as<std::string>() ==
+          import.name());
+
+      REQUIRE(
+          parameters["imports"][i]["entries"].size() ==
+          entries.size());
+
+      for (size_t j = 0; j < parameters["imports"][i]["entries"].size(); ++j) {
+        const ImportEntry& entry = entries[j];
+        if (not parameters["imports"][i]["entries"][j]["name"].IsNull()) {
+          REQUIRE(
+            parameters["imports"][i]["entries"][j]["name"].as<std::string>() ==
+            entry.name());
+        }
+      }
+    }
+  }
+
+  // TLS
+  // ===
+  SECTION("TLS") {
+    if(not binary->has_tls() or not parameters["tls"]) {
+      return;
+    }
+
+    const TLS& tls = binary->tls();
+    REQUIRE(
+        parameters["tls"]["StartAddressOfRawData"].as<uint64_t>() ==
+        tls.addressof_raw_data().first);
+
+    REQUIRE(
+        parameters["tls"]["EndAddressOfRawData"].as<uint64_t>() ==
+        tls.addressof_raw_data().second);
+
+    REQUIRE(
+        parameters["tls"]["AddressOfIndex"].as<uint64_t>() ==
+        tls.addressof_index());
+
+    REQUIRE(
+        parameters["tls"]["AddressOfCallBacks"].as<uint64_t>() ==
+        tls.addressof_callbacks());
+
+    REQUIRE(
+        parameters["tls"]["SizeOfZeroFill"].as<uint64_t>() ==
+        tls.sizeof_zero_fill());
+
+    REQUIRE(
+        parameters["tls"]["Characteristics"].as<uint64_t>() ==
+        tls.characteristics());
+  }
+
+
+
+
+}
+
+
diff --git a/tests/pe/utils.cpp b/tests/pe/utils.cpp
new file mode 100644
index 0000000..f76053b
--- /dev/null
+++ b/tests/pe/utils.cpp
@@ -0,0 +1,89 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <dirent.h>
+#include <iostream>
+#include <yaml-cpp/yaml.h>
+
+#include "utils.hpp"
+
+extern const YAML::Node config;
+
+namespace LIEF {
+namespace PE {
+namespace Test {
+std::vector<std::string> get_test_cases(void) {
+  std::vector<std::string> pe_samples;
+  for (auto it = std::begin(config) ;it != std::end(config); ++it) {
+    std::string key = it->first.as<std::string>();
+    if (config[key]["format"].as<std::string>() == "PE") {
+      pe_samples.push_back(key);
+    }
+  }
+  return pe_samples;
+}
+
+std::vector<std::string> get_binary_test_cases(void) {
+  std::vector<std::string> pe_samples;
+  for (auto it = std::begin(config) ;it != std::end(config); ++it) {
+    std::string key = it->first.as<std::string>();
+    if (config[key]["format"].as<std::string>() == "PE" && config[key]["type"].as<std::string>() == "binary") {
+      pe_samples.push_back(key);
+    }
+  }
+  return pe_samples;
+
+}
+
+std::vector<std::string> get_library_test_cases(void) {
+  std::vector<std::string> pe_samples;
+  for (auto it = std::begin(config) ;it != std::end(config); ++it) {
+    std::string key = it->first.as<std::string>();
+    if (config[key]["format"].as<std::string>() == "PE" && config[key]["type"].as<std::string>() == "library") {
+      pe_samples.push_back(key);
+    }
+  }
+  return pe_samples;
+
+}
+
+std::vector<std::string> get_pe_files(void) {
+  auto endswith = [] (const std::string& string, const std::string& end) {
+    size_t pos = string.rfind(end);
+    return pos != std::string::npos and pos == (string.length() - end.length());
+  };
+  std::vector<std::string> filespath;
+  DIR *dir;
+  struct dirent *ent;
+  std::string samples_path = PATH_TO_SAMPLES;
+  samples_path += "/PE";
+  if ((dir = opendir(samples_path.c_str())) != NULL) {
+    while ((ent = readdir (dir)) != NULL) {
+      const std::string name = ent->d_name;
+      if (endswith(name, ".exe") or endswith(name, ".dll")) {
+        filespath.emplace_back(samples_path + "/" + name);
+      }
+    }
+    closedir (dir);
+  } else {
+    std::cerr << "Can't open '" << samples_path << "'." << std::endl;
+  }
+  return filespath;
+}
+
+
+}
+}
+}
diff --git a/tests/pe/utils.hpp b/tests/pe/utils.hpp
new file mode 100644
index 0000000..6c45c1a
--- /dev/null
+++ b/tests/pe/utils.hpp
@@ -0,0 +1,32 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef LIEF_PE_TEST_UTILS_H_
+#define LIEF_PE_TEST_UTILS_H_
+#include <vector>
+#include <string>
+
+namespace LIEF {
+namespace PE {
+namespace Test {
+std::vector<std::string> get_test_cases(void);
+std::vector<std::string> get_binary_test_cases(void);
+std::vector<std::string> get_library_test_cases(void);
+std::vector<std::string> get_pe_files(void);
+}
+}
+}
+
+#endif
diff --git a/tests/run_python_test.bat.in b/tests/run_python_test.bat.in
new file mode 100644
index 0000000..1519964
--- /dev/null
+++ b/tests/run_python_test.bat.in
@@ -0,0 +1,5 @@
+@echo off
+
+
+set PYTHONPATH=%PYTHONPATH%;@PROJECT_BINARY_DIR@/api/python/release
+%1 %~2
\ No newline at end of file
diff --git a/tests/test_iterators.cpp b/tests/test_iterators.cpp
new file mode 100644
index 0000000..9105ffa
--- /dev/null
+++ b/tests/test_iterators.cpp
@@ -0,0 +1,503 @@
+/* Copyright 2017 R. Thomas
+ * Copyright 2017 Quarkslab
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>
+
+#include <LIEF/iterators.hpp>
+
+using namespace LIEF;
+using it_const_ref_t = const_ref_iterator<std::vector<std::string>>;
+using it_ref_local_t = ref_iterator<std::vector<std::string>>;
+using it_ref_t       = ref_iterator<std::vector<std::string>&>;
+
+using it_const_ref_ptr_t = const_ref_iterator<std::vector<std::string*>>;
+using it_ref_ptr_t       = ref_iterator<std::vector<std::string*>>;
+
+using it_filter_ref          = filter_iterator<std::vector<std::string>&>;
+using it_filter_ref_local_t  = filter_iterator<std::vector<std::string>>;
+using it_filter_ref_ptr      = filter_iterator<std::vector<std::string*>>;
+
+using it_filter_const_ref       = const_filter_iterator<const std::vector<std::string>&>;
+using it_filter_const_ref_local = const_filter_iterator<std::vector<std::string>>;
+using it_filter_const_ref_ptr   = const_filter_iterator<std::vector<std::string*>>;
+
+struct Dummy {
+  Dummy(void) : s_{"dummy"} {}
+  Dummy(const Dummy&) = delete;
+  Dummy& operator=(const Dummy&) = delete;
+  std::string s_;
+};
+
+using it_ref_dummies_t       = ref_iterator<std::vector<Dummy>&>;
+
+struct Foo {
+  Foo(void) : dummies_(10) {
+    bar.push_back("1");
+    bar.push_back("2");
+    bar.push_back("3");
+    bar.push_back("4");
+    bar.push_back("5");
+    bar.push_back("6");
+    bar.push_back("6");
+    bar.push_back("6");
+
+    bar_ptr.push_back(new std::string{"1"});
+    bar_ptr.push_back(new std::string{"2"});
+    bar_ptr.push_back(new std::string{"3"});
+    bar_ptr.push_back(new std::string{"4"});
+    bar_ptr.push_back(new std::string{"5"});
+    bar_ptr.push_back(new std::string{"6"});
+    bar_ptr.push_back(new std::string{"6"});
+  }
+
+  ~Foo(void) {
+    for (std::string* ptr : this->bar_ptr) {
+      delete ptr;
+    }
+  }
+
+  it_const_ref_t get_bar(void) const {
+    return {this->bar};
+  }
+
+
+  it_ref_t get_bar(void) {
+    return {this->bar};
+  }
+
+  it_filter_ref get_bar_filter(void) {
+    return {this->bar, [] (const std::string& v) { return v == "6" or v == "1" or v == "foo"; }};
+  }
+
+
+  it_filter_const_ref get_bar_filter(void) const {
+    return {this->bar, [] (const std::string& v) { return v == "6" or v == "1" or v == "foo"; }};
+  }
+
+
+  it_filter_ref_ptr get_bar_ptr_filter(void) {
+    return {this->bar_ptr, [] (const std::string* v) { return *v == "6"; }};
+  }
+
+  it_filter_const_ref_ptr get_bar_ptr_filter(void) const {
+    return {this->bar_ptr, [] (const std::string* v) { return *v == "6"; }};
+  }
+
+
+  it_ref_local_t get_bar_local(void) {
+    std::vector<std::string> local = {"a", "b", "c"};
+    return {local};
+  }
+
+
+  it_filter_const_ref_local get_bar_const_filter_local(void) const {
+    std::vector<std::string> local = {"a", "b", "c", "a", "a"};
+    return {local, [] (const std::string& v) { return v == "a"; }};
+  }
+
+
+
+  it_ref_dummies_t get_dummies(void) {
+    return {this->dummies_};
+  }
+
+  it_const_ref_ptr_t get_bar_ptr(void) const {
+    return {bar_ptr};
+  }
+
+  it_ref_ptr_t get_bar_ptr(void) {
+    return {bar_ptr};
+  }
+
+  std::vector<Dummy> dummies_;
+  std::vector<std::string> bar;
+  std::vector<std::string*> bar_ptr;
+};
+
+
+TEST_CASE("Test const ref iterators", "[lief][iterators][const_ref]") {
+
+  const Foo foo;
+
+  SECTION("operator++") {
+    it_const_ref_t bars = foo.get_bar();
+    REQUIRE(*(bars++) == "1");
+    REQUIRE(*bars == "2");
+  }
+
+
+  SECTION("operator++(int)") {
+    it_const_ref_t bars = foo.get_bar();
+    REQUIRE(*(++bars) == "2");
+    REQUIRE(*(++bars) == "3");
+    REQUIRE(*(++bars) == "4");
+  }
+
+
+  SECTION("operator--") {
+    it_const_ref_t bars = foo.get_bar();
+    ++bars;
+    REQUIRE(*(bars--) == "2");
+    REQUIRE(*bars == "1");
+  }
+
+
+  SECTION("operator--(int)") {
+    it_const_ref_t bars = foo.get_bar();
+
+    ++bars;
+    REQUIRE(*(--bars) == "1");
+    REQUIRE(*bars == "1");
+  }
+
+
+  SECTION("operator+=") {
+    it_const_ref_t bars = foo.get_bar();
+    bars += 2;
+    REQUIRE(*bars == "3");
+  }
+
+
+  SECTION("operator-=") {
+    it_const_ref_t bars = foo.get_bar();
+    bars += 4;
+    REQUIRE(*bars == "5");
+
+    bars -= 2;
+    REQUIRE(*bars == "3");
+  }
+
+  SECTION("operator[]") {
+    it_const_ref_t bars = foo.get_bar();
+    REQUIRE(bars[4] == "5");
+  }
+
+
+  SECTION("operator+") {
+    it_const_ref_t bars = foo.get_bar();
+    REQUIRE(*(bars + 5) == "6");
+  }
+
+
+  SECTION("operator-") {
+    it_const_ref_t bars = foo.get_bar();
+    bars += 4;
+    REQUIRE(*(bars - 1) == "4");
+  }
+
+
+  SECTION("Comparaisons") {
+    it_const_ref_t bars_lhs = foo.get_bar();
+    it_const_ref_t bars_rhs = foo.get_bar();
+    REQUIRE(bars_lhs == bars_rhs);
+    REQUIRE(std::begin(bars_lhs) == std::begin(bars_rhs));
+    REQUIRE(std::end(bars_lhs) == std::end(bars_rhs));
+    REQUIRE(std::end(bars_lhs) != std::begin(bars_rhs));
+
+    REQUIRE((bars_lhs + 5) == (bars_rhs + 5));
+    REQUIRE((bars_lhs + 5) != (bars_rhs + 6));
+
+    it_const_ref_t it1 = bars_lhs + 5;
+    it_const_ref_t it2 = bars_rhs + 4;
+
+    REQUIRE(it1 != it2);
+    REQUIRE((it1 - 1) == it2);
+    REQUIRE((it1 - it2) == 1);
+
+    REQUIRE(it1 > it2);
+    REQUIRE(it1 >= it1);
+
+
+    REQUIRE(it2 < it1);
+    REQUIRE(it2 <= it2);
+  }
+
+
+  SECTION("Internal management") {
+    it_const_ref_t bars = foo.get_bar();
+    it_const_ref_ptr_t bars_ptr = foo.get_bar_ptr();
+
+    REQUIRE(bars.size() == foo.bar.size());
+    REQUIRE(bars_ptr.size() == foo.bar_ptr.size());
+    REQUIRE(*bars_ptr == "1");
+    REQUIRE(std::string(bars_ptr->c_str()) == "1");
+    REQUIRE(bars_ptr[2] == "3");
+
+    REQUIRE(std::string(bars->c_str()) == "1");
+    REQUIRE(std::string(bars_ptr->c_str()) == "1");
+    size_t count = std::count_if(
+      std::begin(bars),
+      std::end(bars),
+      [] (const std::string& s) {
+        return s == "6";
+      });
+
+    REQUIRE(count == 3);
+
+    it_const_ref_t bar_operator_equal{bars};
+    bar_operator_equal += 2;
+    bar_operator_equal.operator=(bars);
+    REQUIRE(bar_operator_equal == bars);
+
+  }
+}
+
+TEST_CASE("Test ref iterators", "[lief][iterators][ref]") {
+  Foo foo;
+
+  SECTION("operator++") {
+    it_ref_t bars = foo.get_bar();
+    REQUIRE(*(bars++) == "1");
+    REQUIRE(*bars == "2");
+  }
+
+  SECTION("operator++(int)") {
+    it_ref_t bars = foo.get_bar();
+    REQUIRE(*(++bars) == "2");
+    REQUIRE(*(++bars) == "3");
+    REQUIRE(*(++bars) == "4");
+  }
+
+
+  SECTION("operator--") {
+    it_ref_t bars = foo.get_bar();
+    ++bars;
+    REQUIRE(*(bars--) == "2");
+    REQUIRE(*bars == "1");
+  }
+
+
+  SECTION("operator--(int)") {
+    it_ref_t bars = foo.get_bar();
+
+    ++bars;
+    REQUIRE(*(--bars) == "1");
+    REQUIRE(*bars == "1");
+  }
+
+
+  SECTION("operator+=") {
+    it_ref_t bars = foo.get_bar();
+    bars += 2;
+    REQUIRE(*bars == "3");
+  }
+
+
+  SECTION("operator-=") {
+    it_ref_t bars = foo.get_bar();
+    bars += 4;
+    REQUIRE(*bars == "5");
+
+    bars -= 2;
+    REQUIRE(*bars == "3");
+  }
+
+  SECTION("operator[]") {
+    it_ref_t bars = foo.get_bar();
+    REQUIRE(bars[4] == "5");
+  }
+
+
+  SECTION("operator+") {
+    it_ref_t bars = foo.get_bar();
+    REQUIRE(*(bars + 5) == "6");
+  }
+
+
+  SECTION("operator-") {
+    it_ref_t bars = foo.get_bar();
+    bars += 4;
+    REQUIRE(*(bars - 1) == "4");
+  }
+
+
+  SECTION("Comparaisons") {
+    it_ref_t bars_lhs = foo.get_bar();
+    it_ref_t bars_rhs = foo.get_bar();
+    REQUIRE(bars_lhs == bars_rhs);
+    REQUIRE(std::begin(bars_lhs) == std::begin(bars_lhs));
+    REQUIRE(std::end(bars_lhs) == std::end(bars_lhs));
+
+    REQUIRE(std::begin(bars_lhs) == std::begin(bars_rhs));
+    REQUIRE(std::end(bars_lhs) == std::end(bars_rhs));
+    REQUIRE(std::end(bars_lhs) != std::begin(bars_rhs));
+
+    REQUIRE((bars_lhs + 5) == (bars_rhs + 5));
+    REQUIRE((bars_lhs + 5) != (bars_rhs + 6));
+
+    it_ref_t it1 = bars_lhs + 5;
+    it_ref_t it2 = bars_rhs + 4;
+
+    REQUIRE(it1 != it2);
+    REQUIRE((it1 - 1) == it2);
+    REQUIRE((it1 - it2) == 1);
+
+    REQUIRE(it1 > it2);
+    REQUIRE(it1 >= it1);
+
+
+    REQUIRE(it2 < it1);
+    REQUIRE(it2 <= it2);
+  }
+
+
+  SECTION("Internal management") {
+    it_ref_t bars = foo.get_bar();
+    it_ref_ptr_t bars_ptr = foo.get_bar_ptr();
+
+    REQUIRE(bars.size() == foo.bar.size());
+    REQUIRE(bars_ptr.size() == foo.bar_ptr.size());
+    REQUIRE(*bars_ptr == "1");
+    REQUIRE(std::string(bars_ptr->c_str()) == "1");
+    REQUIRE(bars_ptr[2] == "3");
+
+    REQUIRE(std::string(bars->c_str()) == "1");
+    REQUIRE(std::string(bars_ptr->c_str()) == "1");
+    size_t count = std::count_if(
+      std::begin(bars),
+      std::end(bars),
+      [] (const std::string& s) {
+        return s == "6";
+      });
+
+    REQUIRE(count == 3);
+
+    it_ref_t bar_operator_equal{bars};
+    bar_operator_equal += 2;
+    bar_operator_equal.operator=(bars);
+    REQUIRE(bar_operator_equal == bars);
+
+    std::string& first_one_ptr = *bars_ptr;
+    first_one_ptr = "123456";
+    REQUIRE(foo.get_bar_ptr()[0] == "123456");
+
+
+    *foo.get_bar() = "123456";
+    CHECK(*foo.get_bar() == "123456");
+    auto&& dummies = foo.get_dummies();
+    Dummy& d = dummies[0];
+    d.s_ = "zigzag";
+
+    CHECK(foo.get_dummies()->s_ == "zigzag");
+
+
+    it_ref_local_t local = foo.get_bar_local();
+    CHECK(*local == "a");
+    CHECK(std::begin(local) == std::begin(local));
+    CHECK(std::end(local) == std::end(local));
+
+  }
+}
+
+
+TEST_CASE("Test filter ref iterators", "[lief][iterators][filter][ref]") {
+  Foo foo;
+
+  SECTION("operator++") {
+
+    it_filter_ref bar_filtred         = foo.get_bar_filter();
+    it_filter_ref_ptr bar_ptr_filtred = foo.get_bar_ptr_filter();
+
+    CHECK(std::begin(bar_filtred) == std::begin(bar_filtred));
+
+    CHECK(*bar_filtred     == "1");
+    CHECK(*(++bar_filtred) == "6");
+    CHECK(*(bar_filtred++) == "6");
+    CHECK(*(++bar_filtred) == "6");
+    CHECK(*(bar_filtred++) == "6");
+
+    CHECK(bar_filtred == std::end(bar_filtred));
+
+  }
+
+  SECTION("size()") {
+
+    it_filter_ref bar_filtred         = foo.get_bar_filter();
+    it_filter_ref_ptr bar_ptr_filtred = foo.get_bar_ptr_filter();
+
+    CHECK(bar_filtred.size() == 4);
+    CHECK(bar_ptr_filtred.size() == 2);
+  }
+
+
+  SECTION("operator[]") {
+
+    it_filter_ref bar_filtred         = foo.get_bar_filter();
+    it_filter_ref_ptr bar_ptr_filtred = foo.get_bar_ptr_filter();
+
+    CHECK(bar_filtred[0] == "1");
+  }
+
+
+  SECTION("Internal management") {
+    it_filter_ref bar_filtred         = foo.get_bar_filter();
+    it_filter_ref_ptr bar_ptr_filtred = foo.get_bar_ptr_filter();
+
+    bar_ptr_filtred[1] = "7";
+    bar_filtred[0] = "foo";
+
+    CHECK(foo.get_bar_filter()[0] == "foo");
+    CHECK(foo.get_bar_ptr_filter().size() == 1);
+  }
+
+}
+
+TEST_CASE("Test const filter ref iterators", "[lief][iterators][filter][const_ref]") {
+  const Foo foo;
+
+  SECTION("operator++") {
+
+    it_filter_const_ref     bar_filtred     = foo.get_bar_filter();
+    it_filter_const_ref_ptr bar_ptr_filtred = foo.get_bar_ptr_filter();
+
+    CHECK(std::begin(bar_filtred) == std::begin(bar_filtred));
+
+    CHECK(*bar_filtred     == "1");
+    CHECK(*(++bar_filtred) == "6");
+    CHECK(*(bar_filtred++) == "6");
+    CHECK(*(++bar_filtred) == "6");
+    CHECK(*(bar_filtred++) == "6");
+
+    CHECK(bar_filtred == std::end(bar_filtred));
+
+  }
+
+  SECTION("size()") {
+
+    it_filter_const_ref     bar_filtred     = foo.get_bar_filter();
+    it_filter_const_ref_ptr bar_ptr_filtred = foo.get_bar_ptr_filter();
+
+    CHECK(bar_filtred.size() == 4);
+    CHECK(bar_ptr_filtred.size() == 2);
+  }
+
+
+  SECTION("operator[]") {
+
+    it_filter_const_ref     bar_filtred     = foo.get_bar_filter();
+    it_filter_const_ref_ptr bar_ptr_filtred = foo.get_bar_ptr_filter();
+
+    CHECK(bar_filtred[0] == "1");
+  }
+
+
+  SECTION("local") {
+    it_filter_const_ref_local bar_ptr_filtred = foo.get_bar_const_filter_local();
+    CHECK(bar_ptr_filtred.size() == 3);
+
+  }
+
+}