[vlc-devel] [PATCH 04/15] http: modern redesign

David Loiret loiret.d at gmail.com
Tue Jun 23 14:42:39 CEST 2020


From: Gautam Chitnis <chitnis.gautam1 at gmail.com>

---
 share/Makefile.am                             |  184 +-
 share/js.manifest.txt                         |   15 +
 share/js.vendors_manifest.txt                 |    5 +
 share/lua/.gitignore                          |    5 +
 share/lua/http/body.html                      |   32 +
 share/lua/http/css/main.css                   |  260 -
 share/lua/http/css/mobile.css                 |  186 -
 .../ui-bg_diagonals-thick_18_b81900_40x40.png |  Bin 201 -> 0 bytes
 .../ui-bg_diagonals-thick_20_666666_40x40.png |  Bin 197 -> 0 bytes
 .../images/ui-bg_flat_10_000000_40x100.png    |  Bin 147 -> 0 bytes
 .../images/ui-bg_glass_100_f6f6f6_1x400.png   |  Bin 103 -> 0 bytes
 .../images/ui-bg_glass_100_fdf5ce_1x400.png   |  Bin 115 -> 0 bytes
 .../images/ui-bg_glass_65_ffffff_1x400.png    |  Bin 95 -> 0 bytes
 .../ui-bg_gloss-wave_35_f6a828_500x100.png    |  Bin 2627 -> 0 bytes
 .../ui-bg_highlight-soft_100_eeeeee_1x100.png |  Bin 88 -> 0 bytes
 .../ui-bg_highlight-soft_75_ffe45c_1x100.png  |  Bin 126 -> 0 bytes
 .../images/ui-icons_222222_256x240.png        |  Bin 4194 -> 0 bytes
 .../images/ui-icons_228ef1_256x240.png        |  Bin 5103 -> 0 bytes
 .../images/ui-icons_ef8c08_256x240.png        |  Bin 4194 -> 0 bytes
 .../images/ui-icons_ffd27a_256x240.png        |  Bin 4194 -> 0 bytes
 .../images/ui-icons_ffffff_256x240.png        |  Bin 4194 -> 0 bytes
 .../ui-lightness/jquery-ui-1.8.13.custom.css  |  581 ---
 share/lua/http/dialogs/batch_window.html      |   32 -
 share/lua/http/dialogs/browse_window.html     |   44 -
 share/lua/http/dialogs/create_stream.html     |  394 --
 share/lua/http/dialogs/equalizer_window.html  |   54 -
 share/lua/http/dialogs/error_window.html      |   19 -
 share/lua/http/dialogs/mosaic_window.html     |  146 -
 share/lua/http/dialogs/offset_window.html     |   79 -
 .../http/dialogs/stream_config_window.html    |   40 -
 share/lua/http/dialogs/stream_window.html     |   99 -
 share/lua/http/foot.html                      |    1 +
 share/lua/http/head.html                      |   13 +
 share/lua/http/images/Audio-48.png            |  Bin 4675 -> 0 bytes
 share/lua/http/images/Back-48.png             |  Bin 2025 -> 0 bytes
 share/lua/http/images/Folder-48.png           |  Bin 1353 -> 0 bytes
 share/lua/http/images/Other-48.png            |  Bin 2921 -> 0 bytes
 share/lua/http/images/Video-48.png            |  Bin 5115 -> 0 bytes
 share/lua/http/images/buttons.png             |  Bin 11954 -> 0 bytes
 share/lua/http/images/speaker-32.png          |  Bin 942 -> 0 bytes
 share/lua/http/images/vlc-48.png              |  Bin 15875 -> 0 bytes
 share/lua/http/images/vlc16x16.png            |  Bin 606 -> 0 bytes
 share/lua/http/index.html                     |  515 +-
 share/lua/http/js/common.js                   |   93 -
 share/lua/http/js/controllers.js              |  529 --
 share/lua/http/js/jquery.jstree.js            | 4544 -----------------
 share/lua/http/js/ui.js                       |  118 -
 share/lua/http/mobile.html                    |  112 -
 share/lua/http/mobile_browse.html             |   53 -
 share/lua/http/mobile_equalizer.html          |   69 -
 share/lua/http/mobile_view.html               |   56 -
 .../controls/filebrowser.component.html       |   18 +
 .../controls/filebrowser.component.js         |   83 +
 .../controls/sidenav.component.html           |   31 +
 .../components/controls/sidenav.component.js  |   26 +
 .../controls/sidenav.component.scss           |   50 +
 .../equalizer/equalizer.component.html        |   20 +
 .../equalizer/equalizer.component.js          |   22 +
 .../components/player/player.component.scss   |   19 +
 .../components/player/plyr.lib.custom.scss    |  758 +++
 .../src/components/player/plyr.lib.vars.scss  |   71 +
 .../src/components/player/plyr.methods.js     |   41 +
 .../playlist/buttons.playlist.component.html  |   16 +
 .../playlist/buttons.playlist.component.js    |   35 +
 .../playlist/playlist.component.html          |   27 +
 .../components/playlist/playlist.component.js |  102 +
 .../playlist/playlist.component.scss          |   93 +
 .../sot/stream.manager.component.html         |   18 +
 .../sot/stream.manager.component.js           |    8 +
 .../svg-icon/svg-icon.component.html          |    3 +
 .../components/svg-icon/svg-icon.component.js |  174 +
 .../svg-icon/svg-icon.component.scss          |   31 +
 .../tracksync.component.html                  |   29 +
 .../tracksync.component.js                    |   43 +
 .../src/components/vlm/vlm.component.html     |   24 +
 .../http/src/components/vlm/vlm.component.js  |   17 +
 .../src/components/vlm/vlm.component.scss     |    3 +
 share/lua/http/src/scss/bootstrap.scss        |   40 +
 share/lua/http/src/scss/components.scss       |    8 +
 share/lua/http/src/scss/main.scss             |   15 +
 share/lua/http/src/scss/mixins.util.scss      |   37 +
 share/lua/http/src/scss/vendors.scss          |    2 +
 share/lua/http/src/services/bus.service.js    |    5 +
 .../lua/http/src/services/command.service.js  |   28 +
 .../http/src/services/initialize.service.js   |   79 +
 share/lua/http/view.html                      |   82 -
 share/lua/http/vlm.html                       |   47 -
 share/lua/http/vlm_export.html                |   12 -
 88 files changed, 2401 insertions(+), 7994 deletions(-)
 create mode 100644 share/js.manifest.txt
 create mode 100644 share/js.vendors_manifest.txt
 create mode 100644 share/lua/http/body.html
 delete mode 100644 share/lua/http/css/main.css
 delete mode 100644 share/lua/http/css/mobile.css
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-icons_222222_256x240.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-icons_228ef1_256x240.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
 delete mode 100644 share/lua/http/css/ui-lightness/images/ui-icons_ffffff_256x240.png
 delete mode 100644 share/lua/http/css/ui-lightness/jquery-ui-1.8.13.custom.css
 delete mode 100644 share/lua/http/dialogs/batch_window.html
 delete mode 100644 share/lua/http/dialogs/browse_window.html
 delete mode 100644 share/lua/http/dialogs/create_stream.html
 delete mode 100755 share/lua/http/dialogs/equalizer_window.html
 delete mode 100644 share/lua/http/dialogs/error_window.html
 delete mode 100644 share/lua/http/dialogs/mosaic_window.html
 delete mode 100644 share/lua/http/dialogs/offset_window.html
 delete mode 100644 share/lua/http/dialogs/stream_config_window.html
 delete mode 100644 share/lua/http/dialogs/stream_window.html
 create mode 100644 share/lua/http/foot.html
 create mode 100644 share/lua/http/head.html
 delete mode 100644 share/lua/http/images/Audio-48.png
 delete mode 100644 share/lua/http/images/Back-48.png
 delete mode 100644 share/lua/http/images/Folder-48.png
 delete mode 100644 share/lua/http/images/Other-48.png
 delete mode 100644 share/lua/http/images/Video-48.png
 delete mode 100644 share/lua/http/images/buttons.png
 delete mode 100644 share/lua/http/images/speaker-32.png
 delete mode 100644 share/lua/http/images/vlc-48.png
 delete mode 100644 share/lua/http/images/vlc16x16.png
 delete mode 100644 share/lua/http/js/common.js
 delete mode 100644 share/lua/http/js/controllers.js
 delete mode 100644 share/lua/http/js/jquery.jstree.js
 delete mode 100644 share/lua/http/js/ui.js
 delete mode 100644 share/lua/http/mobile.html
 delete mode 100644 share/lua/http/mobile_browse.html
 delete mode 100644 share/lua/http/mobile_equalizer.html
 delete mode 100644 share/lua/http/mobile_view.html
 create mode 100644 share/lua/http/src/components/controls/filebrowser.component.html
 create mode 100644 share/lua/http/src/components/controls/filebrowser.component.js
 create mode 100644 share/lua/http/src/components/controls/sidenav.component.html
 create mode 100644 share/lua/http/src/components/controls/sidenav.component.js
 create mode 100644 share/lua/http/src/components/controls/sidenav.component.scss
 create mode 100644 share/lua/http/src/components/equalizer/equalizer.component.html
 create mode 100644 share/lua/http/src/components/equalizer/equalizer.component.js
 create mode 100644 share/lua/http/src/components/player/player.component.scss
 create mode 100644 share/lua/http/src/components/player/plyr.lib.custom.scss
 create mode 100644 share/lua/http/src/components/player/plyr.lib.vars.scss
 create mode 100644 share/lua/http/src/components/player/plyr.methods.js
 create mode 100644 share/lua/http/src/components/playlist/buttons.playlist.component.html
 create mode 100644 share/lua/http/src/components/playlist/buttons.playlist.component.js
 create mode 100644 share/lua/http/src/components/playlist/playlist.component.html
 create mode 100644 share/lua/http/src/components/playlist/playlist.component.js
 create mode 100644 share/lua/http/src/components/playlist/playlist.component.scss
 create mode 100644 share/lua/http/src/components/sot/stream.manager.component.html
 create mode 100644 share/lua/http/src/components/sot/stream.manager.component.js
 create mode 100644 share/lua/http/src/components/svg-icon/svg-icon.component.html
 create mode 100644 share/lua/http/src/components/svg-icon/svg-icon.component.js
 create mode 100644 share/lua/http/src/components/svg-icon/svg-icon.component.scss
 create mode 100644 share/lua/http/src/components/track-synchronisation/tracksync.component.html
 create mode 100644 share/lua/http/src/components/track-synchronisation/tracksync.component.js
 create mode 100644 share/lua/http/src/components/vlm/vlm.component.html
 create mode 100644 share/lua/http/src/components/vlm/vlm.component.js
 create mode 100644 share/lua/http/src/components/vlm/vlm.component.scss
 create mode 100644 share/lua/http/src/scss/bootstrap.scss
 create mode 100644 share/lua/http/src/scss/components.scss
 create mode 100644 share/lua/http/src/scss/main.scss
 create mode 100644 share/lua/http/src/scss/mixins.util.scss
 create mode 100644 share/lua/http/src/scss/vendors.scss
 create mode 100644 share/lua/http/src/services/bus.service.js
 create mode 100644 share/lua/http/src/services/command.service.js
 create mode 100644 share/lua/http/src/services/initialize.service.js
 delete mode 100644 share/lua/http/view.html
 delete mode 100644 share/lua/http/vlm.html
 delete mode 100644 share/lua/http/vlm_export.html

diff --git a/share/Makefile.am b/share/Makefile.am
index 0e6fd55dcb..49db4aafd9 100644
--- a/share/Makefile.am
+++ b/share/Makefile.am
@@ -1,7 +1,29 @@
+all: js css html preserve
+
 CLEANFILES = skins2/default.vlt
 MOSTLYCLEANFILES =
 EXTRA_DIST =
 
+JS_TARGETS = $(shell cat js.manifest.txt)
+JS_VENDORS_TARGETS = $(shell cat js.vendors_manifest.txt)
+CLOSURE = java -jar ../extras/tools/closure_compiler.jar
+CLOSURE_FLAGS =
+JS_DIST_DIR := lua/http/dist/js
+FRONT_INDEX = lua/http/index.html
+FRONT_HEAD = lua/http/head.html
+FRONT_BODY = lua/http/body.html
+FRONT_FOOT = lua/http/foot.html
+
+MKDIR_P := mkdir -p
+
+SASS_TARGETS = lua/http/src/scss/main.scss
+SASS_VENDORS_TARGETS = lua/http/src/scss/vendors.scss
+SASS_DIST_DIR = lua/http/dist/css
+SASSC = sassc $(SASS_TARGETS) $(SASS_DIST_DIR)/style.css
+SASSC_FLAGS =
+SASSC_VENDORS = sassc $(SASS_VENDORS_TARGETS) $(SASS_DIST_DIR)/vendors.min.css --style compressed
+SASSC_VENDORS_FLAGS = -I lua/http/src/vendors/bootstrap/stylesheets/
+
 desktopdir = $(datadir)/applications
 if !HAVE_WIN32
 if !HAVE_DARWIN
@@ -121,6 +143,26 @@ luac_verbose_0 = @echo "  LUAC   $@";
 	$(AM_V_at)mkdir -p "$$(dirname '$@')"
 	$(luac_verbose)$(LUAC) -o $@ $<
 
+js:
+	${MKDIR_P} $(JS_DIST_DIR)
+	$(CLOSURE) $(JS_VENDORS_TARGETS) $(CLOSURE_FLAGS) $<
+	$(CLOSURE) $(JS_TARGETS) $(CLOSURE_FLAGS) $<
+
+css:
+	${MKDIR_P} $(SASS_DIST_DIR)
+	$(SASSC_VENDORS) $(SASSC_VENDORS_FLAGS) $<
+	$(SASSC) $(SASSC_FLAGS) $<
+
+html:
+	cat $(FRONT_HEAD) $(FRONT_BODY) > $(FRONT_INDEX)
+	find lua/http -name '*.component.html' -print | xargs cat >> $(FRONT_INDEX)
+	cat $(FRONT_FOOT) >> $(FRONT_INDEX)
+
+preserve:
+	cp -r lua/http/src/vendors lua/http/dist/
+	cp -r lua/http/src/assets lua/http/dist/
+	cp -r icons/ lua/http/dist/assets/vlc-icons
+
 if BUILD_LUA
 nobase_pkglibexec_SCRIPTS += \
 	lua/extensions/VLSub.luac \
@@ -181,68 +223,90 @@ nobase_doc_DATA = \
 	lua/sd/icast.lua \
 	$(NULL)
 
-nobase_dist_pkgdata_DATA += \
-	lua/http/view.html \
-	lua/http/mobile.html \
-	lua/http/dialogs/create_stream.html \
-	lua/http/dialogs/equalizer_window.html \
-	lua/http/dialogs/mosaic_window.html \
-	lua/http/dialogs/batch_window.html \
-	lua/http/dialogs/error_window.html \
-	lua/http/dialogs/browse_window.html \
-	lua/http/dialogs/stream_window.html \
-	lua/http/dialogs/offset_window.html \
-	lua/http/dialogs/stream_config_window.html \
+if BUILD_HTTPD
+nobase_vlclib_DATA += \
+	lua/intf/http.luac \
+	lua/intf/modules/httprequests.luac \
+	$(NULL)
+nobase_vlcdata_DATA += $(DIST_http_lua)
+nobase_doc_DATA += lua/http/requests/README.txt
+endif
+endif
+MOSTLYCLEANFILES += $(nobase_vlclib_DATA)
+
+EXTRA_DIST += \
+	lua/README.txt \
+	lua/extensions/README.txt \
+	lua/extensions/VLSub.lua \
+	lua/intf/README.txt \
+	lua/intf/cli.lua \
+	lua/intf/dummy.lua \
+	lua/intf/dumpmeta.lua \
+	lua/intf/http.lua \
+	lua/intf/luac.lua \
+	lua/intf/modules/host.lua \
+	lua/intf/modules/httprequests.lua \
+	lua/intf/telnet.lua \
+	lua/meta/README.txt \
+	lua/meta/art/README.txt \
+	lua/meta/art/02_frenchtv.lua \
+	lua/meta/art/03_lastfm.lua \
+	lua/meta/art/01_googleimage.lua \
+	lua/meta/art/00_musicbrainz.lua \
+	lua/meta/fetcher/README.txt \
+	lua/meta/reader/README.txt \
+	lua/meta/reader/filename.lua \
+	lua/modules/common.lua \
+	lua/modules/dkjson.lua \
+	lua/modules/sandbox.lua \
+	lua/modules/simplexml.lua \
+	lua/playlist/README.txt \
+	lua/playlist/anevia_streams.lua \
+	lua/playlist/anevia_xml.lua \
+	lua/playlist/appletrailers.lua \
+	lua/playlist/bbc_co_uk.lua \
+	lua/playlist/break.lua \
+	lua/playlist/canalplus.lua \
+	lua/playlist/cue.lua \
+	lua/playlist/dailymotion.lua \
+	lua/playlist/extreme.lua \
+	lua/playlist/france2.lua \
+	lua/playlist/jamendo.lua \
+	lua/playlist/katsomo.lua \
+	lua/playlist/koreus.lua \
+	lua/playlist/lelombrik.lua \
+	lua/playlist/liveleak.lua \
+	lua/playlist/metacafe.lua \
+	lua/playlist/mpora.lua \
+	lua/playlist/newgrounds.lua \
+	lua/playlist/pinkbike.lua \
+	lua/playlist/pluzz.lua \
+	lua/playlist/rockbox_fm_presets.lua \
+	lua/playlist/soundcloud.lua \
+	lua/playlist/vimeo.lua \
+	lua/playlist/vocaroo.lua \
+	lua/playlist/youtube.lua \
+	lua/playlist/zapiks.lua \
+	lua/sd/README.txt \
+	lua/sd/fmc.lua \
+	lua/sd/icecast.lua \
+	lua/sd/icast.lua \
+	lua/sd/jamendo.lua
+
+DIST_http_lua = \
+	lua/http/requests/playlist.xml \
+    lua/http/requests/playlist.json \
+    lua/http/requests/README.txt \
+    lua/http/requests/playlist_jstree.xml \
+    lua/http/requests/browse.xml \
+    lua/http/requests/browse.json \
+    lua/http/requests/vlm_cmd.xml \
+    lua/http/requests/status.xml \
+    lua/http/requests/status.json \
+    lua/http/requests/vlm.xml \
 	lua/http/custom.lua \
-	lua/http/vlm.html \
-	lua/http/images/buttons.png \
-	lua/http/images/speaker-32.png \
-	lua/http/images/vlc-48.png \
-	lua/http/images/Audio-48.png \
-	lua/http/images/Folder-48.png \
-	lua/http/images/Other-48.png \
-	lua/http/images/Back-48.png \
-	lua/http/images/Video-48.png \
-	lua/http/images/vlc16x16.png \
-	lua/http/mobile_equalizer.html \
-	lua/http/vlm_export.html \
-	lua/http/mobile_browse.html \
 	lua/http/favicon.ico \
-	lua/http/mobile_view.html \
-	lua/http/requests/playlist.xml \
-	lua/http/requests/playlist.json \
-	lua/http/requests/README.txt \
-	lua/http/requests/playlist_jstree.xml \
-	lua/http/requests/browse.xml \
-	lua/http/requests/browse.json \
-	lua/http/requests/vlm_cmd.xml \
-	lua/http/requests/status.xml \
-	lua/http/requests/status.json \
-	lua/http/requests/vlm.xml \
-	lua/http/index.html \
-	lua/http/css/ui-lightness/jquery-ui-1.8.13.custom.css \
-	lua/http/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png \
-	lua/http/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png \
-	lua/http/css/ui-lightness/images/ui-icons_ffffff_256x240.png \
-	lua/http/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png \
-	lua/http/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png \
-	lua/http/css/ui-lightness/images/ui-icons_222222_256x240.png \
-	lua/http/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png \
-	lua/http/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png \
-	lua/http/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png \
-	lua/http/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png \
-	lua/http/css/ui-lightness/images/ui-icons_ffd27a_256x240.png \
-	lua/http/css/ui-lightness/images/ui-icons_228ef1_256x240.png \
-	lua/http/css/ui-lightness/images/ui-icons_ef8c08_256x240.png \
-	lua/http/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png \
-	lua/http/css/main.css \
-	lua/http/css/mobile.css \
-	lua/http/js/ui.js \
-	lua/http/js/common.js \
-	lua/http/js/jquery.jstree.js \
-	lua/http/js/controllers.js
-endif
-MOSTLYCLEANFILES += $(nobase_pkgdata_DATA)
+	lua/http/index.html
 
 EXTRA_DIST += \
 	lua/README.txt \
diff --git a/share/js.manifest.txt b/share/js.manifest.txt
new file mode 100644
index 0000000000..e89ab00aeb
--- /dev/null
+++ b/share/js.manifest.txt
@@ -0,0 +1,15 @@
+--js lua/http/src/services/command.service.js
+--js lua/http/src/services/bus.service.js
+--js lua/http/src/services/initialize.service.js
+--js lua/http/src/components/player/plyr.methods.js
+--js lua/http/src/components/controls/sidenav.component.js
+--js lua/http/src/components/playlist/playlist.component.js
+--js lua/http/src/components/playlist/buttons.playlist.component.js
+--js lua/http/src/components/controls/filebrowser.component.js
+--js lua/http/src/components/vlm/vlm.component.js
+--js lua/http/src/components/equalizer/equalizer.component.js
+--js lua/http/src/components/track-synchronisation/tracksync.component.js
+--js lua/http/src/components/sot/stream.manager.component.js
+--js lua/http/src/components/svg-icon/svg-icon.component.js
+--js lua/http/src/assets/compiled-icons/*.js
+--js_output_file lua/http/dist/js/script.min.js
diff --git a/share/js.vendors_manifest.txt b/share/js.vendors_manifest.txt
new file mode 100644
index 0000000000..6b3ff816c3
--- /dev/null
+++ b/share/js.vendors_manifest.txt
@@ -0,0 +1,5 @@
+--js lua/http/src/vendors/bootstrap/javascripts/bootstrap.js
+--js lua/http/src/vendors/vue/vue.js
+--js lua/http/src/vendors/plyr/plyr.js
+--js lua/http/src/vendors/jstree/jstree.js
+--js_output_file lua/http/dist/js/vendors.min.js
diff --git a/share/lua/.gitignore b/share/lua/.gitignore
index 31b688b99b..ba0acd3d91 100644
--- a/share/lua/.gitignore
+++ b/share/lua/.gitignore
@@ -1 +1,6 @@
 *.luac
+dist/
+css/
+.sass-cache/
+http/node_modules/*
+http/package.json
diff --git a/share/lua/http/body.html b/share/lua/http/body.html
new file mode 100644
index 0000000000..908104d101
--- /dev/null
+++ b/share/lua/http/body.html
@@ -0,0 +1,32 @@
+<body>
+    <div id="app">
+        <sidenav></sidenav>
+
+        <playlist></playlist>
+
+        <!-- Modals -->
+        <div id="vlmModal" class="modal fade" role="dialog">
+            <vlm-modal></vlm-modal>
+        </div>
+
+        <div id="fileModal" class="modal fade" role="dialog">
+            <file-modal></file-modal>
+        </div>
+
+        <div id="equalizerModal" class="modal fade" role="dialog">
+            <equalizer-modal></equalizer-modal>
+        </div>
+
+        <div id="trackSyncModal" class="modal fade" role="dialog">
+            <track-sync-modal></track-sync-modal>
+        </div>
+
+        <div id="streamManagerModal" class="modal fade" role="dialog">
+            <stream-manager-modal></stream-manager-modal>
+        </div>
+    </div>
+
+    <div id="videoPlayer">
+            <video></video>
+    </div>
+</body>
diff --git a/share/lua/http/css/main.css b/share/lua/http/css/main.css
deleted file mode 100644
index aebe6cef4d..0000000000
--- a/share/lua/http/css/main.css
+++ /dev/null
@@ -1,260 +0,0 @@
-root { 
-    display: block;
-}
-body{
-}
-#mainContainer{
-	text-align: center;
-	width: 800px;
-}
-#controlContainer{
-	width: 800px;
-}
-#libraryContainer{
-	width: 800px;
-	margin-top: 2px;
-}
-#libraryTree{
-	height: 300px;
-	overflow: auto;
-	white-space: nowrap;
-	text-align: left;
-}
-#viewContainer{
-	width: 800px;
-}
-#mediaViewer{
-	min-height: 500px;
-	background-color:#222;
-}
-#player{
-	top:0px;
-	height: 500px;
-	width: 500px;
-	background-color:#222;
-}
-#seekSlider{
-	width: 98%;
-	margin-left:5px;
-}
-#volumeSlider{
-	width: 100px;
-	display: inline-block;
-}
-#currentVolume{
-	display: inline-block;
-}
-#mediaTitle{
-	position: absolute;
-	top: 0px;
-	left: 10px;
-	width: 600px;
-	text-align: center;
-	padding: 5px;
-	overflow: auto;
-}
-#currentTime{
-	margin-top:-40px;
-	float: left;
-	text-align: left;
-}
-
-#totalTime{
-	margin-top:-40px;
-	float: right;
-	text-align: right;
-}
-
-#controlTable{
-	position:relative;
-	height: 150px;
-}
-#controlButtons{
-	position: absolute;
-	top: 80px;
-	left: 10px;
-	padding: 0;
-	margin: 0;
-	text-align: left;
-}
-
-.buttonszone{
-	position:absolute;
-	width: 20px;
-	margin-left:-20px;
-	vertical-align:top;
-	padding:0px;
-	font-size:0px;
-	line-height:0px;
-}
-
-#buttonszone1 {
-	top: 200px;
-}
-
-#buttonszone2 {
-	top: 20px;
-}
-
-.buttonszone li{
-	float:left;
-	clear:left;
-	font-size:0px;
-}
-
-.buttonszone li span{
-	float:left
-}
-
-.buttonszone_active {
-	margin-top: 0px;
-	width: 120px;
-	margin-left:-122px;
-	font-size:10px;
-	line-height:16px;
-}
-
-.buttonszone_active li {
-	width:120px;
-}
-
-
-#volumesliderzone{
-	position: absolute;
-	top: 105px;
-	left: 410px;
-	width: 210px;
-}
-
-#volumeSlider{
-	width: 208px;
-}
-#libraryTree ul li a {
-	border:none;
-}
-#artszone{
-	position: absolute;
-	top: 0px;
-	right: 10px;
-	width: 150px;
-	height: 150px;
-	vertical-align: top;
-}
-
-#seekContainer{
-	position:absolute;
-	left: 5px;
-	top: 55px;
-	width: 79%;
-	vertical-align: bottom;
-}
-
-.button48{
-	width: 48px;
-	height: 48px;
-	margin: 5px 0px 5px 2px;
-	background: none;
-	border: none;
-	display: inline-block;
-	list-style: none;
-	float:left;
-	cursor: pointer;
-	background-image: url("../images/buttons.png");
-	background-repeat: no-repeat;
-}
-.button48:hover{
-	filter: alpha(opacity:0.5);
-	-ms-filter: "alpha(opacity=50)";
-	-khtml-opacity: 0.50;
-	-moz-opacity: 0.5;
-	filter: alpha(opacity=50);
-	opacity: 0.5;
-}
-
-.button{
-	cursor: pointer;
-	display: inline-block;
-}
-#buttonOpen{
-	background-position: 0px 0px;
-}
-#buttonStop{
-	background-position: -576px 0px;
-}
-.playing {
-	background-position: -336px 0px;
-}
-.paused {
-	background-position: -384px 0px;
-}
-#buttonPrev{
-	background-position: -144px 0px;
-}
-#buttonNext{
-	background-position: -288px 0px;
-}
-#buttonFull{
-	background-position: -192px 0px;
-}
-#buttonSout{
-	background-position: -624px 0px;
-}
-#buttonEQ{
-	background-position: -48px 0px;
-}
-#window_browse ol{
-	list-style-type: none;
-}
-#window_browse ol li{
-	list-style-type: none;
-	float: left;
-	padding: 5px;
-}
-.system_icon{
-	width:80px;
-	text-align:center;
-	vertical-align:top;
-	display: inline-block;
-	cursor: pointer;
-	padding: 2px;
-	border: 1px solid #823D0A;
-	margin: 2px;
-	height: 92px;
-	background-color: #E1E1E1;
-	overflow: hidden;
-}
-#window_create_stream table tr td{
-	font-size: 11px;
-}
-
-#window_equalizer div div{
-	text-align: center;
-	font-size: 11px;
-	padding: 0px;
-}
-
-#window_equalizer {
-	height:80px !important ;
-}
-
-.eqBand{
-	margin-bottom: 10px;
-	margin-top: 10px;
-	height: 400px;
-	font-size: 1.5em;
-}
-.footer{
-	margin-top: 30px;
-	text-align: center;
-	font-size: 11px;
-}
-
-div.centered{
-	margin-left: auto;
-	margin-right: auto;
-}
-
-.hidden{
-	visibility: hidden;
-	display: none;
-}
diff --git a/share/lua/http/css/mobile.css b/share/lua/http/css/mobile.css
deleted file mode 100644
index 005aea8080..0000000000
--- a/share/lua/http/css/mobile.css
+++ /dev/null
@@ -1,186 +0,0 @@
-root { 
-    display: block;
-}
-#content{
-
-}
-body{
-	font: 11pt Helvetica, Arial, sans-serif;
-	background-color:#EEE;
-	margin: 0px;
-}
-
-#libraryTree{
-	height: 300px;
-	overflow:scroll;
-	white-space: nowrap;
-	text-align: left;
-}
-
-#mediaViewer{
-	min-height: 500px;
-}
-#meta {
-	position:relative;
-	width:100%;
-}
-#seekSlider{
-	width: 100%;
-}
-
-#volumeSlider{
-	width: 100%;
-	display: inline-block;
-}
-#currentVolume{
-	display: inline-block;
-}
-#mediaTitle{
-	text-align:center;
-	width:100%;
-	margin-top:5px;
-}
-#currentTime{
-	float: left;
-	text-align: left;
-}
-#totalTime{
-	float: right;
-	text-align: right;
-}
-#play_controls, #controls{
-	margin-top:30px;
-	width:95%;
-	margin-left:auto;
-	margin-right:auto;
-}
-
-#controlTable{
-	position:relative;
-	height: 150px;
-}
-
-#buttonszone li{
-	float: left;
-}
-
-#art{
-	top:0px;
-	width:150px;
-	height:150px;
-	margin:0 auto;
-	box-sizing:border-box;
-	-webkit-box-sizing:border-box;
-}
-
-.ui-slider-range{
-	background-color:#FFB200;
-	background:#FFB200 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;
-}
-
-
-#buttons{
-	margin:0 auto; 
-	position: relative; 
-	width: 288px;
-}
-.button48{
-	width: 48px;
-	height: 48px;
-	margin: 5px 0px 5px 0px;
-	background: none;
-	border: none;
-	display: inline-block;
-	cursor: pointer;
-	background-image: url("../images/buttons.png");
-	background-repeat: no-repeat;
-}
-
-.button{
-	cursor: pointer;
-	display: inline-block;
-}
-#buttonOpen{
-	background-position: 0px 0px;
-}
-#buttonStop{
-	background-position: -576px 0px;
-}
-#buttonRewd{
-	background-position: -528px 0px;
-}
-#buttonFwrd{
-	background-position: -96px 0px;
-}
-.playing {
-	background-position: -336px 0px;
-}
-.paused {
-	background-position: -384px 0px;
-}
-#buttonPrev{
-	background-position: -144px 0px;
-}
-#buttonNext{
-	background-position: -288px 0px;
-}
-#buttonFull{
-	background-position: -192px 0px;
-}
-#buttonSout{
-	background-position: -624px 0px;
-}
-#buttonEQ{
-	background-position: -48px 0px;
-}
-#window_browse ol{
-	list-style-type: none;
-}
-#window_browse ol li{
-	list-style-type: none;
-	float: left;
-	padding: 5px;
-}
-.system_icon{
-	width:80px;
-	text-align:center;
-	vertical-align:top;
-	display: inline-block;
-	cursor: pointer;
-	padding: 2px;
-	border: 1px solid #823D0A;
-	margin: 2px;
-	height: 92px;
-	background-color: #E1E1E1;
-	overflow: hidden;
-}
-#window_create_stream table tr td{
-	font-size: 11px;
-}
-
-#window_equalizer div div{
-	text-align: center;
-	font-size: 11px;
-	padding: 0px;
-}
-.eqBand{
-	margin-bottom: 10px;
-	margin-top: 10px;
-	height: 400px;
-	font-size: 1.5em;
-}
-.footer{
-	margin-top: 30px;
-	text-align: center;
-	font-size: 11px;
-}
-
-div.centered{
-	margin-left: auto;
-	margin-right: auto;
-}
-
-.hidden{
-	visibility: hidden;
-	display: none;
-}
diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/share/lua/http/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png
deleted file mode 100644
index 23e5db88988272d48a1be9a01032257d0f1d5ec5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 201
zcmeAS at N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dE6FglULn02py>89dpdjFSaXa^8
zwV3@=qc3|nHq{)7IHMb9C_CXYZ}{<TbI#uk-|P1}F8|*ib)$7mmkL-Xbewk3(qlZi
zLo-3;ot?f>9*4?<T at GC9I8`2MDe#6fbnf6;@<?bx&u^BVTNX->mo;469hGuNz~krB
v6TXks3McRIyrYsQWZpUZ2$aio{UNJ9Gs9GM&xMPDZe#Ft^>bP0l+XkKMUPFh

diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png b/share/lua/http/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png
deleted file mode 100644
index a5f651e30fcef514b97ec743a16967d506d1aef1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 197
zcmeAS at N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dDo-U3d5r^Mix8ysZz{46i|C;%S
zpTez7of}xD918w(NOr;XnHxKH+<W|PzVR;e+4k=xC9gAP?qKsc5~?5?-jH%f%s}}2
z9CM>QPL&7C9Jum0R32I>@Lp%=+`+Zv5!ZwsYo at eZ8Rf^@8gA~sbz+C=giogpO*?0~
q_%2cloV>#Gib|Fcl<OJOZZ7EUd-#aaY#pGx7(8A5T-G at yGywn=RZ5)z

diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png b/share/lua/http/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png
deleted file mode 100644
index 2eace212c49c0266225cee60f0bbbaf6fdba06e0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 147
zcmeAS at N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FsVGku$B>MBZ_jPyWnkbqu;AbS
pE&CFAn5{#L=PaNAJm`PGR5x{^)BGJyp+H+0JYD@<);T3K0RRWOKy&~A

diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png b/share/lua/http/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png
deleted file mode 100644
index f8483d0e045cd1bbcc29caaacfaecbef9db8695f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 103
zcmeAS at N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour1U&p978PplYjmE{JdU`O+iA{
zturv`hEV<gf3DArjEs_=CnYC7?h{&kM8og}2g6JiF2P?CJwRg^7(8A5T-G at yGywo_
CPaf?6

diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png b/share/lua/http/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png
deleted file mode 100644
index 2e97279789582b3afde801a01601d18ea26a793e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 115
zcmeAS at N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq^vw$978NlC;$5W`C+{pn}UR@
zTW4U>525;dO%Xi?O%pkfFbVdYS)r4*L&v8{aG^xffsBGap~XiMR2Z~EIGI<+pJV}=
O!r<xZ=d#Wzp$PyG{38_r

diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png b/share/lua/http/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png
deleted file mode 100644
index e7d01fac6a78fc2771e4af6e2f0e1d0df49a0db0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 95
zcmeAS at N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq|`iJ978PplYe}Ff4{yhFlmZ}
tYMbdtd5#M^j|eS!Eurex8JNVt!Ju`^d{=11p>CiK22WQ%mvv4FO#pc)918#d

diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/share/lua/http/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png
deleted file mode 100644
index d2783ca0c8387f3a1d2e8d2f04138fc8142acff4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2627
zcmY*bc~sL^7XCRMq`-&^%7_B7G73nQQpyt93R)0Qgs>AWj!{rnV`K>-#ABt3B%z8R
zO9)V_3=o3IB0DG$6iHx8NFYEWBqWeP0%QY2U_#HSQ~!DI`<?T9_uTvLcfapt`TKe8
z&^@3F0Kg9KGp8W{uuZ1HSH9e?S#R{eK?8uUuJ>v8pj6i4L_BJuX&(iiLAb~~nl>f<
z*l-2<(&|@+0!Ch(n=SvhqVKH4#Qa^b#|S_}fB%hP-ez{>@$5ri8XJFji-%5aDBHFH
z015iTE&wPi`$7}=<X^zvTLAFAyEXv)32xuf2LOvX0Qdy_hc)N5OaR~$_$<O!%p1#E
zYK&@Ab13Pl=JQiP|L0|#PL)FKP|mzp3meg=NTBFUaWOl#u|#q3fIwC>8hPgH?ZN^G
z42N^st8FC~I$lQj;;ijx!>J^~{XTO=oYi>}!JB%7Vc%#9Rz9Dp#oIJ>k(w>xp?qVg
zG{`h{XrBc6kR>IeD|rRqdd9j5#1mn0foiDg>{M)>^z8tSUYJmlBs2|K2_6RxWcW*|
z179RbEJeE}%<~|V0ML#6Jmab|jO}N22m*%NF!}-aJS#;N_I1evYVcx*I$y}Wb$*UL
zsif%5m>`72;V at sa7l|_;D=Or|`MupvIpEj|MU6NMEFzQ7B_yC=k6IHGh}3b(Gum at P
z`?0)!u&SNs>fLwa9a6w}3Td=Z{^R&=gQ0LY2-PnJ0G8%l_sUY9*6PZM2`jA#SxGB9
z3+B_f7=?XpP;njW#05`b;e)uuxb`V*<05wK9x?cEBBV}?g|{PkOhWoRK}9-E;}6<K
zyT;I}MZ1Kx#VwKajtQL>{&<&9X$yKN{5`FuNn(t63kIF^N=U-X=cB|e<V&QymIq+}
zeZCo*9IkEA;KD6;Npi|#Q3Z1Z1ySbIRuK0I5iI-f@`EDFmm`=Egb&VI7J<fpTX7vz
zw;HjS=LkhS=(8}4wK6BQJe!H at vokzs<yp5j%TJA&f`Ey+DIs4!CNwHC;yPnaKoRF~
zr{0-c?IbOu!djyG-WOG*bWs>kWR!3+P?_17ACpi)GfO%@OUg{5L_~+im^^m5LWOO%
zJ}~?i0A3u}BJGK%Wez>s<(}Nwx~36(26G<e0~%>+>sE#wyh at Jgs@pj5)z3~g_)5oc
z#I-%rah=!>1WE1}Hd503yt3ukP<$^hl+hE>cGT==Muv~PFpYnL+gfB+X%m5h3BsNn
zH3N;R$-IEvFwiWvf#qPNw5O~>;1EVRoS-)#g&>FTuho)f{nA6kg(9#SDXomi32}1T
ztiI*34Y+N$H5~t+hN`l}drs7)X?ZgJ+DEpm^(Kcg=ZnOM7HsWLTusL<57G(6MhIyy
zdAC at K{Yu$VuD~rt;Jp5mGaNc}(mrcHg>r4yk6YlyHO}3mCpUujoBH!v|6*KrLevO&
z^%a~JREP_V4o|S1B^8=Sv6)aaw;DqH-TF#6za%NyYDi9ZXjF&X&nYnv&REfq9O3S6
zy||b>hxyolI02JpFH79$Y-eJoP!W_junsw8X;JUy-tJ68*{hTv=GxmGP3ZxNy>FVV
zEneN(m}NeicoO-+U=Q`DP)wHK_vs#gSx>+8hAU`A{k8I|+jcsJGS`T+rES^K7{~P=
z(I&}`-)&04w;yt~A84y)-|>Fx8F_avGdleY;3~gE+oqeY3)<7!y18vyo~zOa=~D1r
z=TbMOU+Eg>cfZWoC|~QCClbWtC^utF(xgDs_>G-kKJDSH4((Fv7gs3tf8BVkeb=d<
z^Y;}AF)aJ~YnL>|izU-+$;hp3t_#IliX&Pk-Gys2Vh7#8TB7l$PNGmj<-GYD=&)&-
zf5{risOtrDiCUkkPiWT{(55(^Q$zI|vrnq0oJJR?N9=(^!qm5Vc#P;!vufg3^LiFX
z&9S(i;%1aD-8e;;sktDm-(~nQyd^IrKvg=t>HMdJ+}N$9{&-%ax?v7ms`<}=;R!d5
zz+ReCxRpyH?>6Kz<3FgwR6(UR!+chyoj5UCR)epnw%ezOeLyu_Bcb!<SXLCiu6Lc~
zAqqYj>a3b;_1|dHl6vEi#YoqNOzuP!rR?}G*+(eQ6>OY=h<~w1H0UyNfZLp`5rXDd
zG&Ccl_kv}RvTEj at Apoq-RduR+G$zBqX at tJ}>RuUV=T<sfqy9<Xw?KDg*`_Mxv&7YU
znwg8yl!tNpRGyKR+TqhrPyB}yGuGoY(M3(0I_moA at 2``Z>cv^|T%ns_9PG;9 at 25W3
zb;2fRS?TLq5wyw92t+#LYagLPNTjtAVr~TUh~iPSb*Y}6y^v)odW71JEZwbQODE|a
z3}sz2QVc!j2ae^s2-*d!FmcK7WCs`AP)pI%*cYQxh*_8awXW(d*E^{3t=sP{=GKe;
zrrB2=WFWFQ(lH&AmY5bl&`K1#$*^N6uA(w|!1y`3kJU>d$xIGn;@a8C1L=_E2Q|gN
zpZJb4=17XJgayqwJ9q`I*`njAc8|@7W52C9=0VHXgSe7s&Znr>v0c at oq5&hTsDaec
zx at sFK;gry*0CBV`mJ6=!P|*#P!}~{@Dx-OH%f?Pi6(@~oLpz2%q`Al7g1xejySE3J
z6QN#YrblVZ5P=<;4X-qijN)w=Z#qIf&XO{OgK*2`2OR=x7R#o~%7%!TI0h%#N*icz
zwIu8p3XkK?k>QfC;)pS6sFCQG1E*YgrCR07C`CX#PdT|>lPO;!z=&Z(<Irb{_>zZ8
zVcO_JWEu<_z0lK+4B45hX)I~Smc?&z)bZ(^&cX|0*v^E*l5?Xo@{`LyY80p-29{o@
zlX!P+^m1wO88>z+Bg-+9{EY8!&T!A_7-iS9eVmTqi%;WI5oAMz7j**nO)Xu{YW4~b
zl+@=D6b*GNuM8Pi%=q_TV(8AKO!RLHHs{+S-l}nCt|7)T)00)1>p{#hL~?lS2XMAC
zB4lU|XS4IFG27OwCUIF_+d$Pcmli&X*{ptj>l&#c&{B;o4Nt at R4$j;3yP_$UI{8KQ
zqbb*%a~ih`!}2dwJR`Qy3pzw7zkEkbzA1CQ=p-48k`jje&a?9zcluBUCM2s^L&3$8
z#pfCVzZCLSk$(*4AExKyF2Q-CqXg&=D%WN70-OC`h35h%W<;B;d?*UxbRgo;Job-s
zJw?882 at aI{n at mcZry9H7x|{!KWRoC&Pu(FYVh`?re~v<Ie>awML{@0Cw6GR*_Tylf
zOpg~%8-HTZ1yS8h(615%TMv#nm9pVtB%-%C7d?Xv23cr$ap_{!Mr7B1%>$)X4Jy9O
W^3JNoC^c6Ac>mycn(T4u&i??=MMdiX

diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/share/lua/http/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png
deleted file mode 100644
index 5a0a5d8cfdbb743cb873f729e519f3f1027792b7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 88
zcmeAS at N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l)R^lV~9j}@~@ANkJqcQDM&aS
m`Tzg_#$wIHhtnneSQut>C{1b;ynF<xl)=;0&t;ucLK6U&{~3?~

diff --git a/share/lua/http/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/share/lua/http/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png
deleted file mode 100644
index 0d8cfed4a786dbd4299d9bc02b11f589d800b2d1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 126
zcmeAS at N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l&hzUV~9lfRlkFR3<?}h-{Tkm
zm2yzt`s)hI&j${Iq2JtGueduz8St%0Sn?&|(ap`e-HcCnFL`?FweXM5sD-90q~Ej0
aA7(L=(q*6Z-X$DpAcLo?pUXO at geCy>YAW&o

diff --git a/share/lua/http/css/ui-lightness/images/ui-icons_222222_256x240.png b/share/lua/http/css/ui-lightness/images/ui-icons_222222_256x240.png
deleted file mode 100644
index 6cb03be55571216da59c3938cbf210b185def4d0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4194
zcmd^?`8(8&*T-i*GlQ`-V=Y-mgc4=XmKjS~?i!<#y|IP6u at yp=nL&}<j7kWh$r^)X
zUo%Qb*6cD!WKS3d<LUl>pX>Q2p4WA*bIxz)ynlIL=RCq;P58KvbAv!2J~LC}s~`~g
zPYYV-g8a!NX6Czp$_noC^@}H^PyYXjb$YDOAK}=5tJrIxV at Opf7p^%f?X2{5Ka9K6
zae;1LDLoNGQ*%i>IpwR057cAG^xGXh?OMj-jkRHKDs%rSEU7qkkacp6n*&Isx+Le6
zdQD|s()Wo-^7QOCJph4 at 44D}lTn`>wapZ9wuj1$U6nlFi^@$R}Y}t;W8v6T*7h%|^
z<b_h<WPsW59Q&|G6cg7rIW23asx-dyeV9Ltp)X0QhnVstQ7B~)iWI7bT{g?><!}M+
zd?4$NS<_QI at fk3P5@=a6>I^Jwvj=$zLykJN4-=2v7MK9Mfs>_()AK>S(j=4*zGckz
z$S0B&v6`EFH{F0=U5ZO1_Ujkbnt^*_TGdYVar+$OA_5KcDi~BjxdB#V2A^onhUo^C
zu}Bp7ktxoJ?Ncr3z3WuW-DrXT#iv`a;TGD|uJ5?tyd#GYzyLQbCnL%P3>TN9uFe#Y
zE|MxCQ<)DR_t$~sF&t6t22m&8uvd?B#z}|@i)uL-UnSuLL39m2zdX{u#`C4`5I0JX
z4U4f&cZQ!&Lr}`)Y6#Qo;V9Vu&FdQ&n at F2l*!QdF9?7x5<q)9ey=yGZ9Hh2bboIz$
zxl374PE1tk=WwzUOgwjbss0O6`jbL6mO}+Fdq7$NCkT#hflDJ9bvGAS_iA`m0I6fX
zQL*bwI(lV1R(_S|gW-U4rt+t(@mM1{AukM;$2ng22qN8cpF4c;an+sn<I-FyCSN}J
za2orXeg}}tOpNi1^>u0s9}0z%6a4R*k_wvm=XE*hCnVnV9pne>=JXX7eVW^|aw_48
zo(-{~0tF6?jzWzFoklgN;nCsE2*r!Yh9;S&Id0>A1UcSVt=#j}Tf&mf^4Tb;@zBHi
zZpAhX1r0~4owGLN3fAJ)dckKy5k8{(>dsOUU->22MDFUsF)3tE6rE!~#vW>;QTE29
zD at 5?IAcIC?iqNchk?~n{$7sLqUQVT0b?}h!t1B&&ow-4Xzt4q~3v<2Wk0F=Koh=q+
zae-BzASl!NpoxRq3z82W(_J4?`P$nZNtH3$BfDXw=y!(FC;r7?GZs^=!yCit?suuz
z{ww1C6^8HbV*l1V-2`@qi78iTLb&QFFB-Qvw^2cuKg+SF2hu0I8KBkXQ%KO9m_aO*
zBfopR;U#sG7;EQ|WG19$Lo}etu2|(jfh57xM6bqT#C%v>6eK(=b71)W-Qi{RV5Qbt
zHLoP#XF<+^G1tyouvgP4Ha6A<<;35T-Zn(n9Vq<i7Ac(BH at _z_$Cg`Fe#DS5CIrNt
zS5fYdPvD({%=8hw_;HGd$S){awETZ$IOkI)e~~{=-@|y;#f8#``-mxdK*oUL;9lpe
z3Nq!<%Wp3ytauh?l#DDmM7bY&hNT#|f=O^*^j(myhCOU`ZoJ0fr^PF^Y;f2Bhi8ra
zNPt%M at P`!<Fequ!^OmYfG3O0Ax|rCE_gjL?#;Oge675*thx}d+YPy+|8=C*ah#rnv
z*skgeaW9T$f*J2>CXd6SsHBRnd<Ybp@(6~<-Z9xHEx_MyF_W3ftTigp at DHtYL)t-f
z*ueqnA0bITt9nB#ABX7e9qF0c_p=|ZI*nMfGkTxfWh{YbGyJ+>9T$s7p{+8%4S%`8
z?qS{tEL&TVGa6ZIt#<?E+4+U}XZZ4sr)VD?s@$u#Z_Ig at n8?Oo!X>1pbFde>U)H@&
zm~0FDaMtuqkpiKGOH>d*Lb9&}Kqr8_O!@Ha-rD|NJCbixy>_PdG}on=7;PuOy~1_}
z&I at J;Wk8qt0fRRQnx_m;%Dpa>lHE6 at dw_8uR_?imMF_}>GPqNqzyAs8r!}=Faf0!4
zAb)5hxcRfDAMlRdqYNH=jrobtyeMkE_x>7RDNNk+YmSz32&tj!FaZ=E at yvyQ^}rUq
zX!$)~1OFUd2V3+A!rUa%%t%9r9lzAj;3wWV``3DuQ_<wzu+=pP1EZ3?*$y4VOMnCA
zW4W~YOtLcGi5*GDuJ?}rkbrXSg>aj<q-dd4()2CSXHeiF8HG at dUYLc2#rxEPTi{&-
z%K}s$eDG}+X at KJm-`nUA+q2ovqDkUgk<F!On<;*Ir#3E-3s{g!B#~AF at L!$e&L7`Z
zltLFIMVW9+wu at lK+-&brF{3w|H|<DQFvW1jMjoO#`XUBf+P)9kk^aG1tj(*rmDVeM
z+2^58nQ%hD{cB+%p%D3O_w2DeYKjHn`!E{j?>N*s>w}wZELqH={Gn_%_?NW9O9SQ7
z$^H3!&mpQ92Y!e?_*cfA7L{!`Sqq!ss_H7mHk3_x5u+yWRf$ZM8Q-|gq277k_{yUp
zH$+a2SX#Z*<CygbeJg27Bp<_Z63Wu#7Du0r2|L*PteWH-<Yv|ui;b&wuRx~;{7L?K
z&G(-DxI|n at 59%uo&~-VL5rZ!3(Wl{PtNsbw^8Qgnvui|wqcc5PO-ji)0bAUzXF#-@
z<KfRiYXckYJq+Iw+l-=Rbv2sn)AEH^XVO6;N1}oQH(1 at j%*boR6L-tcf{EnjqMl=C
z3LJ at YvkapTAE{6Fnn-raH*;EP%vZveXyu0og)`awlGUQ=?fSrtM$lVQ_>Ncus2FWN
z`ay|7`1Q|Dz1itZRUWNdB7U8UPUbF%ufPjz(PQ7yttRi+zV+Ng at AVQSFify#W!N*4
zwLE^cFwy=nIX?mZDf^2~<;L)OCTky3k}Boh at Z4XHx>0waupGkWNv)69<iCw3-;})c
zAoXc*5<f-lVH$ffj>{bM#G)xgCxX?pX1xLKeeHSqWq-ZLd2(|6hu{7(gz>eFOe|1r
ziOZDXQT%(}Y&GQ#cXJ!mW{K}|tC>d7y}B~RRQ5ekR+0vxl!%+0`W`bZ0WLc5AkQjY
zl)oY0Dfw&KEaC^}`n&T_9eqjgj%zeDisNEML6^|58epL?T_N>w<80l1t3*)N4hH@&
z)g(YZuks9MzO(>kO3GZ1Z~Av2jmYACzBn&{==KP{JtHdgAralmEYR88+4-Q-a39vr
zGxO+2WWLx~n34Q%KA3+Pg+2Q!_^)FNTXn?HY^!+%%XjcNvMlrC{Kwy{l#k8-oT*bB
zgy-GxGkSHcUFW(^3Srxl=1Pl{P}3d}N at bYqe*7z#$6f|gZ at 0iz5_)ijuLZfjnu%Qd
zmc|kSicY^AorY3mWpMJ;-pH8C>V<KicgAYJv`Ycs7HW0E-siecnqb^6G+s!y0=%zv
z+1=b=JYaou-`HxrnL(bgI#v!7-Q2k^DYOF8S-<`(qeVnHjj^>j=aNJJ%ZSvE7h>~L
zWM*f$nT3yBgZw)-dpb712W at StHJC&wX-g)wLdA>Fh%IaTup1UlUy@*D3tQdkQRjKI
zmascFhJ6|?05!1v>s|BLiBzZBVwL<DvDQJQ3pzT|P>LqnTFVme^`728&Z#I;2WDW`
zy)EObN8oSu8TnQyKOa>;VYtcBx+Z`Box7+nNC?X~reK`#^n6JKKD?6U!ZEV~i3=;Y
zX#oH_qsoNrpP8z$HJvklS9Mp!vG^)J%^6gz?08r^?8BftdGl-Ng_Dj43M+%}w7VLi
z84cJg9xpe+#J0<}UE{nL@;Uu>&HIPzxEkDUJzIKqQ(s_s3*v){v9^vGiQLw(j)PdV
zw%^oF``0FH1LCYrP>03!sac6A3L6E|4`@B-UAos5)puBXgBcQfn3MT8;0jSoorbVy
z?L4a+lRYY49F9^rvc<cHp!&xFeU|u%6qKc?d2u0U6S+%yz?G#K%ud$;g?G>ERlyrq
zb!WvCT!oSzq}#F8S;ih75Cn#|AF_aCL29*1=unGz4OZf#73<)w^2UIm7gx$7vIY|^
z++s$R1aOti`VB!`xg5eTY5Hy4XSs2xTbtYBgC8;iSV7=!YPUN*r0$Y48oaF{S{~ki
z+Q$n_zZY2vR!4LX>Nto3v<49;d)%DwM&lmInX2*aXQSo}!B^h2Ee;VUmIy>O;eFkO
zd~W-V#-&L2at2>&DVcmezWF%f>)*D)hfCf=CmNkq{=EjK!8wtX;Mu6v8iD6o{#4q+
zZ2NOv31rOr!_%;6Qk^1Q_xkMRLr^E48A+B4pnYVoSGhF#-x4;uV5I4$XL>3ds(#Bc
zb7`D9IID{U{A#a|mdx<>(a!Le$7F4AAj{RNgEc(z0)-L;KECHov~ZPf?S=Asf(iV}
zWiZ}x&YG*-)nlBzdfX$s3HFjO$p+NF7Ef6(<Bv#KZj#w6B~4*fX9_YdWHY}n&YMnG
zb6 at De-B^=A;NCUCiH8RGkomIc!_xrNF0<HH)SlPo+|!;?`L&l|2d-cCvS-%^hPrCw
zJb(VKyp+_}XBr;ZRXrU`^B7jeg}g>nB?5haf34e9^N;B~z3_E=PZC(PrglI^8@&;)
z2gU4mF~rY%%z)Z4X at paZ5@s5hx-)rBkz6#zzaAd-r7g5mH|EX-4s73xqr&kb%IEZ;
z6ZP0KXpL5V%VfmUgaT3#ktj2`5mkpqng4lX{)j at p&qBm at gz;P9YuC0klU*4-oNaDR
z at wCzj=Kb`}zCGU|xMZo!?+4Gq=bDDcuO~#JQR{sf*~#ZBeS>SCl-331YW($g>1Vd7
z$hVEeynQN at 1w_tO$PuEtV5QA1J-W~eXRkZzcpdx0x`wt2dilZ1T>??<;;KS>g~#d?
zW>H3;$X4_WUzC3`EKAy-rUWiEx(SOQNANb>511ZM<E1D(YVFC<f7s(PPI2E1=A~M;
z>Jtt7mUI<Qx`A2VGCT_gm<ISlweOb7FB?JfG4gvkSqG5^OuRa))C5G-Z|N(n%w!~2
zKLyV2=~{Wnca-+%+S+~Fn0*>3mffQpt-PsR^;3DwI>FV`#QmB{QK@))FKs!G7J%3O
z&t-bzgvb%lL~6qxw70tQ!(6B-C>maXJ{fsLPzp1l1S}GJL at 1&LQlDII+jAr-N^OCI
z9+6`7xljHVFR_i)V4%;6LSf<;6h;p@$9{&&e*Xwv-wRLKoO%fJ3txN29t0NWR<_!W
zNK1!&3kS7qW)<R-J?<bkw>eB%q<5JZv^6ydtTwRI69CBrR1wN)v)Lp9b51jN7i&6l
bXCKw^!(ZGI$BFp!JA=$FVvT8rPLclu!bOxx

diff --git a/share/lua/http/css/ui-lightness/images/ui-icons_228ef1_256x240.png b/share/lua/http/css/ui-lightness/images/ui-icons_228ef1_256x240.png
deleted file mode 100644
index fdf7b1e1f6f733ed37f16e90e9816f564d9bed1a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5103
zcmd^j^;6W3^Z)aXBaRM9i4zV4X=ymR>)-{_A}0vaB_JW(Q6eBn3(`t=qvQc9skC?;
z(j_f*(jVX7f8+a@{o%1QJF~m9GmqWbSYxC%6*(I at 0030FIvOSb0QyIP12Uq2tQHyU
z_0QQgHh7>3Pdxtr$5dgNOaB^2`k5e20T$Z(5HjQL$Se`=2i_`9C^q_UlrRL7nvNc)
zHJ_M?P_$%Bc%SRwXuqrmd*`PYmCeNo<<*V+SNZULauV>H5BBMWweAbKT1uW_$<EFb
zI#&Qd at 1U!p`XF$2*VZirFP#wv%9x635Ex4Nkzgw5`6Fvk8i&jBc&_m7Nw&|d=j`t3
z)s6B~B>?Wj>)!~+%Z43eVbH~Ym;)lPFxn_U6#(ObTxEAFiYj^O>T%I#TPh{<>|+&s
zW*AxQaLe7dfr;!{Uw2$1>-hm%G%+wjHALArR5-_?LA?xyi2w42gHSJVOdVpg$(3ZN
ziknl?&-=H($N#b>Y6!S&1<-1#?LX=~v at a1dnUDSSQnIIDV8tb^rZEFU-^mn?HDV~{
zBn_sz{<WaW)Zx@%vqd-M+en#U%0kU(iicanIg+pyVUmK|Ws`b9wf2co8I&pcw^ho+
zvftz7Gn8JBz!!6gNJUJfT82lNW6Ly>VA}I1yfea{3--e~`GA*=AWt6Jd`PRVXG};(
z3ff1KgPr3H+iqfBPK-=likICGCybBj<mF1SND#T08*jU9$=}Bq&dl0X??s;&kkIm5
zqI#iNAHszNkgni+o*&yM<d7)7&O&_(2x2NYPyb+|AeKwR-9)^YHJLb(C!iF5OBP3#
znt~oDUMM->z&#`R`(D8ysZCv at iPCetg&5g%s09p7<lU}Lv{qyKfX?SA|G%ExKNq;O
zUz+GrenO+|oK$H<q}xqcrv#iuV5f#`i7e at g^`Nx!T65+xT_Nb~W7~+7XVfkK4?|Vk
zh;rPVTjcnj^-l!(32Ru7`DDD53yfNwsGd{xr_8l5)sJRYqonRnym28}+uDpQU-<21
z-c{LdT?ST#<(A{KNR#M4c1#gd6#v!<t=_pba?KKRF?0-I#%FwUbGWfKbj0n&_)T!c
zj(B>wUykr?0LFdV3p*Qj*OOy(&$<OEjEw7e@~rB=NKg$uy?C!Gp&?RbK9(4>*PDK4
z&ydnW6P4*|rdkqfF|Cq!G1_T!iaI at SzGKYmt-X8p<Vtcjf at IWZdg{1)nyGR6erR#w
zjWa=kM1l}b>a1Tkc~*VoG!agN)k<mqPpMDXcw0a|_nv~!y&qx?F-|Kzi*fE~uiOQ*
z(b0I*`X3^N&9hFI&W{{kB}-rC(yj&(6#lz4(~{n(_ at K`0GUzEKa-f~B4`ePc-g+wU
zGS56`#q*JB^35sM2c5RjE(*yL@<S|+nSXTPSPJJmXlQ>vup5X%lOfDtJib_lfY)iy
z-j;;KSKo2xAv?3a*UP~9(j_Uz5_?<dF~j#y`{k6`u~CmyT`C#rI2a5=gJ2_7-uZ4B
z6Yaq)Rs9SMy6%4J{6Z$uO^-EDVu- at uWh;i<+`XJ_U$H2IFfo4Y!w?vb)TRu=7+I87
zvI19l8v9x|sgrv#mh_!CrQJ3BXZm4!nhCgy+_y+aX*|)PM)w;VP- at z&IEuUf88Hfl
zjfx(xv8qkh=T at hBQZ^qMI>azz{{&J3AG=Cov3}N1AV6*lzPx5Sa_#+;-m9%oZ$<4~
zDP5#w>t~ICfvWM9BHeeMA(rM(GIGX>E+ at 0m9|Vr^eo8ZvwJr%KMZ&dO;SJJR at R&|q
z&13254!ZJW*Bg=>`SbmfULUdDOhdK^^}}XY?Zk;qnMuDBC8um0O~oBspD&ES+*bV+
zNV&`;J%yQy#xZy!Wt}6arf))6)SwiCISlPFr2R{3 at q!BG#>7293>;jVAB{ynKoq&Q
zEq$W`>3pLQ2ICH&KvY4%M{YDi?`RZi3csxm6DI92r^mgb_{kk$bM-Je1)}7C5!vU|
zA9^PVSR9zZ^XN2FN~vi!g&eDtz0lu^t23dWR;Ang=&TK)r&yGcKkABhhy7vzC)8R9
z?VPYIs08J-Jp4d3cWiO!V8<pXllD?gqr?iiT!VLeoVB}YwEK%On3WnHHgghvb)rT3
zVuC7^J5YPE@%wFok&geq3oNXvDi|iJ+-joPEdCV??9Xs1%Y&haAt%;ekUZzDaG~KT
z<?mp}2uL5IDO%HhkoBpce01Fv<73kD?28?8&!5+0Ddf12+Z?kO+|gwEkL2B?Ju>X?
zlJ8J*S6{)gVVPXwa$^RhbQweu_A=obUcp~X=v1dpivqHYvIjxoSH>{ah!s3VvPJdB
zrK4*(nt6|xjmT(ti1?dt&mAmiLWalbykB{=#F7^sJi9i(RihgYG2;B(HYw?8PP$Rt
zJwqkVcS;!{W-6ml{GMv;kxFqS%;Sc8kvfoWykLdCohJAwx6qgS9_i*-Q*$5-9TAc!
z*X;3avJNjf>?$)NP;QY7QX>o_nL2DkXnCpiH^Cit>tb*-hx#mj8r)=%CXwCXmg5AC
zyC&(~`&~_3AAmQV at uE1!H(wP?D>K;kQV5FYU4LBn!%|QE(Or96tzyf`pP#Rp4(ra3
zjz6C#W|b%QcoXl<N%Ijld5qqf522HoWJG*$+pkn~WzB6C&af-n9swhFGhIvXegB7o
z8d{)2PY=4- at jjG{Y1#=#0#fq`<7qea1uz}B(2(SEKWU221a<Whm)Gy861Vaz&b0Lu
zcSS^nA>`f__e^&6D>g(#MMXgcFKUn;IcsMlf4Jsk#K}-2jsHS4jurzEKk)u$(Nth7
z@!YLjK<4jX?KA%XK!zPzeNa`^cJj*WQR%Um*i9}lV$4(Aqm}fT8eSQ?FXclhXy$O7
z_4kucQK4o{hhQvLE0y+639OPQvJT%qU6*<W@}%D3>*cx$q!vWc;szdU%^c`&N?N#7
zXO0TUxC}G<D}0j}7ID_`zUH!vSq>%v%K;DFAT?6p8Mg4*OhUTtwGCj|)TsWv&T=zI
zwYA at y))>6`Wo?ZBl$^I^Z(Uag)tEN-T}bg_+DbgESi&<;86j?P9)!vgiG3BwoZI~I
z`@mfTam{#C#ELqrO%B^(iI<e<E%Xg1P<D5BTIS)_Zz>>qJw4(<NsLUk)+5PEWrKb4
z0<HrhGyNYFj8p`PVfhdhTVp+guI!3QEX8}T4frqF?z_xiSKa^xM(ST5-oD=;hz4O=
zgZrIq_I|ZH-Q6ggivYVfxispcHBV+$H?+&_Wn?<S&)AYnRO%m!^u4?eMvPfSQEAS*
z>4i;B70p`=-CyrSB&l>SV7LY=KQ!HRm|BxZ;zrh at n_suG%HhdD5u=78Ckwr`Z2shv
z16Am=;sDCz>e<>^m+7eozp0NBhRRRd1BxV9B82C0?k&@aUM4B&T8pW%D)A^se at U%y
zk5WcmUy`|I#->}qix>3p%~&RnVZmzaNw0 at yEG`ZvR}v;M4EEsA4`##Zymb{GeXEJe
zW1chpWm%7SqOk)uH_x4x3I!I+R<;6fg9BE>A=)uFEAd)_9K~1DHw?4yIMPWhsIE?j
zdbf6ML=5`!C(DgRCn*^7cuLRLg7=P&)L5p=w5=&`y?m18ETfpQM-#Se<igF)%!bAq
zDyMXx7T5c#yNvO5#1(mwPE>xI1i*FFJ+Qr;){WWLgPf_5;lw2g0rX90P#CKMJ08KB
zuE8NUm-1vWs2dSUCPWv8 at A^ZkQ*oSV9F&xQa$<QtD70Txkn3B1MNRs at 6lhMJ{T2fT
zIGF(vhxyTjdgsB8)D&zn at 4(lKj6E9+rH`62g-{=xXT_*Y?iJ3vx=}|=i2hRBd>Jh(
zM9c=Eo)3#6jgn<2f#$(pnJ(maNrZJ~HxUasOV;=2#%<ecS1O|8iwg+8jz**ixn-t(
z#Uu^Io#wz=d!xXo4X5-lje>dVbI7LZ;sHeV{Fb-X!J_FuiGx5Bg&=PP4<9NN;Ah=8
zr3fH`kBt#|Ey%(!?ooBDx@*ta%(5mI=(BtPW|J42gu_hUC*r)grIQ5fNu4>;uEC7I
z(X2i>uK7ETj*sfhN7(PAZwy=ws0xG{VXq$D<&oim9Fy14gdQ`|DD^0jQ*$<ej?-zF
z_PGj|n54Jnmo~<(GK{pB`E-&{*xLb}$x7vP=NMTTI(^SII*7YbMF@&2d_6B=>z?q8
z9L1(1iQ0 at 0<Y#H7CU%HbOrh$-lrH}9-E(LeS4l|ERNG$qBZb$;`7{VIZ#;#V29y>>
zEBbO#3gq?Cc^bvYX-xvX|7laZ{wCl?gZ%ZPylT$1z)uMkC_Owd`1%~fG3Lf9W~o+Z
z=S&S1Cp^|_%#&!`x8QHeh!a7j_KvHCr73$Kvxd;_nNsX1;aEk!cOFF at aO`1wNmn at d
z&UxTS=()CPFgxv4g!nAMa^EXMyzbtT(Cb%*vh3>Y*zf|2iDf8#j{HE3qHbhfv~b{R
z!OccjjGWLW(or*QNwzu2&cxbvQ0|YJ52ku!r%G4s-#K=v%YY4;r#3E|Y~zM_uP_*H
z7`f<npvfU;zw$VC5 at LO@hhdamaT@;yX`j at r9bH3ew;Gg(_Nn_F^2jXu&c<wCo%@EH
z+9=wy!N26NdEEBHu;=`<>#yfsN|}s7gNUbD+MVj6BRdL}EwA#Utli(-Nj1?sy1<$7
z7DbdqAVzmj*N at I#aPj~YY*6e=qSujjE_uZxa=H!GVjExVFGVGx-a$dXznrZEZA9o}
z#0NzaYE^Zz-{1O9Y)mH3s0Dcy|AqTIC<jT=Fvb;2O7=v>iTxlqd4v+&0UKl%eMiB}
zKS<9!PWSW&r##-(=Plq(c98D!)?iB_pdS|qIhbw#^y$-o3-4vbhK^W34Zr>5bCI_x
zI}sEq#MN{H!vW-Jh8K=$faqC at sLV2O)b-9c1VMavc&n{uJ2=Kj?>QKC1)Ha4DV0Do
zAf*1DZ-+Z;W%&QN<i8ta!<0J`Bz@=ZsQrS~R#WFSA)TqWR{oA;mH}VlGso at v1|gXN
zL8EHV`;5E-_#ojyD4)}dWvR1StyVrOQTb}M0M}wOqTEs*$7lTQ6K)F~ffsvQnvVmz
zRh;7ZElqwV58ZrMJ{o0b<q*=%K+Zo<a7>*0Xon|rRpjg24gK|mN`&Q4hm)|vYY9`~
z5XdI-wF~rM`fueQ3oU}7{#(D3x}r2&omlkJ^UK5=#}0nyggTg&6LS8eU24^K8)qwJ
zfze30P_VJqvV}j2pnaf^a?;Q_4ZS}mer)Fgd6We?Sf*Hi`^qzC>-@;usOq#NtqJVs
zbt4VpLx<o`Z#wq;7lvc_*QDjBnrgO-nCRJWlTWhL>KwK$oOT*L(Myb5RvgYFk&)<h
z%iveg)%1-{7mQ)fHNHGp>WiVdnbch}>!J7GsEMBPg{|u8yFDMJ9cdW(D^xkvFVI3v
zQT6fO`}UfFc`>EVi{iBrkYLJg*5=E+23oGxFUl$G<1kd-#wR6*!9%-jJUoGvpVtZn
zN(EA5Su;i74mU`W9pnk3K4+T$q0I7 at Mq<!OJMQA;l(k6ux0Tbb&DO#@%Yr<sLK{b)
zGy%8I%<*5Azu5ojg?d-LXRmvREH!<G(7(M9k_oQ;Gdp!r^WEBzZ-Fhr48^NJ|2JPA
zj`4X`=)7si0<jWeir0)Hvb?4FpLdYjFavYGl5Hjg at fLV;bVm$L;xs2V@(!k|e5tXL
zgUi32ad8Gcu^Y+&=i at lt&gJ+Z>U#BC8a5u#Gc2*ps1*sSr8RS5eMQu9m}rM=Y)Q-q
zDV?!ew%sPZe$Phq-EoDZ$5)v!&_VnOR;X*tXMfCJ7728}mfZb0Wa6Q~fco)*d>M5m
z!}tv^av|+XYKa?~-cc|L=RqGI&b)!2{h4uCPLkH*)A1gF%2Ztb?d#ksd^-A&Cqfa|
z#}7^=V*(v_non53jT1JN#ykrbKX>hKPmNjE<gb0;RjKOl=fQ at TVz}(&5C5mz0=?(Z
z=Z}0L*XFF-(T*qM(3E%UXBzE#slrF4GdD6=FUI-I;lWB`tyA&}x(DAjf|N$_vQis4
z+2JAI<w|o$vnI)Q@?jt#6^IiwPfmUHw=;t8Uc1ZnY5{y<u1h>94`ON7)Smy~Sp?(_
z!<;{+ at X|K58!yuB64JgNgS937J4dXUeaWFS_xrLmfH~*<<xJ^b5YL;<tI=OqqvNMN
z^A{3p|78)DmT8{ZI$)(5uc50!PhUvB{z{m27|rJNhMnY<UR}bJ*2Df9hv}j|?M<iw
zAVC8pec85BRLoI8=npjwSx382GP<c3VX<rHZi0LASmW!8VLOl1g{Ds1BR5PtwOCsB
zc`_W`F)RK5>SBQF)R`xx5HgfQ!K*Fp$PhcuG-WQd;kUcMD-EDTAnD(#yi2vbqyq{s
z>>F?B$*eh0swZHSa_s3a at 6Y0CVaL~)f&%<i%n-<iRz-0?;HJ<QyKV}bxax-!N#C#3
eAn1E<9T=U*J!4lQO5Oh7KTlT^sZpbbiugYX3BQW~

diff --git a/share/lua/http/css/ui-lightness/images/ui-icons_ef8c08_256x240.png b/share/lua/http/css/ui-lightness/images/ui-icons_ef8c08_256x240.png
deleted file mode 100644
index dc2f36b6e63ce3499bd938d0c3ce8bfb12dbb6b3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4194
zcmd^?`8(8&*T-i*GlQ|sSWA`>p+woUWyVsLyT+(wZ*1XiY=w|zW>6$IqY^@BvSv;8
zHKSz9nq3Bo><PnQJl)^#b3OmW^SaJ;&iU<}_b>13oX0q<F%RbnP7nyhV`^e_4Fm%J
zX+awtkUx3U)NJohS;bwsacL!<`~OeaNp+|G5svl0hP at 6tj#Pni;F=>-&q>|z#ke`1
z;P2s<)D<=`F_W;BRl26|P%WBFyVKFzu4yFJSR4AbGUuOy;)>IUnWxq{*?<J9b5eGx
z=XAzpJ at 4>D503$pLlB5}*wje>M$q`G1DDH06(8H at m^+IpPZbHKE4Bockl#-|2_xRc
zFBJ=>{7pyZSx3DhnAo<d85vs@#fjbTBYdHBJqc1h#Dpu6LMek#BvCc2vN>)~`-^a=
zLm4;Bx~{^>Za_bhzh&95GoYZ&4&*5WIp)|tLgc-}KM8mNr%DlL76SXENGNZ7%eW2i
zXObncnv;AlO`lIql0!Y_>lc-p!TX|`)sFSC2W%6<{0+1!7*t-V0ajxQpKQ&7=>(QB
zNfbEmH2dVv>6Wy<4Jzhd6#xI?-6PO&8*O6Sf5LacflUyggPT^85M}%ZODmDrX7fpx
zNR^Q3j7Luf>OgWBw#at<$dhkbYbV%a#YKcfH0_P9k#GVan!2xVF6lu1#qxKEE2Y<(
zN#CJ4!7rpDDCM#>gqe*n6zu=z^$(6urcN&&_||idW}D-(2~e}Xb*4r(QcE<ddUUDW
zxhya{I<mAojO+*#%b8iO|ALhIEMJXfQwB^Ql2*a-0^{4@(g=FptwrYj8g6Ak^0-fA
z%*L{|ZW))QZ{>v`IN+3_^f_}P#!yz!6NBY)iqqjmq<I{0h7CQby4!w2iX++h%V%$P
zBOjCR0CI(aF?zYNL2cndp-{2{|6Nl;UIYK4E<5d{_}l)&JpaAy{({2K^ZS;L#avNy
z!PZnD-=5x4px&U}s0uYWHnJ72a0%JaB;7R6X*7T!#~G=Xdz^kpShij{7YQ{QepKJ1
z(1xL);Yii<Rt6kFn%tT%d8{cyygIM%E+_JoUxrQQtSugwMD|9~*bbuYpw{YTZ;iWx
z1)d1dOGpgi5=(AmTqeyS%D1PFT`@)tJZ$v(YRgn-P9Wm%^TFjp9Pjy}$>p-=ibR+k
zV3nr`%8VXp^6<{0#KR{vm&a6|_I3wSWwh4lUMMN*y at Axpf6?EH!BlH=N3*;6UhcE|
zig<99?z6Wvu>D>qo|SHF!VwZ5rgGY|gj0;uFhA6f>CoE?>6h8^*KG4HAZSd^A{NV$
z-`(GGlX^(>^$SQc15&do;@@Ojq<kn(66b27Rbw%t-b at Y(5}uhcIP&4%$ckE!Vr#9c
zXCm-3Kl{*#V|P8svuO+)6Jw2X<ZDT58>Z<D7W{OL5X$IZ*cYE?$*w6qrb`<U{9`XD
zD-FcObI(I&`w5<WIE5qR7nBTI?mse|@+eck$lWvdF&=fXA+(WxVsb8!KBzFX-}$<N
zOnLn3+p9 at SuEkkJLvuC}&PN`h$@(r}5}X at -52T}R2V0w;sImWP{#rE)96HG6Q6o3%
zubDOSaa9-$N?h`|tzulnep8kvDmv at +j^MnxW=*O at JCye$zn6oWZe{0$<oz(Dg<%$V
zs``W7ilP```um!x6R=1ssiG?n0)-|&hT*YyjSonR at ORscB!&`mok}$LLo3ao<S;7q
z at DTNnpahR)y at 92-ebmmb)NJjCxlfjzhRnHH-R^d23*h-IpAJ~t+5B-xtMqS!U#_tG
zn78~ZR+i-SM&^3!y#P5 at UP0bjo;;)Jl27(kZdE%s=e>%JW#TU5;#1PtSc^Tc>fXdp
zwFP`UXY#gCp3uS}A^;#ESy%m`lR$2UTv%3L?LeO`$)~AaD?@9B<8pMgmLuR+VY3V8
z2Ga%8p(}iV{@Zws(*~zx-xNs79GKAD!8i~z=X}Ew1Y}7W+RfKH_>A<`oZc5dN&h*R
zH at q3t+^yjYyl3?)frs8;ej+q3iJ0wwxXx1w6Z80*t*I1DYN$Gj2Ze<{cP3!nvH34s
zelOI(yQAu0OYVV~Tf`Dm((qBoFI6=7sTa=fjV|SM6nQUnZ5=|#C}(Z8Lx=F<-~hQ8
z4$Xe!%=Gu7ylL2tzKI{=P>%gzPP3L|O|){Vo(1|W3Op<=AEMp|GdDN?kdl8Jyr*xG
zkIID)y~`vGvc2Vb7Zq%CF6(&|No+f!xfE?Z%_ryB#sP8$3s8w9(waa1tE23N6MG7h
z=={V;W45VwVa&Lz&3!6n>{j!ZE$J$z2u|P3MHEF{!eC3=4?w$8KiG at 3xHYy@`^2tz
zKk_aUiuZqTJv2B3BA4ZsHJ(dNHYa=^LBsqUhCAoHadVBuOPQ2El+6YGlCpoLuT(m9
zu#o35OciCr57UPJO26BpyyGfkZXHxrU8T^5vJNYx*W|t~maa18nXo?6y}%t;c`W#*
z at aa(t%U8N=bM7JUBut3p<2ZIgS*q;P*z<8Adpqwn<2?PGjM^g63Dure==7i;$uGD0
z{_`J~iK}UW{iXgo&ZpC((S^NwCAg9`zxW+FzsTXabt3<<*<Q^i#UvcR4Q|iFKg!kN
z=;x4?zO~jqhKJWCy>LZMwZ!FF`Qq!dX&_<V$e at 5tX3sBE@;dS4z4CKlBDuM+_xRa-
z2cqm8-SFcl>eKxulC9FM?A8*-Yat7?(xbzI*(^SZYLT>dJ>X^|=p89+SF{0Cgf<)d
zs7NRL`e(P^^h|~dm*#C at -%bTbGiStC;3c;3iO<+}lh+%cdd}ewy7A%|2H2xA^f}2&
z4!>5AV0V<17Z3lO^+mgKb7Uifc>pO+k at RYK;U`PotUHun3Fh#i*2ih^-9eLYNnC!I
z at +>HkkD~f0l{FR1VFr3?-W04I&g@;c+64E#@woD8px*rgIVtYrZ$D|m#QJ6i7AUg7
zWk_=={Jmhhmi(5pxeaQ)%yXsHR6X#1U711(>pmzmQJqjq#7#|qj~)>R7aqEk=M*o=
z-IVK;_%&l1{)2tv{e@=^J|uX@^%69S?NUX4m*9vhU at kvXA^B+YT-^i91W at KK2L3PA
zBtR~=@+^Cv6hCEJ(oC0U=665|k;(mHX at MWn;~sQpRz&b)0=kuvuf4y!`%$^!0j!;C
z_VJI1Jkjw`L%H8PFuza=YwmT>U&j}>>xdy)mJ9M0 at 8Pjz8OEoDPrsSTpPK(UTc<Dt
z&%Nnu`1*Rg_6_Z1!j46WOG$*ds at AAr3f)ZS(_cYccG8%7+eMDzki)AyEy#_v4CMN^
zRHh(Mc;?mE43r`xjgzDHMMPgwD~Rph9k2b;E(v^Ftkn+vkmELGjB&l#crnQm at Vee*
zdux;akonDRbGz|YI(gFacsWdDYxjYK;3`Oa<HoP_7Gb4S`u5Vib2jZSL(%|Vki|`r
zo}1-l6g+kb^y}E_?b!MrxV@#?U>vTfB at y2W6)Qv|wyo?!Z<;rKNraUxZug``Uf|MP
z#_rx6 at ou;X)W8mIbS>N<QXOlHl=GrRTZa at cYHLeDDH>=iO$)r|2im{{yMk~Xn2z1>
zvWTl5g}>9I=UJkBy;XdL;Ks-5n*98B at 1edRAxxv_{0YLd3&r91uu7&g+w3YNHniNj
z1psLDDr2%=MvD6OO!mY*l|5mHqHFk6Cs2`+!%^*sH=X9_#iy<tMmiB7qy)a(?qZ0h
zH(;;2zuE#5+pgGjO>ke#WB1)N8yKnMXmGv#eEIn;J^qnxh&L+Q$|`y^Vn^L77GmDo
zeoHI$Uz at P;kF_#J9TnB5WG0{}EEGu3zxBLV>3&ya|55EtMsUbccE;a;3q&<#2Ev-N
z^{8%4a<6!KG)7^|66+a;>YV`em|`cBQ5GU*MFs3l<SwN_7p6iGD@`2~*0Z2n1#eu_
znG=<F5lnoTX3J7z8o9ee5E$+O$Rd&nsnsl|LCxdTnF)_qt%A188~p=cUM&yL97-^E
zjUH3v$5k at wHwAFzvIyVAnRl_>vJ+6(HrJ(xKcxAw0>HhL9yeNW-DM{<ct=^JJZ#{M
zw<nl(KcW(>hUgj6wif|P8iXC~aPvN!jr$}gs`|H|jT*BAA32k at SVXL70ub4R_i+>S
zzT-O<n=IAG9(1{-c<RN()|2qBf7=8dEqe{0Y;;oo_ZpZ1XGc(i<|5Z>_+MoDQA-x*
z+F$61BcnGSoq<J>>J(@?H|DM!fjaSw2(qky$tTuEm2;EdZ6U*ph8nKACa1HYYPTIS
zmM5q~b2>=CxArP&*%WUV<pgheLe>HYFkLJ=m?NVvQ78f6(+BPZa~G-BJ}9>bn82r0
z2IHP!ueruqJ<iUp%Q?CiZzlnhXh8jI at sy1+zVP^!Ch7fB(ll0OHb4Dh7UTQUg2_xZ
z=fz&!&2 at 1E?tK%Sc%+XHUMPz?Is-s$Gm30P?6|GZKkF@(TYm+%=lEqOb8cgBxT`kS
z<LB?n%ZdH{CSd_x)iW_A?jtI=;5TThc!1CEuXTH>e$kz07QgQ7O8`q&)DFm4qZi`M
zkf`k*hS<H&@UI=0LO4b%VrGEpyHn>C$c58<8)1=O+Cn;YqVHa0!}h;CCKM;EbY2%a
zS&uD))@atZOocy-&nFcUiPA%xk#%U4*`GJ&k0|7aOhimaD4!+1c70nT$%Wp_-sajA
zS5i93c#ziFzwa{)mnfC~{qT9%eACFpjra&OYNJ0rE9rctPf+dC(z?JL^}qfu?Pi$>
zf7?vRJ)km}K*W57EFrQBR@&Uss{^fY^1Q2t*S0&VYiO&Wl^?F&BM?<Dt;x4nxUWrP
zmZbHFECr9SCAp^~GNgkUO2BfXtB^2q6mQM>kl_wBT8_k{)}J2xhczMX82e3sL9%7L
zKEa at WSx4cNE12me&9$hHX at D<Q`)n)!vKAm8Cx4KYu@`>Gz^gG!jX^}cmi~gu40=-a
zGvM65j-|U?M`^E)jqSJ1xn}{QS-m<@N?S@*Kb6L<;$1w9-L4xKmWs9am8|5J_~W(y
zbD5qzDa;F+OljDM_ElGYoDVSpMZxpYry_U-Br%hUz!I at nm?EMt`Puo79b2M;<Tg0)
zF)3P)^VEOw6y0140{Sf}6b61#e(Z>S{AY;F_fOD`{jlV%=|?c%u=VGxAz*2Kb-Ue=
zw0y*~cv#C~R3Sdw;SO_hnnRU@`&Nj7+tWk9S_3OB9*{Uh6`~xsnvKIT=QVQnuqLB-
b4^SOH{KPD9?1(?VGsyH3)~Lk5G2(v!F(2!I

diff --git a/share/lua/http/css/ui-lightness/images/ui-icons_ffd27a_256x240.png b/share/lua/http/css/ui-lightness/images/ui-icons_ffd27a_256x240.png
deleted file mode 100644
index 0b7f9d7bc1f135ae90166960d2d68b8267966423..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4194
zcmd^?`8(8&*T-i*GlQ|sSWA`>p+woUWyVsLyT+(w&l>K=RtQ;U21Rl+Dj|eqjX|=n
z86_lZb{ShHd%`dnPxtrxT+cu8ysmSdbACJL{mc70=P?dz%)@zt69fYBn3@<}1A)MQ
zTF?du<WC+oHQW1BR&iHuTsjyC`~MU39a-Q12*(Co!(Im+N2)+Ma4k`3=cI1<VceZg
z at b_>_>Ixf}m`T{mDqT}}s1`$_-s$Y^&@>WjstbEtmG at 6kY31p|tW)cpY(QeJOL9(`
z*L3D(J)ejqPtO69LlB5}*wje>M)3Hm1DESWH6PpO*gN#pr;2#f6<fSY=<laq_z|Dd
zmx at JG0j47htfO8LOkDfajEt>{;>7O!2wxaYPlDJ0G2u!glglAwNmMPXe2&}8{vzD@
zP{tjzuB&kJ3!opx- at 0tr6<E}62l5hv9CPXzA at JVep9H*tQ)P%Vi$Q%-M3j$X>$nZ?
zXQCychLdzJU7t@)l0!ZA+gFv^!TX|`HBJq22W%6<{EgIV7*t-V5msvopKQy9=>(NC
ziDWqMH2dVv>DKhVja<yVX#W4jr$?aiHrm9t|AgP71DhZ~12?ZEBg**=mR6#!%@z_b
z5vw56nU9_f)Pv+OY*8KhQ77NB)=sd;iHit{XxbZHBjN-=RCPbUeBy!ni{*KU8 at bn-
zN!y`1!!M*E$Q81+_?eAx6zu=z^$(6urcKii{2Dk%bIfr$c&J(5I#VMDsU;d+GrCma
zQXZ5O6IJ#loa6)(%bQtl_==SJEMJ3VQwB^Q5?8?q0^{4 at vPfF}EjsglEw?ftdE7TD
zc4Jvvx17t;uj)cD9B|H5`kXZpYbYz|g~4(;$LsJS(mfA2!-t+!-|aXd#gStC^|KGV
zk*~=-fLvi<j9zYR<hJslP$*e}|E?(^ui^NjJ}3R8_}l)&f`Gl8{-WZ~3;UK%rCiZ-
zA=bG-p*^j$NWD?JNfl~vY-B4!;S#d3S-N?F(`W!eiZ at cN@I3tvzihp7E(&Ti{HUQv
zp&dg;!;z}ztqeGVHMuok@>r9Fcy(UiT~6YuxD1=jTcaPBMD|8e*$!gtpw{Z;Z;iV{
z1fB at cC`5)Z#gZEtpG9?u_Uq|mSBzBy4;#I{+B(&h7lioxd`N{5$9ujQQibff5)mc`
zSmh~#JfjDiJiJ4fc=&|s`Z$-Tqr-t%6{9t}7e<VJZy<H at U-Y+PF*VxUG3 at Ssm;3C#
zAs$?%`R*+ZY`@n at U}YGaaD*m=tDN?taEfsn7KZsV9eR5q{W4ntn(aPCc#X+f1ib<|
z at 9~zK*h8ePUqF%=klIa=fM(kg<wJR*I9D^Z28$8(VRDd>@T|<ikq`GqR at 8zO+v-%k
zl7OFuIfq6ZyX(PT&12ZuSZkCMUu$~%FjZ%;=%-txP-g$)zW4%5c1`IqP1*<_5O+aY
zX&^p<djT at rkN4ukDI6icqGZr=|B>NbK%V+V`Z9AL<5?dUN*(DZq~rq`g9=0YU9T%i
z<j1eRznZk<qR%QCnzM;;KJpAp(RT$C;oRtZARTo(*xJHGt^H5)*Q(jzut7G at TDj2x
z&FqnntHNMV(vs(G72^{2o3d0<(OK_zc$dvJYho4Jp`sr-Ujb^qm6I1*@WYTAj-l^V
z_lLNbL^Hs&_q9_eU{Sfm%I*RP6q at oF=7_y(d_bhb-)%FJ8A{CcT!O(L+NcJU!|1TX
zL)1Tl5<Hd-29`ed(L1|RvvnWlK3R4dGUsM>zjR1j0MBRnbimp!=8r?$q<<Uya)aH+
zyyai9vLt0RG1uGf1<J7siVDv16c|lYKG|2hSMS_h at Gdo$iNB0XNKI#B(R*Iize$*C
z5Bzw}<ZZD$zLi5n06;>ruLeLTf&5Il at a(?2fj(QJZ*zlIrq&F{<(L>PC&0bZW*5#4
zrU_<1SNH(^w+R}j4Nl3vDUy^qFrj*YaUf>i`Nky($dWv?Tc~&N8R at 4vy)S-}_H(dc
zcr&==i-sTYp4F=a9(sfMiO{$tVz&R`I!_r)%=250rcwy8vHB<h6dv*11&{T>7QSr#
zy;uwX5?v2l@(9A*B2Y|;!$+OJRMFt4-Z;BAy5!T*q`k1UbqEckoW0cn9dZ;02g=2A
zX!aXtWxN;VO~-EZP5cmta_on2nzg2AqLtJ1EYN3B;9+U`Q1w2Txw-j=)WX}~J$;Kp
zR6cy at T^4bW?Jdu{=n$K8+0UbiV%w1|WoYYZJ~^j$4v-62AeTTSt_3)LbCSJqVoyO5
zU6>SQ%r?~_j2U;cxu1&}yVbH~OT3CHfzvkg5hc-=Fxaw=1JJJ25B3r*ZjJ4<KCvr4
zk9^975&|Av4+{x}$Yr}{kLTy6nB(V1&@g|8;jTF!++0)XQWp6S<#WNmr0iemE0s+h
zEEaeU=Zdm94pWEz%DCIAyyGTgZXH}*Q?1aBvJNk%)#kr0m994BnXo?6y}%t`bu8qj
z at aa(t%U8N=a~`4ZBuogT<2ZJFd7A9f*z<8Adpn;s;{yG>%(@cM3Dure==7jJ(LcZC
z{_`J~39IQr{bd0<E~hhM(8axa6dYyEKVe7CKWcbxoxp!=wpX)RF&W2igWK~Ah<0;0
z`Z;8!Z>_bD;o-H(C|*%hrMNz;puaww4ie^#3J%<4_WUv>trJe(t2hTHkXnj+kDo1c
zAjr<q3_pI#eY)RFv{ky5(?(&u7P3GqJvuC!&E}J+5lQdR18z2f-VwuhMH at jSXtS}8
ziZuMMe|8&8&t$4_Y2Ft0>r!wsb3uFqUSf-%_>OHid%y8*;2i#-n;?#1fIX|io)fL)
z9M_5x?T(TQ65yY+ziL-)j%;Ky4<MzflHQFk{AF`D>ks8uLO48g8{#$i?x0DxBrZQp
zeHNU=M^=55#+r)bFatd`Zw}FpVD_$CZG!vWcwTum(BN at _lpO!@x4$%gVtq3c3zS&k
zGNri`{$4a)OL@!L(hjv==DE^lsvdN|zFZ-dbsv<Kq>e8m;HIYMV at AZm#fKiGImJtI
zH|4q{e$ALh{9xaBf8m*fFA?5(oq|TOU8*eX793Fp%;je)B_C~`tAAjb2+G>U!2hL&
z2*~AEon<eO;wMi_n(6Y){0^iLnA|Ux7Wol99>I5JMFc-4qT3jS+WWh^AC(&)z&f~Q
zAODCf5FHOQl>5yC^A97l=3WQ?b)3FkPYBJnT$HzX504|sFg`7Q`pr!F)bh{SdW9i)
z{!Kr_*Vj9=Z)m6BcPuEblt^(^tx>^Lnwie0zk<2!q%jS)bdJ){!>c^4$c?p3<ofqC
zrXWy!=GE8?lq at 5SlgsUkjJcv#6!&F!yzXm<B=DVHryceo&wa`m<94y>VzMRReZAZE
z)+X&C^Sk at zcGIm4(xm0_3Yf^&?gI(IRgm_^jb9n9!b)kh?WF~m9O_?&!~sV^7B^XX
zZkCf#^w>4XzjLd%b89|mdrP&^I6_fNBB2c`R*Xh$TiJ!(G;jWz1S_X+_oPQ%;L=>i
z?%o{nX}k#3!VYe9FWw;JI at OgZ7sQCR4JlsK)|P^jHPBX?7LHyYr~?!13c~eZ8g|3m
zBEDu6{!WipV2SecQSlRk8y~B0_V?ethx&?yFpXjgC-BcMltws)S211KW>+C`VHMV`
z06?Wx8<YGqQ`NU;awhJn><K%RTysow29+o|9Mz5Z(5Oz{eCoR4#1nx+O5nR4u7+q@
zBlfDtt1U30{fbTZ1oy=PcE3HdfsuNSMz`C~m!IF#;~&|E_ at H8}tYStZchs%oAm(iy
zx3tp!wF#SmI4fh+QAtB;Rw9bbLV@%G+Rl5I?RQ7 at AJyGtgoGaDWd04fLR3>{AgnoC
z&zh!WkII)vV`R2$v7TY5-U&dDDRwdiWg%i#QpDa&>Q)+bWhw--($zuXJ&U^4 at TN7L
zIZ=66!K8=jwk$QKk%tEaf#Dv2(2-0?on|Q&Y96o7Onkg*6}(;16cF_CYDGlWP@=h8
z%$OoSu8PsHDS)exMffGnyo>uHI{|fTcUyY+Lz*8e0NhLMai at mVUv@@=ca%jc!UxXy
zc!8<+Bdfq_h at K&Bdl7)rDC}g1Tkzd%+9x{as(=64q%n*4l{0CNL&S+D0#VJ5zV3oP
zcl^fUQl$FWgD<z1PQ94edJ^&NZ=2wwW$)pWP0q^yUIR1WoJex;T+~`E|BEdDTnc at z
z<AshmGG^n^8CW#2UV*A}WA4fksLPQNNs<kqd}3`>yEOaX7BakOsNtq-aylETcH1Fy
zc_MdcP6rA2)m<enn>yM>JHuO_khH*oOjpZJ=E&$v6iNX2^np9k+*PWr56bNc#`7ta
z!?-8dYp-$EjI(p=a*pmL*h#=78d3jRJb9y>FCt;3S$e;WIE_`AEzG!>&6r<WG?}U4
zyx5Doxh{^ty>EsSj`STv7R#fL&Hzx`%n}<BJ8tXq&w9(`)?b0`Ieyv6oZA>2?yigT
z{Q0};a#DZ4NqAs)%}gxCV?+fP@&=tN9_ah~Tm7D at e@xdI`nR2Z31G=8w-Ykf<c)YU
zBx<{dA$-|q1k{a7A)I0qF*CsQ-Kp~mq~dA5jqs?i?V(*dF?TPrVf$Ym6N(pBI<E_z
zY`~U7Yc(5Mry`yu6cURG1nHs8sCqQY?9UtXM-=iy79zGYjL*`sZhc!L*_GDI-tN{M
zPbr&ZJV@{A-}fDcOO#3fe)v3mp?PHDMnWVSwb7rEoqWE^H at NO;S$$BR`d@#SePNjh
zf8R{ZKgeY;fyjkQS$tGCtgNNAR|i_@>~&YoQQPjQzOlWMT5-5~4^L3Nv?kwC>9IDA
zS(4TxuoOJQm*k#~$Pf=^$brjEZbHJyQAcaehYSy>(Q=d{YW?Z4e^?XJPI2G$7bRP_
z8xjrrmvt0Qxq+G9(p+?XOe36L<GZc=%UXbRob*9f#$Na#!%>Y{W(*?ewe}ZPWzv#s
zo&o3fbu2yPI?H->Y;3=8&OHkh&F<BSR at zdk{;4!>mEh`W?0((2xJ<00kFt_a32 at Z<
z&t-b at q%bdNGPQ9Z+E-KcaUs+M6b&y#pNixaki<+X0!xHmVX}z6<Y$*Vc5F!slH1^*
z$HW*t&Qt%zOLTKB80fbolNpY5`LQGR at t>hG^Piv_`{5~D(~n?&;p@*?L%`C)>UM`A
zaruaceptt1R3kpy;STfiTEdis`&I}++tWk9S|ckx0gyOE6{DQCT8tww=QZ;7uqLB-
a4^W*y{KYJA?1(?VGsyH3)`()@6!||Kq$yDV

diff --git a/share/lua/http/css/ui-lightness/images/ui-icons_ffffff_256x240.png b/share/lua/http/css/ui-lightness/images/ui-icons_ffffff_256x240.png
deleted file mode 100644
index 547a2b9695c5a26b8d1a06743b10f0571682311a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4194
zcmd^?`8(8&*T-i*GlQ`-V=Y-mgc4=XmKjS~?i!<#y|IP6u at yp=nL&}<j7kWh$r^)X
zUo%Qb*6cD!WKS3d<LUl>pX>Q2p4WA*bIxz)ynlIL=RCq;P58KvbAv!2J~LC}s~`~g
zPYYV-g8a!NX6Czp$_noC^^5!L{r^8v#zSoQBODuW6?+YI45<p`!Zk;wot3`shjDj0
zF3`;@r6*!&YA$Ifr+iiMfqD#?e!HWmUCUU!u{P{YW$r(PB^9R*vQDmXa{!4{m*kvM
zuc^#S`aTg!o}T at t2O!XqAv0rx>%n6yjy$g8Rs0;EVs9^`K2ai=E!z=PLw`T<A`JVK
zyih8f3@{s>V;}a2V&d8+r)BL_mBx3z5A%mH^d(945L2Ec3Z)D}kwVq5%Vv4K94^3}
z4`kgjYkG<&J_80(0xe5Moq>gI_8>1|$Wf>EVd9b70uz8YaIzF}dOoOEnuPMfw~W~y
z`9!iJR&$f at rW^39OL1w$e*L0aGjLB#tJ<kPZl7aZM4*9Q1%oOmH^6Gl;1jLcFx{Xs
z7Ks8sGQ~NueX1qBcb$s48!hm^_;d?4+(Mh$^&R({cjOQP7~rPmWJH;O;o@@C)tLg)
zMN%bXD)Zsv{yLC6h9j!oAnL>$_UduYI0;c<Q7s4Kt0bHth_2!1mq*&yc)s)<;zsGQ
zVKKJp&hYbT2uitJ4Pkmc90mKod3^(86KPWm`+oJ at BRLkh90Jt5ca5c)gVYv_t{zz|
zcPR_XiHR!x98PwEiRVr))qg=se^RK%a;N}i4 at fKE1i`T_aA_o??&bpPUJb7bAa%?)
zDt3KIN3V>>%CGW#FdT5sRQ{AT9&02g<b}cVILGTAL8N=`bB7N;uDa8HT$(Gz<jW@?
zPGeuw?*MX{i7|e$zD{l7L!nS|g8yApQb7~{ye=pGgv6V^gZzNqoW8=MPjh=#P9;3i
zvmrKApumCAQK-?N)2IeDJUYA?p?DG5&?M6|$8Fq?Ajcc4m3y9gOIWg5J{tu!9(q{c
zt=NX4py5chbJm7j!CJgpFZgUI!bfyp-C0WFE58Jr$X#7HCWY*YqI2xW*h6hJ%HEiC
zg$O<tWY9=V5t<b*GCqs$812{H%c&Hr4jwXob){vpGdBqF_qmXAVXk-lG30W&v&Et;
zF0kqo1Z7$uG;wfyLGr<4y6Yn<UwgYFsWL`;WH*cy{mxMO#J?D9#$u{<cw;!-{Vw&|
ze?{EC!tmW)?B9B)o50R6G35$P2v<GjMdKFdHYy17XF2xtK>B1i1GL(F3JIDMGl+$9
z<aduZyrgatW9>YW%!Jfzhz2y-6{{R5kR*7T=+#(^m=BAKf`n&f4h+A)JG`tOtkhbo
z=9L8eEXX-9=Gs{c_G%i%#>U#9ocLSP+lJ`61BE}`B84;i=JzD#*mA4Nj~Ft>gn+p7
zD$4!w3A}TVnLdISKTh!w`2{75mj90o=X}cKFY at Q<dl=8UxKR3VA2B5l$QV!@-0OT*
zL8d%<`R(O|70<$ql92_6DEC9puoMGVFbU3!z6;XTu!pVAjn_E*w0NbK4GtUN at T`#^
z3DC+O{;(nf1|=<e-cmIw=DZ<C7ZaQDeoJuKShXQlq8-cokl)KeO*eCLL-T(a(Zewd
z+f{ub?#0neFymd#<Z)OOl~mD{4}n5c9>MU~J0|<21^C-7W-?QmwMHcx{-Kp_NIQrQ
zJ2*i7BP7XZRc~nJ;}E^QBRy05e)gkPrx9y*M(=aGj3w}FhF=$~<6`kBv{mM};V(DX
zJ<J<{Wos*PMk8yj^=_a%JHIgh3}3$S6z!u!m3!6pjXCcU6WRDnxP;Vn4)#L#%evPI
zlWl<?&YHd{QXsT&i3$QpNcNQg=me0LDIcEQTif4jNAhi|*Ur?Q=DHLUqwNH^SJ>{r
zdBF^!4CpdHVDKhE^OWI9xz~kKviqiV4=@hI%01Vx2mx7926qbd_dg;1w5IkXPB4BB
z<PU8GH-Faj1KzQFl);0qF+UNS7e&qY-e2P at g^7E9&Cya0AvIJTCV;{tp1BaP9 at v5x
zEx+e$;Gd)GV2d6>n43hJ8ENRS<Chv5{KOk)|5}f7Dw at 0-wz>vkU{ta<+o6Ma32>l%
zESFZFNmj-?u_Ni&_1^Ix5>T$a5N`996fLw$n!Y9a3<^9XqY$dm3$w7Wc%NEu3%qM!
zS%Aue55CPJ4RE~Sdm9~Mdp7%7G)a6bvbhv(GsQ3O)W!vJ0Si)zB+_aC{;QMR`Qy8a
zQs{!DC=-s!b`i{&o9#U+X7pzBrXA at DrWnrH$U_uIU&LTb+xI~`(myzhwRttS(t5=&
z`#kh16HW-Ye=RH|6e6GPo;{XFO|c++A4bFc9fvw+eQ>jlC5u^<Ka|Y||B`liX`oy>
zxj&!pIYbrXzz@*}|H`=2qO$EKYhe>yRb8dnhO!ASV$|flDv_x&;~Td*)H}}`UwJg-
zhRCTAORJZ99J3ywZzWBM<YPEaLRp&J;^?z6VF!DkRg-*!+|1fyv2nHT73kD}KgmC@
z`QEc1mxwFrL4BnGx-O?OV$elB`ZOGE)jwfd-al$+c8w at -bf!nENhuj8V2j)J42X7f
zJp4ImZD6Clhv7S7n^Cl^u10fxTE6h=Ogc#9NK|m(2CMs*8F`I(;%@m_Fp=C`)N|}i
zfg at 3FmSObaBlXE%6Uk2bW=<=O`AXOlt^Dwya3-5yvRX8~T_3p72zpBj-w|s76{F2Z
zKPWK>zy8^&H#?oF%A<8l#IIA)$=n6;6?lOydh9#8)#Ux!x1M|Gy<UO at h6(np40}eh
zmdCFaCfXk+=O at 5FWq;AB+!$WZWbH#rQl-2bp8LyDH|h=)mP5EasrB)i{I}8Mo069v
zq&^K!;-{!ROk+>RahZdjSTu#`M6i0+tT({DuRSln?63DYPfm{i at Y`R8Fut~ti3N%+
zahWnaihs|Wt){%;Zf=9xEb(1#HPZ;XS68N(%DxB6O41;d5^<AL-(!X)z(ofh<XNSQ
z@;Br=C4WtuMf~7ge|P?=qb~{GagByXaa^n@=n@)M11uD#E2JK7oUOZWl?ck(!NC8e
zngqz_Ri5F at mlmK*Ntx^MP5%z05m~&?7v}{K-5$ZWXGDcQB%)iH1v+~>J0DaU?!(%7
zW*+^B%oiIAGm`(!2lEf3uxDQd|8;C(tBx3&Z8fi8`3 at dOmSujN|M;7g^0E1!Gj)oC
z at Vpy-Mz5~5>s;4KA#7XHTxpRKYT6 at 0sSI=7kADU8*vnw*?H0I7LJzL+wIJ75Gm&fG
z(pW-3(dn0?(@=`63{IZf8yRz1y)f?c&RFf2b}8W7Lak2N`&{=)6O7x1#tX?-fcLd7
zyPF$~2dr=I8(WPxGsqKG$I4-%n>+U<g;qd1>(_r}w1_CDF}4=xTyp4t8Ik(&LTp}&
z%<K#|v+$8?kblQ!Psir>psh`{29pRSZOMdIsCW??v1M%^cEh6SOA at SXVXHem>O7Cu
z5_adtuusDUpa!;oy=(qDk?K at itdbui);g$kK}Sa#O3_4HYgyvG-qZWXITc0fzzpoV
zw`F|w2>h)+Bi{<;=cDQ;3^zGi*W~ZNa~Jgm31Jz>6pRy|o-c{OhgY&(IA&HLabe{)
zEdW4gRGE<dGgCFTrgO&cs_u$77GK4uIfIIo9S>`VeHe5nZ+;EEaMJNWVP){0c2^@b
zqXB!x<K-rp*ml{rYn=B&KBwQVdH--7SA*NFXG_m+>I)2SL3~g#*48m2k=q*9aS)5v
z_M6&i|JsCYK%BJ+>ae&zH7gNCVWU9$0j=k}OZU2>`VMPvFhfEQb29%1Tp?<y(-8Ko
zoo97pvPZ>>!%+%Hws`jtRR1`j&k{e8g0d7fFD~S4B6ledxUv+3+36af at a}oNDtP0n
z?yQ)Ct5DK|bUU^>%h<yMg23?hLl%%MNUc^09cmG;!Ag9zVja9y-WU+{;!1f$)?lKA
zTg<4E0Irf*zafY#mqYj^O}~x%EH at 5yYjazC@IyubD+t_8?RKY!)Ln8$gSS;g%ftIm
z`*?xr_aZC7>WJ<^9S2c>)*#|!kDK$|Xxt+?Q#HQ*Y}A|~_{y8M#UbLv5`m~Dysx{E
z&uzcaxD at GL&frTeC6mv`Hy=lQ{o6M9aLIe<M5D9Hzt_MtI46=4JR7xIBk(-SpGsSp
zZGWySfs9#ycp4T>s#B!vUZ1^u2<pT$Bgt|Bw2$odDwihzTf#;cj5OW!OiyJ))o(dw
zE{#(MXLXT)U+oprk{RAU+8N&Rn5+#BWVu>(u!cuopiqLq$M?L67Ov8*y-;3HFo9pW
z48}XoS#y=UdW at 4-k9%Y{!Cn$3*?{`j;wkH8{1FMuO)`6>q$#ZGOhLwlZ07gHdDH1?
z?h8G*8*35>+`A??@z4MtGG7*bcp8A(Wft3t+Vk3+d)iYfzxERB!1c>s_U!t=P*-i7
z=g;4jmy-JWOv3}as;6UV9>c1*kk at FcM4<2QuXVd>{xO}W7rt)qNdk-3)DFmKqc`I9
zpqSk*hWL4p8BjYWjc|%l!b}5GcP7s%l8dJJ*TbW}w1sx+#@xBUf$e*7R5)Hl`J5hf
zq8?iYt<kD)nT&XvP(Ugo5 at iNAqUz8n^FMFQA5qBnS%}z<Fn%k1?b?=RvMZy9v(2q3
zo>n at +yr16Lx92+qmn@a}{oq;nT+{IQ^@K<?YP~NbJNaCtZ*c9C(z>8rjlcdb{meEM
z`L>amw at +oVfXKNDIYLwythBkMM;BV*>~%*SuVa5$*U(l$FF#nhOCYLUTvceV at K~L~
zEXwE;*@~Xwi}Fu~Wl8(fl)$A%H(?Rv2;PSK0n-C&ycC5;tvxyV4|`n3DejxWyj06p
zeWGFClCI)OH!#avhG)S5(*R$n_T5tXWg|#FMt(0R>mc%giC1Tpnt+J<Eq#TRnT+J>
zr at +}gT`Ldyj?x}oTf1)?vrhxXvU_x+l{b~EekzYyC%Af=xL-3VDiv?<r7h>t0`S`Z
zxlB)-5IF*xNNw1I_EuMZm<u%pMZ*iwCnJvtN?|6HfJI`D2u0LD>XXZDdyXVUsV#8O
zBT|e$_sRd_CAP5|4D?x1C`|l<!ssFA*w0Ye?;oM-d*LaYQx9Q&;cL&>gTUh4%2vA(
zY3Yz};h>hytU`RU#~tM6His#T^ez*Fwx$Mw)dqHY0w8&SDndDJHk(9X&S~cEVogWx
b?4vq<_={WOI1zt-XOP)NtTD~dDe`{+ci3Gs

diff --git a/share/lua/http/css/ui-lightness/jquery-ui-1.8.13.custom.css b/share/lua/http/css/ui-lightness/jquery-ui-1.8.13.custom.css
deleted file mode 100644
index f3e2b50e5e..0000000000
--- a/share/lua/http/css/ui-lightness/jquery-ui-1.8.13.custom.css
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- * jQuery UI CSS Framework 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- */
-
-/* Layout helpers
-----------------------------------*/
-.ui-helper-hidden { display: none; }
-.ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
-.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
-.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
-.ui-helper-clearfix { display: inline-block; }
-/* required comment for clearfix to work in Opera \*/
-* html .ui-helper-clearfix { height:1%; }
-.ui-helper-clearfix { display:block; }
-/* end clearfix */
-.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
-
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-disabled { cursor: default !important; }
-
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Overlays */
-.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
-
-
-/*
- * jQuery UI CSS Framework 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Theming/API
- *
- * 
- */
-
-
-/* Component containers
-----------------------------------*/
-.ui-widget { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1.1em; }
-.ui-widget .ui-widget { font-size: 1em; }
-.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Trebuchet MS, Tahoma, Verdana, Arial, sans-serif; font-size: 1em; }
-
-.ui-widget-content { border: 1px solid #dddddd; background: #eeeeee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x; color: #333333; }
-.ui-widget-content a { color: #333333; }
-.ui-widget-header { border: 1px solid #e78f08; background: #f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
-.ui-widget-header a { color: #ffffff; }
-
-/* Interaction states
-----------------------------------*/
-.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #cccccc; background: #f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #1c94c4; }
-.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #1c94c4; text-decoration: none; }
-.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #fbcb09; background: #fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #c77405; }
-.ui-state-hover a, .ui-state-hover a:hover { color: #c77405; text-decoration: none; }
-.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #fbd850; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: bold; color: #eb8f00; }
-.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #eb8f00; text-decoration: none; }
-.ui-widget :active { outline: none; }
-
-/* Interaction Cues
-----------------------------------*/
-.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fed22f; background: #ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x; color: #363636; }
-.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
-.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat; color: #ffffff; }
-.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
-.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
-.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
-.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
-.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
-.ui-selecting { background: #FECA40; }
-.ui-selected { background: #F39814; color: white; }
-
-/* Icons
-----------------------------------*/
-
-/* states and images */
-.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
-.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
-.ui-widget-header .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
-.ui-state-default .ui-icon { background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-active .ui-icon {background-image: url(images/ui-icons_ef8c08_256x240.png); }
-.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_228ef1_256x240.png); }
-.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ffd27a_256x240.png); }
-
-/* positioning */
-.ui-icon-carat-1-n { background-position: 0 0; }
-.ui-icon-carat-1-ne { background-position: -16px 0; }
-.ui-icon-carat-1-e { background-position: -32px 0; }
-.ui-icon-carat-1-se { background-position: -48px 0; }
-.ui-icon-carat-1-s { background-position: -64px 0; }
-.ui-icon-carat-1-sw { background-position: -80px 0; }
-.ui-icon-carat-1-w { background-position: -96px 0; }
-.ui-icon-carat-1-nw { background-position: -112px 0; }
-.ui-icon-carat-2-n-s { background-position: -128px 0; }
-.ui-icon-carat-2-e-w { background-position: -144px 0; }
-.ui-icon-triangle-1-n { background-position: 0 -16px; }
-.ui-icon-triangle-1-ne { background-position: -16px -16px; }
-.ui-icon-triangle-1-e { background-position: -32px -16px; }
-.ui-icon-triangle-1-se { background-position: -48px -16px; }
-.ui-icon-triangle-1-s { background-position: -64px -16px; }
-.ui-icon-triangle-1-sw { background-position: -80px -16px; }
-.ui-icon-triangle-1-w { background-position: -96px -16px; }
-.ui-icon-triangle-1-nw { background-position: -112px -16px; }
-.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
-.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
-.ui-icon-arrow-1-n { background-position: 0 -32px; }
-.ui-icon-arrow-1-ne { background-position: -16px -32px; }
-.ui-icon-arrow-1-e { background-position: -32px -32px; }
-.ui-icon-arrow-1-se { background-position: -48px -32px; }
-.ui-icon-arrow-1-s { background-position: -64px -32px; }
-.ui-icon-arrow-1-sw { background-position: -80px -32px; }
-.ui-icon-arrow-1-w { background-position: -96px -32px; }
-.ui-icon-arrow-1-nw { background-position: -112px -32px; }
-.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
-.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
-.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
-.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
-.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
-.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
-.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
-.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
-.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
-.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
-.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
-.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
-.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
-.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
-.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
-.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
-.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
-.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
-.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
-.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
-.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
-.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
-.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
-.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
-.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
-.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
-.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
-.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
-.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
-.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
-.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
-.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
-.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
-.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
-.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
-.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
-.ui-icon-arrow-4 { background-position: 0 -80px; }
-.ui-icon-arrow-4-diag { background-position: -16px -80px; }
-.ui-icon-extlink { background-position: -32px -80px; }
-.ui-icon-newwin { background-position: -48px -80px; }
-.ui-icon-refresh { background-position: -64px -80px; }
-.ui-icon-shuffle { background-position: -80px -80px; }
-.ui-icon-transfer-e-w { background-position: -96px -80px; }
-.ui-icon-transferthick-e-w { background-position: -112px -80px; }
-.ui-icon-folder-collapsed { background-position: 0 -96px; }
-.ui-icon-folder-open { background-position: -16px -96px; }
-.ui-icon-document { background-position: -32px -96px; }
-.ui-icon-document-b { background-position: -48px -96px; }
-.ui-icon-note { background-position: -64px -96px; }
-.ui-icon-mail-closed { background-position: -80px -96px; }
-.ui-icon-mail-open { background-position: -96px -96px; }
-.ui-icon-suitcase { background-position: -112px -96px; }
-.ui-icon-comment { background-position: -128px -96px; }
-.ui-icon-person { background-position: -144px -96px; }
-.ui-icon-print { background-position: -160px -96px; }
-.ui-icon-trash { background-position: -176px -96px; }
-.ui-icon-locked { background-position: -192px -96px; }
-.ui-icon-unlocked { background-position: -208px -96px; }
-.ui-icon-bookmark { background-position: -224px -96px; }
-.ui-icon-tag { background-position: -240px -96px; }
-.ui-icon-home { background-position: 0 -112px; }
-.ui-icon-flag { background-position: -16px -112px; }
-.ui-icon-calendar { background-position: -32px -112px; }
-.ui-icon-cart { background-position: -48px -112px; }
-.ui-icon-pencil { background-position: -64px -112px; }
-.ui-icon-clock { background-position: -80px -112px; }
-.ui-icon-disk { background-position: -96px -112px; }
-.ui-icon-calculator { background-position: -112px -112px; }
-.ui-icon-zoomin { background-position: -128px -112px; }
-.ui-icon-zoomout { background-position: -144px -112px; }
-.ui-icon-search { background-position: -160px -112px; }
-.ui-icon-wrench { background-position: -176px -112px; }
-.ui-icon-gear { background-position: -192px -112px; }
-.ui-icon-heart { background-position: -208px -112px; }
-.ui-icon-star { background-position: -224px -112px; }
-.ui-icon-link { background-position: -240px -112px; }
-.ui-icon-cancel { background-position: 0 -128px; }
-.ui-icon-plus { background-position: -16px -128px; }
-.ui-icon-plusthick { background-position: -32px -128px; }
-.ui-icon-minus { background-position: -48px -128px; }
-.ui-icon-minusthick { background-position: -64px -128px; }
-.ui-icon-close { background-position: -80px -128px; }
-.ui-icon-closethick { background-position: -96px -128px; }
-.ui-icon-key { background-position: -112px -128px; }
-.ui-icon-lightbulb { background-position: -128px -128px; }
-.ui-icon-scissors { background-position: -144px -128px; }
-.ui-icon-clipboard { background-position: -160px -128px; }
-.ui-icon-copy { background-position: -176px -128px; }
-.ui-icon-contact { background-position: -192px -128px; }
-.ui-icon-image { background-position: -208px -128px; }
-.ui-icon-video { background-position: -224px -128px; }
-.ui-icon-script { background-position: -240px -128px; }
-.ui-icon-alert { background-position: 0 -144px; }
-.ui-icon-info { background-position: -16px -144px; }
-.ui-icon-notice { background-position: -32px -144px; }
-.ui-icon-help { background-position: -48px -144px; }
-.ui-icon-check { background-position: -64px -144px; }
-.ui-icon-bullet { background-position: -80px -144px; }
-.ui-icon-radio-off { background-position: -96px -144px; }
-.ui-icon-radio-on { background-position: -112px -144px; }
-.ui-icon-pin-w { background-position: -128px -144px; }
-.ui-icon-pin-s { background-position: -144px -144px; }
-.ui-icon-play { background-position: 0 -160px; }
-.ui-icon-pause { background-position: -16px -160px; }
-.ui-icon-seek-next { background-position: -32px -160px; }
-.ui-icon-seek-prev { background-position: -48px -160px; }
-.ui-icon-seek-end { background-position: -64px -160px; }
-.ui-icon-seek-start { background-position: -80px -160px; }
-/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
-.ui-icon-seek-first { background-position: -80px -160px; }
-.ui-icon-stop { background-position: -96px -160px; }
-.ui-icon-eject { background-position: -112px -160px; }
-.ui-icon-volume-off { background-position: -128px -160px; }
-.ui-icon-volume-on { background-position: -144px -160px; }
-.ui-icon-power { background-position: 0 -176px; }
-.ui-icon-signal-diag { background-position: -16px -176px; }
-.ui-icon-signal { background-position: -32px -176px; }
-.ui-icon-battery-0 { background-position: -48px -176px; }
-.ui-icon-battery-1 { background-position: -64px -176px; }
-.ui-icon-battery-2 { background-position: -80px -176px; }
-.ui-icon-battery-3 { background-position: -96px -176px; }
-.ui-icon-circle-plus { background-position: 0 -192px; }
-.ui-icon-circle-minus { background-position: -16px -192px; }
-.ui-icon-circle-close { background-position: -32px -192px; }
-.ui-icon-circle-triangle-e { background-position: -48px -192px; }
-.ui-icon-circle-triangle-s { background-position: -64px -192px; }
-.ui-icon-circle-triangle-w { background-position: -80px -192px; }
-.ui-icon-circle-triangle-n { background-position: -96px -192px; }
-.ui-icon-circle-arrow-e { background-position: -112px -192px; }
-.ui-icon-circle-arrow-s { background-position: -128px -192px; }
-.ui-icon-circle-arrow-w { background-position: -144px -192px; }
-.ui-icon-circle-arrow-n { background-position: -160px -192px; }
-.ui-icon-circle-zoomin { background-position: -176px -192px; }
-.ui-icon-circle-zoomout { background-position: -192px -192px; }
-.ui-icon-circle-check { background-position: -208px -192px; }
-.ui-icon-circlesmall-plus { background-position: 0 -208px; }
-.ui-icon-circlesmall-minus { background-position: -16px -208px; }
-.ui-icon-circlesmall-close { background-position: -32px -208px; }
-.ui-icon-squaresmall-plus { background-position: -48px -208px; }
-.ui-icon-squaresmall-minus { background-position: -64px -208px; }
-.ui-icon-squaresmall-close { background-position: -80px -208px; }
-.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
-.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
-.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
-.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
-.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
-.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
-
-
-/* Misc visuals
-----------------------------------*/
-
-/* Corner radius */
-.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
-.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
-.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
-.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
-.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
-.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
-.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
-
-/* Overlays */
-.ui-widget-overlay { background: #666666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat; opacity: .50;filter:Alpha(Opacity=50); }
-.ui-widget-shadow { margin: -5px 0 0 -5px; padding: 5px; background: #000000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x; opacity: .20;filter:Alpha(Opacity=20); -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }/*
- * jQuery UI Resizable 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Resizable#theming
- */
-.ui-resizable { position: relative;}
-.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;
-	/* http://bugs.jqueryui.com/ticket/7233
-	 - Resizable: resizable handles fail to work in IE if transparent and content overlaps
-	*/
-	background-image:url(data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=);
-}
-.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
-.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
-.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
-.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
-.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
-.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
-.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
-.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
-.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/*
- * jQuery UI Selectable 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Selectable#theming
- */
-.ui-selectable-helper { position: absolute; z-index: 100; border:1px dotted black; }
-/*
- * jQuery UI Accordion 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Accordion#theming
- */
-/* IE/Win - Fix animation bug - #4615 */
-.ui-accordion { width: 100%; }
-.ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
-.ui-accordion .ui-accordion-li-fix { display: inline; }
-.ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
-.ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
-.ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
-.ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
-.ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
-.ui-accordion .ui-accordion-content-active { display: block; }
-/*
- * jQuery UI Autocomplete 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Autocomplete#theming
- */
-.ui-autocomplete { position: absolute; cursor: default; }	
-
-/* workarounds */
-* html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
-
-/*
- * jQuery UI Menu 1.8.13
- *
- * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Menu#theming
- */
-.ui-menu {
-	list-style:none;
-	padding: 2px;
-	margin: 0;
-	display:block;
-	float: left;
-}
-.ui-menu .ui-menu {
-	margin-top: -3px;
-}
-.ui-menu .ui-menu-item {
-	margin:0;
-	padding: 0;
-	zoom: 1;
-	float: left;
-	clear: left;
-	width: 100%;
-}
-.ui-menu .ui-menu-item a {
-	text-decoration:none;
-	display:block;
-	padding:.2em .4em;
-	line-height:1.5;
-	zoom:1;
-}
-.ui-menu .ui-menu-item a.ui-state-hover,
-.ui-menu .ui-menu-item a.ui-state-active {
-	font-weight: normal;
-	margin: -1px;
-}
-/*
- * jQuery UI Button 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Button#theming
- */
-.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
-.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
-button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
-.ui-button-icons-only { width: 3.4em; } 
-button.ui-button-icons-only { width: 3.7em; } 
-
-/*button text element */
-.ui-button .ui-button-text { display: block; line-height: 1.4;  }
-.ui-button-text-only .ui-button-text { padding: .4em 1em; }
-.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
-.ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
-.ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; }
-.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
-/* no icon support for input elements, provide padding by default */
-input.ui-button { padding: .4em 1em; }
-
-/*button icon element(s) */
-.ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
-.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
-.ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
-.ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
-.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
-
-/*button sets*/
-.ui-buttonset { margin-right: 7px; }
-.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
-
-/* workarounds */
-button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
-/*
- * jQuery UI Dialog 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Dialog#theming
- */
-.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
-.ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative;  }
-.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 
-.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
-.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
-.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
-.ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
-.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
-.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; }
-.ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; }
-.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
-.ui-draggable .ui-dialog-titlebar { cursor: move; }
-/*
- * jQuery UI Slider 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Slider#theming
- */
-.ui-slider { position: relative; text-align: left; }
-.ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
-.ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
-
-.ui-slider-horizontal { height: .8em; }
-.ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
-.ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
-.ui-slider-horizontal .ui-slider-range-min { left: 0; }
-.ui-slider-horizontal .ui-slider-range-max { right: 0; }
-
-.ui-slider-vertical { width: .8em; height: 100px; }
-.ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
-.ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
-.ui-slider-vertical .ui-slider-range-min { bottom: 0; }
-.ui-slider-vertical .ui-slider-range-max { top: 0; }/*
- * jQuery UI Tabs 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Tabs#theming
- */
-.ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
-.ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
-.ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
-.ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
-.ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
-.ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
-.ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
-.ui-tabs .ui-tabs-hide { display: none !important; }
-/*
- * jQuery UI Datepicker 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Datepicker#theming
- */
-.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
-.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
-.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
-.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
-.ui-datepicker .ui-datepicker-prev { left:2px; }
-.ui-datepicker .ui-datepicker-next { right:2px; }
-.ui-datepicker .ui-datepicker-prev-hover { left:1px; }
-.ui-datepicker .ui-datepicker-next-hover { right:1px; }
-.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px;  }
-.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
-.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
-.ui-datepicker select.ui-datepicker-month-year {width: 100%;}
-.ui-datepicker select.ui-datepicker-month, 
-.ui-datepicker select.ui-datepicker-year { width: 49%;}
-.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
-.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0;  }
-.ui-datepicker td { border: 0; padding: 1px; }
-.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
-.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
-.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
-.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
-
-/* with multiple calendars */
-.ui-datepicker.ui-datepicker-multi { width:auto; }
-.ui-datepicker-multi .ui-datepicker-group { float:left; }
-.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
-.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
-.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
-.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
-.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
-.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
-.ui-datepicker-row-break { clear:both; width:100%; }
-
-/* RTL support */
-.ui-datepicker-rtl { direction: rtl; }
-.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
-.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
-.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group { float:right; }
-.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
-
-/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
-.ui-datepicker-cover {
-    display: none; /*sorry for IE5*/
-    display/**/: block; /*sorry for IE5*/
-    position: absolute; /*must have*/
-    z-index: -1; /*must have*/
-    filter: mask(); /*must have*/
-    top: -4px; /*must have*/
-    left: -4px; /*must have*/
-    width: 200px; /*must have*/
-    height: 200px; /*must have*/
-}/*
- * jQuery UI Progressbar 1.8.13
- *
- * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * http://docs.jquery.com/UI/Progressbar#theming
- */
-.ui-progressbar { height:2em; text-align: left; }
-.ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
diff --git a/share/lua/http/dialogs/batch_window.html b/share/lua/http/dialogs/batch_window.html
deleted file mode 100644
index e402d1ff31..0000000000
--- a/share/lua/http/dialogs/batch_window.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<script type="text/javascript">
-//<![CDATA[
-	$(function(){
-		$('#window_batch').dialog({
-			autoOpen: false,
-			width: 600,
-			modal: true,
-			buttons:{
-				"<?vlc gettext("Send") ?>":function(){
-					var cmds	=	$('#batchCommand').val().split("\n");
-					for(var i=0;i<cmds.length;i++){
-						cmds[i]	=	cmds[i].replace(/^#.*$/,'\n');
-					}
-					cmds	=	cmds.join(";").replace(/\n/g,';').replace(/;+/g,';').replace(/^;/,'');
-					sendVLMCmd(cmds);
-					$(this).dialog('close');
-				},
-				"<?vlc gettext("Cancel") ?>":function(){
-					$(this).dialog('close');
-				}
-			}
-		});
-	})
-//]]>
-</script>
-<div id="window_batch" title="<?vlc gettext("VLM Batch Commands") ?>">
-<textarea id="batchCommand" cols="50" rows="16">
-<?vlc gettext("#paste your VLM commands here") ?>
-
-<?vlc gettext("#separate commands with a new line or a semi-colon") ?>
-</textarea>
-</div>
diff --git a/share/lua/http/dialogs/browse_window.html b/share/lua/http/dialogs/browse_window.html
deleted file mode 100644
index c66ac49cd8..0000000000
--- a/share/lua/http/dialogs/browse_window.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<script type="text/javascript">
-//<![CDATA[
-	var browse_target		=	'default';
-	$(function(){
-		$('#window_browse').dialog({
-			autoOpen: false,
-			width: 600,
-			height: 650,
-			modal: true,
-			resizable: false,
-			buttons: {
-				"<?vlc gettext("Open") ?>":function(){
-					$('li.ui-selected','#browse_elements').each(function(){
-						$(this).dblclick();
-					});
-				},
-				"<?vlc gettext("Enqueue") ?>": function() {
-					$('li.ui-selected','#browse_elements').each(function(){
-						var path	=	this.getAttribute('opendir') ? this.getAttribute('opendir') : this.getAttribute('openfile');
-						switch(browse_target){
-							default:
-								sendCommand('command=in_enqueue&input='+encodeURI(path));
-								setTimeout(function(){updatePlayList(true);},1000);
-								break;
-						}
-					});
-					$(this).dialog("close");
-				},
-				"<?vlc gettext("Cancel") ?>" : function(){
-					$(this).dialog("close")
-				}
-			}
-		});
-	});
-//]]>
-</script>
-
-<div id="window_browse" title="<?vlc gettext("Media Browser") ?>">
-	<div style="height:500px;overflow: auto;">
-		<ol id='browse_elements' selectable="selectable">
-			<li><?vlc gettext("Play List") ?></li>
-		</ol>
-	</div>
-</div>
diff --git a/share/lua/http/dialogs/create_stream.html b/share/lua/http/dialogs/create_stream.html
deleted file mode 100644
index 1eb077fbb9..0000000000
--- a/share/lua/http/dialogs/create_stream.html
+++ /dev/null
@@ -1,394 +0,0 @@
-<script type="text/javascript">
-//<![CDATA[
-	$(function(){
-		$('#stream_out_method').change(function(){
-			$('#output_options').empty();
-			switch($(this).val()){
-				case 'file':
-					var options	=	$('#file_options').clone();
-					break;
-				case 'http':
-					var options	=	$('#net_options').clone();
-					break;
-				case 'mmsh':
-				case 'rtp':
-				case 'udp':
-					var options	=	$('#net_options').clone();
-					$('#stream_out_file_',options).val('');
-					break;
-			}
-			$('[id]',options).each(function(){
-				$(this).attr('id',$(this).attr('id').substr(0,$(this).attr('id').length-1));
-				$(this).attr('name',$(this).attr('name').substr(0,$(this).attr('name').length-1));
-			});
-			$(options).css({
-				'visibility':'visible',
-				'display':'block'
-			})
-			$(options).appendTo('#output_options');
-		});
-		$('#stream_out_mux').change(function(){
-			if($(this).val()=='ffmpeg'){
-				$('#stream_out_mux_opts').val('{mux=flv}');
-			}else{
-				$('#stream_out_mux_opts').val('');
-			}
-		});
-		$('#window_create_stream').dialog({
-			autoOpen: false,
-			width:800,
-			modal: true,
-			buttons:{
-				"<?vlc gettext("Create") ?>":function(){
-					var e	=	false;
-					$('input',$(this)).removeClass('ui-state-error');
-					$('#stream_error_container').css({
-						'visibility':'hidden',
-						'display':'none'
-					});
-					if(!$('#stream_name').val()){
-						$('#stream_name').addClass('ui-state-error');
-						e	=	true;
-					}
-					if(!$('#stream_input').val()){
-						$('#stream_input').addClass('ui-state-error');
-						e	=	true;
-					}
-
-					if($('#stream_out_method').val()!='file' && !$('#stream_out_port').val()){
-						$('#stream_out_port').addClass('ui-state-error');
-						e	=	true;
-					}
-					if($('#stream_out_method').val()!='file' && !$('#stream_out_dest').val()){
-						$('#stream_out_dest').addClass('ui-state-error');
-						e	=	true;
-					}
-
-					if($('#stream_out_method').val()=='file' && !$('#stream_out_filename').val()){
-						$('#stream_out_filename').addClass('ui-state-error');
-						e	=	true;
-					}
-					if(e){
-						$('#stream_error_message').empty();
-						$('#stream_error_message').append('One or more fields require attention.');
-						$('#stream_error_container').css({
-							'visibility':'visible',
-							'display':'block'
-						})
-					}else{
-						sendVLMCmd(buildStreamCode());
-						$(this).dialog('close');
-					}
-				},
-				"<?vlc gettext("Cancel") ?>":function(){
-					$(this).dialog('close');
-				}
-			}
-		});
-		$('#button_input').click(function(){
-			browse_target	=	'#stream_input';
-			browse();
-			$('#window_browse').dialog('open');
-		});
-		$('#button_in_screen').click(function(){
-			$('#stream_input').val('screen://');
-		});
-	});
-	function buildStreamCode(){
-		var name		=	$('#stream_name').val().replace(' ','_');
-		var infile		=	$('#stream_input').val();
-
-		var vcodec		=	$('#stream_vcodec').val();
-		var vb			=	$('#stream_vb').val();
-		var fps			=	$('#stream_fps').val();
-		var scale		=	$('#stream_scale').val();
-		var dlace		=	$('#stream_deinterlace').is(':checked');
-
-		var acodec		=	$('#stream_acodec').val();
-		var ab			=	$('#stream_ab').val();
-		var srate		=	$('#stream_samplerate').val();
-		var channels	=	$('#stream_channels').val();
-
-		var scodec		=	$('#stream_scodec').val() && !$('#stream_soverlay').checked ? ','+$('#stream_scodec').val() : '';
-		var soverlay	=	$('#stream_soverlay').is(':checked') ? ',soverlay' : '';
-
-		var outmethod	=	$('#stream_out_method').val();
-		var mux			=	$('#stream_out_mux').val();
-		var muxoptions	=	$('#stream_out_mux_opts').val() ? '{'+$('#stream_out_mux_opts').val()+'}' : '';
-
-		if(outmethod=='file'){
-			var filename	=	$('#stream_out_filename').val();
-		}else{
-			var outport		=	$('#stream_out_port').val();
-			var outdest		=	$('#stream_out_dest').val();
-			var outfile		=	$('#stream_out_file').val();
-		}
-		var dest		=	outmethod=='file' ? filename : (outfile ? outdest+':'+outport+'/'+outfile : outdest+':'+outport);
-		var inCode		=	'new '+name+' broadcast enabled input "'+infile+'" ';
-		var transCode	=	'output #transcode{vcodec='+vcodec+',vb='+vb+',fps='+fps+',scale='+scale+',acodec='+acodec+',ab='+ab+',samplerate='+srate+',channels='+channels+scodec+soverlay+'}';
-		var outCode		=	':std{access='+outmethod+',mux='+mux+muxoptions+',dst='+dest+'}';
-
-		return inCode+transCode+outCode;
-	}
-//]]>
-</script>
-<div id="window_create_stream" title="<?vlc gettext("Create Stream") ?>">
-	<table width="100%">
-		<tr>
-			<td style="text-align:right" valign="top">
-				<h5><?vlc gettext("Stream name") ?></h5>
-			</td>
-			<td colspan="5" valign="top">
-				<input type="text" name="stream_name" id="stream_name" value=""/>
-			</td>
-		</tr>
-		<tr>
-			<th colspan="2" valign="top">
-				<h5><?vlc gettext("Video") ?></h5>
-			</th>
-			<th colspan="2" valign="top">
-				<h5><?vlc gettext("Audio") ?></h5>
-			</th>
-			<th colspan="2" valign="top">
-				<h5><?vlc gettext("Subtitles") ?></h5>
-			</th>
-			<th colspan="2" valign="top">
-				<h5><?vlc gettext("Output") ?></h5>
-			</th>
-		</tr>
-		<tr>
-			<td style="text-align:right" valign="top"><?vlc gettext("Video codec") ?></td>
-			<td valign="top">
-				<select name="stream_vcodec" id="stream_vcodec">
-					<option value="FLV1">FLV1</option>
-					<option value="mp1v">mp1v</option>
-					<option value="mp2v">mp2v</option>
-					<option value="mp4v">mp4v</option>
-					<option value="DIV1">DIV1</option>
-					<option value="DIV2">DIV2</option>
-					<option value="DIV3">DIV3</option>
-					<option value="h263">H263</option>
-					<option value="h264">H264</option>
-					<option value="WMV1">WMV1</option>
-					<option value="WMV2">WMV2</option>
-					<option value="MJPG">MJPG</option>
-					<option value="theo">theo</option>
-				</select>
-			</td>
-			<td style="text-align:right" valign="top"><?vlc gettext("Audio codec") ?></td>
-			<td valign="top">
-				<select name="stream_acodec" id="stream_acodec">
-					<option value="mp3">mp3</option>
-					<option value="mpga">mpga</option>
-					<option value="mp2a">mp2a</option>
-					<option value="mp4a">mp4a</option>
-					<option value="a52">a52</option>
-					<option value="vorb">vorb</option>
-					<option value="flac">flac</option>
-					<option value="spx">spx</option>
-					<option value="s16l">s16l</option>
-					<option value="fl32">fl32</option>
-				</select>
-			</td>
-			<td style="text-align:right" valign="top"><?vlc gettext("Subtitle codec") ?></td>
-			<td valign="top">
-				<select name="stream_scodec" id="stream_scodec">
-					<option value=""><?vlc gettext("None") ?></option>
-					<option value="dvbs">dvbs</option>
-				</select>
-			</td>
-			<td style="text-align:right" valign="top"><?vlc gettext("Output	method") ?></td>
-			<td valign="top">
-				<select name="stream_out_method" id="stream_out_method">
-					<option value="http">HTTP</option>
-					<option value="file"><?vlc gettext("File") ?></option>
-					<option value="mmsh">MMSH</option>
-					<option value="rtp">RTP</option>
-					<option value="udp">UDP</option>
-				</select>
-			</td>
-		</tr>
-		<tr>
-			<td style="text-align:right" valign="top"><?vlc gettext("Video bitrate") ?></td>
-			<td valign="top">
-				<select name="stream_vb" id="stream_vb">
-					<option value="4096">4096</option>
-					<option value="3072">3072</option>
-					<option value="2048">2048</option>
-					<option value="1024">1024</option>
-					<option value="768">768</option>
-					<option value="512">512</option>
-					<option value="384">384</option>
-					<option value="256">256</option>
-					<option value="192">192</option>
-					<option value="128">128</option>
-					<option value="96">96</option>
-					<option value="64">64</option>
-					<option value="32">32</option>
-					<option value="16">16</option>
-				</select>
-			</td>
-			<td style="text-align:right" valign="top"><?vlc gettext("Audio bitrate") ?></td>
-			<td valign="top">
-				<select name="stream_ab" id="stream_ab">
-					<option value="512">512</option>
-					<option value="384">384</option>
-					<option value="256">256</option>
-					<option value="192">192</option>
-					<option value="128">128</option>
-					<option value="96">96</option>
-					<option value="64">64</option>
-					<option value="32">32</option>
-					<option value="16">16</option>
-				</select>
-			</td>
-			<td style="text-align:right" valign="top"><?vlc gettext("Overlay") ?></td>
-			<td valign="top">
-				<input type="checkbox" name="stream_soverlay" id="stream_soverlay" value="1" />
-			</td>
-			<td style="text-align:right" valign="top"><?vlc gettext("Multiplexer") ?></td>
-			<td valign="top">
-				<select name="stream_out_mux" id="stream_out_mux">
-					<option value="ts">MPEG TS</option>
-					<option value="ps">MPEG PS</option>
-					<option value="mpeg1">MPEG 1</option>
-					<option value="ogg">OGG</option>
-					<option value="asf">ASF</option>
-					<option value="mp4">MP4</option>
-					<option value="mov">MOV</option>
-					<option value="wav">WAV</option>
-					<option value="raw">Raw</option>
-					<option value="ffmpeg" selected="selected">FFMPEG</option>
-				</select>
-			</td>
-		</tr>
-		<tr>
-			<td style="text-align:right" valign="top"><?vlc gettext("Video FPS") ?></td>
-			<td valign="top">
-				<select name="stream_fps" id="stream_fps">
-					<option value="300">300</option>
-					<option value="120">120</option>
-					<option value="100">100</option>
-					<option value="72">72</option>
-					<option value="60">60</option>
-					<option value="50">50</option>
-					<option value="48">48</option>
-					<option value="30">30</option>
-					<option value="25" selected="selected">25</option>
-					<option value="24">24</option>
-				</select>
-			</td>
-			<td style="text-align:right" valign="top"><?vlc gettext("Audio sample rate") ?></td>
-			<td valign="top">
-				<select name="stream_samplerate" id="stream_samplerate">
-					<option value="192000">192 KHz</option>
-					<option value="96000">96 KHz</option>
-					<option value="50000">50 KHz</option>
-					<option value="48000">48 KHz</option>
-					<option value="44100" selected="selected">44 KHz</option>
-					<option value="32000">32 KHz</option>
-					<option value="22050">22 KHz</option>
-					<option value="16000">16 KHz</option>
-					<option value="11025">11 KHz</option>
-					<option value="8000">8 KHz</option>
-				</select>
-			</td>
-			<td colspan="2" valign="top"> </td>
-			<td style="text-align:right" valign="top"><?vlc gettext("MUX options") ?></td>
-			<td valign="top">
-				<input type="text" name="stream_out_mux_opts" id="stream_out_mux_opts" value="{mux=flv}" />
-			</td>
-		</tr>
-		<tr>
-			<td style="text-align:right" valign="top"><?vlc gettext("Video scale") ?></td>
-			<td valign="top">
-				<select name="stream_scale" id="stream_scale">
-					<option value="0.25">25%</option>
-					<option value="0.5">50%</option>
-					<option value="0.75">75%</option>
-					<option selected="selected" value="1">100%</option>
-					<option value="1.25">125%</option>
-					<option value="1.5">150%</option>
-					<option value="1.75">175%</option>
-					<option value="2">200%</option>
-				</select>
-			</td>
-			<td style="text-align:right" valign="top"><?vlc gettext("Audio channels") ?></td>
-			<td valign="top">
-				<select name="stream_channels" id="stream_channels" >
-					<option value="1">1</option>
-					<option value="2" selected="selected">2</option>
-					<option value="4">4</option>
-					<option value="6">6</option>
-				</select>
-			</td>
-			<td colspan="2" valign="top"> </td>
-			<td colspan="2" rowspan="2" valign="top">
-				<div id="output_options">
-						<table>
-							<tr>
-								<td style="text-align:right" valign="top"><?vlc gettext("Output port") ?></td>
-								<td valign="top"><input type="text" name="stream_out_port" id="stream_out_port" value="8081" /></td>
-							</tr>
-							<tr>
-								<td style="text-align:right" valign="top"><?vlc gettext("Output destination") ?></td>
-								<td><input type="text" name="stream_out_dest" id="stream_out_dest" value="0.0.0.0" /></td>
-							</tr>
-							<tr>
-								<td style="text-align:right" valign="top"><?vlc gettext("Output	file") ?></td>
-								<td valign="top"><input type="text" name="stream_out_file" id="stream_out_file" value="stream.flv" /></td>
-							</tr>
-						</table>
-				</div>
-			</td>
-		</tr>
-		<tr>
-			<td valign="top" style="text-align:right"><?vlc gettext("Deinterlace") ?></td>
-			<td valign="top">
-				<input type="checkbox" name="stream_deinterlace" id="stream_deinterlace" value="1" />
-			</td>
-			<td colspan="2" valign="top"> </td>
-			<td colspan="2" valign="top"> </td>
-		</tr>
-		<tr>
-			<td style="text-align:right" colspan="2" valign="top">
-				<?vlc gettext("Input media") ?>
-			</td>
-			<td colspan="6" valign="top">
-				<input type="text" name="stream_input" id="stream_input" value="" size="50" />
-				<div id="button_input" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Media file") ?>" opendialog="window_browse"><span class="ui-icon ui-icon-eject"></span></div>
-				<div id="button_in_screen" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Capture screen") ?>" ><span class="ui-icon ui-icon-contact"></span></div>
-			</td>
-		</tr>
-	</table>
-	<div class="ui-widget" id="stream_error_container" style="display:none;visibility: hidden;">
-		<div class="ui-state-error ui-corner-all" style="padding: 0 .7em;">
-			<p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>
-			<strong><?vlc gettext("Error:") ?></strong> <span id="stream_error_message"><?vlc gettext("Sample ui-state-error style.") ?></span></p>
-		</div>
-	</div>
-</div>
-<div id="net_options" style="display:none;visibility: hidden;">
-	<table>
-		<tr>
-			<td style="text-align:right" valign="top"><?vlc gettext("Output port") ?></td>
-			<td valign="top"><input type="text" name="stream_out_port_" id="stream_out_port_" value="8081" /></td>
-		</tr>
-		<tr>
-			<td style="text-align:right" valign="top"><?vlc gettext("Output destination") ?></td>
-			<td valign="top"><input type="text" name="stream_out_dest_" id="stream_out_dest_" value="0.0.0.0" /></td>
-		</tr>
-		<tr>
-			<td style="text-align:right" valign="top"><?vlc gettext("Output file") ?></td>
-			<td valign="top"><input type="text" name="stream_out_file_" id="stream_out_file_" value="stream.flv" /></td>
-		</tr>
-	</table>
-</div>
-<div id="file_options" style="display:none;visibility: hidden;">
-	<table>
-		<tr>
-			<td style="text-align:right" valign="top"><?vlc gettext("File name") ?></td>
-			<td valign="top"><input type="text" name="stream_out_filename_" id="stream_out_filename_"/></td>
-		</tr>
-	</table>
-</div>
diff --git a/share/lua/http/dialogs/equalizer_window.html b/share/lua/http/dialogs/equalizer_window.html
deleted file mode 100755
index a81bb13c37..0000000000
--- a/share/lua/http/dialogs/equalizer_window.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<script type="text/javascript">
-//<![CDATA[
-	var bands	=	new Array('60Hz','170Hz','310Hz','600Hz','1kHz','3kHz','6kHz','12kHz','14kHz','16kHz');
-	$(function(){
-		$('#window_equalizer').dialog({
-			autoOpen: false,
-			height: 650,
-			width: 500,
-			resizable: false,
-			buttons:{
-				"<?vlc gettext("Reset") ?>":function(){
-					$('.eqBand').each(function(){
-						$(this).slider('value',0);
-						sendEQCmd({
-							command:'equalizer',
-							val: 0,
-							band: $(this).attr('id').substr(2)
-						})
-					});
-
-				},
-				"<?vlc gettext("Close") ?>":function(){
-					$(this).dialog("close");
-				}
-			}
-		});
-		$('#preamp').slider({
-			min: -20,
-			max: 20,
-			step: 0.1,
-			range: "min",
-			animate: true,
-			stop: function(event,ui){
-				$('#preamp_txt').empty().append(ui.value+'dB');
-				sendEQCmd({
-					command:'preamp',
-					val: ui.value
-				})
-			},
-			slide: function(event,ui){
-				$('#preamp_txt').empty().append(ui.value+'dB');
-			}
-		});
-	});
-//]]>
-</script>
-<div id="window_equalizer" title="<?vlc gettext("Graphical Equalizer") ?>">
-	<div style="margin: 5px 5px 5px 5px;">
-		<div><?vlc gettext("Preamp:") ?> <span id="preamp_txt">0dB</span></div>
-	</div>
-	<div style="margin: 5px 5px 10px 5px;">
-		<div id="preamp" style="font-size: 18px;"></div>
-	</div>
-</div>
diff --git a/share/lua/http/dialogs/error_window.html b/share/lua/http/dialogs/error_window.html
deleted file mode 100644
index 2237baba47..0000000000
--- a/share/lua/http/dialogs/error_window.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<script type="text/javascript">
-	$(function(){
-		$('#window_error').dialog({
-			autoOpen: false,
-			width:400,
-			modal: true,
-			buttons:{
-				"<?vlc gettext("Close") ?>":function(){
-					$('#error_container').empty();
-					$(this).dialog('close');
-				}
-			}
-			});
-	})
-</script>
-<div id="window_error" title="<?vlc gettext("Error!") ?>">
-	<div class="ui-state-error"><div class="ui-icon ui-icon-alert"></div></div>
-	<div id="error_container" class="ui-state-error"></div>
-</div>
diff --git a/share/lua/http/dialogs/mosaic_window.html b/share/lua/http/dialogs/mosaic_window.html
deleted file mode 100644
index a93c0b6d6e..0000000000
--- a/share/lua/http/dialogs/mosaic_window.html
+++ /dev/null
@@ -1,146 +0,0 @@
-<script type="text/javascript">
-//<![CDATA[
-	$(function(){
-		$('#window_mosaic').dialog({
-			autoOpen: false,
-			width: 800,
-			maxWidth: 1000,
-			minWidth: 800,
-			minHeight: 500,
-			modal: true,
-			buttons: {
-				"<?vlc gettext("Create") ?>": function() {
-					$(this).dialog("close");
-				},
-				"<?vlc gettext("Cancel") ?>" : function(){
-					$(this).dialog("close")
-				}
-			}
-		});
-		$('#mosaic_bg').resizable({
-			maxWidth: 780,
-			ghost: true
-		});
-		$('#mosaic_tiles').draggable({
-			maxWidth: 780,
-			handle: 'h3',
-			containment: [13,98,99999999,99999999],
-			drag:function(event,ui){
-				var xoff	=	ui.offset.left - $('#mosaic_bg').offset().left;
-				var yoff	=	ui.offset.top - $('#mosaic_bg').offset().top-17;
-				$('#mosaic_xoff').val(xoff);
-				$('#mosaic_yoff').val(yoff);
-			}
-		});
-		$('input','#mosaic_options').change(setMosaic);
-		setMosaic();
-	});
-	function setMosaic(){
-		var rows	=	Number($('#mosaic_rows').val());
-		var cols	=	Number($('#mosaic_cols').val());
-		var n		=	0;
-		$('#mosaic_tiles').empty()
-		$('#mosaic_tiles').append('<tr><td colspan="99"><h3 style="margin:0px;cursor:move; font-weight:normal" class="ui-widget-header"><?vlc gettext("Mosaic Tiles") ?></h3></td></tr>');
-		for(var i=0;i<rows;i++){
-			$('#mosaic_tiles').append('<tr>');
-			for(var j=0;j<cols;j++){
-				$('tr:last','#mosaic_tiles').append('<td class="mosaic">');
-				$('td:last','#mosaic_tiles').append('<div id="mosaic_open__'+n+'" class="button icon ui-widget ui-state-default" title="Open Media" style="margin-top:49%"><span class="ui-icon ui-icon-eject"></span></div>');
-				n++;
-			}
-		}
-		$('.mosaic').resizable({
-			alsoResize: '.mosaic',
-			resize:function(event,ui){
-				$('#mosaic_width').val(ui.size.width);
-				$('#mosaic_height').val(ui.size.height);
-				$('[id^=mosaic_open]').css({
-					'margin-top': Number($('#mosaic_height').val()/2)
-				});
-			}
-		});
-		$('.mosaic').css({
-			'background': '#33FF33',
-			'width': Number($('#mosaic_width').val()),
-			'height':Number($('#mosaic_height').val()),
-			'text-align': 'center',
-			'float' : 'left',
-			'border' : '1px solid #990000',
-			'margin-left': Number($('#mosaic_rbord').val()),
-			'margin-right': Number($('#mosaic_rbord').val()),
-			'margin-top': Number($('#mosaic_cbord').val()),
-			'margin-bottom': Number($('#mosaic_cbord').val())
-		});
-		$('[id^=mosaic_open_]').each(function(){
-			$(this).css({
-				'margin-top': Number($('#mosaic_height').val()/2)
-			});
-			$(this).click(function(){
-				browse_target	=	'#'+$(this).attr('id');
-				get_dir();
-				$('#window_browse').dialog('open');
-			});
-		});
-
-		$('.button').hover(
-			function() { $(this).addClass('ui-state-hover'); },
-			function() { $(this).removeClass('ui-state-hover'); }
-		);
-	}
-//]]>
-</script>
-
-<div id="window_mosaic" title="<?vlc gettext("Create Mosaic") ?>">
-	<table id="mosaic_options">
-		<tr>
-			<td style="text-align:right"><?vlc gettext("Rows") ?></td>
-			<td>
-				<input type="text" name="mosaic_rows" id="mosaic_rows" size="3" value="2"/>
-			</td>
-			<td style="text-align:right"><?vlc gettext("X offset") ?></td>
-			<td>
-				<input type="text" name="mosaic_xoff" id="mosaic_xoff" size="3" value="0" disabled="disabled"/>
-			</td>
-			<td style="text-align:right"><?vlc gettext("Row border") ?></td>
-			<td>
-				<input type="text" name="mosaic_rbord" id="mosaic_rbord" size="3" value="5"/>
-			</td>
-			<td style="text-align:right"><?vlc gettext("Width") ?></td>
-			<td>
-				<input type="text" name="mosaic_width" id="mosaic_width" size="3" value="100" disabled="disabled"/>
-			</td>
-		</tr>
-		<tr>
-			<td style="text-align:right"><?vlc gettext("Columns") ?></td>
-			<td>
-				<input type="text" name="mosaic_cols" id="mosaic_cols" size="3" value="2"/>
-			</td>
-			<td style="text-align:right"><?vlc gettext("Y offset") ?></td>
-			<td>
-				<input type="text" name="mosaic_yoff" id="mosaic_yoff" size="3" value="0" disabled="disabled"/>
-			</td>
-			<td style="text-align:right"><?vlc gettext("Column border") ?></td>
-			<td>
-				<input type="text" name="mosaic_cbord" id="mosaic_cbord" size="3" value="5"/>
-			</td>
-			<td style="text-align:right"><?vlc gettext("Height") ?></td>
-			<td>
-				<input type="text" name="mosaic_height" id="mosaic_height" size="3" value="100" disabled="disabled"/>
-			</td>
-		</tr>
-	</table>
-	<div id="mosaic_bg" class="ui-widget-content" style="background: #3333FF;width:400px; height:300px;text-align: center; vertical-align: middle;">
-		<h3 style="margin:0px;font-weight:normal" class="ui-widget-header"><?vlc gettext("Background") ?></h3>
-		<table id="mosaic_tiles" class="ui-widget-content" cellpadding="0" cellspacing="0">
-			<tr><td colspan="99"><h3 style="margin:0px;cursor:move; font-weight:normal" class="ui-widget-header"><?vlc gettext("Mosaic Tiles") ?></h3></td></tr>
-			<tr>
-				<td class="mosaic"></td>
-				<td class="mosaic"></td>
-			</tr>
-			<tr>
-				<td class="mosaic"></td>
-				<td class="mosaic"></td>
-			</tr>
-		</table>
-	</div>
-</div>
diff --git a/share/lua/http/dialogs/offset_window.html b/share/lua/http/dialogs/offset_window.html
deleted file mode 100644
index 05a0fb31b9..0000000000
--- a/share/lua/http/dialogs/offset_window.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<script type="text/javascript">
-//<![CDATA[
-	$(function(){
-		$('#window_offset').dialog({
-			autoOpen: false,
-			minWidth: 400,
-			buttons:{
-				"Close":function(){
-					$(this).dialog("close");
-				}
-			}
-		});
-		$( "#rateSlider" ).slider({
-			range: "min",
-			value: 1,
-			min: 0.25,
-			max: 10,
-			step: 0.25,
-			stop: function( event, ui ) {
-				sendCommand({
-					'command':'rate',
-					'val':(ui.value)
-				})
-			},
-			slide: function(event,ui){
-				$('#currentRate').empty();
-				$('#currentRate').append(ui.value+'x');
-			}
-		});
-		$( "#audioSlider" ).slider({
-			range: "min",
-			value: 0,
-			min: -10,
-			max: 10,
-			step: 0.25,
-			stop: function( event, ui ) {
-				sendCommand({
-					'command':'audiodelay',
-					'val':(ui.value)
-				})
-			},
-			slide: function(event,ui){
-				$('#currentAudioDelay').empty();
-				$('#currentAudioDelay').append(ui.value+'s');
-			}
-		});
-		$( "#subtitleSlider" ).slider({
-			range: "min",
-			value: 0,
-			min: -10,
-			max: 10,
-			step: 0.25,
-			stop: function( event, ui ) {
-				sendCommand({
-					'command':'subdelay',
-					'val':(ui.value)
-				})
-			},
-			slide: function(event,ui){
-				$('#currentSubtitleDelay').empty();
-				$('#currentSubtitleDelay').append(ui.value+'s');
-			}
-		});
-	});
-//]]>
-</script>
-<div id="window_offset" title="<?vlc gettext("Track Synchronisation") ?>">
-	<div><?vlc gettext("Playback Rate") ?></div>
-	<div id="rateSlider" title="<?vlc gettext("Playback Rate") ?>"></div>
-	<div id="currentRate" class="dynamic">1x</div>
-	<br/>
-	<div><?vlc gettext("Audio Delay") ?></div>
-	<div id="audioSlider" title="<?vlc gettext("Audio Delay") ?>"></div>
-	<div id="currentAudioDelay" class="dynamic">0s</div>
-	<br/>
-	<div><?vlc gettext("Subtitle Delay") ?></div>
-	<div id="subtitleSlider" title="<?vlc gettext("Subtitle Delay") ?>"></div>
-	<div id="currentSubtitleDelay" class="dynamic">0s</div>
-</div>
diff --git a/share/lua/http/dialogs/stream_config_window.html b/share/lua/http/dialogs/stream_config_window.html
deleted file mode 100644
index d219c6d403..0000000000
--- a/share/lua/http/dialogs/stream_config_window.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<script type="text/javascript">
-	$(function(){
-		$('#window_stream_config').dialog({
-			autoOpen: false,
-			width:400,
-			modal: true,
-			buttons:{
-				"<?vlc gettext("Okay") ?>":function(){
-					$('#player').empty();
-					$('#player').attr('href',$('#stream_protocol').val()+'://'+$('#stream_host').val()+':'+$('#stream_port').val()+'/'+$('#stream_file').val());
-					flowplayer("player", "http://releases.flowplayer.org/swf/flowplayer-3.2.7.swf");
-					$(this).dialog('close');
-				},
-				"<?vlc gettext("Cancel") ?>":function(){
-					$(this).dialog('close');
-				}
-			}
-		});
-	})
-</script>
-<div id="window_stream_config" title="<?vlc gettext("Stream Input Configuration") ?>">
-	<table>
-		<tr>
-			<td><?vlc gettext("Protocol") ?></td>
-			<td><input type="text" name="stream_protocol" id="stream_protocol" value="http" /></td>
-		</tr>
-		<tr>
-			<td><?vlc gettext("Host") ?></td>
-			<td><input type="text" name="stream_host" id="stream_host" value="" /></td>
-		</tr>
-		<tr>
-			<td><?vlc gettext("Port") ?></td>
-			<td><input type="text" name="stream_port" id="stream_port" value="8081" /></td>
-		</tr>
-		<tr>
-			<td><?vlc gettext("File") ?></td>
-			<td><input type="text" name="stream_file" id="stream_file" value="stream.flv" /></td>
-		</tr>
-	</table>
-</div>
diff --git a/share/lua/http/dialogs/stream_window.html b/share/lua/http/dialogs/stream_window.html
deleted file mode 100644
index 86ff218b8f..0000000000
--- a/share/lua/http/dialogs/stream_window.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<script type="text/javascript">
-//<![CDATA[
-	var stream_server		=	window.location.hostname;
-	function configureStreamWindow(stream_protocol,stream_server,stream_port,stream_file){
-		$('#stream_protocol').val(stream_protocol);
-		$('#stream_host').val(stream_server);
-		$('#stream_port').val(stream_port);
-		$('#stream_file').val(stream_file);
-	}
-	$(function(){
-		$('#window_streams').dialog({
-			autoOpen: false,
-			minWidth: 600,
-			minHeight: 430,
-			buttons:{
-				"<?vlc gettext("Close") ?>":function(){
-					$(this).dialog("close");
-				}
-			}
-		});
-		$('#window_stream_config').dialog({
-			autoOpen: false,
-			width:400,
-			modal: true,
-			buttons:{
-				"<?vlc gettext("Okay") ?>":function(){
-					$(this).dialog('close');
-				}
-			}
-		});
-		$('#button_create_stream').click(function(){
-			$('#window_create_stream').dialog('open');
-			return false;
-		});
-		$('#button_clear_streams').click(function(){
-			sendVLMCmd('del all');
-			return false;
-		});
-		$('#button_config_streams').click(function(){
-			$('#window_stream_config').dialog('open');
-			return false;
-		});
-		$('#button_create_mosaic').click(function(){
-			$('#window_mosaic').dialog('open');
-			return false;
-		});
-		$('#button_refresh_streams').click(function(){
-			updateStreams();
-			return false;
-		})
-		$('#stream_host').val(stream_server);
-	});
-//]]>
-</script>
-<div id="stream_status_" style="visibility:hidden;display:none;">
-	<h3><a href="#" id="stream_title_"></a></h3>
-	<div>
-		<div id="button_stream_stop_" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Stop") ?>"><span class="ui-icon ui-icon-stop"></span></div>
-		<div id="button_stream_play_" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Play") ?>"><span class="ui-icon ui-icon-play"></span></div>
-		<div id="button_stream_loop_" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Loop") ?>"><span class="ui-icon ui-icon-refresh"></span></div>
-		<div id="button_stream_delete_" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Remove Stream") ?>"><span class="ui-icon ui-icon-trash"></span></div>
-		<div>Title: <span id="stream_file_"></span></div>
-		<div style="width: 260px; margin: 5px 0px 10px 0px;">
-			<div id="stream_pos_"></div>
-			<?vlc gettext("Time:") ?> <span id="stream_current_time_">00:00:00</span> / <span id="stream_total_time_">00:00:00</span>
-		</div>
-	</div>
-</div>
-<div id="window_streams" title="<?vlc gettext("Manage Streams") ?>">
-	<div id="button_create_stream" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Create New Stream") ?>" opendialog="window_create_stream"><span class="ui-icon ui-icon-plus"></span></div>
-	<div id="button_create_mosaic" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Create Mosaic") ?>" opendialog="window_create_mosaiac"><span class="ui-icon ui-icon-calculator"></span></div>
-	<div id="button_clear_streams" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Delete All Streams") ?>"><span class="ui-icon ui-icon-trash"></span></div>
-	<div id="button_config_streams" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Configure Stream Defaults") ?>"><span class="ui-icon ui-icon-wrench"></span></div>
-	<div id="button_refresh_streams" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Refresh Streams") ?>"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span></div>
-	<div id="stream_info">
-
-	</div>
-
-</div>
-<div id="window_stream_config" title="<?vlc gettext("Stream Input Configuration") ?>">
-	<table>
-		<tr>
-			<td><?vlc gettext("Protocol") ?></td>
-			<td><input type="text" name="stream_protocol" id="stream_protocol" value="http" /></td>
-		</tr>
-		<tr>
-			<td><?vlc gettext("Host") ?></td>
-			<td><input type="text" name="stream_host" id="stream_host" value="" /></td>
-		</tr>
-		<tr>
-			<td><?vlc gettext("Port") ?></td>
-			<td><input type="text" name="stream_port" id="stream_port" value="8081" /></td>
-		</tr>
-		<tr>
-			<td><?vlc gettext("File") ?></td>
-			<td><input type="text" name="stream_file" id="stream_file" value="stream.flv" /></td>
-		</tr>
-	</table>
-</div>
diff --git a/share/lua/http/foot.html b/share/lua/http/foot.html
new file mode 100644
index 0000000000..5f85cabb08
--- /dev/null
+++ b/share/lua/http/foot.html
@@ -0,0 +1 @@
+</html>
diff --git a/share/lua/http/head.html b/share/lua/http/head.html
new file mode 100644
index 0000000000..83ca099668
--- /dev/null
+++ b/share/lua/http/head.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="initial-scale=1">
+    <title>VLC media player - Web Interface</title>
+    <link href="favicon.ico" type="image/x-icon" rel="shortcut icon" />
+    <link rel="stylesheet" href="dist/css/vendors.min.css">
+    <link rel="stylesheet" href="dist/css/style.min.css">
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
+    <script src="dist/js/vendors.min.js"></script>
+    <script src="dist/js/script.min.js"></script>
+</head>
diff --git a/share/lua/http/images/Audio-48.png b/share/lua/http/images/Audio-48.png
deleted file mode 100644
index a32e6aa7a587fd3d8423c2fd345dc2238d41f24e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4675
zcmV-J61?q+P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000sSNkl<ZXx`OY
zX^>pib^gx1_if#;m+6_FMH(#(!jcd|fNTknQ6XVrV+^)2sSq2IGOBVJT)0fAO2x at 9
z|8TkDiXB(-!&~J~TsV#$KyhUOf@}=fVU<_~Xe5{!X-2d3%=G&9dry8$j~Hax!4PG6
zRkz=JRo(ZV?|kQ;tuHY%{y$%IE+-%Q^xvYi^AC}==K!Wpr*U$#<=OWW=zazV%iojv
zUd;XU&#-XtFMsDX#JL2p at YvrVt)B#09 at v-<wogv&j_R#DA?WwsCWK>wr2VeeIHv&O
zlh5Pi_dWp~HK2UII<&?qw8kgac4p`QoP^i|0L%uR*B(PU|K__|L!N6J)vXx>#~wp|
z^S)1wTr{vPZb$L-@!2fjSMDL(dc>riWc+KFAwKo;|2+myGjZY&qN$e|(t&iO&`FxM
zXXkf8&@}*oEbm><EzYrnpyf4;kjPj=GlQhaf`vsZZnVD0f;Mp)zUxKQdy!BGL5|~C
zM6j>F{$uMeyzs(}uH*CwDWqjtmJosj2_tm0c!1A8&yGVlf(0a7I!Tho#N_$ajqAVV
z at 3`fQ?Wccq^nVP1<2Z77c(}T6- at f-<d+ojtc&<0Ne*Jo<P$)QBvmhxlDU}8ZZ7FGb
zOHT0IKLy237@)^hPNnFTg#>~ijC;NCL;mgG{r)i)cLvY=@Rf58V8 at Of=UspO^*cWP
z at f&yAwp~q9gH*$=2X<wy&83vBQah5RT2tlffm9vqm=4R2wO?;u>KD{7+7wH+v?Y~o
z^3rvOeGnDfyUnfN`0nv6{z7v2z8Ca403Zej2mM=axn=LIx8AzfaomA=GZ4CsLEGzD
zN6PEhBpm~QH30+|2pASf*`TQ#entTTPLPPmF;2(HWR~efL@|*WvW>W?&+PK|fAjAq
zAGzSmGf({Jk)$@3{I|GK+p*>L?b|ng^{Zd~?B2b5uW1KSHPLd!FZJ*63%whpv`dDU
z6k!-(1~e1GNFYuHLN$%hJA%pP8c0+SwgUw17}62~0(NCEFN7sQU{pOC$Zx#nW68Q*
zLvs41XQPFw&U<2 at TrRtxyy=ry-SPQ5ZVQ62&}@aPD%DjRZ6{ySnvrP at fItKgF^HC)
z1^9H5!kmE-gJ~(}B0*pf7y`@;L4YBH#At*WOqtTs_KP-s;f?b5);ss!{iW#_esRpa
z8wLu6g13MF{ttidbD#U8xmvAUDE4ewv-Z4;lx4ZhjJI+?0(Z4<m|zS+GZ03EAQ1?x
z6X<v^VzRXXlKT*~0%+TX+gAcxKHQuOiwKf6j4>1>nV~dE2YY)qTNiy~TcrF~gNc_;
zA&dDP18`l}zU{W#_T9dJ|7U8oT4~kL>PuIxTD^w3Ya;-_055A9wDisd1Aq-7OawZS
zKwFI=%)f|Jjg3&I7eOb2Ea!2<b*HdxONPPT1W^XeHXX2L2%{-VGYUINGFZ-??`*vC
zqR!}(kB2jF&cBmDMgZiVJ$rWCamSs%->BDfYlc@}Iyg8m2pAB!Yc2o at KoTIjgU%SD
zJF}q}h7y35z!5Eh9VmquskX6w{UZKg=Op&;o<OylA|e4cERr-*Q?re5oo9Bg`pnn9
z;SH=Uy%Pq+=1rT{{l(Y6zCTUVQh$HnWdj2P!%Lc9f=6^lE>26NEZH@|=p`niRG<+E
zG_4~D{Z}y4*am5Ok%TeWvGIXTA$$nrncxE$_A*?ts)eFQI979 at BQ1h3A|*u9KfHQF
zVsLEng`d6DmE`OU5Rv=Y+i(Av at B2fJV{I5-J+z*%q)j0RQY<~ovkhVhENx05m at UPb
zB{_i%Gl+~q1j7W95<*INB#{SD0N?|#jX*_c+&nmm_YbzQ02|U6HCt=S9*fncoqKLw
zKRncTW(^}(C{yg(wd>Nm?)u^l_4-0})20pYw{2T7Ge{5w0ldPyoW8m$VFrYd^La-+
zU2ySeZ!SK#u4nO)s*s2Bkvnl at VPsIl&vTjqw!)r`4fGPD03c6*uMON*fPABgEj)wQ
z;xbOP71AgctA~6PhSta(Ztac7fA!?60L-s3;CY^Z!wolV4}x~3TJ61{SS-3Af>Z)h
zN=Qktq<|&qwAPgbqy&^g>butALEriNUY8$pOnXv?3#m>zxr!>vt$fLhuY2n{B}0&z
z6yP!g<t_t-C_!Pqj(lwaYN3PmQ4^o<IR=@tAf+H<GT}<@+;HQK?_0Ze?eIz#mg9iv
z>FF8VvuDpG_4=Z}dCTTukc5-~lL0e>i9lo^3 at _a^LmLJF;|TjDhuvq4PDMLNR;P)!
zT*tFXfrXOV6kOxZC`YyhU}TbIf{O-riP*}w0(grJIIRFytRW3xgoW*18ygBSW>f)*
zVT>dv7B9YXdu7X(Et at AMCQbs-09bX=SXW$e#X4h5C6~_+6iX$`XbmC>2m%2xf+0-?
zHVk11LKq06A!0R6kvgGS4{F2GbMwfM%7ef7_vz;jJv(0Mt=PLSe}9$4Hev!iM~T3Q
zwmy}OR@{YcPOV9HkU}v*kOe3Sk`k^`xV+fLLxokaMTC!flRarXq_4Z~y0r%n9xNnD
zQeVk{`_b#J+nT1SJ+ylDpoD}GfFK5UojozYV#(#O=?brfiR)%Qjlz;8rLrtLgQMen
zzVxMo4;*;lSpZD{@;ilmU-eIZva`JI;x%NnP$Z~6$uHY(YmJ{~y^uCYDUh^5Qh}re
zNQoO)CHUo3h~4=*MtmM_1P$lvz1OTQm&?7gv$Ktr47kN&X)uhUT(MLt0DvI5BsC<!
z3<AI`mUgQ&U{=s!lD1k+hCnVd-0mw^!k<3$(^nrj at W7)0CIEy0Xra{^%WCs;J?9A!
zk+CcxA#?L7N;8%d_8Q9rDH~80AT5wofK(WfgulwyP_zibD)>6f3WZ`RmQohF4v3c-
zu!R&}6h&^KP_TK0r(g2*wCrb3dmcf6My4Bavr{PMR6A)01;=rYJpc40fMWm_-{!0c
zVG4q65u^Yq&uu1N|01jiq+F1)0I2{W-x?$^?01Vg64Ge)ZQGu+EGxIXkre=P9LENc
zWM<*n_EN+=YmG>!ovr{Nl?1ycc5{eh#|dAk8>v2U!#3}u`bMp6L!dU3Xky{y>!MgD
zZ8At9K$3LMu`;(@QSc;)mIW8xFfQLx7>VWb58O`k1n9ME*XAZBCdBDIP%4#d*KvrM
zli#J=<$Jc$xt#sO2_qh>d6%DRCNQ}0^71FPd^lu_4T;#XL at d+hf-TdvI!PjxlMHa0
zcWtZCSM7!CycJAnWsK*yOCkl*)}q5%Dy!A1-3<XtCbY1yppzsq`FuX%6+i#2?L0Pk
zY&ubYeKdFR=t7G3Ro(p6{TBH)!6slX$n?u6+rijOm^!v~UYb!{Pm^%S&)a~>dMbUZ
z+}^=eAOhID6%ChHUVdJ_OM#RZGNh?BH948Cj02QqS*Ep4JkN{bI8I#0u}@=PIT35X
zXhd<0Z at m)YCu51&J)HBe8Yx05g4RH03`ZHGUs+=Bh2_GFMLT(Zywk}v>mXvzw2 at 9u
zx&s6Kdm&_w0T7*~Il_3G8W{#@W)f{edu)6>T&75MACfqZ1IMxBc73tq_E&9WDWJ2Z
zVNxJVfGma%JNV|P#C=mXZr;*^{=7shPO%sfry$lENHvgZ!v+lBQ?M+F*l5;57%2%w
zN0fvxy at m~##M?}k&de0MpIK_sOlNTvMKH!h%jv{2fcVhi!zVUeaKVQ8QzsVseA$C2
z1hN!JV;~8EGy>u#o>)-$&hgdw#0D2R8<=S)NHim6roadeG$Aw0nPGqk(~a1qnHGZB
z%G<C?j&xJOGVHXGBM(AZAQB)Ue{J`zd~0_)tt`{=vC(6-AP5>O0RTXF;QsrM-*nSW
zdnae6XEv1Nh}0P&jesNqk`NrXk;WYysEr_JG?WAu!VI0%AZCL^1F^|Os2Q;aYX+jg
zV5$}=OF-F at M9xz}T7-(q5C;(=0a#83DJ=*o0HL~NsQ`5=y=5S?vvZS5+2+8311CD2
z&O#ReFEfyynm%>v*s<eN10}z=Ht|Mlpx_ia3czUy&LVIcVIcv28CT$f@!DK~HPswa
zW+a*r8-v&|V$H}jQ at xp>UQa<x%CZPb2vmI=Apw`l2qv)*L=rADEZaaD1ri1%1q4Zu
z5C8~*1fn#_+U?d!W)5C_ at x`%jfaJFoG-;aYB#!%bf9Tpxv*V*!=Ok4mZE)Iw$s!oe
z&@zO7OxHsQ3$-A{Y&$`a8Z=XldX!<YouS at JF;ffC4pZ=Q1t$naSE0A;fs!`%<wBG_
z8$zljU(ek2MBO`<y^(<s0uvJ_-Za`AKlsQaC+ at xX-h%+ at -DK{x326YqQ%^nh{OHlw
zcMO#K{qfnc#q)aXo|G9Z04)ffig9In5<lZjC<sD5&M at E7NVMtp8M>RUTW%^ru$4eH
zXQ5om;q^ub{c|(O@&#mupfy8lAO*v)hGiJS2uNc<!a!LHtwtlN&DCBdu>Qdhe(=l+
z;rYyhhQlyS+wHc!=fl^ZKR!L14SH!`E+?e10BsX8n@|vKypR-;SY>!Zf(THOU`qi@
z3D}l^rv!?wg-XuGK*@t}B*xzygE#Reh8XaRC9JQwuq*{B-l|jC at KWl|3?T%x&hYxt
z<4@;v{_Kx`{0~R&yYIeV0GJ1movkKj06aD})>^Y>cwp;}t19D at Cz7EauG+pusiP1(
zHe8jV#Pj%7BZo-%DCTVVwnEWWD0wyto`rnQhLdx^&^TFdpf)~+p_xgnE#%PK*8?Z-
zW2EB2a|DDCryBvwv5c_PwwX9N^%4nrboA)a=9j<xr~jO$>3G-v&2K8|4FL1ZGtV?H
z-ge2*noXC|)ZD48uc~@g!J)*qkyr}t1UNC-!E}8Q^&~+%4iT6Xoh(8#Y@*SwVRm{3
z&Epg3oj!#T(irToqQ9?-{+=RMm+}}cT2N9#2wLjToF;<6OqiXSeI?8E^YwZ?`@)@f
zJ~TT!`x1c0O6~uqzEGBBS at 87JPc<&T@`Hn`F1Rc_RhtX^9_qJ?wq!@()lLDgH*)Z~
z11Da9h-Z;?rjWMYMAm!*+&qa&E5#aF!ce6bL;Y0@^;IxfDqx_L!@9Bq-|lMvt%d>w
z2^eF{?9B9G1`c;RZNB^NyMK1%$dM-j%mIkc%yP~KzyQd?Fzh_>#N&;vTQ3>hxb>=V
zd~$x4yrg3H*xn51FcuXc3l7|pg<Me~pEt<m6L@}#eBMT%dmaV~>o8dE!Rks8LnR+o
z-$Q at iLCF!2Qb361wq(~`Mo};|dE#;3&yCK_&Cxyg-1F$O&p!Jf0A>J0XG_t3Q)^KJ
zNP-|}KlIRp^F2L1<sCaeVip%^yw+-IRYZAFd5ZHEoRWlHBv`(N at -tYTM$XEiPmExd
zGlYSB4g&=jRo_O*vEW%t4FW;56to0^jZW)}wWIaM+~fV#O6|Gl4h47Jb=ScoM~*xV
zVERnEe<uK_3nJE9Hy(ZT(W$Yq<8tSY-976Dwob`dj%MiSj?KO*YKNQ%$_XIs08+-t
znLMi52>MkO6-S}$D)^3qr392*%J~Tloy9??y>KiF7M{#`bktIkzy0m+y!n-{eC6R<
zt at b>C+21DoJ87?L011H3=;-L|{rBHDpJv+Gy74mWs*y`aHx??dSy?tG(@qel^CC$X
zr7?k$VHu@(0}AMaEeVbSEU5wLh;`gFx;-Jd{gSPs!v&w-NRu%7`Okm8aQEGR{KUf#
zKm4mK%a$v;__qoFPHPwH0(Afs0Sr_sm9;m2>gEe~U3q2Y>JMIp-oXJi8PDcUHmCf>
zpp}oqoGV&Y#T{Y07Emd>aluoeZK2~i6uT}Z&BmfWbm(w)=+L3|gAYFV%8?^Sj&;pt
zv8(m$zbH$7=c5MHjofax8(0R=ziIR4)r0;0{a0UgwSVo0_T@{(lI?mHD at Tx!WJgh~
zwKfQ&SO;Oq&pmr6_?LhEx7N(e%>3x+=*do}vn+J0D|oshmpCV9B}A7ItIJBRJ4(4+
zt}LbWgb=or(iTEUW;R;u)EE<Mt>Z8Zo5q+$0G+PDQP)g$chEZ({=FXd5G(eP>JF=W
z7ia7*vqHeEtL1D(PGkPJPpi-we{P>`Za#}?yyvq%{|WUuz-WxddGi1O002ovPDHLk
FV1iN9%P0T<

diff --git a/share/lua/http/images/Back-48.png b/share/lua/http/images/Back-48.png
deleted file mode 100644
index 0363d849737e9a7773834d1911558bacea60ff85..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2025
zcmV<F2Nw8=P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000NDNkl<ZXx_z{
zOKe<M8OML;+<WKF*s&ek<0K>|FWR(CBVs3RV^^>tNbJ}kA<71jphy%JKv5(fQX&L`
z1uyYPi2#WOY9yqJ6 at mo|D&WQ>Es#P&Y171w9mmc1G4{;d*LkoQzb0|wd8PSAXBKzv
zx#$1C-}nE{_ni^eTH0kl`OCND=im1=)6Co-2ixiCNo%fk_ye53kbnj0S_A?|3g+f~
ze){Rl0Jx1Vbn=DCd;I!|C%^sTjQ}8t&DhDO2hY{}Tp=t{)?V}6ES()oXf5!3a9vQ!
z#agj?PYr=Tz8P)0(Acs3hS!7f!l;)K!O@{U051GvHaPjh<k;A;{2e4dv_E^te5EbY
zslDbpS at QW_CazUb3bHwY5Va8_+Yvg!cmX#ff|22Vu1><$Nf;UK$IFNy7%z<0^9*YQ
zuJn--qy)!t at x6W?-t!*f&?78o at Eni%xlDTr1mlHK*Aw=MW$-JuLc;Z^i-hlIaLr-%
z_I- at qy&qv;-^c0pAE7hbiz7NnVvnwF2V(_4`^=^G5D3N#qmD~3a-<e~4T&Rp9CvdP
z<x0%;w_l}DoM53e!R*py=1Q-z6wY(}_%;q7&QU06vRPfLo%LC$9u2GqFCBs>kLI~H
zb?<xk?t;I+T)=3?#*XFBZKMH!@4d7G$I%GZFj)jrWGODVXeBxM;VZ2ZSONdUkvtPO
z>La{oC!Bw|fH7<+?2YVhL|f88FkToHl3=6(@BkAxs^KK0ty|djm~0e0f?#Ag&s#Sd
zU+k at EI66E4w2y>r2s{Kwhx1&&+5Cc&H{r<e02bOpLe>l3Sc2i9JX15RzqK20!|>re
z#<oskQxON_g;8w?jtu3QnWe2Z&<Fpzcnc}ShQbcU3)S-F>A~ha5R4Z_wYI_G_qHEA
zz^yqr^!NbUG_MJHFYrne96B^WVV?VDb457#*Z at j3M?&5We5wcz9?Ubp$bGkB2_AWD
zfV2q`azpT`2p)Yj&ti#p%*qvb_(0>Hs39<ZVe<WHLh#Umeo7Uv_MIJJ1bg=nkR<hI
zr`3Mo)Y*xrk~sI$&cQC`=i|EAXLFf`-f|Qso8A)w+uzm2%=A)_$uI_-+myhmvlCB6
zk^9#@`})uZ{A?XyqJ&1fQ43_V^^xASr-#XF#lZLPO+tL}^y|m6IdiTNAlrBDM5P)(
z>or6mj#4td%k<<_{iJONVY$-t!)FgHZn}}xV_$myjq8JZwhdZi$@q;CNa7SP<8t-&
zsihx$?m%}t#NTjJFCetG8V;sG^3^%j2C`k*t6>7x+UkI&G(eSvd|(8iN&q2f=1i$N
z$I1ujf$9)Vc!1@(Si}QqXjVO7Y?X+y4Gk$JwkiU?`s?eN2dIH2J+N|wlJnEW`I-3H
z?@u>1-<VAH^m9XT(;;N6McBr((2Di+cK0mI-$JEoEfkiI<$C)2>FwY6^e-$&6lZTG
z)+pV)2e8WoETYL|D5QhYmLyIQLVys+<s-wzxguC^`Mk7NDxF;&U`d~UZdf&+g{%bw
zNI@$H+pgy!q8K4$4Op!d)|izO-`kcpXr-doG=R0nT4W38g%Efd4<W?bTV4lND}{8N
zyCt&u*0PWlS5>N7E1iLi at 2?VAKM<f)g0-e*NJpSm3f5j~iGb1ie3GQr*s2zq8P-~I
zot>}&0U-ohtF;|}dAP2FN|iCjjJHI<TJvfe$4jkvKx<2`vjfRG;42>?sv5YBfZySh
zL~#YU*y>LFpCnGy%7)a8C2>rrmm`zQlE%qOk+ at nYX<HTY`Yh!887fOl2KZa6JMks0
zl}yvLc at G$aQkt%wu2m1%<<E+kwbrX|UpkWI)PED0Yl*<=FArI){Zm+}V2rsVRyP~Q
z7>qF_aY|2L at 9NH8^+9z{KnTn_0-fERl$J`yT7K7tS_q6bXVWOIByrqC{A;YSL}5(F
zmQK7(W(70LNeBTLqgFFe_tq|og}D;gU!6HI(rP&k7W;=JiHw)#FeXGg4pPe1a$uwS
z$!Lu>8nc{Xs-;25_FX%ex;D991#8WZF?9F#kR%D(m^Xpf+Twwqf8|ICYk!$U6{EEx
zO=99GB&?JO!!l7+AqvZcl at gWm5@Dr89EYehsR_G<*&<u>eYbD8tJy-Ul)i0!OkbN?
z#M*DRshnQj55AK`VS0xSjH$kDtvA((QU;YOc0aU#!!`Q0<q1m_(j>V8ym))~v_#;{
ziIJN^%HJe$Xg3CEHXUG at xp9l`zHWN at d)K;d1RY&l=--iNdSY at B_+%Sf%5`2)>a)N{
z at pD`3ZGC#Z?WT|pw{FfdxbNL$e4mBF9MX~O+Be9x|6VB>W4>_a#K^_E{vT+ at p84*D
z-BQX|w&e4D*)3g7wTjkQ9GkGUe=Dx%VzlAv<u^)Ux$^ZhCq{l$_a7WhRFyq|fAoXT
z>>oP*sb5HI9$)`x1c>UFrCKIf5LP&j5}*-6gHQ<J0XY>XN;tw;ZT|hgSAPGEKmYdB
zKY`d<TfAQcb^zVWTFUG@^nqb7+vz!u=L#vM5RR16@!U+-O2?Bz2%*v_P2)-um5Xsy
zo{ytSF)0^k;;6i!Jio&=T4}A4tAL`~d6cZRGxsfo9<==*d~&0}Tjl8s00000NkvXX
Hu0mjfftc<U

diff --git a/share/lua/http/images/Folder-48.png b/share/lua/http/images/Folder-48.png
deleted file mode 100644
index 59fe6389bef42057f00c38e0ee5c99750e2575a0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1353
zcmV-P1-AN$P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000FLNkl<ZXx{Bv
zJ#QpM5S?AOZS8t**BIMK90H^xxX2O_86vm at M26r;5D*d|5 at G~Igk<~$B0 at 4mLIe>U
z`0ji at Ztuh11>5_ at d*iO5T-)6<v$9UMa7(4`nd#|yuj_SH&y1VRX4z#f?oy+_B5+0E
z90=^}>;x|~o6T%#X(_`Ze|L3t^|R&W<<&-`F@<Hu7zG+^XQz!~478j7pbUq at PcYv1
z98*dtc<6JwJ(*0h>2w;rC+Pv)@ESmTJsOQ(hDG~n(4lJp{wbP25ew%=-%~LP4q>A@
z5_%sq{xKeW1MHt8`vl1(0hU&)^(Myq70n}J56wF3km1>Y(L6XlKK=&XzL+C09*- at c
zjg^&^FHygQn at VT6$}B=cthN``Ii!3YBtAbnI{E=veoPVo;}@NC*LglQ^Utz)Z!{p|
zS3%?~fs>PyGo2xs4hS at A=<}HrPA0InbRdWkxQ3{cN1=;CfD)!6NPv;?3<2n>2%AEH
zoqY(sFa#J%L7*)-Wsy6XX<4uU-|loe(YU)v6sprN*4ImDjT6f at RRXDJZewF3?@R*y
zexDcH>_EmBZ4CfVm$<gJwz6)wd+GrJ*>1OU+3fG{x7e97(lNSD_*{f|$UFKR#{|C4
z=H_O$zP?^$XXo|*0;&(;l55-B+i#Ev-Q%<9TrE13b7J;503bgXN?sya-DWLDz`b7Y
zElB4p95bUcvHij|@H`sdBH7&Hph#lHL+t)Wg9_}4<}|FwkT$Y%D(lXHH$-kC7u+Nn
zjP)L{f8fw~2Pbby<Y8D%&1UF0CIKrej=8qB7L=JB>*SdtiNd7zw!^_#GZlGATONEK
znieVOP#6PSCNW7{4g=oC$)~WMzJU*6M*@*r%Od3gt at A)A%w-w_ADj6Ac(xyrz<peJ
zh=ZO6ph3rElp+w55x3<!Nm}5cb0Om;*aL>qhiKe`-OwEt1z$!W4}H!B^>00qS_gQ>
zQ(V474-6oezRb7=V2PXu0T#-LBtk%AgaRJu=N<s?86Nmp&yWReb+5x at T>>H_Sz|FT
zq@?5n%sr~ddB9I}rz*295y~!ZOTy*?nuKf%yyiNf2ZqiwdJ at y5fU}`5Hv6e<xC93Y
z(Y9}ug{`9GW7JdU-FV;T0Sm%szvvp#p)$3 at tm}msAx?U+nZv=ZS>efeu4ms~ue!C?
zud*>Oq&!2}>)q&{Wf|HJ#nS&G1Z;9l5eSjMeK}@X#FWqh+FiRSV-cq;R94;N+wVhF
z$oO-+tes~xKzqO!hL8tBk}2E2SMfsZo(k_7XwLQu0@>*Yr$Ze^%fK%xADa{GOM01n
zd?D8ToPduSV?2BiS_5^!*L at R{h-Kd;Vq{c%;H at CQK@LNjw7_E0S>!cR?n!<0jSx8W
zs`-zAPt9`~HKtWdu*wTfXpGp$gOZ3x0%N at f=+3*TFd9l!cCEy6!XlC at A#flKr$FDf
zi#W9CVo at XHsgTA)UbWfV?w<np?iB>o&AZkE7MwiPUP~>)6nQ&tjSp#eq^~CM$bRxD
zbMJY6_zGp^#Pk1{lMu?#N+D+2{dHb+LgZ_{#7Lh9Ap(EFe#1jwK|SHWFK_Z6Ogf%9
zr@%^kX33aYZK(6|8K3{y8meDIne^jz+TUpZSrAYI--UgI4zK&cPGBP+uA~;5sCueu
zX$#@00 at PGBZAsPIoUvtZEB^l9VLyjF!1A59OH;0XbYBtpzZ3Wu_mxC-<*T}K00000
LNkvXXu0mjfuLpZt

diff --git a/share/lua/http/images/Other-48.png b/share/lua/http/images/Other-48.png
deleted file mode 100644
index 83fae77abfdfefd39feff59977c62255a4b60af8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2921
zcmV-v3zqbWP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000XxNkl<ZXx{Bv
z>yH~(6+d at oJbrua-SzHz?TsDpdXspQR4q}05E39hl_KB+;sbv|Kk*4vBwB%>pYka}
zLY3O8v>;V#l?DkR5F%0pD5xZ9UL^@_=z}(!$3DE9_4+aP4CmarGjr$R&8A2|B__GL
zGqYpQ`JMASzjN+2vn&ff&4==-w*LPB{s#^gyiu;~DZX~{)NjV~W4Ynb<WE>QTf+gc
zm at b~O#D8z5RHA%x1|6n+jl;Y4KN}qU4LGZ+3M;Ft%Rl?+iN_72--!aC1#iS++M%WW
zjU%~i#=AKf0JPfxV`Dpd!!f`#J!4H1!SicV+^1_3hNk^Dd&uYZ7~)VEgLpi?c=4_C
z&6Rt1&+iJr%uH#H;RiQ1Hpsc4C<++s>tGFr5J!)Iq+0f=<?}QdD|^#6SOz3OS(azK
z6#yc@(laqlgKDi-9R(ni1GBTGs;V$_`Vh?FkiWRU-U16jS;9M^kjn!shh$)RY;z;z
zU4chO!Diw!Igg2R`dcEd!}$0_c~sOx5!k=Kxs*z!Af8C at 5YiXM@H|<X0R`vX9G>?r
z*OQ*t>00)-B^)Cnf%!Icsb at kWnS!~wx%u4!Q1|WMx7g`)pxf;M!$=T?y7Yp69~ef3
ziL_^og^cEjYepxgFDIO9ABDo#4#0)R;?k}FD2iIB)oQbbF at OQmM==?gYzP)|-=qhI
zHUP)?NDzWI!G9nrj6*jo$T9w<-god<qJY%v^9$(66aw1b5kMxJoi5Loa!I6+9*=YH
zgJD2F7K3yy$6p#WdPgdOm(-@^Klf3|Np#_HS)DXhgPBsPn91gfn;WeUb_7r;6v}ZV
z|NZ;-Z5>7h7`9q4xW5GqDFsvuL|!<<O+XgTfhfHXtCA^6Zy3mc8Ia3lQkhI<Dhhy4
zh3fT%1F3Wxoo=|v)Zc1TaX?)jhP2vKB-6+JoysQH7YV#Q+YVsP>?jc_AAVmxKgLkr
zYY)tU1I=bLjr7^(`M^L$!x>UZ&t(yV4otHt#FIM|g$Jn;gc914JUvpOs21S68;gsN
zTsZ&N*LDOjU$58ts5aeR7gR+B6{BF7LvEzm?Q-uZOyL0Np5g*<JP5+OPLX4FCip02
z^4SbVPF5o~H*Aoa7K8l<mL7Rf1mflL>`WV5hHj_J`w&G_!Pvxn$Yekj39NAM3lPA(
zc?Wg!=Y<s!2^*YKg at ZYv^n0*~2ib_D7YP6jo|r67O>0P-BvFU}&>v7zQ<*FpZMPMC
z_-LdED#5N5DhhxpN5NMk>~^A3DNm<T>GAFD_HrZuw0=*aFg{5=5V=E%X{bD1=yyAy
zA*C2KR~&$Cv at a4O>FA!UNTVYG(b152FXzPoMWv9>XL7mR^hf};z4b;inN-)-)-f6i
zN at xsVdy5w_3qdgg<rwZp!2$G1=>!p!k`vk+sZ>%$hE#6fUcML!pjxf&9Um`%hMw2Z
zXrhvdgK{BWC~!J)!wH-KK-bIx6Huq!7dw9&Zbd|bQyd+-&}baIdgaouBLS33rMV7L
zhWa25fI88wEzpulF!7!$40eVpX1iYs(24!KkqAeDa`HfP>ENl8uScp7D;B3}Ev&lR
z+uJq(U5DQCGVell$4HV^F}qaqCAB{%Y)bh-IK|1CBXa_*&>Dh{N~Kbblu=B|T(!2h
zp<%&Drx~Y>hM7;vn$07vuqP*v(|uLYC>V)gPAHKr$8HOrDXEeTB7p^Uu2Px8$Ec_8
z`T*o|W2JJrQrbew(7ULC8el;iprL(Q-eDiajVJzd<0T+Wan;G49cfiY(<vMY at OeMj
zJN5CqXG^82L^4_Ib~^v`0hpeduB6i`eH|$j<4LT6V$p&g4M9-6txy~Qs^@uCj)3B>
zAAFQ at qX52WJZw(%u$WC2C-bwj<@!HvzUv1tIWaj$^wHx9&{26vi5M+l5*A+(sSHE}
zR4EdwXS at s~L?=bGATpi&-D?;~xK2<qWimPJiS{)Sz!^V)si}GgX=3yZd!d03o2?CQ
zs5UUT0%>j^PZd(NtE6MNsd(qkph83{#Y`RzlQ|KAP+mkWj6&NqICOM!xm>P>lDM{a
z{t&GJu*&hW9W&x!tgJwykOvd*tIX!U7K(uCdEb}VPPLYz;Y(@>1oJDEygUs`X(Bl!
z0CPbATBEVJKp%+_eXwBAOlyDyuEMC5<+3V_*EBH)sT81;lP69C$XG<Jh%i2yPId=N
z?`teHYHpiL#-o7~MLgQ=ZQigsp)>JiJzCUYaf at M64@HHxEY009u&IPI8Bd>alH0NY
zSOSn~+8``k?=maUinDO77$vP1ezrb8Uq^`_9}EVo8~}bGkB=no-o48Ks3Q5O3MZ{0
zQYr?z9uvt;v&JJtRCANsiGbsIM_wsH5``2+iCz#%(TGZL2L#zQGc!FkJu|!K<BvYH
z0rdO5_N9xLmX91gn!9%GI$zA|^fIi-G3<d<#T1-m!Z?l7O4oG`%m+mE7dxIKz8Wz~
zVp(KzM;$Rep-fIr&LV)fc#njmbLGk<_L-xf`}|V#fWA!&n#~prjXu^qOlF*EhmO|7
zPN5m%HBpf7S}=Ks*xM?x1c5E*+?SxzrZ9we>nwN6B?16O|J12p{qg3_ch5OVY;3gF
zUw!sRKPW!+^iRH5ukF!h9($B0Yc`XHY&OF^OCBeWe)RDzIQ!-~$YryTOeP?XZHC69
zpow-PT<lzR8bK$2130<~Bw)1VGe1Ay2sU$f?%uxj{E6ew=AZn|cb~-8l_hi)>7+v*
zbASrj80`yzy_QWRl2}wSKsy)-j1uW{Oj94O*hMvgAh#c*)rq=NcO at y^Z?)Ff-nn<@
z&cyzMj~=E~P+X7mFC1VoBTrNKu3Y^atgW|rQoAh#^)rsw<k+)_eU;$mt_1;-Nl!`N
zC4<@A+ERY;%FEB;=^(f_`p(4*Zyx{UOV8)O`K at n1K^wd=OzOC<K_=VdN^=Wa?9I(h
zUaXA40Q$Wi?cs|WqIzAc8t$F!bGBm?LS3w at P9SQEg00WQc#_t~?X6o{M1(G#IsMyb
zG_ca&c;ahcG*?$3j}<wNhIY~^Xtz6DP8H-lFM7J&L&Z^%R81;)yQPy at rm|os8=+7R
zh)TJf#bcTPC?i&R7yfYicTb=G%h}5tECwxO09#np+Jhl<5eV(vk at vBfa77}8qRn9X
zNs15C8}ctMrf>H_oXd)3g?~K|n at v6%jTiC?wiJ7VIS at RS|9<1`_s0qoN2V*)3F=m3
z=;iCzZ*bZ;q2?lp#?g*82Zm!1m}&G;j{ALs%d&x;u6- at erR%<QZS({8=z07udheh9
zeD>PaE0 at n`I{+|H|9}7LD=&N>!+-n>U;1*5l!o};!!IHVsk}<ZIi*NSDF>Xwris4E
zPo=10r-YZNPBR#kS<!;fGtH%?r3XcT4rIvi!yDJ$UYVRK9jolAX7rc}_f}T11|+$h
zQu4YRvr;SIXgUPj1wjes?jeav7+5bT(%zE%55)e{d+&eHI`ziM7as(`-kURw_b$J6
zZh36H_}HPthsRb{S9$U#Q%RRbQPL?)6z3LzFwQTpp2|2U-Zk at fw55Y0u(r0|d->-t
zy`b%K`(^`srZ--E?nHd5IQhe4pFLJwSzW{aJZY~VsJY`!p2n|<PBB3#PA#HLq(Vis
z<4)yf5oJU=n$2c4H<mB$762XVy>93AA3yWd;PJ0~_3I0b#w at Cc>XW?)9d~6=qKiWd
z?;Je6cjs_)oGS##C=by|MFtOlP)|XNiURz14=MpS*(dxk{bZkl2-*G*1K9c(RUlsS
Ttz{R<00000NkvXXu0mjfPd;bf

diff --git a/share/lua/http/images/Video-48.png b/share/lua/http/images/Video-48.png
deleted file mode 100644
index 8a2b82df9f6d26223e559eea23a661642a687f39..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5115
zcmV<X69nvuP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000xhNkl<ZXx{Bw
z36xajnZ30yU3*tm at 7?r9 at 7O4~VT2GsFo1{*;!!i|oEc3<M=*FiIv649s5vugGHxNF
zs3?m9F at Q(}MFbI0Wb3v!=%zQis;jr^s;<4>-2e3waFQH7Gvgf3NqHXCRqxgRzU6-R
zyWjs*NRou_^Gn^(&@lEPnM@)Ui$SSWqPx2rH{Em-hK7dV_xr!qqOZO78m3R5F8_9P
z-9#cGzl(s0cfKrYwYq{wC682oALljRcs$<7^L0G>gdGZnV(bu~dF|MJii?Y({w|{>
z4A*M4KeF5H%WO8=M7>_0dH#9foN$zfFAxaS_4f9 at 8VZHp=BYv9z at N>)cVW0Nj7M%-
zTH3GE)6*A-??iT*o0~yHWurA34a_DJ6pXUTWOCBMt5Q=_uNoK_c(ALh>%nL=`i{uJ
zcjACbrMkd)Mz1tCH}?+~i=}vQa1a8vZEbDxIc5amXcS-7H$ufA&!2lO7<Gv2=me}*
zYmwP(ew){?qO&W%elO+!g#(R^jWT8hWO(G|<m9}UVm24o)zxA5?%il at ZG}#!LrO{t
z%F4>H at cQeq^k42lFdD=5o$m{y<sdNX=<Dl4I2=Y^Ufv at NzzZT<7i54q9Qz=Cz(dc-
zBw0*RQM}^E-}ZIt)G66`uA$1x%6fw(n}6`rgJ?c;8a;je=<MvorIRONTwWfXFyYAI
z!|3hl!6g%_ at G1Wm&c)(!?0ElughOFWzIY-sGBd$I{FJb3V}_m>g_G*?%P&WJd%Jw_
zrdO7hmhNVe-EGhtuHnsd9S(<?PMS3uwZs$#zX|P%)L+l2n$4z1j43HUIehpCx;olX
zRaJ#alP1C8bYblq>rh@=g2x_x6w8+{$GUav at ZOFc_}N`|!jxh}x3?P?RafHx9oqZx
z$H>jjk~7A-xSCnnMO!=EZuf;Ze)idCpQ3?MG?A1N(w|;Q9-*PYKyyRw(cQatzW&^Q
z{^oJs^qwV4mfSFP>eOmR#wm($^i^3|DPS@`5{bliez05Gv}u#HXV0Fo^=PQ%PD_`b
zd*KD?$dMz`;>C-lIdkSnue|b#M2JWaJn(>IwOFLBTeis8-?RLFY1_7Ky!Nm}gh=Pk
zo!fi-_;IBO<^@GuSWr+Z-oH5ZCDyH73%er~4u>6!Zny!5>bos1=lUmB=VeWtH}4{3
zxNXoFv_K+;cr4oM@%p at hV5qOXqoZG|)5q!5jJl>KwddS9*eoVFdg8Tj-#*O0?mA at W
z<e;*m0xWL4`s%A=g-_~~St&&5-ne85wr}5#E3dc$W{a6{j>z!K$jF%L^Z9<r%lC{q
zU@#aog+)ch;_q5w`1sMI&=QNmz#t|R7vU2_Io3=pfU_e2<Htd`6Ct?c3fLlkn4{f}
zT)X5b9p^$((M2#D)#&zknEHK4Pjzr at qs%y>o}PdHd4XlDSg`^V36WkF=}F$t!|T)2
z(m>eaIy%S*<K)Scc=N5d at YrLI!PC_>R at CD6w0G784zThWY<s3aczu1n-1S6MjK&l=
z>@N5mW|WS%ASd4f$-}_+0RCQfn0`{_01J0u5FZ at uhv7gUQdC?e;zh2?i}IoZB>A!F
z^cgTac;t~sKsMpJMs##^V*SRA5bQL<SaMe8%$bc<t5(TOX0cdt=+Gg#Urb;PiEBg;
zVWA5L9vE|gg=;rkEXD*cNOQSFGeLiUzua8R4i`F at RsjN~YM6XA{H2iurnB>JD>JAx
zBZY^K=LK5Ao;cDwMf44%3Jntaeym;pCdvv6ao^H=36nVX?cdK at Ig8?=LKu0SfJi%w
zT{t8h5j|opq1@@|f-55vHDA@?<|Q|RwFMGO_63cMY-8ghng|X3$?dn}`bCT2^?0F{
z5{O7Tw1=Z8;B}&*C+L7gZdC9P(G|qx(gA at uePdY|Ne;oYEznc9q>^z83JNg!l8bTV
zqup4&`nOp8cZ<j>Ib7dE<BMeI2#q5m?jYo%v8YU?pMU;2o_XeJEV=PUJoDreU at _zL
znKN?TuuhT}IKZ3aas_yOJy?3r-Lj!3ruw>TXTw&Ki=bIM+$(}KT(pK5jZF+YB9`*;
zI|DPKFaeo#K#C86Jy at pH(N{1SgpEx~6f~6^&smvCwVWm4fG}G8E#3uu$u at HB96xaa
zEB<u_tY!;|#UY<#&2&4RPN;9a^;Q{IGiS~$7dL5cX~t=GQc(l_ESPkg85ft&fW~43
zLbN+T*w9!N9gt$f(HA{MLI0G at LJ1Q)jgD+mC=rT8aen8lAic8BATuLFR=c?@M(Ug~
z<7Ed}8y2%!h6yPeB_$=Yef3QZxc&BjKoPSkY-8W57i+1PEn6l!CMdKj#ZBt#8f3#w
zTts+ZQC<#@LWg8P12qkg_YG%3!$U>LsF*{YXaO{Say~GHHPInzijC(OnIukm-oq{{
zYU-zV-6d-rVf+xYL18CnL$HhJBjOrS+ at s=-bcr=<*2qqd%g;wfdK!NpkZXhAeIaWh
zAs57=YPBXucsik?9J8*uMmQv2D74DSwjc(Y2(Qy*o^!-KjR%cah~V;w5ki;J_z5nc
zh8gMQcdGm{cu4{y@&x2<rrnD-*1d_vH!i`u<o6NwlMQu^5Qi{c$eY7Qj^Gxe<JZr>
z0IS^&H_r!yL$XbxRtPnDkWq>c#FR#_*IC(dVRt!kFI)RdFR#HnTeo6-StaVv4no<j
zz+gL#YXi=m0lb~eM1&CHBGn~86^%a;Wg+wE@&bA`K*?m4b&<HK7?d)Zl{weWVaCJc
z_D6B5wiaWWW~7k`<3$fxwsa}FI?rLsl~eHgTkB=&6j>1&BRl#(`Q($svI8S>H-#td
zNjh^sAvJT_G+aM_9#%g5Fxq^6v~_7=7-YqBz)}mN`5q#a+UbnN3FNU(KW1k9G`^*d
zi}Kn4KbKrF7r)=J9sYp<8OM4$QdpReU#)x at msd}Rug51-^7frOuwvye at cV7=%60JJ
zo)1xwUqJki$A=&6LQ<aQB-vTAz32-E)~{dRDzlJSn5oO81CBo4NEUVcK}UNBbZRAn
z2?at?%3J?1XDI~kMd9)o$H=?Vfpxn9C$X<&bIam;CxgjmjH`ZlIa>B_#^$YCFn`{B
zF_R(KZ9uwVGFCkJI4qe_w0+fqH-GykJMsXIeRhft81U4Szd{3>>9YHmA;`!tpfI%A
zZDhQp>;(1G!O at JVAAkID+;Yn;B~*#(`eVmYTT>%nC|IDfayAqsb<uI%yj~)=YDOkI
zM;eXI0vh%Wb8!b at rDFzq8Br^H*QAL+x>kYvetsX8-n|UY)KtPl3tiHQ;%XzTVF$Zw
zKdu-z70><iR`hui7#Q-S-uE8MDh6kolXJpCl#@iJOqqfJi(b?L2_d{|*RHom#iN=k
z5!Kbz6`~d at DQ{nV at g;ov=>dGfCUVtPSHja9N7$=`M%H4SS?Peqs(?EcIC})pG81vi
z2~|imH3<<mytqRLUl-8R&Hm7yiJSlaVQk&73ek9!n7$I;KoX&$FvTD-ZP&w;EJcD*
zNU?Vzd)ibP at 1hp&B5R3=3;iS5Nz at YcQ6p!9`U^(NapT6x!*#=%W&|T)+`>+L_q|I|
zHa-sztfo%!u{)+Z5ho5UDZHUsgD|;LFUc50kQvg`u~2XjcAF6nwu~IEcz8bu5n%4M
zm6$j4Nvz-U3(A6a%>L0FHZcccRI<J5F65MDBh{yZ?ji%Uc@>C-<IuAfB4n>Kr%$s%
z8f2!5P-=8^bR4?uvdg3~2+9Ab)fwV_J(b^Y{^Q@}6Cy=hw{JzuSu^nwgwL*oS)->k
zHe=8`tc3!MWVk;-{iBATs??&@6FwR^sg2^S&*l at rcs910LqOe$EL>goB0AgF;f2*}
zF`>E$m1PxB=jOq7Sts1Yew5IOhGXa- at Z&4$p#ujF;QgIDk)4^1*MIjq3k!n(_hoWA
z8{J+}v+9i(O_(sgzNra&Kio6cH3jV%9Zs~IJWH%7F_glHnY0KF3?b8zL{6azZOuJM
z#1mXM46Ry$)O<J0%!HFZx76}}3=$E7lgEOHgnS6}WTMFSGbqeH44&DK9mg7BNUeiD
zB at UfdM~PzO^{J at 1It`*WyC@}M at fb2(8PIBY?^sY!=xH(ZkJ7K2U0CtX=FJUv-g#&F
zFITQ4`?RBmg<M;6iZtngx1J3rqJs2gFQUp4L`@PpvNCb at V2A}Sl&1z32BRb|7g{dr
zpuv9jh|bm|Dzb at R)`E`(q0_36j0e$tHiA at xi$Pcbb4nDUfDck%2;oQ{S_zkmYAeb)
zfAn#%5!z{xur!;@(C7)<zHpr6(l5|4x=*BL=QBS2^wY0#@|nV7c3pburI<T+E*4RZ
zs?-{+U;9sNJW5K80BTNlptY?Ze*Y;nH1-k>I)pU2NakDuZMF$X7IP|@=}aSFW_>v6
zSWVLaq2_@?mj;D8KxitU)+EsBi^AhSA%8Xq<DwpPhdQCQo5?`w*znc{w4QCnmz)kK
zRZU{!k7Fn_6eMDLIT!!Qfni<A2HV!QnU(&JRC%hFmKM3CH#F4CwICWwSy?fr&ve7>
zu0S at WuxR~XeBOjR?syx0{g<#7*b~Hz&4Tv#B#`e`AWCNH>h54)2|>>~84CBns4*k1
zX5q&?7>ah02rLMOf{3Yn2*yLmD^A15AAN|IR{suF6;*Jjxlwg-6{$6W9$!xf8LCGV
z at aX1(a6oKeHWODL at g&FMf|-K0#NOt_i4)}+_T<SL96fqWb}CB!Ae!H-S+nrO6Hj37
zd=ECgnt+|_6;aT2cM4{b;O6Ax<4_X}dRZTOBxCX67M`#o92-I)(oISZli75LQe5?i
zde9r_Lt#le{_w#zY}v8}J9g|4QO6&*{t?rEJY7iW`o_k_*!dd>%3(PMat6L^XlU5T
zq580B=leM=iB#Qo+iehAFZoo1g`B2xa&qOdX5+?99Kbut(H0cwoG4%@R2(haI-*d9
zVm!ov9)MEKf{UvWVw5=~K*g9PVqt_6g9HV8h9U-)fpE~W%aWHfGOdJZyR40bp?0es
zE)GQ^;zUV}fX>KP<(LD>5f}*-{Mp{UdtYY;YDCj`_uY5po#_P&7RViORI`h7PG>54
zT!C|qA-MboSO}r0&_IJ6C0RR3O7DR{FQ+n<toV`?QDQ!j8IFca%Bb9NC2Eog9g46g
zq-8p&P7U&Af|+t&u#JNM*==^2ji_qdMMD#+RUD%ZNF!MgtCKTvfQG+9!yCj!B9&sR
zaK?-osNkF`U?gOQ&1QkGH;KWzB;jH}5!EQA6tz+eZoNt#b_NLve_t4S_J(-ekAxKA
zd_dR`>+wXGpW`DF5$lDtZFO)mV at F*6^W`|O?*I;dauD0LZbNE%Dnj9qkP)8IM*!kD
ze{Xcu2{A05=0$rqZrr$<nWz_$5Sci7^eET?<%vo-V6~;d(@x`i&B!vSkV=H~^h*?a
zDj1m=wFn2D(eM^ZCOH=71<5%31|!dzH_o9xsY((m0?#V0DIqh<g(gm3Q>lg*Enb92
z|LswDyS>nuGzbQQNoM4%$bc9-<;{Yx?M_Q0a0-e2SvsNEuwerhE?js!hmHygD0$N<
zJ3AX<OV7pWNb*Q1k*vsK at v22YR0&wAV096(&&nBDCm}W at A>=2^NUQ}Knp6$LNI_*7
z<6HnXKn*h(3QNe!v7 at EsjJ)|Pj^iheBR?x2^A^s-fPcVC{GSnX at L$_rPma6`C+fv6
z<L1qq15|@IbNu at O>qFM#qL3;kR6^&WB83IC6B-&F>5W2VPk<tnkxt6d=D&zXg2XzB
zkOdo62G|D(6&fuu3*m$xYD$o#q(&JB>a(q%USLqcxB~f|V`w8~#K8GaX#Udkf#gUw
zgcGO5J2gpvR#sL!BmZO03l>4MV&V4BI?<7)hdE(Ku-%BDB8fQbA}oe~trC90?_?pp
zPANN})hUqFGF2+Q9Q8z8BKP;eq0NOsm4a+y-JDX2dDqTkqim4(hzjxwWNSnZ5QOqg
z95^3Nj4RrN6I6jdMnKfWb;M$IGOSdTE}#G_t%ptNM_;!Y)qw=sIq0=^QBM1{I2UM>
z8Acs7BB~*Di~+c<YFKnhsEq<TMnt4u%8Wc{l3LizCg at FRSoO<Qa5-FTfJq3*hytbt
z>Kc94_D!GANas;3^(O-SaR(RrjDP1XUA8pup@$xtR#=c<QBqc%Vl?a3Vt0)!jlQ8l
z__}*Bw{J4~eGz!usDYY1s6XAqS^7BQ!7L;O%;*pM(H=U5PK|_dnWgejF?Gr`c)Z;*
zRA<kejWw&+$OX^)Hj3}gfBN%H9x+Mh9fKoXo4po?nwpyW at 3`X*C5P;Ei^XE&;%T|L
zxrO7$kFO-%mY0^6<YlC1xW-M$Fj;;;A+8%{jiGP={=onS`y=S}1yJ8K9<`@hC<qhs
z2s?{LH#Rh~nYFT$`=C?m5a4g>>gtYpy<U9%Iho>HJa|$3na|0;a=n&)#7fB7c%)OJ
z6!S&LN((uhu$-Ju>M1w>=6RF6R5Gq&=T^#u?&nMpk8-dv>Cw~I6QFD<Bz=3&e_HwS
z%P)T`2mZHT8ghCn*)5+Er64CKC(q?}rKP#kvgvF=US6Jfs_8JM7_sa9U3;H;>ZuuI
z#S02R^rrt$2maE_NDY=r*2^y`DJiI`s&cU(?W(P<J at Vi1Ew+Td@BgcT at _TLl-yHax
d1OM~ae*q5Fu4oIrDX#zk002ovPDHLkV1i(I!MXqd

diff --git a/share/lua/http/images/buttons.png b/share/lua/http/images/buttons.png
deleted file mode 100644
index 7dee3a5629eb50bc3958db853104ba8ea25eae44..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 11954
zcmb7qcT`i~)-4z%6zN5UKm<fONRv*GD$)f(x-^mAJ0^$}0V#?I(gGq~dat2_bfnkN
zd#?dP^1|=l``z#T^~M`Xc5==b8DpQl)|#u#8Lp+FOiD~ojE9Fus`6anB_7_bblmSJ
zgao*CprgAO_l58NQdthKXaKZ{yCASoRaU^m-n`NqbK-D!h+Li<xZ~lGP~Uv;@sd*R
z<8A^yRMZuLGekr{2{M3vv>F~BpP-7uGhLtQT at xY?TE%fCMw at nREh2M*+t&J&UqsAF
zm>E<i<){c%C+{fGC{EqOH;|jW15&(w`x(tpx&uqMjy5HYmMln%juuFh;5r18>JvZ5
zoELaNB>0QX=2hqE at +8*NiuQ_{&bMc(^PLJ!vOkkaY@~nu|62$j{Fv(@sw5KP%0c}1
z|7~DlE3baT;YuU#r=NISx5cM^9g6I|l6XVBp-Rr=2AgWSzO3%=-jLv9E#J;R`P^r+
zx%nfSZ}UOAiLHsCURG9COz+lwrsH7Rly%!~CJ`nn2o|@1eRg0*g?@xmDdDC<C)~!8
z-`p&I5Q<W*$B1BD+Ta<d#fSE2dPJvL(m{@mhbN(S;+M94en0Frxp8vp9DAO8*MPmh
z^?4I&!;;naETy($r*^gB=;9T6*1gwuv%D9T2b1b2p_5S&a({c6J8UUd?~RPymGm%7
z9%qy0WG$bm%n+n+0W+h#2{BkA=+lGpI}oFrg#>qrVGM$>1pjL at PdX6+7sQ3ID6{1W
zlnCZ!uvv;p7zKmE_nOlbhrcNL^QWm;(9jhDX;ZfHplK<iWY%tcjEn8z65B~Di9PC%
zVx;d$qU$KES$1z&D7oJHG`+8A?tXBM4 at Sym;USZ_op2Nb<U`0H+l7z+jQ7U<nGDMu
z`ygvEmUDs at I6F$^pnSoG1X}g)1ppy|QlWi=u%Qo^_;)W6EC=U1W65>ap5*dq`HJgz
zH%C@{h{Zqj-kR-TZYM~kNV>a~@;#b$(NAe`UijUmRFm^soYb36xh+XYW*f~PgL7cG
zvI%?N;)!eRtnUer9mMT1drV?Wcw3J4>_<(Pz9G(8w{EM5CTAAWO-LHUDO3L+le#$0
zVoSqLE1k5VdvqX-tE~U&mWhmb*7eIn6byE`nRS9bE+Bj{xHTX5IpH{|u2%>^K=$=T
zUDtlN${*Dkww!O|6^Dcvjuxz>pA_!Mp{pLm&?=5zoHOvC;@!DWuzP6jXU%5Qr!d6@
zU=f?<^~bk^X{vvh#x8L-fc|3&K(twk0Z^jz?zG;4Ddsc`?)xEo_nKXO&im`*U1=4|
zvjCNt2G5kxCfCmdPBL<hrs4`FW|xT)Mf1uky^!=toB6B_#rnMA*;Ehx0R~<7t+)At
zd$bYvOTXKlrP}qd+%uTrTi(!h0}68&bfy0J!`by%Bc+}Hw}CvXax|4PPn4wBmYSSH
zY_Thy%eSx7X>rqRVAbbp`3xM(l<2rS5C+s#5JKS*YN~lK2xftInBaA7Mu`I61$FZy
z8q)ZUYnshq*CPBTmprN;XrU<OsI>uGlN$@pFBKQuc>fi-GnzAx5tO$pS@!G>NK2gE
z7+mfo)GvL>pXQEcAGko<B)OrKnY<VLnM%(=(g$avQg7BD>{Xts_H;`Q?3!UdQ=6i`
z85W9ltHUv$wjmezV?U0`^pmUNSi78->;UVr%#p at cj-sx3I^m{V<@VJ|oSeIZeQ-n|
z9bdppPfj!FA2PO2$?J?_;%xED)Kr7*9qhtK)i}ek1;K9~u<%HgLUb?{WpKbxgopWC
zgyp`4ZT at gRTu{7rc#eb(V$WgN972tah<NTieJ}8TVh9=qd4r0J(_vi5;t==D5vy8#
z_9u_Ar&oOOGBKfgC}{bf4<;`%#eWGRd|D3oMQ4Cf!|&H^C+m?%%_e59XH`1iYBz6t
zPacS~7m3Ri>N739RfVki)9q*09nUY%yxm*tK1{Bi4xF;;&aC-1u$p?LP<2Q7ka6hb
zq_1xGtIj|l^{Qs-<?YJ-q43ej+ksSZU-KMiP(r1pu2B0wgqZM~rz3&#JPeYHP<M4D
zn$6Rp&&kS?<P<1nWPeoArX at uJr9)F+e?nAjV<Vbj$oC&@kJot7Bbtyy81~962M~d(
zMnZe-$A7Qx?8ul$B2r^3nmMZ+r7FXtbVi@@rL|X8{wGuuZlPP- at MQ?DAA9u3ZQUHe
z-&TI;uRA%gtXb-Nwp+t+TXYM!+eKCdq$LQ_+A6`^=LC9mFx#E=by<m}d(5Z-6*VU1
zUR at 17j+83+jpUh#To3e88RP)pgZuD^dOwX}luRRiJ8r46%(uS#e8qJ;aniETu<M(T
zM({$+EgalY>A1b{Pm{6CHf*TyIn+U~#6|iHrMH0i-EQM-Y;d4_fe*8tz|wwz9V}d3
zM2UJGAh6f_w+3>?h@@c{NvQ9&-`-rk^XtU~J<-#>xiC2N@&RVyW8=x3H!|;>;%719
zBGh|#x<gY+fb`C<GG|A~KNw|?UJN(uaaRtIqq+gpV~}*ZCiIY+U+kKJ8(1MGoi6U|
zo)vC{8pqUHu?|vcp3LF*cklSACr?(Xf*Hgk*wy`vU&-YDe$wY4{$1E~!_+w7R;01h
zaM_qpp<#!yi7_q=MG4_ZlY at jrK|#TbRBz-eHM<7k`xZE(WOkKv5WwzkOY#lUOvK~e
zJRq0}CTBr~gq+~}Z5LLfAlQo-x2Le{Q+>>CH8N#@eQE829D;84_4S?2aYm#scAY&;
zJHa-W0Eub>%|3l*#UAzY4~P}v;4f#k7>PGoU43cBg(@CC)2Tb0nId0#^r*_c5?F|R
z(u{n{$CT+7EFNKN^7q+fVaIQH1?KuSG?W2)aTZ<WN|d5`=phch2slwSdS|Y}IP_yF
zP=f+kVa8XRp#N~M9x%-(&Q^s>fQZ3VNlnj8i+6mlgBKwecv#2zpVkhpq|Xo5iEtj8
z?@1Y%;Yt#I*XZcm(*l3;)c}h$FkMm#1eON(-xFUAG#t5cWM8%$pxviLR2)4=-Fs-v
z&5L5Q{37=C<Z?UtVz$;Dy<3f4Dz_PYfo_n%t|dE<4oNOyFB5$CL2#M(q58$p52eqX
zIS$u#K>a_25*8fj6kX&7Q^e)x>a2YWut-1*(*LMqUd|f(@QV=#Z&9r(!wa;5!QAFh
zhUUA@&p(1P)$_PvI~>{SMqlQpkE9I??6dG;YRRvAw&qjyicQtS$ia{E;3*gSJuK4*
zEURI~I{`NK9FEV6x!AwPu!|QTx)Dna62aZ+X2E0z&rQIUd!B|aOF%=H{9p11$$2l3
z23B9Zhgi1n^?D*fL(z<qCNpK$+l}}AwudsPt8GWdAGwLwMRm2eyCI<0D$hHle^ob5
zl)bW#h_GuCt at 9;;i`vtoDTCm*A at vJ3)bMSQW54Zj$58<~vK-gBhESiFw8n2E;pQ*?
zOm5Y9?HX!4f6mpcip$#UEnw}t=&DO+WE0?gV>mAGPaNjgsRDrDZr}bF(k6`bv?ljr
zqmswj at gSri!*qkfwN}Y3CbCQ*Ao7u|?p=nnbictj%UuF|e5R*_KLeA5y!i&xq!T6z
z{lm$aq`L2SKJ}-jg!pVw6dF}){OvPW;r0?wEidzX;?r)?WKDRGd?q8r9>!<d(7j}Q
zv|WrSdOXGdx+GTAaXOgzx0Z8m+u>89eTo^)yNffH>qNdlF5*a_zs`AU3#Q+eJVzt-
zD|)W?2c2uJ-b3}=!)37*Ovc at M%Ae;*ES{wFn`!MYNET2JTy9k*8GVEqRt9HIh&q2)
zTC&YaqfD at WbgoM;=DYX_k-8F6X>X?MJ0&t$7yUN<Sb;t*KZh4|P~WL-qcX?l`RubY
zV<wq`$tMW`<D=s0L)lfc;c$8SU<a)auMXaEEM0bsB)^+4J(k*!H1iohG;7Dd4(|dt
zG{-;*fhWI*0e*rApvSd<hOzs7GLA?<&pFR!?AE|s+gLWD<ID0>*HxK(d}4zY7W;bY
zus27Q45FNcs+Vk>D=NgaRTQ-#l8!~6s0TuHkphGyf)rtbj(=y4UV<OiU1VkV|NI&;
zOxg&LC+~U2$x-l*DzmHgXJ4O_#tSvImlKChbM at z1(gxYjIOPq?^+^2}nr?Ci9a=Kt
z15yvmAqGV)0xL;_nFk9o3Vhe7<(LNh38T++&atQa!_dHflf_Rpv&WxE8lO!yUOfp7
zKD_I5hXJ-;Azb<A$x?3Y!p8m#0%@5+ZZuWx3_0J2$iBMoQ>6)Snl0C_>S=CicaCQb
z;Z;w5YC<aTth$7gV#$T8>2j;!*8Z(9fKg1y$LnSSzw<r$?*TT+_Z)V3ADu1#!MG{_
zn$_xE7UgF0C^K4PmKR#&zX9x)p2=_L<)r<ra$MFm*vyM2^t at Q+0=lP1_8^8tj*252
zLqL$FR0+>D`7koyvN$={hQYV4RhI3pgd$LTkP+L at fv<JFmL`GDPuxa1Ufmn`A;kXs
zsF>Upv2Ny?!npD9$-CrU=`r6Y7OMnFo(Ff=K{8z<GSZsV<SEO;{)0yc-iV*f^%|}S
zNA{X7d$>*lsj`^oE;|TuWNCM?6E<u0=PKa5!8_M$fUiixms=lHo5p>fq!h~I_N8(z
zs7(}Dp)&H;9_(v%+wxP9Z{&9eW;b!Vi1W=6%~Oh`2qj}K!}=2 at -<A*dqcwjF&2Z3&
z9c(U6k&TU1Gm^6>z6#!(ES29-pRe;|h+z~p^*#DazvwhqHX6$X(xganKoe!CJ2)_#
z5 at 4{j07M~Xy+1jJn7+H?<W|dy9xN(Z_>~5E6Mm at Wf$6hRgz^>s)4p(z{#duDl{DU>
zjSafVuK3SPN+QKn4ME{xn5bdxk#CxmZv at wEASu&tKbi(!k4L<uUwaq^2YUKf8yeJS
zi?M;}TgVa7>Q3|h#6a?#k*&aJCh5lxJIW3pN<_g9ZDhC at C8@jiX|?Q3;4xTItGD{2
zQ&mO7g%+C^eW!&F9IYS~lS46l?mp}6l(T>g94YM7*Ie8i45f$UMhOSTfW%+&011)K
z%bihHYWGNdFIYWkvdK6cHaIH^NYedB-{%6f?+wID2&DWIjVoruQGiQ<8xv;L_k}6_
zU9KlTY_E<vnw(SK92O-%E-8c`q^kpS2SeYdoGt-pt;d*Nn4CTB!dl*|hPnYolIx=w
zRvgwOvz>m at Q$KZC{lf3o{;{{#$<9pB>PzJBT{_UbWV(PrsddLx9Y;J1&4RR|NSA_*
zg#Q`O174-|SpnlV>0gH-Hs!hR>}G5Jbc9CHC!FHL)WsrmN28dYD`vAA(s=GpN5z1o
z^ZmpH;QPttHe<x*9+4zWo=6YbekQHH&5vp%U~8%8{J2_X;v at mHK9IUS${)?&c=9!g
zbuFpLyiLhPHWj&8P~7wrdVQr+{&x7oIPA+Az`^CI$@+sO`n}rn!m5||9cEF)p@|V1
z;D_kMK3u9Gkn!9SUSH|^IsdmrE at Y)2^n!cwK_B=I`6Ly+<OUJxcg%Zc*P6`<GZ=3m
z#AckQ_{gnf2ly0!CNQd|ZMD2Hq#L7d*x*wt#0x#ON#N5(J)1lpPr7G9)YjtadPpqq
z>d2pd#_#nv)27&B-Au|zmx)jb^Zs;9pJcSUiK=Pw8>h}3H0Mn`BsWe=G$UHjHDk}s
zW+r!AYu#X5b~JqP8>}%)cE!xMGh;^(t`XtnPNOI?C{QfwJeBmdyo|Hf-|WTKd>B>v
zrB=YiJWaw>vV~9?=i|nEl^WYBypreXbg6z?9$kB*zu(h|sP8I8>C|brdHwKken~J#
zjSNXrsus4^9?7K>&z9<bS`3JrAj at s=F}ho7{`|pQTQ<N3hpwrveKwLl2kE;M1Z$lg
zzH0_z^TNcucup?PZLh%x&SeYAB=TQyf!NBz>g_HiV5VfKWJlXj0I0J&wHwQP^$BT>
z_Qm{#gf0}y^M0}<c{p*xGBO3QgOZ4iC9Vgb6Q*M#E5L8cxAEis at BF=0Aa?y%P-dy>
z4v}d~bIhw>1!g|ac%|CT;R2SAVW>qJcxdBqS1C#NHML4HqV+`o at 0|M&?q2(&*Z5o~
zB|%yRjpp4=o7N1(3|G%IVS49#4wK#=8s1C*=y|RV2 at ns=D&FBtwUp+kCHDc`g#i%I
zY~g$I9wSgoBuoNJ+QRL-PeR+FE}x^FOqb9MsmK;eDzumd7ZpfE@)|DjJ_!lKzHhl?
z&e-veQ%Z$P`M!vvBVa&iHx*n|63DPWZAh>;!ApBNLE9W-qs1PogE`Ftjv_DgPc~&Q
zY$yzt299NPY(_?<l`js at v457&(Q!(9n3S-6)aNh<akc9sGPjt7bN9}q#!>TC{}j}Y
zB&d9aH^T7Xv1s4ifVT!xPK0T2nagtAz5QS;z&|0ZTPaOsuMsev-qN@%(F4?qHd=ms
z&^#r#;->4$;c#`ftN8ZquMZZEK6DZC7w1nM+E2HULgPR*<n at 7jrcxAbZFfc1@85e|
zLa!Os`VJi!sWVZ(a&qp`2f?6YTu$>p6`4)x(D%?;Fdi${ob?z8CUJ(1U2-I{PmYY^
z`IC{)4}@r{@HP?8ahNFy)ZH`r&VSi?kS|Q=AoRrN4n6GUOG)V2luf*e>|?ze%juBe
z=bU=@!JVW&f%klZCPGOWYTef>0=IEc=^YhwU*KmTuIE~4`3U#{i*$r^-%Csru<oH*
z8N21%GJsDSdhHX5{A}rLeq%qb60L<UN)k0`@pL^&WSu8>M;CjdwMKd`toQ(eT979;
zQaR%H2_}ZgFV?#*D^+{qZ?Ww-4LA6bH0h^^iHX1NDuG`6O$?Ac^?T-vMiD*ha2}6&
zd5`j-ZtDSAZY5uAo%)z-5z00C9}MLu%S9YJXDX?K<Q)F7qOzV-`V<`6UkiWVB@}I(
z-bMbt%km5x3HIG*ps%~Sdk$Mx-MhGSeS!4(tTVy5hI$3eTP=&J+0^l`#RN&~N_vax
zC)cHNM?*uf-=$L>Rt%PL2<nYAfzdvG9J!dkxA>EAv&3&I*&Oc|rOg2Q{Q2xi;9kD>
zIT!e5<i at qk9QU+)Fpz7H)F5oK&|S)?$}Y<%JIj-ECr}3Q!mw>vPbNQ5)~{tS2>TUr
z0#BBlDJ*i`#g&hGGnorhey4kUPj2r^?3Cd`R2XzC1Iw}toZJaja3vqK at O-Fe?N7fZ
zGy<f885 at Im4J$q^a9GIu?rese_5y%p-`;JI3<d!mi2TEXM9-Fu%iogb{Q5<pi=AI<
z{LX8{`MIbq2A5KatT4P)*ROXOssIdv$3g7=B%)}Ndor79kv<%|$ml1<NS%3)N>5>y
z9JSOJ>Pf<<e+U2{%u?>Q@{zOkBNp&YGlpP7ob{S;nceX-cFi=4$nAK2Q_holG1zf`
zYDgN<Bj~7f?#CSmLeB()d+8eTb8q$cSJ&1;UtvzI3FmP!7r at xn=raz8dVS5+k6k|(
z#;z#7L at b^7GGt48%zU1s5yyB20Sv!My*Zl3Z#*8TpO@<eL{pn$(g at DW;`)wzmB)e(
zJGR4G(t#R>)kkIFk<Shoy=QBCfoQ9iL2p%%)sbStlPYHw703Nw<As*Gk-*K75uw?E
z!_Q9hAYRJOh&E>vkQUF2me^mMBcoAwAQ!6G*ELJFZ7y$M?@%tGOtYtfhRe=P7mt+{
zmE&@pweMcvvxPLjod9r^)fnl0r`O=MQ>8q><A=<|P(vQ0<dKsR9q2Ynkk-z=EnhH~
z3dwz`gT}t7tz&GWM_K}}KUrfD{s_V(P2RpiXMG?5`TqRymrC5m#&BlHlR>kRz^&vn
zszkJr!<B14$?Ks&#gE-EFX{9T74W4cvl5pKTv%n4!8Ff4#xKvG1lFC=H=WP>2P*~O
z^<r5Lk)Ha}V$N&>|F%q*Mrz5+28yadnXA6vk=_07Ab9KokAC4kD;X1VbIk-DZB~>y
z at N8~brP at U{Bq6`|*XN4fWiI$&Qapp#YD~3sI%WWIl+v~tHaoHa$l%cW7#j6c?K;M1
z at s**^lCr7G<ph<3!u~=xkx|XdVq2 at Nt-Vn7Of}z72kNkMvUhWJ-eT<(wP_7C6c3aq
z+<o at Y&49L1FQO(Wo)t)ngo#g(xMM$GKW2NhaQgrsVsMaouKmTA4Cq$f)&hrNYKI^f
z2VYpFxV at _k6(g^l{KfPOm)>e?6Z6-tlZdBtr|HkF at zq(7K#vkI?r;0K-0}f_e<i%O
zjDG=$dwP41t8p0%E^!pK0~+%B!}$U`-`9VO{DAm2)C$w36s>zDScfsBZp^?;h5~{e
zqm3`t$yqfOw*?+vR`<H^PO}y4z8zw<H at R>k8)-b7w$JxQhT3%RcA0>x9zC_*4kYM-
zz6df)39vD2mp8{MPH7hJIKUaTwq?G_ht7guUUB9-oIECDYWWK(l12^53!@jq3_h*(
z!}s;DiOCWHK2Z8!>MH8I%{fKFoh9qV+gFo~st-?MB)UlEBI4!@#;ntNG$(a527Z_D
z!h%d-e}u?LVjTI-X*9*sH7}PnpHo-6{1QulY>FG5@`^Qh%i53S at 5;vD8+xS?`m0)y
zd|UE at EE^nfydW#Viz7$9;!lz)AS~pF^_?Fpi~74No at QU87^%0_G{ZEo4qwk!PvVkc
zl<?4!elvc>t at ry|L~W@~=m(RI4|fvLS=b*!?hzn~R`8SQYG-H3+s=$l&9Qe4&7q^X
z%1x)<i*bfo`vm=f*R(kFNptVuS>}PI7_q#83xNrvf>_i%8H6qi=1!Iyzi?tvdf)F6
zAOj}3HJqvZfp$NXI>MATNqEy$#CU~!@Xd6L<aO)!H#%NtbR1WlM3{@?b;%JHCgLmp
zt@^W_smO>p;9cN10#f>&(pjPkjB1j1zxmReO)w+(AO!JZbM{d^v+c1A^iANVlpd~N
z9QBm+a6ae5j6<4g>uvG&4${fWG5voA(r`K7@`5_zQuSoJM9QogU!)jPc1bIi{)p^d
zI3`%vwv{eoN4!6LOmX~auju(aexY{envumX9s+Wf<qf~+3-iecrE4Mrf42uKp2nX;
zTiO(rGQ>&<vrS|c*h!$L4X3kp5pxn<LR=DtbNiE}nKR5 at JfHC4y0+SN66w7O#S6Gc
zD2ptb41(iw_U{xvJ3{Ej5U}QLzoBB)QRy|gUj_O%4(xN3`je`p(~lYqH%>Qm;C>>v
z$xT1Bf*EGMr}?fu5aHRAxE*89=7|3h=wlGJuo$2LmjQ4)0J35AQVH>h)vwg-q4y;{
zw|<4{H!M7GyK+6p`b|<D!A;2DJ>1QyL6uGv|DZe6nnJK&wUCQP2;Ii+)%!2J4jzSS
zJ!OH%3uA+TK6gkU^uH#h=97mr+}8&vkDM6q$s{5-oCuks?7a7>2(NG8Lr0f9cR}0J
zKwJJm=$FRb>Z7h1CN0=Hvd(*UlfvSoOzb}RPTlf=pZ3Oe=c%$@<5D#<Dnc6mP at ZnA
zsQ~(olf3L74|Ya0UT!5-+PN1_d&*jYOa}Ab78(ZlpVG^Xabh?8K~lz6G!cNvH- at VK
zj4B;^%XeEG6T9LR&At}8Btxw1EuG@>#C|-#?GGoX6KH7lv#;w7I$%_BRqfi~G_9=J
z`)d(T4b?c0%J{ThkQR+B&e0eAypfEA|3dWjz*fH4Z0+UFZwU$OrC$L!tat=PSHA1$
ziMQh*Bx3;y2Vi4lE_2)OQ23++X~;NyESc!4Xl%!MxY94Huhvv{rzuMk#TJ{*FC%~q
zMBG;b%Owx)9*2{<Ql8PdTyc_NaCMXf&YxdgRhNTz=#~lr5l34o!c~veQgYWCLZ+cB
zGJcCMQeZ6rTnmdZ&s1uFVWBaTB}U46dV0(}E=m){W at hhbrJ|i14hgoF)2GO{m`0x!
z>Ae3<_6};IWpwRJW}TS|kTBV5cj-YiiQS-grTv5}Vd*ogaLK{2V&fRa=Tf)?s}~s?
z;3a#0;3(wfzJi*lwK(U*jeY5FJY8?Ms&uSiLROPzESBzzBvo7bYOnr+vy>HjX4Iy&
z9GCIE+ye2>?~L5Xl{ggWcOuWXf70nESbDOOwX%@lI*Z}9 at GDLy#y;A=mk#MZFW5{r
zFz$oWU8h at P-aSta3QoEef;RnOo3P81O(%VUy_sswLc^zUYMGGGg(wKe at Nx_!dOWLf
zUN!rFs-3|kuboL(D~Gm~SC_I2U0{LnqW9YGo!tpd>DkzrngHbPxSpEIU&aEkB)g4_
z9$Mxm%cW*@Aifh`93W>6S+ldBRCC?s{f1Ic60(WDDN92SaBW3!qi-W)5Nx+{BG*9o
z+y2uBvgpa at h+p!#3zPw9kv!Xxw;oIFMAg<T*;S|eNaTgoN+dwO->4$}-b7(JV- at VA
zv at 0kdMzNKy^73AWhFeF-(Xj1ID~TsV539E)QaF#gjT3t*czb^z%{?eS6nmgR&S#`t
z3lC5)m${1m?3nnj595B)ePvThN_~oS{p#l=qp?{Wpp>^wMqOoYSGmJ#cNx>D3v2P8
z3=PlMnA4zDcK-FrDK3}8w|S)!U|4Ba`P$dqXYQe3^qm3c#>#voCWP3u2wmv<2LCbm
zVBO&0*s*%9s9S1(sO6f%|0BV9{?+cRSmMTF`>kIy&WKcMD(X3j^hEI1PwuLP!Q%u>
zj(W1*JJw6bnX0^9`0vdO{Rt*55h-jlzzLBDKHZPMo;(fgX_OnZ;2ZkFsytWq5by@#
zbZ7}~BV~BXk*sJR&>Bo+7q`CTWEEvodd^hk(fadqmMVO8t>5UjBGwDpU{L-xIL)*i
zxD>B%CUP8|8r{|dec}jUy<arwS5lom6(fr3N9|0Nr`l4UkA9>gMvJ|D`<AYj^7?SO
z>jCz2SSF>$*+*8tw=a at lEv&jI0V<mlV!FxY2a>N}k61kW`i9NYJZC0q1A#tLEys|k
z;KnU4GeUAWV8+|GMqP2;-WI-M>V1uiiG&+;GILF1+z1rH(d_HK69PJ)qc&oWQPN$u
zzn0yZFl#naRt2S$*OxJ3mb+oNF7K*S>7<_1u0_L1?20rYYD3 at E>aT3s7n>;m{Xo4u
zH~T5B>UqCXyGlDAh0ZU9>+uD;hciGtetpb<&nvd=pIQdsg9#e+PSA`Br_-8?#V5uY
z#s#R{%dbX2>d0^xhzxUv7Wr10b?<0Hl-$wL;YYhmRjj7ep~8pHb#`N1YA^YIK{m#=
z0xec86ZlL5|LlsMW at 2#7my2u$zxV4s+aX!UUk;3AM6uVCOPXpg<ea13=)0mBa_D|%
zbhYSTb+ta;$$sLs^STphQPN$g*!%t22x3kYQEB(8^}AIfFf}PDKlD#T$(NE6u$UZw
z6N=@i#E6G!hd1|Z+415>a`HB=ABgS6l{oCutZn1?imZ;SJ at KQmM-F1sF}`XlD!g8p
zj`EC7c<S6tEeYvXMi-O6+MkN-Ln}z92Q9sbo$m7kqg9X1uLC)QDVz&|bp<3P>H1p@
zx5zmDfvSuXSpJ+>viv7f3EvsV>UEB~M!)D3>LUH(SCL7Nvt34hoy|VVlNNd5Fi1-M
zvi6xV at tAXRpLf^eV-v^e;nc#o8m9t<qB+42b|RV!^uvb%{<@&K at d{pjN2=ae^i^wi
zWA<NlOiz<;#wS$^2lM!fs2L=tsmg7Y>k$}G7%TVa{CfNjsp+1T?9(TBst>>)rH&!K
z-$Q_g_wRHUg;7f<K95P`(+5(MaXbdBBV$C3><3I|vs4rE$Diym2!4Qnz<>SEC|V~+
z<5e3jF=VU#Skm)e6BUGxgd)>l#$~HJB5d$Z%y82UEAq#rV3}F*M_}2j(hl;jyRc5G
z^)HVywckz at S?OAs7UC%xN`1^o2xId5bdbZ~dWi#>8E5Erp<T at YiiDO}wswyp23IMG
zugC<T+L%gdy5{A~v5)(c;%|&Z*fYqos|*U2lRpr{Ze+&fx~~hf)r)yit6g<nFRht5
z`v3vh67x1)lPBh_3e^(lRuGgajyu&}eVyA2{-wxhjUF%>GfCUJHTpjExbQ#LSuqIP
zvg*lk<ZG<o@{`;DAiP=lQTT8-Q`qZVoBnXkoWAOmy3Tn7f2-UaY+d*sUMGd+%i?p_
zLPNZ?3)sE2%Ef1LTl)Gvx<=J?En5llrH&LM?pLL7Rc<)^L;m+|H?NEUb9M7xzRY?7
zt3NqM=s#wzij|1@{ClOE+2_D*mAo|!KlFLaQUN|rFml9G|3;t2St!^vXMnNCydAqW
zC!V-r-F{uQ6lkc=w_IcOhw82nZ7eJ5!TsCVXp4pFG3+mum}S_Cu*-sMNEcg_5Lu%I
zVyqAcb!p7rwzDZ$s at RSyaIO9$J~aJt^9R7z54@=uUg!ph%yOp6b&H-j;%ry)z<<AS
z{}9pF`FNJcc5H|$t;2%V;he_ddS;WZz~Ou!SxhJJW_5EQRk9SA>UgO&P40($1DLcR
z^6jUlBR`|_xH`;6E5t<q824;v1syCWe*dnAD<mW(nx{&?eboIH72E at zjc4yhq-9el
zUQFP4ylAlNXR=p$OHF)<BKF at M`A<Wm7z8>VJM at 6t1*pO$NCvWU>hM;dY{`y>#64Cg
zE<iK9z~;EcbCFq&(pL1Zrft1y!fxJsH{K$Y;*J7oUY$s(OSwcV?@RZ#A+IAscclJY
zSEVj6B}Z!~oc@;zs6CN)Dnq?*@}Hm4m9$~kPi=_jj-KwW_DFsHUn)TNo13G8LPsMl
zE2|1kGu_MenrN7%{D*@jUjO at kj9ujmi!5yqieC$SWnp1CQ&Lhg-Nu;?>RZ7=<jn4M
z+}7FALF*>_0YLV6uPegx!>&!>;B310Vrz(TrV{C at ZZ`c at py9b=@J*h3Rge}4zY}cr
zv-{JHB_W}TMqTZ>eVh5^w_F7r)I^&bUd;$IrSWHA-dBO!n0_NaOPT-H$sx0O>qYwQ
z+Na%_i9yu1700M#;o3f{yO#LaruSFh05%e&pDd50=DkNZhNW<H3e{5LQ%BT(Ja?D^
z)=N+z*oK#*bO}7O8=QH)Fw;g5Q5MJY54V$tZVza9YQgZ<upNOq>V1;{SDYr#hBxCY
z@=xRPYQJNaab+8o)7i4dTH#CR`QBXelm7LUKXDE`-(R`@1||4&sn;x3N3O4|(70s}
zzitM32?w`PLbiDF>KpQwb^pcAIp<!354AxDI(Mhn+%!efLZz#t*BB)SkDJgTHjLPi
zY^MKEb3SRIjqc;G at 4y6MwCGFAl$y0CXZWjc2Lt;4Z+gyj*{Duh<3ILW+!p1~$&gcU
z2qC70hEdaMms&9AKb&x`UHwj_eMhr_TNlOu<QwPPSexV9kQ7<EGzW>N0;Q$-S_0MP
zK>!IDCZNc)v969BNR2osmq@(6Jk=Sv<x}G>D_~RfQ;J0VA#SDx|B!JTCA|fSU17hz
za)8jHPl{Ta$-f4XGlU$6Q?rkHy?9si#vE_$lZB_`040z)+WvVpZqn76uS+A7(QX#_
zXs*Hcn3!~Uj-Sk{W(#Sf*1`*mcm?ed(p`8EzHCU?qZxzB%*-4%D$>(bo}P5ASvRW>
zcr)gmv9H~;1Fp}0$gf%}k0Rv?EwG;`+C5Bd6~KNEz2pX=!G9vjJY*i6L=HV8$=hyA
z^C!9r{2Qc$_>QZ7aHEWkwW7FgmO-xVgx(3(_ujJ3wOOqqqR4>bm)bO{DT{r7zWna`
z+BrA(k*AwxYVbLFYl%Kq%Kzg5YVHo?Y;GwG41HaBS3v3mtw-WL;x5YbVe7kLWjAzU
zwX at m4z<?fNDp-ezDIRks8XX?44O6&fF6h_jcbbCcMJalPY`+Nnm((SOSG$C;A8kpM
zZIw78)aQQkD5=nNhw+msim)xMRT2CAxSN%g_%zUKdt7}crgNVTW^MaTRWa`r+=(iU
zxOB4Rh#dJ7&-Lo>CHCWTf?o$ErS_L&6_BwF`sku$mH%R0KZUyL2}tYwh`61x<C0Kx
z&O_(oXw_N5YeZcX_XdV5=r#2v_atzdQ!r__MuxDH>@UQ2_ayl0d;=f+OJT(@>(9??
z*zo$)BMGKfMpcxN^L{sy->vsMZ<`)=l5aiLd!E^0{Z=dgalT$*{;u+kst+24pjo)L
zK4vafRu#<bgFr{PFVWR;x>M1zktar6Q})Dj>z{WrI7_)(*18!N1^7~xF{#q?yYLBa
z5PZ4w!x~K!JfYAsNPr2XvLb|rszLs(%|rT5m`HJpCX~*_j}a-NTSG`10y>DD{#Mvd
zZi9VSLjzb;(}vG7|D|*Uuc10zJ!b=s`yGay<#KoxYB0 at Zo)rg?VAV-L5|(=)S&;p!
zV%n>5=QYnaT*Jx~S;CjwW>~+qPzI-m%vGS94W;ofcPd$<LAS9~i~W3V*BTdsPR3Mt
z=qwYg{%uT>i2Yw&)Q`=lWdkA at X-l3LLa#3kvHzCi(8HP!61er}7d at PM<B^=YOdjqb
zgrN9x$&;zdiUri2G+2HOVk!8atsFg|=965d#hT84%ds-+T;w=ZuEAU)#(9mZc1p{v
zi*1+%quHVu)~zq<wtJZBF_+uh--)y+(A3ObidFFEi#9C~fxsJmWicUoQp#tg`-`19
zm0mMW-vIRQw!8jE`FSG%#qZ#c{@u1T>*QXWlQPGwS)47djO}ob#<q*Yv1&SG*zRSr
zfI(InDP{78V^Z=--%x+Y>#u at G(e78LaM#u(&AiiykFz^JVo+&{{&@o_-Zj$|sUY#k
zF}<D-wmo`GtQ at NsTu`g5pMLgWSNUNETqpGuCf;+NY%B*)e0cBd3*wWpu=d1uJ#5ip
z5xfXw_W}M}3k6QDwp6|6Kov!s^S=%-{V<Yxn}X$IRqd?Kguj$P!v9hvD*mHL+>v=E
z?;W545CvzL7DMGs%p_zP%_je?NIcUzVF8LHRY&gi_<pq0m{WVz*(gUD^E-oKhE&8F
zN0&O%fyfZ=gAwS}I(rOy9nxj$zgy`a!bkLlf?-7!{TCh#^!Wp<$ySRET0lIrTC07-
zMMng^#oq#xr}(!3QM>ugi_q~Kk?22%48Dtgxi7|(YQ-LWZWY_k&JfM7tlJcCaYeQ`
ziBImPhBY58+XsMBrN1SgHNfeuNtgTu_m}-P0h`ek7~=v<v!b-=uzWTf_xN^GW6ma^
zV*A^}{=&MWDDBkRo&GN?JF(pU*H)1Y)Hgea5o*s?!Y)VPUyEwjk}CDh-k&Nm)8Xb<
zoKVWa1%nI1iSI<(6gaJodDxo^_?=|^V4H*A%`t?`IBns-^|$}heqPfQT_3|4|DjaI
z-OE&#?Pq5^q649Kwci<NJM6sDHxbc$S2<)PNA{7zEX4o$#|rCK9>VOTAYRQUrWAFL
z6!?Pe at 5K_>wo%}OU;lF!H%G$Oa+CuR59a9GFmbIZ=F0r9hPn;RZ|r$G#@#Vx{jr;>
zIxS9}-fY=4i at M7{3nTbnwKYr^c#>bxL*z--^L2y=q%JsEIH5{)E@%RDm31C9Qvx!2
i3_bgQEw|_};LC8rhsVTU{cwVEJQYO^g(A5(LH`GR**RDM

diff --git a/share/lua/http/images/speaker-32.png b/share/lua/http/images/speaker-32.png
deleted file mode 100644
index 5a7fc13d1d64285ccb9c7d767c4bebbca60292c5..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 942
zcmV;f15x~mP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F8000AZNkl<ZSi|jC
z&rcIk5T5-7q%E at j1#KyT7@!HH-fJS^K>Qmt>cOa2jR!A!_T)_xqv60oz3bI@^;i=R
zc+dzWa1gq*q}_JAyWL&Cw?NWDX<t=JOq^uezJ2 at Nd~fEPH&deja)y#fB(9B)jy~(V
z;dnfrg5h_vEPJY|ZuHf7I-S0ws^QYWz<|dz5{-5QApb4HlarHEj^nJ9%jG4{^Js8z
z(0{JTolX2PfZ0q&a2 at BqVHi(s+YSy54Yka}3mw-Br%gno(KHSsd7evxAdo1Ej;3kb
z&F^Hhmok=Ru3EO86WCU5c8i3=b}n~0x4is3-_DMB3VR>vy1u3BmCb6kx{2SLl}cqR
znM^)n^K<j_QZ}1?EQrFFKp>b4t6>7!NF6z;q0q2$WntlAPa(jG=VV18q2)*(xvqN;
z?4Bdfn~FrDi?Skja-zS6g#_<j?Fj%*MT1x<3S!e%9 at UNdOtDy;nVrp0BAN6<(@7W^
z at c|wv at z-zOPTabAV~YzwI2 at +XaEK&PY5|}X3SjpDA+>01Y^*x~XieA2ab1!mX%<61
z0I^t%E>2IAEXgg~t*`%JVZeNxQmJtkt1da>(eBO;*_OrDrMW|(!UJG9Dd0hqKiMf*
zJgHWzQffTK5duQk3__L=QZ&X50PLsDjdhY`r6mMLy$*f^NYe_?y{-;m0FXgsnkHG6
z9pVPCht1d4)^K96WwTnXMupv7->~DjTmUMSGFhet02Y51?C<Xr@}FHkEzcW`2JP(p
zL>MCY?QmrQ<BVyUy#Zjx8x8ve$wZ7zY{b&jwj0!)g6t|*diMaXSKr;og^`jy*DvTG
zmc>;oLZQ%s2W(5{1^~uV9fWHqCQiecZPraL05US?fP|LD4S>as#rwFR++xo0-N`N&
z9ti{kJ^-U;Y;yxRBF|}J16%`M;t}Re7-zit)=M#JyBV5{@6b=ssiI*l`gztxm?u$5
z3$I?j*y1k7=;gk$MuL&<NDs#=C`Pvtf~8nA`UGQ>g{7kcKta<!{8mGPFNuYNc?5c*
zAwlz*!Tf5eRLXg$cms9APEVwBpY!?rnKYqjL<CgE2f<)a2T1R at _N^;M1)YLNKH~QD
z4(}je``(tLox6+6r*s5hWMrhj0Q^QY5=p@$?@_+b2SAfIuAj?avwuo{0U9a15}x{6
QTmS$707*qoM6N<$f;aEFu>b%7

diff --git a/share/lua/http/images/vlc-48.png b/share/lua/http/images/vlc-48.png
deleted file mode 100644
index 327b53894cdd640939e4a230a86d61148812ccd8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 15875
zcmV+eKK#LnP)<h;3K|Lk000e1NJLTq004jh004jp1^@s6!#-il002G8Nkl<Zc-rlK
zXOLXkb>4Zgb5G70m;o>t4AKVfF2MzMC6UV at E|>I at l;v{ClqK1vA6B_kWmmbZRFX at j
za<OE)RFqUS6|6tB)>N>?C{erQQVh#Q1_o&|CeQRt=kUVyIrqKSecziN>@0~ez%Hs9
zJ=4?S^*!l3=brl=l`#hI{(I;CQ{P>JcNO3*|9$??{sMGO2ivwmQ50Z`3hL!QgJk74
zR7yFBHnc-=bq*Sv8bOaHfiZi}d_hT(Vf6<Wm86vYbT}-3T4L6S#Go1dUc|PTj`uc5
zas_|Rfvl{XCVRuu^}kU2T3?kE4d3Cxd&uX0Z|WiN02oS2nKW3H3NG2+2`da_h=<Jo
z)*rWjIUKS1l`#pWPCrPVme^rQf+SdGw^4+nsdVu(>nod|gt-0+JmMkp?kE7Ro+K-<
zHam;=Qf*-$xbX41%GT3^VfM>l0cZxAeHgzq-eetb`0XXUm&nj%0ILL$TLUmEAg!+E
zes6t4{wg}V9I$s4;LZzenYf^FNDds>Q(ulrGO)S1f2YYg(Bk-I6Zlvet>54}3lykG
zUrG2RW1DmrR|KO5#8eo{M;c$&I~xB4W8b?9 at D?rrOmzJgnhsyty%78HI*d}KJzmOx
zIMxfGqwwVjK91JUGI&FoA{OBH%&LV0bY!5RM~H^-p?vYv<x=8L<wrOUsCP&B285d0
zVNb0Sfz{c$kA`Fx*CXy at By<w2>|83xs*E6jdyh&W%lxGXdhwPnKA&1yAC^P%%||s1
z{MZU0;fkeZC&4HfPW<09;7@{RKL1j*0l%c?x_Y`<uJucf5=gZdIKL>40;sq$5e;9e
zgieQATW&t8Vc^GB09wRQ9MivuwP(N|N!Kh^TJ>!DiBQ<FYA-U8yC;ihiW>r$YyD6Q
z0SNp+#rrUU!+haWMk)Sz3D}-U3HOu&ko6nIB9se79&`81KQwncSNJJ(|7}{>v3}3J
zgHhEHH-I^E^`aL&P6|NJ)iFcRbLA(Bs7y*oU4ImzfcoQ_Kf{Dt(L%77<j+ugvY9;{
z#(1y0F&_c~mjn+cx%hzGKmFo`01fXW3Tw#a@@JG#{1vBo at U8;X7Lxu)Un)t~-cbO&
z5UXOwwNmbdNQ)y##R~zF5dR?%|2 at S}9P6hLz{3E&-n2g^E9xr_T6|XlY71?eJOiMg
z_lkGqp{QaU3rlPu6mjFfCv3^Jbla!JKCPygOD+&3#UU at EW=ij2Ox0CQsyu2@;Kv97
z49rp)6w0yoko%V?{YzzkQm1 at A<XXS$0k{|NOkdjO&Z^Ep7BT at 1Zy{z4XVSS-QgiH^
zk6IY`F%*D2fbFiQv{%d at Ov92PyY*5y<`i@!Nw9u!(m;+0c7BU04p7`sfaxIQP3yF*
zYTpFQepdm=%~Iu$6-x-Xw7ruYQEV?6{UK%_3P&6Z_A&s;6+W*6fRh4l!!0f#<T$`p
z016=?%myHvdjVL-Zz-B&JxXEVM^gY?m2xHx=HimG%6muwAa8sqsoEjR|9!4sPyo*x
zR5Jh;2nC)8pfDmk^#IMTJZ5Cl2b6~J1X%2ytpMozq1ZeI(pZaQE_)^Y!vsEl{k0E8
zimSYoD}&$xWVhyTIU7E;JW#l2)iMHqKF<W`9v_clw!0qhf134=qXHQ3Tm_)TB=o<T
z7zG<|dj|jEg_RAfvHj`M$J<uFg1=q|P0E05IaaJ7AcPWd*+~J!&ntsoSa2(ZiiwM3
zyU%Os0PWZ*$TXh%q^ZQdAW83Z4}i-R4eJ~W?3JaEsVcd#@slfZyrccO--J{`LIl4K
zuz40XZ(o4U78Alo0m}9|R4Q4BB~^^`78s}z7QQx|Yyb%}npD9CQ*DCq$S~xzUbwg%
z2EAt-X4bOQDDZ at l-D*OW*nGz-05y@?cuOXeu$Rhzd>=<qPlqEBXi3H)*4hEr79!Ah
z=nN>M09(-r<T4weK4C*@bqV@<I?$6<pj at s%CYOiiwr((N3GyWqfo%v at H#R}nb?Duv
zL1t?MLThQrmP^gqZ2ojhYs+8TkI3eb`gT{DgkM7RZ{Y&$CHK#m9bH^n{NT{gAfz_d
zxtHqeZi6tCF*P*7Mwh;_x(fUD4a4A}PS{9o!t!z&#>b98lG!jbI}4>!5eEADpj0kF
zL`IK+0C)1n6=-a1f}Y-9*xcMCPxE3l8u{yYs0Wb1wk*hC2C$d at Q79@`j3W&Vjr%Dm
z4GrxFP17Ks&p|j8f(=xNL_7uu4~(D?({TCnC3x)Q321L=gq4*=RE!lka^wgwRO)Nj
zu7iStZ*6Vi-l4s{gZDUIyLbT_8k%5jb at i#<-X2wwCG#Dp0JPBgVgX~Ty0>=!c=b+w
zE*gu&z~B%puPi}JODj~$W!}kr;J^V4-xauU;UXM9JO(F at A45ghg4MM(I50AT7Ty3e
zGqX at E7GVT`H!;gOckUcCpykVo%st)V!{hk;6 at 0AWpd`spg*5H;N8wDx+r|L7Tmg#c
zD&@Vi`vaC`O1XUT6CEAxu)ekmJ>5NceKK_6y at CR~eEBkr43EH}Lx;F~pPOHW!GQsc
z at fu{a8Q9uNLw8pv$2Ze6)4V<~e)JfIgfd)0%WrCGhK0r3h<h5)3p7gT1<#;jz3yy)
zNbd{<;7ychP07Yah}+3M75@#x=#kZ}BLjm2(9zzG`MV0ySQMtGCZVst4-OqX#IJpE
zVF5ZiIxrk0FqGN!Ivy(YkPd}HfxG;+)>hu(JaP3Z#N%-|G<ujTNfg0l2|dKd`Wn60
z2O{C{e^FJ%e%O0N-i885xJX6F<3h=MsP&7kE1k~1kVqyY<mO38W$yYd*grhX)5E3Z
zWsK!*pknA!RShjUftaBTDFk%`ef|77nQRt4iG}&Uf&kZm!NEZ;+l%MVLpv%>OG^uS
zj|vQ9h*(@)dde~?`!Vd?eAvUlt`&g3r-h5^#KgU%02Ke_k7UwYuz%kGn5GH+<lfP;
z7hH=c!P7OjqIDC}pPieBqX_yM8yYwcSX*C5FL98EfZ5qOP&E}5h*4U}JwOq0&!vkO
zQ4u;}eRU1O;jnspZT0DfhK6^N0x(=`8FW?OGhvT}iULn!Y<{A-sS#ob0;xVRKR3%k
zU?P#gaG*eQa}y5%6NvDSj*r9fW5-|}UHQ_|G8{cRj^3dirlx1O=h%m7q=}wjdTJWt
zi6mwa8$1*oKlvDD04orVgdv3~WHc6gxuv!B&nYW<<Q0Gb6~)Nal@(BAc~80jVzKm`
z9*J~^bOmzR802#~=*65pgy|ohQ6%?1IXMNx`}e`g6UQ-JWZ(+M_hYCC&CSiQy1I(W
zu)zT$z28;*8>NARLqixQDwr*#cunEj)hp1|)5B{5k!TEGv;GvOjY&mOG7odF;I0&a
zia!LDx_i3!)Wy?5)!VlhPLqYATjsHvs&}NUbicB^g4f&w<449Yd&$G4D;MC%*cjdr
z*rB3qq*5?6(9gZb;^G2F{rgc-NS+rjUBZ;F5jr}%xM%340#T{NpBE(sSX*tybod!m
zw68wQ-NNebTrEJQVsO;FSMq<libB2+M#TO?Q*$Ga^{LbbghOGj7-bX|fj}zakj3}+
z_oI6s;@^R+nm}Cxf<g2kTp2LE!;oPUz~k?K?ATEhya8v=p2c*si(`UFGzudJ4#M*C
z62}9%Z1$x at JpNVosCxi|djBk&_W|rB^oPqnwwX$ewzf3E8s`6lgF{?F8&Q}Pt8d-9
z2|Yc%Fo2+t9?zkmn-D8l?lE@?69jB6%j9mJ3P6M#Wc=H$Ter~CqZ}jT@&%ZmMO at L^
z2J`a{z956Z6!Pgxr6Q}EW<RW9U{?xYas{yVmZx(%d!Oy;?cpG<t*wne97Cba&(A?~
zOEXX9s3wrXJU$YM@>GwCMZFjnNEudERuTOlK=2qtt6qT$dWRMSjD~6PSRcZ$ckS9W
zXv6m(Jv at eKV~PuZYikR#nGAZI)EK6hPvGmn|FCWj?MeY?6J)QsIRbbVgO`&Dhmc|e
zQ at J<_(sTV(sict5(%ix~uj26priuF?kJd~ZKgZCro12<p8Ik?k+BzH_J;dGo%<K%u
z4;1I=UsrcG2f^phpG8kH#8b)+bpMzFA}$Kam~Ngy{PAcj0F_hO9x8j1a7*P<7lx(r
zLLtXpxu$Ap^)1}esp8k%)Wols1k;ONqJWBV>EdO+3G~F{k0JVBgT<vq1c*nV6Y;|o
zrhNqR4x&e(kazXURdo5SV4_zDA;26TKZcgSiQo?vEsh=oGa^}5(A&&^Ad^h~9>Bwi
z1a_AO?xoo8rhmBF?{9DKh<CKNq0l2hO at QlbYoMX^HX?eb=Md1NIsm11v`O^X$>Y4J
zLvH=>;Za@@q&$BeZzBX4 at l9{sxXCfV7-kC;5+<%qK#S4}OQ<YVNE#j)MsGu&r5PVv
zqR)OW;)p?A*QOsv71)&mM56IMb<w1dE34}t(Zg9ZJQH1i6w+I14gzIG0tGEI9F4#%
zy7TU?ZnWN`kinRLbz%Yz9yox{8-PNw2wR(5yhKd<0aOp5j9_qRko&nym<BeY7uh$o
zpO=j(%`_1BO- at asN9p4g#ope2*xcIEH&g3RmdlmthjC+QR|<f!ZVzEUbnDEHCXx+L
zk}K}P6fKU(y`!^}7lBAnTe(e0pmo#ME^YcuT))N at p}VV#X8`$pp6C9w8%Spx4a4N2
zgF*>eH~ph6WXd!s4Wwp}CbW2Z?$FRa?ltncJmd>`%n<VQxi5G3_I!~a8j&7B1qfaK
zv%O>e2>1$e at -%cj*WZXBj;yzUg4iU$=k@@QyC*L(H8}-cD0JE(q%t;vJj<kpmMjN{
zO^EbKh+F9`RHSa6?Z|Qo6vPwUy<<i(K0eO-1g>1Zj396jvbhX&qOwtuh$^G;1_Y9`
z*H1Ov`chnxSnl2gfq(O06+qjZ+B+(XRvB4dJ*{q*pwRORz|wgb?C-|(FHZG&?g1tz
zZ}Rx>R0cK37Y!cY*EiOAU%<Y7LtF_~P=KR|{t3}9E-s=1SUgRnl$WpsWdl=FQ<!45
z!^y`Vr?ii^mr;iiZ6YO`JD`x=gwDBdbr`q5_oUj|@X#F{+m!;8F*fd*+}{RW$`n61
zTKXC!CL<6#{fkhP!#v;LNTorBP3T8URb+{mgu^Jr<)vll?d#_|ewlOzZlO>gf9xc0
z`=YJlHOvU8@<;!!UAw_|18D<^Tz(VY)Asj;^XCyC?1zq?ekfKf=!zs at _59Z%dErZ-
zOkamgEctOI+VD;GkR2V{l>)H6auNmwVdcw*Lbf$dhc*(I{~BT&uY%Tf4APyaq38Gu
zAjP|3BWv(7Z>EriP*j0KqvHtr@^JRt1r+o+PXo!CmzGy}{@;q>U}}1rZ~pAxzn>TN
zE?l|-Eo~j3MNt7%9r{O(fK^Jt?D_A&Xe<NL)o(z@<PV{cv0y_7unUFv=GNBsQm6b~
zRDeD5o%mH$jQ8mZNObTM4Ik{x7Bm)KgVx)xfp+u1fzmkw6>SLA?xS#Ma2(9aCY-&v
z0K;QXz_F7jpja~C=FA-5^chUFz-GR}LEYfMejwRRVfav)0Vnr2ft8zwYu|qj`jQNK
zN^@XNeHZ$c=b(}{p;Q6qoG4yL2=A4mdBil}L^v5f%O0Yl(C#omIJ7tXKmIdHo1dgZ
zoBZgP>>T2>Rfqi(a%qszD*Lq`f;#t?0B-_>BMLm3je>Hy6V!$_C`&5nhzVM!yFm@<
zkj-WxUd%z;tprN62;t3TP|ZyU+i2xR7CH=ke at yVqGU^`Qil~LA?r5WIxU6C_Cz4RJ
zh4L9YrayWL;H>V0m%mjq+ElA at oR~f}6oMkT>|fOo0i5Q=c5l3XRkk36LWWcp<mH<X
z$HyA*TU(3H`M)OoxrKgTa$Zlr6M+<SSw!e(TLXtAjBX~>j+IHyHIM=jos44I?^iYL
zv+(FCz#jNQl*Sb+&+EXFy6RBBRmmNt+9A*#Lx<vgTMLC{yQC4!{h7Q7xR2Q`pAhpv
zr$8PhdHg|2?K2hE1JEI9mMcDMR_uN~s?R+vRl!{;fQqTr1OJDsY%XoQNES!&pM)Sm
z?Fe`+NCYHrJ3^F2RuEPrf(V`xuF6fW6M;O1kZRO(vg-xtdO|Wpj9l??Ev(KxEMZ`G
zAn*YzGbf}d8exR;@1d4N%_V*m<yU2Y5jg?DIr%HGn(!pi!kJ&rzVFF=rHATG6ufv-
z-7rupR9;q8^-GVG0zBv at APG&(E|yNI%-TobPtyb|3|PLnX(>rHI at qeDSxs9cK@of&
zK?*2>TzlMe`=TO9?qhUqtWbC#{uV)iS$r76z^)XakjXsY at Q?ZbR`yK7C2sPlUqu24
z(HepISwXzB|3NaSs%IBz<3z;>JXs2O1CM8b;{eGal+wZO&Tniz9%+hxo7s<u0%)Pg
zgRJ~wzRgrtTz`QWJattNbUkYo1<G7%SP1X}LX9<~UWjAcqd at if!Ehh~P{j!aQf at Qz
zaU~4jhDSvK9B!2drvY}MbWpX-6Kcq at eo69sYe`TDPuNw;7nl7*oMRz!165h$<n3A_
zN&b-HeV|VXgjA4z58?F{E&II+any3k>PJ8UWaYsTLD9?~$tXU9mL+q}9xZ_OCD*-!
zKnEupp6$12NyG+X>gZ9$)&YUl&k2G+fq~S+26T;3s2r>0O5@>%$R)PN38i+|5=K>*
z2UPqa8?rLlPtw9_E{nJ9fiO7`?_B|VF4>z2Ak{A_`V8KO6PQy75`W+30p!|eDFP6r
zTSx)DQZ&v$GID9JcMI?F5P<H#WHhU0<#9^?h`n2`<NkNdQta&tQVjvJpDc<An!v=&
zhi%V<WDyI<+d~1RgXN;}el-;SAA7wjxVsRbJ(#@!I;LGom(M7+-RM!bR^z<D^Di11
zW3 at 7_?ENl=2qxS-Yp-MBET}k=U)f|K4fS~ew at _v0bI%!tN_Qw0THMPuf!(!*&n-NV
ziz7kG>HLcgYOUPrS#1^6vF)tio_FAmi`A4yg6-8m<`PH;=?=vjLG`)Jp9zSAD8!ir
zJX}c-GxDX!^q9W5m+Jw$D+Na%Oeq-GO_S5vrxcg2)l0iX*YDv0S at OH;YD^a_IcU|@
z`jA`)2Z)vrb at s#D$Hk(MBG<eDkyRJd#ZNR2_WWP4t%q9y9$5J|S9(UbtOG>yNN!aT
z;w{v(&Hxx>mfwmc*nTe-fT}eCTc{jL^~=FZKmo-<5yt@<(dlHKTbrB-;q{guZUwOK
ze>O`~KNQnCqq#e8-2DqxJ~8E^5bK)@WIH>3U<ayp^|AoAT^mF%;^Pw*cL{@;l8Xlv
zahK4xdzon+*Ak)c at 71c{?v97M$E4m)@rHN=<R61l6&GHySJz+gYU~68fz_&aA|R85
z0uU1v#J0Dic+t&Eb?d at V+x3$LkQoRuvbY}*2m!K-SHcR&*}U}$wK4wvy*h1VR|?R5
z=3l)n*G*^jmezBSwRBK_lrJu;V5V1w8*Y8>2`c=ks^DhDbPTqqV?OJ({Yq0U4+q?T
zbwkL-3|^5aXy&5Ai3+eSL`c=%6kyS&Q~Ae#4rI%Mw|lylY9Q<$lX34#0p9ogvu`JN
z1F2Gg><>N<f1eqLWvd-O#DKSRVuFsL=OOlVLvxp+WR|!GkOWJY13=7+-7@&yxz7RB
zs|5h;P!aM!7OVw{fKrlbn}xxB0Ud9JSnEkiZy$|m^2FOp2gwV`VQ5_X&VyF~qg;Ml
z3c!pCM9YhCN-x5z@<*U-M{$v?-F|Q0!@pXpd at 6tJW6=78Kg5e<KFgDYT7VSj3#jJ&
z%<sCrVNu&^{X3~<Fmv!igJAt$!AO#~*8~*&x<+FH%p)HNspb3`!%`-8Uln9vDq(0S
zT!g-*uRfevfC(BjD0w)R`XYQg^fJcB-EWMbr8L^5{1Xe20f;>LFQ8 at Se}ih2tGT*Z
zfA`k3+Q{P-ax8xtSds#@e-K=K9l?W8N(Q0iOoF!SYzkF95<X8g at i}cBP=4l at L1E2M
z%%pxY(%k$xX_rBONh&1Do3MZ3Z|^z&zNcxRA%$RH_ElJhVK~diK(*icfC=aQEtgM4
zW3iT4EDTob2VwodNoc?N=MY;w2a at 4hp;FIo1OeLhSDUdqxxV-Y-rqcrAqPLezXMsl
z;oo$Vk0gN2L#JV;?*mYg8X%uq0n at a9LRFOxUDH?IvM5B;*wheoUi=e?l;$9x=zDk-
zfWE3_*)ZB6K{3<<xgz7OQ+Ikko$0%A^VY|Ru7y~<n&V-B=s2vk|1M;1zXmPSUxC=#
zIj1F?Qp6DWnnS(PFSF~EbL+)=!Oe>`f$Dw$+g?EM at B@$iD0GFCG8%{6{wHB;_(M=`
z8H4cJ3WO{Jw3b#niQJIMW=}RZHGRc;3mib!uWsFhP<b6}`QDdl?)fJ$*H=E-XTsHu
zMkrZ3r-x4J#*|n*{xmU?=W-dyWustjZbD02JLH<5fynsB!AxC-$ijCavHTs7R<D3+
zF_3L<-=a1azFO*~_ho?=@<7oDguX#vDkypeYA&%TzjsqiOphzQ$6!_;19RwoaAU)U
zwx%|;`c;U9brihAB+FULH0|T)-M%8<ArM+9{CH&%!i7n6{r9IvcV9lmW-?mI23o~s
zcw?m#bfvxmkoBk2=_hcR54E+nqX%e&L^2K`EyRzgw}nHH+1!9c(>Tl;T`+j!7eLL-
zLcA~o;g#=#vUU}e!XhM;BFM!u*lzMco`R2pk%gG<#dEh0fCD+t%Ui-$v+T5zm+-Gr
zq8*HA53Fj#kZm{tDFx$vtOpufyMPrkFciu1gC=y6%AwV<p at _ndMk93a^m+W7hDu=6
zivp;^pvx8{*S`%Vy{S%L+CyFnwwMA(S__bqDsU^`f+>=<y_%-T#P$0kx=WdkVMoF$
z-gJKMpU&^EuNy#|K;?WI2D at 89RdukN55ZdUAZ&%7gpo5n0L4v6rRPD<&VaEn0dX at 6
zAv+6lISs}18YH6%ZPY-elmo*oLo6NzNmU_Jtnm76IN1tJkHBV82DPD^3&U<a3>l>j
z>~Jeg-d>0Oqenp^%~@T7I4aN7)pI;t5$Qw>y#mI1&PimN24^p&Gl#e5=LayWA5SC_
zXSbiTkkH~4Xk7UkMC?^4hT9&!y#U7fdKio;7hqL>4-_H3Ej6 at E3k9G1>8{Q$Zap;q
z#lqKwbWDko4WOtB=z7Ru^jKMjRtyU(%gdY;syW^Pxl9gJEe3gg5TN}4G#&m~D52kf
z<H7|vFtQIli2}Jw32x8Lab95?1+<KwVk?t at p1yuwfV#S{1R5$pXIBr<oY)KJFTzkq
zA6{D-Gz2gM{SnBl&T~c);v}w=E3j|hegv*1P9aO2L|bV6L_<e>1KC`bQ_7*`lb?A>
zk>#^?ppntSe7`kw4mwI#zzlUfx|=~Zik#f at arF)OcIjCJgtb|1#KeUQwcjv|5h82q
z>}=<pec at 1qvwAo)3S`*CMJ7fN;sv6?6$j|ZHwv&+EO5HFJU)*YO^NyY(z)-Wkow`s
z0b>5PVSe^D^z`&Vb1S-T^y|4CS}0m-Owu8fE%3Adooy{#Jl8M%5L#Q?;P~Mo?#3r>
zT|+_d<KBq42b!B(U}k!nD`f>OoVW?PiDZJf2Jt-|idl)XtVW|K<hTv1YpWk^Zfg83
zRZ|QPVAu#+VrCjzm;N8viURkWV&uN>1{zF*US$DB^$ECQjAJOMxOTvZl<A|5jg7it
zR5&9S5it|h3n>JRZXu2y;svBskrtg6``Xp3Foc4k1x+NAoDP0!a*{K9jT}6{mBwQY
z59t~&(u8yst=~kY$wPBf1Ez2c-FJb+1tk<V#a|L8kwjd+cnJoE2I2UL6P#OsxPgdc
zkVqo>`uj1A7~C7sKO&}d7)v)f0To?0jjSOGn$*S$O)WWs3UNS{<tvQU4lBg3|1VI>
zDPZxgJ-Qos*YSW12TK14GvzR>+MRBx7>L2+Cy1Dd7BL=+;4RMGJyE|9#S2;1^3oEg
zbxo(YP)I#6w0}QWpAZ5>qHrVS86rwp(;^Bt3=>2G<&3x^CXiCOjPdw3dX59!8xVOk
zF^BJ?_d!pyvbx3zA|1LI*&&U>`#0Zw6Am9f%n721GKQGQh?Sf|Te2a^=M9bG-?Qm7
z|9vx+;+Te%fs~L!S0bs%s1(m?igJZKgRSV$u=rI-Y at G)?+WbH|h#!aoP$&pV20W>L
z7yeQDIHqcdk}KtQG`%M?xPV0K64Ki_k|r{z-1<5fUMf|B4)g at X<4=4&<mT7W`e?y1
zd*HE{7X9|ZZG4X~r;8y{sg~9j&MkQJ=1nfd!()dzK?LyvkKxb6DL99?fP_v{M<|ZZ
z%*=2PK#ZVG`1hknk8<}vd21359y-JU9+61Wb0=@z;*4Uet1FyDQbJrnJVNB9h`OeX
zN=e>;C~44hyxiK{{5htCKt-S$pZpRkf(j36{^|p32r)o|Hduti_V?hD`W)uUsplIS
z8(N}>_T%vgw*~@%#MwszAgd?p7Fx&<#@)%uTb#X%9;5h6bA3nvBoOixG~t<8zf^qg
z%^Np3ODN3>AY$mtmoB4AKhAmohzx2S6^y2ak&;YYyT%oVPYkgg22xUt+qZ9X8hRp)
zT0sCx=^k+j6ZtfOP+}A(g{14F8U{^QrBG7H=eY+V1tkKja5#EmWo at GcFMFeV;txTw
z5Dushj(_3aDuBBW%Me{NYU@>KV_$VkcrqAr2u7?+kX8oavfS`&IiEwz*Lf;M at top1
zP5vMhz3E~CqH47;ruO#_IP-qcy_46V_)M{yo<lKL!OxsS7frGJ1PZ&5FTk5;&vHvX
z#;1mDa;{(+B}b%>(+KEj<jnB?VV;3pxOfpdIy*RvC<&6Mb0|Ra6vM+KoH&{kj)3PR
zVh+kuC=?}JfJ#(!lG_(S?w-5}y?-{BZ#0;ErgQnL|0kTC2McpjUcq#0%hU)%6+lLt
zYRrB7K`Vgtc1n^Ybc}5j8>Mo-Ph!xdW#%L5GD7X_yadG!8Om9_&&mwrv}{|fC-vpX
zCG`^@i^r3Qxbu8SQ>9Yo)=zmqSsC#Fl10*j6GbbrgOddlyBF~R5 at OF`%0=l{CbPw_
znT9~nD*oUHZ{W`dxd$LCB!Lk#C=G(541z|;_4W611U at xA#ev(gW5>AVU%qsS6Hsy%
zaoGWfG&qV_Ne2*Xkeeqqa=M?VFp at C2M@eGHqR&z_hl{Yn=NXmwl+qSh_}9sqS2t;=
zhXzy2_`MJZ*)l6KFw-n<Em>hBU%@OXr<ev27p^`~1*mLJ?>^thg_nxyrtspWKaZ3)
zo<o-$)hE9s+1CM4J0CpGZ#2o1w{qcq3Kw>(Ee`{@XzgvyoV}BP6M;9CkUMz`^a2#$
z7cjmj5)BSNF#er at 7rEDBVV&azN*6o3y16hfq7~De0CL;TNVr+(>+8kOXye5hB73Al
zP$CiMN?>uCxDFmRXlfX71s^?jobwRgxN)5;0(pT(^cciZI6E`VuY)LMNogoe<jiEK
zSj0O-lSejCQK%eUE|q!4(26N!dMWclWkY@;X)@kBsH+C(m>H^S1~hpAboq+g1S46j
zJe&U3XIlT@*)OdB+5=O7?9 at N)x{HAnAU^r^Uk~M1Kf+We(XoXM7~2+Zu0l*V9fl|h
zHH*kz1{33?jtheeTiN2^FUx7(JNSKn-vD>1#PM%(Qs*li{Lx2HwUC}aF)@KZ$6$1H
zl!HKW+uhw=JT)U_qSMCYO-PvhF<foltbx~CEEIWePxS)=n>06Y0P(=lqsMt_O0J!r
zpF%6ALJ&<STS72N?>RAXl}{)k+S(?}63C17pu$mofwB)ioC3XDUO|Ox*awN#2~Iyl
zr^onSh1b+l-P~dddV%Kl+{S<YyI<=6&WHbK?rRSQ1H^YZDu#;dm0~hlSo~RH&+>NU
zs)Dzi8$C{6n0_uXbmyU7Ximl<tV+D}O9-A~IZgD`Fn#Jq%O-3<?3^pB%Y1+%finVu
zMC(QsMk0&e+Dt(S7oCbj^m$~V6ehxaeh~1QJXs;l1|ZI00(+ZVTRdf>S^{rGL0o`W
zz`<KA9<M(B=9 at p{A%%ug61ym&escLFEMgob at JSQKNJ+?ptkHZy{0^ir6#psI5J;rT
zApzP_V=ov>6TEMMV*uG<9ivhAHmhv|P_2|&%o~i-FXE36Mgg?K?cKS51bWKCl at F^%
zp_OU1J^5;Ho?G`5l_75`___#er8c0Wt%-v_o(6{EJZ{o!wopJMEXu!I+gkZ&(NHH^
z^fjIaHgF&~gr0!nG^KkqMwU+vLm!LT1rHz7Q*%83KY+k*3!lHdyv&(G$y#qOEO0>+
zpD-1r78kM*#}B7;k^WATL(*FrPC!lXL30P%-EeW^`gNX#klXJ>;7DZE1RCl6NCBu|
zMPQb$Uv1W4BU6C1g}>wXk6Jb1TaqJuUJn#o-tmE^^5zSF^}9dU^U{C((}nx40HMx9
zyL11D^3|zty{O2-MwVUMqvsgFa=t8ONu(GXX^fwe4GId;LhIZ>MM&V{5%MOKFL5lO
zaqB16PD1z;cc(B7Bo|BqrlC=M0vM)e70kJ*_`{ep>6Ad>4NL=vhxfzSkuh|^IWDlr
z9y`gWgi;zvmAqrekMj+<E0?eE^p5g)r^}e}8`TA9{LDCJ5mbyKizWr5Fhp4aDJy~1
zTsFtQ0}Y&@5W|~A at EZ6~N(>!o^f<Xf1)`M#RB#P++X(@dyGCLsGYH*IA!bGsYnM*p
zk6*m+3Sj3qb|HU>dI6JKZvGU1SKAE%;99$&2;R?zO@}8KG_GHQ(%@0(Y>IMAkAx$<
z3P)vKimk->O$%<@&Pfl-vHLI$BugV9P*srj2==3pY1l(Ho9C(60_N_WU7Z}!Q#^k2
zhi`HLK2E&97%qrHmI^}z_NcBvv6@)IZM^VH7ccQb57Eg2#}^T9!308wG3?MtniYIK
z0X}*yjhG3CosB9gUsEWcisBm0FhIf6egXkc1&yRJp+YP-4<*|nnZ%FfuAfuVxeX__
zd*iJMw$o>r*qZ+54 at 3coK=G~LNe6lL${DSk=^^k}ZNd~fYeWU0TdoXz5t`@Tgz3&>
zkPRQ_sT1Yww2(B$jV6K>@<m>@B_WclC99^Y8ddnng2 at 6&0Azj6aHuSQZk6&K<M)9B
z2e~3pmT;4MgkcOBL%be910#kI=+SG*TSO2m9L497!d<*@kpn_1OOqwjb<ngC+6$m!
z5p_KE_4PSf#`H8FN=0)BX~T#-0L?R^zeU|~Hf79)jZ0sK at bV-Saa~N?xseB;d(Hh>
zX0;|3?g&spVpid)FaOR*6Ce6df1ACp3SbrsyNLf5gwu=9i at kcDI};lq#4I3PbmE>`
z%){`lFM)OB7?c_90fhOYIVD_~@4S(VCD%^_p$J5gg3y?lg9n`5KuXmpOi&s|6+3#}
z#Y-2V7v1)e at uU3xi20j@NkSwrNa-UDn`%REL-Cs?h|%9Du3yI2Qd##1(Z!?EOd_tJ
z%^yk~30TsN1WtH`LJfHcqMxPt%0y339)>*B^3oy?2ZT{rC<e;<1?V{cS5Tp|gVZ_f
zdP3W-)BnNz4M}0M+#XI%K94{C&HXI|DbicIf2ibQYU<{Tq^XS64qJFx0E3!aV{XjL
z8Lo!oRWxp5{`<YpLiY53z{SBZpxBVwNb%gBVl=tj9HoIM1db<6Ck>pqdWDx_=@KY(
zP%21cU#MVoWb6nJAv6Y-+&R4$g%g?pqVm*_ at z`v;^za&9C8e5_2JT0%LV)t(h4UP6
z9v&OxLZso;bWbw|22h#E1JE!@dXI^#6a4x}2|H=vBwBnl62 at 3>gPv#tYx=to|H0=$
zE)~FV+sG>x=NAN#NThnY*<CZQT}`DhU=)A)zAJ#<G<4 at DC_2FU)L4iW2fdEkYW%nT
z&6J*UluRcCgj~`mApXCZtI(YPRaidqGmz?iA4Ee@?(RF$5-GmYlrM^@iA0j`;87a5
zZ~w3Zu<&`b2TxnIBZ%@T|DT?o;uS&?Jmvr7HR!XcY)m18fFs3q@&sK7`Y4?wp^@cM
znn?vBjtTJbvxpxk4eadd;>{nF`pwPG^3SC#fxhIygNJzdq3c;fr68>=n-at#2vo2B
z4J6LK0;Ph<t)IH$=oq<SxqJr9pZ<Arm)%x#?jdlkBDsZUzwsNV!awyJub1wd0vK;q
z2}A`@r~mPzitHz3V75Q@^T*si`l8`v1FFEZNwouQYYq0j@!z4GxdP>r{}Qa|2xJgB
zlN%;{K$F3!R!>zqDh5$Ko;HifTkJy+NHhM(0}wc*=MoU({Ybcy)IBsrEa5|gTnPw2
zj2<54&!tIYBxo8KVe|AY$2V~(RiuFtgb8SqXO4Fh?c at 18DFbaFQ6B(d6Z$)^B%(Jl
zacOP5zO8eA2dy{$4)ohMo%2zuQ~l&b5>z%ZYl8RAE?92sdi5NEa40omRz~zl+cWsv
zH}78^pzY9|(Z9{4aOIVsrlu!fyPMlP&50TU{5q+8t at lM$Yt*kC2~&Q2<sTqC{W_SV
z&qKcBIcOR?1GI%|WBNp`U4*>*&;!s^4~oA8=xDlk8u5T97_x2xb|gfq*HeQCS@^Yy
z2{>|O+y!jwJpLa#G|I2-=B-<N_+$%LG-p0Bfx%lhr+Gzi?8p&Rq$Q{1TM6?VpFk*8
z`bs8)40^Sdxm&PLOM!OoFQI$!B9!wsR5YimBQ!yACE!^N)EG>IOe9|YgnsAj^te8e
zjq7Lbs{)vtH||jV!&sVL9Z^fG2SEY<F={V{Ny0u6-ij^&)ZEjwn!26tjoh7PmLYQS
zE6|+yd&tim1^dv4VNvM=qk9Z`_l<I;iEAMgdYTV=qD>(VxG)<a)J;Vk`gic)L5>&B
zpF4|b;4ygYvB!8Qp-v%63tKp#n{spdVQ17lDhY)iZv;Jg77{w8mWM`1xtphfli_$X
zT%TQn)`lo_DI1_neh2!me+Bf_Ij|~#pccOlIU!RxH%N3hw#$0ro|7O)<sB`9z-c4f
zRRq~>B8q1hKK9xl|I%-t{>4A4+ at C^F$I&~yLj>dhD=#U`4h0DoJ-5bOMsA9Gv>UvZ
zbz)yctMTmmcz=cS|Kt&@vH`J~H$k3#6B?V6V0NE`O6NEjJx{}21_9gX2}ri~LMD&t
zU&(+nzPW{HohE$Idr>zJDFL;0QHl5ZwQGEzfMPaP5-AlV!P7q~5>XmR8%VSbP2=Ne
z2o)XJ2%}Q<?#FPkmVwRnWf<veL395B99jG}B(7cqZRHZkMd!PfWk-q0?*}=J6 at k@+
zEINy?k(z1-;S)Y{$tXO7qA*a&j_GUHM)21w_s0XIXYR23r$ab(<tJ#zxa!@6qqO3g
zefrX6w1mZ!`(<4|9YygIJ%ZR8>3IZ~%3aN6Aaw0jh~9V=<HR38Yhw at CGyPC$8v`>j
z0(k?4G;$oZHVKyz3v~7jz>&wF;ny&M?wtfZa3Fyhhz*<Q`l+o<M=M_3aKPKZ!EwIm
z=dNByVAuhNFq1IzDVV$Y28?t!g1$8a9h>JtPhAK7@&ahNP0&c-C}=WAQ**tZ9UzsG
zoq~>c7NJTqjo;lwIF~^sKupR7LJHzVQcbR5CvP}~WaFw=av!*F3ZU%NtSDm+yfr_d
z6>dLG at 5BN};F+7>dgt>=+cRsJ0hC<Q2XGZY1|N}=41RXcDlNQg0g~o;1{u>UWqlrG
zyhYLVHsWL5h6?3ZLm)LY!Q)Z9?%SA_$#Kw<t<Y1bVBGG7h#o=kWrBe~Flu%|7~{B<
zTBm{s=!*(Sl{_3RtU-8w3+&Aqh%*G3<t#|oa?VjOS0E%LOL1mMa3EK4kEshD%{z_c
z at fv$6u`Cc>(Pqy&dc^~s;GA$`wQ$IU(CNJ?_0_~TC;u7#_SySW3f`LBx%#(q at p)A;
z<5i#UQnP^T_Pw-^9wyXZD7u=g)ZC#I$bBV&^ttK<n4ge=|IM51;SGVHR0(0VZkr$%
z@(^aUiS-5~B`5TBC~i9CE at H3j>`l=7)8Awdvp{W#1ovPr+XHhy(`4IfHQQ$wNd7qn
zBI&s7B7FsfY`}2dHyOgHVR+lYwKJ~bk$CzcY~{w!e&I9SCqMIr#e44o65TuO{cE7*
zzxsaftbCAe-4>}>B)1vFb_kyp!3qTBt_fbCXaV88o(C2|2rc3nKHF6kOT-eM0KvJJ
z1z;sk3bBQ-WeZHCL1qz=Ur;2Qlm$K_xelkWC3rPi_LEDhZYekvb~epCN;*xhof50g
zL%{WmDpuUg-h2 at s`rN(802|lq?)|fJp)HcW`2u(Ura${*LWh_nR01gs#6r$)ph(Xy
zg1_Jd5GGQ$DE<N at 2p-1c1@@Ft<PGw%gF;|VfbbcTTnky-04?~HO%gJlpwMNJOGxqq
zTseSsC=7C=aLF(!Bd~=@CmbUwPS_;QPA!T*<4p;re(Js`K)C;zI<E`?oBOB7R4^K=
zX^X(3QSAv8SUhMk;+Qn#5d+XHN{0&Gal^q-P;W|yv;&Qc_gZi7!S-@&2#`lHK{*1)
z!vSinBGn_}b{%C9Ul&jiCgkj1+@|m5eSgLE0ub;35h9e*9V|e#6ryJKc2K?VM}iN>
z at E&gp-SGF2Is0tt_1|o7KK1LX_f!F_LTWquSHhq!z4<A{jl-h!yrM>x$-`9y8a<T6
zi!T<Pr}9|mb_UTG3Uco<ww;*CTRd;UWw|C?kB?EbRFNVsc>dpet#^H1l`;rqK`hh+
zYqiY({NM-!F~n6B#It;Na20VNC($q(5-uB>R>K@*`NTZWZ!u?9BJa^9Wij$Ca(bEw
zoL;%N+rdFn16qyZmab*5KgSWd<<H$b&Kwq?RwGSLB#21aaeLW<6Ypq0oRlFFt_jDp
zNZ*c_zztmG>0yDYnY5h^RDvDm13-Wm*dvKl0 at U&Xa~Kn^$*#F-Nhsy|Jb at r_*$s!J
z6ee?oO>Uh+Vsj%ZK!baYdd(1Mn?-hS)g$g6UZS#ce&+r6K>>=}(myFP`ySQK_t7Sf
zWc%|s=5p^!%)jXL_XuinL)@i($A=1K$4$~uMzRP!B(QY|eEd}llKpxq3sXNNuZe<z
zkBLMQ;<U#M?wc7PVv0HpBEi_t0vU^^6tZCTmJmwBl+W`96!QrWMe+MaaShwr94qI_
zt-4v1?DwiweBy;f!VMcg{K(cD|25h8#II)VnF4HM3rF`ar!K#w$mqbB;P%0f;Kdm1
z#a~Ll5{+&OBs&XHEIZXR({MM2LPFjvx_P;dwF{=s+|C&faEcj%BKrYfb<aY`1VCgK
zWBz>&(ekU2!1ix at i?gXj7Beplc%V*qK_3a9Vt)*cBATpOxjQ7gdM#C<%QZveYr%(A
z=DW=DCY5Smzh?@-$~m7oF(}HR^5U~}!Hfm`tY}@}=kN1kEgcdfg;282V$dR#%1&lL
zsbZPZppX+ADa3eIr3miTi{Zg|%*5G#;2#Plh7*x3v^rQKKq)Iu6%oOtPl=?!ZYTIN
z0b7_Z5_0KoRrfoS>nFq?CF_s7?wtvnXL3y;sxyuhzcTPpxcH4v0Q}CqQvgZTeC{7M
zZk<p{izguBaOQZ;pVf^Z*&nNGjU}}bsovncmhWzn0_aXTl at x(814=7-r;Oov4MN5&
zFtkbJ3A7BsLIb2vRZFhtl>}f{josq*tQ~kA^LIJ<I-bRJP%LQ4j=;T?FXX0rQ53q?
zgx}AL{o;2}{pE1c3rMP<6vU)jp8r7R-0v&N6Tf2J69v%Q$A!INOh7lUpT>Mu_B7TP
zpGBDKrBR|Kx&49^=hTFwAiCuYTcT=MNpnD<X$kFPW#=*GZXQ`mjXsu?f)`FqzuOf{
zbdt24 at L8^t=!>*GRrD|Uy__U=>43lO-M0%ayLElnN<GqRx~GV$V;EGE4$B#H+vKa5
zLlAH^^eMvn3iyZ=K&dQ`nAxc at eE8zMDFvseg}r~2-SW3yR6^p0kYF_el9rV^6++>Q
z(U<2XSHqdaO$3V}Hxzi;f$7!>c-yq;^bk_<o$BsYc1}64pAZ=P;-ird)DWs;WrZ36
z1OcBNs2527b~o{F-WIQ>)jSd3?{H5^(RWr+_;S>%kGrGo<n6^RNffpm0D}Ue#Oqg;
z%El+|nF7esX7}5vz%t7Ny1Dc;p?}XkR?DN7bMrBriGWZ9aGLw+uJtIcQ2A^C>XNCr
zN5?EzAzWqfdJ5&hP9q2)3xq<DNdCy!b^&|CAf$k`S7Ux~x|ryey?Ads-^CkeFR67(
z!-`YDA;Ht<nOWzv$P4o4%K?IG5Nasm&w<pEXA5LVsqdb-cOWqD?l+Kh7GHl>ku9y7
zo(Ww*l2RMN!s^6hu{u~)2y*o$S4Lr{y?`v-F1QNC+&u)tx%YB!o7L{?G}8LZ(qdQ;
z0IMtonpbUq9RkGqK_JA*lAnH-BXZ4c`EqYw2$Vw3jefVN_L0Z?lA{ok9w-t?b?E5>
z-c!T`o)qQs{8RZ0zke`x>{qVeeGo_`D4suSpysDOO<&a8DU$*nKvh>J`_m{%SU_<D
z#Ujv`6*`8Zj*DbrxBOr^#LKqpD!~>Gnt1o_V`3L=Ro;T2<p57GledQk-$s+{FXqUq
z-~D=VnI7lD7x)OltJb;q^c~G~ZO?=XJZeJ?6G?1`y%ebiV1s<eURJ>C0k)}|>#v^%
zxCaWrimTj*VLI5TmZu+=#4&;apeJI2YKs{7%c){YMWs!?NS at G8=r&cp+<G_PY$uH1
zg%{8Dmz~ArKf9-lJ%VW44#Z~&OcsLxFck#st7v*?+?`d(ty`<bVUAyv06_D;x9Z$@
z3w+wSaiwy%!6}3)5vV_~8n#a?^SOQ%d{rgBj<ja^o76J?$9KOewDU2V90m5&*WRzP
zaw{nQ6s39!C{QPtC4X-0TU<|JLXImWYxkaG=be<uL%&oTm-L#Val;L}&+)9;swn^y
zy at KuEO%!u>51&+Ht0zox2!;EY>?#7k4i&bsihE4v%-zbRYhxuxQ7Ma|m9BbA>V}TH
zjV-o++Zh5onUc^+U9AnUKs~@!PNg*QT>g9izAN_BXP55oX3*M2jx>~&*FH>ID=7j{
z2~^JNjc^k~0|=>2b(%-QS*U8=9UQCoZ7F-gP-{v-S`QuwbGdvyuf)TTEhq)6VUyrQ
z5HE&<=-wqE=T>Sx1y$?zvJt}#MWtGZ3T6|MCKQ}pWg!p8 at sbiKcUu9B!h}KDVwurZ
zOpoRkcx#;zQ}pOl_}gFIRRvJHp29DfiK at oJ`?&iTx_&??x$?Bn@=xIs_sy#zfcdvp
z3H%X~B})-8M74S-x<jj0 at An!!s&QHKH;(u=l<IY?GJpHJj~c$-m=JJ<Zn~du`aO)-
zyC?QT2KUf7rg3-meB)`rkB@>NaNEp7*<Tsto{Yl4>eqh;;J5Ft0@%5EU at PZOscdsd
z(qTL8x?Nk)YV}O=cg*+}8vN(qc|1+HF<#jo2U%e5kFP_B1 at _{%Z2{JavrK3_45kpl
z*lX832k*_d1p!Mn*Ixa|K&3EPC*U|DS!-+&cPYKU`*t{ed&_~$KoCB^kykWsK3%-=
zKO>O?KVQ6S3ZS$c!SwGR&hR~ZrDloMCJU*~SXS_lWUC5M-fodx9ux+=)K4tTu<fH<
zea$Dr=Q8js71Ze~tkc=%-|ds?D3I{}Oxpfg5SUsbDyQg?c!&%+?%zj84?;=`J4`v<
zNufP2;3}hHZuJ@)-#Z2H^WV68S-{qHUD^1~M|t&15q8jo*z4Ow324997Uu8#6zT_F
zVW<h;DkW&UkYY-(eLp^!v-|RX+iyXPZ7)W#VC4<!Se>-pGl<*UUd#`oc2D7bLZvv}
z?1m~9_&ioe==H9p-t<eTWdwY0z+V3d{&x2iKq at Q_tFUqyv_Kq{1H~OCXg;g6h+>=-
z#<W$peH&djo2g-ppfbr~(}m=(;Y(7TX<+rzDldH%7Ep%mLaw_Oa-H6U9rho5UQl+w
zUt$Mr0d)j>hj~U&r^N1g0V#Lxy_LnU$a?n&?Yp7?u=>4IipCGzZXcn-ghov!><k9t
zRuBVh17qHTH9Gk}F9KBrFB2T)CiypLs>&eOKEEyoVLMy454j88ObYg`2fT$8#6;l#
z{seNRxRd*XTt}$&t_1>~5bm&!vhZBWFiLaB&BfP_LiY#H-xUR at EKPhU)+7{r?xev`
zN66v=Dgp2)*Foc|yIEp^d)&s|Dz)lo7c8*b7hGiD<w|wJ0lb9}>g+j4(j6?*Edp_m
zsk`^`4vGkV7rsr2>M2OQu%HO(V~i=YU;mR62Ot04yQ2WvmBrzvPA4}95nSEDf<W3y
z0>Ztr!<UtXD~krgg&hEq<jRdYmK|v6+7=G(AZ))25MCo at FtV@~aved)b-pjVgExX5
z;(k3v5G_CWT*WDp<>%K9-Zc!cF>6KpX}6iumyS=p1!8;~aZTF6z3pm?@(v0XL~B3l
zXY7<7{;1Enld`d$m9MS`khTLreoKE5U;(4{G)vw!1$h0OQj8M|H+lg*`9-HwRdcsK
zgQ<@g`*u(OX{S`|PHXa3R&pmmRS*3KK_A=x*d66vFINxj<3k|x37#y19Y)%D6;*Zz
z!(x)ZA%!}pXor!unb&6kemJk>UbtHdu$pH}*QeodbjfLU;3rsQ{{cot_M_xrj0~Rr
z+a{|ZiiRD>{B7Sj*+JmG_mFlF9^3izcCvDD;I!BS$m)fj9pZXj0S6R?L7n=Bw7mvF
z#VKl_F<k<R1x%%LQh5IEm4bWQer-Op(c5BF4n`x+308inQLi2C_6~c3aJrS(i%kDc
z;kHE#2wyDru)vsi#<ougmjX)U>*uehFM*Ypf(4vA<$!Mm8Kk$4FzikrRp-zt1j^=W
zAQh*EnX=neP2Ez432eF)`+9P8;4kl9DOi*K>EC|8d<fqC_sIR*l>+?cmlxh$sYmqR
Z{|95z^%}P1kA46E002ovPDHLkV1inr at 0tJr

diff --git a/share/lua/http/images/vlc16x16.png b/share/lua/http/images/vlc16x16.png
deleted file mode 100644
index aec7160ed30e77a3e5c201580ad98a8f2368d429..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 606
zcmV-k0-^nhP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006dNkl<ZI8T+#
zO-R!L9LDiqnzX~RMz=o^MG#RGnGha=pt2zCg at Uj*Tc#VhLu*?ZSk06y*G!$|%4OM%
zDHt2ft<t4qIp>@@Ct0>^(KOp!wK)YD2|it95T$L0 at 9BB?5CB>z7oT<2mAABLvCo3T
zv*VoAJ|W?|h|q9k`MS6PwIq`}ac2tx^370-GWc-=Pn-4Hp-)~ohdoefbjG-VvMME8
zXR`i$>lw#@dlVXd`=m^vTp2U)=v>M^M|}Z4TAJXtHsOs at jE85o9gG=hKFqrJRX~^$
z5+YK9KcCRJf0-&KpytGe#MVPJ;=4cy3kfq)LQq05q|=uNr#2 at 27bv}3v-L&MQH)(*
zi{K?Tri$6{m#l$Kl7U+l_fr=IJaxx7)#b%Ev~5;&_c_tuV}rA|8y1@#YTYZyN~Je-
zf=!%%0;3x4&hhgJ)9OO*TubKwto=i<xrSjM`~b7v1<gwfDurj~y7tiY>nmxy{{jNl
zDT;Sl1bt>Qda82JYp8>xqXm5y0~`hwI_24DOizYs7hzDezV;8`o4F)0EMGP9nNP4B
zAh=Hw#&QTg-V*!}CLnZ?;LRqO_7dK63Bj at z-U-|7q$m(Fi?>HA36XL_sDR+hC-`}U
zKpr6|AWVu0!OMhjA>o&TFk4HQab8P{0<*0<WH2&-kpZ4FK>d7=8Q=*6G|Z=EfHnqb
sX8>DjMHDccX61He5#p(X$KnB?- at FB^`63q}3jhEB07*qoM6N<$f^sqn_5c6?

diff --git a/share/lua/http/index.html b/share/lua/http/index.html
index 211fa08eec..69c2438938 100644
--- a/share/lua/http/index.html
+++ b/share/lua/http/index.html
@@ -1,287 +1,232 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<!--  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  index.html: VLC media player web interface - VLM
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  Copyright (C) 2005-2014 VLC authors and VideoLAN
-<  $Id$
-<
-<  Authors: Brandon Brooks <bwbrooks -at- archmageinc -dot- com>
-<
-<  This program is free software; you can redistribute it and/or modify
-<  it under the terms of the GNU General Public License as published by
-<  the Free Software Foundation; either version 2 of the License, or
-<  (at your option) any later version.
-<
-<  This program is distributed in the hope that it will be useful,
-<  but WITHOUT ANY WARRANTY; without even the implied warranty of
-<  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-<  GNU General Public License for more details.
-<
-<  You should have received a copy of the GNU General Public License
-<  along with this program; if not, write to the Free Software
-<  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<html>
-	<head>
-		<title><?vlc gettext("VLC media player - Web Interface") ?></title>
-		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-		<link href="favicon.ico" type="image/x-icon" rel="shortcut icon" />
-		<script type="text/javascript" src="js/common.js"></script>
-		<script type="text/javascript">
-		//<![CDATA[
-			if(isMobile()){
-				window.location='mobile.html';
-			}
-		//]]>
-		</script>
-		<link type="text/css" href="css/ui-lightness/jquery-ui-1.8.13.custom.css" rel="stylesheet" />
-		<link type="text/css" href="css/main.css" rel="stylesheet" />
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script>
-		<script type="text/javascript" src="js/jquery.jstree.js"></script>
-		<script type="text/javascript" src="js/ui.js"></script>
-		<script type="text/javascript" src="js/controllers.js"></script>
-		<script type="text/javascript">
-		//<![CDATA[
-			var pollStatus	=	true;
-			$(function(){
-				$('.button').hover(function(){$(this).addClass('ui-state-hover')},function(){$(this).removeClass('ui-state-hover')});
-				$('#buttonPlayList').click(function(){
-					$('#libraryContainer').animate({
-						height: 'toggle'
-					});
-					$('#buttonszone1').animate({
-						width: 'toggle'
-					});
-					return false;
-				});
-				$('#buttonViewer').click(function(){
-					$('#viewContainer').animate({
-						height: 'toggle'
-					})
-					return false;
-				});
-				$('#buttonEqualizer').click(function(){
-					updateEQ();
-					$('#window_equalizer').dialog('open');
-					return false;
-				})
-				$('#buttonOffsets').click(function(){
-					$('#window_offset').dialog('open');
-					return false;
-				});
-				$('#buttonBatch').click(function(){
-					$('#window_batch').dialog('open');
-					return false;
-				});
-				$('#buttonOpen').click(function(){
-					browse_target	=	'default';
-					browse();
-					$('#window_browse').dialog('open');
-					return false;
-				});
-				$('#buttonPrev').mousedown(function(){
-					intv	=	1;
-					ccmd	=	'prev';
-					setIntv();
-					return false;
-				});
-				$('#buttonPrev').mouseup(function(){
-					if(intv<=5){
-						sendCommand({'command':'pl_previous'});
-					}
-					intv	=	0;
-					return false;
-				});
-				$('#buttonNext').mousedown(function(){
-					intv	=	1;
-					ccmd	=	'next';
-					setIntv();
-					return false;
-				});
-				$('#buttonNext').mouseup(function(){
-					if(intv<=5){
-						sendCommand({'command':'pl_next'});
-					}
-					intv	=	0;
-					return false;
-				});
-				$('#buttonPlEmpty').click(function(){
-					sendCommand({'command':'pl_empty'})
-					updatePlayList(true);
-					return false;
-				});
-				$('#buttonLoop').click(function(){
-					sendCommand({'command':'pl_loop'});
-					return false;
-				});
-				$('#buttonRepeat').click(function(){
-					sendCommand({'command':'pl_repeat'});
-					return false;
-				});
-				$('#buttonShuffle').click(function(){
-					sendCommand({'command':'pl_random'});
-					return false;
-				})
-				$('#buttonRefresh').click(function(){
-				    updatePlayList(true);
-				    return false;
-				});
-				$('#buttonPlPlay').click(function(){
-					sendCommand({
-						'command': 'pl_play',
-						'id':$('.jstree-clicked','#libraryTree').first().parents().first().attr('id').substr(5)
-					})
-					return false;
-				});
-				$('#buttonPlAdd').click(function(){
-					$('.jstree-clicked','#libraryTree').each(function(){
-						if($(this).parents().first().attr('uri')){
-							sendCommand({
-								'command':'in_enqueue',
-								'input' : $(this).parents().first().attr('uri')
-							});
-						};
-					});
-					$('#libraryTree').jstree('deselect_all');
-					setTimeout(function(){updatePlayList(true);},1000);
-					return false;
-				});
-				$('#buttonStreams, #buttonStreams2').click(function(){
-					updateStreams();
-					$('#window_streams').dialog('open');
-				});
-				$('#buttonSout').click(function(){
-					if(current_que=='main'){
-						$('#windowStreamConfirm').dialog('open');
-					}else{
-						$('#player').empty();
-						current_que		=	'main';
-						sendVLMCmd('del Current');
-						updateStatus();
-					}
-					return false;
-				});
-				$('#windowStreamConfirm').dialog({
-					autoOpen: false,
-					width:600,
-					modal: true,
-					buttons:{
-						"<?vlc gettext("Yes") ?>":function(){
-							var file			=	$('[current="current"]','#libraryTree').length>0 ? $('[current="current"]','#libraryTree').first().attr('uri') : ($('.jstree-clicked','#libraryTree').length>0 ? $('.jstree-clicked','#libraryTree').first().parents().first().attr('uri') : ($('#plid_'+current_id).attr('uri') ? $('#plid_'+current_id).attr('uri') : false));
-							if(file){
-								if($('#viewContainer').css('display')=='none'){
-									$('#buttonViewer').click();
-								}
-								var defaultStream	=	'new Current broadcast enabled input "'+file+'" output #transcode{vcodec=FLV1,vb=4096,fps=25,scale=1,acodec=mp3,ab=512,samplerate=44100,channels=2}:std{access='+$('#stream_protocol').val()+',mux=avformat{{mux=flv}},dst=0.0.0.0:'+$('#stream_port').val()+'/'+$('#stream_file').val()+'}';
-								sendVLMCmd('del Current;'+defaultStream+';control Current play');
-								$('#player').attr('href',$('#stream_protocol').val()+'://'+$('#stream_host').val()+':'+$('#stream_port').val()+'/'+$('#stream_file').val());
-								current_que			=	'stream';
-								updateStreams();
-							}
-							$(this).dialog('close');
-						},
-						"<?vlc gettext("No") ?>":function(){
-							$(this).dialog('close');
-						}
-					}
-				});
-				$('#viewContainer').animate({height: 'toggle'});
-			});
-			/* delay script loading so we won't block if we have no net access */
-			$.getScript('http://releases.flowplayer.org/js/flowplayer-3.2.6.min.js', function(data, textStatus){
-				$('#player').empty();
-				flowplayer("player", "http://releases.flowplayer.org/swf/flowplayer-3.2.7.swf");
-				/* .getScript only handles success() */
-			 });
-		//]]>
-		</script>
-	</head>
-	<body id="regular_layout">
-			<div class="centered">
-			<div id="mainContainer" class="centered">
-			<div id="controlContainer" class="ui-widget">
-				<div id="controlTable" class="ui-widget-content">
-					<ul id="controlButtons">
-						<li id="buttonPrev" class="button48  ui-corner-all" title="<?vlc gettext("Previous") ?>"></li>
-						<li id="buttonPlay" class="button48  ui-corner-all paused" title="<?vlc gettext("Play") ?>"></li>
-						<li id="buttonNext" class="button48  ui-corner-all" title="<?vlc gettext("Next") ?>"></li>
-						<li id="buttonOpen" class="button48  ui-corner-all" title="<?vlc gettext("Open Media") ?>"></li>
-						<li id="buttonStop" class="button48  ui-corner-all" title="<?vlc gettext("Stop") ?>"></li>
-						<li id="buttonFull" class="button48  ui-corner-all" title="<?vlc gettext("Full Screen") ?>"></li>
-						<li id="buttonSout" class="button48  ui-corner-all" title="<?vlc gettext("Easy Stream") ?>"></li>
-					</ul>
-					<ul id="buttonszone2" class="buttonszone">
-						<li id="buttonPlayList" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Hide / Show Library") ?>"><span class="ui-icon ui-icon-note"></span><?vlc gettext("Hide / Show Library") ?></li>
-						<li id="buttonViewer" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Hide / Show Viewer") ?>"><span class="ui-icon ui-icon-video"></span><?vlc gettext("Hide / Show Viewer") ?></li>
-						<li id="buttonStreams" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Manage Streams") ?>"><span class="ui-icon ui-icon-script"></span><?vlc gettext("Manage Streams") ?></li>
-						<li id="buttonOffsets" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Track Synchronisation") ?>"><span class="ui-icon ui-icon-transfer-e-w"></span><?vlc gettext("Track Synchronisation") ?></li>
-						<li id="buttonEqualizer" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Equalizer") ?>"><span class="ui-icon ui-icon-signal"></span><?vlc gettext("Equalizer") ?></li>
-						<li id="buttonBatch" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("VLM Batch Commands") ?>"><span class="ui-icon ui-icon-suitcase"></span><?vlc gettext("VLM Batch Commands") ?></li>
-					</ul>
-					<div id="volumesliderzone">
-						<div id="volumeSlider" title="Volume"><img src="images/speaker-32.png" class="ui-slider-handle" alt="volume"/></div>
-						<div id="currentVolume" class="dynamic">50%</div>
-					</div>
-					<div id="artszone">
-						<img id="albumArt" src="/art" width="141px" height="130px" alt="Album Art"/>
-					</div>
-					<div id="mediaTitle" class="dynamic"></div>
-					<div id="seekContainer">
-						<div id="seekSlider" title="<?vlc gettext("Seek Time") ?>"></div>
-						<div id="currentTime" class="dynamic">00:00:00</div>
-						<div id="totalTime" class="dynamic">00:00:00</div>
-					</div>
-				</div>
-			</div>
-			<div id="libraryContainer" class="ui-widget">
-				<ul id="buttonszone1" align="left" class="buttonszone ui-widget-content" style="overflow:hidden; white-space: nowrap;">
-					<li id="buttonShuffle" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Shuffle") ?>"><span class="ui-icon ui-icon-shuffle"></span><?vlc gettext("Shuffle") ?></li>
-					<li id="buttonLoop" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Loop") ?>"><span class="ui-icon ui-icon-refresh"></span><?vlc gettext("Loop") ?></li>
-					<li id="buttonRepeat" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Repeat") ?>"><span class="ui-icon ui-icon-arrowreturnthick-1-w"></span><?vlc gettext("Repeat") ?></li>
-					<li id="buttonPlEmpty" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Empty Playlist") ?>"><span class="ui-icon ui-icon-trash"></span><?vlc gettext("Empty Playlist") ?></li>
-					<li id="buttonPlAdd" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Queue Selected") ?>"><span class="ui-icon ui-icon-plus"></span><?vlc gettext("Queue Selected") ?></li>
-					<li id="buttonPlPlay" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Play Selected") ?>"><span class="ui-icon ui-icon-play"></span><?vlc gettext("Play Selected") ?></li>
-					<li id="buttonRefresh" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Refresh List") ?>"><span class="ui-icon ui-icon-arrowrefresh-1-n"></span><?vlc gettext("Refresh List") ?></li>
-				</ul>
-				<div id="libraryTree" class="ui-widget-content"></div>
-			</div>
-			<div id="viewContainer" class="ui-widget">
-				<div id="mediaViewer" class="ui-widget-content">
-					<div href="http://localhost:8081/stream.flv" style="display:block; width:100%" id="player">
-						<p><?vlc gettext("Loading flowplayer...") ?><br/><?vlc gettext("If nothing appears, check your internet connection.") ?></p>
-					</div>
-				</div>
-			</div>
-			<div class="footer">
-				VLC <?vlc print(vlc.misc.version() .. ' - Lua Web Interface - <a id="mobileintflink" href="/mobile.html">Mobile Interface</a> - ' .. vlc.misc.copyright()) ?>
-			</div>
-		</div>
-		</div>
-		<div id="windowStreamConfirm" title="Confirm Stream Settings">
-			<p>
-				<?vlc gettext("By creating a stream, the <i>Main Controls</i> will operate the stream instead of the main interface.") ?>
-				<?vlc gettext("The stream will be created using default settings, for more advanced configuration, or to modify the default settings, select the button to the right: <i>Manage Streams</i>") ?>
-				<span id="buttonStreams2" class="button ui-widget ui-state-default ui-corner-all" title="<?vlc gettext("Manage Streams") ?>"><span class="ui-icon ui-icon-script"></span></span>
-			</p>
-			<p>
-				<?vlc gettext("Once the stream is created, the <i>Media Viewer</i> window will display the stream.") ?>
-				<?vlc gettext("Volume will be controlled by the player, and not the <i>Main Controls</i>.") ?>
-			</p>
-			<p>
-				<?vlc gettext("The current playing item will be streamed. If there is no currently playing item, the first selected item from the <i>Library</i> will be the subject of the stream.") ?>
-			</p>
-			<p>
-				<?vlc gettext("To stop the stream and resume normal controls, click the <i>Open Stream</i> button again.") ?>
-			</p>
-			<p>
-				<?vlc gettext("Are you sure you wish to create the stream?") ?>
-			</p>
-		</div>
-		<?vlc
-		current_page = "index"
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="initial-scale=1">
+    <title>VLC media player - Web Interface</title>
+    <link href="favicon.ico" type="image/x-icon" rel="shortcut icon" />
+    <link rel="stylesheet" href="dist/css/vendors.min.css">
+    <link rel="stylesheet" href="dist/css/style.min.css">
+    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
+    <script src="dist/js/vendors.min.js"></script>
+    <script src="dist/js/script.min.js"></script>
+</head>
+<body>
+    <div id="app">
+        <sidenav></sidenav>
 
-		dialogs("browse_window.html","stream_window.html","create_stream.html","offset_window.html","mosaic_window.html","equalizer_window.html","batch_window.html","error_window.html");
-		?>
-	</body>
+        <playlist></playlist>
+
+        <!-- Modals -->
+        <div id="vlmModal" class="modal fade" role="dialog">
+            <vlm-modal></vlm-modal>
+        </div>
+
+        <div id="fileModal" class="modal fade" role="dialog">
+            <file-modal></file-modal>
+        </div>
+
+        <div id="equalizerModal" class="modal fade" role="dialog">
+            <equalizer-modal></equalizer-modal>
+        </div>
+
+        <div id="trackSyncModal" class="modal fade" role="dialog">
+            <track-sync-modal></track-sync-modal>
+        </div>
+
+        <div id="streamManagerModal" class="modal fade" role="dialog">
+            <stream-manager-modal></stream-manager-modal>
+        </div>
+    </div>
+
+    <div id="videoPlayer">
+            <video></video>
+    </div>
+</body>
+<!-- Templates -->
+<!-- Playlist Template -->
+<script type="text/x-template" id="playlist-template">
+    <div>
+        <div id="playlistNav" class="playlistNav">
+            <div class="container">
+                <playlist-buttons></playlist-buttons>
+                <div>
+                    <h1 class="playlistHeader">Playlist</h1>
+                </div>
+                <div id="playlist">
+                    <ol type="1">
+                        <li v-for="item in this.$parent.playlistItems">
+                            <button v-on:click="play(item.src, item.id)" class="playlistItem">{{ item.title }}</button>
+                            <button v-on:click="removeItem(item.id)" type="button" class="btn-circle col-xs">
+                                <svg-icon name="delete"></svg-icon>
+                            </button>
+                        </li>
+                    </ol>
+                </div>
+                <div class="playlistNavMobile" id="mobilePlaylistNavButton">
+                    <center><svg-icon name="format-list-bulleted"></svg-icon></center>
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
+<!-- Button Template -->
+<script type="text/x-template" id="button-template">
+    <div>
+        <div class="playlistIcons">
+            <div class="row">
+                <button type="button" class="btn-circle col-xs" id="randomButton"><svg-icon name="shuffle-variant"></svg-icon></button>
+                <button type="button" class="btn-circle col-xs" id="repeatButton"><svg-icon name="replay"></svg-icon></button>
+                <button type="button" class="btn-circle col-xs" id="playButton"><svg-icon name="play-circle-outline"></svg-icon></button>
+            </div>
+            <div class="row">
+                <button type="button" class="btn-circle col-xs" data-toggle="modal" data-target="#equalizerModal"><svg-icon name="poll"></svg-icon></button>
+                <button type="button" class="btn-circle col-xs" data-toggle="modal" data-target="#fileModal"><svg-icon name="plus"></svg-icon></button>
+            </div>
+        </div>
+    </div>
+</script>
+<!-- equalizer modal Template -->
+<script type="text/x-template" id="equalizer-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Equalizer</h4>
+                </div>
+                <div class="modal-body">
+                    <input type="range" name="equalizerInput" id="equalizerInput" min="-20" max="20" step="0.1"/>
+                    <center id="eqVal">{{ eqVal }}</center>
+                </div>
+                <div class="modal-footer">
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
+<!-- vlm modal Template -->
+<script type="text/x-template" id="vlm-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Write your VLM commands here (seperated by new line)</h4>
+                </div>
+                <div class="modal-body">
+                    <textarea id="vlmCommand"></textarea>
+                    <div id="status">
+                    status:
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" id="vlmButton" class="btn btn-default">Submit</button>
+                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
+<!-- sideNav Template -->
+<script type="text/x-template" id="sidenav-template">
+    <div>
+        <div id="sideNav" class="sideNav">
+            <a href="javascript:void(0)" class="closebtn" id="closeNavButton">
+                Menu
+            </a>
+            <a href="#" data-toggle="modal" data-target="#fileModal">
+                Open File
+            </a>
+            <a href="#">
+                Local Network
+            </a>
+            <a href="#">
+                Podcast
+            </a>
+            <a href="#" data-toggle="modal" data-target="#streamManagerModal">
+                Manage Streams
+            </a>
+            <a href="#" data-toggle="modal" data-target="#trackSyncModal">
+                Track Synchronization
+            </a>
+            <a href="#" data-toggle="modal" data-target="#vlmModal">
+                VLM Batch Commands
+            </a>
+        </div>
+        <span id="openNavButton">
+            <svg-icon name="menu"></svg-icon>
+        </span>
+    </div>
+</script>
+<!-- file modal Template -->
+<script type="text/x-template" id="file-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Select your file</h4>
+                </div>
+                <div class="modal-body" id="file-tree">
+                </div>
+                <div class="modal-footer">
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
+<!-- track-sync modal Template -->
+<script type="text/x-template" id="track-sync-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Set Track Synchronization</h4>
+                </div>
+                <div class="modal-body" id="">
+                    Playback Rate
+                    <center id="playbackVal">{{ playbackVal }}</center>
+                    <input type="range" name="playbackInput" id="playbackInput" min="-20" max="20" step="0.1"/>
+                    <br>
+                    Audio Delay
+                    <center id="audioDelayVal">{{ audioDelayVal }}</center>
+                    <input type="range" name="audioDelayInput" id="audioDelayInput" min="-20" max="20" step="0.1"/>
+                    <br>
+                    Subtitle Delay
+                    <center id="subDelayVal">{{ subDelayVal }}</center>
+                    <input type="range" name="subDelayInput" id="subDelayInput" min="-20" max="20" step="0.1"/>
+                </div>
+                <div class="modal-footer">
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
+<script type="text/x-template" id="svg-icon">
+    <svg version="1.1" :class="clazz" :viewBox="box" v-html="path" :style="style"></svg>
+</script>
+<!-- stream-manager modal Template -->
+<script type="text/x-template" id="stream-manager-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Stream Manager</h4>
+                </div>
+                <div class="modal-body">
+                </div>
+                <div class="modal-footer">
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
 </html>
diff --git a/share/lua/http/js/common.js b/share/lua/http/js/common.js
deleted file mode 100644
index d766699584..0000000000
--- a/share/lua/http/js/common.js
+++ /dev/null
@@ -1,93 +0,0 @@
-var intv = 0;
-var ccmd = "";
-var video_types = [
-           "asf", "avi", "bik", "bin", "divx", "drc", "dv", "f4v", "flv", "gxf", "iso",
-           "m1v", "m2v", "m2t", "m2ts", "m4v", "mkv", "mov",
-           "mp2", "mp4", "mpeg", "mpeg1",
-           "mpeg2", "mpeg4", "mpg", "mts", "mtv", "mxf", "mxg", "nuv",
-           "ogg", "ogm", "ogv", "ogx", "ps",
-           "rec", "rm", "rmvb", "rpl", "thp", "ts", "txd", "vob", "wmv", "xesc" ];
-var audio_types = [
-        "3ga", "a52", "aac", "ac3", "ape", "awb", "dts", "flac", "it",
-        "m4a", "m4p", "mka", "mlp", "mod", "mp1", "mp2", "mp3",
-        "oga", "ogg", "oma", "s3m", "spx", "thd", "tta",
-        "wav", "wma", "wv", "xm"
-];
-var playlist_types = [
-        "asx", "b4s", "cue", "ifo", "m3u", "m3u8", "pls", "ram", "rar",
-        "sdp", "vlc", "xspf", "zip", "conf"
-];
-
-var stream_server = window.location.hostname;
-
-function format_time(s) {
-    var hours = Math.floor(s / 3600);
-    var minutes = Math.floor((s / 60) % 60);
-    var seconds = Math.floor(s % 60);
-    hours = hours < 10 ? "0" + hours : hours;
-    minutes = minutes < 10 ? "0" + minutes : minutes;
-    seconds = seconds < 10 ? "0" + seconds : seconds;
-    return hours + ":" + minutes + ":" + seconds;
-}
-
-function toFloat(text) {
-    return parseFloat(text.replace(',', '.'));
-}
-
-function setIntv() {
-    if (intv > 0) {
-        intv++;
-        setTimeout(setIntv, 500);
-    } else {
-        intv = 0;
-    }
-    if (intv > 5) {
-        var nt = 0;
-        switch (ccmd) {
-        case 'prev':
-            nt = Math.max(0, $('#seekSlider').slider('value') - 10);
-            break;
-        case 'next':
-            nt = Math.max(0, $('#seekSlider').slider('value') + 10);
-            break;
-        }
-        switch (current_que) {
-        case 'main':
-            sendCommand({
-                'command': 'seek',
-                'val': Math.round((nt / 100) * $('#seekSlider').attr('totalLength')),
-                plreload: false
-            });
-            break;
-        case 'stream':
-            sendVLMCmd('control Current seek ' + nt);
-            break;
-        }
-    }
-}
-
-function isMobile() {
-    var a = navigator.userAgent || navigator.vendor || window.opera;
-    if (/android|avantgo|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|e\-|
 e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) {
-        return true;
-    }
-    return false;
-}
-
-function createElementLi(name, type, dir, ext) {
-    var icon = "Other-48.png";
-    if( type == "dir" && name == '..' )
-        icon = "Back-48.png";
-    else if( type == 'dir' )
-        icon = "Folder-48.png";
-    else if( $.inArray(ext, video_types) != -1 )
-        icon = "Video-48.png";
-    else if( $.inArray(ext, audio_types) != -1 )
-        icon = "Audio-48.png";
-    else if( $.inArray(ext, playlist_types) != -1 )
-        // TODO: Playlist-48.png
-        icon = "Other-48.png";
-    var open = type == "dir" ? "opendir='" + dir + "'" : (type == "file" ? "openfile='" + dir + "'" : "opendev='" + dir + "'");
-    var str = "<li class='system_icon ui-widget-content' " + open + " ><img src='images/" + icon + "' width='48px' height='48px' title='" + name + "' alt='" + name + "' style='border: none;background:none;'/><div style='font-size:10px;border:none;background:none;'>" + name + "</div></li>";
-    return str;
-}
diff --git a/share/lua/http/js/controllers.js b/share/lua/http/js/controllers.js
deleted file mode 100644
index bb40c17923..0000000000
--- a/share/lua/http/js/controllers.js
+++ /dev/null
@@ -1,529 +0,0 @@
-var currentArt = null;
-var current_que = 'main';
-var current_playlist_id = -1;
-var previous_playlist_id = -1;
-
-function updateArt(url) {
-    $('#albumArt').fadeOut(500, function () {
-        $(this).addClass('hidden').removeAttr('height').removeAttr('width').attr('src', url);
-    });
-}
-
-function updateStatus() {
-    $.ajax({
-        url: 'requests/status.xml',
-        success: function (data, status, jqXHR) {
-            if (current_que == 'main') {
-                $('.dynamic').empty();
-                $('#mediaTitle').append($('[name="filename"]', data).text());
-                $('#totalTime').append(format_time($('length', data).text()));
-                $('#currentTime').append(format_time($('time', data).text()));
-                if (!$('#seekSlider').data('clicked')) {
-                    $('#seekSlider').slider({
-                        value: toFloat($('position', data).text()) * 100
-                    });
-                }
-                $('#currentVolume').append(Math.round($('volume', data).text() / 2.56) + '%');
-                /* Don't interfere with the user's action */
-                if (!$('#volumeSlider').data('clicked')) {
-                    $('#volumeSlider').slider({
-                        value: ($('volume', data).text() / 5.12)
-                    });
-                }
-                $('#rateSlider').slider({
-                    value: ($('rate', data).text())
-                });
-                $('#currentRate').append(Math.round($('rate', data).text() * 100) / 100 + 'x');
-                $('#audioSlider').slider({
-                    value: ($('audiodelay', data).text())
-                });
-                $('#currentAudioDelay').append(Math.round($('audiodelay', data).text() * 100) / 100 + 's');
-                $('#subtitleSlider').slider({
-                    value: ($('subtitledelay', data).text())
-                });
-                $('#currentSubtitleDelay').append(Math.round($('subtitledelay', data).text() * 100) / 100 + 's');
-                $('#seekSlider').attr('totalLength', $('length', data).text());
-                $('#buttonPlay').attr('state', $('state', data).text()).attr('mrl', $('[name="filename"]', data).text());
-                if ($('state', data).text() == 'playing') {
-                    $('#buttonPlay').removeClass('paused').addClass('playing');
-                } else {
-                    $('#buttonPlay').removeClass('playing').addClass('paused');
-                }
-                if ($('random', data).text() == 'true') {
-                    $('#buttonShuffle').removeClass('ui-state-default').addClass('ui-state-active');
-                } else {
-                    $('#buttonShuffle').addClass('ui-state-default').removeClass('ui-state-active');
-                }
-                if ($('loop', data).text() == 'true') {
-                    $('#buttonLoop').removeClass('ui-state-default').addClass('ui-state-active');
-                } else {
-                    $('#buttonLoop').addClass('ui-state-default').removeClass('ui-state-active');
-                }
-                if ($('repeat', data).text() == 'true') {
-                    $('#buttonRepeat').removeClass('ui-state-default').addClass('ui-state-active');
-                } else {
-                    $('#buttonRepeat').addClass('ui-state-default').removeClass('ui-state-active');
-                }
-
-                if ($('[name="artwork_url"]', data).text() != currentArt && $('[name="artwork_url"]', data).text() != "") {
-                    var tmp = new Date();
-                    currentArt = $('[name="artwork_url"]', data).text();
-                    updateArt('/art?' + tmp.getTime());
-                } else if ($('[name="artwork_url"]', data).text() == "" && currentArt != 'images/vlc-48.png') {
-                    currentArt = 'images/vlc-48.png';
-                    updateArt(currentArt);
-                }
-
-                current_playlist_id = parseInt($('currentplid', data).text());
-                if (previous_playlist_id != current_playlist_id) {
-                    updatePlayList();
-                    previous_playlist_id = current_playlist_id;
-                }
-
-                if (pollStatus) {
-                    setTimeout(updateStatus, 1000);
-                }
-
-            }
-            $('band', data).each(function () {
-                var id = $(this).attr('id');
-                var value = $(this).text() ? $(this).text() : 0;
-                var freq = ["60 Hz","170 Hz", "310 Hz", "600 Hz", "1 kHz","3 kHz", "6 kHz", "12 kHz" , "14 kHz" , "16 kHz" ];
-                if (!$('#eq_container' + id).length) {
-                    $('#window_equalizer').append('<div style="float:left;width:44px;" align="center" id="eq_container' + id + '"><div id="eq' + id + '_txt">' + value + 'dB</div><div class="eqBand" id="eq' + id + '" style="font-size: 18px;"></div><div>' + freq[id] + '</div></div>');
-                    $('#eq' + id).slider({
-                        min: -20,
-                        max: 20,
-                        step: 0.1,
-                        range: "min",
-                        value: value,
-                        animate: true,
-                        orientation: "vertical",
-                        stop: function (event, ui) {
-                            $('#' + $(this).attr('id') + '_txt').empty().append(ui.value + 'dB');
-                            sendCommand({
-                                command: 'equalizer',
-                                val: ui.value,
-                                band: $(this).attr('id').substr(2)
-                            })
-                        },
-                        slide: function (event, ui) {
-                            $('#' + $(this).attr('id') + '_txt').empty().append(ui.value + 'dB');
-                        }
-                    });
-                } else {
-                    $('#eq' + id).slider({
-                        value: value
-                    });
-                    $('#eq' + id + '_txt').empty().append(Math.round(value * 100) / 100 + 'dB');
-                }
-            });
-            $('#preamp').slider('value', $('preamp', data).text());
-            $('#preamp_txt').empty().append(Math.round($('preamp', data).text() * 100) / 100 + 'dB');
-        },
-        error: function (jqXHR, status, error) {
-            setTimeout(updateStatus, 500);
-        }
-    });
-}
-
-function updatePlayList(force_refresh) {
-    if (force_refresh) {
-        //refresh playlist..
-        $('#libraryTree').jstree('refresh', -1);
-    } else {
-        //iterate through playlist..
-        var match = false;
-        $('.jstree-leaf').each(function(){
-            var id = $(this).attr('id');
-            if (id != null && id.substr(0,5) == 'plid_') {
-                if ( id.substr(5) == current_playlist_id ) {
-                    $(this).addClass('ui-state-highlight');
-                    $(this).attr('current', 'current');
-                    this.scrollIntoView(true);
-                    match = true;
-                } else {
-                    $(this).removeClass('ui-state-highlight');
-                    $(this).removeAttr('current');
-                }
-                if ($(this).children('a').size() > 0) {
-                    $($(this).children('a')[0]).removeClass('ui-state-active');
-                }
-            }
-    	});
-    	//local title wasn't found - refresh playlist..
-    	if (!match) updatePlayList(true);
-    }
-}
-
-function sendCommand(params, append) {
-    if (current_que == 'stream') {
-        $.ajax({
-            url: 'requests/status.xml',
-            data: params,
-            success: function (data, status, jqXHR) {
-                if (append != undefined) {
-                    eval(append);
-                }
-                updateStatus();
-            }
-        });
-    } else {
-        if (params.plreload === false) {
-            $.ajax({
-                url: 'requests/status.xml',
-                data: params,
-                success: function (data, status, jqXHR) {
-                    if (append != undefined) {
-                        eval(append);
-                    }
-                }
-            });
-        } else {
-            $.ajax({
-                url: 'requests/status.xml',
-                data: params,
-                success: function (data, status, jqXHR) {
-                    if (append != undefined) {
-                        eval(append);
-                    }
-                }
-            });
-        }
-    }
-}
-
-function browse(dir) {
-    dir = dir == undefined ? 'file://~' : dir;
-    $.ajax({
-        url: 'requests/browse.xml',
-        data: 'uri=' + encodeURIComponent(dir),
-        success: function (data, status, jqXHR) {
-            var tgt = browse_target.indexOf('__') == -1 ? browse_target : browse_target.substr(0, browse_target.indexOf('__'));
-            $('#browse_elements').empty();
-            $('element', data).each(function () {
-                var ext = $(this).attr('name').substr($(this).attr('name').lastIndexOf('.') + 1).toLowerCase();
-                if ($(this).attr('type') == 'dir' || $.inArray(ext, video_types) != -1 || $.inArray(ext, audio_types) != -1 || $.inArray(ext, playlist_types) != -1) {
-                    $('#browse_elements').append(createElementLi($(this).attr('name'), $(this).attr('type'), $(this).attr('uri'), ext));
-                }
-            });
-            $('[opendir]').dblclick(function () {
-                browse($(this).attr('opendir'));
-            });
-            $('[openfile]').dblclick(function () {
-                switch (tgt) {
-                case '#stream_input':
-                    $(browse_target).val($(this).attr('openfile'));
-                    break;
-                case '#mosaic_open':
-                    $('li', browse_target).remove();
-                    $(browse_target).append(this);
-                    $(this).css({
-                        'margin-left': -40,
-                        'margin-top': -46,
-                        'float': 'left'
-                    });
-                    break;
-                case '#mobile':
-                    break;
-                default:
-                    sendCommand('command=in_play&input=' + encodeURIComponent($(this).attr('openfile')));
-                    updatePlayList(true);
-                    break;
-                }
-                $('#window_browse').dialog('close');
-            });
-            $('[opendir]').click(function () {
-                switch (tgt) {
-                case '#mobile':
-                    browse($(this).attr('opendir'));
-                    break;
-                default:
-                    break;
-                }
-            });
-            $('[openfile]').click(function () {
-                switch (tgt) {
-                case '#mobile':
-                    sendCommand('command=in_play&input=' + encodeURIComponent($(this).attr('openfile')), "window.location='mobile.html'");
-                    break;
-                default:
-                    break;
-                }
-            });
-            switch (tgt) {
-            case '#mobile':
-                break;
-            default:
-                $('[selectable]').selectable();
-                break;
-            }
-        },
-        error: function (jqXHR, status, error) {
-            setTimeout('browse("' + dir + '")', 1041);
-        }
-    });
-}
-
-function updateStreams() {
-    $.ajax({
-        url: 'requests/vlm.xml',
-        success: function (data, status, jqXHR) {
-            $('#stream_info').accordion("destroy");
-            $('#stream_info').empty();
-            $('broadcast', data).each(function () {
-                var stream_div = $('#stream_status_').clone();
-                var name = $(this).attr('name');
-                var loop = $(this).attr('loop') == 'yes';
-                var playing = $('instance', $(this)).attr('state') == 'playing';
-                var file = $('input', $(this)).text();
-                var output = $('output', $(this)).text();
-                var time = isNaN(Math.round($('instance', $(this)).attr('time') / 1000000)) ? 0 : Math.round($('instance', $(this)).attr('time') / 1000000);
-                var length = isNaN(Math.round($('instance', $(this)).attr('length') / 1000000)) ? 0 : Math.round($('instance', $(this)).attr('length') / 1000000);
-                $('[id]', stream_div).each(function () {
-                    $(this).attr('id', $(this).attr('id') + name);
-                });
-                $(stream_div).attr('id', $(stream_div).attr('id') + name);
-                $('#stream_title_' + name, stream_div).append(name);
-                $('#stream_file_' + name, stream_div).append(file);
-                $('#stream_pos_' + name, stream_div).slider({
-                    value: 0,
-                    range: "min",
-                    min: 0,
-                    slide: function (event, ui) {
-                        $("#stream_current_time_" + name, stream_div).empty();
-                        $("#stream_current_time_" + name, stream_div).append(format_time(ui.value));
-                        $("#stream_total_time_" + name, stream_div).empty();
-                        $("#stream_total_time_" + name, stream_div).append(format_time($('#stream_pos_' + name, stream_div).slider('option', 'max')));
-                        sendVLMCmd('control ' + name + ' seek ' + Math.round(ui.value / $('#stream_pos_' + name, stream_div).slider('option', 'max') * 100));
-                    },
-                    change: function (event, ui) {
-                        $("#stream_current_time_" + name, stream_div).empty();
-                        $("#stream_current_time_" + name, stream_div).append(format_time(ui.value));
-                        $("#stream_total_time_" + name, stream_div).empty();
-                        $("#stream_total_time_" + name, stream_div).append(format_time($('#stream_pos_' + name, stream_div).slider('option', 'max')));
-                    }
-                });
-                $('#button_stream_stop_' + name, stream_div).click(function () {
-                    sendVLMCmd('control ' + name + ' stop');
-                    return false;
-                });
-                $('#button_stream_play_' + name, stream_div).click(function () {
-                    if ($('span', this).hasClass('ui-icon-pause')) {
-                        sendVLMCmd('control ' + name + ' pause');
-                    } else {
-                        sendVLMCmd('control ' + name + ' play');
-                    }
-                });
-                $('#button_stream_loop_' + name, stream_div).click(function () {
-                    if (loop) {
-                        sendVLMCmd('setup ' + name + ' unloop');
-                    } else {
-                        sendVLMCmd('setup ' + name + ' loop');
-                    }
-                });
-                $('#button_stream_delete_' + name, stream_div).click(function () {
-                    sendVLMCmd('del ' + name);
-                });
-                $('#stream_pos_' + name, stream_div).slider({
-                    max: length,
-                    value: time
-                });
-                if (playing) {
-                    $('span', $('#button_stream_play_' + name, stream_div)).removeClass('ui-icon-play');
-                    $('span', $('#button_stream_play_' + name, stream_div)).addClass('ui-icon-pause');
-                }
-                if (loop) {
-                    $('#button_stream_loop_' + name, stream_div).addClass('ui-state-active');
-                }
-                $(stream_div).css({
-                    'visibility': '',
-                    'display': ''
-                });
-                $('#stream_info').append(stream_div);
-
-            });
-            $('.button').hover(
-
-            function () {
-                $(this).addClass('ui-state-hover');
-            }, function () {
-                $(this).removeClass('ui-state-hover');
-            });
-            $('#stream_info').accordion({
-                header: "h3",
-                collapsible: true,
-                autoHeight: true
-            });
-            if (current_que == 'stream') {
-                $('.dynamic').empty();
-                $('#mediaTitle').append($('[name="Current"] input', data).text());
-                $('#totalTime').append(format_time(isNaN($('[name="Current"] instance', data).attr('length')) ? 0 : $('[name="Current"] instance', data).attr('length') / 1000000));
-                $('#currentTime').append(format_time(isNaN($('[name="Current"] instance', data).attr('time')) ? 0 : $('[name="Current"] instance', data).attr('time') / 1000000));
-                $('#seekSlider').slider({
-                    value: (($('[name="Current"] instance', data).attr('time') / 1000000) / ($('[name="Current"] instance', data).attr('length') / 1000000) * 100)
-                });
-                $('#seekSlider').attr('totalLength', $('[name="Current"] instance', data).attr('length') / 1000000);
-                $('#buttonPlay').attr('state', $('[name="Current"] instance', data).length > 0 ? $('[name="Current"] instance', data).attr('state') : 'stopped');
-                if ($('[name="Current"] instance', data).attr('state') == 'playing') {
-                    $('#buttonPlay').removeClass('paused');
-                    $('#buttonPlay').addClass('playing');
-                } else {
-                    $('#buttonPlay').removeClass('playing');
-                    $('#buttonPlay').addClass('paused');
-                }
-                setTimeout(updateStreams, 1000);
-            }
-        }
-    });
-}
-
-function updateEQ() {
-    $.ajax({
-        url: 'requests/status.xml',
-        success: function (data, status, jqXHR) {
-            $('band', data).each(function () {
-                var freq = ["60 Hz","170 Hz", "310 Hz", "600 Hz", "1 kHz","3 kHz", "6 kHz", "12 kHz" , "14 kHz" , "16 kHz" ];
-                var id = $(this).attr('id');
-                var value = $(this).text() ? $(this).text() : 0;
-                if (!$('#eq_container' + id).length) {
-                    $('#window_equalizer').append('<div style="float:left;width:44px;" align="center" id="eq_container' + id + '"><div id="eq' + id + '_txt">' + value + 'dB</div><div class="eqBand" id="eq' + id + '" style="font-size: 18px;"></div><div>' + freq[id] + '</div></div>');
-                    $('#eq' + id).slider({
-                        min: -20,
-                        max: 20,
-                        step: 0.1,
-                        range: "min",
-                        value: value,
-                        animate: true,
-                        orientation: "vertical",
-                        stop: function (event, ui) {
-                            $('#' + $(this).attr('id') + '_txt').empty().append(ui.value + 'dB');
-                            sendEQCmd({
-                                command: 'equalizer',
-                                val: ui.value,
-                                band: $(this).attr('id').substr(2)
-                            })
-                        },
-                        slide: function (event, ui) {
-                            $('#' + $(this).attr('id') + '_txt').empty().append(ui.value + 'dB');
-                        }
-                    });
-                } else {
-                    $('#eq' + id).slider({
-                        value: value
-                    });
-                    $('#eq' + id + '_txt').empty().append(Math.round(value * 100) / 100 + 'dB');
-                }
-            });
-            $('#preamp').slider('value', $('preamp', data).text());
-            $('#preamp_txt').empty().append(Math.round($('preamp', data).text() * 100) / 100 + 'dB');
-        }
-    })
-}
-
-function sendVLMCmd(command, append) {
-    var commands = command.split(';');
-    if (commands.length > 1) {
-        sendBatchVLMCmd(command, append);
-    } else {
-        if (current_que == 'main') {
-            $.ajax({
-                url: 'requests/vlm_cmd.xml',
-                data: 'command=' + encodeURIComponent(command),
-                success: function (data, status, jqXHR) {
-                    if ($('error', data).text()) {
-                        $('#error_container').append('<div>' + $('error', data).text() + '</div>');
-                        $('#window_error').dialog('open');
-                    }
-                    if (append != undefined) {
-                        eval(append);
-                    }
-                    updateStreams();
-                }
-            });
-        } else {
-            $.ajax({
-                url: 'requests/vlm_cmd.xml',
-                data: 'command=' + encodeURIComponent(command),
-                success: function (data, status, jqXHR) {
-                    if ($('error', data).text()) {
-                        $('#error_container').append('<div>' + $('error', data).text() + '</div>');
-                        $('#window_error').dialog('open');
-                    }
-                    updateStreams();
-                }
-            });
-        }
-    }
-}
-
-function sendBatchVLMCmd(command, append) {
-    var commands = command.split(';');
-    $.ajax({
-        url: 'requests/vlm_cmd.xml',
-        data: 'command=' + encodeURIComponent(commands.shift()),
-        success: function (data, status, jqXHR) {
-            if ($('error', data).text()) {
-                $('#error_container').append('<div>' + $('error', data).text() + '</div>');
-                $('#window_error').dialog('open');
-            }
-            sendVLMCmd(commands.join(';'), append);
-        }
-    });
-}
-
-function sendEQCmd(params) {
-    $.ajax({
-        url: 'requests/status.xml',
-        data: params,
-        success: function (data, status, jqXHR) {
-            updateEQ();
-        }
-    });
-}
-
-$(function () {
-    $('#albumArt').load(function () {
-        var width = $(this).width();
-        var height = $(this).height();
-        var max = Math.max(width, height);
-        if (max > 150) {
-            var ratio = 150 / max;
-            width = Math.floor(width * ratio);
-            height = Math.floor(height * ratio);
-        }
-        $(this).attr('width', width).attr('height', height).css('margin-left', Math.floor((150 - width) / 2)).css('margin-top', Math.floor((150 - height) / 2)).removeClass('hidden').fadeIn();
-    });
-    $('#libraryTree').jstree({
-        "xml_data": {
-            "ajax": {
-                "url": "requests/playlist_jstree.xml"
-            },
-            "xsl": "nest"
-        },
-        "themeroller": {
-            "item_leaf": "ui-icon-video"
-        },
-        "core": {
-            "initially_open": ["plid_1", "plid_2", "plid_3"]
-        },
-        "plugins": ["xml_data", "ui", "themeroller"]
-    }).bind("loaded.jstree", function (event, data) {
-        $('[current]', '[id^="plid_"]').each(function () {
-            $(this).addClass('ui-state-highlight');
-            current_playlist_id = $(this).attr('id').substr(5);
-        });
-    }).bind("refresh.jstree", function (event, data) {
-        $('[current]', '[id^="plid_"]').each(function () {
-            $(this).addClass('ui-state-highlight');
-            current_playlist_id = $(this).attr('id').substr(5);
-        });
-    }).delegate("li.jstree-leaf a", "click", function (event, data) {
-        event.preventDefault();
-        current_playlist_id = $(this).parent().attr('id').substr(5);
-        sendCommand('command=pl_play&id=' + current_playlist_id);
-    });
-    updateStatus();
-    updateStreams();
-    updateEQ();
-});
diff --git a/share/lua/http/js/jquery.jstree.js b/share/lua/http/js/jquery.jstree.js
deleted file mode 100644
index a47e949c65..0000000000
--- a/share/lua/http/js/jquery.jstree.js
+++ /dev/null
@@ -1,4544 +0,0 @@
-/*
- * jsTree 1.0-rc3
- * http://jstree.com/
- *
- * Copyright (c) 2010 Ivan Bozhanov (vakata.com)
- *
- * Licensed same as jquery - under the terms of either the MIT License or the GPL Version 2 License
- *   http://www.opensource.org/licenses/mit-license.php
- *   http://www.gnu.org/licenses/gpl.html
- *
- * $Date: 2011-02-09 01:17:14 +0200 (ср, 09 февр 2011) $
- * $Revision: 236 $
- */
-
-/*jslint browser: true, onevar: true, undef: true, bitwise: true, strict: true */
-/*global window : false, clearInterval: false, clearTimeout: false, document: false, setInterval: false, setTimeout: false, jQuery: false, navigator: false, XSLTProcessor: false, DOMParser: false, XMLSerializer: false*/
-
-"use strict";
-
-// top wrapper to prevent multiple inclusion (is this OK?)
-(function () { if(jQuery && jQuery.jstree) { return; }
-	var is_ie6 = false, is_ie7 = false, is_ff2 = false;
-
-/* 
- * jsTree core
- */
-(function ($) {
-	// Common functions not related to jsTree 
-	// decided to move them to a `vakata` "namespace"
-	$.vakata = {};
-	// CSS related functions
-	$.vakata.css = {
-		get_css : function(rule_name, delete_flag, sheet) {
-			rule_name = rule_name.toLowerCase();
-			var css_rules = sheet.cssRules || sheet.rules,
-				j = 0;
-			do {
-				if(css_rules.length && j > css_rules.length + 5) { return false; }
-				if(css_rules[j].selectorText && css_rules[j].selectorText.toLowerCase() == rule_name) {
-					if(delete_flag === true) {
-						if(sheet.removeRule) { sheet.removeRule(j); }
-						if(sheet.deleteRule) { sheet.deleteRule(j); }
-						return true;
-					}
-					else { return css_rules[j]; }
-				}
-			}
-			while (css_rules[++j]);
-			return false;
-		},
-		add_css : function(rule_name, sheet) {
-			if($.jstree.css.get_css(rule_name, false, sheet)) { return false; }
-			if(sheet.insertRule) { sheet.insertRule(rule_name + ' { }', 0); } else { sheet.addRule(rule_name, null, 0); }
-			return $.vakata.css.get_css(rule_name);
-		},
-		remove_css : function(rule_name, sheet) { 
-			return $.vakata.css.get_css(rule_name, true, sheet); 
-		},
-		add_sheet : function(opts) {
-			var tmp = false, is_new = true;
-			if(opts.str) {
-				if(opts.title) { tmp = $("style[id='" + opts.title + "-stylesheet']")[0]; }
-				if(tmp) { is_new = false; }
-				else {
-					tmp = document.createElement("style");
-					tmp.setAttribute('type',"text/css");
-					if(opts.title) { tmp.setAttribute("id", opts.title + "-stylesheet"); }
-				}
-				if(tmp.styleSheet) {
-					if(is_new) { 
-						document.getElementsByTagName("head")[0].appendChild(tmp); 
-						tmp.styleSheet.cssText = opts.str; 
-					}
-					else {
-						tmp.styleSheet.cssText = tmp.styleSheet.cssText + " " + opts.str; 
-					}
-				}
-				else {
-					tmp.appendChild(document.createTextNode(opts.str));
-					document.getElementsByTagName("head")[0].appendChild(tmp);
-				}
-				return tmp.sheet || tmp.styleSheet;
-			}
-			if(opts.url) {
-				if(document.createStyleSheet) {
-					try { tmp = document.createStyleSheet(opts.url); } catch (e) { }
-				}
-				else {
-					tmp			= document.createElement('link');
-					tmp.rel		= 'stylesheet';
-					tmp.type	= 'text/css';
-					tmp.media	= "all";
-					tmp.href	= opts.url;
-					document.getElementsByTagName("head")[0].appendChild(tmp);
-					return tmp.styleSheet;
-				}
-			}
-		}
-	};
-
-	// private variables 
-	var instances = [],			// instance array (used by $.jstree.reference/create/focused)
-		focused_instance = -1,	// the index in the instance array of the currently focused instance
-		plugins = {},			// list of included plugins
-		prepared_move = {};		// for the move_node function
-
-	// jQuery plugin wrapper (thanks to jquery UI widget function)
-	$.fn.jstree = function (settings) {
-		var isMethodCall = (typeof settings == 'string'), // is this a method call like $().jstree("open_node")
-			args = Array.prototype.slice.call(arguments, 1), 
-			returnValue = this;
-
-		// if a method call execute the method on all selected instances
-		if(isMethodCall) {
-			if(settings.substring(0, 1) == '_') { return returnValue; }
-			this.each(function() {
-				var instance = instances[$.data(this, "jstree-instance-id")],
-					methodValue = (instance && $.isFunction(instance[settings])) ? instance[settings].apply(instance, args) : instance;
-					if(typeof methodValue !== "undefined" && (settings.indexOf("is_") === 0 || (methodValue !== true && methodValue !== false))) { returnValue = methodValue; return false; }
-			});
-		}
-		else {
-			this.each(function() {
-				// extend settings and allow for multiple hashes and $.data
-				var instance_id = $.data(this, "jstree-instance-id"),
-					a = [],
-					b = settings ? $.extend({}, true, settings) : {},
-					c = $(this), 
-					s = false, 
-					t = [];
-				a = a.concat(args);
-				if(c.data("jstree")) { a.push(c.data("jstree")); }
-				b = a.length ? $.extend.apply(null, [true, b].concat(a)) : b;
-
-				// if an instance already exists, destroy it first
-				if(typeof instance_id !== "undefined" && instances[instance_id]) { instances[instance_id].destroy(); }
-				// push a new empty object to the instances array
-				instance_id = parseInt(instances.push({}),10) - 1;
-				// store the jstree instance id to the container element
-				$.data(this, "jstree-instance-id", instance_id);
-				// clean up all plugins
-				b.plugins = $.isArray(b.plugins) ? b.plugins : $.jstree.defaults.plugins.slice();
-				b.plugins.unshift("core");
-				// only unique plugins
-				b.plugins = b.plugins.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
-
-				// extend defaults with passed data
-				s = $.extend(true, {}, $.jstree.defaults, b);
-				s.plugins = b.plugins;
-				$.each(plugins, function (i, val) { 
-					if($.inArray(i, s.plugins) === -1) { s[i] = null; delete s[i]; } 
-					else { t.push(i); }
-				});
-				s.plugins = t;
-
-				// push the new object to the instances array (at the same time set the default classes to the container) and init
-				instances[instance_id] = new $.jstree._instance(instance_id, $(this).addClass("jstree jstree-" + instance_id), s); 
-				// init all activated plugins for this instance
-				$.each(instances[instance_id]._get_settings().plugins, function (i, val) { instances[instance_id].data[val] = {}; });
-				$.each(instances[instance_id]._get_settings().plugins, function (i, val) { if(plugins[val]) { plugins[val].__init.apply(instances[instance_id]); } });
-				// initialize the instance
-				setTimeout(function() { instances[instance_id].init(); }, 0);
-			});
-		}
-		// return the jquery selection (or if it was a method call that returned a value - the returned value)
-		return returnValue;
-	};
-	// object to store exposed functions and objects
-	$.jstree = {
-		defaults : {
-			plugins : []
-		},
-		_focused : function () { return instances[focused_instance] || null; },
-		_reference : function (needle) { 
-			// get by instance id
-			if(instances[needle]) { return instances[needle]; }
-			// get by DOM (if still no luck - return null
-			var o = $(needle); 
-			if(!o.length && typeof needle === "string") { o = $("#" + needle); }
-			if(!o.length) { return null; }
-			return instances[o.closest(".jstree").data("jstree-instance-id")] || null; 
-		},
-		_instance : function (index, container, settings) { 
-			// for plugins to store data in
-			this.data = { core : {} };
-			this.get_settings	= function () { return $.extend(true, {}, settings); };
-			this._get_settings	= function () { return settings; };
-			this.get_index		= function () { return index; };
-			this.get_container	= function () { return container; };
-			this.get_container_ul = function () { return container.children("ul:eq(0)"); };
-			this._set_settings	= function (s) { 
-				settings = $.extend(true, {}, settings, s);
-			};
-		},
-		_fn : { },
-		plugin : function (pname, pdata) {
-			pdata = $.extend({}, {
-				__init		: $.noop, 
-				__destroy	: $.noop,
-				_fn			: {},
-				defaults	: false
-			}, pdata);
-			plugins[pname] = pdata;
-
-			$.jstree.defaults[pname] = pdata.defaults;
-			$.each(pdata._fn, function (i, val) {
-				val.plugin		= pname;
-				val.old			= $.jstree._fn[i];
-				$.jstree._fn[i] = function () {
-					var rslt,
-						func = val,
-						args = Array.prototype.slice.call(arguments),
-						evnt = new $.Event("before.jstree"),
-						rlbk = false;
-
-					if(this.data.core.locked === true && i !== "unlock" && i !== "is_locked") { return; }
-
-					// Check if function belongs to the included plugins of this instance
-					do {
-						if(func && func.plugin && $.inArray(func.plugin, this._get_settings().plugins) !== -1) { break; }
-						func = func.old;
-					} while(func);
-					if(!func) { return; }
-
-					// context and function to trigger events, then finally call the function
-					if(i.indexOf("_") === 0) {
-						rslt = func.apply(this, args);
-					}
-					else {
-						rslt = this.get_container().triggerHandler(evnt, { "func" : i, "inst" : this, "args" : args, "plugin" : func.plugin });
-						if(rslt === false) { return; }
-						if(typeof rslt !== "undefined") { args = rslt; }
-
-						rslt = func.apply(
-							$.extend({}, this, { 
-								__callback : function (data) { 
-									this.get_container().triggerHandler( i + '.jstree', { "inst" : this, "args" : args, "rslt" : data, "rlbk" : rlbk });
-								},
-								__rollback : function () { 
-									rlbk = this.get_rollback();
-									return rlbk;
-								},
-								__call_old : function (replace_arguments) {
-									return func.old.apply(this, (replace_arguments ? Array.prototype.slice.call(arguments, 1) : args ) );
-								}
-							}), args);
-					}
-
-					// return the result
-					return rslt;
-				};
-				$.jstree._fn[i].old = val.old;
-				$.jstree._fn[i].plugin = pname;
-			});
-		},
-		rollback : function (rb) {
-			if(rb) {
-				if(!$.isArray(rb)) { rb = [ rb ]; }
-				$.each(rb, function (i, val) {
-					instances[val.i].set_rollback(val.h, val.d);
-				});
-			}
-		}
-	};
-	// set the prototype for all instances
-	$.jstree._fn = $.jstree._instance.prototype = {};
-
-	// load the css when DOM is ready
-	$(function() {
-		// code is copied from jQuery ($.browser is deprecated + there is a bug in IE)
-		var u = navigator.userAgent.toLowerCase(),
-			v = (u.match( /.+?(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
-			css_string = '' + 
-				'.jstree ul, .jstree li { display:block; margin:0 0 0 0; padding:0 0 0 0; list-style-type:none; } ' + 
-				'.jstree li { display:block; min-height:18px; line-height:18px; white-space:nowrap; margin-left:18px; min-width:18px; } ' + 
-				'.jstree-rtl li { margin-left:0; margin-right:18px; } ' + 
-				'.jstree > ul > li { margin-left:0px; } ' + 
-				'.jstree-rtl > ul > li { margin-right:0px; } ' + 
-				'.jstree ins { display:inline-block; text-decoration:none; width:18px; height:18px; margin:0 0 0 0; padding:0; } ' + 
-				'.jstree a { display:inline-block; line-height:16px; height:16px; color:black; white-space:nowrap; text-decoration:none; padding:1px 2px; margin:0; } ' + 
-				'.jstree a:focus { outline: none; } ' + 
-				'.jstree a > ins { height:16px; width:16px; } ' + 
-				'.jstree a > .jstree-icon { margin-right:3px; } ' + 
-				'.jstree-rtl a > .jstree-icon { margin-left:3px; margin-right:0; } ' + 
-				'li.jstree-open > ul { display:block; } ' + 
-				'li.jstree-closed > ul { display:none; } ';
-		// Correct IE 6 (does not support the > CSS selector)
-		if(/msie/.test(u) && parseInt(v, 10) == 6) { 
-			is_ie6 = true;
-
-			// fix image flicker and lack of caching
-			try {
-				document.execCommand("BackgroundImageCache", false, true);
-			} catch (err) { }
-
-			css_string += '' + 
-				'.jstree li { height:18px; margin-left:0; margin-right:0; } ' + 
-				'.jstree li li { margin-left:18px; } ' + 
-				'.jstree-rtl li li { margin-left:0px; margin-right:18px; } ' + 
-				'li.jstree-open ul { display:block; } ' + 
-				'li.jstree-closed ul { display:none !important; } ' + 
-				'.jstree li a { display:inline; border-width:0 !important; padding:0px 2px !important; } ' + 
-				'.jstree li a ins { height:16px; width:16px; margin-right:3px; } ' + 
-				'.jstree-rtl li a ins { margin-right:0px; margin-left:3px; } ';
-		}
-		// Correct IE 7 (shifts anchor nodes onhover)
-		if(/msie/.test(u) && parseInt(v, 10) == 7) { 
-			is_ie7 = true;
-			css_string += '.jstree li a { border-width:0 !important; padding:0px 2px !important; } ';
-		}
-		// correct ff2 lack of display:inline-block
-		if(!/compatible/.test(u) && /mozilla/.test(u) && parseFloat(v, 10) < 1.9) {
-			is_ff2 = true;
-			css_string += '' + 
-				'.jstree ins { display:-moz-inline-box; } ' + 
-				'.jstree li { line-height:12px; } ' + // WHY??
-				'.jstree a { display:-moz-inline-box; } ' + 
-				'.jstree .jstree-no-icons .jstree-checkbox { display:-moz-inline-stack !important; } ';
-				/* this shouldn't be here as it is theme specific */
-		}
-		// the default stylesheet
-		$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-	});
-
-	// core functions (open, close, create, update, delete)
-	$.jstree.plugin("core", {
-		__init : function () {
-			this.data.core.locked = false;
-			this.data.core.to_open = this.get_settings().core.initially_open;
-			this.data.core.to_load = this.get_settings().core.initially_load;
-		},
-		defaults : { 
-			html_titles	: false,
-			animation	: 500,
-			initially_open : [],
-			initially_load : [],
-			open_parents : true,
-			notify_plugins : true,
-			rtl			: false,
-			load_open	: false,
-			strings		: {
-				loading		: "Loading ...",
-				new_node	: "New node",
-				multiple_selection : "Multiple selection"
-			}
-		},
-		_fn : { 
-			init	: function () { 
-				this.set_focus(); 
-				if(this._get_settings().core.rtl) {
-					this.get_container().addClass("jstree-rtl").css("direction", "rtl");
-				}
-				this.get_container().html("<ul><li class='jstree-last jstree-leaf'><ins> </ins><a class='jstree-loading' href='#'><ins class='jstree-icon'> </ins>" + this._get_string("loading") + "</a></li></ul>");
-				this.data.core.li_height = this.get_container_ul().find("li.jstree-closed, li.jstree-leaf").eq(0).height() || 18;
-
-				this.get_container()
-					.delegate("li > ins", "click.jstree", $.proxy(function (event) {
-							var trgt = $(event.target);
-							if(trgt.is("ins") && event.pageY - trgt.offset().top < this.data.core.li_height) { this.toggle_node(trgt); }
-						}, this))
-					.bind("mousedown.jstree", $.proxy(function () { 
-							this.set_focus(); // This used to be setTimeout(set_focus,0) - why?
-						}, this))
-					.bind("dblclick.jstree", function (event) { 
-						var sel;
-						if(document.selection && document.selection.empty) { document.selection.empty(); }
-						else {
-							if(window.getSelection) {
-								sel = window.getSelection();
-								try { 
-									sel.removeAllRanges();
-									sel.collapse();
-								} catch (err) { }
-							}
-						}
-					});
-				if(this._get_settings().core.notify_plugins) {
-					this.get_container()
-						.bind("load_node.jstree", $.proxy(function (e, data) { 
-								var o = this._get_node(data.rslt.obj),
-									t = this;
-								if(o === -1) { o = this.get_container_ul(); }
-								if(!o.length) { return; }
-								o.find("li").each(function () {
-									var th = $(this);
-									if(th.data("jstree")) {
-										$.each(th.data("jstree"), function (plugin, values) {
-											if(t.data[plugin] && $.isFunction(t["_" + plugin + "_notify"])) {
-												t["_" + plugin + "_notify"].call(t, th, values);
-											}
-										});
-									}
-								});
-							}, this));
-				}
-				if(this._get_settings().core.load_open) {
-					this.get_container()
-						.bind("load_node.jstree", $.proxy(function (e, data) { 
-								var o = this._get_node(data.rslt.obj),
-									t = this;
-								if(o === -1) { o = this.get_container_ul(); }
-								if(!o.length) { return; }
-								o.find("li.jstree-open:not(:has(ul))").each(function () {
-									t.load_node(this, $.noop, $.noop);
-								});
-							}, this));
-				}
-				this.__callback();
-				this.load_node(-1, function () { this.loaded(); this.reload_nodes(); });
-			},
-			destroy	: function () { 
-				var i,
-					n = this.get_index(),
-					s = this._get_settings(),
-					_this = this;
-
-				$.each(s.plugins, function (i, val) {
-					try { plugins[val].__destroy.apply(_this); } catch(err) { }
-				});
-				this.__callback();
-				// set focus to another instance if this one is focused
-				if(this.is_focused()) { 
-					for(i in instances) { 
-						if(instances.hasOwnProperty(i) && i != n) { 
-							instances[i].set_focus(); 
-							break; 
-						} 
-					}
-				}
-				// if no other instance found
-				if(n === focused_instance) { focused_instance = -1; }
-				// remove all traces of jstree in the DOM (only the ones set using jstree*) and cleans all events
-				this.get_container()
-					.unbind(".jstree")
-					.undelegate(".jstree")
-					.removeData("jstree-instance-id")
-					.find("[class^='jstree']")
-						.andSelf()
-						.attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); });
-				$(document)
-					.unbind(".jstree-" + n)
-					.undelegate(".jstree-" + n);
-				// remove the actual data
-				instances[n] = null;
-				delete instances[n];
-			},
-
-			_core_notify : function (n, data) {
-				if(data.opened) {
-					this.open_node(n, false, true);
-				}
-			},
-
-			lock : function () {
-				this.data.core.locked = true;
-				this.get_container().children("ul").addClass("jstree-locked").css("opacity","0.7");
-				this.__callback({});
-			},
-			unlock : function () {
-				this.data.core.locked = false;
-				this.get_container().children("ul").removeClass("jstree-locked").css("opacity","1");
-				this.__callback({});
-			},
-			is_locked : function () { return this.data.core.locked; },
-			save_opened : function () {
-				var _this = this;
-				this.data.core.to_open = [];
-				this.get_container_ul().find("li.jstree-open").each(function () { 
-					if(this.id) { _this.data.core.to_open.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); }
-				});
-				this.__callback(_this.data.core.to_open);
-			},
-			save_loaded : function () { },
-			reload_nodes : function (is_callback) {
-				var _this = this,
-					done = true,
-					current = [],
-					remaining = [];
-				if(!is_callback) { 
-					this.data.core.reopen = false; 
-					this.data.core.refreshing = true; 
-					this.data.core.to_open = $.map($.makeArray(this.data.core.to_open), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
-					this.data.core.to_load = $.map($.makeArray(this.data.core.to_load), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
-					if(this.data.core.to_open.length) {
-						this.data.core.to_load = this.data.core.to_load.concat(this.data.core.to_open);
-					}
-				}
-				if(this.data.core.to_load.length) {
-					$.each(this.data.core.to_load, function (i, val) {
-						if(val == "#") { return true; }
-						if($(val).length) { current.push(val); }
-						else { remaining.push(val); }
-					});
-					if(current.length) {
-						this.data.core.to_load = remaining;
-						$.each(current, function (i, val) { 
-							if(!_this._is_loaded(val)) {
-								_this.load_node(val, function () { _this.reload_nodes(true); }, function () { _this.reload_nodes(true); });
-								done = false;
-							}
-						});
-					}
-				}
-				if(this.data.core.to_open.length) {
-					$.each(this.data.core.to_open, function (i, val) {
-						_this.open_node(val, false, true); 
-					});
-				}
-				if(done) { 
-					// TODO: find a more elegant approach to synchronizing returning requests
-					if(this.data.core.reopen) { clearTimeout(this.data.core.reopen); }
-					this.data.core.reopen = setTimeout(function () { _this.__callback({}, _this); }, 50);
-					this.data.core.refreshing = false;
-					this.reopen();
-				}
-			},
-			reopen : function () {
-				var _this = this;
-				if(this.data.core.to_open.length) {
-					$.each(this.data.core.to_open, function (i, val) {
-						_this.open_node(val, false, true); 
-					});
-				}
-				this.__callback({});
-			},
-			refresh : function (obj) {
-				var _this = this;
-				this.save_opened();
-				if(!obj) { obj = -1; }
-				obj = this._get_node(obj);
-				if(!obj) { obj = -1; }
-				if(obj !== -1) { obj.children("UL").remove(); }
-				else { this.get_container_ul().empty(); }
-				this.load_node(obj, function () { _this.__callback({ "obj" : obj}); _this.reload_nodes(); });
-			},
-			// Dummy function to fire after the first load (so that there is a jstree.loaded event)
-			loaded	: function () { 
-				this.__callback(); 
-			},
-			// deal with focus
-			set_focus	: function () { 
-				if(this.is_focused()) { return; }
-				var f = $.jstree._focused();
-				if(f) { f.unset_focus(); }
-
-				this.get_container().addClass("jstree-focused"); 
-				focused_instance = this.get_index(); 
-				this.__callback();
-			},
-			is_focused	: function () { 
-				return focused_instance == this.get_index(); 
-			},
-			unset_focus	: function () {
-				if(this.is_focused()) {
-					this.get_container().removeClass("jstree-focused"); 
-					focused_instance = -1; 
-				}
-				this.__callback();
-			},
-
-			// traverse
-			_get_node		: function (obj) { 
-				var $obj = $(obj, this.get_container()); 
-				if($obj.is(".jstree") || obj == -1) { return -1; } 
-				$obj = $obj.closest("li", this.get_container()); 
-				return $obj.length ? $obj : false; 
-			},
-			_get_next		: function (obj, strict) {
-				obj = this._get_node(obj);
-				if(obj === -1) { return this.get_container().find("> ul > li:first-child"); }
-				if(!obj.length) { return false; }
-				if(strict) { return (obj.nextAll("li").size() > 0) ? obj.nextAll("li:eq(0)") : false; }
-
-				if(obj.hasClass("jstree-open")) { return obj.find("li:eq(0)"); }
-				else if(obj.nextAll("li").size() > 0) { return obj.nextAll("li:eq(0)"); }
-				else { return obj.parentsUntil(".jstree","li").next("li").eq(0); }
-			},
-			_get_prev		: function (obj, strict) {
-				obj = this._get_node(obj);
-				if(obj === -1) { return this.get_container().find("> ul > li:last-child"); }
-				if(!obj.length) { return false; }
-				if(strict) { return (obj.prevAll("li").length > 0) ? obj.prevAll("li:eq(0)") : false; }
-
-				if(obj.prev("li").length) {
-					obj = obj.prev("li").eq(0);
-					while(obj.hasClass("jstree-open")) { obj = obj.children("ul:eq(0)").children("li:last"); }
-					return obj;
-				}
-				else { var o = obj.parentsUntil(".jstree","li:eq(0)"); return o.length ? o : false; }
-			},
-			_get_parent		: function (obj) {
-				obj = this._get_node(obj);
-				if(obj == -1 || !obj.length) { return false; }
-				var o = obj.parentsUntil(".jstree", "li:eq(0)");
-				return o.length ? o : -1;
-			},
-			_get_children	: function (obj) {
-				obj = this._get_node(obj);
-				if(obj === -1) { return this.get_container().children("ul:eq(0)").children("li"); }
-				if(!obj.length) { return false; }
-				return obj.children("ul:eq(0)").children("li");
-			},
-			get_path		: function (obj, id_mode) {
-				var p = [],
-					_this = this;
-				obj = this._get_node(obj);
-				if(obj === -1 || !obj || !obj.length) { return false; }
-				obj.parentsUntil(".jstree", "li").each(function () {
-					p.push( id_mode ? this.id : _this.get_text(this) );
-				});
-				p.reverse();
-				p.push( id_mode ? obj.attr("id") : this.get_text(obj) );
-				return p;
-			},
-
-			// string functions
-			_get_string : function (key) {
-				return this._get_settings().core.strings[key] || key;
-			},
-
-			is_open		: function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-open"); },
-			is_closed	: function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-closed"); },
-			is_leaf		: function (obj) { obj = this._get_node(obj); return obj && obj !== -1 && obj.hasClass("jstree-leaf"); },
-			correct_state	: function (obj) {
-				obj = this._get_node(obj);
-				if(!obj || obj === -1) { return false; }
-				obj.removeClass("jstree-closed jstree-open").addClass("jstree-leaf").children("ul").remove();
-				this.__callback({ "obj" : obj });
-			},
-			// open/close
-			open_node	: function (obj, callback, skip_animation) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				if(!obj.hasClass("jstree-closed")) { if(callback) { callback.call(); } return false; }
-				var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
-					t = this;
-				if(!this._is_loaded(obj)) {
-					obj.children("a").addClass("jstree-loading");
-					this.load_node(obj, function () { t.open_node(obj, callback, skip_animation); }, callback);
-				}
-				else {
-					if(this._get_settings().core.open_parents) {
-						obj.parentsUntil(".jstree",".jstree-closed").each(function () {
-							t.open_node(this, false, true);
-						});
-					}
-					if(s) { obj.children("ul").css("display","none"); }
-					obj.removeClass("jstree-closed").addClass("jstree-open").children("a").removeClass("jstree-loading");
-					if(s) { obj.children("ul").stop(true, true).slideDown(s, function () { this.style.display = ""; t.after_open(obj); }); }
-					else { t.after_open(obj); }
-					this.__callback({ "obj" : obj });
-					if(callback) { callback.call(); }
-				}
-			},
-			after_open	: function (obj) { this.__callback({ "obj" : obj }); },
-			close_node	: function (obj, skip_animation) {
-				obj = this._get_node(obj);
-				var s = skip_animation || is_ie6 ? 0 : this._get_settings().core.animation,
-					t = this;
-				if(!obj.length || !obj.hasClass("jstree-open")) { return false; }
-				if(s) { obj.children("ul").attr("style","display:block !important"); }
-				obj.removeClass("jstree-open").addClass("jstree-closed");
-				if(s) { obj.children("ul").stop(true, true).slideUp(s, function () { this.style.display = ""; t.after_close(obj); }); }
-				else { t.after_close(obj); }
-				this.__callback({ "obj" : obj });
-			},
-			after_close	: function (obj) { this.__callback({ "obj" : obj }); },
-			toggle_node	: function (obj) {
-				obj = this._get_node(obj);
-				if(obj.hasClass("jstree-closed")) { return this.open_node(obj); }
-				if(obj.hasClass("jstree-open")) { return this.close_node(obj); }
-			},
-			open_all	: function (obj, do_animation, original_obj) {
-				obj = obj ? this._get_node(obj) : -1;
-				if(!obj || obj === -1) { obj = this.get_container_ul(); }
-				if(original_obj) { 
-					obj = obj.find("li.jstree-closed");
-				}
-				else {
-					original_obj = obj;
-					if(obj.is(".jstree-closed")) { obj = obj.find("li.jstree-closed").andSelf(); }
-					else { obj = obj.find("li.jstree-closed"); }
-				}
-				var _this = this;
-				obj.each(function () { 
-					var __this = this; 
-					if(!_this._is_loaded(this)) { _this.open_node(this, function() { _this.open_all(__this, do_animation, original_obj); }, !do_animation); }
-					else { _this.open_node(this, false, !do_animation); }
-				});
-				// so that callback is fired AFTER all nodes are open
-				if(original_obj.find('li.jstree-closed').length === 0) { this.__callback({ "obj" : original_obj }); }
-			},
-			close_all	: function (obj, do_animation) {
-				var _this = this;
-				obj = obj ? this._get_node(obj) : this.get_container();
-				if(!obj || obj === -1) { obj = this.get_container_ul(); }
-				obj.find("li.jstree-open").andSelf().each(function () { _this.close_node(this, !do_animation); });
-				this.__callback({ "obj" : obj });
-			},
-			clean_node	: function (obj) {
-				obj = obj && obj != -1 ? $(obj) : this.get_container_ul();
-				obj = obj.is("li") ? obj.find("li").andSelf() : obj.find("li");
-				obj.removeClass("jstree-last")
-					.filter("li:last-child").addClass("jstree-last").end()
-					.filter(":has(li)")
-						.not(".jstree-open").removeClass("jstree-leaf").addClass("jstree-closed");
-				obj.not(".jstree-open, .jstree-closed").addClass("jstree-leaf").children("ul").remove();
-				this.__callback({ "obj" : obj });
-			},
-			// rollback
-			get_rollback : function () { 
-				this.__callback();
-				return { i : this.get_index(), h : this.get_container().children("ul").clone(true), d : this.data }; 
-			},
-			set_rollback : function (html, data) {
-				this.get_container().empty().append(html);
-				this.data = data;
-				this.__callback();
-			},
-			// Dummy functions to be overwritten by any datastore plugin included
-			load_node	: function (obj, s_call, e_call) { this.__callback({ "obj" : obj }); },
-			_is_loaded	: function (obj) { return true; },
-
-			// Basic operations: create
-			create_node	: function (obj, position, js, callback, is_loaded) {
-				obj = this._get_node(obj);
-				position = typeof position === "undefined" ? "last" : position;
-				var d = $("<li />"),
-					s = this._get_settings().core,
-					tmp;
-
-				if(obj !== -1 && !obj.length) { return false; }
-				if(!is_loaded && !this._is_loaded(obj)) { this.load_node(obj, function () { this.create_node(obj, position, js, callback, true); }); return false; }
-
-				this.__rollback();
-
-				if(typeof js === "string") { js = { "data" : js }; }
-				if(!js) { js = {}; }
-				if(js.attr) { d.attr(js.attr); }
-				if(js.metadata) { d.data(js.metadata); }
-				if(js.state) { d.addClass("jstree-" + js.state); }
-				if(!js.data) { js.data = this._get_string("new_node"); }
-				if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
-				$.each(js.data, function (i, m) {
-					tmp = $("<a />");
-					if($.isFunction(m)) { m = m.call(this, js); }
-					if(typeof m == "string") { tmp.attr('href','#')[ s.html_titles ? "html" : "text" ](m); }
-					else {
-						if(!m.attr) { m.attr = {}; }
-						if(!m.attr.href) { m.attr.href = '#'; }
-						tmp.attr(m.attr)[ s.html_titles ? "html" : "text" ](m.title);
-						if(m.language) { tmp.addClass(m.language); }
-					}
-					tmp.prepend("<ins class='jstree-icon'> </ins>");
-					if(m.icon) { 
-						if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
-						else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
-					}
-					d.append(tmp);
-				});
-				d.prepend("<ins class='jstree-icon'> </ins>");
-				if(obj === -1) {
-					obj = this.get_container();
-					if(position === "before") { position = "first"; }
-					if(position === "after") { position = "last"; }
-				}
-				switch(position) {
-					case "before": obj.before(d); tmp = this._get_parent(obj); break;
-					case "after" : obj.after(d);  tmp = this._get_parent(obj); break;
-					case "inside":
-					case "first" :
-						if(!obj.children("ul").length) { obj.append("<ul />"); }
-						obj.children("ul").prepend(d);
-						tmp = obj;
-						break;
-					case "last":
-						if(!obj.children("ul").length) { obj.append("<ul />"); }
-						obj.children("ul").append(d);
-						tmp = obj;
-						break;
-					default:
-						if(!obj.children("ul").length) { obj.append("<ul />"); }
-						if(!position) { position = 0; }
-						tmp = obj.children("ul").children("li").eq(position);
-						if(tmp.length) { tmp.before(d); }
-						else { obj.children("ul").append(d); }
-						tmp = obj;
-						break;
-				}
-				if(tmp === -1 || tmp.get(0) === this.get_container().get(0)) { tmp = -1; }
-				this.clean_node(tmp);
-				this.__callback({ "obj" : d, "parent" : tmp });
-				if(callback) { callback.call(this, d); }
-				return d;
-			},
-			// Basic operations: rename (deal with text)
-			get_text	: function (obj) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				var s = this._get_settings().core.html_titles;
-				obj = obj.children("a:eq(0)");
-				if(s) {
-					obj = obj.clone();
-					obj.children("INS").remove();
-					return obj.html();
-				}
-				else {
-					obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
-					return obj.nodeValue;
-				}
-			},
-			set_text	: function (obj, val) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				obj = obj.children("a:eq(0)");
-				if(this._get_settings().core.html_titles) {
-					var tmp = obj.children("INS").clone();
-					obj.html(val).prepend(tmp);
-					this.__callback({ "obj" : obj, "name" : val });
-					return true;
-				}
-				else {
-					obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
-					this.__callback({ "obj" : obj, "name" : val });
-					return (obj.nodeValue = val);
-				}
-			},
-			rename_node : function (obj, val) {
-				obj = this._get_node(obj);
-				this.__rollback();
-				if(obj && obj.length && this.set_text.apply(this, Array.prototype.slice.call(arguments))) { this.__callback({ "obj" : obj, "name" : val }); }
-			},
-			// Basic operations: deleting nodes
-			delete_node : function (obj) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				this.__rollback();
-				var p = this._get_parent(obj), prev = $([]), t = this;
-				obj.each(function () {
-					prev = prev.add(t._get_prev(this));
-				});
-				obj = obj.detach();
-				if(p !== -1 && p.find("> ul > li").length === 0) {
-					p.removeClass("jstree-open jstree-closed").addClass("jstree-leaf");
-				}
-				this.clean_node(p);
-				this.__callback({ "obj" : obj, "prev" : prev, "parent" : p });
-				return obj;
-			},
-			prepare_move : function (o, r, pos, cb, is_cb) {
-				var p = {};
-
-				p.ot = $.jstree._reference(o) || this;
-				p.o = p.ot._get_node(o);
-				p.r = r === - 1 ? -1 : this._get_node(r);
-				p.p = (typeof pos === "undefined" || pos === false) ? "last" : pos; // TODO: move to a setting
-				if(!is_cb && prepared_move.o && prepared_move.o[0] === p.o[0] && prepared_move.r[0] === p.r[0] && prepared_move.p === p.p) {
-					this.__callback(prepared_move);
-					if(cb) { cb.call(this, prepared_move); }
-					return;
-				}
-				p.ot = $.jstree._reference(p.o) || this;
-				p.rt = $.jstree._reference(p.r) || this; // r === -1 ? p.ot : $.jstree._reference(p.r) || this
-				if(p.r === -1 || !p.r) {
-					p.cr = -1;
-					switch(p.p) {
-						case "first":
-						case "before":
-						case "inside":
-							p.cp = 0; 
-							break;
-						case "after":
-						case "last":
-							p.cp = p.rt.get_container().find(" > ul > li").length; 
-							break;
-						default:
-							p.cp = p.p;
-							break;
-					}
-				}
-				else {
-					if(!/^(before|after)$/.test(p.p) && !this._is_loaded(p.r)) {
-						return this.load_node(p.r, function () { this.prepare_move(o, r, pos, cb, true); });
-					}
-					switch(p.p) {
-						case "before":
-							p.cp = p.r.index();
-							p.cr = p.rt._get_parent(p.r);
-							break;
-						case "after":
-							p.cp = p.r.index() + 1;
-							p.cr = p.rt._get_parent(p.r);
-							break;
-						case "inside":
-						case "first":
-							p.cp = 0;
-							p.cr = p.r;
-							break;
-						case "last":
-							p.cp = p.r.find(" > ul > li").length; 
-							p.cr = p.r;
-							break;
-						default: 
-							p.cp = p.p;
-							p.cr = p.r;
-							break;
-					}
-				}
-				p.np = p.cr == -1 ? p.rt.get_container() : p.cr;
-				p.op = p.ot._get_parent(p.o);
-				p.cop = p.o.index();
-				if(p.op === -1) { p.op = p.ot ? p.ot.get_container() : this.get_container(); }
-				if(!/^(before|after)$/.test(p.p) && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp++; }
-				//if(p.p === "before" && p.op && p.np && p.op[0] === p.np[0] && p.o.index() < p.cp) { p.cp--; }
-				p.or = p.np.find(" > ul > li:nth-child(" + (p.cp + 1) + ")");
-				prepared_move = p;
-				this.__callback(prepared_move);
-				if(cb) { cb.call(this, prepared_move); }
-			},
-			check_move : function () {
-				var obj = prepared_move, ret = true, r = obj.r === -1 ? this.get_container() : obj.r;
-				if(!obj || !obj.o || obj.or[0] === obj.o[0]) { return false; }
-				if(obj.op && obj.np && obj.op[0] === obj.np[0] && obj.cp - 1 === obj.o.index()) { return false; }
-				obj.o.each(function () { 
-					if(r.parentsUntil(".jstree", "li").andSelf().index(this) !== -1) { ret = false; return false; }
-				});
-				return ret;
-			},
-			move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
-				if(!is_prepared) { 
-					return this.prepare_move(obj, ref, position, function (p) {
-						this.move_node(p, false, false, is_copy, true, skip_check);
-					});
-				}
-				if(is_copy) { 
-					prepared_move.cy = true;
-				}
-				if(!skip_check && !this.check_move()) { return false; }
-
-				this.__rollback();
-				var o = false;
-				if(is_copy) {
-					o = obj.o.clone(true);
-					o.find("*[id]").andSelf().each(function () {
-						if(this.id) { this.id = "copy_" + this.id; }
-					});
-				}
-				else { o = obj.o; }
-
-				if(obj.or.length) { obj.or.before(o); }
-				else { 
-					if(!obj.np.children("ul").length) { $("<ul />").appendTo(obj.np); }
-					obj.np.children("ul:eq(0)").append(o); 
-				}
-
-				try { 
-					obj.ot.clean_node(obj.op);
-					obj.rt.clean_node(obj.np);
-					if(!obj.op.find("> ul > li").length) {
-						obj.op.removeClass("jstree-open jstree-closed").addClass("jstree-leaf").children("ul").remove();
-					}
-				} catch (e) { }
-
-				if(is_copy) { 
-					prepared_move.cy = true;
-					prepared_move.oc = o; 
-				}
-				this.__callback(prepared_move);
-				return prepared_move;
-			},
-			_get_move : function () { return prepared_move; }
-		}
-	});
-})(jQuery);
-//*/
-
-/* 
- * jsTree ui plugin
- * This plugins handles selecting/deselecting/hovering/dehovering nodes
- */
-(function ($) {
-	var scrollbar_width, e1, e2;
-	$(function() {
-		if (/msie/.test(navigator.userAgent.toLowerCase())) {
-			e1 = $('<textarea cols="10" rows="2"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');
-			e2 = $('<textarea cols="10" rows="2" style="overflow: hidden;"></textarea>').css({ position: 'absolute', top: -1000, left: 0 }).appendTo('body');
-			scrollbar_width = e1.width() - e2.width();
-			e1.add(e2).remove();
-		} 
-		else {
-			e1 = $('<div />').css({ width: 100, height: 100, overflow: 'auto', position: 'absolute', top: -1000, left: 0 })
-					.prependTo('body').append('<div />').find('div').css({ width: '100%', height: 200 });
-			scrollbar_width = 100 - e1.width();
-			e1.parent().remove();
-		}
-	});
-	$.jstree.plugin("ui", {
-		__init : function () { 
-			this.data.ui.selected = $(); 
-			this.data.ui.last_selected = false; 
-			this.data.ui.hovered = null;
-			this.data.ui.to_select = this.get_settings().ui.initially_select;
-
-			this.get_container()
-				.delegate("a", "click.jstree", $.proxy(function (event) {
-						event.preventDefault();
-						event.currentTarget.blur();
-						if(!$(event.currentTarget).hasClass("jstree-loading")) {
-							this.select_node(event.currentTarget, true, event);
-						}
-					}, this))
-				.delegate("a", "mouseenter.jstree", $.proxy(function (event) {
-						if(!$(event.currentTarget).hasClass("jstree-loading")) {
-							this.hover_node(event.target);
-						}
-					}, this))
-				.delegate("a", "mouseleave.jstree", $.proxy(function (event) {
-						if(!$(event.currentTarget).hasClass("jstree-loading")) {
-							this.dehover_node(event.target);
-						}
-					}, this))
-				.bind("reopen.jstree", $.proxy(function () { 
-						this.reselect();
-					}, this))
-				.bind("get_rollback.jstree", $.proxy(function () { 
-						this.dehover_node();
-						this.save_selected();
-					}, this))
-				.bind("set_rollback.jstree", $.proxy(function () { 
-						this.reselect();
-					}, this))
-				.bind("close_node.jstree", $.proxy(function (event, data) { 
-						var s = this._get_settings().ui,
-							obj = this._get_node(data.rslt.obj),
-							clk = (obj && obj.length) ? obj.children("ul").find("a.jstree-clicked") : $(),
-							_this = this;
-						if(s.selected_parent_close === false || !clk.length) { return; }
-						clk.each(function () { 
-							_this.deselect_node(this);
-							if(s.selected_parent_close === "select_parent") { _this.select_node(obj); }
-						});
-					}, this))
-				.bind("delete_node.jstree", $.proxy(function (event, data) { 
-						var s = this._get_settings().ui.select_prev_on_delete,
-							obj = this._get_node(data.rslt.obj),
-							clk = (obj && obj.length) ? obj.find("a.jstree-clicked") : [],
-							_this = this;
-						clk.each(function () { _this.deselect_node(this); });
-						if(s && clk.length) { 
-							data.rslt.prev.each(function () { 
-								if(this.parentNode) { _this.select_node(this); return false; /* if return false is removed all prev nodes will be selected */}
-							});
-						}
-					}, this))
-				.bind("move_node.jstree", $.proxy(function (event, data) { 
-						if(data.rslt.cy) { 
-							data.rslt.oc.find("a.jstree-clicked").removeClass("jstree-clicked");
-						}
-					}, this));
-		},
-		defaults : {
-			select_limit : -1, // 0, 1, 2 ... or -1 for unlimited
-			select_multiple_modifier : "ctrl", // on, or ctrl, shift, alt
-			select_range_modifier : "shift",
-			selected_parent_close : "select_parent", // false, "deselect", "select_parent"
-			selected_parent_open : true,
-			select_prev_on_delete : true,
-			disable_selecting_children : false,
-			initially_select : []
-		},
-		_fn : { 
-			_get_node : function (obj, allow_multiple) {
-				if(typeof obj === "undefined" || obj === null) { return allow_multiple ? this.data.ui.selected : this.data.ui.last_selected; }
-				var $obj = $(obj, this.get_container()); 
-				if($obj.is(".jstree") || obj == -1) { return -1; } 
-				$obj = $obj.closest("li", this.get_container()); 
-				return $obj.length ? $obj : false; 
-			},
-			_ui_notify : function (n, data) {
-				if(data.selected) {
-					this.select_node(n, false);
-				}
-			},
-			save_selected : function () {
-				var _this = this;
-				this.data.ui.to_select = [];
-				this.data.ui.selected.each(function () { if(this.id) { _this.data.ui.to_select.push("#" + this.id.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:")); } });
-				this.__callback(this.data.ui.to_select);
-			},
-			reselect : function () {
-				var _this = this,
-					s = this.data.ui.to_select;
-				s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
-				// this.deselect_all(); WHY deselect, breaks plugin state notifier?
-				$.each(s, function (i, val) { if(val && val !== "#") { _this.select_node(val); } });
-				this.data.ui.selected = this.data.ui.selected.filter(function () { return this.parentNode; });
-				this.__callback();
-			},
-			refresh : function (obj) {
-				this.save_selected();
-				return this.__call_old();
-			},
-			hover_node : function (obj) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				//if(this.data.ui.hovered && obj.get(0) === this.data.ui.hovered.get(0)) { return; }
-				if(!obj.hasClass("jstree-hovered")) { this.dehover_node(); }
-				this.data.ui.hovered = obj.children("a").addClass("jstree-hovered").parent();
-				this._fix_scroll(obj);
-				this.__callback({ "obj" : obj });
-			},
-			dehover_node : function () {
-				var obj = this.data.ui.hovered, p;
-				if(!obj || !obj.length) { return false; }
-				p = obj.children("a").removeClass("jstree-hovered").parent();
-				if(this.data.ui.hovered[0] === p[0]) { this.data.ui.hovered = null; }
-				this.__callback({ "obj" : obj });
-			},
-			select_node : function (obj, check, e) {
-				obj = this._get_node(obj);
-				if(obj == -1 || !obj || !obj.length) { return false; }
-				var s = this._get_settings().ui,
-					is_multiple = (s.select_multiple_modifier == "on" || (s.select_multiple_modifier !== false && e && e[s.select_multiple_modifier + "Key"])),
-					is_range = (s.select_range_modifier !== false && e && e[s.select_range_modifier + "Key"] && this.data.ui.last_selected && this.data.ui.last_selected[0] !== obj[0] && this.data.ui.last_selected.parent()[0] === obj.parent()[0]),
-					is_selected = this.is_selected(obj),
-					proceed = true,
-					t = this;
-				if(check) {
-					if(s.disable_selecting_children && is_multiple && 
-						(
-							(obj.parentsUntil(".jstree","li").children("a.jstree-clicked").length) ||
-							(obj.children("ul").find("a.jstree-clicked:eq(0)").length)
-						)
-					) {
-						return false;
-					}
-					proceed = false;
-					switch(!0) {
-						case (is_range):
-							this.data.ui.last_selected.addClass("jstree-last-selected");
-							obj = obj[ obj.index() < this.data.ui.last_selected.index() ? "nextUntil" : "prevUntil" ](".jstree-last-selected").andSelf();
-							if(s.select_limit == -1 || obj.length < s.select_limit) {
-								this.data.ui.last_selected.removeClass("jstree-last-selected");
-								this.data.ui.selected.each(function () {
-									if(this !== t.data.ui.last_selected[0]) { t.deselect_node(this); }
-								});
-								is_selected = false;
-								proceed = true;
-							}
-							else {
-								proceed = false;
-							}
-							break;
-						case (is_selected && !is_multiple): 
-							this.deselect_all();
-							is_selected = false;
-							proceed = true;
-							break;
-						case (!is_selected && !is_multiple): 
-							if(s.select_limit == -1 || s.select_limit > 0) {
-								this.deselect_all();
-								proceed = true;
-							}
-							break;
-						case (is_selected && is_multiple): 
-							this.deselect_node(obj);
-							break;
-						case (!is_selected && is_multiple): 
-							if(s.select_limit == -1 || this.data.ui.selected.length + 1 <= s.select_limit) { 
-								proceed = true;
-							}
-							break;
-					}
-				}
-				if(proceed && !is_selected) {
-					if(!is_range) { this.data.ui.last_selected = obj; }
-					obj.children("a").addClass("jstree-clicked");
-					if(s.selected_parent_open) {
-						obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });
-					}
-					this.data.ui.selected = this.data.ui.selected.add(obj);
-					this._fix_scroll(obj.eq(0));
-					this.__callback({ "obj" : obj, "e" : e });
-				}
-			},
-			_fix_scroll : function (obj) {
-				var c = this.get_container()[0], t;
-				if(c.scrollHeight > c.offsetHeight) {
-					obj = this._get_node(obj);
-					if(!obj || obj === -1 || !obj.length || !obj.is(":visible")) { return; }
-					t = obj.offset().top - this.get_container().offset().top;
-					if(t < 0) { 
-						c.scrollTop = c.scrollTop + t - 1; 
-					}
-					if(t + this.data.core.li_height + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0) > c.offsetHeight) { 
-						c.scrollTop = c.scrollTop + (t - c.offsetHeight + this.data.core.li_height + 1 + (c.scrollWidth > c.offsetWidth ? scrollbar_width : 0)); 
-					}
-				}
-			},
-			deselect_node : function (obj) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				if(this.is_selected(obj)) {
-					obj.children("a").removeClass("jstree-clicked");
-					this.data.ui.selected = this.data.ui.selected.not(obj);
-					if(this.data.ui.last_selected.get(0) === obj.get(0)) { this.data.ui.last_selected = this.data.ui.selected.eq(0); }
-					this.__callback({ "obj" : obj });
-				}
-			},
-			toggle_select : function (obj) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return false; }
-				if(this.is_selected(obj)) { this.deselect_node(obj); }
-				else { this.select_node(obj); }
-			},
-			is_selected : function (obj) { return this.data.ui.selected.index(this._get_node(obj)) >= 0; },
-			get_selected : function (context) { 
-				return context ? $(context).find("a.jstree-clicked").parent() : this.data.ui.selected; 
-			},
-			deselect_all : function (context) {
-				var ret = context ? $(context).find("a.jstree-clicked").parent() : this.get_container().find("a.jstree-clicked").parent();
-				ret.children("a.jstree-clicked").removeClass("jstree-clicked");
-				this.data.ui.selected = $([]);
-				this.data.ui.last_selected = false;
-				this.__callback({ "obj" : ret });
-			}
-		}
-	});
-	// include the selection plugin by default
-	$.jstree.defaults.plugins.push("ui");
-})(jQuery);
-//*/
-
-/* 
- * jsTree CRRM plugin
- * Handles creating/renaming/removing/moving nodes by user interaction.
- */
-(function ($) {
-	$.jstree.plugin("crrm", { 
-		__init : function () {
-			this.get_container()
-				.bind("move_node.jstree", $.proxy(function (e, data) {
-					if(this._get_settings().crrm.move.open_onmove) {
-						var t = this;
-						data.rslt.np.parentsUntil(".jstree").andSelf().filter(".jstree-closed").each(function () {
-							t.open_node(this, false, true);
-						});
-					}
-				}, this));
-		},
-		defaults : {
-			input_width_limit : 200,
-			move : {
-				always_copy			: false, // false, true or "multitree"
-				open_onmove			: true,
-				default_position	: "last",
-				check_move			: function (m) { return true; }
-			}
-		},
-		_fn : {
-			_show_input : function (obj, callback) {
-				obj = this._get_node(obj);
-				var rtl = this._get_settings().core.rtl,
-					w = this._get_settings().crrm.input_width_limit,
-					w1 = obj.children("ins").width(),
-					w2 = obj.find("> a:visible > ins").width() * obj.find("> a:visible > ins").length,
-					t = this.get_text(obj),
-					h1 = $("<div />", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo("body"),
-					h2 = obj.css("position","relative").append(
-					$("<input />", { 
-						"value" : t,
-						"class" : "jstree-rename-input",
-						// "size" : t.length,
-						"css" : {
-							"padding" : "0",
-							"border" : "1px solid silver",
-							"position" : "absolute",
-							"left"  : (rtl ? "auto" : (w1 + w2 + 4) + "px"),
-							"right" : (rtl ? (w1 + w2 + 4) + "px" : "auto"),
-							"top" : "0px",
-							"height" : (this.data.core.li_height - 2) + "px",
-							"lineHeight" : (this.data.core.li_height - 2) + "px",
-							"width" : "150px" // will be set a bit further down
-						},
-						"blur" : $.proxy(function () {
-							var i = obj.children(".jstree-rename-input"),
-								v = i.val();
-							if(v === "") { v = t; }
-							h1.remove();
-							i.remove(); // rollback purposes
-							this.set_text(obj,t); // rollback purposes
-							this.rename_node(obj, v);
-							callback.call(this, obj, v, t);
-							obj.css("position","");
-						}, this),
-						"keyup" : function (event) {
-							var key = event.keyCode || event.which;
-							if(key == 27) { this.value = t; this.blur(); return; }
-							else if(key == 13) { this.blur(); return; }
-							else {
-								h2.width(Math.min(h1.text("pW" + this.value).width(),w));
-							}
-						},
-						"keypress" : function(event) {
-							var key = event.keyCode || event.which;
-							if(key == 13) { return false; }
-						}
-					})
-				).children(".jstree-rename-input"); 
-				this.set_text(obj, "");
-				h1.css({
-						fontFamily		: h2.css('fontFamily')		|| '',
-						fontSize		: h2.css('fontSize')		|| '',
-						fontWeight		: h2.css('fontWeight')		|| '',
-						fontStyle		: h2.css('fontStyle')		|| '',
-						fontStretch		: h2.css('fontStretch')		|| '',
-						fontVariant		: h2.css('fontVariant')		|| '',
-						letterSpacing	: h2.css('letterSpacing')	|| '',
-						wordSpacing		: h2.css('wordSpacing')		|| ''
-				});
-				h2.width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select();
-			},
-			rename : function (obj) {
-				obj = this._get_node(obj);
-				this.__rollback();
-				var f = this.__callback;
-				this._show_input(obj, function (obj, new_name, old_name) { 
-					f.call(this, { "obj" : obj, "new_name" : new_name, "old_name" : old_name });
-				});
-			},
-			create : function (obj, position, js, callback, skip_rename) {
-				var t, _this = this;
-				obj = this._get_node(obj);
-				if(!obj) { obj = -1; }
-				this.__rollback();
-				t = this.create_node(obj, position, js, function (t) {
-					var p = this._get_parent(t),
-						pos = $(t).index();
-					if(callback) { callback.call(this, t); }
-					if(p.length && p.hasClass("jstree-closed")) { this.open_node(p, false, true); }
-					if(!skip_rename) { 
-						this._show_input(t, function (obj, new_name, old_name) { 
-							_this.__callback({ "obj" : obj, "name" : new_name, "parent" : p, "position" : pos });
-						});
-					}
-					else { _this.__callback({ "obj" : t, "name" : this.get_text(t), "parent" : p, "position" : pos }); }
-				});
-				return t;
-			},
-			remove : function (obj) {
-				obj = this._get_node(obj, true);
-				var p = this._get_parent(obj), prev = this._get_prev(obj);
-				this.__rollback();
-				obj = this.delete_node(obj);
-				if(obj !== false) { this.__callback({ "obj" : obj, "prev" : prev, "parent" : p }); }
-			},
-			check_move : function () {
-				if(!this.__call_old()) { return false; }
-				var s = this._get_settings().crrm.move;
-				if(!s.check_move.call(this, this._get_move())) { return false; }
-				return true;
-			},
-			move_node : function (obj, ref, position, is_copy, is_prepared, skip_check) {
-				var s = this._get_settings().crrm.move;
-				if(!is_prepared) { 
-					if(typeof position === "undefined") { position = s.default_position; }
-					if(position === "inside" && !s.default_position.match(/^(before|after)$/)) { position = s.default_position; }
-					return this.__call_old(true, obj, ref, position, is_copy, false, skip_check);
-				}
-				// if the move is already prepared
-				if(s.always_copy === true || (s.always_copy === "multitree" && obj.rt.get_index() !== obj.ot.get_index() )) {
-					is_copy = true;
-				}
-				this.__call_old(true, obj, ref, position, is_copy, true, skip_check);
-			},
-
-			cut : function (obj) {
-				obj = this._get_node(obj, true);
-				if(!obj || !obj.length) { return false; }
-				this.data.crrm.cp_nodes = false;
-				this.data.crrm.ct_nodes = obj;
-				this.__callback({ "obj" : obj });
-			},
-			copy : function (obj) {
-				obj = this._get_node(obj, true);
-				if(!obj || !obj.length) { return false; }
-				this.data.crrm.ct_nodes = false;
-				this.data.crrm.cp_nodes = obj;
-				this.__callback({ "obj" : obj });
-			},
-			paste : function (obj) { 
-				obj = this._get_node(obj);
-				if(!obj || !obj.length) { return false; }
-				var nodes = this.data.crrm.ct_nodes ? this.data.crrm.ct_nodes : this.data.crrm.cp_nodes;
-				if(!this.data.crrm.ct_nodes && !this.data.crrm.cp_nodes) { return false; }
-				if(this.data.crrm.ct_nodes) { this.move_node(this.data.crrm.ct_nodes, obj); this.data.crrm.ct_nodes = false; }
-				if(this.data.crrm.cp_nodes) { this.move_node(this.data.crrm.cp_nodes, obj, false, true); }
-				this.__callback({ "obj" : obj, "nodes" : nodes });
-			}
-		}
-	});
-	// include the crr plugin by default
-	// $.jstree.defaults.plugins.push("crrm");
-})(jQuery);
-//*/
-
-/* 
- * jsTree themes plugin
- * Handles loading and setting themes, as well as detecting path to themes, etc.
- */
-(function ($) {
-	var themes_loaded = [];
-	// this variable stores the path to the themes folder - if left as false - it will be autodetected
-	$.jstree._themes = false;
-	$.jstree.plugin("themes", {
-		__init : function () { 
-			this.get_container()
-				.bind("init.jstree", $.proxy(function () {
-						var s = this._get_settings().themes;
-						this.data.themes.dots = s.dots; 
-						this.data.themes.icons = s.icons; 
-						this.set_theme(s.theme, s.url);
-					}, this))
-				.bind("loaded.jstree", $.proxy(function () {
-						// bound here too, as simple HTML tree's won't honor dots & icons otherwise
-						if(!this.data.themes.dots) { this.hide_dots(); }
-						else { this.show_dots(); }
-						if(!this.data.themes.icons) { this.hide_icons(); }
-						else { this.show_icons(); }
-					}, this));
-		},
-		defaults : { 
-			theme : "default", 
-			url : false,
-			dots : true,
-			icons : true
-		},
-		_fn : {
-			set_theme : function (theme_name, theme_url) {
-				if(!theme_name) { return false; }
-				if(!theme_url) { theme_url = $.jstree._themes + theme_name + '/style.css'; }
-				if($.inArray(theme_url, themes_loaded) == -1) {
-					$.vakata.css.add_sheet({ "url" : theme_url });
-					themes_loaded.push(theme_url);
-				}
-				if(this.data.themes.theme != theme_name) {
-					this.get_container().removeClass('jstree-' + this.data.themes.theme);
-					this.data.themes.theme = theme_name;
-				}
-				this.get_container().addClass('jstree-' + theme_name);
-				if(!this.data.themes.dots) { this.hide_dots(); }
-				else { this.show_dots(); }
-				if(!this.data.themes.icons) { this.hide_icons(); }
-				else { this.show_icons(); }
-				this.__callback();
-			},
-			get_theme	: function () { return this.data.themes.theme; },
-
-			show_dots	: function () { this.data.themes.dots = true; this.get_container().children("ul").removeClass("jstree-no-dots"); },
-			hide_dots	: function () { this.data.themes.dots = false; this.get_container().children("ul").addClass("jstree-no-dots"); },
-			toggle_dots	: function () { if(this.data.themes.dots) { this.hide_dots(); } else { this.show_dots(); } },
-
-			show_icons	: function () { this.data.themes.icons = true; this.get_container().children("ul").removeClass("jstree-no-icons"); },
-			hide_icons	: function () { this.data.themes.icons = false; this.get_container().children("ul").addClass("jstree-no-icons"); },
-			toggle_icons: function () { if(this.data.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }
-		}
-	});
-	// autodetect themes path
-	$(function () {
-		if($.jstree._themes === false) {
-			$("script").each(function () { 
-				if(this.src.toString().match(/jquery\.jstree[^\/]*?\.js(\?.*)?$/)) { 
-					$.jstree._themes = this.src.toString().replace(/jquery\.jstree[^\/]*?\.js(\?.*)?$/, "") + 'themes/'; 
-					return false; 
-				}
-			});
-		}
-		if($.jstree._themes === false) { $.jstree._themes = "themes/"; }
-	});
-	// include the themes plugin by default
-	$.jstree.defaults.plugins.push("themes");
-})(jQuery);
-//*/
-
-/*
- * jsTree hotkeys plugin
- * Enables keyboard navigation for all tree instances
- * Depends on the jstree ui & jquery hotkeys plugins
- */
-(function ($) {
-	var bound = [];
-	function exec(i, event) {
-		var f = $.jstree._focused(), tmp;
-		if(f && f.data && f.data.hotkeys && f.data.hotkeys.enabled) { 
-			tmp = f._get_settings().hotkeys[i];
-			if(tmp) { return tmp.call(f, event); }
-		}
-	}
-	$.jstree.plugin("hotkeys", {
-		__init : function () {
-			if(typeof $.hotkeys === "undefined") { throw "jsTree hotkeys: jQuery hotkeys plugin not included."; }
-			if(!this.data.ui) { throw "jsTree hotkeys: jsTree UI plugin not included."; }
-			$.each(this._get_settings().hotkeys, function (i, v) {
-				if(v !== false && $.inArray(i, bound) == -1) {
-					$(document).bind("keydown", i, function (event) { return exec(i, event); });
-					bound.push(i);
-				}
-			});
-			this.get_container()
-				.bind("lock.jstree", $.proxy(function () {
-						if(this.data.hotkeys.enabled) { this.data.hotkeys.enabled = false; this.data.hotkeys.revert = true; }
-					}, this))
-				.bind("unlock.jstree", $.proxy(function () {
-						if(this.data.hotkeys.revert) { this.data.hotkeys.enabled = true; }
-					}, this));
-			this.enable_hotkeys();
-		},
-		defaults : {
-			"up" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-				this.hover_node(this._get_prev(o));
-				return false; 
-			},
-			"ctrl+up" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-				this.hover_node(this._get_prev(o));
-				return false; 
-			},
-			"shift+up" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-				this.hover_node(this._get_prev(o));
-				return false; 
-			},
-			"down" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-				this.hover_node(this._get_next(o));
-				return false;
-			},
-			"ctrl+down" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-				this.hover_node(this._get_next(o));
-				return false;
-			},
-			"shift+down" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected || -1;
-				this.hover_node(this._get_next(o));
-				return false;
-			},
-			"left" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected;
-				if(o) {
-					if(o.hasClass("jstree-open")) { this.close_node(o); }
-					else { this.hover_node(this._get_prev(o)); }
-				}
-				return false;
-			},
-			"ctrl+left" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected;
-				if(o) {
-					if(o.hasClass("jstree-open")) { this.close_node(o); }
-					else { this.hover_node(this._get_prev(o)); }
-				}
-				return false;
-			},
-			"shift+left" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected;
-				if(o) {
-					if(o.hasClass("jstree-open")) { this.close_node(o); }
-					else { this.hover_node(this._get_prev(o)); }
-				}
-				return false;
-			},
-			"right" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected;
-				if(o && o.length) {
-					if(o.hasClass("jstree-closed")) { this.open_node(o); }
-					else { this.hover_node(this._get_next(o)); }
-				}
-				return false;
-			},
-			"ctrl+right" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected;
-				if(o && o.length) {
-					if(o.hasClass("jstree-closed")) { this.open_node(o); }
-					else { this.hover_node(this._get_next(o)); }
-				}
-				return false;
-			},
-			"shift+right" : function () { 
-				var o = this.data.ui.hovered || this.data.ui.last_selected;
-				if(o && o.length) {
-					if(o.hasClass("jstree-closed")) { this.open_node(o); }
-					else { this.hover_node(this._get_next(o)); }
-				}
-				return false;
-			},
-			"space" : function () { 
-				if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").click(); } 
-				return false; 
-			},
-			"ctrl+space" : function (event) { 
-				event.type = "click";
-				if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); } 
-				return false; 
-			},
-			"shift+space" : function (event) { 
-				event.type = "click";
-				if(this.data.ui.hovered) { this.data.ui.hovered.children("a:eq(0)").trigger(event); } 
-				return false; 
-			},
-			"f2" : function () { this.rename(this.data.ui.hovered || this.data.ui.last_selected); },
-			"del" : function () { this.remove(this.data.ui.hovered || this._get_node(null)); }
-		},
-		_fn : {
-			enable_hotkeys : function () {
-				this.data.hotkeys.enabled = true;
-			},
-			disable_hotkeys : function () {
-				this.data.hotkeys.enabled = false;
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/* 
- * jsTree JSON plugin
- * The JSON data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
- */
-(function ($) {
-	$.jstree.plugin("json_data", {
-		__init : function() {
-			var s = this._get_settings().json_data;
-			if(s.progressive_unload) {
-				this.get_container().bind("after_close.jstree", function (e, data) {
-					data.rslt.obj.children("ul").remove();
-				});
-			}
-		},
-		defaults : { 
-			// `data` can be a function:
-			//  * accepts two arguments - node being loaded and a callback to pass the result to
-			//  * will be executed in the current tree's scope & ajax won't be supported
-			data : false, 
-			ajax : false,
-			correct_state : true,
-			progressive_render : false,
-			progressive_unload : false
-		},
-		_fn : {
-			load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_json(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
-			_is_loaded : function (obj) { 
-				var s = this._get_settings().json_data;
-				obj = this._get_node(obj); 
-				return obj == -1 || !obj || (!s.ajax && !s.progressive_render && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").length > 0;
-			},
-			refresh : function (obj) {
-				obj = this._get_node(obj);
-				var s = this._get_settings().json_data;
-				if(obj && obj !== -1 && s.progressive_unload && ($.isFunction(s.data) || !!s.ajax)) {
-					obj.removeData("jstree-children");
-				}
-				return this.__call_old();
-			},
-			load_node_json : function (obj, s_call, e_call) {
-				var s = this.get_settings().json_data, d,
-					error_func = function () {},
-					success_func = function () {};
-				obj = this._get_node(obj);
-
-				if(obj && obj !== -1 && (s.progressive_render || s.progressive_unload) && !obj.is(".jstree-open, .jstree-leaf") && obj.children("ul").children("li").length === 0 && obj.data("jstree-children")) {
-					d = this._parse_json(obj.data("jstree-children"), obj);
-					if(d) {
-						obj.append(d);
-						if(!s.progressive_unload) { obj.removeData("jstree-children"); }
-					}
-					this.clean_node(obj);
-					if(s_call) { s_call.call(this); }
-					return;
-				}
-
-				if(obj && obj !== -1) {
-					if(obj.data("jstree-is-loading")) { return; }
-					else { obj.data("jstree-is-loading",true); }
-				}
-				switch(!0) {
-					case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
-					// function option added here for easier model integration (also supporting async - see callback)
-					case ($.isFunction(s.data)):
-						s.data.call(this, obj, $.proxy(function (d) {
-							d = this._parse_json(d, obj);
-							if(!d) { 
-								if(obj === -1 || !obj) {
-									if(s.correct_state) { this.get_container().children("ul").empty(); }
-								}
-								else {
-									obj.children("a.jstree-loading").removeClass("jstree-loading");
-									obj.removeData("jstree-is-loading");
-									if(s.correct_state) { this.correct_state(obj); }
-								}
-								if(e_call) { e_call.call(this); }
-							}
-							else {
-								if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
-								else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree-is-loading"); }
-								this.clean_node(obj);
-								if(s_call) { s_call.call(this); }
-							}
-						}, this));
-						break;
-					case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
-						if(!obj || obj == -1) {
-							d = this._parse_json(s.data, obj);
-							if(d) {
-								this.get_container().children("ul").empty().append(d.children());
-								this.clean_node();
-							}
-							else { 
-								if(s.correct_state) { this.get_container().children("ul").empty(); }
-							}
-						}
-						if(s_call) { s_call.call(this); }
-						break;
-					case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
-						error_func = function (x, t, e) {
-							var ef = this.get_settings().json_data.ajax.error; 
-							if(ef) { ef.call(this, x, t, e); }
-							if(obj != -1 && obj.length) {
-								obj.children("a.jstree-loading").removeClass("jstree-loading");
-								obj.removeData("jstree-is-loading");
-								if(t === "success" && s.correct_state) { this.correct_state(obj); }
-							}
-							else {
-								if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
-							}
-							if(e_call) { e_call.call(this); }
-						};
-						success_func = function (d, t, x) {
-							var sf = this.get_settings().json_data.ajax.success; 
-							if(sf) { d = sf.call(this,d,t,x) || d; }
-							if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "") || (!$.isArray(d) && !$.isPlainObject(d))) {
-								return error_func.call(this, x, t, "");
-							}
-							d = this._parse_json(d, obj);
-							if(d) {
-								if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
-								else { obj.append(d).children("a.jstree-loading").removeClass("jstree-loading"); obj.removeData("jstree-is-loading"); }
-								this.clean_node(obj);
-								if(s_call) { s_call.call(this); }
-							}
-							else {
-								if(obj === -1 || !obj) {
-									if(s.correct_state) { 
-										this.get_container().children("ul").empty(); 
-										if(s_call) { s_call.call(this); }
-									}
-								}
-								else {
-									obj.children("a.jstree-loading").removeClass("jstree-loading");
-									obj.removeData("jstree-is-loading");
-									if(s.correct_state) { 
-										this.correct_state(obj);
-										if(s_call) { s_call.call(this); } 
-									}
-								}
-							}
-						};
-						s.ajax.context = this;
-						s.ajax.error = error_func;
-						s.ajax.success = success_func;
-						if(!s.ajax.dataType) { s.ajax.dataType = "json"; }
-						if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
-						if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
-						$.ajax(s.ajax);
-						break;
-				}
-			},
-			_parse_json : function (js, obj, is_callback) {
-				var d = false, 
-					p = this._get_settings(),
-					s = p.json_data,
-					t = p.core.html_titles,
-					tmp, i, j, ul1, ul2;
-
-				if(!js) { return d; }
-				if(s.progressive_unload && obj && obj !== -1) { 
-					obj.data("jstree-children", d);
-				}
-				if($.isArray(js)) {
-					d = $();
-					if(!js.length) { return false; }
-					for(i = 0, j = js.length; i < j; i++) {
-						tmp = this._parse_json(js[i], obj, true);
-						if(tmp.length) { d = d.add(tmp); }
-					}
-				}
-				else {
-					if(typeof js == "string") { js = { data : js }; }
-					if(!js.data && js.data !== "") { return d; }
-					d = $("<li />");
-					if(js.attr) { d.attr(js.attr); }
-					if(js.metadata) { d.data(js.metadata); }
-					if(js.state) { d.addClass("jstree-" + js.state); }
-					if(!$.isArray(js.data)) { tmp = js.data; js.data = []; js.data.push(tmp); }
-					$.each(js.data, function (i, m) {
-						tmp = $("<a />");
-						if($.isFunction(m)) { m = m.call(this, js); }
-						if(typeof m == "string") { tmp.attr('href','#')[ t ? "html" : "text" ](m); }
-						else {
-							if(!m.attr) { m.attr = {}; }
-							if(!m.attr.href) { m.attr.href = '#'; }
-							tmp.attr(m.attr)[ t ? "html" : "text" ](m.title);
-							if(m.language) { tmp.addClass(m.language); }
-						}
-						tmp.prepend("<ins class='jstree-icon'> </ins>");
-						if(!m.icon && js.icon) { m.icon = js.icon; }
-						if(m.icon) { 
-							if(m.icon.indexOf("/") === -1) { tmp.children("ins").addClass(m.icon); }
-							else { tmp.children("ins").css("background","url('" + m.icon + "') center center no-repeat"); }
-						}
-						d.append(tmp);
-					});
-					d.prepend("<ins class='jstree-icon'> </ins>");
-					if(js.children) { 
-						if(s.progressive_render && js.state !== "open") {
-							d.addClass("jstree-closed").data("jstree-children", js.children);
-						}
-						else {
-							if(s.progressive_unload) { d.data("jstree-children", js.children); }
-							if($.isArray(js.children) && js.children.length) {
-								tmp = this._parse_json(js.children, obj, true);
-								if(tmp.length) {
-									ul2 = $("<ul />");
-									ul2.append(tmp);
-									d.append(ul2);
-								}
-							}
-						}
-					}
-				}
-				if(!is_callback) {
-					ul1 = $("<ul />");
-					ul1.append(d);
-					d = ul1;
-				}
-				return d;
-			},
-			get_json : function (obj, li_attr, a_attr, is_callback) {
-				var result = [], 
-					s = this._get_settings(), 
-					_this = this,
-					tmp1, tmp2, li, a, t, lang;
-				obj = this._get_node(obj);
-				if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
-				li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
-				if(!is_callback && this.data.types) { li_attr.push(s.types.type_attr); }
-				a_attr = $.isArray(a_attr) ? a_attr : [ ];
-
-				obj.each(function () {
-					li = $(this);
-					tmp1 = { data : [] };
-					if(li_attr.length) { tmp1.attr = { }; }
-					$.each(li_attr, function (i, v) { 
-						tmp2 = li.attr(v); 
-						if(tmp2 && tmp2.length && tmp2.replace(/jstree[^ ]*/ig,'').length) {
-							tmp1.attr[v] = (" " + tmp2).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,""); 
-						}
-					});
-					if(li.hasClass("jstree-open")) { tmp1.state = "open"; }
-					if(li.hasClass("jstree-closed")) { tmp1.state = "closed"; }
-					if(li.data()) { tmp1.metadata = li.data(); }
-					a = li.children("a");
-					a.each(function () {
-						t = $(this);
-						if(
-							a_attr.length || 
-							$.inArray("languages", s.plugins) !== -1 || 
-							t.children("ins").get(0).style.backgroundImage.length || 
-							(t.children("ins").get(0).className && t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').length)
-						) { 
-							lang = false;
-							if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
-								$.each(s.languages, function (l, lv) {
-									if(t.hasClass(lv)) {
-										lang = lv;
-										return false;
-									}
-								});
-							}
-							tmp2 = { attr : { }, title : _this.get_text(t, lang) }; 
-							$.each(a_attr, function (k, z) {
-								tmp2.attr[z] = (" " + (t.attr(z) || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
-							});
-							if($.inArray("languages", s.plugins) !== -1 && $.isArray(s.languages) && s.languages.length) {
-								$.each(s.languages, function (k, z) {
-									if(t.hasClass(z)) { tmp2.language = z; return true; }
-								});
-							}
-							if(t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
-								tmp2.icon = t.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"");
-							}
-							if(t.children("ins").get(0).style.backgroundImage.length) {
-								tmp2.icon = t.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","");
-							}
-						}
-						else {
-							tmp2 = _this.get_text(t);
-						}
-						if(a.length > 1) { tmp1.data.push(tmp2); }
-						else { tmp1.data = tmp2; }
-					});
-					li = li.find("> ul > li");
-					if(li.length) { tmp1.children = _this.get_json(li, li_attr, a_attr, true); }
-					result.push(tmp1);
-				});
-				return result;
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/* 
- * jsTree languages plugin
- * Adds support for multiple language versions in one tree
- * This basically allows for many titles coexisting in one node, but only one of them being visible at any given time
- * This is useful for maintaining the same structure in many languages (hence the name of the plugin)
- */
-(function ($) {
-	$.jstree.plugin("languages", {
-		__init : function () { this._load_css();  },
-		defaults : [],
-		_fn : {
-			set_lang : function (i) { 
-				var langs = this._get_settings().languages,
-					st = false,
-					selector = ".jstree-" + this.get_index() + ' a';
-				if(!$.isArray(langs) || langs.length === 0) { return false; }
-				if($.inArray(i,langs) == -1) {
-					if(!!langs[i]) { i = langs[i]; }
-					else { return false; }
-				}
-				if(i == this.data.languages.current_language) { return true; }
-				st = $.vakata.css.get_css(selector + "." + this.data.languages.current_language, false, this.data.languages.language_css);
-				if(st !== false) { st.style.display = "none"; }
-				st = $.vakata.css.get_css(selector + "." + i, false, this.data.languages.language_css);
-				if(st !== false) { st.style.display = ""; }
-				this.data.languages.current_language = i;
-				this.__callback(i);
-				return true;
-			},
-			get_lang : function () {
-				return this.data.languages.current_language;
-			},
-			_get_string : function (key, lang) {
-				var langs = this._get_settings().languages,
-					s = this._get_settings().core.strings;
-				if($.isArray(langs) && langs.length) {
-					lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
-				}
-				if(s[lang] && s[lang][key]) { return s[lang][key]; }
-				if(s[key]) { return s[key]; }
-				return key;
-			},
-			get_text : function (obj, lang) {
-				obj = this._get_node(obj) || this.data.ui.last_selected;
-				if(!obj.size()) { return false; }
-				var langs = this._get_settings().languages,
-					s = this._get_settings().core.html_titles;
-				if($.isArray(langs) && langs.length) {
-					lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
-					obj = obj.children("a." + lang);
-				}
-				else { obj = obj.children("a:eq(0)"); }
-				if(s) {
-					obj = obj.clone();
-					obj.children("INS").remove();
-					return obj.html();
-				}
-				else {
-					obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
-					return obj.nodeValue;
-				}
-			},
-			set_text : function (obj, val, lang) {
-				obj = this._get_node(obj) || this.data.ui.last_selected;
-				if(!obj.size()) { return false; }
-				var langs = this._get_settings().languages,
-					s = this._get_settings().core.html_titles,
-					tmp;
-				if($.isArray(langs) && langs.length) {
-					lang = (lang && $.inArray(lang,langs) != -1) ? lang : this.data.languages.current_language;
-					obj = obj.children("a." + lang);
-				}
-				else { obj = obj.children("a:eq(0)"); }
-				if(s) {
-					tmp = obj.children("INS").clone();
-					obj.html(val).prepend(tmp);
-					this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
-					return true;
-				}
-				else {
-					obj = obj.contents().filter(function() { return this.nodeType == 3; })[0];
-					this.__callback({ "obj" : obj, "name" : val, "lang" : lang });
-					return (obj.nodeValue = val);
-				}
-			},
-			_load_css : function () {
-				var langs = this._get_settings().languages,
-					str = "/* languages css */",
-					selector = ".jstree-" + this.get_index() + ' a',
-					ln;
-				if($.isArray(langs) && langs.length) {
-					this.data.languages.current_language = langs[0];
-					for(ln = 0; ln < langs.length; ln++) {
-						str += selector + "." + langs[ln] + " {";
-						if(langs[ln] != this.data.languages.current_language) { str += " display:none; "; }
-						str += " } ";
-					}
-					this.data.languages.language_css = $.vakata.css.add_sheet({ 'str' : str, 'title' : "jstree-languages" });
-				}
-			},
-			create_node : function (obj, position, js, callback) {
-				var t = this.__call_old(true, obj, position, js, function (t) {
-					var langs = this._get_settings().languages,
-						a = t.children("a"),
-						ln;
-					if($.isArray(langs) && langs.length) {
-						for(ln = 0; ln < langs.length; ln++) {
-							if(!a.is("." + langs[ln])) {
-								t.append(a.eq(0).clone().removeClass(langs.join(" ")).addClass(langs[ln]));
-							}
-						}
-						a.not("." + langs.join(", .")).remove();
-					}
-					if(callback) { callback.call(this, t); }
-				});
-				return t;
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/*
- * jsTree cookies plugin
- * Stores the currently opened/selected nodes in a cookie and then restores them
- * Depends on the jquery.cookie plugin
- */
-(function ($) {
-	$.jstree.plugin("cookies", {
-		__init : function () {
-			if(typeof $.cookie === "undefined") { throw "jsTree cookie: jQuery cookie plugin not included."; }
-
-			var s = this._get_settings().cookies,
-				tmp;
-			if(!!s.save_loaded) {
-				tmp = $.cookie(s.save_loaded);
-				if(tmp && tmp.length) { this.data.core.to_load = tmp.split(","); }
-			}
-			if(!!s.save_opened) {
-				tmp = $.cookie(s.save_opened);
-				if(tmp && tmp.length) { this.data.core.to_open = tmp.split(","); }
-			}
-			if(!!s.save_selected) {
-				tmp = $.cookie(s.save_selected);
-				if(tmp && tmp.length && this.data.ui) { this.data.ui.to_select = tmp.split(","); }
-			}
-			this.get_container()
-				.one( ( this.data.ui ? "reselect" : "reopen" ) + ".jstree", $.proxy(function () {
-					this.get_container()
-						.bind("open_node.jstree close_node.jstree select_node.jstree deselect_node.jstree", $.proxy(function (e) { 
-								if(this._get_settings().cookies.auto_save) { this.save_cookie((e.handleObj.namespace + e.handleObj.type).replace("jstree","")); }
-							}, this));
-				}, this));
-		},
-		defaults : {
-			save_loaded		: "jstree_load",
-			save_opened		: "jstree_open",
-			save_selected	: "jstree_select",
-			auto_save		: true,
-			cookie_options	: {}
-		},
-		_fn : {
-			save_cookie : function (c) {
-				if(this.data.core.refreshing) { return; }
-				var s = this._get_settings().cookies;
-				if(!c) { // if called manually and not by event
-					if(s.save_loaded) {
-						this.save_loaded();
-						$.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options);
-					}
-					if(s.save_opened) {
-						this.save_opened();
-						$.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options);
-					}
-					if(s.save_selected && this.data.ui) {
-						this.save_selected();
-						$.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options);
-					}
-					return;
-				}
-				switch(c) {
-					case "open_node":
-					case "close_node":
-						if(!!s.save_opened) { 
-							this.save_opened(); 
-							$.cookie(s.save_opened, this.data.core.to_open.join(","), s.cookie_options); 
-						}
-						if(!!s.save_loaded) { 
-							this.save_loaded(); 
-							$.cookie(s.save_loaded, this.data.core.to_load.join(","), s.cookie_options); 
-						}
-						break;
-					case "select_node":
-					case "deselect_node":
-						if(!!s.save_selected && this.data.ui) { 
-							this.save_selected(); 
-							$.cookie(s.save_selected, this.data.ui.to_select.join(","), s.cookie_options); 
-						}
-						break;
-				}
-			}
-		}
-	});
-	// include cookies by default
-	// $.jstree.defaults.plugins.push("cookies");
-})(jQuery);
-//*/
-
-/*
- * jsTree sort plugin
- * Sorts items alphabetically (or using any other function)
- */
-(function ($) {
-	$.jstree.plugin("sort", {
-		__init : function () {
-			this.get_container()
-				.bind("load_node.jstree", $.proxy(function (e, data) {
-						var obj = this._get_node(data.rslt.obj);
-						obj = obj === -1 ? this.get_container().children("ul") : obj.children("ul");
-						this.sort(obj);
-					}, this))
-				.bind("rename_node.jstree create_node.jstree create.jstree", $.proxy(function (e, data) {
-						this.sort(data.rslt.obj.parent());
-					}, this))
-				.bind("move_node.jstree", $.proxy(function (e, data) {
-						var m = data.rslt.np == -1 ? this.get_container() : data.rslt.np;
-						this.sort(m.children("ul"));
-					}, this));
-		},
-		defaults : function (a, b) { return this.get_text(a) > this.get_text(b) ? 1 : -1; },
-		_fn : {
-			sort : function (obj) {
-				var s = this._get_settings().sort,
-					t = this;
-				obj.append($.makeArray(obj.children("li")).sort($.proxy(s, t)));
-				obj.find("> li > ul").each(function() { t.sort($(this)); });
-				this.clean_node(obj);
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/*
- * jsTree DND plugin
- * Drag and drop plugin for moving/copying nodes
- */
-(function ($) {
-	var o = false,
-		r = false,
-		m = false,
-		ml = false,
-		sli = false,
-		sti = false,
-		dir1 = false,
-		dir2 = false,
-		last_pos = false;
-	$.vakata.dnd = {
-		is_down : false,
-		is_drag : false,
-		helper : false,
-		scroll_spd : 10,
-		init_x : 0,
-		init_y : 0,
-		threshold : 5,
-		helper_left : 5,
-		helper_top : 10,
-		user_data : {},
-
-		drag_start : function (e, data, html) { 
-			if($.vakata.dnd.is_drag) { $.vakata.drag_stop({}); }
-			try {
-				e.currentTarget.unselectable = "on";
-				e.currentTarget.onselectstart = function() { return false; };
-				if(e.currentTarget.style) { e.currentTarget.style.MozUserSelect = "none"; }
-			} catch(err) { }
-			$.vakata.dnd.init_x = e.pageX;
-			$.vakata.dnd.init_y = e.pageY;
-			$.vakata.dnd.user_data = data;
-			$.vakata.dnd.is_down = true;
-			$.vakata.dnd.helper = $("<div id='vakata-dragged' />").html(html); //.fadeTo(10,0.25);
-			$(document).bind("mousemove", $.vakata.dnd.drag);
-			$(document).bind("mouseup", $.vakata.dnd.drag_stop);
-			return false;
-		},
-		drag : function (e) { 
-			if(!$.vakata.dnd.is_down) { return; }
-			if(!$.vakata.dnd.is_drag) {
-				if(Math.abs(e.pageX - $.vakata.dnd.init_x) > 5 || Math.abs(e.pageY - $.vakata.dnd.init_y) > 5) { 
-					$.vakata.dnd.helper.appendTo("body");
-					$.vakata.dnd.is_drag = true;
-					$(document).triggerHandler("drag_start.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
-				}
-				else { return; }
-			}
-
-			// maybe use a scrolling parent element instead of document?
-			if(e.type === "mousemove") { // thought of adding scroll in order to move the helper, but mouse poisition is n/a
-				var d = $(document), t = d.scrollTop(), l = d.scrollLeft();
-				if(e.pageY - t < 20) { 
-					if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
-					if(!sti) { dir1 = "up"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() - $.vakata.dnd.scroll_spd); }, 150); }
-				}
-				else { 
-					if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
-				}
-				if($(window).height() - (e.pageY - t) < 20) {
-					if(sti && dir1 === "up") { clearInterval(sti); sti = false; }
-					if(!sti) { dir1 = "down"; sti = setInterval(function () { $(document).scrollTop($(document).scrollTop() + $.vakata.dnd.scroll_spd); }, 150); }
-				}
-				else { 
-					if(sti && dir1 === "down") { clearInterval(sti); sti = false; }
-				}
-
-				if(e.pageX - l < 20) {
-					if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
-					if(!sli) { dir2 = "left"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() - $.vakata.dnd.scroll_spd); }, 150); }
-				}
-				else { 
-					if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
-				}
-				if($(window).width() - (e.pageX - l) < 20) {
-					if(sli && dir2 === "left") { clearInterval(sli); sli = false; }
-					if(!sli) { dir2 = "right"; sli = setInterval(function () { $(document).scrollLeft($(document).scrollLeft() + $.vakata.dnd.scroll_spd); }, 150); }
-				}
-				else { 
-					if(sli && dir2 === "right") { clearInterval(sli); sli = false; }
-				}
-			}
-
-			$.vakata.dnd.helper.css({ left : (e.pageX + $.vakata.dnd.helper_left) + "px", top : (e.pageY + $.vakata.dnd.helper_top) + "px" });
-			$(document).triggerHandler("drag.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
-		},
-		drag_stop : function (e) {
-			if(sli) { clearInterval(sli); }
-			if(sti) { clearInterval(sti); }
-			$(document).unbind("mousemove", $.vakata.dnd.drag);
-			$(document).unbind("mouseup", $.vakata.dnd.drag_stop);
-			$(document).triggerHandler("drag_stop.vakata", { "event" : e, "data" : $.vakata.dnd.user_data });
-			$.vakata.dnd.helper.remove();
-			$.vakata.dnd.init_x = 0;
-			$.vakata.dnd.init_y = 0;
-			$.vakata.dnd.user_data = {};
-			$.vakata.dnd.is_down = false;
-			$.vakata.dnd.is_drag = false;
-		}
-	};
-	$(function() {
-		var css_string = '#vakata-dragged { display:block; margin:0 0 0 0; padding:4px 4px 4px 24px; position:absolute; top:-2000px; line-height:16px; z-index:10000; } ';
-		$.vakata.css.add_sheet({ str : css_string, title : "vakata" });
-	});
-
-	$.jstree.plugin("dnd", {
-		__init : function () {
-			this.data.dnd = {
-				active : false,
-				after : false,
-				inside : false,
-				before : false,
-				off : false,
-				prepared : false,
-				w : 0,
-				to1 : false,
-				to2 : false,
-				cof : false,
-				cw : false,
-				ch : false,
-				i1 : false,
-				i2 : false,
-				mto : false
-			};
-			this.get_container()
-				.bind("mouseenter.jstree", $.proxy(function (e) {
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-							if(this.data.themes) {
-								m.attr("class", "jstree-" + this.data.themes.theme); 
-								if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
-								$.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme);
-							}
-							//if($(e.currentTarget).find("> ul > li").length === 0) {
-							if(e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree
-								var tr = $.jstree._reference(e.target), dc;
-								if(tr.data.dnd.foreign) {
-									dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
-									if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {
-										$.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
-									}
-								}
-								else {
-									tr.prepare_move(o, tr.get_container(), "last");
-									if(tr.check_move()) {
-										$.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
-									}
-								}
-							}
-						}
-					}, this))
-				.bind("mouseup.jstree", $.proxy(function (e) {
-						//if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && $(e.currentTarget).find("> ul > li").length === 0) {
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && e.currentTarget === e.target && $.vakata.dnd.user_data.obj && $($.vakata.dnd.user_data.obj).length && $($.vakata.dnd.user_data.obj).parents(".jstree:eq(0)")[0] !== e.target) { // node should not be from the same tree
-							var tr = $.jstree._reference(e.currentTarget), dc;
-							if(tr.data.dnd.foreign) {
-								dc = tr._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
-								if(dc === true || dc.inside === true || dc.before === true || dc.after === true) {
-									tr._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : tr.get_container(), is_root : true });
-								}
-							}
-							else {
-								tr.move_node(o, tr.get_container(), "last", e[tr._get_settings().dnd.copy_modifier + "Key"]);
-							}
-						}
-					}, this))
-				.bind("mouseleave.jstree", $.proxy(function (e) {
-						if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {
-							return false; 
-						}
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-							if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-							if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-							if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
-							if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
-							if($.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
-								$.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
-							}
-						}
-					}, this))
-				.bind("mousemove.jstree", $.proxy(function (e) {
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-							var cnt = this.get_container()[0];
-
-							// Horizontal scroll
-							if(e.pageX + 24 > this.data.dnd.cof.left + this.data.dnd.cw) {
-								if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-								this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft += $.vakata.dnd.scroll_spd; }, cnt), 100);
-							}
-							else if(e.pageX - 24 < this.data.dnd.cof.left) {
-								if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-								this.data.dnd.i1 = setInterval($.proxy(function () { this.scrollLeft -= $.vakata.dnd.scroll_spd; }, cnt), 100);
-							}
-							else {
-								if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-							}
-
-							// Vertical scroll
-							if(e.pageY + 24 > this.data.dnd.cof.top + this.data.dnd.ch) {
-								if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-								this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop += $.vakata.dnd.scroll_spd; }, cnt), 100);
-							}
-							else if(e.pageY - 24 < this.data.dnd.cof.top) {
-								if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-								this.data.dnd.i2 = setInterval($.proxy(function () { this.scrollTop -= $.vakata.dnd.scroll_spd; }, cnt), 100);
-							}
-							else {
-								if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-							}
-
-						}
-					}, this))
-				.bind("scroll.jstree", $.proxy(function (e) { 
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && m && ml) {
-							m.hide();
-							ml.hide();
-						}
-					}, this))
-				.delegate("a", "mousedown.jstree", $.proxy(function (e) { 
-						if(e.which === 1) {
-							this.start_drag(e.currentTarget, e);
-							return false;
-						}
-					}, this))
-				.delegate("a", "mouseenter.jstree", $.proxy(function (e) { 
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-							this.dnd_enter(e.currentTarget);
-						}
-					}, this))
-				.delegate("a", "mousemove.jstree", $.proxy(function (e) { 
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-							if(!r || !r.length || r.children("a")[0] !== e.currentTarget) {
-								this.dnd_enter(e.currentTarget);
-							}
-							if(typeof this.data.dnd.off.top === "undefined") { this.data.dnd.off = $(e.target).offset(); }
-							this.data.dnd.w = (e.pageY - (this.data.dnd.off.top || 0)) % this.data.core.li_height;
-							if(this.data.dnd.w < 0) { this.data.dnd.w += this.data.core.li_height; }
-							this.dnd_show();
-						}
-					}, this))
-				.delegate("a", "mouseleave.jstree", $.proxy(function (e) { 
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-							if(e.relatedTarget && e.relatedTarget.id && e.relatedTarget.id === "jstree-marker-line") {
-								return false; 
-							}
-								if(m) { m.hide(); }
-								if(ml) { ml.hide(); }
-							/*
-							var ec = $(e.currentTarget).closest("li"), 
-								er = $(e.relatedTarget).closest("li");
-							if(er[0] !== ec.prev()[0] && er[0] !== ec.next()[0]) {
-								if(m) { m.hide(); }
-								if(ml) { ml.hide(); }
-							}
-							*/
-							this.data.dnd.mto = setTimeout( 
-								(function (t) { return function () { t.dnd_leave(e); }; })(this),
-							0);
-						}
-					}, this))
-				.delegate("a", "mouseup.jstree", $.proxy(function (e) { 
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree) {
-							this.dnd_finish(e);
-						}
-					}, this));
-
-			$(document)
-				.bind("drag_stop.vakata", $.proxy(function () {
-						if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
-						if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
-						if(this.data.dnd.i1) { clearInterval(this.data.dnd.i1); }
-						if(this.data.dnd.i2) { clearInterval(this.data.dnd.i2); }
-						this.data.dnd.after		= false;
-						this.data.dnd.before	= false;
-						this.data.dnd.inside	= false;
-						this.data.dnd.off		= false;
-						this.data.dnd.prepared	= false;
-						this.data.dnd.w			= false;
-						this.data.dnd.to1		= false;
-						this.data.dnd.to2		= false;
-						this.data.dnd.i1		= false;
-						this.data.dnd.i2		= false;
-						this.data.dnd.active	= false;
-						this.data.dnd.foreign	= false;
-						if(m) { m.css({ "top" : "-2000px" }); }
-						if(ml) { ml.css({ "top" : "-2000px" }); }
-					}, this))
-				.bind("drag_start.vakata", $.proxy(function (e, data) {
-						if(data.data.jstree) { 
-							var et = $(data.event.target);
-							if(et.closest(".jstree").hasClass("jstree-" + this.get_index())) {
-								this.dnd_enter(et);
-							}
-						}
-					}, this));
-				/*
-				.bind("keydown.jstree-" + this.get_index() + " keyup.jstree-" + this.get_index(), $.proxy(function(e) {
-						if($.vakata.dnd.is_drag && $.vakata.dnd.user_data.jstree && !this.data.dnd.foreign) {
-							var h = $.vakata.dnd.helper.children("ins");
-							if(e[this._get_settings().dnd.copy_modifier + "Key"] && h.hasClass("jstree-ok")) {
-								h.parent().html(h.parent().html().replace(/ \(Copy\)$/, "") + " (Copy)");
-							} 
-							else {
-								h.parent().html(h.parent().html().replace(/ \(Copy\)$/, ""));
-							}
-						}
-					}, this)); */
-
-
-
-			var s = this._get_settings().dnd;
-			if(s.drag_target) {
-				$(document)
-					.delegate(s.drag_target, "mousedown.jstree-" + this.get_index(), $.proxy(function (e) {
-						o = e.target;
-						$.vakata.dnd.drag_start(e, { jstree : true, obj : e.target }, "<ins class='jstree-icon'></ins>" + $(e.target).text() );
-						if(this.data.themes) { 
-							if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }
-							if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
-							$.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); 
-						}
-						$.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
-						var cnt = this.get_container();
-						this.data.dnd.cof = cnt.offset();
-						this.data.dnd.cw = parseInt(cnt.width(),10);
-						this.data.dnd.ch = parseInt(cnt.height(),10);
-						this.data.dnd.foreign = true;
-						e.preventDefault();
-					}, this));
-			}
-			if(s.drop_target) {
-				$(document)
-					.delegate(s.drop_target, "mouseenter.jstree-" + this.get_index(), $.proxy(function (e) {
-							if(this.data.dnd.active && this._get_settings().dnd.drop_check.call(this, { "o" : o, "r" : $(e.target), "e" : e })) {
-								$.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
-							}
-						}, this))
-					.delegate(s.drop_target, "mouseleave.jstree-" + this.get_index(), $.proxy(function (e) {
-							if(this.data.dnd.active) {
-								$.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
-							}
-						}, this))
-					.delegate(s.drop_target, "mouseup.jstree-" + this.get_index(), $.proxy(function (e) {
-							if(this.data.dnd.active && $.vakata.dnd.helper.children("ins").hasClass("jstree-ok")) {
-								this._get_settings().dnd.drop_finish.call(this, { "o" : o, "r" : $(e.target), "e" : e });
-							}
-						}, this));
-			}
-		},
-		defaults : {
-			copy_modifier	: "ctrl",
-			check_timeout	: 100,
-			open_timeout	: 500,
-			drop_target		: ".jstree-drop",
-			drop_check		: function (data) { return true; },
-			drop_finish		: $.noop,
-			drag_target		: ".jstree-draggable",
-			drag_finish		: $.noop,
-			drag_check		: function (data) { return { after : false, before : false, inside : true }; }
-		},
-		_fn : {
-			dnd_prepare : function () {
-				if(!r || !r.length) { return; }
-				this.data.dnd.off = r.offset();
-				if(this._get_settings().core.rtl) {
-					this.data.dnd.off.right = this.data.dnd.off.left + r.width();
-				}
-				if(this.data.dnd.foreign) {
-					var a = this._get_settings().dnd.drag_check.call(this, { "o" : o, "r" : r });
-					this.data.dnd.after = a.after;
-					this.data.dnd.before = a.before;
-					this.data.dnd.inside = a.inside;
-					this.data.dnd.prepared = true;
-					return this.dnd_show();
-				}
-				this.prepare_move(o, r, "before");
-				this.data.dnd.before = this.check_move();
-				this.prepare_move(o, r, "after");
-				this.data.dnd.after = this.check_move();
-				if(this._is_loaded(r)) {
-					this.prepare_move(o, r, "inside");
-					this.data.dnd.inside = this.check_move();
-				}
-				else {
-					this.data.dnd.inside = false;
-				}
-				this.data.dnd.prepared = true;
-				return this.dnd_show();
-			},
-			dnd_show : function () {
-				if(!this.data.dnd.prepared) { return; }
-				var o = ["before","inside","after"],
-					r = false,
-					rtl = this._get_settings().core.rtl,
-					pos;
-				if(this.data.dnd.w < this.data.core.li_height/3) { o = ["before","inside","after"]; }
-				else if(this.data.dnd.w <= this.data.core.li_height*2/3) {
-					o = this.data.dnd.w < this.data.core.li_height/2 ? ["inside","before","after"] : ["inside","after","before"];
-				}
-				else { o = ["after","inside","before"]; }
-				$.each(o, $.proxy(function (i, val) { 
-					if(this.data.dnd[val]) {
-						$.vakata.dnd.helper.children("ins").attr("class","jstree-ok");
-						r = val;
-						return false;
-					}
-				}, this));
-				if(r === false) { $.vakata.dnd.helper.children("ins").attr("class","jstree-invalid"); }
-				
-				pos = rtl ? (this.data.dnd.off.right - 18) : (this.data.dnd.off.left + 10);
-				switch(r) {
-					case "before":
-						m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top - 6) + "px" }).show();
-						if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top - 1) + "px" }).show(); }
-						break;
-					case "after":
-						m.css({ "left" : pos + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 6) + "px" }).show();
-						if(ml) { ml.css({ "left" : (pos + 8) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height - 1) + "px" }).show(); }
-						break;
-					case "inside":
-						m.css({ "left" : pos + ( rtl ? -4 : 4) + "px", "top" : (this.data.dnd.off.top + this.data.core.li_height/2 - 5) + "px" }).show();
-						if(ml) { ml.hide(); }
-						break;
-					default:
-						m.hide();
-						if(ml) { ml.hide(); }
-						break;
-				}
-				last_pos = r;
-				return r;
-			},
-			dnd_open : function () {
-				this.data.dnd.to2 = false;
-				this.open_node(r, $.proxy(this.dnd_prepare,this), true);
-			},
-			dnd_finish : function (e) {
-				if(this.data.dnd.foreign) {
-					if(this.data.dnd.after || this.data.dnd.before || this.data.dnd.inside) {
-						this._get_settings().dnd.drag_finish.call(this, { "o" : o, "r" : r, "p" : last_pos });
-					}
-				}
-				else {
-					this.dnd_prepare();
-					this.move_node(o, r, last_pos, e[this._get_settings().dnd.copy_modifier + "Key"]);
-				}
-				o = false;
-				r = false;
-				m.hide();
-				if(ml) { ml.hide(); }
-			},
-			dnd_enter : function (obj) {
-				if(this.data.dnd.mto) { 
-					clearTimeout(this.data.dnd.mto);
-					this.data.dnd.mto = false;
-				}
-				var s = this._get_settings().dnd;
-				this.data.dnd.prepared = false;
-				r = this._get_node(obj);
-				if(s.check_timeout) { 
-					// do the calculations after a minimal timeout (users tend to drag quickly to the desired location)
-					if(this.data.dnd.to1) { clearTimeout(this.data.dnd.to1); }
-					this.data.dnd.to1 = setTimeout($.proxy(this.dnd_prepare, this), s.check_timeout); 
-				}
-				else { 
-					this.dnd_prepare(); 
-				}
-				if(s.open_timeout) { 
-					if(this.data.dnd.to2) { clearTimeout(this.data.dnd.to2); }
-					if(r && r.length && r.hasClass("jstree-closed")) { 
-						// if the node is closed - open it, then recalculate
-						this.data.dnd.to2 = setTimeout($.proxy(this.dnd_open, this), s.open_timeout);
-					}
-				}
-				else {
-					if(r && r.length && r.hasClass("jstree-closed")) { 
-						this.dnd_open();
-					}
-				}
-			},
-			dnd_leave : function (e) {
-				this.data.dnd.after		= false;
-				this.data.dnd.before	= false;
-				this.data.dnd.inside	= false;
-				$.vakata.dnd.helper.children("ins").attr("class","jstree-invalid");
-				m.hide();
-				if(ml) { ml.hide(); }
-				if(r && r[0] === e.target.parentNode) {
-					if(this.data.dnd.to1) {
-						clearTimeout(this.data.dnd.to1);
-						this.data.dnd.to1 = false;
-					}
-					if(this.data.dnd.to2) {
-						clearTimeout(this.data.dnd.to2);
-						this.data.dnd.to2 = false;
-					}
-				}
-			},
-			start_drag : function (obj, e) {
-				o = this._get_node(obj);
-				if(this.data.ui && this.is_selected(o)) { o = this._get_node(null, true); }
-				var dt = o.length > 1 ? this._get_string("multiple_selection") : this.get_text(o),
-					cnt = this.get_container();
-				if(!this._get_settings().core.html_titles) { dt = dt.replace(/</ig,"<").replace(/>/ig,">"); }
-				$.vakata.dnd.drag_start(e, { jstree : true, obj : o }, "<ins class='jstree-icon'></ins>" + dt );
-				if(this.data.themes) { 
-					if(m) { m.attr("class", "jstree-" + this.data.themes.theme); }
-					if(ml) { ml.attr("class", "jstree-" + this.data.themes.theme); }
-					$.vakata.dnd.helper.attr("class", "jstree-dnd-helper jstree-" + this.data.themes.theme); 
-				}
-				this.data.dnd.cof = cnt.offset();
-				this.data.dnd.cw = parseInt(cnt.width(),10);
-				this.data.dnd.ch = parseInt(cnt.height(),10);
-				this.data.dnd.active = true;
-			}
-		}
-	});
-	$(function() {
-		var css_string = '' + 
-			'#vakata-dragged ins { display:block; text-decoration:none; width:16px; height:16px; margin:0 0 0 0; padding:0; position:absolute; top:4px; left:4px; ' + 
-			' -moz-border-radius:4px; border-radius:4px; -webkit-border-radius:4px; ' +
-			'} ' + 
-			'#vakata-dragged .jstree-ok { background:green; } ' + 
-			'#vakata-dragged .jstree-invalid { background:red; } ' + 
-			'#jstree-marker { padding:0; margin:0; font-size:12px; overflow:hidden; height:12px; width:8px; position:absolute; top:-30px; z-index:10001; background-repeat:no-repeat; display:none; background-color:transparent; text-shadow:1px 1px 1px white; color:black; line-height:10px; } ' + 
-			'#jstree-marker-line { padding:0; margin:0; line-height:0%; font-size:1px; overflow:hidden; height:1px; width:100px; position:absolute; top:-30px; z-index:10000; background-repeat:no-repeat; display:none; background-color:#456c43; ' + 
-			' cursor:pointer; border:1px solid #eeeeee; border-left:0; -moz-box-shadow: 0px 0px 2px #666; -webkit-box-shadow: 0px 0px 2px #666; box-shadow: 0px 0px 2px #666; ' + 
-			' -moz-border-radius:1px; border-radius:1px; -webkit-border-radius:1px; ' +
-			'}' + 
-			'';
-		$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-		m = $("<div />").attr({ id : "jstree-marker" }).hide().html("»")
-			.bind("mouseleave mouseenter", function (e) { 
-				m.hide();
-				ml.hide();
-				e.preventDefault(); 
-				e.stopImmediatePropagation(); 
-				return false; 
-			})
-			.appendTo("body");
-		ml = $("<div />").attr({ id : "jstree-marker-line" }).hide()
-			.bind("mouseup", function (e) { 
-				if(r && r.length) { 
-					r.children("a").trigger(e); 
-					e.preventDefault(); 
-					e.stopImmediatePropagation(); 
-					return false; 
-				} 
-			})
-			.bind("mouseleave", function (e) { 
-				var rt = $(e.relatedTarget);
-				if(rt.is(".jstree") || rt.closest(".jstree").length === 0) {
-					if(r && r.length) { 
-						r.children("a").trigger(e); 
-						m.hide();
-						ml.hide();
-						e.preventDefault(); 
-						e.stopImmediatePropagation(); 
-						return false; 
-					}
-				}
-			})
-			.appendTo("body");
-		$(document).bind("drag_start.vakata", function (e, data) {
-			if(data.data.jstree) { m.show(); if(ml) { ml.show(); } }
-		});
-		$(document).bind("drag_stop.vakata", function (e, data) {
-			if(data.data.jstree) { m.hide(); if(ml) { ml.hide(); } }
-		});
-	});
-})(jQuery);
-//*/
-
-/*
- * jsTree checkbox plugin
- * Inserts checkboxes in front of every node
- * Depends on the ui plugin
- * DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP
- */
-(function ($) {
-	$.jstree.plugin("checkbox", {
-		__init : function () {
-			this.data.checkbox.noui = this._get_settings().checkbox.override_ui;
-			if(this.data.ui && this.data.checkbox.noui) {
-				this.select_node = this.deselect_node = this.deselect_all = $.noop;
-				this.get_selected = this.get_checked;
-			}
-
-			this.get_container()
-				.bind("open_node.jstree create_node.jstree clean_node.jstree refresh.jstree", $.proxy(function (e, data) { 
-						this._prepare_checkboxes(data.rslt.obj);
-					}, this))
-				.bind("loaded.jstree", $.proxy(function (e) {
-						this._prepare_checkboxes();
-					}, this))
-				.delegate( (this.data.ui && this.data.checkbox.noui ? "a" : "ins.jstree-checkbox") , "click.jstree", $.proxy(function (e) {
-						e.preventDefault();
-						if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); }
-						else { this.check_node(e.target); }
-						if(this.data.ui && this.data.checkbox.noui) {
-							this.save_selected();
-							if(this.data.cookies) { this.save_cookie("select_node"); }
-						}
-						else {
-							e.stopImmediatePropagation();
-							return false;
-						}
-					}, this));
-		},
-		defaults : {
-			override_ui : false,
-			two_state : false,
-			real_checkboxes : false,
-			checked_parent_open : true,
-			real_checkboxes_names : function (n) { return [ ("check_" + (n[0].id || Math.ceil(Math.random() * 10000))) , 1]; }
-		},
-		__destroy : function () {
-			this.get_container()
-				.find("input.jstree-real-checkbox").removeClass("jstree-real-checkbox").end()
-				.find("ins.jstree-checkbox").remove();
-		},
-		_fn : {
-			_checkbox_notify : function (n, data) {
-				if(data.checked) {
-					this.check_node(n, false);
-				}
-			},
-			_prepare_checkboxes : function (obj) {
-				obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);
-				if(obj === false) { return; } // added for removing root nodes
-				var c, _this = this, t, ts = this._get_settings().checkbox.two_state, rc = this._get_settings().checkbox.real_checkboxes, rcn = this._get_settings().checkbox.real_checkboxes_names;
-				obj.each(function () {
-					t = $(this);
-					c = t.is("li") && (t.hasClass("jstree-checked") || (rc && t.children(":checked").length)) ? "jstree-checked" : "jstree-unchecked";
-					t.find("li").andSelf().each(function () {
-						var $t = $(this), nm;
-						$t.children("a" + (_this.data.languages ? "" : ":eq(0)") ).not(":has(.jstree-checkbox)").prepend("<ins class='jstree-checkbox'> </ins>").parent().not(".jstree-checked, .jstree-unchecked").addClass( ts ? "jstree-unchecked" : c );
-						if(rc) {
-							if(!$t.children(":checkbox").length) {
-								nm = rcn.call(_this, $t);
-								$t.prepend("<input type='checkbox' class='jstree-real-checkbox' id='" + nm[0] + "' name='" + nm[0] + "' value='" + nm[1] + "' />");
-							}
-							else {
-								$t.children(":checkbox").addClass("jstree-real-checkbox");
-							}
-							if(c === "jstree-checked") { 
-								$t.children(":checkbox").attr("checked","checked"); 
-							}
-						}
-						if(c === "jstree-checked" && !ts) {
-							$t.find("li").addClass("jstree-checked");
-						}
-					});
-				});
-				if(!ts) {
-					if(obj.length === 1 && obj.is("li")) { this._repair_state(obj); }
-					if(obj.is("li")) { obj.each(function () { _this._repair_state(this); }); }
-					else { obj.find("> ul > li").each(function () { _this._repair_state(this); }); }
-					obj.find(".jstree-checked").parent().parent().each(function () { _this._repair_state(this); }); 
-				}
-			},
-			change_state : function (obj, state) {
-				obj = this._get_node(obj);
-				var coll = false, rc = this._get_settings().checkbox.real_checkboxes;
-				if(!obj || obj === -1) { return false; }
-				state = (state === false || state === true) ? state : obj.hasClass("jstree-checked");
-				if(this._get_settings().checkbox.two_state) {
-					if(state) { 
-						obj.removeClass("jstree-checked").addClass("jstree-unchecked"); 
-						if(rc) { obj.children(":checkbox").removeAttr("checked"); }
-					}
-					else { 
-						obj.removeClass("jstree-unchecked").addClass("jstree-checked"); 
-						if(rc) { obj.children(":checkbox").attr("checked","checked"); }
-					}
-				}
-				else {
-					if(state) { 
-						coll = obj.find("li").andSelf();
-						if(!coll.filter(".jstree-checked, .jstree-undetermined").length) { return false; }
-						coll.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked"); 
-						if(rc) { coll.children(":checkbox").removeAttr("checked"); }
-					}
-					else { 
-						coll = obj.find("li").andSelf();
-						if(!coll.filter(".jstree-unchecked, .jstree-undetermined").length) { return false; }
-						coll.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked"); 
-						if(rc) { coll.children(":checkbox").attr("checked","checked"); }
-						if(this.data.ui) { this.data.ui.last_selected = obj; }
-						this.data.checkbox.last_selected = obj;
-					}
-					obj.parentsUntil(".jstree", "li").each(function () {
-						var $this = $(this);
-						if(state) {
-							if($this.children("ul").children("li.jstree-checked, li.jstree-undetermined").length) {
-								$this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
-								if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
-								return false;
-							}
-							else {
-								$this.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked");
-								if(rc) { $this.children(":checkbox").removeAttr("checked"); }
-							}
-						}
-						else {
-							if($this.children("ul").children("li.jstree-unchecked, li.jstree-undetermined").length) {
-								$this.parentsUntil(".jstree", "li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
-								if(rc) { $this.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
-								return false;
-							}
-							else {
-								$this.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked");
-								if(rc) { $this.children(":checkbox").attr("checked","checked"); }
-							}
-						}
-					});
-				}
-				if(this.data.ui && this.data.checkbox.noui) { this.data.ui.selected = this.get_checked(); }
-				this.__callback(obj);
-				return true;
-			},
-			check_node : function (obj) {
-				if(this.change_state(obj, false)) { 
-					obj = this._get_node(obj);
-					if(this._get_settings().checkbox.checked_parent_open) {
-						var t = this;
-						obj.parents(".jstree-closed").each(function () { t.open_node(this, false, true); });
-					}
-					this.__callback({ "obj" : obj }); 
-				}
-			},
-			uncheck_node : function (obj) {
-				if(this.change_state(obj, true)) { this.__callback({ "obj" : this._get_node(obj) }); }
-			},
-			check_all : function () {
-				var _this = this, 
-					coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");
-				coll.each(function () {
-					_this.change_state(this, false);
-				});
-				this.__callback();
-			},
-			uncheck_all : function () {
-				var _this = this,
-					coll = this._get_settings().checkbox.two_state ? this.get_container_ul().find("li") : this.get_container_ul().children("li");
-				coll.each(function () {
-					_this.change_state(this, true);
-				});
-				this.__callback();
-			},
-
-			is_checked : function(obj) {
-				obj = this._get_node(obj);
-				return obj.length ? obj.is(".jstree-checked") : false;
-			},
-			get_checked : function (obj, get_all) {
-				obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
-				return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-checked") : obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");
-			},
-			get_unchecked : function (obj, get_all) { 
-				obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
-				return get_all || this._get_settings().checkbox.two_state ? obj.find(".jstree-unchecked") : obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked");
-			},
-
-			show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); },
-			hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); },
-
-			_repair_state : function (obj) {
-				obj = this._get_node(obj);
-				if(!obj.length) { return; }
-				var rc = this._get_settings().checkbox.real_checkboxes,
-					a = obj.find("> ul > .jstree-checked").length,
-					b = obj.find("> ul > .jstree-undetermined").length,
-					c = obj.find("> ul > li").length;
-				if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.change_state(obj, false); } }
-				else if(a === 0 && b === 0) { this.change_state(obj, true); }
-				else if(a === c) { this.change_state(obj, false); }
-				else { 
-					obj.parentsUntil(".jstree","li").andSelf().removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
-					if(rc) { obj.parentsUntil(".jstree", "li").andSelf().children(":checkbox").removeAttr("checked"); }
-				}
-			},
-			reselect : function () {
-				if(this.data.ui && this.data.checkbox.noui) { 
-					var _this = this,
-						s = this.data.ui.to_select;
-					s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace(/\\\//g,"/").replace(/\//g,"\\\/").replace(/\\\./g,".").replace(/\./g,"\\.").replace(/\:/g,"\\:"); });
-					this.deselect_all();
-					$.each(s, function (i, val) { _this.check_node(val); });
-					this.__callback();
-				}
-				else { 
-					this.__call_old(); 
-				}
-			},
-			save_loaded : function () {
-				var _this = this;
-				this.data.core.to_load = [];
-				this.get_container_ul().find("li.jstree-closed.jstree-undetermined").each(function () {
-					if(this.id) { _this.data.core.to_load.push("#" + this.id); }
-				});
-			}
-		}
-	});
-	$(function() {
-		var css_string = '.jstree .jstree-real-checkbox { display:none; } ';
-		$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-	});
-})(jQuery);
-//*/
-
-/* 
- * jsTree XML plugin
- * The XML data store. Datastores are build by overriding the `load_node` and `_is_loaded` functions.
- */
-(function ($) {
-	$.vakata.xslt = function (xml, xsl, callback) {
-		var rs = "", xm, xs, processor, support;
-		// TODO: IE9 no XSLTProcessor, no document.recalc
-		if(document.recalc) {
-			xm = document.createElement('xml');
-			xs = document.createElement('xml');
-			xm.innerHTML = xml;
-			xs.innerHTML = xsl;
-			$("body").append(xm).append(xs);
-			setTimeout( (function (xm, xs, callback) {
-				return function () {
-					callback.call(null, xm.transformNode(xs.XMLDocument));
-					setTimeout( (function (xm, xs) { return function () { $(xm).remove(); $(xs).remove(); }; })(xm, xs), 200);
-				};
-			})(xm, xs, callback), 100);
-			return true;
-		}
-		if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor === "undefined") {
-			xml = new DOMParser().parseFromString(xml, "text/xml");
-			xsl = new DOMParser().parseFromString(xsl, "text/xml");
-			// alert(xml.transformNode());
-			// callback.call(null, new XMLSerializer().serializeToString(rs));
-			
-		}
-		if(typeof window.DOMParser !== "undefined" && typeof window.XMLHttpRequest !== "undefined" && typeof window.XSLTProcessor !== "undefined") {
-			processor = new XSLTProcessor();
-			support = $.isFunction(processor.transformDocument) ? (typeof window.XMLSerializer !== "undefined") : true;
-			if(!support) { return false; }
-			xml = new DOMParser().parseFromString(xml, "text/xml");
-			xsl = new DOMParser().parseFromString(xsl, "text/xml");
-			if($.isFunction(processor.transformDocument)) {
-				rs = document.implementation.createDocument("", "", null);
-				processor.transformDocument(xml, xsl, rs, null);
-				callback.call(null, new XMLSerializer().serializeToString(rs));
-				return true;
-			}
-			else {
-				processor.importStylesheet(xsl);
-				rs = processor.transformToFragment(xml, document);
-				callback.call(null, $("<div />").append(rs).html());
-				return true;
-			}
-		}
-		return false;
-	};
-	var xsl = {
-		'nest' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
-			'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' + 
-			'<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/html" />' + 
-			'<xsl:template match="/">' + 
-			'	<xsl:call-template name="nodes">' + 
-			'		<xsl:with-param name="node" select="/root" />' + 
-			'	</xsl:call-template>' + 
-			'</xsl:template>' + 
-			'<xsl:template name="nodes">' + 
-			'	<xsl:param name="node" />' + 
-			'	<ul>' + 
-			'	<xsl:for-each select="$node/item">' + 
-			'		<xsl:variable name="children" select="count(./item) > 0" />' + 
-			'		<li>' + 
-			'			<xsl:attribute name="class">' + 
-			'				<xsl:if test="position() = last()">jstree-last </xsl:if>' + 
-			'				<xsl:choose>' + 
-			'					<xsl:when test="@state = \'open\'">jstree-open </xsl:when>' + 
-			'					<xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' + 
-			'					<xsl:otherwise>jstree-leaf </xsl:otherwise>' + 
-			'				</xsl:choose>' + 
-			'				<xsl:value-of select="@class" />' + 
-			'			</xsl:attribute>' + 
-			'			<xsl:for-each select="@*">' + 
-			'				<xsl:if test="name() != \'class\' and name() != \'state\' and name() != \'hasChildren\'">' + 
-			'					<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + 
-			'				</xsl:if>' + 
-			'			</xsl:for-each>' + 
-			'	<ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' + 
-			'			<xsl:for-each select="content/name">' + 
-			'				<a>' + 
-			'				<xsl:attribute name="href">' + 
-			'					<xsl:choose>' + 
-			'					<xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' + 
-			'					<xsl:otherwise>#</xsl:otherwise>' + 
-			'					</xsl:choose>' + 
-			'				</xsl:attribute>' + 
-			'				<xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' + 
-			'				<xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' + 
-			'				<xsl:for-each select="@*">' + 
-			'					<xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' + 
-			'						<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + 
-			'					</xsl:if>' + 
-			'				</xsl:for-each>' + 
-			'					<ins>' + 
-			'						<xsl:attribute name="class">jstree-icon ' + 
-			'							<xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' + 
-			'						</xsl:attribute>' + 
-			'						<xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' + 
-			'						<xsl:text>&#xa0;</xsl:text>' + 
-			'					</ins>' + 
-			'					<xsl:copy-of select="./child::node()" />' + 
-			'				</a>' + 
-			'			</xsl:for-each>' + 
-			'			<xsl:if test="$children or @hasChildren"><xsl:call-template name="nodes"><xsl:with-param name="node" select="current()" /></xsl:call-template></xsl:if>' + 
-			'		</li>' + 
-			'	</xsl:for-each>' + 
-			'	</ul>' + 
-			'</xsl:template>' + 
-			'</xsl:stylesheet>',
-
-		'flat' : '<' + '?xml version="1.0" encoding="utf-8" ?>' +
-			'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >' + 
-			'<xsl:output method="html" encoding="utf-8" omit-xml-declaration="yes" standalone="no" indent="no" media-type="text/xml" />' + 
-			'<xsl:template match="/">' + 
-			'	<ul>' + 
-			'	<xsl:for-each select="//item[not(@parent_id) or @parent_id=0 or not(@parent_id = //item/@id)]">' + /* the last `or` may be removed */
-			'		<xsl:call-template name="nodes">' + 
-			'			<xsl:with-param name="node" select="." />' + 
-			'			<xsl:with-param name="is_last" select="number(position() = last())" />' + 
-			'		</xsl:call-template>' + 
-			'	</xsl:for-each>' + 
-			'	</ul>' + 
-			'</xsl:template>' + 
-			'<xsl:template name="nodes">' + 
-			'	<xsl:param name="node" />' + 
-			'	<xsl:param name="is_last" />' + 
-			'	<xsl:variable name="children" select="count(//item[@parent_id=$node/attribute::id]) > 0" />' + 
-			'	<li>' + 
-			'	<xsl:attribute name="class">' + 
-			'		<xsl:if test="$is_last = true()">jstree-last </xsl:if>' + 
-			'		<xsl:choose>' + 
-			'			<xsl:when test="@state = \'open\'">jstree-open </xsl:when>' + 
-			'			<xsl:when test="$children or @hasChildren or @state = \'closed\'">jstree-closed </xsl:when>' + 
-			'			<xsl:otherwise>jstree-leaf </xsl:otherwise>' + 
-			'		</xsl:choose>' + 
-			'		<xsl:value-of select="@class" />' + 
-			'	</xsl:attribute>' + 
-			'	<xsl:for-each select="@*">' + 
-			'		<xsl:if test="name() != \'parent_id\' and name() != \'hasChildren\' and name() != \'class\' and name() != \'state\'">' + 
-			'		<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + 
-			'		</xsl:if>' + 
-			'	</xsl:for-each>' + 
-			'	<ins class="jstree-icon"><xsl:text>&#xa0;</xsl:text></ins>' + 
-			'	<xsl:for-each select="content/name">' + 
-			'		<a>' + 
-			'		<xsl:attribute name="href">' + 
-			'			<xsl:choose>' + 
-			'			<xsl:when test="@href"><xsl:value-of select="@href" /></xsl:when>' + 
-			'			<xsl:otherwise>#</xsl:otherwise>' + 
-			'			</xsl:choose>' + 
-			'		</xsl:attribute>' + 
-			'		<xsl:attribute name="class"><xsl:value-of select="@lang" /> <xsl:value-of select="@class" /></xsl:attribute>' + 
-			'		<xsl:attribute name="style"><xsl:value-of select="@style" /></xsl:attribute>' + 
-			'		<xsl:for-each select="@*">' + 
-			'			<xsl:if test="name() != \'style\' and name() != \'class\' and name() != \'href\'">' + 
-			'				<xsl:attribute name="{name()}"><xsl:value-of select="." /></xsl:attribute>' + 
-			'			</xsl:if>' + 
-			'		</xsl:for-each>' + 
-			'			<ins>' + 
-			'				<xsl:attribute name="class">jstree-icon ' + 
-			'					<xsl:if test="string-length(attribute::icon) > 0 and not(contains(@icon,\'/\'))"><xsl:value-of select="@icon" /></xsl:if>' + 
-			'				</xsl:attribute>' + 
-			'				<xsl:if test="string-length(attribute::icon) > 0 and contains(@icon,\'/\')"><xsl:attribute name="style">background:url(<xsl:value-of select="@icon" />) center center no-repeat;</xsl:attribute></xsl:if>' + 
-			'				<xsl:text>&#xa0;</xsl:text>' + 
-			'			</ins>' + 
-			'			<xsl:copy-of select="./child::node()" />' + 
-			'		</a>' + 
-			'	</xsl:for-each>' + 
-			'	<xsl:if test="$children">' + 
-			'		<ul>' + 
-			'		<xsl:for-each select="//item[@parent_id=$node/attribute::id]">' + 
-			'			<xsl:call-template name="nodes">' + 
-			'				<xsl:with-param name="node" select="." />' + 
-			'				<xsl:with-param name="is_last" select="number(position() = last())" />' + 
-			'			</xsl:call-template>' + 
-			'		</xsl:for-each>' + 
-			'		</ul>' + 
-			'	</xsl:if>' + 
-			'	</li>' + 
-			'</xsl:template>' + 
-			'</xsl:stylesheet>'
-	},
-	escape_xml = function(string) {
-		return string
-			.toString()
-			.replace(/&/g, '&')
-			.replace(/</g, '<')
-			.replace(/>/g, '>')
-			.replace(/"/g, '"')
-			.replace(/'/g, ''');
-	};
-	$.jstree.plugin("xml_data", {
-		defaults : { 
-			data : false,
-			ajax : false,
-			xsl : "flat",
-			clean_node : false,
-			correct_state : true,
-			get_skip_empty : false,
-			get_include_preamble : true
-		},
-		_fn : {
-			load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_xml(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
-			_is_loaded : function (obj) { 
-				var s = this._get_settings().xml_data;
-				obj = this._get_node(obj);
-				return obj == -1 || !obj || (!s.ajax && !$.isFunction(s.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
-			},
-			load_node_xml : function (obj, s_call, e_call) {
-				var s = this.get_settings().xml_data,
-					error_func = function () {},
-					success_func = function () {};
-
-				obj = this._get_node(obj);
-				if(obj && obj !== -1) {
-					if(obj.data("jstree-is-loading")) { return; }
-					else { obj.data("jstree-is-loading",true); }
-				}
-				switch(!0) {
-					case (!s.data && !s.ajax): throw "Neither data nor ajax settings supplied.";
-					case ($.isFunction(s.data)):
-						s.data.call(this, obj, $.proxy(function (d) {
-							this.parse_xml(d, $.proxy(function (d) {
-								if(d) {
-									d = d.replace(/ ?xmlns="[^"]*"/ig, "");
-									if(d.length > 10) {
-										d = $(d);
-										if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
-										else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree-is-loading"); }
-										if(s.clean_node) { this.clean_node(obj); }
-										if(s_call) { s_call.call(this); }
-									}
-									else {
-										if(obj && obj !== -1) { 
-											obj.children("a.jstree-loading").removeClass("jstree-loading");
-											obj.removeData("jstree-is-loading");
-											if(s.correct_state) { 
-												this.correct_state(obj);
-												if(s_call) { s_call.call(this); } 
-											}
-										}
-										else {
-											if(s.correct_state) { 
-												this.get_container().children("ul").empty();
-												if(s_call) { s_call.call(this); } 
-											}
-										}
-									}
-								}
-							}, this));
-						}, this));
-						break;
-					case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
-						if(!obj || obj == -1) {
-							this.parse_xml(s.data, $.proxy(function (d) {
-								if(d) {
-									d = d.replace(/ ?xmlns="[^"]*"/ig, "");
-									if(d.length > 10) {
-										d = $(d);
-										this.get_container().children("ul").empty().append(d.children());
-										if(s.clean_node) { this.clean_node(obj); }
-										if(s_call) { s_call.call(this); }
-									}
-								}
-								else { 
-									if(s.correct_state) { 
-										this.get_container().children("ul").empty(); 
-										if(s_call) { s_call.call(this); }
-									}
-								}
-							}, this));
-						}
-						break;
-					case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
-						error_func = function (x, t, e) {
-							var ef = this.get_settings().xml_data.ajax.error; 
-							if(ef) { ef.call(this, x, t, e); }
-							if(obj !== -1 && obj.length) {
-								obj.children("a.jstree-loading").removeClass("jstree-loading");
-								obj.removeData("jstree-is-loading");
-								if(t === "success" && s.correct_state) { this.correct_state(obj); }
-							}
-							else {
-								if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
-							}
-							if(e_call) { e_call.call(this); }
-						};
-						success_func = function (d, t, x) {
-							d = x.responseText;
-							var sf = this.get_settings().xml_data.ajax.success; 
-							if(sf) { d = sf.call(this,d,t,x) || d; }
-							if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {
-								return error_func.call(this, x, t, "");
-							}
-							this.parse_xml(d, $.proxy(function (d) {
-								if(d) {
-									d = d.replace(/ ?xmlns="[^"]*"/ig, "");
-									if(d.length > 10) {
-										d = $(d);
-										if(obj === -1 || !obj) { this.get_container().children("ul").empty().append(d.children()); }
-										else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d); obj.removeData("jstree-is-loading"); }
-										if(s.clean_node) { this.clean_node(obj); }
-										if(s_call) { s_call.call(this); }
-									}
-									else {
-										if(obj && obj !== -1) { 
-											obj.children("a.jstree-loading").removeClass("jstree-loading");
-											obj.removeData("jstree-is-loading");
-											if(s.correct_state) { 
-												this.correct_state(obj);
-												if(s_call) { s_call.call(this); } 
-											}
-										}
-										else {
-											if(s.correct_state) { 
-												this.get_container().children("ul").empty();
-												if(s_call) { s_call.call(this); } 
-											}
-										}
-									}
-								}
-							}, this));
-						};
-						s.ajax.context = this;
-						s.ajax.error = error_func;
-						s.ajax.success = success_func;
-						if(!s.ajax.dataType) { s.ajax.dataType = "xml"; }
-						if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
-						if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
-						$.ajax(s.ajax);
-						break;
-				}
-			},
-			parse_xml : function (xml, callback) {
-				var s = this._get_settings().xml_data;
-				$.vakata.xslt(xml, xsl[s.xsl], callback);
-			},
-			get_xml : function (tp, obj, li_attr, a_attr, is_callback) {
-				var result = "", 
-					s = this._get_settings(), 
-					_this = this,
-					tmp1, tmp2, li, a, lang;
-				if(!tp) { tp = "flat"; }
-				if(!is_callback) { is_callback = 0; }
-				obj = this._get_node(obj);
-				if(!obj || obj === -1) { obj = this.get_container().find("> ul > li"); }
-				li_attr = $.isArray(li_attr) ? li_attr : [ "id", "class" ];
-				if(!is_callback && this.data.types && $.inArray(s.types.type_attr, li_attr) === -1) { li_attr.push(s.types.type_attr); }
-
-				a_attr = $.isArray(a_attr) ? a_attr : [ ];
-
-				if(!is_callback) { 
-					if(s.xml_data.get_include_preamble) { 
-						result += '<' + '?xml version="1.0" encoding="UTF-8"?' + '>'; 
-					}
-					result += "<root>"; 
-				}
-				obj.each(function () {
-					result += "<item";
-					li = $(this);
-					$.each(li_attr, function (i, v) { 
-						var t = li.attr(v);
-						if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {
-							result += " " + v + "=\"" + escape_xml((" " + (t || "")).replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\""; 
-						}
-					});
-					if(li.hasClass("jstree-open")) { result += " state=\"open\""; }
-					if(li.hasClass("jstree-closed")) { result += " state=\"closed\""; }
-					if(tp === "flat") { result += " parent_id=\"" + escape_xml(is_callback) + "\""; }
-					result += ">";
-					result += "<content>";
-					a = li.children("a");
-					a.each(function () {
-						tmp1 = $(this);
-						lang = false;
-						result += "<name";
-						if($.inArray("languages", s.plugins) !== -1) {
-							$.each(s.languages, function (k, z) {
-								if(tmp1.hasClass(z)) { result += " lang=\"" + escape_xml(z) + "\""; lang = z; return false; }
-							});
-						}
-						if(a_attr.length) { 
-							$.each(a_attr, function (k, z) {
-								var t = tmp1.attr(z);
-								if(!s.xml_data.get_skip_empty || typeof t !== "undefined") {
-									result += " " + z + "=\"" + escape_xml((" " + t || "").replace(/ jstree[^ ]*/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + "\"";
-								}
-							});
-						}
-						if(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/^\s+$/ig,"").length) {
-							result += ' icon="' + escape_xml(tmp1.children("ins").get(0).className.replace(/jstree[^ ]*|$/ig,'').replace(/\s+$/ig," ").replace(/^ /,"").replace(/ $/,"")) + '"';
-						}
-						if(tmp1.children("ins").get(0).style.backgroundImage.length) {
-							result += ' icon="' + escape_xml(tmp1.children("ins").get(0).style.backgroundImage.replace("url(","").replace(")","").replace(/'/ig,"").replace(/"/ig,"")) + '"';
-						}
-						result += ">";
-						result += "<![CDATA[" + _this.get_text(tmp1, lang) + "]]>";
-						result += "</name>";
-					});
-					result += "</content>";
-					tmp2 = li[0].id || true;
-					li = li.find("> ul > li");
-					if(li.length) { tmp2 = _this.get_xml(tp, li, li_attr, a_attr, tmp2); }
-					else { tmp2 = ""; }
-					if(tp == "nest") { result += tmp2; }
-					result += "</item>";
-					if(tp == "flat") { result += tmp2; }
-				});
-				if(!is_callback) { result += "</root>"; }
-				return result;
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/*
- * jsTree search plugin
- * Enables both sync and async search on the tree
- * DOES NOT WORK WITH JSON PROGRESSIVE RENDER
- */
-(function ($) {
-	$.expr[':'].jstree_contains = function(a,i,m){
-		return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
-	};
-	$.expr[':'].jstree_title_contains = function(a,i,m) {
-		return (a.getAttribute("title") || "").toLowerCase().indexOf(m[3].toLowerCase())>=0;
-	};
-	$.jstree.plugin("search", {
-		__init : function () {
-			this.data.search.str = "";
-			this.data.search.result = $();
-			if(this._get_settings().search.show_only_matches) {
-				this.get_container()
-					.bind("search.jstree", function (e, data) {
-						$(this).children("ul").find("li").hide().removeClass("jstree-last");
-						data.rslt.nodes.parentsUntil(".jstree").andSelf().show()
-							.filter("ul").each(function () { $(this).children("li:visible").eq(-1).addClass("jstree-last"); });
-					})
-					.bind("clear_search.jstree", function () {
-						$(this).children("ul").find("li").css("display","").end().end().jstree("clean_node", -1);
-					});
-			}
-		},
-		defaults : {
-			ajax : false,
-			search_method : "jstree_contains", // for case insensitive - jstree_contains
-			show_only_matches : false
-		},
-		_fn : {
-			search : function (str, skip_async) {
-				if($.trim(str) === "") { this.clear_search(); return; }
-				var s = this.get_settings().search, 
-					t = this,
-					error_func = function () { },
-					success_func = function () { };
-				this.data.search.str = str;
-
-				if(!skip_async && s.ajax !== false && this.get_container_ul().find("li.jstree-closed:not(:has(ul)):eq(0)").length > 0) {
-					this.search.supress_callback = true;
-					error_func = function () { };
-					success_func = function (d, t, x) {
-						var sf = this.get_settings().search.ajax.success; 
-						if(sf) { d = sf.call(this,d,t,x) || d; }
-						this.data.search.to_open = d;
-						this._search_open();
-					};
-					s.ajax.context = this;
-					s.ajax.error = error_func;
-					s.ajax.success = success_func;
-					if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, str); }
-					if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, str); }
-					if(!s.ajax.data) { s.ajax.data = { "search_string" : str }; }
-					if(!s.ajax.dataType || /^json/.exec(s.ajax.dataType)) { s.ajax.dataType = "json"; }
-					$.ajax(s.ajax);
-					return;
-				}
-				if(this.data.search.result.length) { this.clear_search(); }
-				this.data.search.result = this.get_container().find("a" + (this.data.languages ? "." + this.get_lang() : "" ) + ":" + (s.search_method) + "(" + this.data.search.str + ")");
-				this.data.search.result.addClass("jstree-search").parent().parents(".jstree-closed").each(function () {
-					t.open_node(this, false, true);
-				});
-				this.__callback({ nodes : this.data.search.result, str : str });
-			},
-			clear_search : function (str) {
-				this.data.search.result.removeClass("jstree-search");
-				this.__callback(this.data.search.result);
-				this.data.search.result = $();
-			},
-			_search_open : function (is_callback) {
-				var _this = this,
-					done = true,
-					current = [],
-					remaining = [];
-				if(this.data.search.to_open.length) {
-					$.each(this.data.search.to_open, function (i, val) {
-						if(val == "#") { return true; }
-						if($(val).length && $(val).is(".jstree-closed")) { current.push(val); }
-						else { remaining.push(val); }
-					});
-					if(current.length) {
-						this.data.search.to_open = remaining;
-						$.each(current, function (i, val) { 
-							_this.open_node(val, function () { _this._search_open(true); }); 
-						});
-						done = false;
-					}
-				}
-				if(done) { this.search(this.data.search.str, true); }
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/* 
- * jsTree contextmenu plugin
- */
-(function ($) {
-	$.vakata.context = {
-		hide_on_mouseleave : false,
-
-		cnt		: $("<div id='vakata-contextmenu' />"),
-		vis		: false,
-		tgt		: false,
-		par		: false,
-		func	: false,
-		data	: false,
-		rtl		: false,
-		show	: function (s, t, x, y, d, p, rtl) {
-			$.vakata.context.rtl = !!rtl;
-			var html = $.vakata.context.parse(s), h, w;
-			if(!html) { return; }
-			$.vakata.context.vis = true;
-			$.vakata.context.tgt = t;
-			$.vakata.context.par = p || t || null;
-			$.vakata.context.data = d || null;
-			$.vakata.context.cnt
-				.html(html)
-				.css({ "visibility" : "hidden", "display" : "block", "left" : 0, "top" : 0 });
-
-			if($.vakata.context.hide_on_mouseleave) {
-				$.vakata.context.cnt
-					.one("mouseleave", function(e) { $.vakata.context.hide(); });
-			}
-
-			h = $.vakata.context.cnt.height();
-			w = $.vakata.context.cnt.width();
-			if(x + w > $(document).width()) { 
-				x = $(document).width() - (w + 5); 
-				$.vakata.context.cnt.find("li > ul").addClass("right"); 
-			}
-			if(y + h > $(document).height()) { 
-				y = y - (h + t[0].offsetHeight); 
-				$.vakata.context.cnt.find("li > ul").addClass("bottom"); 
-			}
-
-			$.vakata.context.cnt
-				.css({ "left" : x, "top" : y })
-				.find("li:has(ul)")
-					.bind("mouseenter", function (e) { 
-						var w = $(document).width(),
-							h = $(document).height(),
-							ul = $(this).children("ul").show(); 
-						if(w !== $(document).width()) { ul.toggleClass("right"); }
-						if(h !== $(document).height()) { ul.toggleClass("bottom"); }
-					})
-					.bind("mouseleave", function (e) { 
-						$(this).children("ul").hide(); 
-					})
-					.end()
-				.css({ "visibility" : "visible" })
-				.show();
-			$(document).triggerHandler("context_show.vakata");
-		},
-		hide	: function () {
-			$.vakata.context.vis = false;
-			$.vakata.context.cnt.attr("class","").css({ "visibility" : "hidden" });
-			$(document).triggerHandler("context_hide.vakata");
-		},
-		parse	: function (s, is_callback) {
-			if(!s) { return false; }
-			var str = "",
-				tmp = false,
-				was_sep = true;
-			if(!is_callback) { $.vakata.context.func = {}; }
-			str += "<ul>";
-			$.each(s, function (i, val) {
-				if(!val) { return true; }
-				$.vakata.context.func[i] = val.action;
-				if(!was_sep && val.separator_before) {
-					str += "<li class='vakata-separator vakata-separator-before'></li>";
-				}
-				was_sep = false;
-				str += "<li class='" + (val._class || "") + (val._disabled ? " jstree-contextmenu-disabled " : "") + "'><ins ";
-				if(val.icon && val.icon.indexOf("/") === -1) { str += " class='" + val.icon + "' "; }
-				if(val.icon && val.icon.indexOf("/") !== -1) { str += " style='background:url(" + val.icon + ") center center no-repeat;' "; }
-				str += "> </ins><a href='#' rel='" + i + "'>";
-				if(val.submenu) {
-					str += "<span style='float:" + ($.vakata.context.rtl ? "left" : "right") + ";'>»</span>";
-				}
-				str += val.label + "</a>";
-				if(val.submenu) {
-					tmp = $.vakata.context.parse(val.submenu, true);
-					if(tmp) { str += tmp; }
-				}
-				str += "</li>";
-				if(val.separator_after) {
-					str += "<li class='vakata-separator vakata-separator-after'></li>";
-					was_sep = true;
-				}
-			});
-			str = str.replace(/<li class\='vakata-separator vakata-separator-after'\><\/li\>$/,"");
-			str += "</ul>";
-			$(document).triggerHandler("context_parse.vakata");
-			return str.length > 10 ? str : false;
-		},
-		exec	: function (i) {
-			if($.isFunction($.vakata.context.func[i])) {
-				// if is string - eval and call it!
-				$.vakata.context.func[i].call($.vakata.context.data, $.vakata.context.par);
-				return true;
-			}
-			else { return false; }
-		}
-	};
-	$(function () {
-		var css_string = '' + 
-			'#vakata-contextmenu { display:block; visibility:hidden; left:0; top:-200px; position:absolute; margin:0; padding:0; min-width:180px; background:#ebebeb; border:1px solid silver; z-index:10000; *width:180px; } ' + 
-			'#vakata-contextmenu ul { min-width:180px; *width:180px; } ' + 
-			'#vakata-contextmenu ul, #vakata-contextmenu li { margin:0; padding:0; list-style-type:none; display:block; } ' + 
-			'#vakata-contextmenu li { line-height:20px; min-height:20px; position:relative; padding:0px; } ' + 
-			'#vakata-contextmenu li a { padding:1px 6px; line-height:17px; display:block; text-decoration:none; margin:1px 1px 0 1px; } ' + 
-			'#vakata-contextmenu li ins { float:left; width:16px; height:16px; text-decoration:none; margin-right:2px; } ' + 
-			'#vakata-contextmenu li a:hover, #vakata-contextmenu li.vakata-hover > a { background:gray; color:white; } ' + 
-			'#vakata-contextmenu li ul { display:none; position:absolute; top:-2px; left:100%; background:#ebebeb; border:1px solid gray; } ' + 
-			'#vakata-contextmenu .right { right:100%; left:auto; } ' + 
-			'#vakata-contextmenu .bottom { bottom:-1px; top:auto; } ' + 
-			'#vakata-contextmenu li.vakata-separator { min-height:0; height:1px; line-height:1px; font-size:1px; overflow:hidden; margin:0 2px; background:silver; /* border-top:1px solid #fefefe; */ padding:0; } ';
-		$.vakata.css.add_sheet({ str : css_string, title : "vakata" });
-		$.vakata.context.cnt
-			.delegate("a","click", function (e) { e.preventDefault(); })
-			.delegate("a","mouseup", function (e) {
-				if(!$(this).parent().hasClass("jstree-contextmenu-disabled") && $.vakata.context.exec($(this).attr("rel"))) {
-					$.vakata.context.hide();
-				}
-				else { $(this).blur(); }
-			})
-			.delegate("a","mouseover", function () {
-				$.vakata.context.cnt.find(".vakata-hover").removeClass("vakata-hover");
-			})
-			.appendTo("body");
-		$(document).bind("mousedown", function (e) { if($.vakata.context.vis && !$.contains($.vakata.context.cnt[0], e.target)) { $.vakata.context.hide(); } });
-		if(typeof $.hotkeys !== "undefined") {
-			$(document)
-				.bind("keydown", "up", function (e) { 
-					if($.vakata.context.vis) { 
-						var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").prevAll("li:not(.vakata-separator)").first();
-						if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").last(); }
-						o.addClass("vakata-hover");
-						e.stopImmediatePropagation(); 
-						e.preventDefault();
-					} 
-				})
-				.bind("keydown", "down", function (e) { 
-					if($.vakata.context.vis) { 
-						var o = $.vakata.context.cnt.find("ul:visible").last().children(".vakata-hover").removeClass("vakata-hover").nextAll("li:not(.vakata-separator)").first();
-						if(!o.length) { o = $.vakata.context.cnt.find("ul:visible").last().children("li:not(.vakata-separator)").first(); }
-						o.addClass("vakata-hover");
-						e.stopImmediatePropagation(); 
-						e.preventDefault();
-					} 
-				})
-				.bind("keydown", "right", function (e) { 
-					if($.vakata.context.vis) { 
-						$.vakata.context.cnt.find(".vakata-hover").children("ul").show().children("li:not(.vakata-separator)").removeClass("vakata-hover").first().addClass("vakata-hover");
-						e.stopImmediatePropagation(); 
-						e.preventDefault();
-					} 
-				})
-				.bind("keydown", "left", function (e) { 
-					if($.vakata.context.vis) { 
-						$.vakata.context.cnt.find(".vakata-hover").children("ul").hide().children(".vakata-separator").removeClass("vakata-hover");
-						e.stopImmediatePropagation(); 
-						e.preventDefault();
-					} 
-				})
-				.bind("keydown", "esc", function (e) { 
-					$.vakata.context.hide(); 
-					e.preventDefault();
-				})
-				.bind("keydown", "space", function (e) { 
-					$.vakata.context.cnt.find(".vakata-hover").last().children("a").click();
-					e.preventDefault();
-				});
-		}
-	});
-
-	$.jstree.plugin("contextmenu", {
-		__init : function () {
-			this.get_container()
-				.delegate("a", "contextmenu.jstree", $.proxy(function (e) {
-						e.preventDefault();
-						if(!$(e.currentTarget).hasClass("jstree-loading")) {
-							this.show_contextmenu(e.currentTarget, e.pageX, e.pageY);
-						}
-					}, this))
-				.delegate("a", "click.jstree", $.proxy(function (e) {
-						if(this.data.contextmenu) {
-							$.vakata.context.hide();
-						}
-					}, this))
-				.bind("destroy.jstree", $.proxy(function () {
-						// TODO: move this to descruct method
-						if(this.data.contextmenu) {
-							$.vakata.context.hide();
-						}
-					}, this));
-			$(document).bind("context_hide.vakata", $.proxy(function () { this.data.contextmenu = false; }, this));
-		},
-		defaults : { 
-			select_node : false, // requires UI plugin
-			show_at_node : true,
-			items : { // Could be a function that should return an object like this one
-				"create" : {
-					"separator_before"	: false,
-					"separator_after"	: true,
-					"label"				: "Create",
-					"action"			: function (obj) { this.create(obj); }
-				},
-				"rename" : {
-					"separator_before"	: false,
-					"separator_after"	: false,
-					"label"				: "Rename",
-					"action"			: function (obj) { this.rename(obj); }
-				},
-				"remove" : {
-					"separator_before"	: false,
-					"icon"				: false,
-					"separator_after"	: false,
-					"label"				: "Delete",
-					"action"			: function (obj) { if(this.is_selected(obj)) { this.remove(); } else { this.remove(obj); } }
-				},
-				"ccp" : {
-					"separator_before"	: true,
-					"icon"				: false,
-					"separator_after"	: false,
-					"label"				: "Edit",
-					"action"			: false,
-					"submenu" : { 
-						"cut" : {
-							"separator_before"	: false,
-							"separator_after"	: false,
-							"label"				: "Cut",
-							"action"			: function (obj) { this.cut(obj); }
-						},
-						"copy" : {
-							"separator_before"	: false,
-							"icon"				: false,
-							"separator_after"	: false,
-							"label"				: "Copy",
-							"action"			: function (obj) { this.copy(obj); }
-						},
-						"paste" : {
-							"separator_before"	: false,
-							"icon"				: false,
-							"separator_after"	: false,
-							"label"				: "Paste",
-							"action"			: function (obj) { this.paste(obj); }
-						}
-					}
-				}
-			}
-		},
-		_fn : {
-			show_contextmenu : function (obj, x, y) {
-				obj = this._get_node(obj);
-				var s = this.get_settings().contextmenu,
-					a = obj.children("a:visible:eq(0)"),
-					o = false,
-					i = false;
-				if(s.select_node && this.data.ui && !this.is_selected(obj)) {
-					this.deselect_all();
-					this.select_node(obj, true);
-				}
-				if(s.show_at_node || typeof x === "undefined" || typeof y === "undefined") {
-					o = a.offset();
-					x = o.left;
-					y = o.top + this.data.core.li_height;
-				}
-				i = obj.data("jstree") && obj.data("jstree").contextmenu ? obj.data("jstree").contextmenu : s.items;
-				if($.isFunction(i)) { i = i.call(this, obj); }
-				this.data.contextmenu = true;
-				$.vakata.context.show(i, a, x, y, this, obj, this._get_settings().core.rtl);
-				if(this.data.themes) { $.vakata.context.cnt.attr("class", "jstree-" + this.data.themes.theme + "-context"); }
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/* 
- * jsTree types plugin
- * Adds support types of nodes
- * You can set an attribute on each li node, that represents its type.
- * According to the type setting the node may get custom icon/validation rules
- */
-(function ($) {
-	$.jstree.plugin("types", {
-		__init : function () {
-			var s = this._get_settings().types;
-			this.data.types.attach_to = [];
-			this.get_container()
-				.bind("init.jstree", $.proxy(function () { 
-						var types = s.types, 
-							attr  = s.type_attr, 
-							icons_css = "", 
-							_this = this;
-
-						$.each(types, function (i, tp) {
-							$.each(tp, function (k, v) { 
-								if(!/^(max_depth|max_children|icon|valid_children)$/.test(k)) { _this.data.types.attach_to.push(k); }
-							});
-							if(!tp.icon) { return true; }
-							if( tp.icon.image || tp.icon.position) {
-								if(i == "default")	{ icons_css += '.jstree-' + _this.get_index() + ' a > .jstree-icon { '; }
-								else				{ icons_css += '.jstree-' + _this.get_index() + ' li[' + attr + '="' + i + '"] > a > .jstree-icon { '; }
-								if(tp.icon.image)	{ icons_css += ' background-image:url(' + tp.icon.image + '); '; }
-								if(tp.icon.position){ icons_css += ' background-position:' + tp.icon.position + '; '; }
-								else				{ icons_css += ' background-position:0 0; '; }
-								icons_css += '} ';
-							}
-						});
-						if(icons_css !== "") { $.vakata.css.add_sheet({ 'str' : icons_css, title : "jstree-types" }); }
-					}, this))
-				.bind("before.jstree", $.proxy(function (e, data) { 
-						var s, t, 
-							o = this._get_settings().types.use_data ? this._get_node(data.args[0]) : false, 
-							d = o && o !== -1 && o.length ? o.data("jstree") : false;
-						if(d && d.types && d.types[data.func] === false) { e.stopImmediatePropagation(); return false; }
-						if($.inArray(data.func, this.data.types.attach_to) !== -1) {
-							if(!data.args[0] || (!data.args[0].tagName && !data.args[0].jquery)) { return; }
-							s = this._get_settings().types.types;
-							t = this._get_type(data.args[0]);
-							if(
-								( 
-									(s[t] && typeof s[t][data.func] !== "undefined") || 
-									(s["default"] && typeof s["default"][data.func] !== "undefined") 
-								) && this._check(data.func, data.args[0]) === false
-							) {
-								e.stopImmediatePropagation();
-								return false;
-							}
-						}
-					}, this));
-			if(is_ie6) {
-				this.get_container()
-					.bind("load_node.jstree set_type.jstree", $.proxy(function (e, data) {
-							var r = data && data.rslt && data.rslt.obj && data.rslt.obj !== -1 ? this._get_node(data.rslt.obj).parent() : this.get_container_ul(),
-								c = false,
-								s = this._get_settings().types;
-							$.each(s.types, function (i, tp) {
-								if(tp.icon && (tp.icon.image || tp.icon.position)) {
-									c = i === "default" ? r.find("li > a > .jstree-icon") : r.find("li[" + s.type_attr + "='" + i + "'] > a > .jstree-icon");
-									if(tp.icon.image) { c.css("backgroundImage","url(" + tp.icon.image + ")"); }
-									c.css("backgroundPosition", tp.icon.position || "0 0");
-								}
-							});
-						}, this));
-			}
-		},
-		defaults : {
-			// defines maximum number of root nodes (-1 means unlimited, -2 means disable max_children checking)
-			max_children		: -1,
-			// defines the maximum depth of the tree (-1 means unlimited, -2 means disable max_depth checking)
-			max_depth			: -1,
-			// defines valid node types for the root nodes
-			valid_children		: "all",
-
-			// whether to use $.data
-			use_data : false, 
-			// where is the type stores (the rel attribute of the LI element)
-			type_attr : "rel",
-			// a list of types
-			types : {
-				// the default type
-				"default" : {
-					"max_children"	: -1,
-					"max_depth"		: -1,
-					"valid_children": "all"
-
-					// Bound functions - you can bind any other function here (using boolean or function)
-					//"select_node"	: true
-				}
-			}
-		},
-		_fn : {
-			_types_notify : function (n, data) {
-				if(data.type && this._get_settings().types.use_data) {
-					this.set_type(data.type, n);
-				}
-			},
-			_get_type : function (obj) {
-				obj = this._get_node(obj);
-				return (!obj || !obj.length) ? false : obj.attr(this._get_settings().types.type_attr) || "default";
-			},
-			set_type : function (str, obj) {
-				obj = this._get_node(obj);
-				var ret = (!obj.length || !str) ? false : obj.attr(this._get_settings().types.type_attr, str);
-				if(ret) { this.__callback({ obj : obj, type : str}); }
-				return ret;
-			},
-			_check : function (rule, obj, opts) {
-				obj = this._get_node(obj);
-				var v = false, t = this._get_type(obj), d = 0, _this = this, s = this._get_settings().types, data = false;
-				if(obj === -1) { 
-					if(!!s[rule]) { v = s[rule]; }
-					else { return; }
-				}
-				else {
-					if(t === false) { return; }
-					data = s.use_data ? obj.data("jstree") : false;
-					if(data && data.types && typeof data.types[rule] !== "undefined") { v = data.types[rule]; }
-					else if(!!s.types[t] && typeof s.types[t][rule] !== "undefined") { v = s.types[t][rule]; }
-					else if(!!s.types["default"] && typeof s.types["default"][rule] !== "undefined") { v = s.types["default"][rule]; }
-				}
-				if($.isFunction(v)) { v = v.call(this, obj); }
-				if(rule === "max_depth" && obj !== -1 && opts !== false && s.max_depth !== -2 && v !== 0) {
-					// also include the node itself - otherwise if root node it is not checked
-					obj.children("a:eq(0)").parentsUntil(".jstree","li").each(function (i) {
-						// check if current depth already exceeds global tree depth
-						if(s.max_depth !== -1 && s.max_depth - (i + 1) <= 0) { v = 0; return false; }
-						d = (i === 0) ? v : _this._check(rule, this, false);
-						// check if current node max depth is already matched or exceeded
-						if(d !== -1 && d - (i + 1) <= 0) { v = 0; return false; }
-						// otherwise - set the max depth to the current value minus current depth
-						if(d >= 0 && (d - (i + 1) < v || v < 0) ) { v = d - (i + 1); }
-						// if the global tree depth exists and it minus the nodes calculated so far is less than `v` or `v` is unlimited
-						if(s.max_depth >= 0 && (s.max_depth - (i + 1) < v || v < 0) ) { v = s.max_depth - (i + 1); }
-					});
-				}
-				return v;
-			},
-			check_move : function () {
-				if(!this.__call_old()) { return false; }
-				var m  = this._get_move(),
-					s  = m.rt._get_settings().types,
-					mc = m.rt._check("max_children", m.cr),
-					md = m.rt._check("max_depth", m.cr),
-					vc = m.rt._check("valid_children", m.cr),
-					ch = 0, d = 1, t;
-
-				if(vc === "none") { return false; } 
-				if($.isArray(vc) && m.ot && m.ot._get_type) {
-					m.o.each(function () {
-						if($.inArray(m.ot._get_type(this), vc) === -1) { d = false; return false; }
-					});
-					if(d === false) { return false; }
-				}
-				if(s.max_children !== -2 && mc !== -1) {
-					ch = m.cr === -1 ? this.get_container().find("> ul > li").not(m.o).length : m.cr.find("> ul > li").not(m.o).length;
-					if(ch + m.o.length > mc) { return false; }
-				}
-				if(s.max_depth !== -2 && md !== -1) {
-					d = 0;
-					if(md === 0) { return false; }
-					if(typeof m.o.d === "undefined") {
-						// TODO: deal with progressive rendering and async when checking max_depth (how to know the depth of the moved node)
-						t = m.o;
-						while(t.length > 0) {
-							t = t.find("> ul > li");
-							d ++;
-						}
-						m.o.d = d;
-					}
-					if(md - m.o.d < 0) { return false; }
-				}
-				return true;
-			},
-			create_node : function (obj, position, js, callback, is_loaded, skip_check) {
-				if(!skip_check && (is_loaded || this._is_loaded(obj))) {
-					var p  = (typeof position == "string" && position.match(/^before|after$/i) && obj !== -1) ? this._get_parent(obj) : this._get_node(obj),
-						s  = this._get_settings().types,
-						mc = this._check("max_children", p),
-						md = this._check("max_depth", p),
-						vc = this._check("valid_children", p),
-						ch;
-					if(typeof js === "string") { js = { data : js }; }
-					if(!js) { js = {}; }
-					if(vc === "none") { return false; } 
-					if($.isArray(vc)) {
-						if(!js.attr || !js.attr[s.type_attr]) { 
-							if(!js.attr) { js.attr = {}; }
-							js.attr[s.type_attr] = vc[0]; 
-						}
-						else {
-							if($.inArray(js.attr[s.type_attr], vc) === -1) { return false; }
-						}
-					}
-					if(s.max_children !== -2 && mc !== -1) {
-						ch = p === -1 ? this.get_container().find("> ul > li").length : p.find("> ul > li").length;
-						if(ch + 1 > mc) { return false; }
-					}
-					if(s.max_depth !== -2 && md !== -1 && (md - 1) < 0) { return false; }
-				}
-				return this.__call_old(true, obj, position, js, callback, is_loaded, skip_check);
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/* 
- * jsTree HTML plugin
- * The HTML data store. Datastores are build by replacing the `load_node` and `_is_loaded` functions.
- */
-(function ($) {
-	$.jstree.plugin("html_data", {
-		__init : function () { 
-			// this used to use html() and clean the whitespace, but this way any attached data was lost
-			this.data.html_data.original_container_html = this.get_container().find(" > ul > li").clone(true);
-			// remove white space from LI node - otherwise nodes appear a bit to the right
-			this.data.html_data.original_container_html.find("li").andSelf().contents().filter(function() { return this.nodeType == 3; }).remove();
-		},
-		defaults : { 
-			data : false,
-			ajax : false,
-			correct_state : true
-		},
-		_fn : {
-			load_node : function (obj, s_call, e_call) { var _this = this; this.load_node_html(obj, function () { _this.__callback({ "obj" : _this._get_node(obj) }); s_call.call(this); }, e_call); },
-			_is_loaded : function (obj) { 
-				obj = this._get_node(obj); 
-				return obj == -1 || !obj || (!this._get_settings().html_data.ajax && !$.isFunction(this._get_settings().html_data.data)) || obj.is(".jstree-open, .jstree-leaf") || obj.children("ul").children("li").size() > 0;
-			},
-			load_node_html : function (obj, s_call, e_call) {
-				var d,
-					s = this.get_settings().html_data,
-					error_func = function () {},
-					success_func = function () {};
-				obj = this._get_node(obj);
-				if(obj && obj !== -1) {
-					if(obj.data("jstree-is-loading")) { return; }
-					else { obj.data("jstree-is-loading",true); }
-				}
-				switch(!0) {
-					case ($.isFunction(s.data)):
-						s.data.call(this, obj, $.proxy(function (d) {
-							if(d && d !== "" && d.toString && d.toString().replace(/^[\s\n]+$/,"") !== "") {
-								d = $(d);
-								if(!d.is("ul")) { d = $("<ul />").append(d); }
-								if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'> </ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
-								else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'> </ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree-is-loading"); }
-								this.clean_node(obj);
-								if(s_call) { s_call.call(this); }
-							}
-							else {
-								if(obj && obj !== -1) {
-									obj.children("a.jstree-loading").removeClass("jstree-loading");
-									obj.removeData("jstree-is-loading");
-									if(s.correct_state) { 
-										this.correct_state(obj);
-										if(s_call) { s_call.call(this); } 
-									}
-								}
-								else {
-									if(s.correct_state) { 
-										this.get_container().children("ul").empty();
-										if(s_call) { s_call.call(this); } 
-									}
-								}
-							}
-						}, this));
-						break;
-					case (!s.data && !s.ajax):
-						if(!obj || obj == -1) {
-							this.get_container()
-								.children("ul").empty()
-								.append(this.data.html_data.original_container_html)
-								.find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'> </ins>").end()
-								.filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
-							this.clean_node();
-						}
-						if(s_call) { s_call.call(this); }
-						break;
-					case (!!s.data && !s.ajax) || (!!s.data && !!s.ajax && (!obj || obj === -1)):
-						if(!obj || obj == -1) {
-							d = $(s.data);
-							if(!d.is("ul")) { d = $("<ul />").append(d); }
-							this.get_container()
-								.children("ul").empty().append(d.children())
-								.find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'> </ins>").end()
-								.filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon");
-							this.clean_node();
-						}
-						if(s_call) { s_call.call(this); }
-						break;
-					case (!s.data && !!s.ajax) || (!!s.data && !!s.ajax && obj && obj !== -1):
-						obj = this._get_node(obj);
-						error_func = function (x, t, e) {
-							var ef = this.get_settings().html_data.ajax.error; 
-							if(ef) { ef.call(this, x, t, e); }
-							if(obj != -1 && obj.length) {
-								obj.children("a.jstree-loading").removeClass("jstree-loading");
-								obj.removeData("jstree-is-loading");
-								if(t === "success" && s.correct_state) { this.correct_state(obj); }
-							}
-							else {
-								if(t === "success" && s.correct_state) { this.get_container().children("ul").empty(); }
-							}
-							if(e_call) { e_call.call(this); }
-						};
-						success_func = function (d, t, x) {
-							var sf = this.get_settings().html_data.ajax.success; 
-							if(sf) { d = sf.call(this,d,t,x) || d; }
-							if(d === "" || (d && d.toString && d.toString().replace(/^[\s\n]+$/,"") === "")) {
-								return error_func.call(this, x, t, "");
-							}
-							if(d) {
-								d = $(d);
-								if(!d.is("ul")) { d = $("<ul />").append(d); }
-								if(obj == -1 || !obj) { this.get_container().children("ul").empty().append(d.children()).find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'> </ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); }
-								else { obj.children("a.jstree-loading").removeClass("jstree-loading"); obj.append(d).children("ul").find("li, a").filter(function () { return !this.firstChild || !this.firstChild.tagName || this.firstChild.tagName !== "INS"; }).prepend("<ins class='jstree-icon'> </ins>").end().filter("a").children("ins:first-child").not(".jstree-icon").addClass("jstree-icon"); obj.removeData("jstree-is-loading"); }
-								this.clean_node(obj);
-								if(s_call) { s_call.call(this); }
-							}
-							else {
-								if(obj && obj !== -1) {
-									obj.children("a.jstree-loading").removeClass("jstree-loading");
-									obj.removeData("jstree-is-loading");
-									if(s.correct_state) { 
-										this.correct_state(obj);
-										if(s_call) { s_call.call(this); } 
-									}
-								}
-								else {
-									if(s.correct_state) { 
-										this.get_container().children("ul").empty();
-										if(s_call) { s_call.call(this); } 
-									}
-								}
-							}
-						};
-						s.ajax.context = this;
-						s.ajax.error = error_func;
-						s.ajax.success = success_func;
-						if(!s.ajax.dataType) { s.ajax.dataType = "html"; }
-						if($.isFunction(s.ajax.url)) { s.ajax.url = s.ajax.url.call(this, obj); }
-						if($.isFunction(s.ajax.data)) { s.ajax.data = s.ajax.data.call(this, obj); }
-						$.ajax(s.ajax);
-						break;
-				}
-			}
-		}
-	});
-	// include the HTML data plugin by default
-	$.jstree.defaults.plugins.push("html_data");
-})(jQuery);
-//*/
-
-/* 
- * jsTree themeroller plugin
- * Adds support for jQuery UI themes. Include this at the end of your plugins list, also make sure "themes" is not included.
- */
-(function ($) {
-	$.jstree.plugin("themeroller", {
-		__init : function () {
-			var s = this._get_settings().themeroller;
-			this.get_container()
-				.addClass("ui-widget-content")
-				.addClass("jstree-themeroller")
-				.delegate("a","mouseenter.jstree", function (e) {
-					if(!$(e.currentTarget).hasClass("jstree-loading")) {
-						$(this).addClass(s.item_h);
-					}
-				})
-				.delegate("a","mouseleave.jstree", function () {
-					$(this).removeClass(s.item_h);
-				})
-				.bind("init.jstree", $.proxy(function (e, data) { 
-						data.inst.get_container().find("> ul > li > .jstree-loading > ins").addClass("ui-icon-refresh");
-						this._themeroller(data.inst.get_container().find("> ul > li"));
-					}, this))
-				.bind("open_node.jstree create_node.jstree", $.proxy(function (e, data) { 
-						this._themeroller(data.rslt.obj);
-					}, this))
-				.bind("loaded.jstree refresh.jstree", $.proxy(function (e) {
-						this._themeroller();
-					}, this))
-				.bind("close_node.jstree", $.proxy(function (e, data) {
-						this._themeroller(data.rslt.obj);
-					}, this))
-				.bind("delete_node.jstree", $.proxy(function (e, data) {
-						this._themeroller(data.rslt.parent);
-					}, this))
-				.bind("correct_state.jstree", $.proxy(function (e, data) {
-						data.rslt.obj
-							.children("ins.jstree-icon").removeClass(s.opened + " " + s.closed + " ui-icon").end()
-							.find("> a > ins.ui-icon")
-								.filter(function() { 
-									return this.className.toString()
-										.replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
-										.indexOf("ui-icon-") === -1; 
-								}).removeClass(s.item_open + " " + s.item_clsd).addClass(s.item_leaf || "jstree-no-icon");
-					}, this))
-				.bind("select_node.jstree", $.proxy(function (e, data) {
-						data.rslt.obj.children("a").addClass(s.item_a);
-					}, this))
-				.bind("deselect_node.jstree deselect_all.jstree", $.proxy(function (e, data) {
-						this.get_container()
-							.find("a." + s.item_a).removeClass(s.item_a).end()
-							.find("a.jstree-clicked").addClass(s.item_a);
-					}, this))
-				.bind("dehover_node.jstree", $.proxy(function (e, data) {
-						data.rslt.obj.children("a").removeClass(s.item_h);
-					}, this))
-				.bind("hover_node.jstree", $.proxy(function (e, data) {
-						this.get_container()
-							.find("a." + s.item_h).not(data.rslt.obj).removeClass(s.item_h);
-						data.rslt.obj.children("a").addClass(s.item_h);
-					}, this))
-				.bind("move_node.jstree", $.proxy(function (e, data) {
-						this._themeroller(data.rslt.o);
-						this._themeroller(data.rslt.op);
-					}, this));
-		},
-		__destroy : function () {
-			var s = this._get_settings().themeroller,
-				c = [ "ui-icon" ];
-			$.each(s, function (i, v) {
-				v = v.split(" ");
-				if(v.length) { c = c.concat(v); }
-			});
-			this.get_container()
-				.removeClass("ui-widget-content")
-				.find("." + c.join(", .")).removeClass(c.join(" "));
-		},
-		_fn : {
-			_themeroller : function (obj) {
-				var s = this._get_settings().themeroller;
-				obj = !obj || obj == -1 ? this.get_container_ul() : this._get_node(obj).parent();
-				obj
-					.find("li.jstree-closed")
-						.children("ins.jstree-icon").removeClass(s.opened).addClass("ui-icon " + s.closed).end()
-						.children("a").addClass(s.item)
-							.children("ins.jstree-icon").addClass("ui-icon")
-								.filter(function() { 
-									return this.className.toString()
-										.replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
-										.indexOf("ui-icon-") === -1; 
-								}).removeClass(s.item_leaf + " " + s.item_open).addClass(s.item_clsd || "jstree-no-icon")
-								.end()
-							.end()
-						.end()
-					.end()
-					.find("li.jstree-open")
-						.children("ins.jstree-icon").removeClass(s.closed).addClass("ui-icon " + s.opened).end()
-						.children("a").addClass(s.item)
-							.children("ins.jstree-icon").addClass("ui-icon")
-								.filter(function() { 
-									return this.className.toString()
-										.replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
-										.indexOf("ui-icon-") === -1; 
-								}).removeClass(s.item_leaf + " " + s.item_clsd).addClass(s.item_open || "jstree-no-icon")
-								.end()
-							.end()
-						.end()
-					.end()
-					.find("li.jstree-leaf")
-						.children("ins.jstree-icon").removeClass(s.closed + " ui-icon " + s.opened).end()
-						.children("a").addClass(s.item)
-							.children("ins.jstree-icon").addClass("ui-icon")
-								.filter(function() { 
-									return this.className.toString()
-										.replace(s.item_clsd,"").replace(s.item_open,"").replace(s.item_leaf,"")
-										.indexOf("ui-icon-") === -1; 
-								}).removeClass(s.item_clsd + " " + s.item_open).addClass(s.item_leaf || "jstree-no-icon");
-			}
-		},
-		defaults : {
-			"opened"	: "ui-icon-triangle-1-se",
-			"closed"	: "ui-icon-triangle-1-e",
-			"item"		: "ui-state-default",
-			"item_h"	: "ui-state-hover",
-			"item_a"	: "ui-state-active",
-			"item_open"	: "ui-icon-folder-open",
-			"item_clsd"	: "ui-icon-folder-collapsed",
-			"item_leaf"	: "ui-icon-document"
-		}
-	});
-	$(function() {
-		var css_string = '' + 
-			'.jstree-themeroller .ui-icon { overflow:visible; } ' + 
-			'.jstree-themeroller a { padding:0 2px; } ' + 
-			'.jstree-themeroller .jstree-no-icon { display:none; }';
-		$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-	});
-})(jQuery);
-//*/
-
-/* 
- * jsTree unique plugin
- * Forces different names amongst siblings (still a bit experimental)
- * NOTE: does not check language versions (it will not be possible to have nodes with the same title, even in different languages)
- */
-(function ($) {
-	$.jstree.plugin("unique", {
-		__init : function () {
-			this.get_container()
-				.bind("before.jstree", $.proxy(function (e, data) { 
-						var nms = [], res = true, p, t;
-						if(data.func == "move_node") {
-							// obj, ref, position, is_copy, is_prepared, skip_check
-							if(data.args[4] === true) {
-								if(data.args[0].o && data.args[0].o.length) {
-									data.args[0].o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
-									res = this._check_unique(nms, data.args[0].np.find("> ul > li").not(data.args[0].o), "move_node");
-								}
-							}
-						}
-						if(data.func == "create_node") {
-							// obj, position, js, callback, is_loaded
-							if(data.args[4] || this._is_loaded(data.args[0])) {
-								p = this._get_node(data.args[0]);
-								if(data.args[1] && (data.args[1] === "before" || data.args[1] === "after")) {
-									p = this._get_parent(data.args[0]);
-									if(!p || p === -1) { p = this.get_container(); }
-								}
-								if(typeof data.args[2] === "string") { nms.push(data.args[2]); }
-								else if(!data.args[2] || !data.args[2].data) { nms.push(this._get_string("new_node")); }
-								else { nms.push(data.args[2].data); }
-								res = this._check_unique(nms, p.find("> ul > li"), "create_node");
-							}
-						}
-						if(data.func == "rename_node") {
-							// obj, val
-							nms.push(data.args[1]);
-							t = this._get_node(data.args[0]);
-							p = this._get_parent(t);
-							if(!p || p === -1) { p = this.get_container(); }
-							res = this._check_unique(nms, p.find("> ul > li").not(t), "rename_node");
-						}
-						if(!res) {
-							e.stopPropagation();
-							return false;
-						}
-					}, this));
-		},
-		defaults : { 
-			error_callback : $.noop
-		},
-		_fn : { 
-			_check_unique : function (nms, p, func) {
-				var cnms = [];
-				p.children("a").each(function () { cnms.push($(this).text().replace(/^\s+/g,"")); });
-				if(!cnms.length || !nms.length) { return true; }
-				cnms = cnms.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
-				if((cnms.length + nms.length) != cnms.concat(nms).sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",").length) {
-					this._get_settings().unique.error_callback.call(null, nms, p, func);
-					return false;
-				}
-				return true;
-			},
-			check_move : function () {
-				if(!this.__call_old()) { return false; }
-				var p = this._get_move(), nms = [];
-				if(p.o && p.o.length) {
-					p.o.children("a").each(function () { nms.push($(this).text().replace(/^\s+/g,"")); });
-					return this._check_unique(nms, p.np.find("> ul > li").not(p.o), "check_move");
-				}
-				return true;
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-/*
- * jsTree wholerow plugin
- * Makes select and hover work on the entire width of the node
- * MAY BE HEAVY IN LARGE DOM
- */
-(function ($) {
-	$.jstree.plugin("wholerow", {
-		__init : function () {
-			if(!this.data.ui) { throw "jsTree wholerow: jsTree UI plugin not included."; }
-			this.data.wholerow.html = false;
-			this.data.wholerow.to = false;
-			this.get_container()
-				.bind("init.jstree", $.proxy(function (e, data) { 
-						this._get_settings().core.animation = 0;
-					}, this))
-				.bind("open_node.jstree create_node.jstree clean_node.jstree loaded.jstree", $.proxy(function (e, data) { 
-						this._prepare_wholerow_span( data && data.rslt && data.rslt.obj ? data.rslt.obj : -1 );
-					}, this))
-				.bind("search.jstree clear_search.jstree reopen.jstree after_open.jstree after_close.jstree create_node.jstree delete_node.jstree clean_node.jstree", $.proxy(function (e, data) { 
-						if(this.data.to) { clearTimeout(this.data.to); }
-						this.data.to = setTimeout( (function (t, o) { return function() { t._prepare_wholerow_ul(o); }; })(this,  data && data.rslt && data.rslt.obj ? data.rslt.obj : -1), 0);
-					}, this))
-				.bind("deselect_all.jstree", $.proxy(function (e, data) { 
-						this.get_container().find(" > .jstree-wholerow .jstree-clicked").removeClass("jstree-clicked " + (this.data.themeroller ? this._get_settings().themeroller.item_a : "" ));
-					}, this))
-				.bind("select_node.jstree deselect_node.jstree ", $.proxy(function (e, data) { 
-						data.rslt.obj.each(function () { 
-							var ref = data.inst.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt((($(this).offset().top - data.inst.get_container().offset().top + data.inst.get_container()[0].scrollTop) / data.inst.data.core.li_height),10)) + ")");
-							// ref.children("a")[e.type === "select_node" ? "addClass" : "removeClass"]("jstree-clicked");
-							ref.children("a").attr("class",data.rslt.obj.children("a").attr("class"));
-						});
-					}, this))
-				.bind("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) { 
-						this.get_container().find(" > .jstree-wholerow .jstree-hovered").removeClass("jstree-hovered " + (this.data.themeroller ? this._get_settings().themeroller.item_h : "" ));
-						if(e.type === "hover_node") {
-							var ref = this.get_container().find(" > .jstree-wholerow li:visible:eq(" + ( parseInt(((data.rslt.obj.offset().top - this.get_container().offset().top + this.get_container()[0].scrollTop) / this.data.core.li_height),10)) + ")");
-							// ref.children("a").addClass("jstree-hovered");
-							ref.children("a").attr("class",data.rslt.obj.children(".jstree-hovered").attr("class"));
-						}
-					}, this))
-				.delegate(".jstree-wholerow-span, ins.jstree-icon, li", "click.jstree", function (e) {
-						var n = $(e.currentTarget);
-						if(e.target.tagName === "A" || (e.target.tagName === "INS" && n.closest("li").is(".jstree-open, .jstree-closed"))) { return; }
-						n.closest("li").children("a:visible:eq(0)").click();
-						e.stopImmediatePropagation();
-					})
-				.delegate("li", "mouseover.jstree", $.proxy(function (e) {
-						e.stopImmediatePropagation();
-						if($(e.currentTarget).children(".jstree-hovered, .jstree-clicked").length) { return false; }
-						this.hover_node(e.currentTarget);
-						return false;
-					}, this))
-				.delegate("li", "mouseleave.jstree", $.proxy(function (e) {
-						if($(e.currentTarget).children("a").hasClass("jstree-hovered").length) { return; }
-						this.dehover_node(e.currentTarget);
-					}, this));
-			if(is_ie7 || is_ie6) {
-				$.vakata.css.add_sheet({ str : ".jstree-" + this.get_index() + " { position:relative; } ", title : "jstree" });
-			}
-		},
-		defaults : {
-		},
-		__destroy : function () {
-			this.get_container().children(".jstree-wholerow").remove();
-			this.get_container().find(".jstree-wholerow-span").remove();
-		},
-		_fn : {
-			_prepare_wholerow_span : function (obj) {
-				obj = !obj || obj == -1 ? this.get_container().find("> ul > li") : this._get_node(obj);
-				if(obj === false) { return; } // added for removing root nodes
-				obj.each(function () {
-					$(this).find("li").andSelf().each(function () {
-						var $t = $(this);
-						if($t.children(".jstree-wholerow-span").length) { return true; }
-						$t.prepend("<span class='jstree-wholerow-span' style='width:" + ($t.parentsUntil(".jstree","li").length * 18) + "px;'> </span>");
-					});
-				});
-			},
-			_prepare_wholerow_ul : function () {
-				var o = this.get_container().children("ul").eq(0), h = o.html();
-				o.addClass("jstree-wholerow-real");
-				if(this.data.wholerow.last_html !== h) {
-					this.data.wholerow.last_html = h;
-					this.get_container().children(".jstree-wholerow").remove();
-					this.get_container().append(
-						o.clone().removeClass("jstree-wholerow-real")
-							.wrapAll("<div class='jstree-wholerow' />").parent()
-							.width(o.parent()[0].scrollWidth)
-							.css("top", (o.height() + ( is_ie7 ? 5 : 0)) * -1 )
-							.find("li[id]").each(function () { this.removeAttribute("id"); }).end()
-					);
-				}
-			}
-		}
-	});
-	$(function() {
-		var css_string = '' + 
-			'.jstree .jstree-wholerow-real { position:relative; z-index:1; } ' + 
-			'.jstree .jstree-wholerow-real li { cursor:pointer; } ' + 
-			'.jstree .jstree-wholerow-real a { border-left-color:transparent !important; border-right-color:transparent !important; } ' + 
-			'.jstree .jstree-wholerow { position:relative; z-index:0; height:0; } ' + 
-			'.jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { width:100%; } ' + 
-			'.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li, .jstree .jstree-wholerow a { margin:0 !important; padding:0 !important; } ' + 
-			'.jstree .jstree-wholerow, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow li { background:transparent !important; }' + 
-			'.jstree .jstree-wholerow ins, .jstree .jstree-wholerow span, .jstree .jstree-wholerow input { display:none !important; }' + 
-			'.jstree .jstree-wholerow a, .jstree .jstree-wholerow a:hover { text-indent:-9999px; !important; width:100%; padding:0 !important; border-right-width:0px !important; border-left-width:0px !important; } ' + 
-			'.jstree .jstree-wholerow-span { position:absolute; left:0; margin:0px; padding:0; height:18px; border-width:0; padding:0; z-index:0; }';
-		if(is_ff2) {
-			css_string += '' + 
-				'.jstree .jstree-wholerow a { display:block; height:18px; margin:0; padding:0; border:0; } ' + 
-				'.jstree .jstree-wholerow-real a { border-color:transparent !important; } ';
-		}
-		if(is_ie7 || is_ie6) {
-			css_string += '' + 
-				'.jstree .jstree-wholerow, .jstree .jstree-wholerow li, .jstree .jstree-wholerow ul, .jstree .jstree-wholerow a { margin:0; padding:0; line-height:18px; } ' + 
-				'.jstree .jstree-wholerow a { display:block; height:18px; line-height:18px; overflow:hidden; } ';
-		}
-		$.vakata.css.add_sheet({ str : css_string, title : "jstree" });
-	});
-})(jQuery);
-//*/
-
-/*
-* jsTree model plugin
-* This plugin gets jstree to use a class model to retrieve data, creating great dynamism
-*/
-(function ($) {
-	var nodeInterface = ["getChildren","getChildrenCount","getAttr","getName","getProps"],
-		validateInterface = function(obj, inter) {
-			var valid = true;
-			obj = obj || {};
-			inter = [].concat(inter);
-			$.each(inter, function (i, v) {
-				if(!$.isFunction(obj[v])) { valid = false; return false; }
-			});
-			return valid;
-		};
-	$.jstree.plugin("model", {
-		__init : function () {
-			if(!this.data.json_data) { throw "jsTree model: jsTree json_data plugin not included."; }
-			this._get_settings().json_data.data = function (n, b) {
-				var obj = (n == -1) ? this._get_settings().model.object : n.data("jstree_model");
-				if(!validateInterface(obj, nodeInterface)) { return b.call(null, false); }
-				if(this._get_settings().model.async) {
-					obj.getChildren($.proxy(function (data) {
-						this.model_done(data, b);
-					}, this));
-				}
-				else {
-					this.model_done(obj.getChildren(), b);
-				}
-			};
-		},
-		defaults : {
-			object : false,
-			id_prefix : false,
-			async : false
-		},
-		_fn : {
-			model_done : function (data, callback) {
-				var ret = [], 
-					s = this._get_settings(),
-					_this = this;
-
-				if(!$.isArray(data)) { data = [data]; }
-				$.each(data, function (i, nd) {
-					var r = nd.getProps() || {};
-					r.attr = nd.getAttr() || {};
-					if(nd.getChildrenCount()) { r.state = "closed"; }
-					r.data = nd.getName();
-					if(!$.isArray(r.data)) { r.data = [r.data]; }
-					if(_this.data.types && $.isFunction(nd.getType)) {
-						r.attr[s.types.type_attr] = nd.getType();
-					}
-					if(r.attr.id && s.model.id_prefix) { r.attr.id = s.model.id_prefix + r.attr.id; }
-					if(!r.metadata) { r.metadata = { }; }
-					r.metadata.jstree_model = nd;
-					ret.push(r);
-				});
-				callback.call(null, ret);
-			}
-		}
-	});
-})(jQuery);
-//*/
-
-})();
\ No newline at end of file
diff --git a/share/lua/http/js/ui.js b/share/lua/http/js/ui.js
deleted file mode 100644
index a404ef0ef8..0000000000
--- a/share/lua/http/js/ui.js
+++ /dev/null
@@ -1,118 +0,0 @@
-$(function () {
-    $("#seekSlider").slider({
-        range: "min",
-        value: 0,
-        min: 0,
-        max: 100,
-        start: function (event, ui) {
-            $("#seekSlider").data( 'clicked', true );
-        },
-        stop: function (event, ui) {
-            $("#currentTime").empty().append(format_time(Math.round((ui.value / 100) * $('#seekSlider').attr('totalLength'))));
-            switch (current_que) {
-            case 'main':
-                sendCommand({
-                    'command': 'seek',
-                    'val': (ui.value) + '%'
-                });
-                break;
-            case 'stream':
-                sendVLMCmd('control Current seek ' + ui.value);
-                break;
-            }
-            $("#seekSlider").data( 'clicked', false );
-        }
-    });
-    $("#volumeSlider").slider({
-        range: "min",
-        value: 50,
-        min: 0,
-        max: 100,
-        start: function (event, ui) {
-            $("#volumeSlider").data( 'clicked', true );
-        },
-        stop: function (event, ui) {
-            $("#currentVolume").empty().append(ui.value * 2 + "%");
-            sendCommand({
-                'command': 'volume',
-                'val': Math.round(ui.value * 5.12)
-            })
-            $("#volumeSlider").data( 'clicked', false );
-        }
-    });
-    /* To ensure that updateStatus() doesn't interfere while the user
-     * slides the controls. */
-    $("#seekSlider").data( 'clicked', false );
-    $("#volumeSlider").data( 'clicked', false );
-    $('#buttonStop').click(function () {
-        switch (current_que) {
-        case 'main':
-            sendCommand({
-                'command': 'pl_stop'
-            })
-            break;
-        case 'stream':
-            sendVLMCmd('control Current stop');
-            break;
-        }
-        return false;
-    });
-    $('#buttonPlay').click(function () {
-        if ($(this).attr('state') == 'stopped') {
-            switch (current_que) {
-            case 'main':
-                var id = $('.jstree-clicked', '#libraryTree').length > 0 ? $('.jstree-clicked', '#libraryTree').first().parents().first().attr('id').substr(5) : current_id;
-                sendCommand({
-                    'command': 'pl_play',
-                    'id': id
-                });
-                break;
-            case 'stream':
-                sendVLMCmd('control Current play');
-                flowplayer("player", "http://releases.flowplayer.org/swf/flowplayer-3.2.7.swf");
-                break;
-            }
-        } else {
-            switch (current_que) {
-            case 'main':
-                sendCommand({
-                    'command': 'pl_pause'
-                });
-                break;
-            case 'stream':
-                sendVLMCmd('control Current pause');
-                break;
-            }
-        }
-        return false;
-    });
-    $('#buttonFull').click(function () {
-        sendCommand({
-            'command': 'fullscreen'
-        });
-        return false;
-    });
-    $('#stream_host').val(stream_server);
-    $('#mobileintflink').click(function () {
-        if (   ( window.location.hostname == 'localhost' )
-            || ( window.location.hostname == '127.0.0.1' )
-            || ( window.location.hostname == '[::1]' ) )
-        {
-             return true;
-        }
-        var urlimg = location.href + 'mobile.html';
-        var codeimg = $('<img width="350" height="350" alt="qrcode"/>');
-        codeimg.attr('src', 'http://chart.apis.google.com/chart?cht=qr&chs=350x350&chld=L&choe=UTF-8&chl=' + encodeURIComponent(urlimg));
-        codeimg.dialog({width: 350, height: 350, title: 'QR-Code'});
-        return false;
-    });
-
-    $('.buttonszone').each(function(i){
-        $(this).mouseover(function(){
-            $(this).addClass('buttonszone_active');
-        }).mouseleave(function () {
-        $(this).removeClass('buttonszone_active');
-        });
-    });
-
-})
diff --git a/share/lua/http/mobile.html b/share/lua/http/mobile.html
deleted file mode 100644
index efac88c3ab..0000000000
--- a/share/lua/http/mobile.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<!--  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  mobile.html: VLC media player web interface - VLM
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  Copyright (C) 2005-2014 VLC authors and VideoLAN
-<  $Id$
-<
-<  Authors: Brandon Brooks <bwbrooks -at- archmageinc -dot- com>
-<
-<  This program is free software; you can redistribute it and/or modify
-<  it under the terms of the GNU General Public License as published by
-<  the Free Software Foundation; either version 2 of the License, or
-<  (at your option) any later version.
-<
-<  This program is distributed in the hope that it will be useful,
-<  but WITHOUT ANY WARRANTY; without even the implied warranty of
-<  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-<  GNU General Public License for more details.
-<
-<  You should have received a copy of the GNU General Public License
-<  along with this program; if not, write to the Free Software
-<  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<html>
-	<head>
-		<title><?vlc gettext("VLC media player - Web Interface") ?></title>
-		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-		<meta name="viewport" content="initial-scale=1.0" />
-		<meta name="viewport" content="width=device-width" />
-		<meta name="apple-mobile-web-app-status-bar-style" content="default" />
-		<link href="favicon.ico" type="image/x-icon" rel="shortcut icon" />
-		<script type="text/javascript" src="js/common.js"></script>
-		<link type="text/css" href="css/ui-lightness/jquery-ui-1.8.13.custom.css" rel="stylesheet" />
-		<link type="text/css" href="css/mobile.css" rel="stylesheet" />
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script>
-		<script type="text/javascript" src="js/jquery.jstree.js"></script>
-		<script type="text/javascript" src="http://releases.flowplayer.org/js/flowplayer-3.2.6.min.js"></script>
-		<script type="text/javascript" src="js/ui.js"></script>
-		<script type="text/javascript" src="js/controllers.js"></script>
-		<script type="text/javascript">
-			var pollStatus	=	true;
-			$(function(){
-				$('#buttonPrev').click(function(){
-					sendCommand({'command':'pl_previous'});
-					return false;
-				});
-				$('#buttonNext').click(function(){
-					sendCommand({'command':'pl_next'});
-					return false;
-				});
-				$('#buttonOpen').click(function(){
-					window.location='mobile_browse.html';
-				});
-				$('#buttonEQ').click(function(){
-					window.location='mobile_equalizer.html';
-				});
-				$('#buttonSout').click(function(){
-					var file			=	  decodeURIComponent($('#buttonPlay').attr('mrl'));
-					if(file){
-						var defaultStream	=	'new Current broadcast enabled input "'+file+'" output #transcode{vcodec=FLV1,vb=4096,fps=25,scale=1,acodec=mp3,ab=512,samplerate=44100,channels=2}:std{access='+$('#stream_protocol').val()+',mux=avformat{{mux=flv}},dst=0.0.0.0:'+$('#stream_port').val()+'/'+$('#stream_file').val()+'}';
-						sendVLMCmd('del Current;'+defaultStream+';control Current play','window.location="mobile_view.html"');
-					}
-					return false;
-				});
-                $('#buttonRewd').click(function(){
-                    sendCommand({'command': 'seek', 'val': '-30S'});
-                    return false;
-                });
-                $('#buttonFwrd').click(function(){
-                    sendCommand({'command': 'seek', 'val': '+30S'});
-                    return false;
-                });
-			})
-		</script>
-	</head>
-	<body>
-	<div id="content" class="centered">
-		<div id="art">
-			<img id="albumArt" src="/art" />
-		</div>
-		<div style="width:100%"><div id="mediaTitle" class="dynamic centered"></div></div>
-		<div id="play_controls">
-			<div id="buttons">
-				<div id="buttonPrev" class="button48  ui-corner-all" title="<?vlc gettext("Previous") ?>">
-				</div><div id="buttonRewd" class="button48  ui-corner-all" title="<?vlc gettext("Rewind") ?>">
-				</div><div id="buttonPlay" class="button48  ui-corner-all paused" title="<?vlc gettext("Play") ?>">
-				</div><div id="buttonStop" class="button48  ui-corner-all" title="<?vlc gettext("Stop") ?>">
-				</div><div id="buttonFwrd" class="button48  ui-corner-all" title="<?vlc gettext("Forward") ?>">
-				</div><div id="buttonNext" class="button48  ui-corner-all" title="<?vlc gettext("Next") ?>"></div>
-			</div>
-			<div id="seekSlider" title="Seek Time" style="font-size:15px;"></div>
-			<div id="currentTime" class="dynamic">00:00:00</div>
-			<div id="totalTime" class="dynamic">00:00:00</div>
-		</div>
-		<div id="controls">
-			<div id="buttons">
-				<div id="buttonOpen" class="button48  ui-corner-all" title="<?vlc gettext("Open Media") ?>">
-				</div><div id="buttonFull" class="button48  ui-corner-all" title="<?vlc gettext("Full Screen") ?>">
-				</div><div id="buttonEQ" class="button48 ui-corner-all" title="<?vlc gettext("Equalizer") ?>">
-				</div><div id="buttonSout" class="button48  ui-corner-all" title="<?vlc gettext("Easy Stream") ?>"></div>
-			</div>
-			<div id="volumeSlider" title="Volume" style="font-size:15px;">
-				<img src="images/speaker-32.png" class="ui-slider-handle" alt="volume"/>
-			</div>
-		</div>
-		<?vlc
-
-	dialogs("stream_config_window.html");
-	?>
-	</div>
-	</body>
-</html>
diff --git a/share/lua/http/mobile_browse.html b/share/lua/http/mobile_browse.html
deleted file mode 100644
index 51f65406c5..0000000000
--- a/share/lua/http/mobile_browse.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!--  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  mobile_browse.html: VLC media player web interface - VLM
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  Copyright (C) 2005-2014 VLC authors and VideoLAN
-<  $Id$
-<
-<  Authors: Brandon Brooks <bwbrooks -at- archmageinc -dot- com>
-<
-<  This program is free software; you can redistribute it and/or modify
-<  it under the terms of the GNU General Public License as published by
-<  the Free Software Foundation; either version 2 of the License, or
-<  (at your option) any later version.
-<
-<  This program is distributed in the hope that it will be useful,
-<  but WITHOUT ANY WARRANTY; without even the implied warranty of
-<  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-<  GNU General Public License for more details.
-<
-<  You should have received a copy of the GNU General Public License
-<  along with this program; if not, write to the Free Software
-<  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<html>
-	<head>
-		<title><?vlc gettext("VLC media player - Web Interface") ?></title>
-		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-		<meta name="viewport" content="width=device-width" />
-		<link href="favicon.ico" type="image/x-icon" rel="shortcut icon" />
-		<script type="text/javascript" src="js/common.js"></script>
-		<link type="text/css" href="css/ui-lightness/jquery-ui-1.8.13.custom.css" rel="stylesheet" />
-		<link type="text/css" href="css/main.css" rel="stylesheet" />
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script>
-		<script type="text/javascript" src="js/jquery.jstree.js"></script>
-		<script type="text/javascript" src="js/controllers.js"></script>
-		<script type="text/javascript">
-			var pollStatus			=	false;
-			var browse_target		=	'#mobile';
-			$(function(){
-				browse();
-			})
-		</script>
-	</head>
-	<body>
-		<div id="window_browse" title="<?vlc gettext("Media Browser") ?>">
-			<div>
-				<ol id='browse_elements' selectable="selectable">
-					<li><?vlc gettext("Play List") ?></li>
-				</ol>
-			</div>
-		</div>
-	</body>
-</html>
diff --git a/share/lua/http/mobile_equalizer.html b/share/lua/http/mobile_equalizer.html
deleted file mode 100644
index 7341109bce..0000000000
--- a/share/lua/http/mobile_equalizer.html
+++ /dev/null
@@ -1,69 +0,0 @@
-<!--  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  mobile_equalizer.html: VLC media player web interface - VLM
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  Copyright (C) 2005-2006 the VideoLAN team
-<  $Id$
-<
-<  Authors: Brandon Brooks <bwbrooks -at- archmageinc -dot- com>
-<
-<  This program is free software; you can redistribute it and/or modify
-<  it under the terms of the GNU General Public License as published by
-<  the Free Software Foundation; either version 2 of the License, or
-<  (at your option) any later version.
-<
-<  This program is distributed in the hope that it will be useful,
-<  but WITHOUT ANY WARRANTY; without even the implied warranty of
-<  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-<  GNU General Public License for more details.
-<
-<  You should have received a copy of the GNU General Public License
-<  along with this program; if not, write to the Free Software
-<  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<html>
-	<head>
-		<title><?vlc gettext("VLC media player - Web Interface") ?></title>
-		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-		<meta name="viewport" content="width=device-width; user-scalable=no" />
-		<link href="favicon.ico" type="image/x-icon" rel="shortcut icon" />
-		<script type="text/javascript" src="js/common.js"></script>
-		<link type="text/css" href="css/ui-lightness/jquery-ui-1.8.13.custom.css" rel="stylesheet" />
-		<link type="text/css" href="css/main.css" rel="stylesheet" />
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script>
-		<script type="text/javascript" src="js/jquery.jstree.js"></script>
-		<script type="text/javascript" src="js/controllers.js"></script>
-		<script type="text/javascript">
-			var pollStatus	=	false;
-			$(function(){
-				$('#preamp').slider({
-					min: -20,
-					max: 20,
-					step: 0.1,
-					range: "min",
-					animate: true,
-					stop: function(event,ui){
-						$('#preamp_txt').empty().append(ui.value+'dB');
-						sendEQCmd({
-							command:'preamp',
-							val: ui.value
-						})
-					},
-					slide: function(event,ui){
-						$('#preamp_txt').empty().append(ui.value+'dB');
-					}
-				});
-			});
-		</script>
-	</head>
-	<body>
-		<div id="window_equalizer" title="<?vlc gettext("Graphical Equalizer") ?>">
-			<div style="margin: 5px 5px 5px 5px;">
-				<div><?vlc gettext("Preamp:") ?> <span id="preamp_txt">0dB</span></div>
-			</div>
-			<div style="margin: 5px 5px 10px 5px;">
-				<div id="preamp" style="font-size: 22px;"></div>
-			</div>
-		</div>
-	</body>
-</html>
diff --git a/share/lua/http/mobile_view.html b/share/lua/http/mobile_view.html
deleted file mode 100644
index f7660e31ae..0000000000
--- a/share/lua/http/mobile_view.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!--  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  mobile_view.html: VLC media player web interface - VLM
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  Copyright (C) 2005-2014 VLC authors and VideoLAN
-<  $Id$
-<
-<  Authors: Brandon Brooks <bwbrooks -at- archmageinc -dot- com>
-<
-<  This program is free software; you can redistribute it and/or modify
-<  it under the terms of the GNU General Public License as published by
-<  the Free Software Foundation; either version 2 of the License, or
-<  (at your option) any later version.
-<
-<  This program is distributed in the hope that it will be useful,
-<  but WITHOUT ANY WARRANTY; without even the implied warranty of
-<  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-<  GNU General Public License for more details.
-<
-<  You should have received a copy of the GNU General Public License
-<  along with this program; if not, write to the Free Software
-<  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<html>
-	<head>
-		<title><?vlc gettext("VLC media player - Web Interface") ?></title>
-		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-		<meta name="viewport" content="width=device-width; user-scalable=no" />
-		<link href="favicon.ico" type="image/x-icon" rel="shortcut icon"/>
-		<script type="text/javascript" src="js/common.js"></script>
-		<link type="text/css" href="css/ui-lightness/jquery-ui-1.8.13.custom.css" rel="stylesheet" />
-		<link type="text/css" href="css/main.css" rel="stylesheet" />
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
-		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script>
-		<script type="text/javascript" src="js/jquery.jstree.js"></script>
-		<script type="text/javascript" src="js/controllers.js"></script>
-		<script type="text/javascript" src="js/ui.js"></script>
-		<script type="text/javascript">
-			var pollStatus	=	false;
-			/* delay script loading so we won't block if we have no net access */
-			$.getScript('http://releases.flowplayer.org/js/flowplayer-3.2.6.min.js', function(data, textStatus){
-				$('#player').empty();
-				$('#player').attr('href',$('#stream_protocol').val()+'://'+$('#stream_host').val()+':'+$('#stream_port').val()+'/'+$('#stream_file').val());
-				flowplayer("player", "http://releases.flowplayer.org/swf/flowplayer-3.2.7.swf");
-				/* .getScript only handles success() */
-			});
-		</script>
-	</head>
-	<body>
-		<div id="player" style="width:100%;height:100%">
-
-		</div>
-		<?vlc
-			dialogs("stream_config_window.html");
-		?>
-	</body>
-</html>
diff --git a/share/lua/http/src/components/controls/filebrowser.component.html b/share/lua/http/src/components/controls/filebrowser.component.html
new file mode 100644
index 0000000000..c1baa75181
--- /dev/null
+++ b/share/lua/http/src/components/controls/filebrowser.component.html
@@ -0,0 +1,18 @@
+<!-- file modal Template -->
+<script type="text/x-template" id="file-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Select your file</h4>
+                </div>
+                <div class="modal-body" id="file-tree">
+                </div>
+                <div class="modal-footer">
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
diff --git a/share/lua/http/src/components/controls/filebrowser.component.js b/share/lua/http/src/components/controls/filebrowser.component.js
new file mode 100644
index 0000000000..a156042176
--- /dev/null
+++ b/share/lua/http/src/components/controls/filebrowser.component.js
@@ -0,0 +1,83 @@
+import { notifyBus } from '../../services/bus.service.js';
+import { VIDEO_TYPES, AUDIO_TYPES, PLAYLIST_TYPES } from '../../services/initialize.service.js';
+
+Vue.component('file-modal', {
+    template: '#file-modal-template',
+    methods: {
+        populateTree() {
+            $('#file-tree').jstree({
+                core: {
+                    multiple: false,
+                    animation: 100,
+                    check_callback: true,
+                    html_titles: true,
+                    load_open: true,
+                    themes: {
+                        variant: 'medium',
+                        dots: false
+                    },
+                    data: {
+                        url: (node) => {
+                            if (node.id === '#') {
+                                return 'requests/browse.json?dir=/';
+                            }
+                            return `requests/browse.json?dir=/${node.data.path}`;
+                        },
+                        dataType: 'json',
+                        dataFilter(rawData) {
+                            const data = JSON.parse(rawData);
+                            const result = data.element.map((d) => {
+                                const res = {
+                                    text: d.name,
+                                    data: {
+                                        path: d.path,
+                                        uri: d.uri,
+                                        type: d.type
+                                    },
+                                    type: d.type,
+                                    children: true
+                                };
+                                if (d.type === 'file') {
+                                    res.children = false;
+                                }
+                                return res;
+                            });
+                            return JSON.stringify(result);
+                        }
+                    }
+                },
+                types: {
+                    '#': {
+                        valid_children: ['root']
+                    },
+                    root: {
+                        valid_children: ['default']
+                    },
+                    default: {
+                        valid_children: ['default', 'file']
+                    }
+                },
+                plugins: [
+                    'themes',
+                    'json_data',
+                    'ui',
+                    'cookies',
+                    'crrm',
+                    'sort',
+                    'types'
+                ]
+            });
+
+            $('#file-tree').on('select_node.jstree', (e, data) => {
+                node = data.instance.get_node(data.selected[0]);
+                ext = (node.data.uri).substr(node.data.uri.lastIndexOf('.') + 1).toLowerCase();
+                if (node.data.type === 'file' && ($.inArray(ext, VIDEO_TYPES) !== -1 || $.inArray(ext, AUDIO_TYPES) !== -1 || $.inArray(ext, PLAYLIST_TYPES) !== -1)) {
+                    notifyBus('addItem', [1, '', node.data.uri,node.data.uri]);
+                }
+            }).jstree();
+        }
+    },
+    mounted() {
+        this.populateTree();
+    }
+});
diff --git a/share/lua/http/src/components/controls/sidenav.component.html b/share/lua/http/src/components/controls/sidenav.component.html
new file mode 100644
index 0000000000..acc5eca71c
--- /dev/null
+++ b/share/lua/http/src/components/controls/sidenav.component.html
@@ -0,0 +1,31 @@
+<!-- sideNav Template -->
+<script type="text/x-template" id="sidenav-template">
+    <div>
+        <div id="sideNav" class="sideNav">
+            <a href="javascript:void(0)" class="closebtn" id="closeNavButton">
+                Menu
+            </a>
+            <a href="#" data-toggle="modal" data-target="#fileModal">
+                Open File
+            </a>
+            <a href="#">
+                Local Network
+            </a>
+            <a href="#">
+                Podcast
+            </a>
+            <a href="#" data-toggle="modal" data-target="#streamManagerModal">
+                Manage Streams
+            </a>
+            <a href="#" data-toggle="modal" data-target="#trackSyncModal">
+                Track Synchronization
+            </a>
+            <a href="#" data-toggle="modal" data-target="#vlmModal">
+                VLM Batch Commands
+            </a>
+        </div>
+        <span id="openNavButton">
+            <svg-icon name="menu"></svg-icon>
+        </span>
+    </div>
+</script>
diff --git a/share/lua/http/src/components/controls/sidenav.component.js b/share/lua/http/src/components/controls/sidenav.component.js
new file mode 100644
index 0000000000..878388a3c9
--- /dev/null
+++ b/share/lua/http/src/components/controls/sidenav.component.js
@@ -0,0 +1,26 @@
+import { bus } from '../../services/bus.service.js';
+
+Vue.component('sidenav', {
+    template: '#sidenav-template',
+    methods: {
+        openNav() {
+            if (window.screen.width <= 480) {
+                $('#sideNav').width('60%');
+            } else {
+                $('#sideNav').width('20%');
+            }
+        },
+        closeNav() {
+            $('#sideNav').width('0');
+        }
+    },
+    created() {
+        bus.$on('openNav', () => {
+            this.openNav();
+        });
+
+        bus.$on('closeNav', () => {
+            this.closeNav();
+        });
+    }
+});
diff --git a/share/lua/http/src/components/controls/sidenav.component.scss b/share/lua/http/src/components/controls/sidenav.component.scss
new file mode 100644
index 0000000000..fc7e7d7b13
--- /dev/null
+++ b/share/lua/http/src/components/controls/sidenav.component.scss
@@ -0,0 +1,50 @@
+/* The side navigation menu */
+.sideNav {
+    height: 100%;
+    width: 0;
+    position: fixed;
+    z-index: 5;
+    top: 0;
+    left: 0;
+    background-color: orange;
+    overflow-x: hidden;
+    padding-top: 60px;
+    transition: 0.5s;
+}
+
+/* The navigation menu links */
+.sideNav a {
+    padding: 8px 8px 8px 32px;
+    text-decoration: none;
+    font-size: 25px;
+    color: #111;
+    display: block;
+    transition: 0.3s
+}
+
+/* When you mouse over the navigation links, change their color */
+.sideNav a:hover, .offcanvas a:focus{
+    color: #f1f1f1;
+}
+
+/* Position and style the close button (top right corner) */
+.sideNav .closebtn {
+    position: absolute;
+    top: 0;
+    font-size: 36px;
+}
+
+.sideNav .closespn {
+    font-size: 36px;
+    margin-left: 60%;
+}
+
+/* On smaller screens, where height is less than 450px, change the style of the sidenav (less padding and a smaller font size) */
+ at media screen and (max-height: 450px) {
+    .sideNav {padding-top: 15px;}
+    .sideNav a {font-size: 18px;}
+}
+
+#openNavButton{
+   color: orange;
+}
diff --git a/share/lua/http/src/components/equalizer/equalizer.component.html b/share/lua/http/src/components/equalizer/equalizer.component.html
new file mode 100644
index 0000000000..9ab4ffda7b
--- /dev/null
+++ b/share/lua/http/src/components/equalizer/equalizer.component.html
@@ -0,0 +1,20 @@
+<!-- equalizer modal Template -->
+<script type="text/x-template" id="equalizer-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Equalizer</h4>
+                </div>
+                <div class="modal-body">
+                    <input type="range" name="equalizerInput" id="equalizerInput" min="-20" max="20" step="0.1"/>
+                    <center id="eqVal">{{ eqVal }}</center>
+                </div>
+                <div class="modal-footer">
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
diff --git a/share/lua/http/src/components/equalizer/equalizer.component.js b/share/lua/http/src/components/equalizer/equalizer.component.js
new file mode 100644
index 0000000000..bee7545614
--- /dev/null
+++ b/share/lua/http/src/components/equalizer/equalizer.component.js
@@ -0,0 +1,22 @@
+const data = {
+    eqVal: 0
+};
+
+Vue.component('equalizer-modal', {
+    template: '#equalizer-modal-template',
+    data() {
+        return data;
+    },
+    methods: {
+        handleEvents() {
+            const equalizerElement = $('#equalizerInput');
+            data.eqVal = equalizerElement[0].value;
+            equalizerElement.on('input', (e) => {
+                data.eqVal = e.currentTarget.value;
+            });
+        }
+    },
+    mounted() {
+        this.handleEvents();
+    }
+});
diff --git a/share/lua/http/src/components/player/player.component.scss b/share/lua/http/src/components/player/player.component.scss
new file mode 100644
index 0000000000..753348e9c7
--- /dev/null
+++ b/share/lua/http/src/components/player/player.component.scss
@@ -0,0 +1,19 @@
+#videoPlayer {
+    padding-right: 12%;
+    padding-left: 2%;
+    left:0;
+    top:0;
+    margin:0;
+    width:90%;
+}
+
+ at media screen and (min-device-width: 320px) and (max-device-width: 480px) {
+    #videoPlayer {
+        padding-right: 12%;
+        padding-left: 2%;
+        top: initial;
+        left: initial;
+        margin:0 auto;
+        width:100%;
+    }
+}
diff --git a/share/lua/http/src/components/player/plyr.lib.custom.scss b/share/lua/http/src/components/player/plyr.lib.custom.scss
new file mode 100644
index 0000000000..931e45c46b
--- /dev/null
+++ b/share/lua/http/src/components/player/plyr.lib.custom.scss
@@ -0,0 +1,758 @@
+// ==========================================================================
+// Plyr styles
+// https://github.com/selz/plyr
+// ==========================================================================
+
+ at import "plyr.lib.vars.scss";
+ at import "../../scss/mixins.util.scss";
+
+// Animation
+// ---------------------------------------
+ at keyframes plyr-progress {
+    to { background-position: $plyr-progress-loading-size 0; }
+}
+
+// Styles
+// -------------------------------
+// Base
+.plyr {
+    position: relative;
+    max-width: 100%;
+    min-width: 200px;
+    font-family: $plyr-font-family;
+    direction: ltr;
+
+    @if $plyr-border-box == true {
+        // border-box everything
+        // http://paulirish.com/2012/box-sizing-border-box-ftw/
+        &,
+        *,
+        *::after,
+        *::before {
+            box-sizing: border-box;
+        }
+    }
+
+    @if $plyr-touch-action == true {
+      // Fix 300ms delay
+      a, button, input, label {
+        touch-action: manipulation;
+      }
+    }
+
+    // Focus
+    &:focus {
+        outline: 0;
+    }
+
+    // Media elements
+    video,
+    audio {
+        width: 100%;
+        height: auto;
+        vertical-align: middle;
+        border-radius: inherit;
+    }
+
+    // Range inputs
+    // Specificity is for bootstrap compatibility
+    input[type='range'] {
+        display: block;
+        height: ($plyr-range-thumb-height * $plyr-range-thumb-active-scale);
+        width: 100%;
+        margin: 0;
+        padding: 0;
+        vertical-align: middle;
+
+        @include prefix(appearance, none);
+        cursor: pointer;
+        border: none;
+        background: transparent;
+
+        // WebKit
+        &::-webkit-slider-runnable-track {
+            @include plyr-range-track();
+        }
+        &::-webkit-slider-thumb {
+            @include prefix(appearance, none);
+            margin-top: -(($plyr-range-thumb-height - $plyr-range-track-height) / 2);
+            @include plyr-range-thumb();
+        }
+
+        // Mozilla
+        &::-moz-range-track {
+            @include plyr-range-track();
+        }
+        &::-moz-range-thumb {
+            @include plyr-range-thumb();
+        }
+
+        // Microsoft
+        &::-ms-track {
+            height: $plyr-range-track-height;
+            background: transparent;
+            border: 0;
+            color: transparent;
+        }
+        &::-ms-fill-upper {
+            @include plyr-range-track();
+        }
+        &::-ms-fill-lower {
+            @include plyr-range-track();
+            background: $plyr-range-selected-bg;
+        }
+        &::-ms-thumb {
+            @include plyr-range-thumb();
+            // For some reason, Edge uses the -webkit margin above
+            margin-top: 0;
+        }
+        &::-ms-tooltip {
+            display: none;
+        }
+
+        // Focus styles
+        &:focus {
+            outline: 0;
+        }
+        &::-moz-focus-outer {
+            border: 0;
+        }
+        &.tab-focus:focus {
+            outline-offset: 3px;
+        }
+
+        // Pressed styles
+        &:active {
+            &::-webkit-slider-thumb {
+                @include plyr-range-thumb-active();
+            }
+            &::-moz-range-thumb {
+                @include plyr-range-thumb-active();
+            }
+            &::-ms-thumb {
+                @include plyr-range-thumb-active();
+            }
+        }
+    }
+}
+
+// Video range inputs
+.plyr--video input[type='range'].tab-focus:focus {
+    outline: 1px dotted transparentize($plyr-video-control-color, .5);
+}
+
+// Audio range inputs
+.plyr--audio input[type='range'].tab-focus:focus {
+    outline: 1px dotted transparentize($plyr-audio-control-color, .5);
+}
+
+// Screen reader only elements
+.plyr__sr-only {
+    clip: rect(1px, 1px, 1px, 1px);
+    overflow: hidden;
+
+    // !important is not always needed
+    @if $plyr-sr-only-important == true {
+        position: absolute !important;
+        padding: 0 !important;
+        border: 0 !important;
+        height: 1px !important;
+        width: 1px !important;
+    } @else {
+        position: absolute;
+        padding: 0;
+        border: 0;
+        height: 1px;
+        width: 1px;
+    }
+}
+
+// Video
+.plyr__video-wrapper {
+    position: relative;
+    background: #000;
+    border-radius: inherit;
+}
+
+// Container for embeds
+.plyr__video-embed {
+    padding-bottom: 56.25%; /* 16:9 */
+    height: 0;
+    border-radius: inherit;
+
+    // Require overflow and z-index to force border-radius
+    overflow: hidden;
+    z-index: 0;
+
+    iframe {
+        position: absolute;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        border: 0;
+        user-select: none;
+    }
+
+    // Vimeo hack
+    > div {
+        position: relative;
+        padding-bottom: 200%;
+        @include prefix(transform, translateY(-35.95%));
+    }
+}
+// To allow mouse events to be captured if full support
+.plyr .plyr__video-embed iframe {
+    pointer-events: none;
+}
+
+// Captions
+// --------------------------------------------------------------
+// Hide default captions
+.plyr video::-webkit-media-text-track-container {
+    display: none;
+}
+.plyr__captions {
+    display: none;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    padding: ($plyr-control-spacing * 2);
+    @include prefix(transform, translateY(-($plyr-control-spacing * 6)));
+    transition: transform .3s ease;
+    color: $plyr-captions-color;
+    font-size: $plyr-font-size-captions-base;
+    text-align: center;
+    font-weight: 400;
+
+    span {
+        border-radius: 2px;
+        padding: floor($plyr-control-spacing / 3) $plyr-control-spacing;
+        background: $plyr-captions-bg;
+        box-decoration-break: clone;
+        line-height: 150%;
+    }
+    span:empty {
+        display: none;
+    }
+
+    @media (min-width: $plyr-bp-screen-md) {
+        font-size: $plyr-font-size-captions-medium;
+    }
+}
+.plyr--captions-active .plyr__captions {
+    display: block;
+}
+.plyr--hide-controls .plyr__captions {
+    @include prefix(transform, translateY(-($plyr-control-spacing * 2)));
+}
+// Large captions in full screen on larger screens
+ at media (min-width: $plyr-bp-screen-lg) {
+    .plyr--fullscreen-active .plyr__captions {
+        font-size: $plyr-font-size-captions-large;
+    }
+}
+
+// Controls
+// --------------------------------------------------------------
+// Hide native controls
+.plyr ::-webkit-media-controls {
+    display: none;
+}
+
+// Playback controls
+.plyr__controls {
+    display: flex;
+    align-items: center;
+    line-height: 1;
+    text-align: center;
+
+    // Spacing
+    > button,
+    .plyr__progress,
+    .plyr__time {
+        margin-left: ($plyr-control-spacing / 2);
+
+        &:first-child {
+            margin-left: 0;
+        }
+    }
+    .plyr__volume {
+        margin-left: ($plyr-control-spacing / 2);
+    }
+    [data-plyr="pause"] {
+        margin-left: 0;
+    }
+
+    // Buttons
+    button {
+        position: relative;
+        display: inline-block;
+        flex-shrink: 0;
+        overflow: visible; // IE11
+        vertical-align: middle;
+        padding: ($plyr-control-spacing * .7);
+        border: 0;
+        background: transparent;
+        border-radius: 3px;
+        cursor: pointer;
+        transition: background .3s ease, color .3s ease, opacity .3s ease;
+        color: inherit;
+
+        svg {
+            width: $plyr-control-icon-size;
+            height: $plyr-control-icon-size;
+            display: block;
+            fill: currentColor;
+        }
+
+        // Default focus
+        &:focus {
+            outline: 0;
+        }
+    }
+
+    // Hide toggle icons by default
+    .icon--exit-fullscreen,
+    .icon--muted,
+    .icon--captions-on {
+        display: none;
+    }
+
+    @media (min-width: $plyr-bp-screen-sm) {
+        > button,
+        .plyr__progress,
+        .plyr__time {
+            margin-left: $plyr-control-spacing;
+        }
+    }
+}
+// Hide controls
+.plyr--hide-controls .plyr__controls {
+    opacity: 0;
+    pointer-events: none;
+}
+
+// Video controls
+.plyr--video .plyr__controls {
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    padding: ($plyr-control-spacing * 5) $plyr-control-spacing $plyr-control-spacing;
+    background: linear-gradient(transparentize($plyr-video-controls-bg, 1), transparentize($plyr-video-controls-bg, .5));
+    border-bottom-left-radius: inherit;
+    border-bottom-right-radius: inherit;
+    color: $plyr-video-control-color;
+    transition: opacity .3s ease;
+
+    button {
+        // Hover and tab focus
+        &.tab-focus:focus,
+        &:hover {
+            background: $plyr-video-control-bg-hover;
+            color: $plyr-video-control-color-hover;
+        }
+    }
+}
+
+// Audio controls
+.plyr--audio .plyr__controls {
+    padding: $plyr-control-spacing;
+    border-radius: inherit;
+    background: $plyr-audio-controls-bg;
+    border: $plyr-audio-controls-border;
+    color: $plyr-audio-control-color;
+
+    button {
+        // Hover and tab focus
+        &.tab-focus:focus,
+        &:hover {
+            background: $plyr-audio-control-bg-hover;
+            color: $plyr-audio-control-color-hover;
+        }
+    }
+}
+
+// Large play button (video only)
+.plyr__play-large {
+    display: none;
+    position: absolute;
+    z-index: 1;
+    top: 50%;
+    left: 50%;
+    @include prefix(transform, translate(-50%, -50%));
+    padding: $plyr-control-spacing;
+    background: $plyr-video-control-bg-hover;
+    border: 4px solid currentColor;
+    border-radius: 100%;
+    box-shadow: 0 1px 1px transparentize(#000, .85);
+    color: $plyr-video-control-color;
+    transition: all .3s ease;
+
+    svg {
+        position: relative;
+        left: 2px;
+        width: 20px;
+        height: 20px;
+        display: block;
+        fill: currentColor;
+    }
+
+    &:focus {
+        outline: 1px dotted transparentize($plyr-video-control-color, .5);
+    }
+}
+.plyr .plyr__play-large {
+    display: inline-block;
+}
+.plyr--audio .plyr__play-large {
+    display: none;
+}
+.plyr--playing .plyr__play-large {
+    opacity: 0;
+    visibility: hidden;
+}
+
+// States
+.plyr__controls [data-plyr='pause'],
+.plyr--playing .plyr__controls [data-plyr='play'] {
+    display: none;
+}
+.plyr--playing .plyr__controls [data-plyr='pause'] {
+    display: inline-block;
+}
+
+// Change icons on state change
+.plyr--fullscreen-active .icon--exit-fullscreen,
+.plyr--muted .plyr__controls .icon--muted,
+.plyr--captions-active .plyr__controls .icon--captions-on {
+    display: block;
+
+    & + svg {
+        display: none;
+    }
+}
+
+// Some options are hidden by default
+.plyr [data-plyr='captions'],
+.plyr [data-plyr='fullscreen'] {
+    display: none;
+}
+.plyr--captions-enabled [data-plyr='captions'],
+.plyr--fullscreen-enabled [data-plyr='fullscreen'] {
+    display: inline-block;
+}
+
+// Tooltips
+// --------------------------------------------------------------
+.plyr__tooltip {
+    position: absolute;
+    z-index: 2;
+    bottom: 100%;
+    margin-bottom: ($plyr-tooltip-padding * 2);
+    padding: $plyr-tooltip-padding ($plyr-tooltip-padding * 1.5);
+    pointer-events: none;
+
+    opacity: 0;
+    background: $plyr-tooltip-bg;
+    border-radius: $plyr-tooltip-radius;
+
+    color: $plyr-tooltip-color;
+    font-size: $plyr-font-size-small;
+    line-height: 1.3;
+
+    @include prefix(transform, translate(-50%, 10px) scale(.8));
+    transform-origin: 50% 100%;
+    transition: transform .2s .1s ease, opacity .2s .1s ease;
+
+    &::before {
+        // Arrows
+        content: '';
+        position: absolute;
+        width: 0;
+        height: 0;
+        left: 50%;
+        @include prefix(transform, translateX(-50%));
+
+        // The background triangle
+        bottom: -$plyr-tooltip-arrow-size;
+        border-right: $plyr-tooltip-arrow-size solid transparent;
+        border-top: $plyr-tooltip-arrow-size solid $plyr-tooltip-bg;
+        border-left: $plyr-tooltip-arrow-size solid transparent;
+        z-index: 2;
+    }
+}
+.plyr button:hover .plyr__tooltip,
+.plyr button.tab-focus:focus .plyr__tooltip,
+.plyr__tooltip--visible {
+    opacity: 1;
+    @include prefix(transform, translate(-50%, 0) scale(1));
+}
+.plyr button:hover .plyr__tooltip {
+    z-index: 3;
+}
+
+// First tooltip
+.plyr__controls button:first-child .plyr__tooltip {
+    left: 0;
+    @include prefix(transform, translate(0, 10px) scale(.8));
+    transform-origin: 0 100%;
+
+    &::before {
+        left: ($plyr-control-icon-size / 2) + $plyr-control-padding;
+    }
+}
+
+// Last tooltip
+.plyr__controls button:last-child .plyr__tooltip {
+    right: 0;
+    @include prefix(transform, translate(0, 10px) scale(.8));
+    transform-origin: 100% 100%;
+
+    &::before {
+        left: auto;
+        right: ($plyr-control-icon-size / 2) + $plyr-control-padding;
+        @include prefix(transform, translateX(50%));
+    }
+}
+
+.plyr__controls button:first-child,
+.plyr__controls button:last-child {
+    &:hover .plyr__tooltip,
+    &.tab-focus:focus .plyr__tooltip,
+    .plyr__tooltip--visible {
+        @include prefix(transform, translate(0, 0) scale(1));
+    }
+}
+
+// Playback progress
+// --------------------------------------------------------------
+// <progress> element
+.plyr__progress {
+    display: none;
+    position: relative;
+    flex: 1;
+
+    input[type="range"] {
+        position: relative;
+        z-index: 2;
+
+        &::-webkit-slider-runnable-track {
+            background: transparent;
+        }
+        &::-moz-range-track {
+            background: transparent;
+        }
+        &::-ms-fill-upper {
+            background: transparent;
+        }
+    }
+
+    // Seek tooltip to show time
+    .plyr__tooltip {
+        left: 0;
+    }
+}
+.plyr .plyr__progress {
+    display: inline-block;
+}
+
+.plyr__progress--buffer,
+.plyr__progress--played,
+.plyr__volume--display {
+    position: absolute;
+    left: 0;
+    top: 50%;
+    width: 100%;
+    height: $plyr-range-track-height;
+    margin: -($plyr-range-track-height / 2) 0 0;
+    padding: 0;
+    vertical-align: top;
+    @include prefix(appearance, none);
+    border: none;
+    border-radius: 100px;
+
+    &::-webkit-progress-bar {
+        background: transparent;
+    }
+    &::-webkit-progress-value {
+        background: currentColor;
+        border-radius: 100px;
+        min-width: $plyr-range-track-height;
+    }
+    &::-moz-progress-bar {
+        background: currentColor;
+        border-radius: 100px;
+        min-width: $plyr-range-track-height;
+    }
+    &::-ms-fill {
+        border-radius: 100px;
+    }
+}
+.plyr__progress--played,
+.plyr__volume--display {
+    z-index: 1;
+    color: $plyr-range-selected-bg;
+    background: transparent;
+    transition: none;
+
+    &::-webkit-progress-value {
+        min-width: $plyr-range-track-height;
+        max-width: 99%;
+        border-top-right-radius: 0;
+        border-bottom-right-radius: 0;
+        transition: none;
+    }
+    &::-moz-progress-bar {
+        min-width: $plyr-range-track-height;
+        max-width: 99%;
+        border-top-right-radius: 0;
+        border-bottom-right-radius: 0;
+        transition: none;
+    }
+    &::-ms-fill {
+        display: none;
+    }
+}
+.plyr__progress--buffer {
+    &::-webkit-progress-value {
+        transition: width .2s ease;
+    }
+    &::-moz-progress-bar {
+        transition: width .2s ease;
+    }
+    &::-ms-fill {
+        transition: width .2s ease;
+    }
+}
+.plyr--video .plyr__progress--buffer,
+.plyr--video .plyr__volume--display {
+    background: $plyr-video-range-track-bg;
+}
+.plyr--video .plyr__progress--buffer {
+    color: $plyr-video-progress-buffered-bg;
+}
+.plyr--audio .plyr__progress--buffer,
+.plyr--audio .plyr__volume--display {
+    background: $plyr-audio-range-track-bg;
+}
+.plyr--audio .plyr__progress--buffer {
+    color: $plyr-audio-progress-buffered-bg;
+}
+
+// Loading state
+.plyr--loading .plyr__progress--buffer {
+    animation: plyr-progress 1s linear infinite;
+    background-size: $plyr-progress-loading-size $plyr-progress-loading-size;
+    background-repeat: repeat-x;
+    background-image: linear-gradient(
+        -45deg,
+        $plyr-progress-loading-bg 25%,
+        transparent 25%,
+        transparent 50%,
+        $plyr-progress-loading-bg 50%,
+        $plyr-progress-loading-bg 75%,
+        transparent 75%,
+        transparent);
+    color: transparent;
+}
+.plyr--video.plyr--loading .plyr__progress--buffer {
+    background-color: $plyr-video-progress-buffered-bg;
+}
+.plyr--audio.plyr--loading .plyr__progress--buffer {
+    background-color: $plyr-audio-progress-buffered-bg;
+}
+
+// Time
+// --------------------------------------------------------------
+.plyr__time {
+    display: inline-block;
+    vertical-align: middle;
+    font-size: $plyr-font-size-small;
+}
+// Media duration hidden on small screens
+.plyr__time + .plyr__time {
+    display: none;
+
+    @media (min-width: $plyr-bp-screen-md) {
+        display: inline-block;
+    }
+
+    // Add a slash in before
+    &::before {
+        content: '\2044';
+        margin-right: $plyr-control-spacing;
+    }
+}
+
+// Volume
+// --------------------------------------------------------------
+.plyr__volume {
+    display: none;
+}
+.plyr .plyr__volume {
+    flex: 1;
+    position: relative;
+
+    input[type="range"] {
+        position: relative;
+        z-index: 2;
+    }
+    @media (min-width: $plyr-bp-screen-sm) {
+        display: block;
+        max-width: 60px;
+    }
+    @media (min-width: $plyr-bp-screen-md) {
+        max-width: 100px;
+    }
+}
+
+// Hide sound controls on iOS
+// It's not supported to change volume using JavaScript:
+// https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html
+.plyr--is-ios .plyr__volume,
+.plyr--is-ios [data-plyr='mute'] {
+    display: none !important;
+}
+
+// Fullscreen
+// --------------------------------------------------------------
+.plyr--fullscreen-active {
+    position: fixed;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+    height: 100%;
+    width: 100%;
+    z-index: 10000000;
+    background: #000;
+    border-radius: 0 !important;
+
+    video {
+        height: 100%;
+    }
+    .plyr__video-wrapper {
+        height: 100%;
+        width: 100%;
+    }
+    .plyr__video-embed {
+        // Revert overflow change
+        overflow: visible;
+    }
+    .plyr__controls {
+        position: absolute;
+        bottom: 0;
+        left: 0;
+        right: 0;
+    }
+
+    // Vimeo requires some different styling
+    &.plyr--vimeo .plyr__video-wrapper {
+        height: 0;
+        top: 50%;
+        @include prefix(transform, translateY(-50%));
+    }
+}
diff --git a/share/lua/http/src/components/player/plyr.lib.vars.scss b/share/lua/http/src/components/player/plyr.lib.vars.scss
new file mode 100644
index 0000000000..e8a3415f1c
--- /dev/null
+++ b/share/lua/http/src/components/player/plyr.lib.vars.scss
@@ -0,0 +1,71 @@
+// ==========================================================================
+// Plyr variables
+// ==========================================================================
+
+// Settings
+$plyr-border-box:                       true !default;
+$plyr-touch-action:                     true !default;
+$plyr-sr-only-important:                true !default;
+
+// Colors
+$plyr-color-main:                       #FFA500 !default;
+
+// Font sizes
+$plyr-font-family:                      Avenir, 'Avenir Next', 'Helvetica Neue', 'Segoe UI', Helvetica, Arial, sans-serif !default;
+$plyr-font-size-small:                  14px !default;
+$plyr-font-size-base:                   16px !default;
+
+// Captions
+$plyr-captions-bg:                      transparentize(#000, .3) !default;
+$plyr-captions-color:                   #fff !default;
+$plyr-font-size-captions-base:          $plyr-font-size-base !default;
+$plyr-font-size-captions-medium:        ceil($plyr-font-size-base * 1.5) !default;
+$plyr-font-size-captions-large:         ($plyr-font-size-base * 2) !default;
+
+// Controls
+$plyr-control-icon-size:                18px !default;
+$plyr-control-spacing:                  10px !default;
+$plyr-control-padding:                  ($plyr-control-spacing * .7) !default;
+$plyr-video-controls-bg:                #000 !default;
+$plyr-video-control-color:              #fff !default;
+$plyr-video-control-color-hover:        #fff !default;
+$plyr-video-control-bg-hover:           $plyr-color-main !default;
+$plyr-audio-controls-bg:                #fff !default;
+$plyr-audio-controls-border:            1px solid #dbe3e8 !default;
+$plyr-audio-control-color:              #565D64 !default;
+$plyr-audio-control-color-hover:        #fff !default;
+$plyr-audio-control-bg-hover:           $plyr-color-main;
+
+// Tooltips
+$plyr-tooltip-bg:                       transparentize(#000, .3) !default;
+$plyr-tooltip-color:                    #fff !default;
+$plyr-tooltip-padding:                  ($plyr-control-spacing / 2) !default;
+$plyr-tooltip-arrow-size:               4px !default;
+$plyr-tooltip-radius:                   3px !default;
+
+// Progress
+$plyr-progress-loading-size:            25px !default;
+$plyr-progress-loading-bg:              transparentize(#000, .85) !default;
+$plyr-video-progress-bg:                transparentize(#fff, .75) !default;
+$plyr-video-progress-buffered-bg:       $plyr-video-progress-bg !default;
+$plyr-audio-progress-bg:                transparentize(#C6D6DB, .33) !default;
+$plyr-audio-progress-buffered-bg:       $plyr-audio-progress-bg !default;
+
+// Range sliders
+$plyr-range-track-height:               8px !default;
+$plyr-range-thumb-height:               floor($plyr-range-track-height * 2) !default;
+$plyr-range-thumb-width:                floor($plyr-range-track-height * 2) !default;
+$plyr-range-thumb-bg:                   #fff !default;
+$plyr-range-thumb-border:               2px solid transparent !default;
+$plyr-range-thumb-shadow:               0 1px 1px transparentize($plyr-video-controls-bg, .85), 0 0 0 1px transparentize(#000, .85) !default;
+$plyr-range-thumb-active-border-color:  #fff !default;
+$plyr-range-thumb-active-bg:            $plyr-video-control-bg-hover !default;
+$plyr-range-thumb-active-scale:         1.25 !default;
+$plyr-video-range-track-bg:             $plyr-video-progress-buffered-bg !default;
+$plyr-audio-range-track-bg:             $plyr-audio-progress-buffered-bg !default;
+$plyr-range-selected-bg:                $plyr-color-main !default;
+
+// Breakpoints
+$plyr-bp-screen-sm:                     480px !default;
+$plyr-bp-screen-md:                     768px !default;
+$plyr-bp-screen-lg:                     1024px !default;
diff --git a/share/lua/http/src/components/player/plyr.methods.js b/share/lua/http/src/components/player/plyr.methods.js
new file mode 100644
index 0000000000..b41d2dad39
--- /dev/null
+++ b/share/lua/http/src/components/player/plyr.methods.js
@@ -0,0 +1,41 @@
+import { sendCommand } from '../../services/command.service.js';
+
+let player;
+
+export function plyrInit() {
+    player = plyr.setup({
+        showPosterOnEnd: true
+    });
+    // setVideo('S6IP_6HG2QE','youtube');
+    player[0].on('pause', () => {
+        sendCommand(0, 'command=pl_pause');
+    });
+
+    player[0].on('play', () => {
+        sendCommand(0, 'command=pl_play');
+    });
+
+    player[0].on('volumechange', (event) => {
+        const cmd = `command=volume&val=${event.detail.plyr.getVolume() * 255}`;
+        sendCommand(0, cmd);
+    });
+    return true;
+}
+
+export function setVideo(videoSrc, type) {
+    player[0].source({
+        type: 'video',
+        title: '',
+        sources: [{
+            src: videoSrc,
+            type
+        }],
+        poster: 'assets/vlc-icons/256x256/vlc.png'
+    });
+}
+
+export function playItem(src, id) {
+    setVideo(src, 'video/mp4', id);
+    player[0].play();
+    sendCommand(0, `command=pl_play&id=${id}`);
+}
diff --git a/share/lua/http/src/components/playlist/buttons.playlist.component.html b/share/lua/http/src/components/playlist/buttons.playlist.component.html
new file mode 100644
index 0000000000..fc0dae59d0
--- /dev/null
+++ b/share/lua/http/src/components/playlist/buttons.playlist.component.html
@@ -0,0 +1,16 @@
+<!-- Button Template -->
+<script type="text/x-template" id="button-template">
+    <div>
+        <div class="playlistIcons">
+            <div class="row">
+                <button type="button" class="btn-circle col-xs" id="randomButton"><svg-icon name="shuffle-variant"></svg-icon></button>
+                <button type="button" class="btn-circle col-xs" id="repeatButton"><svg-icon name="replay"></svg-icon></button>
+                <button type="button" class="btn-circle col-xs" id="playButton"><svg-icon name="play-circle-outline"></svg-icon></button>
+            </div>
+            <div class="row">
+                <button type="button" class="btn-circle col-xs" data-toggle="modal" data-target="#equalizerModal"><svg-icon name="poll"></svg-icon></button>
+                <button type="button" class="btn-circle col-xs" data-toggle="modal" data-target="#fileModal"><svg-icon name="plus"></svg-icon></button>
+            </div>
+        </div>
+    </div>
+</script>
diff --git a/share/lua/http/src/components/playlist/buttons.playlist.component.js b/share/lua/http/src/components/playlist/buttons.playlist.component.js
new file mode 100644
index 0000000000..d5609d7424
--- /dev/null
+++ b/share/lua/http/src/components/playlist/buttons.playlist.component.js
@@ -0,0 +1,35 @@
+import { bus, notifyBus } from '../../services/bus.service.js';
+import { sendCommand } from '../../services/command.service.js';
+
+let playlistItems;
+
+Vue.component('playlist-buttons', {
+    template: '#button-template',
+    methods: {
+        toggleRepeat() {
+            sendCommand(0, 'command=pl_repeat');
+        },
+        startPlaylist() {
+            playlistItems = this.$parent.$parent.$data.playlistItems;
+            if (playlistItems[0]) {
+                notifyBus('play', playlistItems[0].src,playlistItems[0].id);
+            }
+        },
+        toggleRandom() {
+            sendCommand(0, 'command=pl_random');
+        }
+    },
+    created() {
+        bus.$on('toggleRepeat', () => {
+            this.toggleRepeat();
+        });
+
+        bus.$on('startPlaylist', () => {
+            this.startPlaylist();
+        });
+
+        bus.$on('toggleRandom', () => {
+            this.toggleRandom();
+        });
+    }
+});
diff --git a/share/lua/http/src/components/playlist/playlist.component.html b/share/lua/http/src/components/playlist/playlist.component.html
new file mode 100644
index 0000000000..86137bf985
--- /dev/null
+++ b/share/lua/http/src/components/playlist/playlist.component.html
@@ -0,0 +1,27 @@
+<!-- Templates -->
+<!-- Playlist Template -->
+<script type="text/x-template" id="playlist-template">
+    <div>
+        <div id="playlistNav" class="playlistNav">
+            <div class="container">
+                <playlist-buttons></playlist-buttons>
+                <div>
+                    <h1 class="playlistHeader">Playlist</h1>
+                </div>
+                <div id="playlist">
+                    <ol type="1">
+                        <li v-for="item in this.$parent.playlistItems">
+                            <button v-on:click="play(item.src, item.id)" class="playlistItem">{{ item.title }}</button>
+                            <button v-on:click="removeItem(item.id)" type="button" class="btn-circle col-xs">
+                                <svg-icon name="delete"></svg-icon>
+                            </button>
+                        </li>
+                    </ol>
+                </div>
+                <div class="playlistNavMobile" id="mobilePlaylistNavButton">
+                    <center><svg-icon name="format-list-bulleted"></svg-icon></center>
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
diff --git a/share/lua/http/src/components/playlist/playlist.component.js b/share/lua/http/src/components/playlist/playlist.component.js
new file mode 100644
index 0000000000..7733d40eca
--- /dev/null
+++ b/share/lua/http/src/components/playlist/playlist.component.js
@@ -0,0 +1,102 @@
+import { bus } from '../../services/bus.service.js';
+import { sendCommand } from '../../services/command.service.js';
+import { playItem } from '../player/plyr.methods.js';
+
+Vue.component('playlist', {
+    template: '#playlist-template',
+    methods: {
+        addItem(mode, id, title, src) {
+            if (mode === 0) {
+                this.$parent.playlistItems.push({
+                    id,
+                    title,
+                    src
+                });
+            } else if (mode === 1) {
+                sendCommand(0, `command=in_enqueue&input=${src}`);
+                this.clearPlaylist();
+                bus.$emit('refreshPlaylist');
+            }
+        },
+        removeItem(id) {
+            sendCommand(0, `command=pl_delete&id=${id}`);
+            this.$parent.playlistItems.splice({
+                id
+            });
+            sendCommand(1);
+        },
+        openPlaylist() {
+            $('#playlistNav').width('60%');
+            $('#mobilePlaylistNavButton').width('0%');
+        },
+        closePlaylist() {
+            $('#playlistNav').width('0%');
+            $('#mobilePlaylistNavButton').width('10%');
+        },
+        populatePlaylist(playlistData) {
+            if (!playlistData) {
+                return;
+            }
+            this.$parent.playlistItems = [];
+            for (let i = 0; i < playlistData.children[0].children.length; i++) {
+                this.addItem(
+                    0,
+                    playlistData.children[0].children[i].id,
+                    playlistData.children[0].children[i].name,
+                    playlistData.children[0].children[i].uri
+                );
+            }
+        },
+        fetchPlaylist() {
+            sendCommand(1)
+                .then(data => this.populatePlaylist(data));
+        },
+        refreshPlaylist() {
+            this.fetchPlaylist();
+            setInterval(() => {
+                this.fetchPlaylist();
+            }, 5000);
+        },
+        clearPlaylist() {
+            this.$parent.playlistItems = [];
+        },
+        play(src, id) {
+            playItem(src,id);
+        }
+    },
+    created() {
+        bus.$on('openPlaylist', () => {
+            this.openPlaylist();
+        });
+
+        bus.$on('closePlaylist', () => {
+            this.closePlaylist();
+        });
+
+        bus.$on('addItem', (params) => {
+            this.addItem(params[0], params[1], params[2], params[3]);
+        });
+
+        bus.$on('removeItem', (id) => {
+            this.removeItem(id);
+        });
+
+        bus.$on('refreshPlaylist', () => {
+            this.refreshPlaylist();
+        });
+
+        bus.$on('play', (arg) => {
+            this.play(arg[0], arg[1]);
+        });
+
+        this.refreshPlaylist();
+    }
+});
+
+$(document).click((e) => {
+    const container = $('#playlistNav');
+
+    if ($(window).width() <= 480 && !container.is(e.target) && container.has(e.target).length === 0 && container.css('width') !== '0px') {
+        bus.$emit('closePlaylist');
+    }
+});
diff --git a/share/lua/http/src/components/playlist/playlist.component.scss b/share/lua/http/src/components/playlist/playlist.component.scss
new file mode 100644
index 0000000000..6ae49d3cfe
--- /dev/null
+++ b/share/lua/http/src/components/playlist/playlist.component.scss
@@ -0,0 +1,93 @@
+.playlistNav {
+    right: 0;
+    width: 20%;
+    height: 100%;
+    position: fixed;
+    z-index: 5;
+    top: 0;
+    background-color: orange;
+    overflow-x: hidden;
+    padding-top: 2%;
+    transition: 0.5s;
+}
+
+.playlistIcons {
+    font-size: 2em;
+    padding-left: 4%;
+}
+
+.playlistNavMobile {
+    visibility: hidden;
+    right: 0;
+    width: 10%;
+    height: 100%;
+    position: fixed;
+    z-index: 5;
+    top: 0;
+    background-color: orange;
+    overflow-x: hidden;
+    padding-top: 2%;
+    transition: 0.5s;
+}
+
+.btn-circle {
+    width: 30px;
+    height: 30px;
+    text-align: center;
+    padding: 6px 0;
+    border-radius: 15px;
+    border: 0;
+    background-color: orange;
+}
+
+.btn-circle.btn-lg {
+    width: 50px;
+    height: 50px;
+    padding: 10px 16px;
+    font-size: 18px;
+    border-radius: 25px;
+}
+
+.btn-circle.btn-xl {
+    width: 70px;
+    height: 70px;
+    padding: 10px 16px;
+    font-size: 24px;
+    border-radius: 35px;
+}
+
+.playlistItem {
+    text-align: center;
+    border: 0;
+    margin-bottom: 0.2em;
+    background-color: white;
+}
+
+.playlistHeader{
+    color: black;
+    padding-left: 5%;
+    padding-right: 5%;
+}
+
+#playlist {
+    width:21.5%;
+    height: 100%;
+    background-color: white;
+}
+
+ at media screen and (min-device-width : 320px) and (max-device-width : 480px) {
+    .playlistNav {
+        width: 0%;
+    }
+
+    .playlistNavMobile {
+        visibility: visible;
+        height: 10%;
+        top: 50%;
+    }
+
+    #playlist {
+        width: 95%;
+        height: 90%;
+    }
+}
diff --git a/share/lua/http/src/components/sot/stream.manager.component.html b/share/lua/http/src/components/sot/stream.manager.component.html
new file mode 100644
index 0000000000..9813fe2f65
--- /dev/null
+++ b/share/lua/http/src/components/sot/stream.manager.component.html
@@ -0,0 +1,18 @@
+<!-- stream-manager modal Template -->
+<script type="text/x-template" id="stream-manager-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Stream Manager</h4>
+                </div>
+                <div class="modal-body">
+                </div>
+                <div class="modal-footer">
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
diff --git a/share/lua/http/src/components/sot/stream.manager.component.js b/share/lua/http/src/components/sot/stream.manager.component.js
new file mode 100644
index 0000000000..93a4e17bb9
--- /dev/null
+++ b/share/lua/http/src/components/sot/stream.manager.component.js
@@ -0,0 +1,8 @@
+
+Vue.component('stream-manager-modal', {
+    template: '#stream-manager-modal-template',
+    methods: {
+    },
+    created: function() {
+    }
+});
diff --git a/share/lua/http/src/components/svg-icon/svg-icon.component.html b/share/lua/http/src/components/svg-icon/svg-icon.component.html
new file mode 100644
index 0000000000..f5823379c9
--- /dev/null
+++ b/share/lua/http/src/components/svg-icon/svg-icon.component.html
@@ -0,0 +1,3 @@
+<script type="text/x-template" id="svg-icon">
+    <svg version="1.1" :class="clazz" :viewBox="box" v-html="path" :style="style"></svg>
+</script>
diff --git a/share/lua/http/src/components/svg-icon/svg-icon.component.js b/share/lua/http/src/components/svg-icon/svg-icon.component.js
new file mode 100644
index 0000000000..9393dcd6f2
--- /dev/null
+++ b/share/lua/http/src/components/svg-icon/svg-icon.component.js
@@ -0,0 +1,174 @@
+// Based on https://github.com/MMF-FE/vue-svgicon/blob/master/component/svgicon.vue
+
+let icons = {}
+let notLoadedIcons = []
+let defaultWidth = ''
+let defaultHeight = ''
+let classPrefix = 'svg'
+export const svgIcon = {
+    template: '#svg-icon',
+    data() {
+        return {
+            loaded: false
+        }
+    },
+    props: {
+        icon: String,
+        name: String,
+        width: {
+            type: String,
+            default: ''
+        },
+        height: {
+            type: String,
+            default: ''
+        },
+        scale: String,
+        dir: String,
+        fill: {
+            type: Boolean,
+            default: true
+        },
+        color: String,
+        original: {
+            type: Boolean,
+            default: false
+        }
+    },
+    computed: {
+        clazz() {
+            let clazz = `${classPrefix}-icon`
+            if (this.fill) {
+                clazz += ` ${classPrefix}-fill`
+            }
+            if (this.dir) {
+                clazz += ` ${classPrefix}-${this.dir}`
+            }
+            return clazz
+        },
+        iconName () {
+            return this.name || this.icon
+        },
+        iconData() {
+            if (this.iconName && this.loaded) {
+                return icons[this.iconName]
+            }
+            return null
+        },
+        colors() {
+            if (this.color) {
+                return this.color.split(' ')
+            }
+            return ''
+        },
+        path() {
+            let _this = this
+            function addColor (data) {
+                let reg = /<(path|rect|circle|polygon|line|polyline|ellipse)\s/gi
+                let i = 0
+                return data.replace(reg, (match) => {
+                    let color = _this.colors[i++] || _this.colors[_this.colors.length - 1]
+                    let fill = _this.fill
+                    // if color is '_', ignore it
+                    if (color && color === '_') {
+                        return match
+                    }
+                    // if color start with 'r-', reverse the fill value
+                    if (color && color.indexOf('r-') === 0) {
+                        fill = !fill
+                        color = color.split('r-')[1]
+                    }
+                    let style = fill ? 'fill' : 'stroke'
+                    let reverseStyle = fill ? 'stroke' : 'fill'
+                    return match + `${style}="${color}" ${reverseStyle}="none" `
+                })
+            }
+            function addOriginalColor (data) {
+                let styleReg = /_fill=\"|_stroke="/gi
+                return data.replace(styleReg, (styleName) => {
+                    return styleName && styleName.slice(1)
+                })
+            }
+            let pathData = ''
+            if (this.iconData) {
+                pathData = this.iconData.data
+                // use original color
+                if (this.original) {
+                    pathData = addOriginalColor(pathData)
+                }
+                if (this.colors && this.colors.length > 0) {
+                    pathData = addColor(pathData)
+                }
+            } else {
+                // if no iconData, push to notLoadedIcons
+                notLoadedIcons.push({
+                    name: this.iconName,
+                    component: this
+                })
+            }
+            return pathData
+        },
+        box() {
+            let width = this.width || 16
+            let height = this.width || 16
+            if (this.iconData) {
+                if (this.iconData.viewBox) {
+                    return this.iconData.viewBox
+                }
+                return `0 0 ${this.iconData.width} ${this.iconData.height}`
+            }
+            return `0 0 ${parseFloat(width)} ${parseFloat(height)}`
+        },
+        style() {
+            let digitReg = /^\d+$/
+            let scale = Number(this.scale)
+            let width
+            let height
+            // apply scale
+            if (!isNaN(scale) && this.iconData) {
+                width = (Number(this.iconData.width) * scale) + 'px'
+                height = (Number(this.iconData.height) * scale) + 'px'
+            } else {
+                width = digitReg.test(this.width) ? this.width + 'px' : this.width
+                height = digitReg.test(this.height) ? this.height + 'px' : this.height
+            }
+            return {
+                width: width || defaultWidth,
+                height: height || defaultHeight
+            }
+        }
+    },
+    created () {
+        if (icons[this.iconName]) {
+            this.loaded = true
+        }
+    },
+    install(Vue, options = {}) {
+        let tagName = options.tagName || 'svgicon'
+        if (options.classPrefix) {
+            classPrefix = options.classPrefix
+        }
+        // default size
+        options.defaultWidth && (defaultWidth = options.defaultWidth)
+        options.defaultHeight && (defaultHeight = options.defaultHeight)
+        Vue.component(tagName, this)
+    },
+    // register icons
+    register(data) {
+        for (let name in data) {
+            if (!icons[name]) {
+                icons[name] = data[name]
+            }
+            // check new register icon is not loaded, and set loaded to true
+            notLoadedIcons = notLoadedIcons.filter((v, ix) => {
+                if (v.name === name) {
+                    v.component.$set(v.component, 'loaded', true)
+                }
+                return v.name !== name
+            })
+        }
+    },
+    icons
+
+};
+
diff --git a/share/lua/http/src/components/svg-icon/svg-icon.component.scss b/share/lua/http/src/components/svg-icon/svg-icon.component.scss
new file mode 100644
index 0000000000..0c6710d4b2
--- /dev/null
+++ b/share/lua/http/src/components/svg-icon/svg-icon.component.scss
@@ -0,0 +1,31 @@
+.svg-icon {
+    display: inline-block;
+    width: 2.5rem;
+    height: 2.5rem;
+    color: inherit;
+    vertical-align: middle;
+    fill: none;
+    stroke: currentColor;
+}
+
+.svg-fill {
+    fill: currentColor;
+    stroke: none;
+}
+
+.svg-up {
+    transform: rotate(-90deg);
+}
+
+.svg-right {
+     /*default*/
+     transform: rotate(0deg);
+}
+
+.svg-down {
+    transform: rotate(90deg);
+}
+
+.svg-left {
+    transform: rotate(180deg);
+}
diff --git a/share/lua/http/src/components/track-synchronisation/tracksync.component.html b/share/lua/http/src/components/track-synchronisation/tracksync.component.html
new file mode 100644
index 0000000000..4ae724b99f
--- /dev/null
+++ b/share/lua/http/src/components/track-synchronisation/tracksync.component.html
@@ -0,0 +1,29 @@
+<!-- track-sync modal Template -->
+<script type="text/x-template" id="track-sync-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Set Track Synchronization</h4>
+                </div>
+                <div class="modal-body" id="">
+                    Playback Rate
+                    <center id="playbackVal">{{ playbackVal }}</center>
+                    <input type="range" name="playbackInput" id="playbackInput" min="-20" max="20" step="0.1"/>
+                    <br>
+                    Audio Delay
+                    <center id="audioDelayVal">{{ audioDelayVal }}</center>
+                    <input type="range" name="audioDelayInput" id="audioDelayInput" min="-20" max="20" step="0.1"/>
+                    <br>
+                    Subtitle Delay
+                    <center id="subDelayVal">{{ subDelayVal }}</center>
+                    <input type="range" name="subDelayInput" id="subDelayInput" min="-20" max="20" step="0.1"/>
+                </div>
+                <div class="modal-footer">
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
diff --git a/share/lua/http/src/components/track-synchronisation/tracksync.component.js b/share/lua/http/src/components/track-synchronisation/tracksync.component.js
new file mode 100644
index 0000000000..870ff3ae34
--- /dev/null
+++ b/share/lua/http/src/components/track-synchronisation/tracksync.component.js
@@ -0,0 +1,43 @@
+const trackData = {
+    playbackVal: 0,
+    audioDelayVal: 0,
+    subDelayVal: 0
+};
+
+let playbackElement;
+let audioDelayElement;
+let subDelayElement;
+
+Vue.component('track-sync-modal', {
+    template: '#track-sync-modal-template',
+    data() {
+        return trackData;
+    },
+    methods: {
+        handleEvents: () => {
+            trackData.playbackVal = playbackElement[0].value;
+
+            trackData.audioDelayVal = audioDelayElement[0].value;
+
+            trackData.subDelayVal = subDelayElement[0].value;
+
+            playbackElement.on('input', (e) => {
+                trackData.playbackVal = e.currentTarget.value;
+            });
+
+            audioDelayElement.on('input', (e) => {
+                trackData.audioDelayVal = e.currentTarget.value;
+            });
+
+            subDelayElement.on('input', (e) => {
+                trackData.subDelayVal = e.currentTarget.value;
+            });
+        }
+    },
+    mounted() {
+        playbackElement = $('#playbackInput');
+        audioDelayElement = $('#audioDelayInput');
+        subDelayElement = $('#subDelayInput');
+        this.handleEvents();
+    }
+});
diff --git a/share/lua/http/src/components/vlm/vlm.component.html b/share/lua/http/src/components/vlm/vlm.component.html
new file mode 100644
index 0000000000..222c7ae2c9
--- /dev/null
+++ b/share/lua/http/src/components/vlm/vlm.component.html
@@ -0,0 +1,24 @@
+<!-- vlm modal Template -->
+<script type="text/x-template" id="vlm-modal-template">
+    <div>
+        <div class="modal-dialog">
+            <!-- Modal content-->
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal">×</button>
+                    <h4 class="modal-title">Write your VLM commands here (seperated by new line)</h4>
+                </div>
+                <div class="modal-body">
+                    <textarea id="vlmCommand"></textarea>
+                    <div id="status">
+                    status:
+                    </div>
+                </div>
+                <div class="modal-footer">
+                    <button type="button" id="vlmButton" class="btn btn-default">Submit</button>
+                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+                </div>
+            </div>
+        </div>
+    </div>
+</script>
diff --git a/share/lua/http/src/components/vlm/vlm.component.js b/share/lua/http/src/components/vlm/vlm.component.js
new file mode 100644
index 0000000000..c7da5b49d1
--- /dev/null
+++ b/share/lua/http/src/components/vlm/vlm.component.js
@@ -0,0 +1,17 @@
+import { bus } from '../../services/bus.service.js';
+import { sendCommand } from '../../services/command.service.js';
+
+Vue.component('vlm-modal', {
+    template: '#vlm-modal-template',
+    methods: {
+        executeVLM() {
+            const cmd = $('#vlmCommand').val();
+            sendCommand(2, `?command=${cmd}`);
+        }
+    },
+    created() {
+        bus.$on('executeVLM', () => {
+            this.executeVLM();
+        });
+    }
+});
diff --git a/share/lua/http/src/components/vlm/vlm.component.scss b/share/lua/http/src/components/vlm/vlm.component.scss
new file mode 100644
index 0000000000..a7ad65fe21
--- /dev/null
+++ b/share/lua/http/src/components/vlm/vlm.component.scss
@@ -0,0 +1,3 @@
+#vlmCommand {
+    width: 100%;
+}
diff --git a/share/lua/http/src/scss/bootstrap.scss b/share/lua/http/src/scss/bootstrap.scss
new file mode 100644
index 0000000000..d317da84b9
--- /dev/null
+++ b/share/lua/http/src/scss/bootstrap.scss
@@ -0,0 +1,40 @@
+// Core variables and mixins
+ at import "bootstrap/variables";
+ at import "bootstrap/mixins";
+
+// Reset and dependencies
+ at import "bootstrap/normalize";
+ at import "bootstrap/print";
+
+// Core CSS
+ at import "bootstrap/scaffolding";
+ at import "bootstrap/type";
+ at import "bootstrap/code";
+ at import "bootstrap/grid";
+ at import "bootstrap/tables";
+ at import "bootstrap/forms";
+ at import "bootstrap/buttons";
+
+// Components
+ at import "bootstrap/component-animations";
+ at import "bootstrap/dropdowns";
+ at import "bootstrap/button-groups";
+ at import "bootstrap/input-groups";
+ at import "bootstrap/navs";
+ at import "bootstrap/navbar";
+ at import "bootstrap/thumbnails";
+ at import "bootstrap/alerts";
+ at import "bootstrap/progress-bars";
+ at import "bootstrap/media";
+ at import "bootstrap/list-group";
+ at import "bootstrap/responsive-embed";
+ at import "bootstrap/close";
+
+// Components w/ JavaScript
+ at import "bootstrap/modals";
+ at import "bootstrap/tooltip";
+ at import "bootstrap/popovers";
+
+// Utility classes
+ at import "bootstrap/utilities";
+ at import "bootstrap/responsive-utilities";
diff --git a/share/lua/http/src/scss/components.scss b/share/lua/http/src/scss/components.scss
new file mode 100644
index 0000000000..62b198ee54
--- /dev/null
+++ b/share/lua/http/src/scss/components.scss
@@ -0,0 +1,8 @@
+// components.scss
+
+ at import '../components/player/plyr.lib.custom.scss';
+ at import '../components/player/player.component.scss';
+ at import '../components/controls/sidenav.component.scss';
+ at import '../components/playlist/playlist.component.scss';
+ at import '../components/vlm/vlm.component.scss';
+ at import '../components/svg-icon/svg-icon.component.scss';
diff --git a/share/lua/http/src/scss/main.scss b/share/lua/http/src/scss/main.scss
new file mode 100644
index 0000000000..93ea8ea9eb
--- /dev/null
+++ b/share/lua/http/src/scss/main.scss
@@ -0,0 +1,15 @@
+// main.scss
+
+// custom global styles
+body {
+    background-color: black;
+}
+
+ at media screen and (min-device-width : 320px) and (max-device-width : 480px) {
+    body {
+        height: auto;
+    }
+}
+
+// component styles
+ at import 'components.scss';
diff --git a/share/lua/http/src/scss/mixins.util.scss b/share/lua/http/src/scss/mixins.util.scss
new file mode 100644
index 0000000000..44e1fb398f
--- /dev/null
+++ b/share/lua/http/src/scss/mixins.util.scss
@@ -0,0 +1,37 @@
+// ==========================================================================
+// Plyr mixins
+// https://github.com/selz/plyr
+// ==========================================================================
+
+// <input type="range"> styling
+ at mixin plyr-range-track() {
+    height: $plyr-range-track-height;
+    background: transparent;
+    border: 0;
+    border-radius: ($plyr-range-track-height / 2);
+    user-select: none;
+}
+
+ at mixin plyr-range-thumb() {
+    position: relative;
+    height: $plyr-range-thumb-height;
+    width: $plyr-range-thumb-width;
+    background: $plyr-range-thumb-bg;
+    border: $plyr-range-thumb-border;
+    border-radius: 100%;
+    transition: background .2s ease, border .2s ease, transform .2s ease;
+    box-shadow: $plyr-range-thumb-shadow;
+    box-sizing: border-box;
+}
+
+ at mixin plyr-range-thumb-active() {
+    background: $plyr-range-thumb-active-bg;
+    border-color: $plyr-range-thumb-active-border-color;
+    transform: scale($plyr-range-thumb-active-scale);
+}
+
+ at mixin prefix($property, $value) {
+    -webkit-#{$property}: $value;
+    -moz-#{$property}: $value;
+    -ms-#{$property}: $value;
+}
diff --git a/share/lua/http/src/scss/vendors.scss b/share/lua/http/src/scss/vendors.scss
new file mode 100644
index 0000000000..581347e3e9
--- /dev/null
+++ b/share/lua/http/src/scss/vendors.scss
@@ -0,0 +1,2 @@
+ at import './bootstrap.scss';
+ at import '../vendors/jstree/themes/default/style.css';
diff --git a/share/lua/http/src/services/bus.service.js b/share/lua/http/src/services/bus.service.js
new file mode 100644
index 0000000000..28f0df8ca8
--- /dev/null
+++ b/share/lua/http/src/services/bus.service.js
@@ -0,0 +1,5 @@
+export const bus = new Vue();
+
+export function notifyBus(command, params) {
+    bus.$emit(command, params);
+}
diff --git a/share/lua/http/src/services/command.service.js b/share/lua/http/src/services/command.service.js
new file mode 100644
index 0000000000..f929662db2
--- /dev/null
+++ b/share/lua/http/src/services/command.service.js
@@ -0,0 +1,28 @@
+import { bus } from './bus.service.js';
+
+export function sendCommand(mode, params) {
+    if (mode === 0) {
+        $.ajax({
+            url: 'requests/status.json',
+            data: params
+        })
+        .then((data) => {
+            return JSON.parse(data);
+        });
+    } else if (mode === 1) {
+        return $.ajax({
+            url: 'requests/playlist.json',
+            data: params
+        })
+        .then((data) => {
+            const jsonData = JSON.parse(data);
+            bus.$emit('populatePlaylist', jsonData);
+            return jsonData;
+        });
+    } else if (mode === 2) {
+        $.ajax({
+            url: 'requests/vlm_cmd.xml',
+            data: params
+        });
+    }
+}
diff --git a/share/lua/http/src/services/initialize.service.js b/share/lua/http/src/services/initialize.service.js
new file mode 100644
index 0000000000..4185306342
--- /dev/null
+++ b/share/lua/http/src/services/initialize.service.js
@@ -0,0 +1,79 @@
+import { plyrInit } from '../components/player/plyr.methods.js';
+import { notifyBus } from './bus.service.js';
+import { svgIcon } from '../components/svg-icon/svg-icon.component.js';
+
+export const VIDEO_TYPES = [
+    'asf', 'avi', 'bik', 'bin', 'divx', 'drc', 'dv', 'f4v', 'flv', 'gxf', 'iso',
+    'm1v', 'm2v', 'm2t', 'm2ts', 'm4v', 'mkv', 'mov',
+    'mp2', 'mp4', 'mpeg', 'mpeg1',
+    'mpeg2', 'mpeg4', 'mpg', 'mts', 'mtv', 'mxf', 'mxg', 'nuv',
+    'ogg', 'ogm', 'ogv', 'ogx', 'ps',
+    'rec', 'rm', 'rmvb', 'rpl', 'thp', 'ts', 'txd', 'vob', 'wmv', 'xesc'
+];
+
+export const AUDIO_TYPES = [
+    '3ga', 'a52', 'aac', 'ac3', 'ape', 'awb', 'dts', 'flac', 'it',
+    'm4a', 'm4p', 'mka', 'mlp', 'mod', 'mp1', 'mp2', 'mp3',
+    'oga', 'ogg', 'oma', 's3m', 'spx', 'thd', 'tta',
+    'wav', 'wma', 'wv', 'xm'
+];
+
+export const PLAYLIST_TYPES = [
+    'asx', 'b4s', 'cue', 'ifo', 'm3u', 'm3u8', 'pls', 'ram', 'rar',
+    'sdp', 'vlc', 'xspf', 'zip', 'conf'
+];
+
+function vueInit() {
+    return new Vue({
+        el: '#app',
+        data: {
+            playlistItems: []
+        }
+    });
+}
+
+$(() => {
+    plyrInit();
+    Vue.use(svgIcon, {
+        tagName: 'svg-icon'
+    });
+    vueInit();
+
+    $('#openNavButton').on('click', () => {
+        if ($(window).width() <= 480 && $('#playlistNav').css('width') === '60%') {
+            notifyBus('closePlaylist');
+            notifyBus('openNav');
+        } else {
+            notifyBus('openNav');
+        }
+    });
+
+    $('#closeNavButton').on('click', () => {
+        notifyBus('closeNav');
+    });
+
+    $('#vlmButton').on('click', () => {
+        notifyBus('executeVLM');
+    });
+
+    $('#repeatButton').on('click', () => {
+        notifyBus('toggleRepeat');
+    });
+
+    $('#playButton').on('click', () => {
+        notifyBus('startPlaylist');
+    });
+
+    $('#randomButton').on('click', () => {
+        notifyBus('toggleRandom');
+    });
+
+    $('#mobilePlaylistNavButton').on('click', () => {
+        if ($(window).width() <= 480 && $('#sideNav').width() === '60%') {
+            notifyBus('closeNav');
+            notifyBus('openPlaylist');
+        } else {
+            notifyBus('openPlaylist');
+        }
+    });
+});
diff --git a/share/lua/http/view.html b/share/lua/http/view.html
deleted file mode 100644
index 07ddd0d6cf..0000000000
--- a/share/lua/http/view.html
+++ /dev/null
@@ -1,82 +0,0 @@
-<!--  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  view.html: VLC media player web interface - VLM
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  Copyright (C) 2005-2014 VLC authors and VideoLAN
-<  $Id$
-<
-<  Authors: Brandon Brooks <bwbrooks -at- archmageinc -dot- com>
-<
-<  This program is free software; you can redistribute it and/or modify
-<  it under the terms of the GNU General Public License as published by
-<  the Free Software Foundation; either version 2 of the License, or
-<  (at your option) any later version.
-<
-<  This program is distributed in the hope that it will be useful,
-<  but WITHOUT ANY WARRANTY; without even the implied warranty of
-<  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-<  GNU General Public License for more details.
-<
-<  You should have received a copy of the GNU General Public License
-<  along with this program; if not, write to the Free Software
-<  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-<head>
-	<title><?vlc gettext("VLC media player - Flash Viewer") ?></title>
-	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-	<link href="favicon.ico" type="image/x-icon" rel="shortcut icon"/>
-	<link type="text/css" href="css/ui-lightness/jquery-ui-1.8.13.custom.css" rel="stylesheet" />
-	<link type="text/css" href="css/main.css" rel="stylesheet" />
-	<script type="text/javascript" src="js/common.js"></script>
-	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
-	<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js"></script>
-	<script type="text/javascript" src="http://releases.flowplayer.org/js/flowplayer-3.2.6.min.js"></script>
-	<script type="text/javascript">
-	//<![CDATA[
-	$(function(){
-		$('#window_stream').resizable({
-			minHeight: 300,
-			minWidth: 400,
-			resize:function(event,ui){
-				$('#player').css({
-					'width':ui.size.width-80,
-					'height':ui.size.height-100
-				})
-			}
-		});
-		$('#button_stream_config').click(function(){
-			$('#window_stream_config').dialog('open');
-		});
-		$('#player').empty();
-		$('#player').attr('href',$('#stream_protocol').val()+'://'+$('#stream_host').val()+':'+$('#stream_port').val()+'/'+$('#stream_file').val());
-		flowplayer("player", "http://releases.flowplayer.org/swf/flowplayer-3.2.7.swf");
-	});
-	//]]>
-	</script>
-	<style>
-	#window_stream { width: 800px; height: 600px; padding: 0.5em; }
-	#window_stream h3 { text-align: left; margin: 0; font-weight: normal; font-size: 12px }
-	</style>
-</head>
-
-<body>
-	<div id="window_stream" class="ui-widget-content">
-		<h3 class="ui-widget-header"><?vlc gettext("Streaming Output") ?></h3>
-		<div class="ui-widget-content">
-			<div id="button_stream_config" class="button icon ui-widget ui-state-default" title="<?vlc gettext("Configure") ?>" opendialog="window_stream_config"><span class="ui-icon ui-icon-wrench"></span></div>
-			<div align="center">
-				<div href="http://localhost:8081/stream.flv" style="display:block;width:720px;height:500px" id="player"></div>
-			</div>
-			<div> </div>
-		</div>
-		<div class="footer">
-			<?vlc print(vlc.misc.version() .. " - Lua Web Interface - " .. vlc.misc.copyright()) ?>
-		</div>
-	</div>
-	<?vlc
-
-	dialogs("stream_config_window.html");
-	?>
-</body>
-</html>
diff --git a/share/lua/http/vlm.html b/share/lua/http/vlm.html
deleted file mode 100644
index b71ed0127e..0000000000
--- a/share/lua/http/vlm.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<!--  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  vlm.html: VLC media player web interface - VLM
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - >
-<  Copyright (C) 2005-2014 VLC authors and VideoLAN
-<  $Id$
-< 
-<  Authors: Antoine Cellerier <dionoea -at- videolan -dot- org>
-< 
-<  This program is free software; you can redistribute it and/or modify
-<  it under the terms of the GNU General Public License as published by
-<  the Free Software Foundation; either version 2 of the License, or
-<  (at your option) any later version.
-<
-<  This program is distributed in the hope that it will be useful,
-<  but WITHOUT ANY WARRANTY; without even the implied warranty of
-<  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-<  GNU General Public License for more details.
-<
-<  You should have received a copy of the GNU General Public License
-<  along with this program; if not, write to the Free Software
-<  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
-< - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-<head>
-  <title>VLC media player - Web Interface - VLM</title>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-  <link href="old/style.css" rel="stylesheet" type="text/css" />
-  <script type="text/javascript" src="old/js/functions.js"></script>
-  <script type="text/javascript" src="old/js/vlm.js"></script>
-
-</head>
-
-<body onload="vlm_get_elements();">
-
-<?vlc
-current_page = "vlm"
-
-dialogs("old/browse","old/input","old/sout","old/vlm","old/footer")
-?>
-
-</body>
-
-</html>
diff --git a/share/lua/http/vlm_export.html b/share/lua/http/vlm_export.html
deleted file mode 100644
index b90e5b73c4..0000000000
--- a/share/lua/http/vlm_export.html
+++ /dev/null
@@ -1,12 +0,0 @@
-## <pre>
-##
-## <a href="vlm.html">VLM HTTP interface</a>
-## This file can be loaded as is in VLM.
-## Comments starting with "##" were added by the HTTP interface.
-## You can remove them if you want to.
-##
-<?vlc print(vlc.vlm.execute_command(vlm,"export").value) ?>
-
-##
-## end of export
-## </pre>
-- 
2.18.0



More information about the vlc-devel mailing list