From 441f22fe723a5ee293c85712322046936913fedf Mon Sep 17 00:00:00 2001
From: Joshua Ashton
Date: Thu, 18 Apr 2019 17:30:26 +0100
Subject: [PATCH] Add page indexer
---
traces/.htaccess | 1 +
traces/_h5ai/.htaccess | 165 +++++
traces/_h5ai/CHANGELOG.md | 598 ++++++++++++++++++
traces/_h5ai/README.md | 72 +++
traces/_h5ai/private/cache/README.md | 9 +
traces/_h5ai/private/cache/cmds.json | 1 +
traces/_h5ai/private/conf/l10n/af.json | 18 +
traces/_h5ai/private/conf/l10n/bg.json | 18 +
traces/_h5ai/private/conf/l10n/cs.json | 18 +
traces/_h5ai/private/conf/l10n/da.json | 18 +
traces/_h5ai/private/conf/l10n/de.json | 22 +
traces/_h5ai/private/conf/l10n/el.json | 18 +
traces/_h5ai/private/conf/l10n/en.json | 23 +
traces/_h5ai/private/conf/l10n/es.json | 22 +
traces/_h5ai/private/conf/l10n/et.json | 22 +
traces/_h5ai/private/conf/l10n/fi.json | 18 +
traces/_h5ai/private/conf/l10n/fr.json | 22 +
traces/_h5ai/private/conf/l10n/he.json | 17 +
traces/_h5ai/private/conf/l10n/hi.json | 18 +
traces/_h5ai/private/conf/l10n/hr.json | 18 +
traces/_h5ai/private/conf/l10n/hu.json | 16 +
traces/_h5ai/private/conf/l10n/it.json | 18 +
traces/_h5ai/private/conf/l10n/ja.json | 20 +
traces/_h5ai/private/conf/l10n/ko.json | 22 +
traces/_h5ai/private/conf/l10n/lv.json | 22 +
traces/_h5ai/private/conf/l10n/nb.json | 15 +
traces/_h5ai/private/conf/l10n/nl.json | 22 +
traces/_h5ai/private/conf/l10n/pl.json | 22 +
traces/_h5ai/private/conf/l10n/pt.json | 18 +
traces/_h5ai/private/conf/l10n/ro.json | 15 +
traces/_h5ai/private/conf/l10n/ru.json | 20 +
traces/_h5ai/private/conf/l10n/sk.json | 13 +
traces/_h5ai/private/conf/l10n/sl.json | 18 +
traces/_h5ai/private/conf/l10n/sr.json | 15 +
traces/_h5ai/private/conf/l10n/sv.json | 16 +
traces/_h5ai/private/conf/l10n/tr.json | 14 +
traces/_h5ai/private/conf/l10n/uk.json | 18 +
traces/_h5ai/private/conf/l10n/zh-cn.json | 23 +
traces/_h5ai/private/conf/l10n/zh-tw.json | 23 +
traces/_h5ai/private/conf/options.json | 392 ++++++++++++
traces/_h5ai/private/conf/types.json | 76 +++
traces/_h5ai/private/php/class-bootstrap.php | 45 ++
traces/_h5ai/private/php/core/class-api.php | 109 ++++
.../_h5ai/private/php/core/class-context.php | 294 +++++++++
.../_h5ai/private/php/core/class-fallback.php | 54 ++
.../_h5ai/private/php/core/class-filesize.php | 96 +++
traces/_h5ai/private/php/core/class-item.php | 91 +++
traces/_h5ai/private/php/core/class-json.php | 65 ++
.../_h5ai/private/php/core/class-logger.php | 28 +
.../_h5ai/private/php/core/class-request.php | 38 ++
.../_h5ai/private/php/core/class-session.php | 20 +
traces/_h5ai/private/php/core/class-setup.php | 185 ++++++
traces/_h5ai/private/php/core/class-theme.php | 32 +
traces/_h5ai/private/php/core/class-util.php | 89 +++
.../_h5ai/private/php/ext/class-archive.php | 183 ++++++
traces/_h5ai/private/php/ext/class-custom.php | 65 ++
traces/_h5ai/private/php/ext/class-search.php | 40 ++
traces/_h5ai/private/php/ext/class-thumb.php | 253 ++++++++
traces/_h5ai/private/php/pages/index.php | 2 +
traces/_h5ai/private/php/pages/info.php | 2 +
traces/_h5ai/public/.htaccess | 13 +
traces/_h5ai/public/cache/README.md | 9 +
traces/_h5ai/public/css/styles.css | 2 +
traces/_h5ai/public/ext/README.md | 4 +
traces/_h5ai/public/images/fallback/file.png | Bin 0 -> 118 bytes
.../public/images/fallback/folder-parent.png | Bin 0 -> 108 bytes
.../_h5ai/public/images/fallback/folder.png | Bin 0 -> 99 bytes
.../public/images/favicon/favicon-152.png | Bin 0 -> 219 bytes
.../public/images/favicon/favicon-16-32.ico | Bin 0 -> 5430 bytes
.../public/images/favicon/favicon-16.png | Bin 0 -> 96 bytes
.../public/images/favicon/favicon-32.png | Bin 0 -> 120 bytes
.../_h5ai/public/images/favicon/favicon.svg | 3 +
traces/_h5ai/public/images/themes/README.md | 9 +
.../public/images/themes/comity/ar-apk.svg | 3 +
.../public/images/themes/comity/ar-deb.svg | 16 +
.../public/images/themes/comity/ar-rpm.svg | 11 +
.../public/images/themes/comity/txt-css.svg | 13 +
.../public/images/themes/comity/txt-go.svg | 29 +
.../public/images/themes/comity/txt-html.svg | 10 +
.../public/images/themes/comity/txt-js.svg | 3 +
.../public/images/themes/comity/txt-less.svg | 8 +
.../public/images/themes/comity/txt-md.svg | 3 +
.../public/images/themes/comity/txt-php.svg | 3 +
.../public/images/themes/comity/txt-py.svg | 8 +
.../public/images/themes/comity/txt-rb.svg | 3 +
.../public/images/themes/comity/txt-rust.svg | 3 +
.../images/themes/comity/txt-script.svg | 3 +
.../public/images/themes/comity/x-pdf.svg | 3 +
.../_h5ai/public/images/themes/default/ar.svg | 3 +
.../public/images/themes/default/aud.svg | 3 +
.../public/images/themes/default/bin.svg | 3 +
.../public/images/themes/default/file.svg | 3 +
.../images/themes/default/folder-page.svg | 3 +
.../images/themes/default/folder-parent.svg | 3 +
.../public/images/themes/default/folder.svg | 3 +
.../public/images/themes/default/img.svg | 3 +
.../public/images/themes/default/txt.svg | 3 +
.../public/images/themes/default/vid.svg | 3 +
.../_h5ai/public/images/themes/default/x.svg | 3 +
traces/_h5ai/public/images/ui/back.svg | 3 +
traces/_h5ai/public/images/ui/crumb.svg | 3 +
traces/_h5ai/public/images/ui/download.svg | 3 +
traces/_h5ai/public/images/ui/filter.svg | 5 +
traces/_h5ai/public/images/ui/info-toggle.svg | 3 +
traces/_h5ai/public/images/ui/paypal.svg | 6 +
.../_h5ai/public/images/ui/preview-close.svg | 3 +
.../public/images/ui/preview-fullscreen.svg | 3 +
.../_h5ai/public/images/ui/preview-next.svg | 3 +
.../images/ui/preview-no-fullscreen.svg | 3 +
.../_h5ai/public/images/ui/preview-prev.svg | 3 +
traces/_h5ai/public/images/ui/preview-raw.svg | 3 +
traces/_h5ai/public/images/ui/search.svg | 5 +
traces/_h5ai/public/images/ui/selected.svg | 3 +
traces/_h5ai/public/images/ui/sidebar.svg | 3 +
traces/_h5ai/public/images/ui/sort.svg | 3 +
traces/_h5ai/public/images/ui/spinner.svg | 6 +
.../_h5ai/public/images/ui/tree-indicator.svg | 3 +
traces/_h5ai/public/images/ui/tree-toggle.svg | 3 +
.../_h5ai/public/images/ui/view-details.svg | 3 +
traces/_h5ai/public/images/ui/view-grid.svg | 3 +
traces/_h5ai/public/images/ui/view-icons.svg | 3 +
traces/_h5ai/public/index.php | 17 +
traces/_h5ai/public/js/scripts.js | 5 +
123 files changed, 3917 insertions(+)
create mode 100644 traces/.htaccess
create mode 100644 traces/_h5ai/.htaccess
create mode 100644 traces/_h5ai/CHANGELOG.md
create mode 100644 traces/_h5ai/README.md
create mode 100644 traces/_h5ai/private/cache/README.md
create mode 100644 traces/_h5ai/private/cache/cmds.json
create mode 100644 traces/_h5ai/private/conf/l10n/af.json
create mode 100644 traces/_h5ai/private/conf/l10n/bg.json
create mode 100644 traces/_h5ai/private/conf/l10n/cs.json
create mode 100644 traces/_h5ai/private/conf/l10n/da.json
create mode 100644 traces/_h5ai/private/conf/l10n/de.json
create mode 100644 traces/_h5ai/private/conf/l10n/el.json
create mode 100644 traces/_h5ai/private/conf/l10n/en.json
create mode 100644 traces/_h5ai/private/conf/l10n/es.json
create mode 100644 traces/_h5ai/private/conf/l10n/et.json
create mode 100644 traces/_h5ai/private/conf/l10n/fi.json
create mode 100644 traces/_h5ai/private/conf/l10n/fr.json
create mode 100644 traces/_h5ai/private/conf/l10n/he.json
create mode 100644 traces/_h5ai/private/conf/l10n/hi.json
create mode 100644 traces/_h5ai/private/conf/l10n/hr.json
create mode 100644 traces/_h5ai/private/conf/l10n/hu.json
create mode 100644 traces/_h5ai/private/conf/l10n/it.json
create mode 100644 traces/_h5ai/private/conf/l10n/ja.json
create mode 100644 traces/_h5ai/private/conf/l10n/ko.json
create mode 100644 traces/_h5ai/private/conf/l10n/lv.json
create mode 100644 traces/_h5ai/private/conf/l10n/nb.json
create mode 100644 traces/_h5ai/private/conf/l10n/nl.json
create mode 100644 traces/_h5ai/private/conf/l10n/pl.json
create mode 100644 traces/_h5ai/private/conf/l10n/pt.json
create mode 100644 traces/_h5ai/private/conf/l10n/ro.json
create mode 100644 traces/_h5ai/private/conf/l10n/ru.json
create mode 100644 traces/_h5ai/private/conf/l10n/sk.json
create mode 100644 traces/_h5ai/private/conf/l10n/sl.json
create mode 100644 traces/_h5ai/private/conf/l10n/sr.json
create mode 100644 traces/_h5ai/private/conf/l10n/sv.json
create mode 100644 traces/_h5ai/private/conf/l10n/tr.json
create mode 100644 traces/_h5ai/private/conf/l10n/uk.json
create mode 100644 traces/_h5ai/private/conf/l10n/zh-cn.json
create mode 100644 traces/_h5ai/private/conf/l10n/zh-tw.json
create mode 100644 traces/_h5ai/private/conf/options.json
create mode 100644 traces/_h5ai/private/conf/types.json
create mode 100644 traces/_h5ai/private/php/class-bootstrap.php
create mode 100644 traces/_h5ai/private/php/core/class-api.php
create mode 100644 traces/_h5ai/private/php/core/class-context.php
create mode 100644 traces/_h5ai/private/php/core/class-fallback.php
create mode 100644 traces/_h5ai/private/php/core/class-filesize.php
create mode 100644 traces/_h5ai/private/php/core/class-item.php
create mode 100644 traces/_h5ai/private/php/core/class-json.php
create mode 100644 traces/_h5ai/private/php/core/class-logger.php
create mode 100644 traces/_h5ai/private/php/core/class-request.php
create mode 100644 traces/_h5ai/private/php/core/class-session.php
create mode 100644 traces/_h5ai/private/php/core/class-setup.php
create mode 100644 traces/_h5ai/private/php/core/class-theme.php
create mode 100644 traces/_h5ai/private/php/core/class-util.php
create mode 100644 traces/_h5ai/private/php/ext/class-archive.php
create mode 100644 traces/_h5ai/private/php/ext/class-custom.php
create mode 100644 traces/_h5ai/private/php/ext/class-search.php
create mode 100644 traces/_h5ai/private/php/ext/class-thumb.php
create mode 100644 traces/_h5ai/private/php/pages/index.php
create mode 100644 traces/_h5ai/private/php/pages/info.php
create mode 100644 traces/_h5ai/public/.htaccess
create mode 100644 traces/_h5ai/public/cache/README.md
create mode 100644 traces/_h5ai/public/css/styles.css
create mode 100644 traces/_h5ai/public/ext/README.md
create mode 100644 traces/_h5ai/public/images/fallback/file.png
create mode 100644 traces/_h5ai/public/images/fallback/folder-parent.png
create mode 100644 traces/_h5ai/public/images/fallback/folder.png
create mode 100644 traces/_h5ai/public/images/favicon/favicon-152.png
create mode 100644 traces/_h5ai/public/images/favicon/favicon-16-32.ico
create mode 100644 traces/_h5ai/public/images/favicon/favicon-16.png
create mode 100644 traces/_h5ai/public/images/favicon/favicon-32.png
create mode 100644 traces/_h5ai/public/images/favicon/favicon.svg
create mode 100644 traces/_h5ai/public/images/themes/README.md
create mode 100644 traces/_h5ai/public/images/themes/comity/ar-apk.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/ar-deb.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/ar-rpm.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-css.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-go.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-html.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-js.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-less.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-md.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-php.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-py.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-rb.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-rust.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/txt-script.svg
create mode 100644 traces/_h5ai/public/images/themes/comity/x-pdf.svg
create mode 100644 traces/_h5ai/public/images/themes/default/ar.svg
create mode 100644 traces/_h5ai/public/images/themes/default/aud.svg
create mode 100644 traces/_h5ai/public/images/themes/default/bin.svg
create mode 100644 traces/_h5ai/public/images/themes/default/file.svg
create mode 100644 traces/_h5ai/public/images/themes/default/folder-page.svg
create mode 100644 traces/_h5ai/public/images/themes/default/folder-parent.svg
create mode 100644 traces/_h5ai/public/images/themes/default/folder.svg
create mode 100644 traces/_h5ai/public/images/themes/default/img.svg
create mode 100644 traces/_h5ai/public/images/themes/default/txt.svg
create mode 100644 traces/_h5ai/public/images/themes/default/vid.svg
create mode 100644 traces/_h5ai/public/images/themes/default/x.svg
create mode 100644 traces/_h5ai/public/images/ui/back.svg
create mode 100644 traces/_h5ai/public/images/ui/crumb.svg
create mode 100644 traces/_h5ai/public/images/ui/download.svg
create mode 100644 traces/_h5ai/public/images/ui/filter.svg
create mode 100644 traces/_h5ai/public/images/ui/info-toggle.svg
create mode 100644 traces/_h5ai/public/images/ui/paypal.svg
create mode 100644 traces/_h5ai/public/images/ui/preview-close.svg
create mode 100644 traces/_h5ai/public/images/ui/preview-fullscreen.svg
create mode 100644 traces/_h5ai/public/images/ui/preview-next.svg
create mode 100644 traces/_h5ai/public/images/ui/preview-no-fullscreen.svg
create mode 100644 traces/_h5ai/public/images/ui/preview-prev.svg
create mode 100644 traces/_h5ai/public/images/ui/preview-raw.svg
create mode 100644 traces/_h5ai/public/images/ui/search.svg
create mode 100644 traces/_h5ai/public/images/ui/selected.svg
create mode 100644 traces/_h5ai/public/images/ui/sidebar.svg
create mode 100644 traces/_h5ai/public/images/ui/sort.svg
create mode 100644 traces/_h5ai/public/images/ui/spinner.svg
create mode 100644 traces/_h5ai/public/images/ui/tree-indicator.svg
create mode 100644 traces/_h5ai/public/images/ui/tree-toggle.svg
create mode 100644 traces/_h5ai/public/images/ui/view-details.svg
create mode 100644 traces/_h5ai/public/images/ui/view-grid.svg
create mode 100644 traces/_h5ai/public/images/ui/view-icons.svg
create mode 100644 traces/_h5ai/public/index.php
create mode 100644 traces/_h5ai/public/js/scripts.js
diff --git a/traces/.htaccess b/traces/.htaccess
new file mode 100644
index 0000000..bc35599
--- /dev/null
+++ b/traces/.htaccess
@@ -0,0 +1 @@
+DirectoryIndex /_h5ai/public/index.php
\ No newline at end of file
diff --git a/traces/_h5ai/.htaccess b/traces/_h5ai/.htaccess
new file mode 100644
index 0000000..95e775b
--- /dev/null
+++ b/traces/_h5ai/.htaccess
@@ -0,0 +1,165 @@
+## details here: https://github.com/h5bp/server-configs-apache
+
+
+
+## SECURITY ###################################################################
+
+DirectoryIndex disabled
+FileETag None
+ServerSignature Off
+
+# Apache < 2.3
+
+ Order allow,deny
+ Deny from all
+ Satisfy All
+
+
+# Apache ≥ 2.3
+
+ Require all denied
+
+
+
+ Header set X-Content-Type-Options "nosniff"
+ Header unset ETag
+ Header unset X-Powered-By
+
+
+
+ Options -Indexes
+
+
+
+
+## COMPAT #####################################################################
+
+AddDefaultCharset utf-8
+
+
+ AddCharset utf-8 .css .html .js .json .php .svg
+
+ AddType application/font-woff woff
+ AddType application/font-woff2 woff2
+ AddType application/json json
+ AddType application/javascript js
+ AddType application/vnd.ms-fontobject eot
+ AddType application/x-font-ttf ttc ttf
+ AddType image/jpeg jpeg jpg
+ AddType image/png png
+ AddType image/svg+xml svg svgz
+ AddType image/x-icon ico
+ AddType font/opentype otf
+ AddType text/css css
+ AddType text/html html
+
+
+
+
+## SPEED ######################################################################
+
+
+ ExpiresActive on
+ ExpiresDefault "access plus 1 month"
+
+ ExpiresByType application/json "access plus 0 seconds"
+
+ ExpiresByType text/html "access plus 1 minute"
+
+ ExpiresByType image/x-icon "access plus 1 week"
+
+ ExpiresByType application/javascript "access plus 1 year"
+ ExpiresByType image/jpeg "access plus 1 year"
+ ExpiresByType image/png "access plus 1 year"
+ ExpiresByType image/svg+xml "access plus 1 year"
+ ExpiresByType text/css "access plus 1 year"
+
+
+
+
+
+ SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
+ RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
+
+
+
+ # Apache ≥ 2.3
+
+ # mod_filter as module only available for Apache ≥ 2.3.7
+
+ AddOutputFilterByType DEFLATE "application/atom+xml" \
+ "application/javascript" \
+ "application/json" \
+ "application/ld+json" \
+ "application/manifest+json" \
+ "application/rdf+xml" \
+ "application/rss+xml" \
+ "application/schema+json" \
+ "application/vnd.geo+json" \
+ "application/vnd.ms-fontobject" \
+ "application/x-font-ttf" \
+ "application/x-javascript" \
+ "application/x-web-app-manifest+json" \
+ "application/xhtml+xml" \
+ "application/xml" \
+ "font/eot" \
+ "font/opentype" \
+ "image/bmp" \
+ "image/svg+xml" \
+ "image/vnd.microsoft.icon" \
+ "image/x-icon" \
+ "text/cache-manifest" \
+ "text/css" \
+ "text/html" \
+ "text/javascript" \
+ "text/plain" \
+ "text/vcard" \
+ "text/vnd.rim.location.xloc" \
+ "text/vtt" \
+ "text/x-component" \
+ "text/x-cross-domain-policy" \
+ "text/xml"
+
+
+
+ # Apache < 2.3
+
+ AddOutputFilterByType DEFLATE "application/atom+xml" \
+ "application/javascript" \
+ "application/json" \
+ "application/ld+json" \
+ "application/manifest+json" \
+ "application/rdf+xml" \
+ "application/rss+xml" \
+ "application/schema+json" \
+ "application/vnd.geo+json" \
+ "application/vnd.ms-fontobject" \
+ "application/x-font-ttf" \
+ "application/x-javascript" \
+ "application/x-web-app-manifest+json" \
+ "application/xhtml+xml" \
+ "application/xml" \
+ "font/eot" \
+ "font/opentype" \
+ "image/bmp" \
+ "image/svg+xml" \
+ "image/vnd.microsoft.icon" \
+ "image/x-icon" \
+ "text/cache-manifest" \
+ "text/css" \
+ "text/html" \
+ "text/javascript" \
+ "text/plain" \
+ "text/vcard" \
+ "text/vnd.rim.location.xloc" \
+ "text/vtt" \
+ "text/x-component" \
+ "text/x-cross-domain-policy" \
+ "text/xml"
+
+
+
+ AddEncoding gzip gz
+ AddEncoding gzip svgz
+
+
diff --git a/traces/_h5ai/CHANGELOG.md b/traces/_h5ai/CHANGELOG.md
new file mode 100644
index 0000000..b575191
--- /dev/null
+++ b/traces/_h5ai/CHANGELOG.md
@@ -0,0 +1,598 @@
+# Changelog
+
+
+## v0.29.2 - *2019-03-22*
+
+* update `babel-loader` to 7.1.1
+* update `eslint` to 5.15.3
+* update `ghu` to 0.13.0
+* update `jsdom` to 14.0.0
+* update `kjua` to 0.2.0
+* update `lolight` to 1.0.0
+* update `scar` to 1.2.0
+
+
+## v0.29.1 - *2019-01-20*
+
+* replace `babel-preset-es2015` with `babel-preset-env`
+* update `eslint` to 5.14.1
+* update `ghu` to 0.12.0
+* update `jsdom` to 9.2.0
+* update `kjua` to 0.1.2
+* update `lolight` to 0.6.0
+* update `marked` to 0.6.1
+* update `normalize.css` to 8.0.1
+* update `scar` to 1.0.0
+
+
+## v0.29.0 - *2016-08-12*
+
+* back to cleaner visual experience
+* add option to disable sidebar
+* add options to filter/search ignore case
+* replace PHP `getenv` calls with `$_SERVER` lookups
+* add `view.fallbackMode` option to generally serve only fallback mode
+* serve fallback mode for text browsers (`curl`, `links`, `lynx`, `w3m`)
+* change type `txt-svg` to `img-svg`, no thumbs but preview
+* fix a tree indentation glitch
+* fix shell command detection on Windows
+* fix Piwik anayltics
+* fix `.htaccess` auth issues
+* fix drag-select on scrollable content
+* fix download-all function
+* fix audio and video preview loading
+* fix thumbnail request issues
+* add `rust` type and icon
+* add `autoplay` option to audio and video preview
+* add `--dereference` to `shell-du` to follow sym links
+* remove *Install* section from `README.md`, causes too much trouble
+* remove peer5 support
+* update build process to use `node 6.0+`, no need for babel now
+* replace `jquery-qrcode` with [`kjua`](https://larsjung.de/kjua/)
+* replace `prism` with [`lolight`](https://larsjung.de/lolight/)
+* move deps to `package.json` (`normalize.css`, `kjua`, `lolight` and `marked`)
+* remove `jQuery`
+* remove `lodash`
+* remove [`modulejs`](https://larsjung.de/modulejs/) for now
+* reduce JS code by 60% (~250kb -> ~100kb)
+* update languages (`et`, `nl`, `pl`)
+
+
+## v0.28.0 - *2015-12-19*
+
+* now require PHP 5.5.0+
+* change index path to `/_h5ai/public/index.php`
+* now only `/_h5ai/public/` needs to be web-accessible
+* add support for custom script and style additions
+* add options to set font families
+* add search
+* add ignorecase sorting option to tree
+* add wide links in tree view
+* add IE edge mode
+* add frontend tests
+* fix some styles in IE10
+* fix preview bottom bar for small screen widths
+* lots of code cleanup and refactorings
+* change API
+* update build process, now uses [`ghu`](https://larsjung.de/ghu/)
+* switch from jshint and jscs to [`eslint`](http://eslint.org/)
+* update `jQuery` to 2.1.4
+* update `lodash` to 3.9.3 (add debounce and trim)
+* update `marked` to 0.3.5
+* update `modulejs` to 1.13.0
+* update `prism` to 2015-12-19
+* update h5bp styles to 5.2.0
+* update `normalize.css` to 3.0.3
+* remove `Moment.js`
+
+
+## v0.27.0 - *2015-04-06*
+
+* new layout
+* add editorconfig
+* drop support for IE9 (gets fallback)
+* update sidebar settings
+* add info sidebar
+* add opt-out for click'n'drag selection
+* add package name option for single selections
+* add initial support for Peer5
+* add option to down-sample images for preview
+* add option for natural sorting in tree sidebar
+* fix problems with files/folders named `0`
+* change font from `Ubuntu` to `Roboto` (smaller footprint, clearer for small sizes)
+* switch back to Google Fonts
+* improve PDF thumbnail quality
+* improve drag-select
+* improve image preview
+* prevent listing `_h5ai` folder and subfolders
+* update build process, now uses [`mkr`](https://larsjung.de/mkr/) and [`fQuery`](https://larsjung.de/fquery/)
+* update `jQuery` to 2.1.3
+* update `jQuery.qrcode` to 0.11.0
+* update `Lo-Dash` to 3.6.0
+* update `Modernizr` to 2.8.3
+* update `modulejs` to 1.4.0
+* update `Moment.js` to 2.9.0
+* update `Prism` to 2015-04-05
+* remove deprecated Google Analytics code
+* remove `jQuery.fracs`
+* remove `jQuery.scrollpanel`
+* remove `jQuery.mousewheel`
+* update languages (`af`, `es`, `ja`, `ko`, `ru`, `zh-cn`)
+
+
+## v0.26.1 - *2014-08-17*
+
+* fix links
+
+
+## v0.26.0 - *2014-08-16*
+
+* remove True Type fonts
+* outsource themes to [h5ai-themes](https://github.com/lrsjng/h5ai-themes)
+* add filesize fallback for large files and 32bit PHP
+* fix server detection
+* add config file tests to info page
+* remove JSON shim
+* add caching of command checks
+* update `jQuery.mousewheel` to 3.1.12
+* update `jQuery.qrcode` to 0.8.0
+* replace `markdown` with [`marked`](https://github.com/chjj/marked) 0.3.2
+* update `modulejs` to 0.4.5
+* update `Moment.js` to 2.8.1
+* replace `underscore` with [`Lo-Dash`](https://github.com/lodash/lodash) 2.4.1
+* replace `SyntaxHighlighter` with [`Prism`](http://prismjs.com) 2014-08-04
+
+
+## v0.25.2 - *2014-07-01*
+
+* add optional info page protection
+* fix `short_open_tag` issues for PHP < 5.4.0
+* fix default folder download (`alwaysVisible` option)
+* minor fixes
+
+
+## v0.25.1 - *2014-06-25*
+
+* fix broken paths for filenames containing '+' characters
+* fix Google Universal Analytics
+* fix file type check
+
+
+## v0.25.0 - *2014-06-22*
+
+* add sidebar
+* add initial theme support
+* add icons from [Evolvere Icon Theme](http://franksouza183.deviantart.com/art/Evolvere-Icon-theme-440718295)
+* add PHP variant to calc folder sizes
+* add scroll position reset on location change (issue [#279](https://github.com/lrsjng/h5ai/issues/279))
+* add option to hide unreadable files
+* add option where to place folders (top, inplace, bottom)
+* add markdown support for custom header and footer files
+* add video and audio preview via HTML5 elements (no fallback, works best in Chrome)
+* add filter reset on location change
+* add option to make download button always visible
+* add Google UA support
+* extend selectable icon sizes (add 128px, 192px, 256px, 384px)
+* improve preview GUI
+* disable thumbs in `cache` folder
+* fix QR code URI origin (issue [#287](https://github.com/lrsjng/h5ai/issues/287))
+* replace PHP backtick operator with `exec`
+* remove server side file manipulation extensions `dropbox`, `delete` and `rename`
+* update `H5BP` to 4.3.0
+* update `jQuery` to 2.1.1
+* update `json2.js` to 2014-02-04
+* update `markdown-js` to 0.5.0
+* update `Modernizr` to 2.8.2
+* update `Moment.js` to 2.6.0
+* update `Underscore.js` to 1.6.0
+* update languages (`bg`, `ko`, `pt`, `sl`, `sv`, `zh-cn`)
+
+
+## v0.24.1 - *2014-04-09*
+
+* security fixes! (issues [#268](https://github.com/lrsjng/h5ai/issues/268), [#269](https://github.com/lrsjng/h5ai/issues/269))
+* fix WinOS command detection
+* update languages (`fi`, `fr`, `hi`, `it`, `zh-tw`)
+
+
+## v0.24.0 - *2013-09-04*
+
+* updates image and text preview
+* adds variable icon sizes
+* adds optional natural sort of items
+* adds optional checkboxes to select items
+* adds text preview modes: none, fixed, markdown
+* optionally hide folders in main view
+* makes use of EXIF thumbnails optional
+* fixes file deletion of multiple files
+* fixes `setParentFolderLabels = false`
+* fixes shell-arg and RegExp escape issues
+* cleans code
+* updates info page `/_h5ai`
+* adds `aiff` to `audio` types
+* adds `da` translation by Ronnie Milbo
+* updates to `pl` translation by Mark
+
+
+## v0.23.0 - *2013-07-21*
+
+* removes `aai` mode!
+* drops support for IE7+8 (simple fallback, same as no javascript)
+* uses History API if available (way faster browsing)
+* faster thumbnail generation if EXIF thumbnails available
+* adds optional custom headers/footers that are propageted to all subfolders
+* optional hide parent folder links
+* some fixes on previews
+* speeds up packaged downloads
+* add line wrap and line highlighting (on hover) to text preview
+* new design (colors, images)
+* now uses scalable images for the interface
+* fixes filter (ignore parent folder, display of `no match`)
+* lots of small fixes
+* updates `H5BP` to 4.2.0
+* updates `jQuery` to 2.0.3
+* updates `jQuery.mousewheel` to 3.1.3
+* updates `Moment.js` to 2.1.0
+* updates `markdown-js` to 0.4.0-9c21acdf08
+* updates `json2.js` to 2013-05-26
+* adds `uk` translation by Viktor Matveenko
+* updates to `pl` translation by Mark
+
+
+## v0.22.1 - *2012-10-16*
+
+* bug fix concerning API requests in PHP mode
+* minor changes in responsive styles
+
+
+## v0.22 - *2012-10-14*
+
+* general changes h5ai directory layout and configuration
+* splits configuration file (`config.json`) into files `options.json`, `types.json` and `langs.json`
+* localization now in separate files
+* adds auto-refresh
+* adds drag'n'drop upload (PHP, experimental)
+* adds file deletion (PHP, experimental)
+* cleans and improves PHP code
+* PHP no longer respects htaccess restrictions (so be careful)
+* PHP ignore patterns might include paths now
+* improves separation between aai and php mode
+* improves performance in aai mode
+* adds optional binary prefixes for file sizes
+* improves filter: autofocus on keypress, clear on `ESC`
+* download packages now packaged relative to current folder
+* download package name changable
+* splits type `js` into `js` and `json`
+* prevents some errors with files > 2GB on 32bit OS
+* adds max subfolder size in tree view
+* adds ctrl-click file selection
+* adds Piwik analytics extension
+* temp download packages are now stored in the `cache`-folder and deleted as soon as possible
+* updates translations
+* adds `he` translation by [Tomer Cohen](https://github.com/tomer)
+* updates 3rd party libs
+
+
+## v0.21 - *2012-08-06*
+
+* fixes misaligned image previews
+* adds no JavaScript fallback to PHP version
+* fixes duplicate tree entries and empty main views
+* adds Google Analytics support (async)
+* improves filter (now ignorecase, now only checks if chars in right order)
+* adds keyboard support to image preview (space, enter, backspace, left, right, up, down, f, esc)
+* adds text file preview and highlighting with [SyntaxHighlighter](http://alexgorbatchev.com/SyntaxHighlighter/) (same keys as img preview)
+* adds Markdown preview with [markdown-js](https://github.com/evilstreak/markdown-js)
+* adds new type `markdown`
+* changes language code `gr` to `el`
+* adds localization for filter placeholder
+* adds `hu` translation by [Rodolffo](https://github.com/Rodolffo)
+* updates to [jQuery.qrcode](https://larsjung.de/qrcode/) 0.2
+* updates to [jQuery.scrollpanel](https://larsjung.de/scrollpanel/) 0.1
+* updates to [modulejs](https://larsjung.de/modulejs/) 0.2
+* updates to [Moment.js](http://momentjs.com) 1.7.0
+* updates to [Underscore.js](http://underscorejs.org) 1.3.3
+
+
+## v0.20 - *2012-05-11*
+
+* adds image preview
+* adds thumbnails for video and pdf
+* adds support for lighttpd, nginx and cherokee and maybe other webservers with PHP
+* adds folder size in PHP version via shell `du`
+* fixes some localization problems
+* updates info page at `/_h5ai/`
+* switches to JSHint
+
+
+## v0.19 - *2012-04-19*
+
+* adds lots of config options
+* changes in `config.js` and `h5ai.htaccess`
+* fixes js problems in IE 7+8
+* hides broken tree view in IE < 9, adds a message to the footer
+* removes hash changes since they break logical browser history
+* fixes thumbnail size for portrait images in icon view
+* fixes problems with file type recognition
+* adds an info page at `/_h5ai/`
+* sort order is preserved while browsing
+* removes PHP error messages on thumbnail generation
+* fixes PHP some problems with packed download
+* adds support for tarred downloads
+* changes crumb image for folders with an index file
+* adds `index.php` to use h5ai in non-Apache environments
+* switches from [Datejs](http://www.datejs.com) to [Moment.js](http://momentjs.com)
+* adds [underscore.js](http://underscorejs.org)
+* fixes mousewheel problems, updates [jQuery.mousewheel](https://github.com/brandonaaron/jquery-mousewheel) to 3.0.6
+* updates `lv` translation
+* adds `ro` translation by [Jakob Cosoroabă](https://github.com/midday)
+* adds `ja` translation by [metasta](https://github.com/metasta)
+* adds `nb` translation by [Sindre Sorhus](https://github.com/sindresorhus)
+* adds `sr` translation by [vBm](https://github.com/vBm)
+* adds `gr` translation by [xhmikosr](https://github.com/xhmikosr)
+
+
+## v0.18 - *2012-02-24*
+
+* adds optional QRCode display
+* adds optional filtering for displayed files and folders
+* updates design
+* improves zipped download
+* adds support for zipped download of htaccess restricted files
+* changes h5ai.htaccess
+* custom headers/footers are now optional and disabled by default
+* fixes problems with folder recognition in the JS version
+* fixes include problems in PHP version
+* fixes path problems on servers running on Windows in PHP version
+* fixes broken links in custom headers/footers while zipped download enabled
+* fixes problems with thumbnails for files with single or double quotes in filename
+* improves url hashes
+* updates year in `LICENSE.TXT`
+* updates es translation
+* adds `zh-tw` translation by [Yao Wei](https://github.com/medicalwei)
+* updates `zh-cn` translation
+
+
+## v0.17 - *2011-11-28*
+
+* h5ai is now located in `_h5ai` to reduce collisions
+* switches from HTML5 Boilerplate reset to normalization
+* adds some style changes for small devices
+* configuration (options, types, translations) now via `config.js`
+* icons for JS version are now configured via `config.js`
+* sort order configuration changed
+* sorting is now done without page reload
+* adds `customHeader` and `customFooter` to `config.js`
+* supports restricted folders to some extent
+* some style changes on tree and language menu
+* fixes total file/folder count in status bar
+* adds support for use with userdir (requires some manual changes)
+
+
+## v0.16 - *2011-11-02*
+
+* sorts translations in `options.js`
+* improves HTML head sections
+* refactors JavaScript and PHP a lot
+* improves/fixes file selection for zipped download
+* fixes scrollbar and header/footer link issues (didn't work when zipped download enabled)
+* adds support for ctrl-select
+* `dateFormat` in `options.js` changed, now affecting JS and PHP version
+* `dateFormat` is localizable by adding it to a translation in `options.js`
+* PHP version is now configurable via `php/config.php` (set custom doc root and other PHP related things)
+* image thumbs and zipped download is disabled by default now, but works fine if PHP is configured
+
+
+## v0.15.2 - *2011-09-18*
+
+* adds `it` translation by [Salvo Gentile](https://github.com/SalvoGentile) and [Marco Patriarca](https://github.com/Fexys)
+* switches build process from scripp to wepp
+
+
+## v0.15.1 - *2011-09-06*
+
+* fixes security issues with the zipped download feature
+* makes zipped download optional (but enabled by default)
+
+
+## v0.15 - *2011-09-04*
+
+* adds zipped download for selected files
+* cleans and refactores
+
+
+## v0.14.1 - *2011-09-01*
+
+* display meta information in bottom bar (icon view)
+* adds `zh-cn` translation by [Dongsheng Cai](https://github.com/dongsheng)
+* adds `pl` translation by Radosław Zając
+* adds `ru` translation by Богдан Илюхин
+
+
+## v0.14 - *2011-08-16*
+
+* adds image thumbnails for PHP version
+* new option `slideTree` to turn off auto slide in
+
+
+## v0.13.2 - *2011-08-12*
+
+* changes in `/h5ai/.htaccess` ... PHP configuration ...
+
+
+## v0.13.1 - *2011-08-12*
+
+* fixes initial tree display
+* adds sort order option
+* adds/fixes some translations
+* adds `lv` translation by Sandis Veinbergs
+
+
+## v0.13 - *2011-08-06*
+
+* adds PHP implementation! (should work with PHP 5.2+)
+* adds new options
+* changes layout of the bottom bar to display status information
+* adds language selector to the bottom bar
+* quotes keys in `options.js` to make it valid json
+* changes value of option `lang` from `undefined` to `null`
+* adds some new keys to `h5aiLangs`
+* adds browser caching rules for css and js
+* adds `pt` translation by [Jonnathan](https://github.com/jonnsl)
+* adds `bg` translation by George Andonov
+
+
+## v0.12.3 - *2011-07-30*
+
+* adds `tr` translation by [Batuhan Icoz](https://github.com/batuhanicoz)
+
+
+## v0.12.2 - *2011-07-30*
+
+* adds `es` translation by Jose David Calderon Serrano
+
+
+## v0.12.1 - *2011-07-29*
+
+* fixes unchecked use of console.log
+
+
+## v0.12 - *2011-07-28*
+
+* improves performance
+
+
+## v0.11 - *2011-07-27*
+
+* changes license to MIT license, see `LICENSE.txt`
+
+
+## v0.10.2 - *2011-07-26*
+
+* improves tree scrollbar
+
+
+## v0.10.1 - *2011-07-24*
+
+* fixes problems with ' in links
+
+
+## v0.10 - *2011-07-24*
+
+* fixes problems with XAMPP on Windows (see `dot.htaccess` comments for instructions)
+* fixes tree fade-in-fade-out effect for small displays ([issue #6](https://github.com/lrsjng/h5ai/issues/6))
+* adds custom scrollbar to tree ([issue #6](https://github.com/lrsjng/h5ai/issues/6))
+* fixes broken links caused by URI encoding/decoding ([issue #9](https://github.com/lrsjng/h5ai/issues/9))
+* adds "empty" to localization (hope Google Translate did a good job here)
+
+
+## v0.9 - *2011-07-18*
+
+* links hover states between crumb, extended view and tree
+* fixes size of tree view (now there's a ugly scrollbar, hopefully will be fixed)
+* refactores js to improve performance and cleaned code
+* adds caching for folder status codes and content
+* adds `fr` translation by [Nicolas](https://github.com/Nicosmos)
+* adds `nl` translation by [Stefan de Konink](https://github.com/skinkie)
+* adds `sv` translation by Oscar Carlsson
+
+
+## v0.8 - *2011-07-08*
+
+* removes slashes from folder labels
+* optionally rename parent folder entries to real folder names, see `options.js`
+* long breadcrumbs (multiple rows) no longer hide content
+* error folder icons are opaque now
+* refactores js a lot (again...)
+
+
+## v0.7 - *2011-07-07*
+
+* removes shadows
+* smarter tree side bar
+
+
+## v0.6 - *2011-07-05*
+
+* refactores js
+* adds localization, see `options.js`
+
+
+## v0.5.3 - *2011-07-04*
+
+* refactores js
+* adds basic options support via `options.js`
+* adds comments to `options.js`
+* adds optional tree sidebar
+
+
+## v0.5.2 - *2011-07-02*
+
+* details view adjusts to window width
+* links icon for *.gz and *.bz2
+
+
+## v0.5.1 - *2011-07-01*
+
+* disables tree sidebar for now, since it had unwanted side effects
+
+
+## v0.5 - *2011-07-01*
+
+* adds tree sidebar
+* some refactorings
+
+
+## v0.4 - *2011-06-27*
+
+* adds better fallback, in case JavaScript is disabled
+* rewrites js, fixed middle-button click etc. problems
+* refactors css
+* sorts, adds and moves icons and images
+* updates dot.access
+
+
+## v0.3.2 - *2011-06-24*
+
+* removes lib versions from file names
+* adds 'empty' indicator for icons view
+
+
+## v0.3.1 - *2011-06-24*
+
+* refactores js
+* adds `folderClick` and `fileClick` callback hooks
+* fixes .emtpy style
+
+
+## v0.3 - *2011-06-23*
+
+* includes build stuff, files previously found in the base directory are now located in folder `target`
+* styles and scripts are now minified
+* adds Modernizr 2.0.4 for future use
+* updates jQuery to version 1.6.1
+
+
+## v0.2.3 - *2011-06-17*
+
+* more refactoring in main.js
+
+
+## v0.2.2 - *2011-06-16*
+
+* refactores a lot, adds some comments
+* includes fixes from [NumEricR](https://github.com/NumEricR)
+* adds top/bottom message support, only basicly styled
+
+
+## v0.2.1 - *2011-06-16*
+
+* fixes croped filenames
+* fixes missing .png extension in header
+* adds some color to the links
+* adds changelog
+
+
+## v0.2 - *2011-06-15*
+
+* adds icon view
diff --git a/traces/_h5ai/README.md b/traces/_h5ai/README.md
new file mode 100644
index 0000000..66eb547
--- /dev/null
+++ b/traces/_h5ai/README.md
@@ -0,0 +1,72 @@
+# h5ai
+
+[![license][license-img]][github] [![web][web-img]][web] [![github][github-img]][github]
+
+A modern HTTP web server index for Apache httpd, lighttpd, nginx and Cherokee.
+
+
+## Important
+
+* Do **not** install any files from the `src` folder, they need to be
+ preprocessed to work correctly!
+* Find a preprocessed package and detailed install instructions on the
+ [project page][web].
+* For bug reports and feature requests please use [issues][github-issues].
+
+
+## Build
+
+There are installation ready packages for the latest [releases][release] and
+[dev builds][develop]. But to build **h5ai** yourself either `git clone` or
+download the repository. From within the root folder run the following
+commands to find a fresh zipball in folder `build` (tested on linux only,
+requires [`node 6.0+`][node] to be installed).
+
+~~~sh
+> npm install
+> npm run build
+~~~
+
+
+## License
+
+The MIT License (MIT)
+
+Copyright (c) 2019 Lars Jung (https://larsjung.de)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+
+## References
+
+**h5ai** profits from other projects, all of them licensed under the MIT license
+too. Exceptions are some [Material Design icons][material-design-icons] (CC BY 4.0).
+
+
+[web]: https://larsjung.de/h5ai/
+[github]: https://github.com/lrsjng/h5ai
+[github-issues]: https://github.com/lrsjng/h5ai/issues
+[release]: https://release.larsjung.de/h5ai/
+[develop]: https://release.larsjung.de/h5ai/develop/
+[node]: https://nodejs.org
+[material-design-icons]: https://github.com/google/material-design-icons
+
+[license-img]: https://img.shields.io/badge/license-MIT-a0a060.svg?style=flat-square
+[web-img]: https://img.shields.io/badge/web-larsjung.de/h5ai-a0a060.svg?style=flat-square
+[github-img]: https://img.shields.io/badge/github-lrsjng/h5ai-a0a060.svg?style=flat-square
diff --git a/traces/_h5ai/private/cache/README.md b/traces/_h5ai/private/cache/README.md
new file mode 100644
index 0000000..60bc416
--- /dev/null
+++ b/traces/_h5ai/private/cache/README.md
@@ -0,0 +1,9 @@
+# Cache
+
+Private cache.
+
+This directory is used for server side caching. To use caching make this
+directory writable for your webserver.
+
+There is no critical data in here. You can savely remove any content. This
+will clear the cache.
diff --git a/traces/_h5ai/private/cache/cmds.json b/traces/_h5ai/private/cache/cmds.json
new file mode 100644
index 0000000..b92ad64
--- /dev/null
+++ b/traces/_h5ai/private/cache/cmds.json
@@ -0,0 +1 @@
+{"command":true,"which":true,"avconv":false,"convert":false,"du":true,"ffmpeg":false,"gm":false,"tar":true,"zip":false}
\ No newline at end of file
diff --git a/traces/_h5ai/private/conf/l10n/af.json b/traces/_h5ai/private/conf/l10n/af.json
new file mode 100644
index 0000000..5150c7b
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/af.json
@@ -0,0 +1,18 @@
+{
+ "lang": "afrikaans",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "besonderhede",
+ "download": "aflaai",
+ "empty": "leeg",
+ "files": "lêers",
+ "filter": "filter",
+ "folders": "gidse",
+ "grid": "rooster",
+ "icons": "ikone",
+ "lastModified": "Laas verander",
+ "name": "Naam",
+ "noMatch": "geen resultaat",
+ "parentDirectory": "Hoër Vlak",
+ "size": "Grootte"
+}
diff --git a/traces/_h5ai/private/conf/l10n/bg.json b/traces/_h5ai/private/conf/l10n/bg.json
new file mode 100644
index 0000000..6808e62
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/bg.json
@@ -0,0 +1,18 @@
+{
+ "lang": "български",
+
+ "dateFormat": "DD-MM-YYYY HH:mm",
+ "details": "детайли",
+ "download": "изтегляне",
+ "empty": "празна",
+ "files": "файлове",
+ "filter": "филтър",
+ "folders": "директории",
+ "grid": "мрежа",
+ "icons": "икони",
+ "lastModified": "Последна промяна",
+ "name": "Име",
+ "noMatch": "няма съвпадение",
+ "parentDirectory": "Предходна директория",
+ "size": "Размер"
+}
diff --git a/traces/_h5ai/private/conf/l10n/cs.json b/traces/_h5ai/private/conf/l10n/cs.json
new file mode 100644
index 0000000..1e34e61
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/cs.json
@@ -0,0 +1,18 @@
+{
+ "lang": "čeština",
+
+ "dateFormat": "DD.MM.YYYY HH:mm",
+ "details": "Podrobnosti",
+ "download": "Stáhnout",
+ "empty": "Prázdná složka",
+ "files": "souborů",
+ "filter": "Filtr",
+ "folders": "složek",
+ "grid": "Seznam",
+ "icons": "Velké ikony",
+ "lastModified": "Datum změny",
+ "name": "Název",
+ "noMatch": "Žádná shoda",
+ "parentDirectory": "Nadřazený adresář",
+ "size": "Velikost"
+}
diff --git a/traces/_h5ai/private/conf/l10n/da.json b/traces/_h5ai/private/conf/l10n/da.json
new file mode 100644
index 0000000..3b8fa06
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/da.json
@@ -0,0 +1,18 @@
+{
+ "lang": "dansk",
+
+ "dateFormat": "DD-MM-YYYY HH:mm",
+ "details": "detaljer",
+ "download": "download",
+ "empty": "tom",
+ "files": "filer",
+ "filter": "filter",
+ "folders": "mapper",
+ "grid": "grid",
+ "icons": "ikoner",
+ "lastModified": "Sidst ændret",
+ "name": "Navn",
+ "noMatch": "ingen match",
+ "parentDirectory": "Overordnet mappe",
+ "size": "Størrelse"
+}
diff --git a/traces/_h5ai/private/conf/l10n/de.json b/traces/_h5ai/private/conf/l10n/de.json
new file mode 100644
index 0000000..6d8c613
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/de.json
@@ -0,0 +1,22 @@
+{
+ "lang": "deutsch",
+
+ "dateFormat": "DD.MM.YYYY HH:mm",
+ "details": "Details",
+ "download": "Download",
+ "empty": "leer",
+ "files": "Dateien",
+ "filter": "filtern",
+ "folders": "Ordner",
+ "grid": "Gitter",
+ "icons": "Icons",
+ "language": "Sprache",
+ "lastModified": "Geändert",
+ "name": "Name",
+ "noMatch": "keine Treffer",
+ "parentDirectory": "Übergeordnetes Verzeichnis",
+ "search": "suchen",
+ "size": "Größe",
+ "tree": "Baum",
+ "view": "Ansicht"
+}
diff --git a/traces/_h5ai/private/conf/l10n/el.json b/traces/_h5ai/private/conf/l10n/el.json
new file mode 100644
index 0000000..2d9c00d
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/el.json
@@ -0,0 +1,18 @@
+{
+ "lang": "ελληνικά",
+
+ "dateFormat": "DD/MM/YYYY HH:mm",
+ "details": "λεπτομέρειες",
+ "download": "μεταμόρφωση",
+ "empty": "κενό",
+ "files": "αρχεία",
+ "filter": "φίλτρο",
+ "folders": "φάκελοι",
+ "grid": "πλέγμα",
+ "icons": "εικονίδια",
+ "lastModified": "Τελευταία τροποποίηση",
+ "name": "Όνομα",
+ "noMatch": "κανένα αποτέλεσμα",
+ "parentDirectory": "Προηγούμενος Κατάλογος",
+ "size": "Μέγεθος"
+}
diff --git a/traces/_h5ai/private/conf/l10n/en.json b/traces/_h5ai/private/conf/l10n/en.json
new file mode 100644
index 0000000..05e9b4e
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/en.json
@@ -0,0 +1,23 @@
+/* only here as a reference, these values are the hardcoded defaults */
+{
+ "lang": "english",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "details",
+ "download": "download",
+ "empty": "empty",
+ "files": "files",
+ "filter": "filter",
+ "folders": "folders",
+ "grid": "grid",
+ "icons": "icons",
+ "language": "Language",
+ "lastModified": "Last modified",
+ "name": "Name",
+ "noMatch": "no match",
+ "parentDirectory": "Parent Directory",
+ "search": "search",
+ "size": "Size",
+ "tree": "Tree",
+ "view": "View"
+}
diff --git a/traces/_h5ai/private/conf/l10n/es.json b/traces/_h5ai/private/conf/l10n/es.json
new file mode 100644
index 0000000..e42a5b9
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/es.json
@@ -0,0 +1,22 @@
+{
+ "lang": "español",
+
+ "dateFormat": "DD/MM/YYYY HH:mm",
+ "details": "Detalles",
+ "download": "Descargar",
+ "empty": "vacío",
+ "files": "Archivos",
+ "filter": "Filtrar",
+ "folders": "Directorios",
+ "grid": "Cuadrícula",
+ "icons": "Íconos",
+ "language": "Idioma",
+ "lastModified": "Última modificación",
+ "name": "Nombre",
+ "noMatch": "Sin coincidencias",
+ "parentDirectory": "Directorio superior",
+ "search": "buscar",
+ "size": "Tamaño",
+ "tree": "Arbol",
+ "view": "Vista"
+}
diff --git a/traces/_h5ai/private/conf/l10n/et.json b/traces/_h5ai/private/conf/l10n/et.json
new file mode 100644
index 0000000..8f3d1dc
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/et.json
@@ -0,0 +1,22 @@
+{
+ "lang": "estonian",
+
+ "dateFormat": "DD-MM-YYYY HH.mm",
+ "details": "täpsem info",
+ "download": "laadi alla",
+ "empty": "tühi",
+ "files": "failid",
+ "filter": "filter",
+ "folders": "kataloogid",
+ "grid": "võre",
+ "icons": "ikoonid",
+ "language": "Keel",
+ "lastModified": "Viimati muudetud",
+ "name": "Nimi",
+ "noMatch": "ei leitud sobivat",
+ "parentDirectory": "Emakataloog",
+ "search": "otsi",
+ "size": "Suurus",
+ "tree": "Puu",
+ "view": "Vaade"
+}
diff --git a/traces/_h5ai/private/conf/l10n/fi.json b/traces/_h5ai/private/conf/l10n/fi.json
new file mode 100644
index 0000000..c19c0ed
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/fi.json
@@ -0,0 +1,18 @@
+{
+ "lang": "finnish",
+
+ "dateFormat": "DD.MM.YYYY HH:mm",
+ "details": "tiedot",
+ "download": "lataa",
+ "empty": "tyhjä",
+ "files": "tiedostoa",
+ "filter": "suodata",
+ "folders": "hakemistoa",
+ "grid": "ruudukko",
+ "icons": "ikonit",
+ "lastModified": "Viimeksi muokattu",
+ "name": "Nimi",
+ "noMatch": "ei osumia",
+ "parentDirectory": "Ylähakemisto",
+ "size": "Koko"
+}
diff --git a/traces/_h5ai/private/conf/l10n/fr.json b/traces/_h5ai/private/conf/l10n/fr.json
new file mode 100644
index 0000000..9a4ac45
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/fr.json
@@ -0,0 +1,22 @@
+{
+ "lang": "français",
+
+ "dateFormat": "DD/MM/YYYY HH:mm",
+ "details": "détails",
+ "download": "télécharger",
+ "empty": "vide",
+ "files": "Fichiers",
+ "filter": "filtrer",
+ "folders": "Répertoires",
+ "grid": "grille",
+ "icons": "icônes",
+ "language": "Langue",
+ "lastModified": "Dernière modification",
+ "name": "Nom",
+ "noMatch": "rien trouvé",
+ "parentDirectory": "Dossier parent",
+ "search": "rechercher",
+ "size": "Taille",
+ "tree": "Arborescence",
+ "view": "Disposition"
+}
diff --git a/traces/_h5ai/private/conf/l10n/he.json b/traces/_h5ai/private/conf/l10n/he.json
new file mode 100644
index 0000000..bb37f7f
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/he.json
@@ -0,0 +1,17 @@
+{
+ "lang": "עברית",
+
+ "dateFormat": "DD.MM.YYYY HH:mm",
+ "details": "פרטים",
+ "download": "הורדה",
+ "empty": "ריק",
+ "files": "קבצים",
+ "filter": "סינון",
+ "folders": "תיקיות",
+ "icons": "צלמיות",
+ "lastModified": "שינוי אחרון",
+ "name": "שם",
+ "noMatch": "אין תוצאות",
+ "parentDirectory": "תיקיית הורה",
+ "size": "גודל"
+}
diff --git a/traces/_h5ai/private/conf/l10n/hi.json b/traces/_h5ai/private/conf/l10n/hi.json
new file mode 100644
index 0000000..5941733
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/hi.json
@@ -0,0 +1,18 @@
+{
+ "lang": "हिंदी",
+
+ "dateFormat": "DD.MM.YYYY HH:mm",
+ "details": "विस्तार",
+ "download": "डाउनलोड",
+ "empty": "खाली",
+ "files": "फ़ाइलें",
+ "filter": "फ़िल्टर",
+ "folders": "फोल्डर",
+ "grid": "ग्रिड",
+ "icons": "आइकॉन",
+ "lastModified": "पिछला परिवर्तन",
+ "name": "नाम",
+ "noMatch": "कोई समानता नहीं",
+ "parentDirectory": "मूल डायरेक्टरी",
+ "size": "माप"
+}
diff --git a/traces/_h5ai/private/conf/l10n/hr.json b/traces/_h5ai/private/conf/l10n/hr.json
new file mode 100644
index 0000000..c044db4
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/hr.json
@@ -0,0 +1,18 @@
+{
+ "lang": "hrvatski",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "detalji",
+ "download": "preuzmi",
+ "empty": "prazno",
+ "files": "datoteka",
+ "filter": "filter",
+ "folders": "direktorij(a)",
+ "grid": "mreža",
+ "icons": "ikone",
+ "lastModified": "Posljednja izmjena",
+ "name": "Naziv",
+ "noMatch": "nema rezultata",
+ "parentDirectory": "Natrag",
+ "size": "Veličina"
+}
diff --git a/traces/_h5ai/private/conf/l10n/hu.json b/traces/_h5ai/private/conf/l10n/hu.json
new file mode 100644
index 0000000..b2c1b34
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/hu.json
@@ -0,0 +1,16 @@
+{
+ "lang": "magyar",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "részletek",
+ "download": "letöltés",
+ "empty": "üres",
+ "files": "fájlok",
+ "folders": "mappák",
+ "icons": "ikonok",
+ "lastModified": "Utoljára módosítva",
+ "name": "Név",
+ "noMatch": "nincs találat",
+ "parentDirectory": "Szülő könyvtár",
+ "size": "Méret"
+}
diff --git a/traces/_h5ai/private/conf/l10n/it.json b/traces/_h5ai/private/conf/l10n/it.json
new file mode 100644
index 0000000..cd83337
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/it.json
@@ -0,0 +1,18 @@
+{
+ "lang": "italiano",
+
+ "dateFormat": "DD-MM-YYYY HH:mm",
+ "details": "dettagli",
+ "download": "download",
+ "empty": "vuota",
+ "files": "file",
+ "filter": "filtra",
+ "folders": "cartelle",
+ "grid": "griglia",
+ "icons": "icone",
+ "lastModified": "Ultima modifica",
+ "name": "Nome",
+ "noMatch": "nessun risultato",
+ "parentDirectory": "Cartella Superiore",
+ "size": "Dimensione"
+}
diff --git a/traces/_h5ai/private/conf/l10n/ja.json b/traces/_h5ai/private/conf/l10n/ja.json
new file mode 100644
index 0000000..88266e7
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/ja.json
@@ -0,0 +1,20 @@
+{
+ "lang": "日本語",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "詳細",
+ "download": "ダウンロード",
+ "empty": "(空)",
+ "files": "ファイル",
+ "filter": "フィルター",
+ "folders": "フォルダー",
+ "grid": "グリッド",
+ "icons": "アイコン",
+ "language": "言語",
+ "lastModified": "最終変更日時",
+ "name": "名前",
+ "noMatch": "一致する項目が見つかりません",
+ "parentDirectory": "親ディレクトリへ",
+ "size": "サイズ",
+ "view": "ビュー"
+}
diff --git a/traces/_h5ai/private/conf/l10n/ko.json b/traces/_h5ai/private/conf/l10n/ko.json
new file mode 100644
index 0000000..8c48cdb
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/ko.json
@@ -0,0 +1,22 @@
+{
+ "lang": "한국어",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "자세히",
+ "download": "다운로드",
+ "empty": "빈 폴더",
+ "files": "파일",
+ "filter": "필터",
+ "folders": "폴더",
+ "grid": "그리드",
+ "icons": "아이콘",
+ "language": "언어",
+ "lastModified": "최근 수정일",
+ "name": "파일명",
+ "noMatch": "해당파일이 없습니다.",
+ "parentDirectory": "상위폴더",
+ "search": "검색",
+ "size": "크기",
+ "tree": "트리",
+ "view": "보기"
+}
diff --git a/traces/_h5ai/private/conf/l10n/lv.json b/traces/_h5ai/private/conf/l10n/lv.json
new file mode 100644
index 0000000..fa672ce
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/lv.json
@@ -0,0 +1,22 @@
+{
+ "lang": "latviešu",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "detaļas",
+ "download": "lejupielādēt",
+ "empty": "tukšs",
+ "files": "faili",
+ "filter": "filtrēt",
+ "folders": "mapes",
+ "grid": "režģis",
+ "icons": "ikonas",
+ "language": "Valoda",
+ "lastModified": "Pēdējoreiz modificēts",
+ "name": "Nosaukums",
+ "noMatch": "nav sakritības",
+ "parentDirectory": "Vecākdirektorijs",
+ "search": "meklēt",
+ "size": "Izmērs",
+ "tree": "Koks",
+ "view": "Skats"
+}
diff --git a/traces/_h5ai/private/conf/l10n/nb.json b/traces/_h5ai/private/conf/l10n/nb.json
new file mode 100644
index 0000000..44a1797
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/nb.json
@@ -0,0 +1,15 @@
+{
+ "lang": "norwegian",
+
+ "details": "detaljer",
+ "download": "last ned",
+ "empty": "tom",
+ "files": "filer",
+ "folders": "mapper",
+ "icons": "ikoner",
+ "lastModified": "Sist endret",
+ "name": "Navn",
+ "noMatch": "ingen treff",
+ "parentDirectory": "Overordnet mappe",
+ "size": "Størrelse"
+}
diff --git a/traces/_h5ai/private/conf/l10n/nl.json b/traces/_h5ai/private/conf/l10n/nl.json
new file mode 100644
index 0000000..8310f05
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/nl.json
@@ -0,0 +1,22 @@
+{
+ "lang": "nederlands",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "details",
+ "download": "download",
+ "empty": "leeg",
+ "files": "bestanden",
+ "filter": "filter",
+ "folders": "mappen",
+ "grid": "grid",
+ "icons": "iconen",
+ "language": "Taal",
+ "lastModified": "Laatste wijziging",
+ "name": "Naam",
+ "noMatch": "geen overeenkomst",
+ "parentDirectory": "Bovenliggende map",
+ "search": "zoeken",
+ "size": "Grootte",
+ "tree": "Boom",
+ "view": "Bekijk"
+}
diff --git a/traces/_h5ai/private/conf/l10n/pl.json b/traces/_h5ai/private/conf/l10n/pl.json
new file mode 100644
index 0000000..da56967
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/pl.json
@@ -0,0 +1,22 @@
+{
+ "lang": "polski",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "szczegóły",
+ "download": "pobierz",
+ "empty": "pusty",
+ "files": "plików",
+ "filter": "filtr",
+ "folders": "folderów",
+ "grid": "kafelki",
+ "icons": "ikony",
+ "language": "Język",
+ "lastModified": "Ostatnia modyfikacja",
+ "name": "Nazwa",
+ "noMatch": "nie znaleziono",
+ "parentDirectory": "Katalog nadrzędny",
+ "search": "szukaj",
+ "size": "Rozmiar",
+ "tree": "Drzewo",
+ "view": "Układ"
+}
diff --git a/traces/_h5ai/private/conf/l10n/pt.json b/traces/_h5ai/private/conf/l10n/pt.json
new file mode 100644
index 0000000..acd7fea
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/pt.json
@@ -0,0 +1,18 @@
+{
+ "lang": "português",
+
+ "dateFormat": "DD-MM-YYYY HH:mm",
+ "details": "detalhes",
+ "download": "descarregar",
+ "empty": "vazio",
+ "files": "arquivos",
+ "filter": "filtro",
+ "folders": "pastas",
+ "grid": "grelha",
+ "icons": "ícones",
+ "lastModified": "última modificação",
+ "name": "Nome",
+ "noMatch": "sem resultados",
+ "parentDirectory": "diretório acima",
+ "size": "Tamanho"
+}
diff --git a/traces/_h5ai/private/conf/l10n/ro.json b/traces/_h5ai/private/conf/l10n/ro.json
new file mode 100644
index 0000000..4981dfe
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/ro.json
@@ -0,0 +1,15 @@
+{
+ "lang": "română",
+
+ "details": "detalii",
+ "download": "descarcă",
+ "empty": "gol",
+ "files": "fişiere",
+ "folders": "dosar",
+ "icons": "pictograme",
+ "lastModified": "ultima modificare",
+ "name": "nume",
+ "noMatch": "0 rezultate",
+ "parentDirectory": "dosar părinte",
+ "size": "mărime"
+}
diff --git a/traces/_h5ai/private/conf/l10n/ru.json b/traces/_h5ai/private/conf/l10n/ru.json
new file mode 100644
index 0000000..8056a0d
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/ru.json
@@ -0,0 +1,20 @@
+{
+ "lang": "русский",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "Детали",
+ "download": "Скачать",
+ "empty": "Пусто",
+ "files": "Файлы",
+ "filter": "Фильтр",
+ "folders": "Папки",
+ "grid": "Сетка",
+ "icons": "Иконки",
+ "language": "Язык",
+ "lastModified": "Последние изменения",
+ "name": "Имя",
+ "noMatch": "Нет совпадений",
+ "parentDirectory": "Главная директория",
+ "size": "Размер",
+ "view": "Вид"
+}
diff --git a/traces/_h5ai/private/conf/l10n/sk.json b/traces/_h5ai/private/conf/l10n/sk.json
new file mode 100644
index 0000000..cfc9e45
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/sk.json
@@ -0,0 +1,13 @@
+{
+ "lang": "slovenčina",
+
+ "details": "podrobnosti",
+ "empty": "prázdny",
+ "files": "súborov",
+ "folders": "priečinkov",
+ "icons": "ikony",
+ "lastModified": "Upravené",
+ "name": "Názov",
+ "parentDirectory": "Nadriadený priečinok",
+ "size": "Velkosť"
+}
diff --git a/traces/_h5ai/private/conf/l10n/sl.json b/traces/_h5ai/private/conf/l10n/sl.json
new file mode 100644
index 0000000..5cdda21
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/sl.json
@@ -0,0 +1,18 @@
+{
+ "lang": "slovenščina",
+
+ "dateFormat": "DD. MM. YYYY HH:mm",
+ "details": "podrobnosti",
+ "download": "prenesi",
+ "empty": "prazno",
+ "files": "datoteke",
+ "filter": "filter",
+ "folders": "mape",
+ "grid": "mreža",
+ "icons": "ikone",
+ "lastModified": "Zadnja sprememba",
+ "name": "Ime",
+ "noMatch": "ni zadetkov",
+ "parentDirectory": "Nadrejena mapa",
+ "size": "Velikost"
+}
diff --git a/traces/_h5ai/private/conf/l10n/sr.json b/traces/_h5ai/private/conf/l10n/sr.json
new file mode 100644
index 0000000..845eeab
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/sr.json
@@ -0,0 +1,15 @@
+{
+ "lang": "srpski",
+
+ "details": "detalji",
+ "download": "download",
+ "empty": "prazno",
+ "files": "fajlovi",
+ "folders": "direktorijum",
+ "icons": "ikone",
+ "lastModified": "Poslednja modifikacija",
+ "name": "Ime",
+ "noMatch": "bez poklapanja",
+ "parentDirectory": "Roditeljski direktorijum",
+ "size": "Veličina"
+}
diff --git a/traces/_h5ai/private/conf/l10n/sv.json b/traces/_h5ai/private/conf/l10n/sv.json
new file mode 100644
index 0000000..75638e5
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/sv.json
@@ -0,0 +1,16 @@
+{
+ "lang": "svenska",
+
+ "details": "detaljerad",
+ "download": "ladda ner",
+ "empty": "tom",
+ "files": "filer",
+ "folders": "kataloger",
+ "grid": "rutnät",
+ "icons": "ikoner",
+ "lastModified": "Senast ändrad",
+ "name": "Filnamn",
+ "noMatch": "ingen matchning",
+ "parentDirectory": "Till överordnad mapp",
+ "size": "Filstorlek"
+}
diff --git a/traces/_h5ai/private/conf/l10n/tr.json b/traces/_h5ai/private/conf/l10n/tr.json
new file mode 100644
index 0000000..45cfc92
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/tr.json
@@ -0,0 +1,14 @@
+{
+ "lang": "türkçe",
+
+ "details": "detaylar",
+ "download": "indir",
+ "empty": "boş",
+ "files": "dosyalar",
+ "folders": "klasörler",
+ "icons": "ikonlar",
+ "lastModified": "Son Düzenleme",
+ "name": "İsim",
+ "parentDirectory": "Üst Dizin",
+ "size": "Boyut"
+}
diff --git a/traces/_h5ai/private/conf/l10n/uk.json b/traces/_h5ai/private/conf/l10n/uk.json
new file mode 100644
index 0000000..62908f5
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/uk.json
@@ -0,0 +1,18 @@
+{
+ "lang": "українська",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "Деталі",
+ "download": "Завантажити",
+ "empty": "Порожньо",
+ "files": "Файли(ів)",
+ "filter": "Фільтр",
+ "folders": "Тек(и)",
+ "grid": "Гратка",
+ "icons": "Піктограми",
+ "lastModified": "Останні зміни",
+ "name": "Ім'я",
+ "noMatch": "Немає співпадінь",
+ "parentDirectory": "Головна тека",
+ "size": "Розмір"
+}
diff --git a/traces/_h5ai/private/conf/l10n/zh-cn.json b/traces/_h5ai/private/conf/l10n/zh-cn.json
new file mode 100644
index 0000000..7cdba51
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/zh-cn.json
@@ -0,0 +1,23 @@
+{
+ "lang": "简体中文",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "详情",
+ "download": "下载",
+ "empty": "空文件夹",
+ "files": "文件",
+ "filter": "过滤",
+ "folders": "文件夹",
+ "grid": "网格",
+ "icons": "图标",
+ "language": "语言",
+ "lastModified": "修改时间",
+ "name": "文件名",
+ "noMatch": "无匹配项",
+ "parentDirectory": "父文件夹",
+ "search": "搜索",
+ "size": "大小",
+ "tree": "树形目录",
+ "view": "视图",
+ "info": "信息"
+}
diff --git a/traces/_h5ai/private/conf/l10n/zh-tw.json b/traces/_h5ai/private/conf/l10n/zh-tw.json
new file mode 100644
index 0000000..7567f0d
--- /dev/null
+++ b/traces/_h5ai/private/conf/l10n/zh-tw.json
@@ -0,0 +1,23 @@
+{
+ "lang": "正體中文",
+
+ "dateFormat": "YYYY-MM-DD HH:mm",
+ "details": "詳細資料",
+ "download": "下載",
+ "empty": "空資料夾",
+ "files": "檔案",
+ "filter": "過濾",
+ "folders": "資料夾",
+ "grid": "網格",
+ "icons": "圖示",
+ "language": "語言",
+ "lastModified": "上次修改",
+ "name": "檔名",
+ "noMatch": "沒有符合的檔案",
+ "parentDirectory": "上層目錄",
+ "search": "搜尋",
+ "size": "大小",
+ "tree": "樹形目錄",
+ "view": "檢視",
+ "info": "資訊"
+}
diff --git a/traces/_h5ai/private/conf/options.json b/traces/_h5ai/private/conf/options.json
new file mode 100644
index 0000000..69a7add
--- /dev/null
+++ b/traces/_h5ai/private/conf/options.json
@@ -0,0 +1,392 @@
+/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
+{
+ /*
+ Password hash.
+
+ SHA512 hash of the info page password, the preset password is the empty string.
+ Online hash generator: http://md5hashing.net/hashing/sha512
+ */
+ "passhash": "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e",
+
+
+
+ /*
+ Resources.
+
+ Additional script and style tags added to all pages. Paths not beginning
+ with "http://", "https://" or "/" will be looked up relative to
+ "_h5ai/public/ext/" (no check for existence).
+
+ - scripts: array of strings
+ - styles: array of strings
+ */
+ "resources": {
+ "scripts": [],
+ "styles": [
+ "//fonts.googleapis.com/css?family=Ubuntu:300,400,700%7CUbuntu+Mono:400,700"
+ ]
+ },
+
+
+
+ /*
+ General view options.
+
+ - binaryPrefix: boolean, set to true uses 1024B=1KiB when formatting file sizes (see http://en.wikipedia.org/wiki/Binary_prefix)
+ - disableSidebar: boolean, hides sidebar and toggle button
+ - fallbackMode: boolean, serve fallback mode
+ - fastBrowsing: boolean, use History API if available (no need to reload the whole page)
+ - fonts: array of strings, fonts to use in regular context
+ - fontsMono: array of strings, fonts to use in monopspaced context
+ - hidden: array of strings, don't list items matching these regular expressions
+ - hideFolders: boolean, hide all folders in the main view
+ - hideIf403: boolean, hide files and folders that are not readable by the server
+ - hideParentFolder: boolean, hide parent folder links in the main view
+ - maxIconSize: number, max size for icons in the main view
+ - modes: array of strings, subset of ["details", "grid", "icons"]
+ the first value indicates the default view mode. If only one value
+ is given the view mode is fixed and the selector buttons are hidden.
+ The user selected view mode is also stored local in modern browsers
+ so that it will be persistent.
+ - modeToggle: boolean, show a view mode toggle in the toolbar, or "next"
+ - setParentFolderLabels: boolean, set parent folder labels to real folder names
+ - sizes: array of numbers
+ the first value indicates the default view size. If only one value
+ is given the view size is fixed and the selector buttons are hidden.
+ The user selected view size is also stored local in modern browsers
+ so that it will be persistent.
+ - theme: string, name of one of the folders in "_h5ai/images/themes", defaults to "default"
+ - unmanaged: array of strings, don't manage folders containing one of those files
+ - unmanagedInNewWindow: boolean, open unmanaged links in new window/tab
+ */
+ "view": {
+ "binaryPrefix": false,
+ "disableSidebar": false,
+ "fallbackMode": false,
+ "fastBrowsing": true,
+ "fonts": ["Ubuntu", "Roboto", "Helvetica", "Arial", "sans-serif"],
+ "fontsMono": ["Ubuntu Mono", "Monaco", "Lucida Sans Typewriter", "monospace"],
+ "hidden": ["^\\.", "^_h5ai"],
+ "hideFolders": false,
+ "hideIf403": true,
+ "hideParentFolder": false,
+ "maxIconSize": 40,
+ "modes": ["details", "grid", "icons"],
+ "modeToggle": false,
+ "setParentFolderLabels": true,
+ "sizes": [20, 40, 60, 80, 100, 140, 180, 220, 260, 300],
+ "theme": "comity",
+ "unmanaged": ["index.html", "index.htm", "index.php"],
+ "unmanagedInNewWindow": false
+ },
+
+
+
+ /*** Extensions (in alphabetical order) ***/
+
+ /*
+ Watch and update current folder content.
+
+ - interval: number, update interval in milliseconds, at least 1000
+ */
+ "autorefresh": {
+ "enabled": false,
+ "interval": 5000
+ },
+
+ /*
+ Show a clickable breadcrumb.
+ */
+ "crumb": {
+ "enabled": true
+ },
+
+ /*
+ Allow customized header and footer files.
+ First checks for files "_h5ai.header.html" and "_h5ai.footer.html" in the current directory.
+ If not successful it checks all parent directories (starting in the current directory) for
+ files "_h5ai.headers.html" and "_h5ai.footers.html".
+ Note the different filenames: "header" (only current) - "headers" (current and sub directories)!
+ The file's content will be placed inside a
tag above/below the main content.
+ If a file's extension is ".md" instead of ".html" its content will be interpreted as markdown.
+ */
+ "custom": {
+ "enabled": true
+ },
+
+ /*
+ Enable packaged download of selected entries.
+ To select files the "select"-extension needs to be enabled.
+
+ - type: string, "php-tar", "shell-tar" or "shell-zip"
+ - packageName: string, basename of the download package, null for current filename or foldername
+ - alwaysVisible: boolean, always show download button (defaults to download the current folder)
+ */
+ "download": {
+ "enabled": true,
+ "type": "php-tar",
+ "packageName": null,
+ "alwaysVisible": false
+ },
+
+ /*
+ Allow filtering the displayed files and folders in current folder.
+ Checks for substrings.
+
+ If advanced is enabled it checks entries for right order of characters,
+ i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated
+ sequences get OR-ed. Searches will be treated as JavaScript regular
+ expressions if you prefix them with "re:".
+
+ - advanced: boolean, use advanced pattern parsing
+ - debounceTime: number, debounce wait time in milliseconds
+ - ignorecase: boolean, ignore case
+ */
+ "filter": {
+ "enabled": false,
+ "advanced": true,
+ "debounceTime": 100,
+ "ignorecase": true
+ },
+
+ /*
+ Calc the size of folders.
+ This operation is real slow. The calculated sizes differ slightly for both
+ calculation types since "php" only adds the file size, while "shell-du"
+ also adds the sizes for the actual folder files.
+
+ - type: string, "php" (sloooow) or "shell-du" (sloow)
+ */
+ "foldersize": {
+ "enabled": true,
+ "type": "php"
+ },
+
+ /*
+ Adds Google Universial Analytics asynchronous tracking code.
+ see: https://developers.google.com/analytics/devguides/collection/analyticsjs/
+
+ - id: string, account ID
+ */
+ "google-analytics-ua": {
+ "enabled": false,
+ "id": "UA-000000-0"
+ },
+
+ /*
+ Enable a generic info side bar.
+
+ - show: boolean, initial visible to first time users
+ - qrcode: boolean, show a QR-Code
+ - qrColor: string, QR-Code fill color
+ */
+ "info": {
+ "enabled": true,
+ "show": false,
+ "qrcode": true,
+ "qrFill": "#999",
+ "qrBack": "#fff"
+ },
+
+ /*
+ Localization, for example "en", "de" etc. - see "_h5ai/conf/l10n" folder for
+ possible values. Adjust it to your needs. If lang is not found
+ it defaults to "en".
+
+ - lang: string, default language
+ - useBroserLang: boolean, try to use browser language
+ */
+ "l10n": {
+ "enabled": true,
+ "lang": "en",
+ "useBrowserLang": true
+ },
+
+ /*
+ Adds Piwik tracker javascript code.
+
+ - baseURL: string, do not include the protocol, e.g. "mydomain.tld/piwik"
+ - idSite: number
+ */
+ "piwik-analytics": {
+ "enabled": false,
+ "baseURL": "some/url",
+ "idSite": 1
+ },
+
+ /*
+ Play a audio preview on click.
+
+ - autoplay: start playing as soon as ready
+ - types: array of strings
+ */
+ "preview-aud": {
+ "enabled": true,
+ "autoplay": true,
+ "types": ["aud"]
+ },
+
+ /*
+ Show an image preview on click.
+
+ - types: array of strings
+ - size: number, sample size, or false for original size
+ */
+ "preview-img": {
+ "enabled": true,
+ "size": false,
+ "types": ["img", "img-bmp", "img-gif", "img-ico", "img-jpg", "img-png", "img-raw", "img-svg"]
+ },
+
+ /*
+ Show text file preview on click.
+
+ Available styles are:
+ 0: floating text
+ 1: fixed width text
+ 2: markdown
+ 3: syntax highlighting
+
+ - styles: dict string to int, maps types to styles
+ */
+ "preview-txt": {
+ "enabled": true,
+ "styles": {
+ "txt": 1,
+ "txt-authors": 1,
+ "txt-c": 3,
+ "txt-cpp": 3,
+ "txt-css": 3,
+ "txt-diff": 1,
+ "txt-go": 3,
+ "txt-h": 3,
+ "txt-hpp": 3,
+ "txt-install": 1,
+ "txt-js": 3,
+ "txt-json": 3,
+ "txt-less": 3,
+ "txt-license": 1,
+ "txt-log": 1,
+ "txt-makefile": 1,
+ "txt-md": 2,
+ "txt-py": 3,
+ "txt-rb": 3,
+ "txt-readme": 1,
+ "txt-rtf": 1,
+ "txt-rust": 3,
+ "txt-script": 3,
+ "txt-xml": 1
+ }
+ },
+
+ /*
+ Play a video preview on click.
+
+ - autoplay: start playing as soon as ready
+ - types: array of strings
+ */
+ "preview-vid": {
+ "enabled": true,
+ "autoplay": true,
+ "types": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"]
+ },
+
+ /*
+ Allow searching files and folders in and below current folder.
+ Checks for substrings.
+
+ If advanced is enabled it checks entries for right order of characters,
+ i.e. "ab" matches "ab", "axb", "xaxbx" but not "ba". Space separated
+ sequences get OR-ed. Searches will be treated as JavaScript regular
+ expressions if you prefix them with "re:".
+
+ - advanced: boolean, use advanced pattern parsing
+ - debounceTime: number, debounce wait time in milliseconds
+ - ignorecase: boolean, ignore case
+ */
+ "search": {
+ "enabled": false,
+ "advanced": true,
+ "debounceTime": 300,
+ "ignorecase": true
+ },
+
+ /*
+ Make entries selectable.
+ At the moment only needed for packaged download.
+
+ - clickndrag: boolean, allow first mouse button + drag selection
+ - checkboxes: boolean, show a checkbox on mouse over item
+ */
+ "select": {
+ "enabled": true,
+ "clickndrag": true,
+ "checkboxes": true
+ },
+
+ /*
+ Default sort order.
+ "column" and "reverse" are locally stored.
+
+ - column: number, 0 for "Name", 1 for "Date", 2 for "Size"
+ - reverse: boolean, false for ascending, true for descending
+ - ignorecase: boolean, compare ignorecase
+ - natural: boolean, use natural sort order
+ - folders: number, where to place folders, 0 for "top", 1 for "in place", 2 for "bottom"
+ */
+ "sort": {
+ "enabled": true,
+ "column": 0,
+ "reverse": false,
+ "ignorecase": true,
+ "natural": true,
+ "folders": 0
+ },
+
+ /*
+ Show thumbnails for image files. Needs the "/_h5ai/cache" folder to be
+ writable for the web Server.
+
+ - img: array of strings
+ - mov: array of strings
+ - doc: array of strings
+ - delay: number, delay in milliseconds after "dom-ready" before thumb-requesting starts
+ - size: number, size in pixel of the generated thumbnails
+ - exif: boolean, use included EXIF thumbs if possible
+ - chunksize: int, number of thumbs per request
+ */
+ "thumbnails": {
+ "enabled": true,
+ "img": ["img-bmp", "img-gif", "img-ico", "img-jpg", "img-png"],
+ "mov": ["vid-avi", "vid-flv", "vid-mkv", "vid-mov", "vid-mp4", "vid-mpg", "vid-webm"],
+ "doc": ["x-pdf", "x-ps"],
+ "delay": 1,
+ "size": 240,
+ "exif": false,
+ "chunksize": 20
+ },
+
+ /*
+ Replace window title with current breadcrumb.
+ */
+ "title": {
+ "enabled": true
+ },
+
+ /*
+ Show a folder tree.
+ Note that this might affect performance significantly.
+
+ - show: boolean, initial visible to first time users
+ - maxSubfolders: number, max number of subfolders to show in tree
+ - naturalSort: boolean, use natural sort order for folders
+ - ignorecase: boolean, sort ignorecase
+ */
+ "tree": {
+ "enabled": true,
+ "show": true,
+ "maxSubfolders": 50,
+ "naturalSort": true,
+ "ignorecase": true
+ }
+}
diff --git a/traces/_h5ai/private/conf/types.json b/traces/_h5ai/private/conf/types.json
new file mode 100644
index 0000000..0b83a3e
--- /dev/null
+++ b/traces/_h5ai/private/conf/types.json
@@ -0,0 +1,76 @@
+/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
+{
+ "ar": ["*.tar.bz2", "*.crx"],
+ "ar-apk": ["*.apk"],
+ "ar-deb": ["*.deb"],
+ "ar-gz": ["*.gz", "*.tar.gz", "*.tgz"],
+ "ar-rar": ["*.rar"],
+ "ar-rpm": ["*.rpm"],
+ "ar-tar": ["*.tar"],
+ "ar-zip": ["*.7z", "*.bz2", "*.jar", "*.lzma", "*.war", "*.z", "*.Z", "*.zip"],
+ "aud": ["*.aif", "*.aiff", "*.flac", "*.m4a", "*.mid", "*.mp3", "*.mpa", "*.ra", "*.ogg", "*.wav", "*.wma"],
+ "aud-pls": ["*.m3u", "*.m3u8", "*.pls"],
+ "bin": ["*.class", "*.o", "*.so"],
+ "bin-exe": ["*.bat", "*.cmd", "*.exe"],
+ "img": ["*.xpm"],
+ "img-bmp": ["*.bmp"],
+ "img-gif": ["*.gif"],
+ "img-ico": ["*.ico"],
+ "img-jpg": ["*.jpg", "*.jpeg"],
+ "img-png": ["*.png"],
+ "img-raw": ["*.cr2", "*.nef"],
+ "img-svg": ["*.svg"],
+ "img-tiff": ["*.tiff"],
+ "txt": ["*.text", "*.txt"],
+ "txt-build": ["*.pom", "build.xml", "pom.xml"],
+ "txt-c": ["*.c"],
+ "txt-cpp": ["*.cpp"],
+ "txt-css": ["*.css"],
+ "txt-diff": ["*.diff", "*.patch"],
+ "txt-go": ["*.go"],
+ "txt-h": ["*.h"],
+ "txt-html": ["*.htm", "*.html", "*.shtml", "*.xhtml"],
+ "txt-hpp": ["*.hpp"],
+ "txt-java": ["*.java"],
+ "txt-scala": ["*.scala"],
+ "txt-js": ["*.js"],
+ "txt-json": ["*.json"],
+ "txt-less": ["*.less"],
+ "txt-log": ["*.log", "changelog*"],
+ "txt-md": ["*.markdown", "*.md"],
+ "txt-php": ["*.php"],
+ "txt-py": ["*.py"],
+ "txt-rb": ["*.rb"],
+ "txt-rss": ["*.rss"],
+ "txt-rtf": ["*.rtf"],
+ "txt-rust": ["*.rs", "*.rlib"],
+ "txt-script": ["*.conf", "*.bsh", "*.csh", "*.ini", "*.ksh", "*.sh", "*.shar", "*.tcl", "*.zsh"],
+ "txt-source": [],
+ "txt-tex": ["*.tex"],
+ "txt-vcal": ["*.vcal"],
+ "txt-xml": ["*.xml"],
+ "vid": [],
+ "vid-avi": ["*.avi"],
+ "vid-flv": ["*.flv"],
+ "vid-mkv": ["*.mkv"],
+ "vid-mov": ["*.mov"],
+ "vid-mp4": ["*.mp4", "*.m4v"],
+ "vid-mpg": ["*.mpg"],
+ "vid-rm": ["*.rm"],
+ "vid-swf": ["*.swf"],
+ "vid-ts": ["*.ts"],
+ "vid-vob": ["*.vob"],
+ "vid-webm": ["*.webm"],
+ "vid-wmv": ["*.wmv"],
+ "x": [],
+ "x-bak": ["*.bak", "*~"],
+ "x-calc": ["*.ods", "*.ots", "*.xlr", "*.xls", "*.xlsx"],
+ "x-disc": ["*.cue", "*.iso"],
+ "x-doc": ["*.doc", "*.docx", "*.odm", "*.odt", "*.ott"],
+ "x-draw": ["*.drw"],
+ "x-eps": ["*.eps"],
+ "x-pdf": ["*.pdf"],
+ "x-pres": ["*.odp", "*.otp", "*.pps", "*.ppt", "*.pptx"],
+ "x-ps": ["*.ps"],
+ "x-psd": ["*.psd"]
+}
diff --git a/traces/_h5ai/private/php/class-bootstrap.php b/traces/_h5ai/private/php/class-bootstrap.php
new file mode 100644
index 0000000..4356523
--- /dev/null
+++ b/traces/_h5ai/private/php/class-bootstrap.php
@@ -0,0 +1,45 @@
+query_boolean('refresh', false));
+ $context = new Context($session, $request, $setup);
+
+ if ($context->is_api_request()) {
+ (new Api($context))->apply();
+ } elseif ($context->is_info_request()) {
+ $public_href = $setup->get('PUBLIC_HREF');
+ $x_head_tags = $context->get_x_head_html();
+ $fallback_mode = false;
+ require __DIR__ . '/pages/info.php';
+ } else {
+ $public_href = $setup->get('PUBLIC_HREF');
+ $x_head_tags = $context->get_x_head_html();
+ $fallback_mode = $context->is_fallback_mode();
+ $fallback_html = (new Fallback($context))->get_html();
+ require __DIR__ . '/pages/index.php';
+ }
+ }
+
+ public static function autoload($class_name) {
+ $filename = 'class-' . strtolower($class_name) . '.php';
+
+ foreach (Bootstrap::$autopaths as $path) {
+ $file = __DIR__ . '/' . $path . '/' . $filename;
+ if (file_exists($file)) {
+ require_once $file;
+ return true;
+ }
+ }
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-api.php b/traces/_h5ai/private/php/core/class-api.php
new file mode 100644
index 0000000..30eadd1
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-api.php
@@ -0,0 +1,109 @@
+context = $context;
+ $this->request = $context->get_request();
+ $this->setup = $context->get_setup();
+ }
+
+ public function apply() {
+ $action = $this->request->query('action');
+ $supported = ['download', 'get', 'login', 'logout'];
+ Util::json_fail(Util::ERR_UNSUPPORTED, 'unsupported action', !in_array($action, $supported));
+
+ $methodname = 'on_' . $action;
+ $this->$methodname();
+ }
+
+ private function on_download() {
+ Util::json_fail(Util::ERR_DISABLED, 'download disabled', !$this->context->query_option('download.enabled', false));
+
+ $as = $this->request->query('as');
+ $type = $this->request->query('type');
+ $base_href = $this->request->query('baseHref');
+ $hrefs = $this->request->query('hrefs', '');
+
+ $archive = new Archive($this->context);
+
+ set_time_limit(0);
+ header('Content-Type: application/octet-stream');
+ header('Content-Disposition: attachment; filename="' . $as . '"');
+ header('Connection: close');
+ $ok = $archive->output($type, $base_href, $hrefs);
+
+ Util::json_fail(Util::ERR_FAILED, 'packaging failed', !$ok);
+ exit;
+ }
+
+ private function on_get() {
+ $response = [];
+
+ foreach (['langs', 'options', 'types'] as $name) {
+ if ($this->request->query_boolean($name, false)) {
+ $methodname = 'get_' . $name;
+ $response[$name] = $this->context->$methodname();
+ }
+ }
+
+ if ($this->request->query_boolean('setup', false)) {
+ $response['setup'] = $this->setup->to_jsono($this->context->is_admin());
+ }
+
+ if ($this->request->query_boolean('theme', false)) {
+ $theme = new Theme($this->context);
+ $response['theme'] = $theme->get_icons();
+ }
+
+ if ($this->request->query('items', false)) {
+ $href = $this->request->query('items.href');
+ $what = $this->request->query_numeric('items.what');
+ $response['items'] = $this->context->get_items($href, $what);
+ }
+
+ if ($this->request->query('custom', false)) {
+ Util::json_fail(Util::ERR_DISABLED, 'custom disabled', !$this->context->query_option('custom.enabled', false));
+ $href = $this->request->query('custom');
+ $custom = new Custom($this->context);
+ $response['custom'] = $custom->get_customizations($href);
+ }
+
+ if ($this->request->query('l10n', false)) {
+ Util::json_fail(Util::ERR_DISABLED, 'l10n disabled', !$this->context->query_option('l10n.enabled', false));
+ $iso_codes = $this->request->query_array('l10n');
+ $iso_codes = array_filter($iso_codes);
+ $response['l10n'] = $this->context->get_l10n($iso_codes);
+ }
+
+ if ($this->request->query('search', false)) {
+ Util::json_fail(Util::ERR_DISABLED, 'search disabled', !$this->context->query_option('search.enabled', false));
+ $href = $this->request->query('search.href');
+ $pattern = $this->request->query('search.pattern');
+ $ignorecase = $this->request->query_boolean('search.ignorecase', false);
+ $search = new Search($this->context);
+ $response['search'] = $search->get_items($href, $pattern, $ignorecase);
+ }
+
+ if ($this->request->query('thumbs', false)) {
+ Util::json_fail(Util::ERR_DISABLED, 'thumbnails disabled', !$this->context->query_option('thumbnails.enabled', false));
+ Util::json_fail(Util::ERR_UNSUPPORTED, 'thumbnails not supported', !$this->setup->get('HAS_PHP_JPEG'));
+ $thumbs = $this->request->query_array('thumbs');
+ $response['thumbs'] = $this->context->get_thumbs($thumbs);
+ }
+
+ Util::json_exit($response);
+ }
+
+ private function on_login() {
+ $pass = $this->request->query('pass');
+ Util::json_exit(['asAdmin' => $this->context->login_admin($pass)]);
+ }
+
+ private function on_logout() {
+ Util::json_exit(['asAdmin' => $this->context->logout_admin()]);
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-context.php b/traces/_h5ai/private/php/core/class-context.php
new file mode 100644
index 0000000..5484f8f
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-context.php
@@ -0,0 +1,294 @@
+session = $session;
+ $this->request = $request;
+ $this->setup = $setup;
+
+ $this->options = Json::load($this->setup->get('CONF_PATH') . '/options.json');
+
+ $this->passhash = $this->query_option('passhash', '');
+ $this->options['hasCustomPasshash'] = strcasecmp($this->passhash, Context::$DEFAULT_PASSHASH) !== 0;
+ unset($this->options['passhash']);
+ }
+
+ public function get_session() {
+ return $this->session;
+ }
+
+ public function get_request() {
+ return $this->request;
+ }
+
+ public function get_setup() {
+ return $this->setup;
+ }
+
+ public function get_options() {
+ return $this->options;
+ }
+
+ public function query_option($keypath = '', $default = null) {
+ return Util::array_query($this->options, $keypath, $default);
+ }
+
+ public function get_types() {
+ return Json::load($this->setup->get('CONF_PATH') . '/types.json');
+ }
+
+ public function login_admin($pass) {
+ $this->session->set(Context::$AS_ADMIN_SESSION_KEY, strcasecmp(hash('sha512', $pass), $this->passhash) === 0);
+ return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
+ }
+
+ public function logout_admin() {
+ $this->session->set(Context::$AS_ADMIN_SESSION_KEY, false);
+ return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
+ }
+
+ public function is_admin() {
+ return $this->session->get(Context::$AS_ADMIN_SESSION_KEY);
+ }
+
+ public function is_api_request() {
+ return strtolower($this->setup->get('REQUEST_METHOD')) === 'post';
+ }
+
+ public function is_info_request() {
+ return Util::starts_with($this->setup->get('REQUEST_HREF') . '/', $this->setup->get('PUBLIC_HREF'));
+ }
+
+ public function is_text_browser() {
+ return preg_match('/curl|links|lynx|w3m/i', $this->setup->get('HTTP_USER_AGENT')) === 1;
+ }
+
+ public function is_fallback_mode() {
+ return $this->query_option('view.fallbackMode', false) || $this->is_text_browser();
+ }
+
+ public function to_href($path, $trailing_slash = true) {
+ $rel_path = substr($path, strlen($this->setup->get('ROOT_PATH')));
+ $parts = explode('/', $rel_path);
+ $encoded_parts = [];
+ foreach ($parts as $part) {
+ if ($part != '') {
+ $encoded_parts[] = rawurlencode($part);
+ }
+ }
+
+ return Util::normalize_path($this->setup->get('ROOT_HREF') . implode('/', $encoded_parts), $trailing_slash);
+ }
+
+ public function to_path($href) {
+ $rel_href = substr($href, strlen($this->setup->get('ROOT_HREF')));
+ return Util::normalize_path($this->setup->get('ROOT_PATH') . '/' . rawurldecode($rel_href));
+ }
+
+ public function is_hidden($name) {
+ // always hide
+ if ($name === '.' || $name === '..') {
+ return true;
+ }
+
+ foreach ($this->query_option('view.hidden', []) as $re) {
+ $re = Util::wrap_pattern($re);
+ if (preg_match($re, $name)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ public function read_dir($path) {
+ $names = [];
+ if (is_dir($path)) {
+ foreach (scandir($path) as $name) {
+ if (
+ $this->is_hidden($name)
+ || $this->is_hidden($this->to_href($path) . $name)
+ || (!is_readable($path . '/' . $name) && $this->query_option('view.hideIf403', false))
+ ) {
+ continue;
+ }
+ $names[] = $name;
+ }
+ }
+ return $names;
+ }
+
+ public function is_managed_href($href) {
+ return $this->is_managed_path($this->to_path($href));
+ }
+
+ public function is_managed_path($path) {
+ if (!is_dir($path) || strpos($path, '../') !== false || strpos($path, '/..') !== false || $path === '..') {
+ return false;
+ }
+
+ if (strpos($path, $this->setup->get('PUBLIC_PATH')) === 0) {
+ return false;
+ }
+
+ if (strpos($path, $this->setup->get('PRIVATE_PATH')) === 0) {
+ return false;
+ }
+
+ foreach ($this->query_option('view.unmanaged', []) as $name) {
+ if (file_exists($path . '/' . $name)) {
+ return false;
+ }
+ }
+
+ while ($path !== $this->setup->get('ROOT_PATH')) {
+ if (@is_dir($path . '/_h5ai/private/conf')) {
+ return false;
+ }
+ $parent_path = Util::normalize_path(dirname($path));
+ if ($parent_path === $path) {
+ return false;
+ }
+ $path = $parent_path;
+ }
+ return true;
+ }
+
+ public function get_current_path() {
+ $current_href = Util::normalize_path($this->setup->get('REQUEST_HREF'), true);
+ $current_path = $this->to_path($current_href);
+
+ if (!is_dir($current_path)) {
+ $current_path = Util::normalize_path(dirname($current_path), false);
+ }
+
+ return $current_path;
+ }
+
+ public function get_items($href, $what) {
+ if (!$this->is_managed_href($href)) {
+ return [];
+ }
+
+ $cache = [];
+ $folder = Item::get($this, $this->to_path($href), $cache);
+
+ // add content of subfolders
+ if ($what >= 2 && $folder !== null) {
+ foreach ($folder->get_content($cache) as $item) {
+ $item->get_content($cache);
+ }
+ $folder = $folder->get_parent($cache);
+ }
+
+ // add content of this folder and all parent folders
+ while ($what >= 1 && $folder !== null) {
+ $folder->get_content($cache);
+ $folder = $folder->get_parent($cache);
+ }
+
+ uasort($cache, ['Item', 'cmp']);
+ $result = [];
+ foreach ($cache as $p => $item) {
+ $result[] = $item->to_json_object();
+ }
+
+ return $result;
+ }
+
+ public function get_langs() {
+ $langs = [];
+ $l10n_path = $this->setup->get('CONF_PATH') . '/l10n';
+ if (is_dir($l10n_path)) {
+ if ($dir = opendir($l10n_path)) {
+ while (($file = readdir($dir)) !== false) {
+ if (Util::ends_with($file, '.json')) {
+ $translations = Json::load($l10n_path . '/' . $file);
+ $langs[basename($file, '.json')] = $translations['lang'];
+ }
+ }
+ closedir($dir);
+ }
+ }
+ ksort($langs);
+ return $langs;
+ }
+
+ public function get_l10n($iso_codes) {
+ $results = [];
+
+ foreach ($iso_codes as $iso_code) {
+ $file = $this->setup->get('CONF_PATH') . '/l10n/' . $iso_code . '.json';
+ $results[$iso_code] = Json::load($file);
+ $results[$iso_code]['isoCode'] = $iso_code;
+ }
+
+ return $results;
+ }
+
+ public function get_thumbs($requests) {
+ $hrefs = [];
+
+ foreach ($requests as $req) {
+ $thumb = new Thumb($this);
+ $hrefs[] = $thumb->thumb($req['type'], $req['href'], $req['width'], $req['height']);
+ }
+
+ return $hrefs;
+ }
+
+ private function prefix_x_head_href($href) {
+ if (preg_match('@^(https?://|/)@i', $href)) {
+ return $href;
+ }
+
+ return $this->setup->get('PUBLIC_HREF') . 'ext/' . $href;
+ }
+
+ private function get_fonts_html() {
+ $fonts = $this->query_option('view.fonts', []);
+ $fonts_mono = $this->query_option('view.fontsMono', []);
+
+ $html = '';
+
+ return $html;
+ }
+
+ public function get_x_head_html() {
+ $scripts = $this->query_option('resources.scripts', []);
+ $styles = $this->query_option('resources.styles', []);
+
+ $html = '';
+
+ foreach ($styles as $href) {
+ $html .= ' ';
+ }
+
+ foreach ($scripts as $href) {
+ $html .= '';
+ }
+
+ $html .= $this->get_fonts_html();
+
+ return $html;
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-fallback.php b/traces/_h5ai/private/php/core/class-fallback.php
new file mode 100644
index 0000000..7bd317f
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-fallback.php
@@ -0,0 +1,54 @@
+context = $context;
+ }
+
+ public function get_html($path = null) {
+ if (!$path) {
+ $path = $this->context->get_current_path();
+ }
+ $fallback_images_href = $this->context->get_setup()->get('PUBLIC_HREF') . 'images/fallback/';
+
+ $cache = [];
+ $folder = Item::get($this->context, $path, $cache);
+ $items = $folder->get_content($cache);
+ uasort($items, ['Item', 'cmp']);
+
+ $html = '';
+
+ $html .= '';
+ $html .= ' ';
+ $html .= 'Name ';
+ $html .= 'Last modified ';
+ $html .= 'Size ';
+ $html .= ' ';
+
+ if ($folder->get_parent($cache)) {
+ $html .= '';
+ $html .= ' ';
+ $html .= 'Parent Directory ';
+ $html .= ' ';
+ $html .= ' ';
+ $html .= ' ';
+ }
+
+ foreach ($items as $item) {
+ $type = $item->is_folder ? 'folder' : 'file';
+
+ $html .= '';
+ $html .= ' ';
+ $html .= '' . basename($item->path) . ' ';
+ $html .= '' . date('Y-m-d H:i', $item->date) . ' ';
+ $html .= '' . ($item->size !== null ? intval($item->size / 1000) . ' KB' : '' ) . ' ';
+ $html .= ' ';
+ }
+
+ $html .= '
';
+
+ return $html;
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-filesize.php b/traces/_h5ai/private/php/core/class-filesize.php
new file mode 100644
index 0000000..477f9e2
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-filesize.php
@@ -0,0 +1,96 @@
+size($path, $withFoldersize, $withDu);
+ }
+
+ public static function getCachedSize($path, $withFoldersize, $withDu) {
+ if (array_key_exists($path, Filesize::$cache)) {
+ return Filesize::$cache[$path];
+ }
+
+ $size = Filesize::getSize($path, $withFoldersize, $withDu);
+
+ Filesize::$cache[$path] = $size;
+ return $size;
+ }
+
+
+ private function __construct() {}
+
+ private function read_dir($path) {
+ $paths = [];
+ if (is_dir($path)) {
+ foreach (scandir($path) as $name) {
+ if ($name !== '.' && $name !== '..') {
+ $paths[] = $path . '/' . $name;
+ }
+ }
+ }
+ return $paths;
+ }
+
+ private function php_filesize($path, $recursive = false) {
+ // if (PHP_INT_SIZE < 8) {
+ // }
+ $size = @filesize($path);
+
+ if (!is_dir($path) || !$recursive) {
+ return $size;
+ }
+
+ foreach ($this->read_dir($path) as $p) {
+ $size += $this->php_filesize($p, true);
+ }
+ return $size;
+ }
+
+
+ private function exec($cmdv) {
+ $cmd = implode(' ', array_map('escapeshellarg', $cmdv));
+ $lines = [];
+ $rc = null;
+ exec($cmd, $lines, $rc);
+ return $lines;
+ }
+
+ private function exec_du_all($paths) {
+ $cmdv = array_merge(['du', '-sbL'], $paths);
+ $lines = $this->exec($cmdv);
+
+ $sizes = [];
+ foreach ($lines as $line) {
+ $parts = preg_split('/[\s]+/', $line, 2);
+ $size = intval($parts[0], 10);
+ $path = $parts[1];
+ $sizes[$path] = $size;
+ }
+ return $sizes;
+ }
+
+ private function exec_du($path) {
+ $sizes = $this->exec_du_all([$path]);
+ return $sizes[$path];
+ }
+
+
+ private function size($path, $withFoldersize = false, $withDu = false) {
+ if (is_file($path)) {
+ return $this->php_filesize($path);
+ }
+
+ if (is_dir($path) && $withFoldersize) {
+ if ($withDu) {
+ return $this->exec_du($path);
+ }
+
+ return $this->php_filesize($path, true);
+ }
+
+ return null;
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-item.php b/traces/_h5ai/private/php/core/class-item.php
new file mode 100644
index 0000000..2b9ce34
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-item.php
@@ -0,0 +1,91 @@
+is_folder && !$item2->is_folder) {
+ return -1;
+ }
+ if (!$item1->is_folder && $item2->is_folder) {
+ return 1;
+ }
+
+ return strcasecmp($item1->path, $item2->path);
+ }
+
+ public static function get($context, $path, &$cache) {
+ if (!Util::starts_with($path, $context->get_setup()->get('ROOT_PATH'))) {
+ return null;
+ }
+
+ if (is_array($cache) && array_key_exists($path, $cache)) {
+ return $cache[$path];
+ }
+
+ $item = new Item($context, $path);
+
+ if (is_array($cache)) {
+ $cache[$path] = $item;
+ }
+ return $item;
+ }
+
+ public $context;
+ public $path;
+ public $href;
+ public $date;
+ public $size;
+ public $is_folder;
+ public $is_content_fetched;
+
+ private function __construct($context, $path) {
+ $this->context = $context;
+
+ $this->path = Util::normalize_path($path, false);
+ $this->is_folder = is_dir($this->path);
+ $this->href = $context->to_href($this->path, $this->is_folder);
+ $this->date = @filemtime($this->path);
+ $this->size = Util::filesize($context, $this->path);
+ $this->is_content_fetched = false;
+ }
+
+ public function to_json_object() {
+ $obj = [
+ 'href' => $this->href,
+ 'time' => $this->date * 1000, // seconds (PHP) to milliseconds (JavaScript)
+ 'size' => $this->size
+ ];
+
+ if ($this->is_folder) {
+ $obj['managed'] = $this->context->is_managed_href($this->href);
+ $obj['fetched'] = $this->is_content_fetched;
+ }
+
+ return $obj;
+ }
+
+ public function get_parent(&$cache) {
+ $parent_path = Util::normalize_path(dirname($this->path), false);
+ if ($parent_path !== $this->path && Util::starts_with($parent_path, $this->context->get_setup()->get('ROOT_PATH'))) {
+ return Item::get($this->context, $parent_path, $cache);
+ }
+ return null;
+ }
+
+ public function get_content(&$cache) {
+ $items = [];
+
+ if (!$this->context->is_managed_href($this->href)) {
+ return $items;
+ }
+
+ $files = $this->context->read_dir($this->path);
+ foreach ($files as $file) {
+ $item = Item::get($this->context, $this->path . '/' . $file, $cache);
+ $items[$item->path] = $item;
+ }
+
+ $this->is_content_fetched = true;
+
+ return $items;
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-json.php b/traces/_h5ai/private/php/core/class-json.php
new file mode 100644
index 0000000..f662b9f
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-json.php
@@ -0,0 +1,65 @@
+params = $data !== null ? $data : $params;
+ }
+
+ public function query($keypath = '', $default = Util::NO_DEFAULT) {
+ $value = Util::array_query($this->params, $keypath, Util::NO_DEFAULT);
+
+ if ($value === Util::NO_DEFAULT) {
+ Util::json_fail(Util::ERR_MISSING_PARAM, 'parameter \'' . $keypath . '\' is missing', $default === Util::NO_DEFAULT);
+ return $default;
+ }
+
+ return $value;
+ }
+
+ public function query_boolean($keypath = '', $default = Util::NO_DEFAULT) {
+ $value = $this->query($keypath, $default);
+ return filter_var($value, FILTER_VALIDATE_BOOLEAN);
+ }
+
+ public function query_numeric($keypath = '', $default = Util::NO_DEFAULT) {
+ $value = $this->query($keypath, $default);
+ Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is not numeric', !is_numeric($value));
+ return intval($value, 10);
+ }
+
+ public function query_array($keypath = '', $default = Util::NO_DEFAULT) {
+ $value = $this->query($keypath, $default);
+ Util::json_fail(Util::ERR_ILLIGAL_PARAM, 'parameter \'' . $keypath . '\' is no array', !is_array($value));
+ return $value;
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-session.php b/traces/_h5ai/private/php/core/class-session.php
new file mode 100644
index 0000000..630d78f
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-session.php
@@ -0,0 +1,20 @@
+store = &$store;
+ }
+
+ public function set($key, $value) {
+ $key = Session::$KEY_PREFIX . $key;
+ $this->store[$key] = $value;
+ }
+
+ public function get($key, $default = null) {
+ $key = Session::$KEY_PREFIX . $key;
+ return array_key_exists($key, $this->store) ? $this->store[$key] : $default;
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-setup.php b/traces/_h5ai/private/php/core/class-setup.php
new file mode 100644
index 0000000..d0c3fb2
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-setup.php
@@ -0,0 +1,185 @@
+store = [];
+ $this->refresh = $refresh;
+
+ $this->add_globals_and_envs();
+ $this->add_php_checks();
+ $this->add_app_metadata();
+ $this->add_server_metadata_and_check();
+ $this->add_paths();
+ $this->add_sys_cmd_checks();
+ }
+
+ private function set($key, $value) {
+ if (array_key_exists($key, $this->store)) {
+ Logger::log('setup key already taken', [
+ 'key' => $key,
+ 'value' => $value,
+ 'found' => $this->store[$key]
+ ]);
+ exit;
+ }
+ if (!is_string($value) && !is_bool($value)) {
+ Logger::log('setup value neither string nor boolean', [
+ 'key' => $key,
+ 'value' => $value
+ ]);
+ exit;
+ }
+
+ $this->store[$key] = $value;
+ }
+
+ public function get($key) {
+ if (!array_key_exists($key, $this->store)) {
+ Logger::log('setup key not found', ['key' => $key]);
+ exit;
+ }
+
+ return $this->store[$key];
+ }
+
+ private function add_globals_and_envs() {
+ $this->set('PHP_VERSION', PHP_VERSION);
+ $this->set('MIN_PHP_VERSION', MIN_PHP_VERSION);
+ $this->set('PHP_ARCH', (PHP_INT_SIZE * 8) . '-bit');
+
+ $this->set('REQUEST_METHOD', $_SERVER['REQUEST_METHOD']);
+ $this->set('REQUEST_HREF', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
+ $this->set('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']);
+ $this->set('SERVER_SOFTWARE', $_SERVER['SERVER_SOFTWARE']);
+ $this->set('HTTP_USER_AGENT', $_SERVER['HTTP_USER_AGENT']);
+ }
+
+ private function add_php_checks() {
+ $this->set('HAS_PHP_EXIF', function_exists('exif_thumbnail'));
+
+ $has_php_jpeg = false;
+ if (function_exists('gd_info')) {
+ $infos = gd_info();
+ $has_php_jpeg = array_key_exists('JPEG Support', $infos) && $infos['JPEG Support'];
+ }
+ $this->set('HAS_PHP_JPEG', $has_php_jpeg);
+ }
+
+ private function add_app_metadata() {
+ $this->set('NAME', 'h5ai');
+ $this->set('VERSION', H5AI_VERSION);
+ $this->set('FILE_PREFIX', '_h5ai');
+ }
+
+ private function add_server_metadata_and_check() {
+ $server_software = $this->get('SERVER_SOFTWARE');
+ $server_name = null;
+ $server_version = null;
+
+ if ($server_software && preg_match('#^(.*?)(?:/(.*?))?(?: |$)#', strtolower($server_software), $matches)) {
+ $server_name = $matches[1];
+ $server_version = count($matches) > 2 ? $matches[2] : '';
+ }
+
+ $this->set('SERVER_NAME', $server_name);
+ $this->set('SERVER_VERSION', $server_version);
+ $this->set('HAS_SERVER', in_array($server_name, ['apache', 'lighttpd', 'nginx', 'cherokee']));
+ }
+
+ private function add_paths() {
+ $script_name = $this->get('SCRIPT_NAME');
+ if ($this->get('SERVER_NAME') === 'lighttpd') {
+ $script_name = preg_replace('#^.*?//#', '/', $script_name);
+ }
+
+ $this->set('H5AI_HREF', Util::normalize_path(dirname(dirname($script_name)), true));
+ $this->set('H5AI_PATH', Util::normalize_path(dirname(dirname(dirname(dirname(__FILE__)))), false));
+
+ $this->set('ROOT_HREF', Util::normalize_path(dirname($this->get('H5AI_HREF')), true));
+ $this->set('ROOT_PATH', Util::normalize_path(dirname($this->get('H5AI_PATH')), false));
+
+ $this->set('PUBLIC_HREF', Util::normalize_path($this->get('H5AI_HREF') . '/public/', true));
+ $this->set('PUBLIC_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/public/', false));
+
+ $this->set('INDEX_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/index.php', false));
+ $this->set('CACHE_PUB_HREF', Util::normalize_path($this->get('PUBLIC_HREF') . '/cache', true));
+ $this->set('CACHE_PUB_PATH', Util::normalize_path($this->get('PUBLIC_PATH') . '/cache', false));
+ $this->set('HAS_WRITABLE_CACHE_PUB', @is_writable($this->get('CACHE_PUB_PATH')));
+
+ $this->set('PRIVATE_PATH', Util::normalize_path($this->get('H5AI_PATH') . '/private', false));
+ $this->set('CONF_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/conf', false));
+ $this->set('CACHE_PRV_PATH', Util::normalize_path($this->get('PRIVATE_PATH') . '/cache', false));
+ $this->set('HAS_WRITABLE_CACHE_PRV', @is_writable($this->get('CACHE_PRV_PATH')));
+ }
+
+ private function add_sys_cmd_checks() {
+ $cmds_cache_path = Util::normalize_path($this->get('CACHE_PRV_PATH') . '/cmds.json', false);
+
+ $cmds = Json::load($cmds_cache_path);
+ if (sizeof($cmds) === 0 || $this->refresh) {
+ $cmds['command'] = Util::exec_0('command -v command');
+ $cmds['which'] = Util::exec_0('which which') || Util::exec_0('which which.exe');
+
+ $cmd = false;
+ if ($cmds['command']) {
+ $cmd = 'command -v';
+ } elseif ($cmds['which']) {
+ $cmd = 'which';
+ }
+
+ foreach (['avconv', 'convert', 'du', 'ffmpeg', 'gm', 'tar', 'zip'] as $c) {
+ $cmds[$c] = ($cmd !== false) && (Util::exec_0($cmd . ' ' . $c) || Util::exec_0($cmd . ' ' . $c . '.exe'));
+ }
+
+ Json::save($cmds_cache_path, $cmds);
+ }
+ foreach ($cmds as $c => $has) {
+ $this->set('HAS_CMD_' . strtoupper($c), $has);
+ }
+ }
+
+ public function to_jsono($as_admin = false) {
+ $keys = [
+ 'PUBLIC_HREF',
+ 'ROOT_HREF'
+ ];
+
+ if ($as_admin) {
+ $keys = array_merge($keys, [
+ 'VERSION',
+
+ 'PHP_VERSION',
+ 'MIN_PHP_VERSION',
+ 'PHP_ARCH',
+ 'HAS_PHP_EXIF',
+ 'HAS_PHP_JPEG',
+
+ 'SERVER_NAME',
+ 'SERVER_VERSION',
+ 'HAS_SERVER',
+
+ 'INDEX_HREF',
+
+ 'HAS_WRITABLE_CACHE_PUB',
+ 'HAS_WRITABLE_CACHE_PRV',
+
+ 'HAS_CMD_AVCONV',
+ 'HAS_CMD_CONVERT',
+ 'HAS_CMD_DU',
+ 'HAS_CMD_FFMPEG',
+ 'HAS_CMD_GM',
+ 'HAS_CMD_TAR',
+ 'HAS_CMD_ZIP'
+ ]);
+ }
+
+ $jsono = ['AS_ADMIN' => $as_admin];
+ foreach ($keys as $key) {
+ $jsono[$key] = $this->get($key);
+ }
+ return $jsono;
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-theme.php b/traces/_h5ai/private/php/core/class-theme.php
new file mode 100644
index 0000000..8fcaddd
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-theme.php
@@ -0,0 +1,32 @@
+context = $context;
+ }
+
+ public function get_icons() {
+ $public_path = $this->context->get_setup()->get('PUBLIC_PATH');
+ $theme = $this->context->query_option('view.theme', '-NONE-');
+ $theme_path = $public_path . '/images/themes/' . $theme;
+
+ $icons = [];
+
+ if (is_dir($theme_path)) {
+ if ($dir = opendir($theme_path)) {
+ while (($name = readdir($dir)) !== false) {
+ $path_parts = pathinfo($name);
+ if (in_array(@$path_parts['extension'], Theme::$EXTENSIONS)) {
+ $icons[$path_parts['filename']] = $theme . '/' . $name;
+ }
+ }
+ closedir($dir);
+ }
+ }
+
+ return $icons;
+ }
+}
diff --git a/traces/_h5ai/private/php/core/class-util.php b/traces/_h5ai/private/php/core/class-util.php
new file mode 100644
index 0000000..ce6c802
--- /dev/null
+++ b/traces/_h5ai/private/php/core/class-util.php
@@ -0,0 +1,89 @@
+ $err, 'msg' => $msg]);
+ }
+ }
+
+ public static function array_query($array, $keypath = '', $default = Util::NO_DEFAULT) {
+ $value = $array;
+
+ $keys = array_filter(explode('.', $keypath));
+ foreach ($keys as $key) {
+ if (!is_array($value) || !array_key_exists($key, $value)) {
+ return $default;
+ }
+ $value = $value[$key];
+ }
+
+ return $value;
+ }
+
+ public static function starts_with($sequence, $head) {
+ return substr($sequence, 0, strlen($head)) === $head;
+ }
+
+ public static function ends_with($sequence, $tail) {
+ $len = strlen($tail);
+ return $len === 0 ? true : substr($sequence, -$len) === $tail;
+ }
+
+ public static function wrap_pattern($pattern) {
+ return Util::RE_DELIMITER . str_replace(Util::RE_DELIMITER, '\\' . Util::RE_DELIMITER, $pattern) . Util::RE_DELIMITER;
+ }
+
+ public static function passthru_cmd($cmd) {
+ $rc = null;
+ passthru($cmd, $rc);
+ return $rc;
+ }
+
+ public static function exec_cmdv($cmdv) {
+ if (!is_array($cmdv)) {
+ $cmdv = func_get_args();
+ }
+ $cmd = implode(' ', array_map('escapeshellarg', $cmdv));
+
+ $lines = [];
+ $rc = null;
+ exec($cmd, $lines, $rc);
+ return implode("\n", $lines);
+ }
+
+ public static function exec_0($cmd) {
+ $lines = [];
+ $rc = null;
+ try {
+ @exec($cmd, $lines, $rc);
+ return $rc === 0;
+ } catch (Exception $e) {}
+ return false;
+ }
+
+ public static function filesize($context, $path) {
+ $withFoldersize = $context->query_option('foldersize.enabled', false);
+ $withDu = $context->get_setup()->get('HAS_CMD_DU') && $context->query_option('foldersize.type', null) === 'shell-du';
+ return Filesize::getCachedSize($path, $withFoldersize, $withDu);
+ }
+}
diff --git a/traces/_h5ai/private/php/ext/class-archive.php b/traces/_h5ai/private/php/ext/class-archive.php
new file mode 100644
index 0000000..fec07de
--- /dev/null
+++ b/traces/_h5ai/private/php/ext/class-archive.php
@@ -0,0 +1,183 @@
+context = $context;
+ }
+
+ public function output($type, $base_href, $hrefs) {
+ $this->base_path = $this->context->to_path($base_href);
+ if (!$this->context->is_managed_path($this->base_path)) {
+ return false;
+ }
+
+ $this->dirs = [];
+ $this->files = [];
+
+ $this->add_hrefs($hrefs);
+
+ if (count($this->dirs) === 0 && count($this->files) === 0) {
+ if ($type === 'php-tar') {
+ $this->add_dir($this->base_path, '/');
+ } else {
+ $this->add_dir($this->base_path, '.');
+ }
+ }
+
+ if ($type === 'php-tar') {
+ return $this->php_tar($this->dirs, $this->files);
+ } elseif ($type === 'shell-tar') {
+ return $this->shell_cmd(Archive::$TAR_PASSTHRU_CMD);
+ } elseif ($type === 'shell-zip') {
+ return $this->shell_cmd(Archive::$ZIP_PASSTHRU_CMD);
+ }
+ return false;
+ }
+
+ private function shell_cmd($cmd) {
+ $cmd = str_replace('[ROOTDIR]', escapeshellarg($this->base_path), $cmd);
+ $cmd = str_replace('[DIRS]', count($this->dirs) ? implode(' ', array_map('escapeshellarg', $this->dirs)) : '', $cmd);
+ $cmd = str_replace('[FILES]', count($this->files) ? implode(' ', array_map('escapeshellarg', $this->files)) : '', $cmd);
+ try {
+ Util::passthru_cmd($cmd);
+ } catch (Exeption $err) {
+ return false;
+ }
+ return true;
+ }
+
+ private function php_tar($dirs, $files) {
+ $filesizes = [];
+ $total_size = 512 * count($dirs);
+ foreach (array_keys($files) as $real_file) {
+ $size = filesize($real_file);
+
+ $filesizes[$real_file] = $size;
+ $total_size += 512 + $size;
+ if ($size % 512 != 0) {
+ $total_size += 512 - ($size % 512);
+ }
+ }
+
+ header('Content-Length: ' . $total_size);
+
+ foreach ($dirs as $real_dir => $archived_dir) {
+ echo $this->php_tar_header($archived_dir, 0, @filemtime($real_dir . DIRECTORY_SEPARATOR . '.'), 5);
+ }
+
+ foreach ($files as $real_file => $archived_file) {
+ $size = $filesizes[$real_file];
+
+ echo $this->php_tar_header($archived_file, $size, @filemtime($real_file), 0);
+ $this->print_file($real_file);
+
+ if ($size % 512 != 0) {
+ echo str_repeat(Archive::NULL_BYTE, 512 - ($size % 512));
+ }
+ }
+
+ return true;
+ }
+
+ private function php_tar_header($filename, $size, $mtime, $type) {
+ $name = substr(basename($filename), -99);
+ $prefix = substr(Util::normalize_path(dirname($filename)), -154);
+ if ($prefix === '.') {
+ $prefix = '';
+ }
+
+ $header =
+ str_pad($name, 100, Archive::NULL_BYTE) // filename [100]
+ . '0000755' . Archive::NULL_BYTE // file mode [8]
+ . '0000000' . Archive::NULL_BYTE // uid [8]
+ . '0000000' . Archive::NULL_BYTE // gid [8]
+ . str_pad(decoct($size), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE // file size [12]
+ . str_pad(decoct($mtime), 11, '0', STR_PAD_LEFT) . Archive::NULL_BYTE // file modification time [12]
+ . ' ' // checksum [8]
+ . str_pad($type, 1) // file type [1]
+ . str_repeat(Archive::NULL_BYTE, 100) // linkname [100]
+ . 'ustar' . Archive::NULL_BYTE // magic [6]
+ . '00' // version [2]
+ . str_repeat(Archive::NULL_BYTE, 80) // uname, gname, defmajor, devminor [32 + 32 + 8 + 8]
+ . str_pad($prefix, 155, Archive::NULL_BYTE) // filename [155]
+ . str_repeat(Archive::NULL_BYTE, 12); // fill [12]
+ assert(strlen($header) === 512);
+
+ // checksum
+ $checksum = array_sum(array_map('ord', str_split($header)));
+ $checksum = str_pad(decoct($checksum), 6, '0', STR_PAD_LEFT) . Archive::NULL_BYTE . ' ';
+ $header = substr_replace($header, $checksum, 148, 8);
+
+ return $header;
+ }
+
+ private function print_file($file) {
+ // Send file content in segments to not hit PHP's memory limit (default: 128M)
+ if ($fd = fopen($file, 'rb')) {
+ while (!feof($fd)) {
+ print fread($fd, Archive::$SEGMENT_SIZE);
+ @ob_flush();
+ @flush();
+ }
+ fclose($fd);
+ }
+ }
+
+ private function add_hrefs($hrefs) {
+ foreach ($hrefs as $href) {
+ if (trim($href) === '') {
+ continue;
+ }
+
+ $d = Util::normalize_path(dirname($href), true);
+ $n = basename($href);
+
+ if ($this->context->is_managed_href($d) && !$this->context->is_hidden($n)) {
+
+ $real_file = $this->context->to_path($href);
+ $archived_file = preg_replace('!^' . preg_quote(Util::normalize_path($this->base_path, true)) . '!', '', $real_file);
+
+ if (is_dir($real_file)) {
+ $this->add_dir($real_file, $archived_file);
+ } else {
+ $this->add_file($real_file, $archived_file);
+ }
+ }
+ }
+ }
+
+ private function add_file($real_file, $archived_file) {
+ if (is_readable($real_file)) {
+ $this->files[$real_file] = $archived_file;
+ }
+ }
+
+ private function add_dir($real_dir, $archived_dir) {
+ if ($this->context->is_managed_path($real_dir)) {
+ $this->dirs[$real_dir] = $archived_dir;
+
+ $files = $this->context->read_dir($real_dir);
+ foreach ($files as $file) {
+ $real_file = $real_dir . '/' . $file;
+ $archived_file = $archived_dir . '/' . $file;
+
+ if (is_dir($real_file)) {
+ $this->add_dir($real_file, $archived_file);
+ } else {
+ $this->add_file($real_file, $archived_file);
+ }
+ }
+ }
+ }
+}
diff --git a/traces/_h5ai/private/php/ext/class-custom.php b/traces/_h5ai/private/php/ext/class-custom.php
new file mode 100644
index 0000000..ab1628e
--- /dev/null
+++ b/traces/_h5ai/private/php/ext/class-custom.php
@@ -0,0 +1,65 @@
+context = $context;
+ }
+
+ private function read_custom_file($path, $name, &$content, &$type) {
+ $file_prefix = $this->context->get_setup()->get('FILE_PREFIX');
+
+ foreach (Custom::$EXTENSIONS as $ext) {
+ $file = $path . '/' . $file_prefix . '.' . $name . '.' . $ext;
+ if (is_readable($file)) {
+ $content = file_get_contents($file);
+ $type = $ext;
+ return;
+ }
+ }
+ }
+
+ public function get_customizations($href) {
+ if (!$this->context->query_option('custom.enabled', false)) {
+ return [
+ 'header' => ['content' => null, 'type' => null],
+ 'footer' => ['content' => null, 'type' => null]
+ ];
+ }
+
+ $root_path = $this->context->get_setup()->get('FILE_PREFIX');
+ $path = $this->context->to_path($href);
+
+ $header = null;
+ $header_type = null;
+ $footer = null;
+ $footer_type = null;
+
+ $this->read_custom_file($path, 'header', $header, $header_type);
+ $this->read_custom_file($path, 'footer', $footer, $footer_type);
+
+ while ($header === null || $footer === null) {
+ if ($header === null) {
+ $this->read_custom_file($path, 'headers', $header, $header_type);
+ }
+ if ($footer === null) {
+ $this->read_custom_file($path, 'footers', $footer, $footer_type);
+ }
+ if ($path === $root_path) {
+ break;
+ }
+ $parent_path = Util::normalize_path(dirname($path));
+ if ($parent_path === $path) {
+ break;
+ }
+ $path = $parent_path;
+ }
+
+ return [
+ 'header' => ['content' => $header, 'type' => $header_type],
+ 'footer' => ['content' => $footer, 'type' => $footer_type]
+ ];
+ }
+}
diff --git a/traces/_h5ai/private/php/ext/class-search.php b/traces/_h5ai/private/php/ext/class-search.php
new file mode 100644
index 0000000..124954d
--- /dev/null
+++ b/traces/_h5ai/private/php/ext/class-search.php
@@ -0,0 +1,40 @@
+context = $context;
+ }
+
+ public function get_paths($root, $pattern = null, $ignorecase = false) {
+ $paths = [];
+ if ($pattern && $this->context->is_managed_path($root)) {
+ $re = Util::wrap_pattern($pattern);
+ if ($ignorecase) {
+ $re .= 'i';
+ }
+ $names = $this->context->read_dir($root);
+ foreach ($names as $name) {
+ $path = $root . '/' . $name;
+ if (preg_match($re, @basename($path))) {
+ $paths[] = $path;
+ }
+ if (@is_dir($path)) {
+ $paths = array_merge($paths, $this->get_paths($path, $pattern, $ignorecase));
+ }
+ }
+ }
+ return $paths;
+ }
+
+ public function get_items($href, $pattern = null, $ignorecase = false) {
+ $cache = [];
+ $root = $this->context->to_path($href);
+ $paths = $this->get_paths($root, $pattern, $ignorecase);
+ $items = array_map(function ($path) {
+ return Item::get($this->context, $path, $cache)->to_json_object();
+ }, $paths);
+ return $items;
+ }
+}
diff --git a/traces/_h5ai/private/php/ext/class-thumb.php b/traces/_h5ai/private/php/ext/class-thumb.php
new file mode 100644
index 0000000..d52d3e8
--- /dev/null
+++ b/traces/_h5ai/private/php/ext/class-thumb.php
@@ -0,0 +1,253 @@
+context = $context;
+ $this->setup = $context->get_setup();
+ $this->thumbs_path = $this->setup->get('CACHE_PUB_PATH') . '/' . Thumb::$THUMB_CACHE;
+ $this->thumbs_href = $this->setup->get('CACHE_PUB_HREF') . Thumb::$THUMB_CACHE;
+
+ if (!is_dir($this->thumbs_path)) {
+ @mkdir($this->thumbs_path, 0755, true);
+ }
+ }
+
+ public function thumb($type, $source_href, $width, $height) {
+ $source_path = $this->context->to_path($source_href);
+ if (!file_exists($source_path) || Util::starts_with($source_path, $this->setup->get('CACHE_PUB_PATH'))) {
+ return null;
+ }
+
+ $capture_path = $source_path;
+ if ($type === 'img') {
+ $capture_path = $source_path;
+ } elseif ($type === 'mov') {
+ if ($this->setup->get('HAS_CMD_AVCONV')) {
+ $capture_path = $this->capture(Thumb::$AVCONV_CMDV, $source_path);
+ } elseif ($this->setup->get('HAS_CMD_FFMPEG')) {
+ $capture_path = $this->capture(Thumb::$FFMPEG_CMDV, $source_path);
+ }
+ } elseif ($type === 'doc') {
+ if ($this->setup->get('HAS_CMD_CONVERT')) {
+ $capture_path = $this->capture(Thumb::$CONVERT_CMDV, $source_path);
+ } elseif ($this->setup->get('HAS_CMD_GM')) {
+ $capture_path = $this->capture(Thumb::$GM_CONVERT_CMDV, $source_path);
+ }
+ }
+
+ return $this->thumb_href($capture_path, $width, $height);
+ }
+
+ private function thumb_href($source_path, $width, $height) {
+ if (!file_exists($source_path)) {
+ return null;
+ }
+
+ $name = 'thumb-' . sha1($source_path) . '-' . $width . 'x' . $height . '.jpg';
+ $thumb_path = $this->thumbs_path . '/' . $name;
+ $thumb_href = $this->thumbs_href . '/' . $name;
+
+ if (!file_exists($thumb_path) || filemtime($source_path) >= filemtime($thumb_path)) {
+ $image = new Image();
+
+ $et = false;
+ if ($this->setup->get('HAS_PHP_EXIF') && $this->context->query_option('thumbnails.exif', false) === true && $height != 0) {
+ $et = @exif_thumbnail($source_path);
+ }
+ if($et !== false) {
+ file_put_contents($thumb_path, $et);
+ $image->set_source($thumb_path);
+ $image->normalize_exif_orientation($source_path);
+ } else {
+ $image->set_source($source_path);
+ }
+
+ $image->thumb($width, $height);
+ $image->save_dest_jpeg($thumb_path, 80);
+ }
+
+ return file_exists($thumb_path) ? $thumb_href : null;
+ }
+
+ private function capture($cmdv, $source_path) {
+ if (!file_exists($source_path)) {
+ return null;
+ }
+
+ $capture_path = $this->thumbs_path . '/capture-' . sha1($source_path) . '.jpg';
+
+ if (!file_exists($capture_path) || filemtime($source_path) >= filemtime($capture_path)) {
+ foreach ($cmdv as &$arg) {
+ $arg = str_replace('[SRC]', $source_path, $arg);
+ $arg = str_replace('[DEST]', $capture_path, $arg);
+ }
+
+ Util::exec_cmdv($cmdv);
+ }
+
+ return file_exists($capture_path) ? $capture_path : null;
+ }
+}
+
+class Image {
+ private $source_file;
+ private $source;
+ private $width;
+ private $height;
+ private $type;
+ private $dest;
+
+ public function __construct($filename = null) {
+ $this->source_file = null;
+ $this->source = null;
+ $this->width = null;
+ $this->height = null;
+ $this->type = null;
+
+ $this->dest = null;
+
+ $this->set_source($filename);
+ }
+
+ public function __destruct() {
+ $this->release_source();
+ $this->release_dest();
+ }
+
+ public function set_source($filename) {
+ $this->release_source();
+ $this->release_dest();
+
+ if (is_null($filename)) {
+ return;
+ }
+
+ $this->source_file = $filename;
+
+ list($this->width, $this->height, $this->type) = @getimagesize($this->source_file);
+
+ if (!$this->width || !$this->height) {
+ $this->source_file = null;
+ $this->width = null;
+ $this->height = null;
+ $this->type = null;
+ return;
+ }
+
+ $this->source = imagecreatefromstring(file_get_contents($this->source_file));
+ }
+
+ public function save_dest_jpeg($filename, $quality = 80) {
+ if (!is_null($this->dest)) {
+ @imagejpeg($this->dest, $filename, $quality);
+ @chmod($filename, 0775);
+ }
+ }
+
+ public function release_dest() {
+ if (!is_null($this->dest)) {
+ @imagedestroy($this->dest);
+ $this->dest = null;
+ }
+ }
+
+ public function release_source() {
+ if (!is_null($this->source)) {
+ @imagedestroy($this->source);
+ $this->source_file = null;
+ $this->source = null;
+ $this->width = null;
+ $this->height = null;
+ $this->type = null;
+ }
+ }
+
+ public function thumb($width, $height) {
+ if (is_null($this->source)) {
+ return;
+ }
+
+ $src_r = 1.0 * $this->width / $this->height;
+
+ if ($height == 0) {
+ if ($src_r >= 1) {
+ $height = 1.0 * $width / $src_r;
+ } else {
+ $height = $width;
+ $width = 1.0 * $height * $src_r;
+ }
+ if ($width > $this->width) {
+ $width = $this->width;
+ $height = $this->height;
+ }
+ }
+
+ $ratio = 1.0 * $width / $height;
+
+ if ($src_r <= $ratio) {
+ $src_w = $this->width;
+ $src_h = $src_w / $ratio;
+ $src_x = 0;
+ } else {
+ $src_h = $this->height;
+ $src_w = $src_h * $ratio;
+ $src_x = 0.5 * ($this->width - $src_w);
+ }
+
+ $width = intval($width);
+ $height = intval($height);
+ $src_x = intval($src_x);
+ $src_w = intval($src_w);
+ $src_h = intval($src_h);
+
+ $this->dest = imagecreatetruecolor($width, $height);
+ $icol = imagecolorallocate($this->dest, 255, 255, 255);
+ imagefill($this->dest, 0, 0, $icol);
+ imagecopyresampled($this->dest, $this->source, 0, 0, $src_x, 0, $width, $height, $src_w, $src_h);
+ }
+
+ public function rotate($angle) {
+ if (is_null($this->source) || ($angle !== 90 && $angle !== 180 && $angle !== 270)) {
+ return;
+ }
+
+ $this->source = imagerotate($this->source, $angle, 0);
+ if ( $angle === 90 || $angle === 270 ) {
+ list($this->width, $this->height) = [$this->height, $this->width];
+ }
+ }
+
+ public function normalize_exif_orientation($exif_source_file = null) {
+ if (is_null($this->source) || !function_exists('exif_read_data')) {
+ return;
+ }
+
+ if ($exif_source_file === null) {
+ $exif_source_file = $this->source_file;
+ }
+
+ $exif = exif_read_data($exif_source_file);
+ switch (@$exif['Orientation']) {
+ case 3:
+ $this->rotate(180);
+ break;
+ case 6:
+ $this->rotate(270);
+ break;
+ case 8:
+ $this->rotate(90);
+ break;
+ }
+ }
+}
diff --git a/traces/_h5ai/private/php/pages/index.php b/traces/_h5ai/private/php/pages/index.php
new file mode 100644
index 0000000..7885a87
--- /dev/null
+++ b/traces/_h5ai/private/php/pages/index.php
@@ -0,0 +1,2 @@
+index - powered by h5ai v0.29.2 (https://larsjung.de/h5ai/)
+= $x_head_tags; ?>= $fallback_html; ?>
\ No newline at end of file
diff --git a/traces/_h5ai/private/php/pages/info.php b/traces/_h5ai/private/php/pages/info.php
new file mode 100644
index 0000000..59a8e08
--- /dev/null
+++ b/traces/_h5ai/private/php/pages/info.php
@@ -0,0 +1,2 @@
+h5ai info page - v0.29.2
+= $x_head_tags; ?>
\ No newline at end of file
diff --git a/traces/_h5ai/public/.htaccess b/traces/_h5ai/public/.htaccess
new file mode 100644
index 0000000..3f14990
--- /dev/null
+++ b/traces/_h5ai/public/.htaccess
@@ -0,0 +1,13 @@
+## make this folder accessible
+
+# Apache < 2.3
+
+ Order allow,deny
+ Allow from all
+ Satisfy All
+
+
+# Apache ≥ 2.3
+
+ Require all granted
+
diff --git a/traces/_h5ai/public/cache/README.md b/traces/_h5ai/public/cache/README.md
new file mode 100644
index 0000000..fd2974c
--- /dev/null
+++ b/traces/_h5ai/public/cache/README.md
@@ -0,0 +1,9 @@
+# Cache
+
+Public cache.
+
+This directory is used for server side caching. To use caching make this
+directory writable for your webserver.
+
+There is no critical data in here. You can savely remove any content. This
+will clear the cache.
diff --git a/traces/_h5ai/public/css/styles.css b/traces/_h5ai/public/css/styles.css
new file mode 100644
index 0000000..87bf906
--- /dev/null
+++ b/traces/_h5ai/public/css/styles.css
@@ -0,0 +1,2 @@
+/* h5ai v0.29.2 - https://larsjung.de/h5ai/ */
+@charset "utf-8";/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:0;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}::-moz-selection{color:#fff;background:#ff4081;text-shadow:none}::selection{color:#fff;background:#ff4081;text-shadow:none}*:focus{outline:0}code,pre{font-family:"Ubuntu Mono","Monaco","Lucida Sans Typewriter","monospace";font-size:15px;font-weight:normal;color:rgba(0,0,0,0.87)}audio,canvas,iframe,img,svg,video{vertical-align:middle}textarea{resize:vertical}.hidden{display:none!important}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.raised{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}.popup{box-shadow:0 1px 20px 0 rgba(0,0,0,0.5)}.rounded{border-radius:2px}.clear-appearance{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none}.eased-transition{transition:all .2s ease-in-out}.flex-base{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch}.flex-column{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:column}.flex-row{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row}.el-button{border-radius:2px;transition:all .2s ease-in-out;color:#fff;background:#42a5f5;cursor:pointer;text-decoration:none}.el-button:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}.el-input{border-radius:2px;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:#fff;border:0;outline:0;background:#fafafa;border:1px solid rgba(0,0,0,0.05)}#cm-overlay{position:fixed;left:0;top:0;right:0;bottom:0;overflow:hidden;z-index:200}#cm-overlay .cm-panel{box-shadow:0 1px 20px 0 rgba(0,0,0,0.5);border-radius:2px;display:block;position:absolute;left:100px;top:100px;color:rgba(0,0,0,0.87);background:#fff;z-index:10;overflow:auto;min-width:200px}#cm-overlay .cm-panel ul{margin:0;padding:0;list-style:none;text-align:left}#cm-overlay .cm-label{padding:8px 16px;white-space:nowrap;font-weight:bold}#cm-overlay .cm-entry{padding:8px 16px;white-space:nowrap;cursor:pointer}#cm-overlay .cm-entry:hover{color:#42a5f5;background:rgba(0,0,0,0.03)}#cm-overlay .cm-icon{position:relative;top:-2px}#cm-overlay .cm-icon img{width:20px;height:20px}#cm-overlay .cm-icon.no-icon{opacity:0}#cm-overlay .cm-text{margin:0 0 0 12px}#cm-overlay .cm-sep{height:1px;margin:8px 0;padding:0;border-top:1px solid rgba(0,0,0,0.08)}#crumbbar{overflow:hidden;height:48px;font-size:16px;padding:0 8px}#crumbbar a,#crumbbar a:active,#crumbbar a:visited{color:rgba(0,0,0,0.87);cursor:pointer;text-decoration:none}#crumbbar a.active,#crumbbar a:active.active,#crumbbar a:visited.active{font-weight:bold}#crumbbar a:hover,#crumbbar a:active:hover,#crumbbar a:visited:hover{color:#42a5f5}#crumbbar a:focus,#crumbbar a:active:focus,#crumbbar a:visited:focus{outline:0}#crumbbar .crumb{transition:all .2s ease-in-out;display:inline-block}#crumbbar .sep{width:24px;height:24px;padding:12px 0;line-height:48px;display:inline-block;vertical-align:top}#crumbbar .crumb:first-of-type .sep{width:0}#crumbbar .label{line-height:48px;display:inline-block;vertical-align:top;padding:0 8px}#crumbbar .hint{width:20px;height:20px;padding:16px 0 0 0;line-height:48px;display:inline-block;vertical-align:top;position:relative;top:-2px}#content-header,#content-footer{margin:16px;padding:8px;color:rgba(0,0,0,0.87)}#content-header a,#content-footer a,#content-header a:active,#content-footer a:active,#content-header a:visited,#content-footer a:visited{color:#42a5f5;text-decoration:none;cursor:pointer}#content-header a:hover,#content-footer a:hover,#content-header a:active:hover,#content-footer a:active:hover,#content-header a:visited:hover,#content-footer a:visited:hover{color:#212121}#content-header h1,#content-footer h1,#content-header h2,#content-footer h2,#content-header h3,#content-footer h3,#content-header h4,#content-footer h4,#content-header h5,#content-footer h5,#content-header h6,#content-footer h6,#content-header p,#content-footer p{margin:.1em 0}#filter input{display:none;border:0;font-size:16px;color:rgba(0,0,0,0.87);background:transparent;outline:0;width:160px;padding:0 12px 0 4px;line-height:48px;vertical-align:top}#filter.active input{display:inline-block}#filter.pending input{color:rgba(0,0,0,0.26)}#info{overflow:auto;flex:0 0 auto;order:99;padding:32px 32px 32px 48px;white-space:nowrap;overflow-x:hidden;width:240px}#info .icon{width:240px;height:180px}#info .icon img{border-radius:2px;display:block;overflow:hidden;margin:0 auto;width:180px;height:180px}#info .icon .thumb{width:240px}#info .block{border-top:1px solid rgba(0,0,0,0.05);border-bottom:1px solid rgba(0,0,0,0.05);margin:0 0 24px 0;padding:24px 0}#info .label{font-size:16px;margin-bottom:16px}#info .time,#info .size,#info .content{line-height:20px;height:20px}#info .qrcode{margin:0 auto;width:200px}#info .qrcode img{display:block}#pv-content-aud{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%}#pv-content-img{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%;background-color:#f8f8f8;background-image:-webkit-linear-gradient(45deg,#e8e8e8 25%,transparent 25%,transparent 75%,#e8e8e8 75%,#e8e8e8),-webkit-linear-gradient(45deg,#e8e8e8 25%,transparent 25%,transparent 75%,#e8e8e8 75%,#e8e8e8);background-size:60px 60px;background-position:0 0,30px 30px}#pv-content-img.loading{opacity:.5;margin-top:32px;width:240px;height:240px;border-radius:1000px;overflow:hidden}#pv-content-txt{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);box-sizing:border-box;max-width:960px;text-align:left;background:#fff;margin:0 auto;padding:8px;overflow:auto}#pv-content-txt a,#pv-content-txt a:active,#pv-content-txt a:visited{color:#2080ff;text-decoration:none;cursor:pointer}#pv-content-txt a:hover,#pv-content-txt a:active:hover,#pv-content-txt a:visited:hover{color:#68a9ff}pre#pv-content-txt code{line-height:1.2em}div#pv-content-txt{font-size:1.1em;padding:8px 24px}div#pv-content-txt code{color:#008200}#pv-content-vid{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:absolute;max-width:100%;max-height:100%}#pv-content-vid:-webkit-full-screen{top:auto!important;left:auto!important}#pv-overlay{position:fixed;left:0;top:0;right:0;bottom:0;z-index:100;background:rgba(0,0,0,0.5);transition:background-color .3s ease-in-out;text-align:center}#pv-overlay.fullscreen{background:#212121}#pv-container{position:absolute}#pv-spinner{position:absolute}#pv-spinner .back{width:240px;height:240px;margin:-120px -120px;border-radius:120px;opacity:.5;overflow:hidden}#pv-spinner .spinner{width:100px;height:100px;margin:-50px -50px}#pv-prev-area,#pv-next-area{position:absolute;top:50%;cursor:pointer}#pv-prev-area img,#pv-next-area img{transition:all .2s ease-in-out;display:block;width:48px;height:48px;margin:-36px 0;padding:12px;opacity:.5}#pv-prev-area:hover img,#pv-next-area:hover img{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);opacity:1;background:rgba(27,27,27,0.8)}#pv-prev-area{left:0}#pv-prev-area img{border-radius:0 8px 8px 0;padding-left:48px}#pv-next-area{right:0}#pv-next-area img{border-radius:8px 0 0 8px;padding-right:48px}#pv-buttons{list-style:none;list-style-image:none;margin:0;padding:0}#pv-buttons img{position:relative;width:24px;height:24px;padding:12px}#pv-buttons .bar-label{transition:all .2s ease-in-out;display:block;color:#fff;height:48px;line-height:48px;padding:0 12px;opacity:.7}#pv-buttons .bar-button{transition:all .2s ease-in-out;display:block;line-height:48px;opacity:.7;cursor:pointer}#pv-buttons .bar-button:hover{opacity:1;background:rgba(255,255,255,0.1)}#pv-buttons .bar-left{float:left}#pv-buttons .bar-right{float:right}#pv-bottombar{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);position:fixed;z-index:5;left:0;right:0;bottom:0;background:#1b1b1b;height:48px}#pv-overlay.fullscreen #pv-bottombar{opacity:.5}@media only screen and (max-width:700px){#pv-prev-area,#pv-next-area{display:none!important}}#search input{display:none;border:0;font-size:16px;color:rgba(0,0,0,0.87);background:transparent;outline:0;width:160px;padding:0 12px 0 4px;line-height:48px;vertical-align:top}#search.active input{display:inline-block}#search.pending input{color:rgba(0,0,0,0.26)}#selection-rect{position:absolute;left:0;top:0;z-index:2;border:1px dashed rgba(0,0,0,0.15);background:rgba(0,0,0,0.1)}html.drag-select,html.drag-select *{cursor:move!important;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}html.drag-select #view .item:hover,html.drag-select * #view .item:hover{box-shadow:none!important}#view .selector{display:none;position:absolute;left:0;top:0;width:22px;height:22px;background:#42a5f5;cursor:pointer;border-radius:0 0 2px 0;opacity:.6}#view .selector:hover{opacity:.8}#view .selector img{width:100%;height:100%}#view .item:hover .selector{display:block}#view .item.selected:not(.selecting),#view .item.selecting:not(.selected){color:#fff;background:#42a5f5}#view .item.selected:not(.selecting) .selector,#view .item.selecting:not(.selected) .selector{display:block;opacity:1}#view .item.selected:not(.selecting):hover,#view .item.selecting:not(.selected):hover{color:#fff;background:#42a5f5}#view .no-match{display:none;margin-top:36px;text-align:center;color:rgba(0,0,0,0.05);font-size:5em;font-weight:bold}#tree{overflow:auto;flex:0 0 auto;order:1;padding:32px 32px 32px 16px;white-space:nowrap;max-width:250px;overflow-x:hidden}#tree a,#tree a:active,#tree a.visited{display:block;margin-left:20px;padding:3px 0;text-decoration:none;color:rgba(0,0,0,0.87)}#tree a:hover,#tree a:active:hover,#tree a.visited:hover{color:#42a5f5}#tree .active>a{font-weight:bold}#tree .indicator{display:block;float:left;padding:3px 0;position:relative;top:-2px;cursor:pointer}#tree .indicator img{width:20px;height:20px;zoom:1}#tree .item{clear:left}#tree .item.open>.indicator img{-webkit-transform:rotate(90deg);transform:rotate(90deg)}#tree .item.unknown>.indicator{opacity:.3}#tree .item.none>.indicator{opacity:0;cursor:inherit}#tree .item.unknown>.content,#tree .item.none>.content,#tree .item.closed>.content{display:none}#tree .icon{position:relative;top:-2px}#tree .icon img{width:20px;height:20px}#tree .label{margin:0 0 0 4px}#tree .content{margin:0;padding:0 0 0 20px}#tree .summary{color:rgba(0,0,0,0.26);padding:0 0 0 8px}#root.info #content{flex:1 1 auto;order:50;color:rgba(0,0,0,0.87);text-align:center}#root.info code{margin:0 .2em;padding:2px 4px;border-radius:4px;letter-spacing:.05em;background:#fafafa;border:1px solid rgba(0,0,0,0.05);font-size:.9em}#root.info #header a{transition:all .2s ease-in-out;font-size:4em;font-weight:300;margin:.8em 0 0 0;color:rgba(0,0,0,0.87);text-decoration:none}#root.info #header a:hover{color:#42a5f5}#root.info #support{margin:24px auto;padding:18px 0 6px 0;width:292px;background:#fafafa;border:1px solid rgba(0,0,0,0.05);border-radius:4px}#root.info #support input[type="image"]{border:0;width:100px;padding:12px 48px}#root.info #pass{border-radius:2px;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:#fff;border:0;outline:0;background:#fafafa;border:1px solid rgba(0,0,0,0.05);display:inline-block;margin:8px;padding:0 12px;line-height:28px;width:200px;vertical-align:top}#root.info #login,#root.info #logout{border-radius:2px;transition:all .2s ease-in-out;color:#fff;background:#42a5f5;cursor:pointer;text-decoration:none;display:inline-block;margin:8px;padding:0 12px;line-height:28px;vertical-align:top}#root.info #login:hover,#root.info #logout:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#root.info #hint{margin:12px auto;width:320px}#root.info #tests{display:inline-block;text-align:left;list-style-type:none;margin:48px 0;padding:0}#root.info #tests .test{background:#fff;margin:12px 0 0 0;padding:8px 12px 12px 12px;border-bottom:1px solid rgba(0,0,0,0.05)}#root.info #tests .label{display:inline-block;width:250px;font-size:1.4em}#root.info #tests .result{display:inline-block;width:250px;text-align:right;font-size:1.4em;font-weight:bold}#root.info #tests .result.passed{color:#4caf50}#root.info #tests .result.failed{color:#f44336}#root.info #tests .info{margin:4px 0 0 0}#content{overflow:auto;flex:1 1 auto;order:50;position:relative}#fallback{display:none;max-width:960px;margin:16px auto;padding:32px 16px}#fallback table{display:block;width:100%;border-collapse:collapse;background:#fff}#fallback th,#fallback td{padding:6px;text-align:left;border:0;border-bottom:1px solid #f0f0f0}#fallback th{color:#aaa;font-weight:normal;line-height:36px}#fallback td{overflow:hidden;white-space:nowrap}#fallback a,#fallback a:active,#fallback a:visited{display:block;color:inherit;text-decoration:none;cursor:pointer}#fallback a:hover,#fallback a:active:hover,#fallback a:visited:hover{color:#42a5f5}#fallback .fb-i{width:20px;padding-left:12px}#fallback .fb-i img{width:20px;height:20px;position:relative;top:-1px}#fallback .fb-n{width:682px;max-width:682px}#fallback .fb-d{text-align:right;width:160px;min-width:160px}#fallback .fb-s{text-align:right;width:70px;min-width:70px;padding-right:12px}#fallback-hints{display:none;overflow:hidden;text-align:right;background:#fafafa;border-bottom:1px solid rgba(0,0,0,0.05)}#fallback-hints a,#fallback-hints a:active,#fallback-hints a:visited{transition:all .2s ease-in-out;display:inline-block;line-height:48px;color:rgba(0,0,0,0.54);text-decoration:none;outline:0}#fallback-hints a:hover,#fallback-hints a:active:hover,#fallback-hints a:visited:hover{color:#42a5f5}#fallback-hints .backlink{margin:0 16px}#fallback-hints .noJsMsg,#fallback-hints .noBrowserMsg{display:none;margin:0 16px;color:#f44336}html.no-js #root,html.no-browser #root{position:static;overflow:auto}html.no-js #fallback,html.no-browser #fallback,html.no-js #fallback-hints,html.no-browser #fallback-hints{display:block}html.no-js .noJsMsg{display:inline!important}html.no-browser .noBrowserMsg{display:inline!important}#mainrow{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row;flex:1 1 auto;order:50;height:0}#notification{position:fixed;left:50%;width:200px;margin-left:-100px;z-index:100;padding:3px 6px 6px 6px;color:#fff;background:rgba(0,0,0,0.2);border-radius:0 0 4px 4px;text-align:center;overflow:hidden}#root{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:column;position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;background:#fff;line-height:1.4}#root,input,select{font-family:"Ubuntu","Roboto","Helvetica","Arial","sans-serif";font-size:13px;font-weight:normal;color:rgba(0,0,0,0.87)}#sidebar{overflow-x:hidden;overflow-y:auto;flex:0 0 auto;order:0;background:#fafafa;border-right:1px solid rgba(0,0,0,0.05);padding:16px;position:absolute;top:48px;min-height:100%;z-index:1}#sidebar .block{display:block;margin:0 0 24px 0;width:168px}#sidebar .block h1{font-size:1em;margin:2px 0 6px 0}#sidebar .button{border-radius:2px;transition:all .2s ease-in-out;display:inline-block;margin:4px;color:rgba(0,0,0,0.87);cursor:pointer}#sidebar .button:hover{background:rgba(0,0,0,0.03)}#sidebar .button.active{background:rgba(0,0,0,0.03);box-shadow:inset 0 0 4px 0 rgba(0,0,0,0.4)}#sidebar .button img{width:24px;height:24px;padding:12px}#sidebar .select{border-radius:2px;background:transparent;overflow:hidden;outline:0;width:160px;margin:4px;line-height:48px}#sidebar input,#sidebar select{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;background:transparent;width:100%;border:0 solid #000;cursor:pointer;outline:0}#sidebar input:hover,#sidebar select:hover{background:rgba(0,0,0,0.03)}#sidebar select{width:187px;padding:0 8px;height:48px;line-height:48px}#sidebar input[type='range']{border-radius:2px;width:144px;margin:4px;padding:8px;vertical-align:middle;height:32px;line-height:32px}#sidebar .range-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar .range-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar input[type='range']::-webkit-slider-runnable-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-moz-range-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-track{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-fill-lower{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-ms-fill-upper{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#e0e0e0;height:6px}#sidebar input[type='range']::-webkit-slider-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px;margin-top:-5px}#sidebar input[type='range']::-moz-range-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar input[type='range']::-ms-thumb{-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;border-width:0;border-radius:20px;background:#616161;width:16px;height:16px}#sidebar #view-size{display:block}#topbar{display:flex;flex-wrap:nowrap;justify-content:flex-start;align-content:flex-start;align-items:stretch;flex-direction:row;overflow:hidden;flex:0 0 auto;order:1;background:#fafafa;border-bottom:1px solid rgba(0,0,0,0.05);z-index:1}#toolbar{overflow:hidden;flex:0 0 auto;order:1;height:48px}#toolbar .tool{transition:all .2s ease-in-out;display:inline-block;cursor:pointer}#toolbar .tool img{display:inline-block;width:24px;height:24px;padding:12px}#toolbar .tool:hover{background:rgba(0,0,0,0.03)}#flowbar{overflow:hidden;flex:1 1 auto;order:2;height:48px}#backlink{transition:all .2s ease-in-out;display:block;flex:0 0 auto;order:99;text-align:center;padding:6px 12px;overflow:hidden;height:36px}#backlink,#backlink:active,#backlink:visited{color:rgba(0,0,0,0.26);cursor:pointer;text-decoration:none}#backlink:hover{color:#42a5f5;background:rgba(0,0,0,0.03)}#backlink:focus{outline:0}#backlink div{line-height:18px;white-space:nowrap}#view.view-details{margin:32px}#view.view-details .header{position:relative;white-space:nowrap;display:list-item;border-bottom:1px solid rgba(0,0,0,0.07);border-radius:2px 2px 0 0}#view.view-details .header .label,#view.view-details .header .date,#view.view-details .header .size{transition:all .2s ease-in-out;line-height:24px;padding:0 8px 16px 8px;opacity:.4;outline:0}#view.view-details .header .label:hover,#view.view-details .header .date:hover,#view.view-details .header .size:hover{opacity:1;color:#42a5f5}#view.view-details .header .sort{display:none;position:relative;top:-2px;width:20px;height:20px;padding:0 4px}#view.view-details .header .ascending .sort{display:inline}#view.view-details .header .descending .sort{display:inline;-webkit-transform:rotate(180deg);transform:rotate(180deg);zoom:1}#view.view-details .item{overflow:hidden;border-bottom:1px solid rgba(0,0,0,0.07)}#view.view-details .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5);z-index:1}#view.view-details .item:last-child{border-radius:0 0 2px 2px}#view.view-details .square{display:inline-block;position:absolute;left:16px;top:-1px;padding:8px}#view.view-details .square .thumb{border-radius:2px;box-shadow:0 0 1px 0 rgba(0,0,0,0.2)}#view.view-details .label,#view.view-details .date,#view.view-details .size{padding:0 8px}#view.view-details .date{position:absolute;right:116px;top:0}#view.view-details .size{position:absolute;right:16px;top:0}#view.view-details .item .label,#view.view-details .item .date,#view.view-details .item .size{line-height:30px}#view.view-details .square{width:16px;height:16px}#view.view-details .square img{width:16px;height:16px}#view.view-details .label{margin:0 246px 0 48px}#view.view-details.width-0 .label{margin-right:4px}#view.view-details.width-0 .date{display:none}#view.view-details.width-0 .size{display:none}#view.view-details.width-1 .label{margin-right:64px}#view.view-details.width-1 .date{display:none}#view.view-grid{margin:28px}#view.view-grid .item{border-radius:2px;overflow:hidden;float:left;margin:8px}#view.view-grid .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#view.view-grid .square{display:inline-block;vertical-align:top}#view.view-grid .label{display:inline-block;vertical-align:top;width:180px;padding:0 8px}#view.view-grid .date,#view.view-grid .size{display:none}#view.view-grid .label{line-height:48px}#view.view-grid .square{width:48px;height:48px}#view.view-grid .square img{width:48px;height:48px}#view.view-icons{margin:28px}#view.view-icons .item{border-radius:2px;overflow:hidden;float:left;margin:8px}#view.view-icons .item:hover{box-shadow:0 1px 10px 0 rgba(0,0,0,0.5)}#view.view-icons .landscape{display:block;background:#fafafa}#view.view-icons .label{padding:0 6px;line-height:24px;text-align:center}#view.view-icons .date,#view.view-icons .size{display:none}#view.view-icons .item{width:128px}#view.view-icons .landscape{width:128px;height:96px}#view.view-icons .landscape img{width:96px;height:96px}#view.view-icons .landscape .thumb{width:128px}#view a,#view a:active,#view a:visited{display:block;color:inherit;cursor:pointer;text-decoration:none}#view ul{margin:0;padding:0;list-style:none}#view .header{display:none}#view .item{position:relative;white-space:nowrap;background:#fff}#view .item:hover{color:#42a5f5;background:#fafafa}#view .folder-parent .date,#view .folder-parent .size{display:none}#view .icon{display:none;text-align:center}#view .icon img{position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}#view .icon .thumb{max-width:none;max-height:none}#view .label{display:block;overflow:hidden;text-align:left;text-overflow:ellipsis}#view .date{text-align:right;width:130px}#view .size{text-align:right;width:80px}#view #view-hint{display:block;margin-top:36px;text-align:center;color:rgba(0,0,0,0.05);font-size:5em;font-weight:bold}@media only screen and (max-width:700px){#crumbbar .crumb:not(.active){display:none}#crumbbar .crumb.active .sep{width:0}#tree,#info{display:none!important}}@media print{*,*:before,*:after,*:first-letter ,*:first-line {background:transparent!important;color:#000!important;box-shadow:none!important;text-shadow:none!important}#toolbar,#sidebar,#tree,#info{display:none!important}}
\ No newline at end of file
diff --git a/traces/_h5ai/public/ext/README.md b/traces/_h5ai/public/ext/README.md
new file mode 100644
index 0000000..7f9460c
--- /dev/null
+++ b/traces/_h5ai/public/ext/README.md
@@ -0,0 +1,4 @@
+# Extensions
+
+This directory is used for additional script and style files. You have to add
+them manualy to the `resources` section in `_h5ai/private/conf/options.json`.
diff --git a/traces/_h5ai/public/images/fallback/file.png b/traces/_h5ai/public/images/fallback/file.png
new file mode 100644
index 0000000000000000000000000000000000000000..c796a825dc0d1f519a95280ea35fa9202b11b3bf
GIT binary patch
literal 118
zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=t*47)NCo5DGuFHe20TYDOxSZ+
z_?d3=DewOqpL{(U>zS2u`=n!`NVDOIGA5A*237@U#uK|ZbT&Br*$E2I
R*8&Y<@O1TaS?83{1OS-LCuslx
literal 0
HcmV?d00001
diff --git a/traces/_h5ai/public/images/fallback/folder-parent.png b/traces/_h5ai/public/images/fallback/folder-parent.png
new file mode 100644
index 0000000000000000000000000000000000000000..38da20dc9262f05651d048f7bbeabf65c50a917f
GIT binary patch
literal 108
zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=v8Rh;NCji^0$T~z#Kc5i1s~JH
zPR`E%oi~b^@^VW)Yn#~gGEw1aoZP;)tU&YE7kPV_7+x9Y3kGj{{|cy`!PC{xWt~$(
F696kY9+Ch6
literal 0
HcmV?d00001
diff --git a/traces/_h5ai/public/images/fallback/folder.png b/traces/_h5ai/public/images/fallback/folder.png
new file mode 100644
index 0000000000000000000000000000000000000000..d4722e788e8e965c019daf82408d6b77f43def6f
GIT binary patch
literal 99
zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE;=mZytjNCjiE#6blUlP~sWGGb!a
w9A-97k?t~>AY@~})+c3=^W%mIV0)
zGc^2vpzvi^xHC|o%+tj&q=ND78E;0W03K$?f`+y$PApgUYl(dDJ6-R7AV$SA{`sut
zNjG(7EKM=vPSc!uwkgspZF9mjoI+(K#z>(0z!_BFGwF-&J4?=amST}JZGkRe@O1Ta
JS?83{1OUMlPdESo
literal 0
HcmV?d00001
diff --git a/traces/_h5ai/public/images/favicon/favicon-16-32.ico b/traces/_h5ai/public/images/favicon/favicon-16-32.ico
new file mode 100644
index 0000000000000000000000000000000000000000..be172231b6902c8f86a2695285a78e4b0f745e6c
GIT binary patch
literal 5430
zcmeH~;SGX7422)+0E}?Ij9cguFoRpj1kT|YY<9ki{3xOELaxTdUeX-*a_xhUatT0#
z9oiP06Rro~2q2|t{h)rQcA~~h?wE8=0QFxSUDxF;F+a*f&VeS)a
zw)mCgS~b6=XMP0|LsJ+x?tAA*o}4p@abd`L^cr&T#0UZ_1gvkxOJClCmycC9{51iK
zlb5dD0WTk`Zun~g7AG%VyT|+Y;%wCo{+fWr$xGMn(f?kYt-8Tq6RYgr+Ar*|t5;6)VCSUB$WW>a-
tIc#ARkz@+;;9E9}aWPwul)(oEhHuWskKC<%qk&o&JYD@<);T3K0RX3>7Rvwt
literal 0
HcmV?d00001
diff --git a/traces/_h5ai/public/images/favicon/favicon-32.png b/traces/_h5ai/public/images/favicon/favicon-32.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f97d12e445524bb2af5951cf17593dd823938c3
GIT binary patch
literal 120
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzdrud~kP61P=e7$nDDWH&n6~A4
zV)2SP|GrCee~EWYnYnb
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/README.md b/traces/_h5ai/public/images/themes/README.md
new file mode 100644
index 0000000..650e0f7
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/README.md
@@ -0,0 +1,9 @@
+# Themes
+
+This directory will contain any themes you add. At the moment there are only
+icon themes supported. The folder structure is: `/.`,
+with `` one of `svg`, `png` or `jpg`.
+
+To select a theme use the option `view > theme` in file `conf/options.json`.
+
+You will find the previously included icon themes [here](https://github.com/lrsjng/h5ai-themes).
diff --git a/traces/_h5ai/public/images/themes/comity/ar-apk.svg b/traces/_h5ai/public/images/themes/comity/ar-apk.svg
new file mode 100644
index 0000000..a7cc5cd
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/ar-apk.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/ar-deb.svg b/traces/_h5ai/public/images/themes/comity/ar-deb.svg
new file mode 100644
index 0000000..f1efae9
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/ar-deb.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/ar-rpm.svg b/traces/_h5ai/public/images/themes/comity/ar-rpm.svg
new file mode 100644
index 0000000..4146098
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/ar-rpm.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-css.svg b/traces/_h5ai/public/images/themes/comity/txt-css.svg
new file mode 100644
index 0000000..487a535
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-css.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-go.svg b/traces/_h5ai/public/images/themes/comity/txt-go.svg
new file mode 100644
index 0000000..0d21bb0
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-go.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-html.svg b/traces/_h5ai/public/images/themes/comity/txt-html.svg
new file mode 100644
index 0000000..356e855
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-html.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-js.svg b/traces/_h5ai/public/images/themes/comity/txt-js.svg
new file mode 100644
index 0000000..91a3279
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-js.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-less.svg b/traces/_h5ai/public/images/themes/comity/txt-less.svg
new file mode 100644
index 0000000..fd15b02
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-less.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-md.svg b/traces/_h5ai/public/images/themes/comity/txt-md.svg
new file mode 100644
index 0000000..a2fba14
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-md.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-php.svg b/traces/_h5ai/public/images/themes/comity/txt-php.svg
new file mode 100644
index 0000000..84e1e22
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-php.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-py.svg b/traces/_h5ai/public/images/themes/comity/txt-py.svg
new file mode 100644
index 0000000..d5dc003
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-py.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-rb.svg b/traces/_h5ai/public/images/themes/comity/txt-rb.svg
new file mode 100644
index 0000000..a642dc2
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-rb.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-rust.svg b/traces/_h5ai/public/images/themes/comity/txt-rust.svg
new file mode 100644
index 0000000..0a71e77
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-rust.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/txt-script.svg b/traces/_h5ai/public/images/themes/comity/txt-script.svg
new file mode 100644
index 0000000..f8704e8
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/txt-script.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/comity/x-pdf.svg b/traces/_h5ai/public/images/themes/comity/x-pdf.svg
new file mode 100644
index 0000000..5266630
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/comity/x-pdf.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/ar.svg b/traces/_h5ai/public/images/themes/default/ar.svg
new file mode 100644
index 0000000..e25cded
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/ar.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/aud.svg b/traces/_h5ai/public/images/themes/default/aud.svg
new file mode 100644
index 0000000..dd955fc
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/aud.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/bin.svg b/traces/_h5ai/public/images/themes/default/bin.svg
new file mode 100644
index 0000000..34f1f45
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/bin.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/file.svg b/traces/_h5ai/public/images/themes/default/file.svg
new file mode 100644
index 0000000..66bcac7
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/file.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/folder-page.svg b/traces/_h5ai/public/images/themes/default/folder-page.svg
new file mode 100644
index 0000000..4ca3ec2
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/folder-page.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/folder-parent.svg b/traces/_h5ai/public/images/themes/default/folder-parent.svg
new file mode 100644
index 0000000..e114689
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/folder-parent.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/folder.svg b/traces/_h5ai/public/images/themes/default/folder.svg
new file mode 100644
index 0000000..3e971cf
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/folder.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/img.svg b/traces/_h5ai/public/images/themes/default/img.svg
new file mode 100644
index 0000000..e754e82
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/img.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/txt.svg b/traces/_h5ai/public/images/themes/default/txt.svg
new file mode 100644
index 0000000..d5c0dc9
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/txt.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/vid.svg b/traces/_h5ai/public/images/themes/default/vid.svg
new file mode 100644
index 0000000..dd955fc
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/vid.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/themes/default/x.svg b/traces/_h5ai/public/images/themes/default/x.svg
new file mode 100644
index 0000000..66bcac7
--- /dev/null
+++ b/traces/_h5ai/public/images/themes/default/x.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/back.svg b/traces/_h5ai/public/images/ui/back.svg
new file mode 100644
index 0000000..3275e21
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/back.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/crumb.svg b/traces/_h5ai/public/images/ui/crumb.svg
new file mode 100644
index 0000000..8dfd404
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/crumb.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/download.svg b/traces/_h5ai/public/images/ui/download.svg
new file mode 100644
index 0000000..5721c4e
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/download.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/filter.svg b/traces/_h5ai/public/images/ui/filter.svg
new file mode 100644
index 0000000..d6d4c78
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/filter.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/info-toggle.svg b/traces/_h5ai/public/images/ui/info-toggle.svg
new file mode 100644
index 0000000..ebc0e5c
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/info-toggle.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/paypal.svg b/traces/_h5ai/public/images/ui/paypal.svg
new file mode 100644
index 0000000..a17415e
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/paypal.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/preview-close.svg b/traces/_h5ai/public/images/ui/preview-close.svg
new file mode 100644
index 0000000..ef5f8a0
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/preview-close.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/preview-fullscreen.svg b/traces/_h5ai/public/images/ui/preview-fullscreen.svg
new file mode 100644
index 0000000..bf04ad7
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/preview-fullscreen.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/preview-next.svg b/traces/_h5ai/public/images/ui/preview-next.svg
new file mode 100644
index 0000000..1b72100
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/preview-next.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/preview-no-fullscreen.svg b/traces/_h5ai/public/images/ui/preview-no-fullscreen.svg
new file mode 100644
index 0000000..d2a3efb
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/preview-no-fullscreen.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/preview-prev.svg b/traces/_h5ai/public/images/ui/preview-prev.svg
new file mode 100644
index 0000000..a592b22
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/preview-prev.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/preview-raw.svg b/traces/_h5ai/public/images/ui/preview-raw.svg
new file mode 100644
index 0000000..7a8a69d
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/preview-raw.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/search.svg b/traces/_h5ai/public/images/ui/search.svg
new file mode 100644
index 0000000..d6d4c78
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/search.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/selected.svg b/traces/_h5ai/public/images/ui/selected.svg
new file mode 100644
index 0000000..50ac249
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/selected.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/sidebar.svg b/traces/_h5ai/public/images/ui/sidebar.svg
new file mode 100644
index 0000000..4e38c05
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/sidebar.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/sort.svg b/traces/_h5ai/public/images/ui/sort.svg
new file mode 100644
index 0000000..5b0ed8d
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/sort.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/spinner.svg b/traces/_h5ai/public/images/ui/spinner.svg
new file mode 100644
index 0000000..a5f7a7b
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/spinner.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/traces/_h5ai/public/images/ui/tree-indicator.svg b/traces/_h5ai/public/images/ui/tree-indicator.svg
new file mode 100644
index 0000000..8dfd404
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/tree-indicator.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/tree-toggle.svg b/traces/_h5ai/public/images/ui/tree-toggle.svg
new file mode 100644
index 0000000..9914792
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/tree-toggle.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/view-details.svg b/traces/_h5ai/public/images/ui/view-details.svg
new file mode 100644
index 0000000..5e756e0
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/view-details.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/view-grid.svg b/traces/_h5ai/public/images/ui/view-grid.svg
new file mode 100644
index 0000000..8f4c48c
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/view-grid.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/images/ui/view-icons.svg b/traces/_h5ai/public/images/ui/view-icons.svg
new file mode 100644
index 0000000..8601293
--- /dev/null
+++ b/traces/_h5ai/public/images/ui/view-icons.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/traces/_h5ai/public/index.php b/traces/_h5ai/public/index.php
new file mode 100644
index 0000000..89f99e8
--- /dev/null
+++ b/traces/_h5ai/public/index.php
@@ -0,0 +1,17 @@
+=0},g=function(e){return d(e,function(e){return!!e})},m=function(e,t){return!!e&&e instanceof t},v=function(e){return Array.from(e)},b=function(e,t){return t=l(t),d(e,function(e){return t.indexOf(e)<0})},w=function(e,t){return t=l(t),d(e,function(e){return t.indexOf(e)>=0})},y=function(e,t){return et?1:0},x=function(e,t){var n=a(t)?t:function(e){return e[t]},r=function(e,t){return y(n(e),n(t))};return l(e).sort(r)},k=function(e,t){var n=null;return function(){clearTimeout(n),n=setTimeout(e,t)}};e.exports={is:r,isStr:o,isFn:a,isNum:s,hasLength:c,keys:u,values:l,each:f,filter:d,map:p,includes:h,compact:g,isInstanceOf:m,toArray:v,difference:b,intersection:w,cmp:y,sortBy:x,debounce:k}},function(e,t,n){(function(t){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:g;try{return p(t.querySelectorAll(e))}catch(e){return[]}},b=function(e){return d(e,h.Element)},w=function(e){return d(e,h.Document)},y=function(e){return u(e)&&e.window===e&&w(e.document)},x=function(e){return b(e)||w(e)||y(e)},k=function(e,t,n){return e.addEventListener(t,n)},_=function(e,t,n){return e.removeEventListener(t,n)},C=new Promise(function(e){/^(i|c|loade)/.test(g.readyState)?e():k(g,"DOMContentLoaded",function(){return e()})}),S=function(){return C},A=new Promise(function(e){k(h,"load",function(){return e()})}),T=function(){return A},E=function e(t){if(d(t,e))return t;var n=void 0;return l(t)?(t=t.trim(),n="<"===t[0]?m(t):v(t)):n=x(t)?[t]:c(t)?t:[t],n=s(n,x),Object.assign(Object.create(e.prototype),n,{length:n.length})};E.prototype={constructor:E,each:function(e){return a(this,e),this},map:function(e){return f(this,e)},find:function(e){var t;return E((t=[]).concat.apply(t,r(this.map(function(t){return v(e,t)}))))},on:function(e,t){return this.each(function(n){return k(n,e,t)})},off:function(e,t){return this.each(function(n){return _(n,e,t)})},attr:function(e,t){return void 0===t?this.length?this[0].getAttribute(e):void 0:this.each(function(n){return n.setAttribute(e,t)})},rmAttr:function(e){return this.each(function(t){return t.removeAttribute(e)})},prop:function(e,t){return void 0===t?this.length?this[0][e]:void 0:this.each(function(n){n[e]=t})},rmProp:function(e){return this.each(function(t){return delete t[e]})},val:function(e){return void 0===e?this.length?this[0].value:void 0:this.each(function(t){t.value=e})},html:function(e){return void 0===e?this.map(function(e){return e.innerHTML}).join(""):this.each(function(t){t.innerHTML=e})},text:function(e){return void 0===e?this.map(function(e){return e.textContent}).join(""):this.each(function(t){t.textContent=e})},clr:function(){return this.html("")},rm:function(){return this.each(function(e){var t=e.parentNode;t&&t.removeChild(e)})},rpl:function(e){return this.each(function(t){var n=t.parentNode;n&&n.replaceChild(E(e)[0],t)})},app:function(e){return this.each(function(t){E(e).each(function(e){return t.appendChild(e)})})},appTo:function(e){return E(e).app(this),this},pre:function(e){return this.each(function(t){E(e).each(function(e){var n=t.firstChild;n?t.insertBefore(e,n):t.appendChild(e)})})},preTo:function(e){return E(e).pre(this),this},cls:function(){return arguments.length?(this.each(function(e){e.className=""}),this.addCls.apply(this,arguments)):this.length?p(this[0].classList):[]},hasCls:function(e){return p(this).every(function(t){return t.classList.contains(e)})},addCls:function(){for(var e=arguments.length,t=Array(e),n=0;nd)return 1}for(var p=0,h=Math.max(u.length,l.length);pm)return 1}return 0};e.exports={naturalCmp:s}},function(e,t){"use strict";var n=function(e){return e.replace(/[\-\[\]{}()*+?.,\\$\^|#\s]/g,"\\$&")},r=function(e,t){return t?"re:"===e.substr(0,3)?e.substr(3):e.trim().split(/\s+/).map(function(e){return e.split("").map(function(e){return n(e)}).join(".*?")}).join("|"):n(e)};e.exports={parsePattern:r}},function(e,t,n){"use strict";var r=n(8),i=r.request,o=e.exports={_update:function(e){return i(e).then(function(e){return Object.assign(o,e)})}}},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.dom,a=t.window.XMLHttpRequest,s=function(e){return new Promise(function(t){var n=new a,r=function(){if(n.readyState===a.DONE)try{t(JSON.parse(n.responseText))}catch(e){t({err:e,txt:n.responseText})}};n.open("POST","?",!0),n.onreadystatechange=r,n.setRequestHeader("Content-Type","application/json;charset=utf-8"),n.send(JSON.stringify(e))})},c=function(e){var t=o('');i(e,function(e,n){o(' ').attr("name",n).attr("value",e).appTo(t)}),t.appTo("body"),t[0].submit(),t.rm()};e.exports={request:s,formRequest:c}}).call(t,function(){return this}())},function(e,t,n){function r(e){return n(i(e))}function i(e){return o[e]||function(){throw new Error("Cannot find module '"+e+"'.")}()}var o={"./index":10,"./index.js":10,"./info":50,"./info.js":50};r.keys=function(){return Object.keys(o)},r.resolve=i,e.exports=r,r.id=9},function(e,t,n){(function(e){"use strict";n(11),n(24),n(25),n(26),n(27),n(29),n(30),n(31),n(32),n(34),n(36),n(37),n(44),n(45),n(46),n(47),n(48),n(49);var t=e.window.document.location.href;n(20).setLocation(t,!0)}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(12),s=n(13),c=n(14),u=n(15),l=n(17),f=n(18),d=Object.assign({modeToggle:!1},c.view),p='
View
',h='',g=' ',m='',v=void 0,b=void 0,w=function(e,t){o("#viewmode-settings .mode").rmCls("active"),o("#viewmode-"+e).addCls("active"),o("#viewmode-size").val(b.indexOf(t)),"next"===d.modeToggle&&(e=v[(v.indexOf(e)+1)%v.length]),o("#viewmode-toggle img").attr("src",s.image("view-"+e))},y=function(){if(!(v.length<2&&b.length<2)){var e=o(p);if(v.length>1&&i(v,function(t){o(h.replace(/\[MODE\]/g,t)).on("click",function(){f.setMode(t)}).appTo(e)}),b.length>1){var t=b.length-1;o(g).attr("max",t).on("input",function(e){return f.setSize(b[e.target.valueAsNumber])}).on("change",function(e){return f.setSize(b[e.target.valueAsNumber])}).appTo(e)}e.appTo(u.$el)}},x=function(){var e=f.getMode(),t=(v.indexOf(e)+1)%v.length,n=v[t];f.setMode(n)},k=function(){d.modeToggle&&v.length>1&&o(m).on("click",x).appTo(l.$toolbar)},_=function(){v=f.getModes(),b=f.getSizes(),y(),k(),w(f.getMode(),f.getSize()),a.sub("view.mode.changed",w)};_()},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.isStr,o=r.isFn,a=r.dom,s={},c=function(e,t){i(e)&&o(t)&&(s[e]||(s[e]=[]),s[e].push(t))},u=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r"+c(e.message+"",!0)+" ";throw e}}var w={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:p,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,nptable:p,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?\\?>\\n*|\\n*|\\n*|?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)|(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,table:p,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,text:/^[^\n]+/};w._label=/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,w._title=/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/,w.def=l(w.def).replace("label",w._label).replace("title",w._title).getRegex(),w.bullet=/(?:[*+-]|\d{1,9}\.)/,w.item=/^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/,w.item=l(w.item,"gm").replace(/bull/g,w.bullet).getRegex(),w.list=l(w.list).replace(/bull/g,w.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+w.def.source+")").getRegex(),w._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",w._comment=//,w.html=l(w.html,"i").replace("comment",w._comment).replace("tag",w._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),w.paragraph=l(w.paragraph).replace("hr",w.hr).replace("heading",w.heading).replace("lheading",w.lheading).replace("tag",w._tag).getRegex(),w.blockquote=l(w.blockquote).replace("paragraph",w.paragraph).getRegex(),w.normal=h({},w),w.gfm=h({},w.normal,{fences:/^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),w.gfm.paragraph=l(w.paragraph).replace("(?!","(?!"+w.gfm.fences.source.replace("\\1","\\2")+"|"+w.list.source.replace("\\1","\\3")+"|").getRegex(),w.tables=h({},w.gfm,{nptable:/^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,table:/^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/}),w.pedantic=h({},w.normal,{html:l("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?\\1> *(?:\\n{2,}|\\s*$)| \\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",w._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/}),n.rules=w,n.lex=function(e,t){var r=new n(t);return r.lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,t){e=e.replace(/^ +$/gm,"");for(var n,r,i,o,a,s,c,u,l,f,d,p,h,v,b,y;e;)if((i=this.rules.newline.exec(e))&&(e=e.substring(i[0].length),i[0].length>1&&this.tokens.push({type:"space"})),i=this.rules.code.exec(e))e=e.substring(i[0].length),i=i[0].replace(/^ {4}/gm,""),this.tokens.push({type:"code",text:this.options.pedantic?i:m(i,"\n")});else if(i=this.rules.fences.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"code",lang:i[2]?i[2].trim():i[2],text:i[3]||""});else if(i=this.rules.heading.exec(e))e=e.substring(i[0].length),this.tokens.push({type:"heading",depth:i[1].length,text:i[2]});else if(t&&(i=this.rules.nptable.exec(e))&&(s={type:"table",header:g(i[1].replace(/^ *| *\| *$/g,"")),align:i[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:i[3]?i[3].replace(/\n$/,"").split("\n"):[]},s.header.length===s.align.length)){for(e=e.substring(i[0].length),d=0;d ?/gm,""),this.token(i,t),this.tokens.push({type:"blockquote_end"});else if(i=this.rules.list.exec(e)){for(e=e.substring(i[0].length),o=i[2],v=o.length>1,c={type:"list_start",ordered:v,start:v?+o:"",loose:!1},this.tokens.push(c),i=i[0].match(this.rules.item),u=[],n=!1,h=i.length,d=0;d1?1===a.length:a.length>1||this.options.smartLists&&a!==o)&&(e=i.slice(d+1).join("\n")+e,d=h-1)),r=n||/\n\n(?!\s*$)/.test(s),d!==h-1&&(n="\n"===s.charAt(s.length-1),r||(r=n)),r&&(c.loose=!0),b=/^\[[ xX]\] /.test(s),y=void 0,b&&(y=" "!==s[1],s=s.replace(/^\[[ xX]\] +/,"")),l={type:"list_item_start",task:b,checked:y,loose:r},u.push(l),this.tokens.push(l),this.token(s,!1),this.tokens.push({type:"list_item_end"});if(c.loose)for(h=u.length,d=0;d?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:p,tag:"^comment|^[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,strong:/^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,em:/^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:p,text:/^(`+|[^`])[\s\S]*?(?=[\\?@\\[^_{|}~",y.em=l(y.em).replace(/punctuation/g,y._punctuation).getRegex(),y._escapes=/\\([!"#$%&'()*+,\-.\/:;<=>?@\[\]\\^_`{|}~])/g,y._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,y._email=/[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,y.autolink=l(y.autolink).replace("scheme",y._scheme).replace("email",y._email).getRegex(),y._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,y.tag=l(y.tag).replace("comment",w._comment).replace("attribute",y._attribute).getRegex(),y._label=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,y._href=/\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/,y._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,y.link=l(y.link).replace("label",y._label).replace("href",y._href).replace("title",y._title).getRegex(),y.reflink=l(y.reflink).replace("label",y._label).getRegex(),y.normal=h({},y),y.pedantic=h({},y.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,link:l(/^!?\[(label)\]\((.*?)\)/).replace("label",y._label).getRegex(),reflink:l(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",y._label).getRegex()}),y.gfm=h({},y.normal,{escape:l(y.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^~+(?=\S)([\s\S]*?\S)~+/,text:l(y.text).replace("]|","~]|").replace("|$","|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&'*+/=?^_`{\\|}~-]+@|$").getRegex()}),y.gfm.url=l(y.gfm.url,"i").replace("email",y.gfm._extended_email).getRegex(),y.breaks=h({},y.gfm,{br:l(y.br).replace("{2,}","*").getRegex(),text:l(y.gfm.text).replace("{2,}","*").getRegex()}),r.rules=y,r.output=function(e,t,n){var i=new r(t,n);return i.output(e)},r.prototype.output=function(e){for(var t,n,i,o,a,s,u="";e;)if(a=this.rules.escape.exec(e))e=e.substring(a[0].length),u+=c(a[1]);else if(a=this.rules.tag.exec(e))!this.inLink&&/^/i.test(a[0])&&(this.inLink=!1),!this.inRawBlock&&/^<(pre|code|kbd|script)(\s|>)/i.test(a[0])?this.inRawBlock=!0:this.inRawBlock&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(a[0])&&(this.inRawBlock=!1),e=e.substring(a[0].length),u+=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(a[0]):c(a[0]):a[0];else if(a=this.rules.link.exec(e)){var l=v(a[2],"()");if(l>-1){var f=a[2].length-l;a[2]=a[2].substring(0,l),a[0]=a[0].substring(0,a[0].length-f)}e=e.substring(a[0].length),this.inLink=!0,i=a[2],this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i),t?(i=t[1],o=t[3]):o=""):o=a[3]?a[3].slice(1,-1):"",i=i.trim().replace(/^<([\s\S]*)>$/,"$1"),u+=this.outputLink(a,{href:r.escapes(i),title:r.escapes(o)}),this.inLink=!1}else if((a=this.rules.reflink.exec(e))||(a=this.rules.nolink.exec(e))){if(e=e.substring(a[0].length),t=(a[2]||a[1]).replace(/\s+/g," "),t=this.links[t.toLowerCase()],!t||!t.href){u+=a[0].charAt(0),e=a[0].substring(1)+e;continue}this.inLink=!0,u+=this.outputLink(a,t),this.inLink=!1}else if(a=this.rules.strong.exec(e))e=e.substring(a[0].length),u+=this.renderer.strong(this.output(a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.em.exec(e))e=e.substring(a[0].length),u+=this.renderer.em(this.output(a[6]||a[5]||a[4]||a[3]||a[2]||a[1]));else if(a=this.rules.code.exec(e))e=e.substring(a[0].length),u+=this.renderer.codespan(c(a[2].trim(),!0));else if(a=this.rules.br.exec(e))e=e.substring(a[0].length),u+=this.renderer.br();else if(a=this.rules.del.exec(e))e=e.substring(a[0].length),u+=this.renderer.del(this.output(a[1]));else if(a=this.rules.autolink.exec(e))e=e.substring(a[0].length),"@"===a[2]?(n=c(this.mangle(a[1])),i="mailto:"+n):(n=c(a[1]),i=n),u+=this.renderer.link(i,null,n);else if(this.inLink||!(a=this.rules.url.exec(e))){if(a=this.rules.text.exec(e))e=e.substring(a[0].length),u+=this.inRawBlock?this.renderer.text(a[0]):this.renderer.text(c(this.smartypants(a[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else{if("@"===a[2])n=c(a[0]),i="mailto:"+n;else{do s=a[0],a[0]=this.rules._backpedal.exec(a[0])[0];while(s!==a[0]);n=c(a[0]),i="www."===a[1]?"http://"+n:n}e=e.substring(a[0].length),u+=this.renderer.link(i,null,n)}return u},r.escapes=function(e){return e?e.replace(r.rules._escapes,"$1"):e},r.prototype.outputLink=function(e,t){var n=t.href,r=t.title?c(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,c(e[1]))},r.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},r.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,i=0;i.5&&(t="x"+t.toString(16)),n+=""+t+";";return n},i.prototype.code=function(e,t,n){var r=(t||"").match(/\S*/)[0];if(this.options.highlight){var i=this.options.highlight(e,r);null!=i&&i!==e&&(n=!0,e=i)}return r?''+(n?e:c(e,!0))+"
\n":""+(n?e:c(e,!0))+"
"},i.prototype.blockquote=function(e){return"\n"+e+" \n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n,r){return this.options.headerIds?"\n":""+e+" \n"},i.prototype.hr=function(){return this.options.xhtml?" \n":" \n"},i.prototype.list=function(e,t,n){var r=t?"ol":"ul",i=t&&1!==n?' start="'+n+'"':"";return"<"+r+i+">\n"+e+""+r+">\n"},i.prototype.listitem=function(e){return""+e+" \n"},i.prototype.checkbox=function(e){return" "},i.prototype.paragraph=function(e){return""+e+"
\n"},i.prototype.table=function(e,t){return t&&(t=""+t+" "),"\n"},i.prototype.tablerow=function(e){return"\n"+e+" \n"},i.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' align="'+t.align+'">':"<"+n+">";return r+e+""+n+">\n"},i.prototype.strong=function(e){return""+e+" "},i.prototype.em=function(e){return""+e+" "},i.prototype.codespan=function(e){return""+e+"
"},i.prototype.br=function(){return this.options.xhtml?" ":" "},i.prototype.del=function(e){return""+e+""},i.prototype.link=function(e,t,n){if(e=f(this.options.sanitize,this.options.baseUrl,e),null===e)return n;var r='"+n+" "},i.prototype.image=function(e,t,n){if(e=f(this.options.sanitize,this.options.baseUrl,e),null===e)return n;var r=' ":">"},i.prototype.text=function(e){return e},o.prototype.strong=o.prototype.em=o.prototype.codespan=o.prototype.del=o.prototype.text=function(e){return e},o.prototype.link=o.prototype.image=function(e,t,n){return""+n},o.prototype.br=function(){return""},a.parse=function(e,t){var n=new a(t);return n.parse(e)},a.prototype.parse=function(e){this.inline=new r(e.links,this.options),this.inlineText=new r(e.links,h({},this.options,{renderer:new o})),this.tokens=e.reverse();for(var t="";this.next();)t+=this.tok();return t},a.prototype.next=function(){return this.token=this.tokens.pop()},a.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},a.prototype.parseText=function(){for(var e=this.token.text;"text"===this.peek().type;)e+="\n"+this.next().text;return this.inline.output(e)},a.prototype.tok=function(){switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,u(this.inlineText.output(this.token.text)),this.slugger);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var e,t,n,r,i="",o="";for(n="",e=0;e?@[\]^`{|}~]/g,"").replace(/\s/g,"-");if(this.seen.hasOwnProperty(t)){var n=t;do this.seen[n]++,t=n+"-"+this.seen[n];while(this.seen.hasOwnProperty(t))}return this.seen[t]=0,t},c.escapeTest=/[&<>"']/,c.escapeReplace=/[&<>"']/g,c.replacements={"&":"&","<":"<",">":">",'"':""","'":"'"},c.escapeTestNoEncode=/[<>"']|&(?!#?\w+;)/,c.escapeReplaceNoEncode=/[<>"']|&(?!#?\w+;)/g;var x={},k=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;p.exec=p,b.options=b.setOptions=function(e){return h(b.defaults,e),b},b.getDefaults=function(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:new i,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tables:!0,xhtml:!1}},b.defaults=b.getDefaults(),b.Parser=a,b.parser=a.parse,b.Renderer=i,b.TextRenderer=o,b.Lexer=n,b.lexer=n.lex,b.InlineLexer=r,b.inlineLexer=r.output,b.Slugger=s,b.parse=b,e.exports=b}(this||("undefined"!=typeof window?window:t))}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=n(8),s=n(12),c=n(20),u=n(13),l=n(14),f=Object.assign({enabled:!1,type:"php-tar",packageName:"package",alwaysVisible:!1},l.download),d='',p=[],h=void 0,g=function(e){p=e.slice(0),p.length?h.show():f.alwaysVisible||h.hide()},m=function(){var e=f.type,t=f.packageName,n="shell-zip"===e?"zip":"tar";t||(t=1===p.length?p[0].label:c.getItem().label);var r={action:"download",as:t+"."+n,type:e,baseHref:c.getAbsHref(),hrefs:""};i(p,function(e,t){r["hrefs["+t+"]"]=e.absHref}),a.formRequest(r)},v=function(){f.enabled&&(h=o(d).hide().appTo("#toolbar").on("click",m),f.alwaysVisible&&h.show(),s.sub("selection",g))};v()},function(e,t,n){"use strict";var r=n(2),i=r.filter,o=r.debounce,a=r.parsePattern,s=r.dom,c=n(12),u=n(20),l=n(13),f=n(14),d=n(18),p=Object.assign({enabled:!1,advanced:!1,debounceTime:100,ignorecase:!0},f.filter),h='',g=!1,m="",v=void 0,b=void 0,w=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(e!==m){if(m=e,!e)return void d.setLocation();v.addCls("pending");var t=new RegExp(e,p.ignorecase?"i":""),n=i(u.getItem().content,function(e){return t.test(e.label)});v.rmCls("pending"),d.setHint("noMatch"),d.setItems(n)}},y=function(){g?(v.addCls("active"),b[0].focus(),w(a(b.val(),p.advanced))):(w(),v.rmCls("active"))},x=function(){g=!g,y()},k=function(){g=!1,b.val(""),y()},_=function(){p.enabled&&(v=s(h).appTo("#toolbar"),b=v.find("input"),v.find("img").on("click",x),b.on("keyup",o(y,p.debounceTime)),c.sub("location.changed",k))};_()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.map,i=n(12),o=n(14),a=e.window,s=Object.assign({enabled:!1,id:"UA-000000-0"},o["google-analytics-ua"]),c=function(){!function(e,t,n,r,i,o,a){e.GoogleAnalyticsObject=i,e[i]=e[i]||function(){(e[i].q=e[i].q||[]).push(arguments)},e[i].l=1*new Date,o=t.createElement(n),a=t.getElementsByTagName(n)[0],o.async=1,o.src=r,a.parentNode.insertBefore(o,a)}(window,document,"script","//www.google-analytics.com/analytics.js","ga")},u=function(){s.enabled&&(c(),a.ga("create",s.id,"auto"),i.sub("location.changed",function(e){var t=a.location;a.ga("send","pageview",{location:t.protocol+"//"+t.host+e.absHref,title:r(e.getCrumb(),function(e){return e.label}).join(" > ")})}))};u()}).call(t,function(){return this}())},function(e,t,n){(function(e){"use strict";var t=n(33),r=n(2),i=r.isNum,o=r.dom,a=n(12),s=n(19),c=n(13),u=n(14),l=n(16),f=Object.assign({enabled:!1,show:!1,qrcode:!0,qrColor:"#999"},u.info),d='',p='',h="ext/info",g=void 0,m=void 0,v=void 0,b=void 0,w=void 0,y=void 0,x=void 0,k=void 0,_=void 0,C=function(){l.get(h)?(o("#view-info").addCls("active"),o("#info").show()):(o("#view-info").rmCls("active"),o("#info").hide())},S=function(n){var r=n.thumbRational||n.icon,o=!!n.thumbRational;if(!n.isCurrentFolder()&&r||(r=c.icon("folder")),g.attr("src",r),o?g.addCls("thumb"):g.rmCls("thumb"),m.text(n.label),i(n.time)?v.text(s.formatDate(n.time)):v.text("."),i(n.size)?(b.text(s.formatSize(n.size)),b.show()):b.hide(),n.isContentFetched){var a=n.getStats();y.text(a.folders),x.text(a.files),w.show()}else w.hide();if(f.qrcode){var u=e.window.location;k.clr().app(t({render:"image",size:200,fill:f.qrFill,back:f.qrBack,text:u.protocol+"//"+u.host+n.absHref,crisp:!0,quiet:1}))}},A=function(e){S(e)},T=function(){S(_)},E=function(e){_=e,S(_)},M=function(){if(f.enabled){var e=o(d).hide().appTo("#mainrow");g=e.find(".icon img"),m=e.find(".label"),v=e.find(".time"),b=e.find(".size"),w=e.find(".content"),y=e.find(".folders"),x=e.find(".files"),k=e.find(".qrcode"),f.qrcode||k.rm(),o(p).appTo("#sidebar").find("#view-info").on("click",function(e){l.put(h,!l.get(h)),C(),a.pub("resize"),e.preventDefault()}),"boolean"!=typeof l.get(h)&&l.put(h,f.show),C(),a.sub("location.changed",E),a.sub("item.mouseenter",A),a.sub("item.mouseleave",T)}};M()}).call(t,function(){return this}())},function(e,t,n){var r,i,o;!function(t,n){e.exports=n()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";var r=n(1),i=r.create_canvas,o=r.canvas_to_img,a=r.dpr,s=n(2),c=n(3),u=n(4);e.exports=function(e){var t=Object.assign({},s,e),n=c(t.text,t.ecLevel,t.minVersion,t.quiet),r=t.ratio||a,l=i(t.size,r),f=l.getContext("2d");return f.scale(r,r),u(n,f,t),"image"===t.render?o(l):l}},function(e,t){"use strict";var n=window,r=n.document,i=n.devicePixelRatio||1,o=function(e){return r.createElement(e)},a=function(e,t){return e.getAttribute(t)},s=function(e,t,n){return e.setAttribute(t,n)},c=function(e,t){var n=o("canvas");return s(n,"width",e*t),s(n,"height",e*t),n.style.width=e+"px",n.style.height=e+"px",n},u=function(e){var t=o("img");return s(t,"crossorigin","anonymous"),s(t,"src",e.toDataURL("image/png")),s(t,"width",a(e,"width")),s(t,"height",a(e,"height")),t.style.width=e.style.width,t.style.height=e.style.height,t};e.exports={create_canvas:c,canvas_to_img:u,dpr:i}},function(e,t){"use strict";e.exports={render:"image",crisp:!0,minVersion:1,ecLevel:"L",size:200,ratio:null,fill:"#333",back:"#fff",text:"no text",rounded:0,quiet:0,mode:"plain",mSize:30,mPosX:50,mPosY:50,label:"no label",fontname:"sans",fontcolor:"#333",image:null}},function(n,a){"use strict";var s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=/code length overflow/i,u=function(){var n=function(){function e(t,n){if("undefined"==typeof t.length)throw new Error(t.length+"/"+n);var r=function(){for(var e=0;e=7&&_(e),null==g&&(g=T(l,f,m)),S(g,t)},w=function(e,t){for(var n=-1;n<=7;n+=1)if(!(e+n<=-1||p<=e+n))for(var r=-1;r<=7;r+=1)t+r<=-1||p<=t+r||(0<=n&&n<=6&&(0==r||6==r)||0<=r&&r<=6&&(0==n||6==n)||2<=n&&n<=4&&2<=r&&r<=4?d[e+n][t+r]=!0:d[e+n][t+r]=!1)},y=function(){for(var e=0,t=0,n=0;n<8;n+=1){b(!0,n);var r=o.getLostPoint(v);(0==n||e>r)&&(e=r,t=n)}return t},x=function(){for(var e=8;e>n&1);d[Math.floor(n/3)][n%3+p-8-3]=r}for(var n=0;n<18;n+=1){var r=!e&&1==(t>>n&1);d[n%3+p-8-3][Math.floor(n/3)]=r}},C=function(e,t){for(var n=f<<3|t,r=o.getBCHTypeInfo(n),i=0;i<15;i+=1){var a=!e&&1==(r>>i&1);i<6?d[i][8]=a:i<8?d[i+1][8]=a:d[p-15+i][8]=a}for(var i=0;i<15;i+=1){var a=!e&&1==(r>>i&1);i<8?d[8][p-i-1]=a:i<9?d[8][15-i-1+1]=a:d[8][15-i-1]=a}d[p-8][8]=!e},S=function(e,t){for(var n=-1,r=p-1,i=7,a=0,s=o.getMaskFunction(t),c=p-1;c>0;c-=2)for(6==c&&(c-=1);;){for(var u=0;u<2;u+=1)if(null==d[r][c-u]){var l=!1;a>>i&1));var f=s(r,c-u);f&&(l=!l),d[r][c-u]=l,i-=1,i==-1&&(a+=1,i=7)}if(r+=n,r<0||p<=r){r-=n,n=-n;break}}},A=function(t,n){for(var r=0,i=0,a=0,s=new Array(n.length),c=new Array(n.length),u=0;u=0?g.getAt(m):0}}for(var v=0,d=0;d8*d)throw new Error("code length overflow. ("+u.getLengthInBits()+">"+8*d+")");for(u.getLengthInBits()+4<=8*d&&u.put(0,4);u.getLengthInBits()%8!=0;)u.putBit(!1);for(;!(u.getLengthInBits()>=8*d)&&(u.put(i,8),!(u.getLengthInBits()>=8*d));)u.put(a,8);return A(u,r)};return v.addData=function(e){var t=u(e);m.push(t),g=null},v.isDark=function(e,t){if(e<0||p<=e||t<0||p<=t)throw new Error(e+","+t);return d[e][t]},v.getModuleCount=function(){return p},v.make=function(){b(!1,y())},v.createTableTag=function(e,t){e=e||2,t="undefined"==typeof t?4*e:t;var n="";n+='',n+="";for(var r=0;r";for(var i=0;i ';n+=""}return n+=" ",n+="
"},v.createImgTag=function(e,t){e=e||2,t="undefined"==typeof t?4*e:t;var n=v.getModuleCount()*e+2*t,r=t,i=n-t;return h(n,n,function(t,n){if(r<=t&&t>>8),t.push(255&a)):t.push(r)}}return t}};var n={MODE_NUMBER:1,MODE_ALPHA_NUM:2,MODE_8BIT_BYTE:4,MODE_KANJI:8},r={L:1,M:0,Q:3,H:2},i={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7},o=function(){var t=[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],r=1335,o=7973,s=21522,c={},u=function(e){for(var t=0;0!=e;)t+=1,e>>>=1;return t};return c.getBCHTypeInfo=function(e){for(var t=e<<10;u(t)-u(r)>=0;)t^=r<=0;)t^=o<5&&(n+=3+o-5)}for(var r=0;r=256;)t-=255;return e[t]},r}(),s=function(){var e=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12,7,37,13],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]],t=function(e,t){var n={};return n.totalCount=e,n.dataCount=t,n},n={},i=function(t,n){switch(n){case r.L:return e[4*(t-1)+0];case r.M:return e[4*(t-1)+1];case r.Q:return e[4*(t-1)+2];case r.H:return e[4*(t-1)+3];default:return}};return n.getRSBlocks=function(e,n){var r=i(e,n);if("undefined"==typeof r)throw new Error("bad rs block @ typeNumber:"+e+"/errorCorrectLevel:"+n);for(var o=r.length/3,a=new Array,s=0;s>>7-t%8&1)},n.put=function(e,t){for(var r=0;r>>t-r-1&1))},n.getLengthInBits=function(){return t},n.putBit=function(n){var r=Math.floor(t/8);e.length<=r&&e.push(0),n&&(e[r]|=128>>>t%8),t+=1},n},u=function(e){var r=n.MODE_8BIT_BYTE,i=t.stringToBytes(e),o={};return o.getMode=function(){return r},o.getLength=function(e){return i.length},o.write=function(e){for(var t=0;t>>8)},t.writeBytes=function(e,n,r){n=n||0,r=r||e.length;for(var i=0;i0&&(t+=","),t+=e[n];return t+="]"},t},f=function(){var e=0,t=0,n=0,r="",i={},o=function(e){r+=String.fromCharCode(a(63&e))},a=function(e){if(e<0);else{if(e<26)return 65+e;if(e<52)return 97+(e-26);if(e<62)return 48+(e-52);if(62==e)return 43;if(63==e)return 47}throw new Error("n:"+e)};return i.writeByte=function(r){for(e=e<<8|255&r,t+=8,n+=1;t>=6;)o(e>>>t-6),t-=6},i.flush=function(){if(t>0&&(o(e<<6-t),e=0,t=0),n%3!=0)for(var i=3-n%3,a=0;a=t.length){if(0==i)return-1;throw new Error("unexpected end of file./"+i)}var e=t.charAt(n);if(n+=1,"="==e)return i=0,-1;e.match(/^\s$/)||(r=r<<6|a(e.charCodeAt(0)),i+=6)}var o=r>>>i-8&255;return i-=8,o};var a=function(e){if(65<=e&&e<=90)return e-65;if(97<=e&&e<=122)return e-97+26;if(48<=e&&e<=57)return e-48+52;if(43==e)return 62;if(47==e)return 63;throw new Error("c:"+e)};return o},p=function(e,t){var n=e,r=t,i=new Array(e*t),o={};o.setPixel=function(e,t,r){i[t*n+e]=r},o.write=function(e){e.writeString("GIF87a"),e.writeShort(n),e.writeShort(r),e.writeByte(128),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(0),e.writeByte(255),e.writeByte(255),e.writeByte(255),e.writeString(","),e.writeShort(0),e.writeShort(0),e.writeShort(n),e.writeShort(r),e.writeByte(0);var t=2,i=s(t);e.writeByte(t);for(var o=0;i.length-o>255;)e.writeByte(255),e.writeBytes(i,o,255),o+=255;e.writeByte(i.length-o),e.writeBytes(i,o,i.length-o),e.writeByte(0),e.writeString(";")};var a=function(e){var t=e,n=0,r=0,i={};return i.write=function(e,i){if(e>>>i!=0)throw new Error("length over");for(;n+i>=8;)t.writeByte(255&(e<>>=8-n,r=0,n=0;r|=e<0&&t.writeByte(r)},i},s=function(e){for(var t=1< "};return t}();return function(n){i=[],r=n,o="function"==typeof r?r.apply(t,i):r,!(void 0!==o&&(e.exports=o))}(function(){return n}),!function(e){e.stringToBytes=function(e){function t(e){for(var t=[],n=0;n>6,128|63&r):r<55296||r>=57344?t.push(224|r>>12,128|r>>6&63,128|63&r):(n++,r=65536+((1023&r)<<10|1023&e.charCodeAt(n)),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|63&r))}return t}return t(e)}}(n),n}(),l=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;n=Math.max(1,n);for(var r=n;r<=40;r+=1)try{var i=function(){var n=u(r,t);n.addData(e),n.make();var i=n.getModuleCount(),o=function(e,t){return e>=0&&e=0&&t0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"L",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=l(e,t,n);if(i){var o=i.isDark;i.moduleCount+=2*r,i.isDark=function(e,t){return o(e-r,t-r)}}return i};n.exports=f},function(e,t,n){"use strict";var r=n(5),i=n(6),o=function(e,t){e.fillStyle=t.back,e.fillRect(0,0,t.size,t.size)},a=function(e,t,n,r,i,o){e.isDark(i,o)&&t.rect(o*r,i*r,r,r)},s=function(e,t,n){if(e){var i=n.rounded>0&&n.rounded<=100?r:a,o=e.moduleCount,s=n.size/o,c=0;n.crisp&&(s=Math.floor(s),c=Math.floor((n.size-s*o)/2)),t.translate(c,c),t.beginPath();for(var u=0;u\n Language \n \n \n
\n ',m=" ",v="ext/l10n",b={en:Object.assign({},h)},w=b.en,y=function(e){e&&(w=e);var t="selected";o("#langs option").rmAttr(t).rmProp(t),o("#langs ."+w.isoCode).attr(t,"").prop(t,!0),r(w,function(e,t){o(".l10n-"+t).text(e),o(".l10n_ph-"+t).attr("placeholder",e)}),c.setDefaultDateFormat(w.dateFormat),o("#items .item").each(function(e){o(e).find(".date").text(c.formatDate(e._item.time))})},x=function(e){return b[e]?Promise.resolve(b[e]):a.request({action:"get",l10n:[e]}).then(function(t){return b[e]=Object.assign({},h,t.l10n&&t.l10n[e],{isoCode:e}),b[e]})},k=function(e,t,n){var r=f.get(v);if(e[r])t=r;else if(n){var i=d.navigator.language||d.navigator.browserLanguage;i&&(e[i]?t=i:i.length>2&&e[i.substr(0,2)]&&(t=i.substr(0,2)))}e[t]||(t="en"),x(t).then(y)},_=function(e){var t=o(g),n=t.find("select").on("change",function(t){var n=t.target.value;f.put(v,n),k(e,n,!1)});r(e,function(e,t){o(m).attr("value",t).addCls(t).text(t+" - "+(i(e)?e:e.lang)).appTo(n)}),t.appTo("#sidebar")},C=function(){p.enabled&&_(u),s.sub("view.changed",function(){k(u,p.lang,p.useBrowserLang)})};C()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(7),i=r.langs;e.exports=Object.assign({},i)},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.dom,i=t.awaitLoad,o=n(12),a=n(14),s=e.window,c=Object.assign({enabled:!1,baseURL:"not-set",idSite:0},a["piwik-analytics"]),u=function(){if(c.enabled){var e=("https:"===s.location.protocol?"https://":"http://")+c.baseURL+"/",t=[],n=null;r("").attr("src",e+"piwik.js").appTo("body"),i().then(function(){if(n=s.Piwik&&s.Piwik.getTracker(e+"piwik.php",c.idSite))for(n.enableLinkTracking();t.length;)n.trackPageView(t.shift())}),o.sub("location.changed",function(e){var r=e.getCrumb().map(function(e){return e.label}).join(" > ");n?n.trackPageView(r):t.push(r)})}};u()}).call(t,function(){return this}())},function(e,t,n){"use strict";n(38),n(39),n(40),n(41),n(43)},function(e,t,n){(function(t){"use strict";var r=n(2),i=r.each,o=r.isFn,a=r.dom,s=r.includes,c=r.compact,u=n(12),l=n(13),f=n(14),d=n(16),p=t.window,h=Object.assign({enabled:!0},f.preview),g='',m="ext/preview",v=d.get(m)||!1,b=null,w=!1,y=null,x=null,k=function(){var e=a("#pv-container"),t=e[0],n=e.children()[0];if(t&&n){var r=t.offsetWidth,i=t.offsetHeight,o=n.offsetWidth,s=n.offsetHeight;a(n).css({left:.5*(r-o)+"px",top:.5*(i-s)+"px"})}},_=function(){var e=p.document.documentElement,t=e.clientWidth,n=e.clientHeight,r=v?0:20,i=v?0:48;a("#pv-container").css({width:t-2*r+"px",height:n-2*r-i+"px",left:r+"px",top:r+"px"}),a("#pv-spinner").css({left:.5*t+"px",top:.5*n+"px"}),v?(a("#pv-overlay").addCls("fullscreen"),a("#pv-bar-fullscreen").find("img").attr("src",l.image("preview-no-fullscreen"))):(a("#pv-overlay").rmCls("fullscreen"),a("#pv-bar-fullscreen").find("img").attr("src",l.image("preview-fullscreen"))),k(),o(x&&x.adjust)&&x.adjust()},C=function(e,t){a("#pv-bar-idx").text(e+"/"+t).show()},S=function(e){a("#pv-bar-raw").show().find("a").attr("href",e)},A=function(e){a("#pv-buttons .bar-left").rm(),i(e,function(e){a(" ").addCls("bar-left").addCls("bar-label").text(e).appTo("#pv-buttons")})},T=function(){var e=a("#pv-overlay .hof");p.clearTimeout(b),e.show(),v&&(b=p.setTimeout(function(){return e.hide()},2e3))},E=function(){return x&&x.moveIdx(1)},M=function(){return x&&x.moveIdx(-1)},D=function(){v=!v,d.put(m,v),T(),_()},P=function(e){e.stopPropagation(),e.preventDefault()},z=function(e){var t=e.keyCode;27===t?(P(e),$()):8===t||37===t?(P(e),M()):13===t||32===t||39===t?(P(e),E()):70===t&&(P(e),D())},L=function(){A([]),a("#pv-container").clr(),a("#pv-overlay").show(),a(p).on("keydown",z),_()},$=function(){A([]),a("#pv-container").clr(),a("#pv-overlay").hide(),a(p).off("keydown",z)},H=function e(t,n,r){p.clearTimeout(y);var i=a("#pv-spinner");if(!t)return w=!1,void i.hide();if(!w&&r)return void(y=p.setTimeout(function(){return e(!0,n)},r));var o=i.find(".back");n?o.attr("src",n).show():o.hide(),w=!0,i.show()},O=function e(t,n,r,i){var o=Object.assign(Object.create(e.prototype),{items:t,load:r,adjust:i});return o.setIdx(n),o};O.prototype={setIdx:function(e){var t=this;this.idx=(e+this.items.length)%this.items.length,this.item=this.items[this.idx],C(this.idx+1,this.items.length),S(this.item.absHref),A([this.item.label]);var n=this.item;Promise.resolve().then(function(){i(a("#pv-container *"),function(e){"function"==typeof e.unload&&e.unload()}),a("#pv-container").hide().clr(),H(!0,n.thumbSquare||n.icon,200)}).then(function(){return t.load(n)}).then(function(e){n===t.item&&(a("#pv-container").clr().app(e).show(),H(!1),_())})},moveIdx:function(e){this.setIdx(this.idx+e)}};var B=function(e,t,n){var r=function(r){r.$view&&s(e,r.type)&&r.$view.find("a").on("click",function(i){i.preventDefault();var o=c(a("#items .item").map(function(t){var n=t._item;return s(e,n.type)?n:null}));x=O(o,o.indexOf(r),t,n),L()})};u.sub("view.changed",function(e){return i(e,r)})},R=function(){h.enabled&&(a(g).hide().appTo("body").on("keydown",z).on("mousemove",T).on("mousedown",T).on("click",function(e){"pv-overlay"!==e.target.id&&"pv-container"!==e.target.id||$()}).on("mousedown",P).on("mousemove",P).on("keydown",P).on("keypress",P),a("#pv-spinner").hide(),a("#pv-bar-prev, #pv-prev-area").on("click",M),a("#pv-bar-next, #pv-next-area").on("click",E),a("#pv-bar-close").on("click",$),a("#pv-bar-fullscreen").on("click",D),a(p).on("resize",_).on("load",_))};e.exports={setLabels:A,register:B,get item(){return x&&x.item}},R()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(19),a=n(14),s=n(38),c=Object.assign({enabled:!1,autoplay:!0,types:[]},a["preview-aud"]),u=' ',l=function(){var e=i("#pv-content-aud")[0];e&&s.setLabels([s.item.label,o.formatDate(1e3*e.duration,"m:ss")])},f=function(e){e.unload=function(){e.src="",e.load()}},d=function(e){return new Promise(function(t){var n=i(u).on("loadedmetadata",function(){return t(n)}).attr("controls","controls");c.autoplay&&n.attr("autoplay","autoplay"),f(n[0]),n.attr("src",e.absHref)})},p=function(){c.enabled&&s.register(c.types,d,l)};p()},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(8),a=n(14),s=n(38),c=Object.assign({enabled:!1,size:null,types:[]},a["preview-img"]),u=' ',l=function(){var e=i("#pv-content-img")[0];if(e){var t=e.offsetWidth,n=[s.item.label];if(!c.size){var r=e.naturalWidth,o=e.naturalHeight;n.push(String(r)+"x"+String(o)),n.push(String((100*t/r).toFixed(0))+"%")}s.setLabels(n)}},f=function(e){return o.request({action:"get",thumbs:[{type:"img",href:e,width:c.size,height:0}]}).then(function(e){return e&&e.thumbs&&e.thumbs[0]?e.thumbs[0]:null})},d=function(e){return Promise.resolve(e.absHref).then(function(e){return c.size?f(e):e}).then(function(e){return new Promise(function(t){var n=i(u).on("load",function(){return t(n)}).attr("src",e)})})},p=function(){c.enabled&&s.register(c.types,d,l)};p()},function(e,t,n){(function(e){"use strict";var t=n(42),r=n(28),i=n(2),o=i.keys,a=i.dom,s=n(14),c=n(38),u=e.window,l=u.XMLHttpRequest,f=Object.assign({enabled:!1,styles:{}},s["preview-txt"]),d=' ',p='
',h=function(){var e=a("#pv-content-txt")[0];if(e){var t=a("#pv-container")[0];e.style.height=t.offsetHeight+"px",c.setLabels([c.item.label,c.item.size+" bytes"])}},g=function(e){return new Promise(function(t,n){var r=new l,i=function(){if(r.readyState===l.DONE)try{t(r.responseText||"")}catch(e){n(String(e))}};r.open("GET",e,!0),r.onreadystatechange=i,r.send()})},m=function(e){return g(e.absHref).catch(function(e){return"[request failed] "+e}).then(function(n){var i=f.styles[e.type];if(1===i)return a(d).text(n);if(2===i)return a(p).html(r(n));if(3===i){var o=a("
").text(n);return u.setTimeout(function(){t.el(o[0])},n.length<2e4?0:500),a(d).app(o)}return a(p).text(n)})},v=function(){f.enabled&&c.register(o(f.styles),m,h)};v()}).call(t,function(){return this}())},function(e,t,n){!function(t,n){e.exports=n()}(this,function(){var e=".lolight",t="ll-",n="_nam#2196f3}_num#ec407a}_str#43a047}_rex#ef6c00}_pct#666}_key#555;font-weight:bold}_com#aaa;font-style:italic}".replace(/_/g,"."+t).replace(/#/g,"{color:#"),r=/^(a(bstract|lias|nd|rguments|rray|s(m|sert)?|uto)|b(ase|egin|ool(ean)?|reak|yte)|c(ase|atch|har|hecked|lass|lone|ompl|onst|ontinue)|de(bugger|cimal|clare|f(ault|er)?|init|l(egate|ete)?)|do|double|e(cho|ls?if|lse(if)?|nd|nsure|num|vent|x(cept|ec|p(licit|ort)|te(nds|nsion|rn)))|f(allthrough|alse|inal(ly)?|ixed|loat|or(each)?|riend|rom|unc(tion)?)|global|goto|guard|i(f|mp(lements|licit|ort)|n(it|clude(_once)?|line|out|stanceof|t(erface|ernal)?)?|s)|l(ambda|et|ock|ong)|m(odule|utable)|NaN|n(amespace|ative|ext|ew|il|ot|ull)|o(bject|perator|r|ut|verride)|p(ackage|arams|rivate|rotected|rotocol|ublic)|r(aise|e(adonly|do|f|gister|peat|quire(_once)?|scue|strict|try|turn))|s(byte|ealed|elf|hort|igned|izeof|tatic|tring|truct|ubscript|uper|ynchronized|witch)|t(emplate|hen|his|hrows?|ransient|rue|ry|ype(alias|def|id|name|of))|u(n(checked|def(ined)?|ion|less|signed|til)|se|sing)|v(ar|irtual|oid|olatile)|w(char_t|hen|here|hile|ith)|xor|yield)$/,i="com",o="key",a="nam",s="num",c="pct",u="rex",l="spc",f="str",d="unk",p=[[s,/#([0-9a-f]{6}|[0-9a-f]{3})\b/],[i,/(\/\/|#).*?(?=\n|$)/],[i,/\/\*[\s\S]*?\*\//],[i,//],[u,/\/(\\\/|[^\n])*?\//],[f,/(['"`])(\\\1|[\s\S])*?\1/],[s,/[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?/],[c,/[\\.,:;+\-*\/=<>()[\]{}|?!&@~]/],[l,/\s+/],[a,/[\w$]+/],[d,/./]],h=function(e){if("string"!=typeof e)throw new Error("tok: no string");for(var t=[],n=p.length,i=!1;e;)for(var c=0;c=0&&(i=!1):i=d===s||d===a,e=e.slice(h.length),t.push([d,h]);break}}}return t},g=function(e,t){if("undefined"!=typeof document)t(document);else if(e)throw new Error("no doc")},m=function(e){g(!0,function(n){var r=h(e.textContent);e.innerHTML="",r.forEach(function(r){var i=n.createElement("span");i.className=t+r[0],i.textContent=r[1],e.appendChild(i)})})},v=function(t){g(!0,function(n){[].forEach.call(n.querySelectorAll(t||e),function(e){m(e)})})};return g(!1,function(e){var t=e.querySelector("head"),r=e.createElement("style");r.textContent=n,t.insertBefore(r,t.firstChild),/^(i|c|loade)/.test(e.readyState)?v():e.addEventListener("DOMContentLoaded",function(){v()})}),v.tok=h,v.el=m,v})},function(e,t,n){"use strict";var r=n(2),i=r.dom,o=n(14),a=n(38),s=Object.assign({enabled:!1,autoplay:!0,types:[]},o["preview-vid"]),c=' ',u=function(){var e=i("#pv-content-vid")[0];if(e){var t=e.offsetWidth,n=e.videoWidth,r=e.videoHeight;a.setLabels([a.item.label,String(n)+"x"+String(r),String((100*t/n).toFixed(0))+"%"])}},l=function(e){e.unload=function(){e.src="",e.load()}},f=function(e){return new Promise(function(t){var n=i(c).on("loadedmetadata",function(){return t(n)}).attr("controls","controls");s.autoplay&&n.attr("autoplay","autoplay"),l(n[0]),n.attr("src",e.absHref)})},d=function(){s.enabled&&a.register(s.types,f,u)};d()},function(e,t,n){"use strict";var r=n(2),i=r.map,o=r.debounce,a=r.parsePattern,s=r.dom,c=n(8),u=n(12),l=n(20),f=n(13),d=n(14),p=n(22),h=n(18),g=Object.assign({enabled:!1,advanced:!1,debounceTime:300,ignorecase:!0},d.search),m='',v=!1,b="",w=void 0,y=void 0,x=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";if(e!==b){if(b=e,!e)return void h.setLocation();w.addCls("pending"),c.request({action:"get",search:{href:l.getAbsHref(),pattern:e,ignorecase:g.ignorecase}}).then(function(e){w.rmCls("pending"),h.setHint("noMatch"),h.setItems(i(e.search,function(e){return p.get(e)}))})}},k=function(){v?(w.addCls("active"),y[0].focus(),x(a(y.val(),g.advanced))):(x(),w.rmCls("active"))},_=function(){v=!v,k()},C=function(){v=!1,y.val(""),k()},S=function(){g.enabled&&(w=s(m).appTo("#toolbar"),y=w.find("input"),w.find("img").on("click",_),y.on("keyup",o(k,g.debounceTime)),u.sub("location.changed",C))};S()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.each,i=t.dom,o=n(12),a=n(13),s=n(14),c=e.window.document,u=Object.assign({enabled:!1,clickndrag:!1,checkboxes:!1},s.select),l='\n \n ',f=i(c),d=i("html"),p=i('
'),h=Math.max,g=Math.min,m=Math.abs,v=0,b=0,w=function(){var e=i("#items .item.selected").map(function(e){return e._item});o.pub("selection",e)},y=function(e){var t=i(e);if(!t.length||t.isHidden())return null;var n=t[0].getBoundingClientRect();return{l:n.left,t:n.top,r:n.right,b:n.bottom}},x=function(e,t){return!!e&&!!t&&e.l===t.l&&e.t===t.t&&e.r===t.r&&e.b===t.b},k=function(e){var t=e[0];x(y(t),t&&t._rect)||e.each(function(e){e._rect=y(e)})},_=function(e,t){if(!e||!t)return!1;var n=h(e.l,t.l),r=g(e.r,t.r),i=h(e.t,t.t),o=g(e.b,t.b);return n<=r&&i<=o},C=function(e){var t=i("#content")[0],n=y(t),r=e.pageX-n.l+t.scrollLeft,o=e.pageY-n.t+t.scrollTop;return{x:r,y:o}},S=function(e){var t=C(e),n=t.x,r=t.y,o=g(v,n),a=g(b,r),s=m(v-n),c=m(b-r),u=e.ctrlKey||e.metaKey;if(!(!u&&s<4&&c<4)){u||i("#items .item").rmCls("selected"),d.addCls("drag-select"),p.show().css({left:o+"px",top:a+"px",width:s+"px",height:c+"px"});var l=y(p),f=i("#items .item:not(.folder-parent)");k(f),f.rmCls("selecting").each(function(e){_(l,e._rect)&&i(e).addCls("selecting")})}},A=function e(t){f.off("mousemove",S).off("mouseup",e),S(t),i("#items .item.selecting.selected").rmCls("selecting").rmCls("selected"),i("#items .item.selecting").rmCls("selecting").addCls("selected"),w(),d.rmCls("drag-select"),p.hide(),t.stopPropagation(),t.preventDefault()},T=function(e){if(!(0!==e.button||e.offsetX>=i("#content")[0].offsetWidth-16)){var t=C(e),n=t.x,r=t.y;v=n,b=r,f.on("mousemove",S).on("mouseup",A),S(e),e.preventDefault()}},E=function(e){for(;!e._item&&e.parentNode;)e=e.parentNode;return e._item},M=function(e){E(e.target).$view.tglCls("selected"),w(),e.stopPropagation(),e.preventDefault()},D=function(e){e.$view&&!e.isCurrentParentFolder()&&i(l).on("click",M).appTo(e.$view.find("a"))},P=function(e,t){u.checkboxes&&r(e,D),r(t,function(e){e.$view&&e.$view.rmCls("selected")}),w()},z=function(){u.enabled&&(u.clickndrag||u.checkboxes)&&(o.sub("view.changed",P),u.clickndrag&&(p.hide().appTo("#content"),i("#content").on("mousedown",T).on("drag",function(e){return e.preventDefault()}).on("dragstart",function(e){return e.preventDefault()})))};z()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.toArray,a=r.dom,s=r.cmp,c=r.naturalCmp,u=n(12),l=n(13),f=n(14),d=n(16),p=Object.assign({enabled:!1,column:0,reverse:!1,ignorecase:!0,natural:!1,folders:0},f.sort),h="ext/sort",g=' ',m=function(e){
+return e.isFolder()?p.folders:1},v={0:"label",1:"time",2:"size"},b={0:"label",1:"date",2:"size"},w=function(e,t,n,r){return function(i,o){var a=i._item,u=o._item,l=m(a)-m(u);if(0!==l)return l;var f=a[e],d=u[e];return(isNaN(f)||isNaN(d))&&(f=String(f),d=String(d),n&&(f=f.toLowerCase(),d=d.toLowerCase())),l=r?c(f,d):s(f,d),t?-l:l}},y=function(e,t){var n=a("#items li.header a"),r=a("#items li.header a."+b[e]),i=w(v[e],t,p.ignorecase,p.natural);d.put(h,{column:e,reverse:t}),n.rmCls("ascending").rmCls("descending"),r.addCls(t?"descending":"ascending"),a(o(a("#items .item:not(.folder-parent)")).sort(i)).appTo("#items")},x=function(){var e=d.get(h),t=e&&e.column||p.column,n=e&&e.reverse||p.reverse;y(t,n)},k=function(){var e=a("#items li.header");i(b,function(t,n){var r="0"===n?"app":"pre";e.find("a."+t)[r](g).on("click",function(e){y(n,a(e.currentTarget).hasCls("ascending")),e.preventDefault()})})},_=function(){p.enabled&&(k(),u.sub("view.changed",x))};_()},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.map,a=r.includes,s=n(8),c=n(12),u=n(14),l=Object.assign({enabled:!1,img:["img-bmp","img-gif","img-ico","img-jpg","img-png"],mov:["vid-avi","vid-flv","vid-mkv","vid-mov","vid-mp4","vid-mpg","vid-webm"],doc:["x-pdf","x-ps"],delay:1,size:100,exif:!1,chunksize:20},u.thumbnails),f=4/3,d=function(e,t){var n=null;if(a(l.img,t.type))n="img";else if(a(l.mov,t.type))n="mov";else{if(!a(l.doc,t.type))return;n="doc"}t.thumbSquare?t.$view.find(".icon.square img").addCls("thumb").attr("src",t.thumbSquare):e.push({type:n,href:t.absHref,ratio:1,callback:function(e){e&&t.$view&&(t.thumbSquare=e,t.$view.find(".icon.square img").addCls("thumb").attr("src",e))}}),t.thumbRational?t.$view.find(".icon.landscape img").addCls("thumb").attr("src",t.thumbRational):e.push({type:n,href:t.absHref,ratio:f,callback:function(e){e&&t.$view&&(t.thumbRational=e,t.$view.find(".icon.landscape img").addCls("thumb").attr("src",e))}})},p=function(e){var t=o(e,function(e){return{type:e.type,href:e.href,width:Math.round(l.size*e.ratio),height:l.size}});return s.request({action:"get",thumbs:t}).then(function(t){i(e,function(e,n){e.callback(t&&t.thumbs?t.thumbs[n]:null)})})},h=function(e){for(var t=e.length,n=l.chunksize,r=Promise.resolve(),i=function(t){r=r.then(function(){return p(e.slice(t,t+n))})},o=0;o ");t.length>1&&(n=t[t.length-1]+" - "+n),i.title=n},s=function(){o.enabled&&t.sub("location.changed",a)};s()}).call(t,function(){return this}())},function(e,t,n){"use strict";var r=n(2),i=r.each,o=r.dom,a=r.cmp,s=r.naturalCmp,c=n(12),u=n(20),l=n(13),f=n(14),d=n(16),p=Object.assign({enabled:!1,show:!0,maxSubfolders:50,naturalSort:!1,ignorecase:!0},f.tree),h='\n
\n \n \n
\n \n \n \n ',g='
',m="ext/tree",v=function(e){for(;!e._item&&e.parentNode;)e=e.parentNode;return e._item},b=function(e){var t=v(e.target);"unknown"===t._treeState?t.fetchContent().then(function(){t._treeState="open",y(t)}):"open"===t._treeState?(t._treeState="closed",t._$tree.rmCls("open").addCls("closed")):"closed"===t._treeState&&(t._treeState="open",t._$tree.rmCls("closed").addCls("open"))},w=function(e,t){var n=e.label,r=t.label;return p.ignorecase&&(n=n.toLowerCase(),r=r.toLowerCase()),p.naturalSort?s(n,r):a(n,r)},y=function e(t){var n=t.getSubfolders(),r=n.length,a=p.maxSubfolders,s=o(h);if(s.find(".indicator").on("click",b),s.find(".label").text(t.label),u.setLink(s.find("a"),t),t.isCurrentFolder()&&s.addCls("active"),t.isManaged||s.find(".icon img").attr("src",l.icon("folder-page")),t._treeState=t._treeState||"none",t.isManaged&&!t.isContentFetched?t._treeState="unknown":r||(t._treeState="none"),s.addCls(t._treeState),r){var c=o('
').appTo(s);n.sort(w),i(n.slice(0,a),function(t){return c.app(e(t))}),r>a&&c.app('
… '+(r-a)+" more subfolders
")}return t._$tree&&t._$tree.rpl(s),t._$tree=s,s[0]._item=t,s},x=function e(t){return t._treeState="open",t.fetchContent().then(function(){return t.parent?e(t.parent):t})},k=function(){d.get(m)?(o("#view-tree").addCls("active"),o("#tree").show()):(o("#view-tree").rmCls("active"),o("#tree").hide())},_=function(e){x(e).then(function(e){o("#tree").clr().app(y(e)),k()})},C=function(){p.enabled&&(o('
').hide().appTo("#mainrow"),o(g).appTo("#sidebar").find("#view-tree").on("click",function(e){d.put(m,!d.get(m)),k(),c.pub("resize"),e.preventDefault()}),"boolean"!=typeof d.get(m)&&d.put(m,p.show),k(),c.sub("location.changed",_))};C()},function(e,t,n){(function(e){"use strict";var t=n(2),r=t.dom,i=n(7),o=n(8),a=n(13),s='
',c='
\n \n \n
\n ',u='
\n
\n
login \n
logout \n
\n The preset password is the empty string, just click login.\n Change it in \'_h5ai/private/conf/options.json\'.\n
\n
',l='
\n Show your support with a donation!\n
\n \n
\n
',f=i.setup,d=function(e,t,n,i){var o=r(c).appTo("#tests");o.find(".label").text(e),o.find(".result").addCls(n?"passed":"failed").text(i?i:n?"yes":"no"),o.find(".info").html(t)},p=function(){f.AS_ADMIN&&(r(s).appTo("#content"),d("h5ai version","Only green if this is an official h5ai release",/^\d+\.\d+\.\d+$/.test(f.VERSION),f.VERSION),d("Index file found","Add
"+f.INDEX_HREF+"
to your index file list",f.INDEX_HREF),d("Options parsable","File
options.json
is readable and syntax is correct",null!==i.options),d("Types parsable","File
types.json
is readable and syntax is correct",null!==i.types),d("Server software","Server is one of apache, lighttpd, nginx or cherokee",f.HAS_SERVER,f.SERVER_NAME+" "+f.SERVER_VERSION),d("PHP version","PHP version >= "+f.MIN_PHP_VERSION,!0,f.PHP_VERSION),d("PHP arch","64-bit required to correctly display file/folder sizes > ~2GB","64-bit"===f.PHP_ARCH,f.PHP_ARCH),d("Public Cache directory","Web server has write access",f.HAS_WRITABLE_CACHE_PUB),d("Private Cache directory","Web server has write access",f.HAS_WRITABLE_CACHE_PRV),d("Image thumbs","PHP GD extension with JPEG support available",f.HAS_PHP_JPEG),d("Use EXIF thumbs","PHP EXIF extension available",f.HAS_PHP_EXIF),d("Movie thumbs","Command line program
avconv
or
ffmpeg
available",f.HAS_CMD_AVCONV||f.HAS_CMD_FFMPEG),d("PDF thumbs","Command line program
convert
or
gm
available",f.HAS_CMD_CONVERT||f.HAS_CMD_GM),d("Shell tar","Command line program
tar
available",f.HAS_CMD_TAR),d("Shell zip","Command line program
zip
available",f.HAS_CMD_ZIP),d("Shell du","Command line program
du
available",f.HAS_CMD_DU))},h=function(){e.window.location.reload()},g=function(){o.request({action:"login",pass:r("#pass").val()}).then(h)},m=function(){o.request({action:"logout"}).then(h)},v=function(e){13===e.which&&g()},b=function(){r(l).appTo("#content")},w=function(){r(u).appTo("#content"),f.AS_ADMIN?(r("#pass").rm(),r("#login").rm(),r("#logout").on("click",m)):(r("#pass").on("keydown",v)[0].focus(),r("#login").on("click",g),r("#logout").rm()),i.options.hasCustomPasshash&&r("#hint").rm()},y=function(){b(),w(),p()};y()}).call(t,function(){return this}())}]);
\ No newline at end of file