commit a1e49121cc22c4a3954fc6b3836e29012e5f72ad Author: paulmataruso Date: Sat Oct 26 20:34:27 2024 +0000 First Upload diff --git a/README.md b/README.md new file mode 100644 index 0000000..984897a --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +Docker-Compose stack with nginx, php-fpm and h5ai file server. This stack will expose the +entiree /var/nginx folder, the html webroot folder, and the /var/log/nginx folder to the host. +nginx is linked to php-fpm, and php-fpm container exposed on "php-fpm:9000" (EG "fpm container name:fpm port") + +Copy .env.example to .env and define + +HTTP_PORT=8888 +HTTPS_PORT=8889 + +Use whatever ports you need to. + +You will need to chmod -R 777 ./docker-persist to avoid some file access issuies. + +Edit the /docker-persist/nginx/conf.d/h5ai.conf file to reflect the correct hostname you want, if you need to. + diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..3d10bc7 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,21 @@ +version: '3' + +services: + nginx: + image: nginx:latest + ports: + - ${HTTP_PORT}:80 + - ${HTTPS_PORT}:443 + volumes: + - ./docker-persist/html:/usr/share/nginx/html #Expose HTML webroot to host + - ./docker-persist/nginx:/etc/nginx #Expose nging conf folder to host + - ./docker-persist/log:/var/log/nginx #Expose nginx log folder to host + restart: always + links: + - php-fpm + php-fpm: + image: php:8-fpm + volumes: + - ./docker-persist/html:/usr/share/nginx/html #Expose HTML webroot to php-fpm + restart: always + diff --git a/docker-persist/html/TESTfile.txt b/docker-persist/html/TESTfile.txt new file mode 100755 index 0000000..93e9139 --- /dev/null +++ b/docker-persist/html/TESTfile.txt @@ -0,0 +1,2 @@ +this is a test file to show everything is working +--- diff --git a/docker-persist/html/_h5ai/.htaccess b/docker-persist/html/_h5ai/.htaccess new file mode 100755 index 0000000..95e775b --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/cache/README.md b/docker-persist/html/_h5ai/private/cache/README.md new file mode 100755 index 0000000..60bc416 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/cache/cmds.json b/docker-persist/html/_h5ai/private/cache/cmds.json new file mode 100644 index 0000000..4263d9e --- /dev/null +++ b/docker-persist/html/_h5ai/private/cache/cmds.json @@ -0,0 +1 @@ +{"command":true,"which":true,"where":false,"avconv":false,"convert":false,"du":true,"ffmpeg":false,"gm":false,"tar":true,"zip":false} \ No newline at end of file diff --git a/docker-persist/html/_h5ai/private/conf/l10n/af.json b/docker-persist/html/_h5ai/private/conf/l10n/af.json new file mode 100755 index 0000000..5150c7b --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/bg.json b/docker-persist/html/_h5ai/private/conf/l10n/bg.json new file mode 100755 index 0000000..6808e62 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/cs.json b/docker-persist/html/_h5ai/private/conf/l10n/cs.json new file mode 100755 index 0000000..1e34e61 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/da.json b/docker-persist/html/_h5ai/private/conf/l10n/da.json new file mode 100755 index 0000000..3b8fa06 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/de.json b/docker-persist/html/_h5ai/private/conf/l10n/de.json new file mode 100755 index 0000000..6d8c613 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/el.json b/docker-persist/html/_h5ai/private/conf/l10n/el.json new file mode 100755 index 0000000..2d9c00d --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/en.json b/docker-persist/html/_h5ai/private/conf/l10n/en.json new file mode 100755 index 0000000..05e9b4e --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/es.json b/docker-persist/html/_h5ai/private/conf/l10n/es.json new file mode 100755 index 0000000..e42a5b9 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/et.json b/docker-persist/html/_h5ai/private/conf/l10n/et.json new file mode 100755 index 0000000..8f3d1dc --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/fi.json b/docker-persist/html/_h5ai/private/conf/l10n/fi.json new file mode 100755 index 0000000..c19c0ed --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/fr.json b/docker-persist/html/_h5ai/private/conf/l10n/fr.json new file mode 100755 index 0000000..9a4ac45 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/he.json b/docker-persist/html/_h5ai/private/conf/l10n/he.json new file mode 100755 index 0000000..bb37f7f --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/hi.json b/docker-persist/html/_h5ai/private/conf/l10n/hi.json new file mode 100755 index 0000000..5941733 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/hr.json b/docker-persist/html/_h5ai/private/conf/l10n/hr.json new file mode 100755 index 0000000..c044db4 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/hu.json b/docker-persist/html/_h5ai/private/conf/l10n/hu.json new file mode 100755 index 0000000..b2c1b34 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/id.json b/docker-persist/html/_h5ai/private/conf/l10n/id.json new file mode 100755 index 0000000..1987f59 --- /dev/null +++ b/docker-persist/html/_h5ai/private/conf/l10n/id.json @@ -0,0 +1,22 @@ +{ + "lang": "Bahasa Indonesia", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "rincian", + "download": "unduh", + "empty": "kosong", + "files": "berkas", + "filter": "saring", + "folders": "pelipat", + "grid": "jaring", + "icons": "ikon", + "language": "Bahasa", + "lastModified": "Di modifikasi", + "name": "Nama", + "noMatch": "tidak cocok", + "parentDirectory": "Direktori induk", + "search": "cari", + "size": "Ukuran", + "tree": "Pohon", + "view": "Tampil" +} diff --git a/docker-persist/html/_h5ai/private/conf/l10n/it.json b/docker-persist/html/_h5ai/private/conf/l10n/it.json new file mode 100755 index 0000000..4547c62 --- /dev/null +++ b/docker-persist/html/_h5ai/private/conf/l10n/it.json @@ -0,0 +1,22 @@ +{ + "lang": "italiano", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "dettagli", + "download": "download", + "empty": "vuota", + "files": "file", + "filter": "filtra", + "folders": "cartelle", + "grid": "griglia", + "icons": "icone", + "language": "Linugua", + "lastModified": "Ultima modifica", + "name": "Nome", + "noMatch": "nessun risultato", + "parentDirectory": "Cartella Superiore", + "search": "cerca", + "size": "Dimensione", + "tree": "Albero", + "view": "Vista" +} diff --git a/docker-persist/html/_h5ai/private/conf/l10n/ja.json b/docker-persist/html/_h5ai/private/conf/l10n/ja.json new file mode 100755 index 0000000..88266e7 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/ko.json b/docker-persist/html/_h5ai/private/conf/l10n/ko.json new file mode 100755 index 0000000..8c48cdb --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/lv.json b/docker-persist/html/_h5ai/private/conf/l10n/lv.json new file mode 100755 index 0000000..fa672ce --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/nb.json b/docker-persist/html/_h5ai/private/conf/l10n/nb.json new file mode 100755 index 0000000..44a1797 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/nl.json b/docker-persist/html/_h5ai/private/conf/l10n/nl.json new file mode 100755 index 0000000..8310f05 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/pl.json b/docker-persist/html/_h5ai/private/conf/l10n/pl.json new file mode 100755 index 0000000..da56967 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/pt-br.json b/docker-persist/html/_h5ai/private/conf/l10n/pt-br.json new file mode 100755 index 0000000..1b0d609 --- /dev/null +++ b/docker-persist/html/_h5ai/private/conf/l10n/pt-br.json @@ -0,0 +1,22 @@ +{ + "lang": "português do Brasil", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detalhes", + "download": "download", + "empty": "vazio", + "files": "arquivos", + "filter": "filtro", + "folders": "pastas", + "grid": "grade", + "icons": "ícones", + "language": "Idioma", + "lastModified": "Última modificação", + "name": "Nome", + "noMatch": "sem resultados", + "parentDirectory": "Diretório acima", + "search": "pesquisa", + "size": "Tamanho", + "tree": "Árvore", + "view": "Visualização" +} diff --git a/docker-persist/html/_h5ai/private/conf/l10n/pt-pt.json b/docker-persist/html/_h5ai/private/conf/l10n/pt-pt.json new file mode 100755 index 0000000..bc95686 --- /dev/null +++ b/docker-persist/html/_h5ai/private/conf/l10n/pt-pt.json @@ -0,0 +1,22 @@ +{ + "lang": "português de Portugal", + + "dateFormat": "DD-MM-YYYY HH:mm", + "details": "detalhes", + "download": "descarregar", + "empty": "vazio", + "files": "arquivos", + "filter": "filtro", + "folders": "pastas", + "grid": "grelha", + "icons": "ícones", + "language": "Idioma", + "lastModified": "última modificação", + "name": "Nome", + "noMatch": "sem resultados", + "parentDirectory": "Diretório acima", + "search": "pesquisa", + "size": "Tamanho", + "tree": "Árvore", + "view": "Visualização" +} diff --git a/docker-persist/html/_h5ai/private/conf/l10n/ro.json b/docker-persist/html/_h5ai/private/conf/l10n/ro.json new file mode 100755 index 0000000..4981dfe --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/ru.json b/docker-persist/html/_h5ai/private/conf/l10n/ru.json new file mode 100755 index 0000000..8056a0d --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/sk.json b/docker-persist/html/_h5ai/private/conf/l10n/sk.json new file mode 100755 index 0000000..cfc9e45 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/sl.json b/docker-persist/html/_h5ai/private/conf/l10n/sl.json new file mode 100755 index 0000000..5cdda21 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/sr.json b/docker-persist/html/_h5ai/private/conf/l10n/sr.json new file mode 100755 index 0000000..845eeab --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/sv.json b/docker-persist/html/_h5ai/private/conf/l10n/sv.json new file mode 100755 index 0000000..75638e5 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/tr.json b/docker-persist/html/_h5ai/private/conf/l10n/tr.json new file mode 100755 index 0000000..45cfc92 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/uk.json b/docker-persist/html/_h5ai/private/conf/l10n/uk.json new file mode 100755 index 0000000..62908f5 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/zh-cn.json b/docker-persist/html/_h5ai/private/conf/l10n/zh-cn.json new file mode 100755 index 0000000..7cdba51 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/l10n/zh-tw.json b/docker-persist/html/_h5ai/private/conf/l10n/zh-tw.json new file mode 100755 index 0000000..7567f0d --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/conf/options.json b/docker-persist/html/_h5ai/private/conf/options.json new file mode 100755 index 0000000..384d8de --- /dev/null +++ b/docker-persist/html/_h5ai/private/conf/options.json @@ -0,0 +1,397 @@ +/* h5ai v0.30.0 - 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/public/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. + + - stopSearchingAtRoot: boolean, only search for header and footer files until the web root + directory. if `false`, will search for header/footer up the entire directory structure, + even above the web root + */ + "custom": { + "enabled": true, + "stopSearchingAtRoot": 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/public/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/docker-persist/html/_h5ai/private/conf/types.json b/docker-persist/html/_h5ai/private/conf/types.json new file mode 100755 index 0000000..faaffae --- /dev/null +++ b/docker-persist/html/_h5ai/private/conf/types.json @@ -0,0 +1,76 @@ +/* h5ai v0.30.0 - 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/docker-persist/html/_h5ai/private/php/class-bootstrap.php b/docker-persist/html/_h5ai/private/php/class-bootstrap.php new file mode 100755 index 0000000..4356523 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-api.php b/docker-persist/html/_h5ai/private/php/core/class-api.php new file mode 100755 index 0000000..d850e65 --- /dev/null +++ b/docker-persist/html/_h5ai/private/php/core/class-api.php @@ -0,0 +1,110 @@ +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); + session_write_close(); + 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/docker-persist/html/_h5ai/private/php/core/class-context.php b/docker-persist/html/_h5ai/private/php/core/class-context.php new file mode 100755 index 0000000..0a72cea --- /dev/null +++ b/docker-persist/html/_h5ai/private/php/core/class-context.php @@ -0,0 +1,304 @@ +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) { + if (!in_array($iso_code, Context::$L10N_ISO_CODES)) { + continue; + } + + $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/docker-persist/html/_h5ai/private/php/core/class-fallback.php b/docker-persist/html/_h5ai/private/php/core/class-fallback.php new file mode 100755 index 0000000..7bd317f --- /dev/null +++ b/docker-persist/html/_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 .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + + if ($folder->get_parent($cache)) { + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + + foreach ($items as $item) { + $type = $item->is_folder ? 'folder' : 'file'; + + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + $html .= ''; + } + + $html .= '
NameLast modifiedSize
folder-parentParent Directory
' . $type . '' . basename($item->path) . '' . date('Y-m-d H:i', $item->date) . '' . ($item->size !== null ? intval($item->size / 1000) . ' KB' : '' ) . '
'; + + return $html; + } +} diff --git a/docker-persist/html/_h5ai/private/php/core/class-filesize.php b/docker-persist/html/_h5ai/private/php/core/class-filesize.php new file mode 100755 index 0000000..477f9e2 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-item.php b/docker-persist/html/_h5ai/private/php/core/class-item.php new file mode 100755 index 0000000..2b9ce34 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-json.php b/docker-persist/html/_h5ai/private/php/core/class-json.php new file mode 100755 index 0000000..f662b9f --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-session.php b/docker-persist/html/_h5ai/private/php/core/class-session.php new file mode 100755 index 0000000..630d78f --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-setup.php b/docker-persist/html/_h5ai/private/php/core/class-setup.php new file mode 100755 index 0000000..cbb85f8 --- /dev/null +++ b/docker-persist/html/_h5ai/private/php/core/class-setup.php @@ -0,0 +1,188 @@ +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'); + $cmds['where'] = Util::exec_0('where where.exe'); + + $cmd = false; + if ($cmds['command']) { + $cmd = 'command -v'; + } elseif ($cmds['which']) { + $cmd = 'which'; + } elseif ($cmds['where']) { + $cmd = 'where'; + } + + 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/docker-persist/html/_h5ai/private/php/core/class-theme.php b/docker-persist/html/_h5ai/private/php/core/class-theme.php new file mode 100755 index 0000000..8fcaddd --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/core/class-util.php b/docker-persist/html/_h5ai/private/php/core/class-util.php new file mode 100755 index 0000000..ce6c802 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/ext/class-archive.php b/docker-persist/html/_h5ai/private/php/ext/class-archive.php new file mode 100755 index 0000000..e1d9001 --- /dev/null +++ b/docker-persist/html/_h5ai/private/php/ext/class-archive.php @@ -0,0 +1,188 @@ +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) { + if (!is_array($hrefs)) { + $hrefs = array($hrefs); + } + + foreach ($hrefs as $href) { + if (trim($href) === '') { + continue; + } + + $href = Util::normalize_path($href, false); + $d = dirname($href); + $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/docker-persist/html/_h5ai/private/php/ext/class-custom.php b/docker-persist/html/_h5ai/private/php/ext/class-custom.php new file mode 100755 index 0000000..1a84bd2 --- /dev/null +++ b/docker-persist/html/_h5ai/private/php/ext/class-custom.php @@ -0,0 +1,73 @@ +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; + } + + // Stop once we reach the root + if ( + $this->context->query_option('custom.stopSearchingAtRoot', true) && + $path === $this->context->get_setup()->get('ROOT_PATH') + ) { + break; + } + $path = $parent_path; + } + + return [ + 'header' => ['content' => $header, 'type' => $header_type], + 'footer' => ['content' => $footer, 'type' => $footer_type] + ]; + } +} diff --git a/docker-persist/html/_h5ai/private/php/ext/class-search.php b/docker-persist/html/_h5ai/private/php/ext/class-search.php new file mode 100755 index 0000000..124954d --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/ext/class-thumb.php b/docker-persist/html/_h5ai/private/php/ext/class-thumb.php new file mode 100755 index 0000000..d52d3e8 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/private/php/pages/index.php b/docker-persist/html/_h5ai/private/php/pages/index.php new file mode 100755 index 0000000..be2aabd --- /dev/null +++ b/docker-persist/html/_h5ai/private/php/pages/index.php @@ -0,0 +1,2 @@ +index - powered by h5ai v0.30.0 (https://larsjung.de/h5ai/) +
Works best with JavaScript enabled!Works best in modern browsers!powered by h5ai
\ No newline at end of file diff --git a/docker-persist/html/_h5ai/private/php/pages/info.php b/docker-persist/html/_h5ai/private/php/pages/info.php new file mode 100755 index 0000000..9f46f14 --- /dev/null +++ b/docker-persist/html/_h5ai/private/php/pages/info.php @@ -0,0 +1,2 @@ +h5ai info page - v0.30.0 +
Works best with JavaScript enabled!Works best in modern browsers!powered by h5ai
\ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/.htaccess b/docker-persist/html/_h5ai/public/.htaccess new file mode 100755 index 0000000..3f14990 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/public/cache/README.md b/docker-persist/html/_h5ai/public/cache/README.md new file mode 100755 index 0000000..fd2974c --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/public/css/styles.css b/docker-persist/html/_h5ai/public/css/styles.css new file mode 100755 index 0000000..4edf3ff --- /dev/null +++ b/docker-persist/html/_h5ai/public/css/styles.css @@ -0,0 +1,2 @@ +/* h5ai v0.30.0 - 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;image-orientation:from-image;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{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;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%;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/docker-persist/html/_h5ai/public/ext/README.md b/docker-persist/html/_h5ai/public/ext/README.md new file mode 100755 index 0000000..7f9460c --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/public/images/fallback/file.png b/docker-persist/html/_h5ai/public/images/fallback/file.png new file mode 100755 index 0000000..c796a82 Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/fallback/file.png differ diff --git a/docker-persist/html/_h5ai/public/images/fallback/folder-parent.png b/docker-persist/html/_h5ai/public/images/fallback/folder-parent.png new file mode 100755 index 0000000..38da20d Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/fallback/folder-parent.png differ diff --git a/docker-persist/html/_h5ai/public/images/fallback/folder.png b/docker-persist/html/_h5ai/public/images/fallback/folder.png new file mode 100755 index 0000000..d4722e7 Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/fallback/folder.png differ diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon-152.png b/docker-persist/html/_h5ai/public/images/favicon/favicon-152.png new file mode 100755 index 0000000..3666dfc Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/favicon/favicon-152.png differ diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon-16-32.ico b/docker-persist/html/_h5ai/public/images/favicon/favicon-16-32.ico new file mode 100755 index 0000000..be17223 Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/favicon/favicon-16-32.ico differ diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon-16.png b/docker-persist/html/_h5ai/public/images/favicon/favicon-16.png new file mode 100755 index 0000000..d7dd0f9 Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/favicon/favicon-16.png differ diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon-32.png b/docker-persist/html/_h5ai/public/images/favicon/favicon-32.png new file mode 100755 index 0000000..2f97d12 Binary files /dev/null and b/docker-persist/html/_h5ai/public/images/favicon/favicon-32.png differ diff --git a/docker-persist/html/_h5ai/public/images/favicon/favicon.svg b/docker-persist/html/_h5ai/public/images/favicon/favicon.svg new file mode 100755 index 0000000..489efbe --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/favicon/favicon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/README.md b/docker-persist/html/_h5ai/public/images/themes/README.md new file mode 100755 index 0000000..650e0f7 --- /dev/null +++ b/docker-persist/html/_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/docker-persist/html/_h5ai/public/images/themes/comity/ar-apk.svg b/docker-persist/html/_h5ai/public/images/themes/comity/ar-apk.svg new file mode 100755 index 0000000..a7cc5cd --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/ar-apk.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/ar-deb.svg b/docker-persist/html/_h5ai/public/images/themes/comity/ar-deb.svg new file mode 100755 index 0000000..f1efae9 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/ar-deb.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/ar-rpm.svg b/docker-persist/html/_h5ai/public/images/themes/comity/ar-rpm.svg new file mode 100755 index 0000000..4146098 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/ar-rpm.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-css.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-css.svg new file mode 100755 index 0000000..487a535 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-css.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-go.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-go.svg new file mode 100755 index 0000000..0d21bb0 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-go.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-html.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-html.svg new file mode 100755 index 0000000..356e855 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-html.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-js.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-js.svg new file mode 100755 index 0000000..91a3279 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-js.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-less.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-less.svg new file mode 100755 index 0000000..fd15b02 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-less.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-md.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-md.svg new file mode 100755 index 0000000..a2fba14 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-md.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-php.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-php.svg new file mode 100755 index 0000000..84e1e22 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-php.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-py.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-py.svg new file mode 100755 index 0000000..d5dc003 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-py.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-rb.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-rb.svg new file mode 100755 index 0000000..a642dc2 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-rb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-rust.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-rust.svg new file mode 100755 index 0000000..0a71e77 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-rust.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/txt-script.svg b/docker-persist/html/_h5ai/public/images/themes/comity/txt-script.svg new file mode 100755 index 0000000..f8704e8 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/txt-script.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/comity/x-pdf.svg b/docker-persist/html/_h5ai/public/images/themes/comity/x-pdf.svg new file mode 100755 index 0000000..5266630 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/comity/x-pdf.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/ar.svg b/docker-persist/html/_h5ai/public/images/themes/default/ar.svg new file mode 100755 index 0000000..e25cded --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/ar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/aud.svg b/docker-persist/html/_h5ai/public/images/themes/default/aud.svg new file mode 100755 index 0000000..dd955fc --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/aud.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/bin.svg b/docker-persist/html/_h5ai/public/images/themes/default/bin.svg new file mode 100755 index 0000000..34f1f45 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/bin.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/file.svg b/docker-persist/html/_h5ai/public/images/themes/default/file.svg new file mode 100755 index 0000000..66bcac7 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/file.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/folder-page.svg b/docker-persist/html/_h5ai/public/images/themes/default/folder-page.svg new file mode 100755 index 0000000..4ca3ec2 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/folder-page.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/folder-parent.svg b/docker-persist/html/_h5ai/public/images/themes/default/folder-parent.svg new file mode 100755 index 0000000..e114689 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/folder-parent.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/folder.svg b/docker-persist/html/_h5ai/public/images/themes/default/folder.svg new file mode 100755 index 0000000..3e971cf --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/folder.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/img.svg b/docker-persist/html/_h5ai/public/images/themes/default/img.svg new file mode 100755 index 0000000..e754e82 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/img.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/txt.svg b/docker-persist/html/_h5ai/public/images/themes/default/txt.svg new file mode 100755 index 0000000..d5c0dc9 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/txt.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/vid.svg b/docker-persist/html/_h5ai/public/images/themes/default/vid.svg new file mode 100755 index 0000000..dd955fc --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/vid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/themes/default/x.svg b/docker-persist/html/_h5ai/public/images/themes/default/x.svg new file mode 100755 index 0000000..66bcac7 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/themes/default/x.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/back.svg b/docker-persist/html/_h5ai/public/images/ui/back.svg new file mode 100755 index 0000000..3275e21 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/back.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/crumb.svg b/docker-persist/html/_h5ai/public/images/ui/crumb.svg new file mode 100755 index 0000000..8dfd404 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/crumb.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/download.svg b/docker-persist/html/_h5ai/public/images/ui/download.svg new file mode 100755 index 0000000..5721c4e --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/download.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/filter.svg b/docker-persist/html/_h5ai/public/images/ui/filter.svg new file mode 100755 index 0000000..3e5f19a --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/filter.svg @@ -0,0 +1,3 @@ + + + diff --git a/docker-persist/html/_h5ai/public/images/ui/info-toggle.svg b/docker-persist/html/_h5ai/public/images/ui/info-toggle.svg new file mode 100755 index 0000000..ebc0e5c --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/info-toggle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/paypal.svg b/docker-persist/html/_h5ai/public/images/ui/paypal.svg new file mode 100755 index 0000000..a17415e --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/paypal.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-close.svg b/docker-persist/html/_h5ai/public/images/ui/preview-close.svg new file mode 100755 index 0000000..ef5f8a0 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/preview-close.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-fullscreen.svg b/docker-persist/html/_h5ai/public/images/ui/preview-fullscreen.svg new file mode 100755 index 0000000..bf04ad7 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/preview-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-next.svg b/docker-persist/html/_h5ai/public/images/ui/preview-next.svg new file mode 100755 index 0000000..1b72100 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/preview-next.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-no-fullscreen.svg b/docker-persist/html/_h5ai/public/images/ui/preview-no-fullscreen.svg new file mode 100755 index 0000000..d2a3efb --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/preview-no-fullscreen.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-prev.svg b/docker-persist/html/_h5ai/public/images/ui/preview-prev.svg new file mode 100755 index 0000000..a592b22 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/preview-prev.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/preview-raw.svg b/docker-persist/html/_h5ai/public/images/ui/preview-raw.svg new file mode 100755 index 0000000..7a8a69d --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/preview-raw.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/search.svg b/docker-persist/html/_h5ai/public/images/ui/search.svg new file mode 100755 index 0000000..d6d4c78 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/search.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/selected.svg b/docker-persist/html/_h5ai/public/images/ui/selected.svg new file mode 100755 index 0000000..50ac249 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/selected.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/sidebar.svg b/docker-persist/html/_h5ai/public/images/ui/sidebar.svg new file mode 100755 index 0000000..4e38c05 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/sidebar.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/sort.svg b/docker-persist/html/_h5ai/public/images/ui/sort.svg new file mode 100755 index 0000000..5b0ed8d --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/sort.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/spinner.svg b/docker-persist/html/_h5ai/public/images/ui/spinner.svg new file mode 100755 index 0000000..a5f7a7b --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/spinner.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docker-persist/html/_h5ai/public/images/ui/tree-indicator.svg b/docker-persist/html/_h5ai/public/images/ui/tree-indicator.svg new file mode 100755 index 0000000..8dfd404 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/tree-indicator.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/tree-toggle.svg b/docker-persist/html/_h5ai/public/images/ui/tree-toggle.svg new file mode 100755 index 0000000..9914792 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/tree-toggle.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/view-details.svg b/docker-persist/html/_h5ai/public/images/ui/view-details.svg new file mode 100755 index 0000000..5e756e0 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/view-details.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/view-grid.svg b/docker-persist/html/_h5ai/public/images/ui/view-grid.svg new file mode 100755 index 0000000..8f4c48c --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/view-grid.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/images/ui/view-icons.svg b/docker-persist/html/_h5ai/public/images/ui/view-icons.svg new file mode 100755 index 0000000..8601293 --- /dev/null +++ b/docker-persist/html/_h5ai/public/images/ui/view-icons.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/docker-persist/html/_h5ai/public/index.php b/docker-persist/html/_h5ai/public/index.php new file mode 100755 index 0000000..6fb89c3 --- /dev/null +++ b/docker-persist/html/_h5ai/public/index.php @@ -0,0 +1,17 @@ +=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,s=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return a=e.done,e},e:function(e){s=!0,o=e},f:function(){try{a||null==n.return||n.return()}finally{if(s)throw o}}}}function l(e,t){if(e){if("string"==typeof e)return r(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n');r(e,function(e,t){i('').attr("name",t).attr("value",e).appTo(n)}),n.appTo("body"),n[0].submit(),n.rm()}}}).call(this,a(5))},function(e,t,n){var r={"./":11,"./index":11,"./index.js":11,"./info":52,"./info.js":52};function i(e){var t=o(e);return n(t)}function o(e){if(n.o(r,e))return r[e];var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}i.keys=function(){return Object.keys(r)},i.resolve=o,(e.exports=i).id=10},function(e,t,n){(function(e){n(12),n(25),n(26),n(27),n(28),n(30),n(31),n(32),n(33),n(36),n(38),n(39),n(46),n(47),n(48),n(49),n(50),n(51);var t=e.window.document.location.href;n(21).setLocation(t,!0)}).call(this,n(5))},function(e,t,n){function r(e,t){f("#viewmode-settings .mode").rmCls("active"),f("#viewmode-"+e).addCls("active"),f("#viewmode-size").val(a.indexOf(t)),"next"===b.modeToggle&&(e=o[(o.indexOf(e)+1)%o.length]),f("#viewmode-toggle img").attr("src",p.image("view-"+e))}function i(){var e=v.getMode(),t=(o.indexOf(e)+1)%o.length,n=o[t];v.setMode(n)}var o,a,s,l,c=n(2),u=c.each,f=c.dom,d=n(13),p=n(14),h=n(15),g=n(16),m=n(18),v=n(19),b=Object.assign({modeToggle:!1},h.view),w='
\n viewmode-[MODE]\n
');o=v.getModes(),a=v.getSizes(),o.length<2&&a.length<2||(s=f('

View

'),1').attr("max",l).on("input",function(e){return v.setSize(a[e.target.valueAsNumber])}).on("change",function(e){return v.setSize(a[e.target.valueAsNumber])}).appTo(s)),s.appTo(g.$el)),b.modeToggle&&1\n viewmode\n
').on("click",i).appTo(m.$toolbar),r(v.getMode(),v.getSize()),d.sub("view.mode.changed",r)},function(s,e,l){(function(e){function t(t){for(var e=arguments.length,n=new Array(1').hide(),i=a(''),o=i.find("img"),f.disableSidebar||(r.appTo(u.$mainrow),i.appTo(u.$toolbar).on("click",function(){return p(!0)}),p()),{$el:r})},function(t,e,n){(function(e){function i(){try{return JSON.parse(o._h5ai)}catch(e){}return{}}var o=e.window.localStorage;t.exports={put:function(e,t){var n,r=i();r[e]=t,n=r,o._h5ai=JSON.stringify(n)},get:function(e){return i()[e]}}}).call(this,n(5))},function(e,t,n){var r,i=n(2).dom;e.exports={$root:r=i("body").attr("id","root").clr().app('').app('
\n
\n
'),$topbar:r.find("#topbar"),$toolbar:r.find("#toolbar"),$flowbar:r.find("#flowbar"),$mainrow:r.find("#mainrow"),$content:r.find("#content")}},function(e,t,n){function u(e,t,n){return Math.min(n,Math.max(t,e))}function r(t,n){var e=C.get(j);t=t||e&&e.mode,n=n||e&&e.size,t=b($.modes,t)?t:$.modes[0],n=b($.sizes,n)?n:$.sizes[0],C.put(j,{mode:t,size:n}),m(O,function(e){e===t?P.addCls("view-"+e):P.rmCls("view-"+e)}),m(M,function(e){e===n?P.addCls("view-size-"+e):P.rmCls("view-size-"+e)}),x.pub("view.mode.changed",t,n)}function s(e){var t=e.target._item;x.pub("item.mouseenter",t)}function l(e){var t=e.target._item;x.pub("item.mouseleave",t)}function i(e){var t=y('
  • \n \n \n \n \n \n \n \n
  • '),n=t.find("a"),r=t.find(".icon img"),i=t.find(".label"),o=t.find(".date"),a=t.find(".size");return t.addCls(e.isFolder()?"folder":"file").on("mouseenter",s).on("mouseleave",l),S.setLink(n,e),i.text(e.label).attr("title",e.label),o.attr("data-time",e.time).text(k.formatDate(e.time)),a.attr("data-bytes",e.size).text(k.formatSize(e.size)),e.icon=_.icon(e.type),e.isFolder()&&!e.isManaged&&(t.addCls("page"),e.icon=_.icon("folder-page")),e.isCurrentParentFolder()&&(e.icon=_.icon("folder-parent"),$.setParentFolderLabels||i.addCls("l10n-parentDirectory"),t.addCls("folder-parent")),r.attr("src",e.icon).attr("alt",e.type),(e.$view=t)[0]._item=e,t}function o(){D.find(".item").length===D.find(".folder-parent").length?I.show():I.hide()}function a(e){var t=v(D.find(".item"),function(e){return e._item});D.find(".item").rm(),m(e,function(e){return D.app(i(e))}),A.$content[0].scrollLeft=0,A.$content[0].scrollTop=0,o(),x.pub("view.changed",e,t)}function c(e,t){m(e,function(e){i(e).hide().appTo(D).show()}),m(t,function(e){e.$view.hide().rm()}),o(),x.pub("view.changed",e,t)}function f(e){I.rmCls().addCls("l10n-"+e),o()}function d(e){e=e||S.getItem();var t=[];e.parent&&!$.hideParentFolder&&t.push(e.parent),m(e.content,function(e){e.isFolder()&&$.hideFolders||t.push(e)}),f("empty"),a(t)}function p(e,t,n){var r=[];m(t,function(e){e.isFolder()&&$.hideFolders||r.push(e)}),f("empty"),c(r,n)}function h(){var e=P[0].offsetWidth;P.rmCls("width-0").rmCls("width-1"),e<320?P.addCls("width-0"):e<480&&P.addCls("width-1")}var g=n(2),m=g.each,v=g.map,b=g.includes,w=g.intersection,y=g.dom,x=n(13),k=n(20),S=n(21),_=n(14),C=n(17),z=n(15),A=n(18),T=["details","grid","icons"],$=Object.assign({binaryPrefix:!1,hideFolders:!1,hideParentFolder:!1,maxIconSize:40,modes:T,setParentFolderLabels:!1,sizes:[20,40,60,80,100,150,200,250,300,350,400]},z.view),M=$.sizes.sort(function(e,t){return e-t}),O=w($.modes,T),j="view",P=y('
    \n
      \n
    • \n \n \n \n \n
    • \n
    \n
    \n
    '),D=P.find("#items"),I=P.find("#view-hint");(function(){var e=v(M,function(e){return n=u(t=e,20,80),r=u(t,40,160),i=u(t,80,1e3),o=Math.round(4*i/3),a="!important;",s="#view.view-details.view-size-".concat(t),l="#view.view-grid.view-size-".concat(t),c="#view.view-icons.view-size-".concat(t),["".concat(s," .item .label {line-height: ").concat(n+14,"px ").concat(a,"}"),"".concat(s," .item .date {line-height: ").concat(n+14,"px ").concat(a,"}"),"".concat(s," .item .size {line-height: ").concat(n+14,"px ").concat(a,"}"),"".concat(s," .square {width: ").concat(n,"px ").concat(a," height: ").concat(n,"px ").concat(a,"}"),"".concat(s," .square img {width: ").concat(n,"px ").concat(a," height: ").concat(n,"px ").concat(a,"}"),"".concat(s," .label {margin-left: ").concat(n+32,"px ").concat(a,"}"),"".concat(l," .item .label {line-height: ").concat(r,"px ").concat(a,"}"),"".concat(l," .square {width: ").concat(r,"px ").concat(a," height: ").concat(r,"px ").concat(a,"}"),"".concat(l," .square img {width: ").concat(r,"px ").concat(a," height: ").concat(r,"px ").concat(a,"}"),"".concat(c," .item {width: ").concat(o,"px ").concat(a,"}"),"".concat(c," .landscape {width: ").concat(o,"px ").concat(a," height: ").concat(i,"px ").concat(a,"}"),"".concat(c," .landscape img {width: ").concat(i,"px ").concat(a," height: ").concat(i,"px ").concat(a,"}"),"".concat(c," .landscape .thumb {width: ").concat(o,"px ").concat(a,"}")].join("\n");var t,n,r,i,o,a,s,l,c});e.push("#view .icon img {max-width: ".concat($.maxIconSize,"px; max-height: ").concat($.maxIconSize,"px;}")),y("").text(e.join("\n")).appTo("head")})(),r(),P.appTo(A.$content),I.hide(),k.setDefaultMetric($.binaryPrefix),x.sub("location.changed",d),x.sub("location.refreshed",p),x.sub("resize",h),h(),e.exports={$el:P,setItems:a,changeItems:c,setLocation:d,setHint:f,getModes:function(){return O},getMode:function(){return C.get(j).mode},setMode:function(e){return r(e,null)},getSizes:function(){return M},getSize:function(){return C.get(j).size},setSize:function(e){return r(null,e)}}},function(e,t,n){var a=n(2).isNum,r={t:1e3,k:1e3,u:["B","KB","MB","GB","TB","PB","EB","ZB","YB"]},i={t:1024,k:1024,u:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"]},o=r,s=[[/YYYY/,"Y",4],[/YY/,"Y",2],[/Y/,"Y",0],[/MM/,"M",2],[/M/,"M",0],[/DD/,"D",2],[/D/,"D",0],[/HH/,"H",2],[/H/,"H",0],[/mm/,"m",2],[/m/,"m",0],[/ss/,"s",2],[/s/,"s",0]],l="YYYY-MM-DD HH:mm";e.exports={setDefaultMetric:function(e){o=e?i:r},formatSize:function(e,t){if(t=t||o,!a(e)||e<0)return"";for(var n=0,r=t.u.length-1;e>=t.t&&n').hide().appTo(o.$root),{set:function(e){e?r.html(e).show():r.hide()}})},function(e,t,n){function i(e,t){return u(e)&&e.startsWith(t)}function o(e){if(u(e))e={href:e};else if(!e||!u(e.href))return null;var t=p.forceEncoding(e.href);if(!i(t,h.rootHref))return null;var n=b[t]||w(t);return f(e.time)&&(n.time=e.time),f(e.size)&&(n.size=e.size),e.managed&&(n.isManaged=!0),e.fetched&&(n.isContentFetched=!0),n}var r=n(2),a=r.keys,s=r.each,l=r.filter,c=r.sortBy,u=r.isStr,f=r.isNum,d=n(9),p=n(21),h=n(15),g=n(24),m=/\/$/,v=/^(.*\/)([^\/]+\/?)$/,b={},w=function e(t){var n=function(e){if("/"===e)return{parent:null,name:"/"};var t=v.exec(e);if(!t)return null;var n={parent:t[1],name:t[2]};return n.parent&&!i(n.parent,h.rootHref)&&(n.parent=null),n}(t),r=Object.assign(Object.create(e.prototype),{absHref:t,type:g.getType(t),label:function(e){e=e.replace(m,"");try{e=decodeURIComponent(e)}catch(e){}return e}("/"===t?p.getDomain():n.name),time:null,size:null,parent:null,isManaged:null,content:{}});return b[t]=r,n.parent&&(r.parent=o(n.parent),r.parent.content[r.absHref]=r,1');return r.on("contextmenu",e).on("click",e)}function r(e,t,n,r){var i,o,a,s,l=u(r),c=(i=n,a=d('
      '),s=a.find("ul"),f(i,function(e){"-"===e.type?d('
    • ').appTo(s):"l"===e.type?d('
    • ').appTo(s).find(".cm-text").text(e.text):"e"===e.type&&((o=d('
    • ').appTo(s))[0]._cmId=e.id,o.find(".cm-text").text(e.text),e.icon?o.find(".cm-icon img").attr("src",p.icon(e.icon)):o.find(".cm-icon").addCls("no-icon"))}),a);l.hide().app(c).appTo("body"),function(e,t,n,r){t.css({left:0,top:0,opacity:0}),e.show();var i=e[0].getBoundingClientRect(),o=t[0].getBoundingClientRect(),a=i.left,s=i.top,l=i.width,c=i.height,u=o.width,f=o.height,d=n,p=r;l-8\n >\n \n '),h='has index page');d.enabled&&(a('
      ').appTo(f.$flowbar),s.sub("location.changed",r))},function(e,t,n){function r(e){o.request({action:"get",custom:e.absHref}).then(function(e){var o=e&&e.custom;s(["header","footer"],function(e){return t=o,i=l("#content-".concat(n=e)),void(t&&t[n].content?(r=t[n].content,"md"===t[n].type&&(r=a(r)),i.html(r).show()):i.hide());var t,n,r,i})})}var a=n(29),i=n(2),s=i.each,l=i.dom,o=n(9),c=n(13),u=n(15),f=Object.assign({enabled:!1},u.custom);f.enabled&&(l('
      ').hide().preTo("#content"),l('').hide().appTo("#content"),c.sub("location.changed",r))},function(e,t,n){var r,i,o;function a(e){return(a="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})(e)}o=function(){"use strict";function o(e,t){for(var n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function n(e){return c[e]}var e,t=(function(t){function e(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}t.exports={defaults:e(),getDefaults:e,changeDefaults:function(e){t.exports.defaults=e}}}(e={exports:{}}),e.exports),r=(t.defaults,t.getDefaults,t.changeDefaults,/[&<>"']/),a=/[&<>"']/g,s=/[<>"']|&(?!#?\w+;)/,l=/[<>"']|&(?!#?\w+;)/g,c={"&":"&","<":"<",">":">",'"':""","'":"'"};var u=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function f(e){return e.replace(u,function(e,t){return"colon"===(t=t.toLowerCase())?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}var d=/(^|[^\[])\^/g;var h=/[^\w:]/g,g=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;var m={},v=/^[^:]+:\/*[^/]*$/,b=/^([^:]+:)[\s\S]*$/,w=/^([^:]+:\/*[^/]*)[\s\S]*$/;function y(e,t){m[" "+e]||(v.test(e)?m[" "+e]=e+"/":m[" "+e]=x(e,"/",!0));var n=-1===(e=m[" "+e]).indexOf(":");return"//"===t.substring(0,2)?n?t:e.replace(b,"$1")+t:"/"===t.charAt(0)?n?t:e.replace(w,"$1")+t:e+t}function x(e,t,n){var r=e.length;if(0===r)return"";for(var i=0;it)n.splice(t);else for(;n.length>=1,e+=e;return n+e},j=t.defaults,P=x,D=T,I=k,L=$;function H(e,t,n){var r=t.href,i=t.title?I(t.title):null,o=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:n,href:r,title:i,text:o}:{type:"image",raw:n,href:r,title:i,text:I(o)}}var B=function(){function e(e){this.options=e||j}var t=e.prototype;return t.space=function(e){var t=this.rules.block.newline.exec(e);if(t)return 1=r.length?e.slice(r.length):e}).join("\n")}(n,t[3]||"");return{type:"code",raw:n,lang:t[2]?t[2].trim():t[2],text:r}}},t.heading=function(e){var t=this.rules.block.heading.exec(e);if(t){var n,r=t[2].trim();return/#$/.test(r)&&(n=P(r,"#"),!this.options.pedantic&&n&&!/ $/.test(n)||(r=n.trim())),{type:"heading",raw:t[0],depth:t[1].length,text:r}}},t.nptable=function(e){var t=this.rules.block.nptable.exec(e);if(t){var n={type:"table",header:D(t[1].replace(/^ *| *\| *$/g,"")),align:t[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:t[3]?t[3].replace(/\n$/,"").split("\n"):[],raw:t[0]};if(n.header.length===n.align.length){for(var r=n.align.length,i=0;i ?/gm,"");return{type:"blockquote",raw:t[0],text:n}}},t.list=function(e){var t=this.rules.block.list.exec(e);if(t){for(var n,r,i,o,a,s,l,c=t[0],u=t[2],f=1m[0].length||3/i.test(r[0])&&(t=!1),!n&&/^<(pre|code|kbd|script)(\s|>)/i.test(r[0])?n=!0:n&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(r[0])&&(n=!1),{type:this.options.sanitize?"text":"html",raw:r[0],inLink:t,inRawBlock:n,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):I(r[0]):r[0]}},t.link=function(e){var t=this.rules.inline.link.exec(e);if(t){var n=t[2].trim();if(!this.options.pedantic&&/^$/.test(n))return;var r=P(n.slice(0,-1),"\\");if((n.length-r.length)%2==0)return}else{var i,o=L(t[2],"()");-1$/.test(n)?s.slice(1):s.slice(1,-1)),H(t,{href:s?s.replace(this.rules.inline._escapes,"$1"):s,title:l?l.replace(this.rules.inline._escapes,"$1"):l},t[0])}},t.reflink=function(e,t){var n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){var r=(n[2]||n[1]).replace(/\s+/g," ");if((r=t[r.toLowerCase()])&&r.href)return H(n,r,n[0]);var i=n[0].charAt(0);return{type:"text",raw:i,text:i}}},t.strong=function(e,t,n){void 0===n&&(n="");var r=this.rules.inline.strong.start.exec(e);if(r&&(!r[1]||r[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var i,o="**"===r[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(o.lastIndex=0;null!=(r=o.exec(t));)if(i=this.rules.inline.strong.middle.exec(t.slice(0,r.index+3)))return{type:"strong",raw:e.slice(0,i[0].length),text:e.slice(2,i[0].length-2)}}},t.em=function(e,t,n){void 0===n&&(n="");var r=this.rules.inline.em.start.exec(e);if(r&&(!r[1]||r[1]&&(""===n||this.rules.inline.punctuation.exec(n)))){t=t.slice(-1*e.length);var i,o="*"===r[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(o.lastIndex=0;null!=(r=o.exec(t));)if(i=this.rules.inline.em.middle.exec(t.slice(0,r.index+2)))return{type:"em",raw:e.slice(0,i[0].length),text:e.slice(1,i[0].length-1)}}},t.codespan=function(e){var t=this.rules.inline.code.exec(e);if(t){var n=t[2].replace(/\n/g," "),r=/[^ ]/.test(n),i=/^ /.test(n)&&/ $/.test(n);return r&&i&&(n=n.substring(1,n.length-1)),n=I(n,!0),{type:"codespan",raw:t[0],text:n}}},t.br=function(e){var t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}},t.del=function(e){var t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2]}},t.autolink=function(e,t){var n=this.rules.inline.autolink.exec(e);if(n){var r,i="@"===n[2]?"mailto:"+(r=I(this.options.mangle?t(n[1]):n[1])):r=I(n[1]);return{type:"link",raw:n[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}},t.url=function(e,t){var n,r,i,o;if(n=this.rules.inline.url.exec(e)){if("@"===n[2])i="mailto:"+(r=I(this.options.mangle?t(n[0]):n[0]));else{for(;o=n[0],n[0]=this.rules.inline._backpedal.exec(n[0])[0],o!==n[0];);r=I(n[0]),i="www."===n[1]?"http://"+r:r}return{type:"link",raw:n[0],text:r,href:i,tokens:[{type:"text",raw:r,text:r}]}}},t.inlineText=function(e,t,n){var r=this.rules.inline.text.exec(e);if(r){var i=t?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(r[0]):I(r[0]):r[0]:I(this.options.smartypants?n(r[0]):r[0]);return{type:"text",raw:r[0],text:i}}},e}(),R=z,E=_,q=A,F={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:R,table:R,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};F.def=E(F.def).replace("label",F._label).replace("title",F._title).getRegex(),F.bullet=/(?:[*+-]|\d{1,9}[.)])/,F.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,F.item=E(F.item,"gm").replace(/bull/g,F.bullet).getRegex(),F.listItemStart=E(/^( *)(bull)/).replace("bull",F.bullet).getRegex(),F.list=E(F.list).replace(/bull/g,F.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+F.def.source+")").getRegex(),F._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",F._comment=/|$)/,F.html=E(F.html,"i").replace("comment",F._comment).replace("tag",F._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),F.paragraph=E(F._paragraph).replace("hr",F.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",F._tag).getRegex(),F.blockquote=E(F.blockquote).replace("paragraph",F.paragraph).getRegex(),F.normal=q({},F),F.gfm=q({},F.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),F.gfm.nptable=E(F.gfm.nptable).replace("hr",F.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",F._tag).getRegex(),F.gfm.table=E(F.gfm.table).replace("hr",F.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html",")|<(?:script|pre|style|!--)").replace("tag",F._tag).getRegex(),F.pedantic=q({},F.normal,{html:E("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",F._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:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:R,paragraph:E(F.normal._paragraph).replace("hr",F.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",F.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});var N={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:R,tag:"^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:R,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"};N.punctuation=E(N.punctuation).replace(/punctuation/g,N._punctuation).getRegex(),N._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",N._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",N._comment=E(F._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),N.em.start=E(N.em.start).replace(/punctuation/g,N._punctuation).getRegex(),N.em.middle=E(N.em.middle).replace(/punctuation/g,N._punctuation).replace(/overlapSkip/g,N._overlapSkip).getRegex(),N.em.endAst=E(N.em.endAst,"g").replace(/punctuation/g,N._punctuation).getRegex(),N.em.endUnd=E(N.em.endUnd,"g").replace(/punctuation/g,N._punctuation).getRegex(),N.strong.start=E(N.strong.start).replace(/punctuation/g,N._punctuation).getRegex(),N.strong.middle=E(N.strong.middle).replace(/punctuation/g,N._punctuation).replace(/overlapSkip/g,N._overlapSkip).getRegex(),N.strong.endAst=E(N.strong.endAst,"g").replace(/punctuation/g,N._punctuation).getRegex(),N.strong.endUnd=E(N.strong.endUnd,"g").replace(/punctuation/g,N._punctuation).getRegex(),N.blockSkip=E(N._blockSkip,"g").getRegex(),N.overlapSkip=E(N._overlapSkip,"g").getRegex(),N._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,N._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,N._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])?)+(?![-_])/,N.autolink=E(N.autolink).replace("scheme",N._scheme).replace("email",N._email).getRegex(),N._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,N.tag=E(N.tag).replace("comment",N._comment).replace("attribute",N._attribute).getRegex(),N._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,N._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,N._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,N.link=E(N.link).replace("label",N._label).replace("href",N._href).replace("title",N._title).getRegex(),N.reflink=E(N.reflink).replace("label",N._label).getRegex(),N.reflinkSearch=E(N.reflinkSearch,"g").replace("reflink",N.reflink).replace("nolink",N.nolink).getRegex(),N.normal=q({},N),N.pedantic=q({},N.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:E(/^!?\[(label)\]\((.*?)\)/).replace("label",N._label).getRegex(),reflink:E(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",N._label).getRegex()}),N.gfm=q({},N.normal,{escape:E(N.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~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\'+(n?e:ee(e,!0))+"\n":"
      "+(n?e:ee(e,!0))+"
      \n"},t.blockquote=function(e){return"
      \n"+e+"
      \n"},t.html=function(e){return e},t.heading=function(e,t,n,r){return this.options.headerIds?"'+e+"\n":""+e+"\n"},t.hr=function(){return this.options.xhtml?"
      \n":"
      \n"},t.list=function(e,t,n){var r=t?"ol":"ul";return"<"+r+(t&&1!==n?' start="'+n+'"':"")+">\n"+e+"\n"},t.listitem=function(e){return"
    • "+e+"
    • \n"},t.checkbox=function(e){return" "},t.paragraph=function(e){return"

      "+e+"

      \n"},t.table=function(e,t){return"\n\n"+e+"\n"+(t=t&&""+t+"")+"
      \n"},t.tablerow=function(e){return"\n"+e+"\n"},t.tablecell=function(e,t){var n=t.header?"th":"td";return(t.align?"<"+n+' align="'+t.align+'">':"<"+n+">")+e+"\n"},t.strong=function(e){return""+e+""},t.em=function(e){return""+e+""},t.codespan=function(e){return""+e+""},t.br=function(){return this.options.xhtml?"
      ":"
      "},t.del=function(e){return""+e+""},t.link=function(e,t,n){if(null===(e=Q(this.options.sanitize,this.options.baseUrl,e)))return n;var r='"},t.image=function(e,t,n){if(null===(e=Q(this.options.sanitize,this.options.baseUrl,e)))return n;var r=''+n+'":">"},t.text=function(e){return e},e}(),ne=function(){function e(){}var t=e.prototype;return t.strong=function(e){return e},t.em=function(e){return e},t.codespan=function(e){return e},t.del=function(e){return e},t.html=function(e){return e},t.text=function(e){return e},t.link=function(e,t,n){return""+n},t.image=function(e,t,n){return""+n},t.br=function(){return""},e}(),re=function(){function e(){this.seen={}}var t=e.prototype;return t.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},t.getNextSafeSlug=function(e,t){var n=e,r=0;if(this.seen.hasOwnProperty(n))for(r=this.seen[e];n=e+"-"+ ++r,this.seen.hasOwnProperty(n););return t||(this.seen[e]=r,this.seen[n]=0),n},t.slug=function(e,t){void 0===t&&(t={});var n=this.serialize(e);return this.getNextSafeSlug(n,t.dryrun)},e}(),ie=t.defaults,oe=S,ae=function(){function n(e){this.options=e||ie,this.options.renderer=this.options.renderer||new te,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new ne,this.slugger=new re}n.parse=function(e,t){return new n(t).parse(e)},n.parseInline=function(e,t){return new n(t).parseInline(e)};var e=n.prototype;return e.parse=function(e,t){void 0===t&&(t=!0);for(var n,r,i,o,a,s,l,c,u,f,d,p,h,g,m,v,b,w="",y=e.length,x=0;xAn error occurred:

      "+ce(e.message+"",!0)+"
      ";throw e}}return pe.options=pe.setOptions=function(e){return se(pe.defaults,e),fe(pe.defaults),pe},pe.getDefaults=ue,pe.defaults=de,pe.use=function(s){var t,n=se({},s);s.renderer&&function(){var a=pe.defaults.renderer||new te;for(var e in s.renderer)!function(i){var o=a[i];a[i]=function(){for(var e=arguments.length,t=new Array(e),n=0;nAn error occurred:

      "+ce(e.message+"",!0)+"
      ";throw e}},pe.Parser=ae,pe.parser=ae.parse,pe.Renderer=te,pe.TextRenderer=ne,pe.Lexer=J,pe.lexer=J.lex,pe.Tokenizer=B,pe.Slugger=re,pe.parse=pe},"object"===a(t)&&void 0!==e?e.exports=o():void 0===(i="function"==typeof(r=o)?r.call(t,n,t,e):r)||(e.exports=i)},function(e,t,n){function r(e){(m=e.slice(0)).length?o.show():h.alwaysVisible||o.hide()}function i(){var e=h.type,t=h.packageName,n="shell-zip"===e?"zip":"tar",r={action:"download",as:(t=t||(1===m.length?m[0].label:f.getItem().label))+"."+n,type:e,baseHref:f.getAbsHref(),hrefs:""};s(m,function(e,t){r["hrefs[".concat(t,"]")]=e.absHref}),c.formRequest(r)}var o,a=n(2),s=a.each,l=a.dom,c=n(9),u=n(13),f=n(21),d=n(14),p=n(15),h=Object.assign({enabled:!1,type:"php-tar",packageName:"package",alwaysVisible:!1},p.download),g='
      \n download\n
      '),m=[];h.enabled&&(o=l(g).hide().appTo("#toolbar").on("click",i),h.alwaysVisible&&o.show(),u.sub("selection",r))},function(e,t,n){function r(e){var t,n,r=0\n filter\n \n '),x=!1,k="";w.enabled&&(s=p(y).appTo("#toolbar"),l=s.find("input"),s.find("img").on("click",o),l.on("keyup",f(i,w.debounceTime)),h.sub("location.changed",a))},function(e,t,f){(function(e){var t,n,r,i,o,a=f(2).map,s=f(13),l=f(15),c=e.window,u=Object.assign({enabled:!1,id:"UA-000000-0"},l["google-analytics-ua"]);u.enabled&&(t=window,n=document,r="ga",t.GoogleAnalyticsObject=r,t.ga=t.ga||function(){(t.ga.q=t.ga.q||[]).push(arguments)},t.ga.l=+new Date,i=n.createElement("script"),o=n.getElementsByTagName("script")[0],i.async=1,i.src="//www.google-analytics.com/analytics.js",o.parentNode.insertBefore(i,o),c.ga("create",u.id,"auto"),s.sub("location.changed",function(e){var t=c.location;c.ga("send","pageview",{location:t.protocol+"//"+t.host+e.absHref,title:a(e.getCrumb(),function(e){return e.label}).join(" > ")})}))}).call(this,f(5))},function(e,t,T){(function(o){function t(){_.get(A)?(w("#view-info").addCls("active"),w("#info").show()):(w("#view-info").rmCls("active"),w("#info").hide())}function n(e){var t,n,r=e.thumbRational||e.icon,i=!!e.thumbRational;!e.isCurrentFolder()&&r||(r=k.icon("folder")),a.attr("src",r),i?a.addCls("thumb"):a.rmCls("thumb"),s.text(e.label),b(e.time)?l.text(x.formatDate(e.time)):l.text("."),b(e.size)?(c.text(x.formatSize(e.size)),c.show()):c.hide(),e.isContentFetched?(t=e.getStats(),f.text(t.folders),d.text(t.files),u.show()):u.hide(),C.qrcode&&(n=o.window.location,p.clr().app(m({render:"image",size:200,fill:C.qrFill,back:C.qrBack,text:n.protocol+"//"+n.host+e.absHref,crisp:!0,quiet:1})))}function e(e){n(e)}function r(){n(h)}function i(e){n(h=e)}var a,s,l,c,u,f,d,p,h,g,m=T(34),v=T(2),b=v.isNum,w=v.dom,y=T(13),x=T(20),k=T(14),S=T(15),_=T(17),C=Object.assign({enabled:!1,show:!1,qrcode:!0,qrColor:"#999"},S.info),z='
      \n

      Info

      \n
      \n view-info\n
      \n
      '),A="ext/info";C.enabled&&(g=w('
      \n
      \n
      \n
      \n
      \n
      \n
      \n ,\n \n
      \n
      \n
      \n
      ').hide().appTo("#mainrow"),a=g.find(".icon img"),s=g.find(".label"),l=g.find(".time"),c=g.find(".size"),u=g.find(".content"),f=g.find(".folders"),d=g.find(".files"),p=g.find(".qrcode"),C.qrcode||p.rm(),w(z).appTo("#sidebar").find("#view-info").on("click",function(e){_.put(A,!_.get(A)),t(),y.pub("resize"),e.preventDefault()}),"boolean"!=typeof _.get(A)&&_.put(A,C.show),t(),y.sub("location.changed",i),y.sub("item.mouseenter",e),y.sub("item.mouseleave",r))}).call(this,T(5))},function(e,o,t){(function(e){var t,n,r,i;function $(e){return($="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})(e)}i=function(){return r={},i.m=n=[function(e,t,n){function r(e){var t=Object.assign({},i,e),n=o(t.text,t.ecLevel,t.minVersion,t.quiet);return"svg"===t.render?s(n,t):a(n,t,"image"===t.render)}var i=n(1),o=n(2),a=n(4),s=n(8);e.exports=r;try{jQuery.fn.kjua=function(n){return this.each(function(e,t){return t.appendChild(r(n))})}}catch(e){}},function(e,t){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(e,t,n){function s(e){return(s="function"==typeof Symbol&&"symbol"==$(Symbol.iterator)?function(e){return $(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":$(e)})(e)}var l=/code length overflow/i,c=n(3);c.stringToBytes=c.stringToBytesFuncs["UTF-8"],e.exports=function(e,t,n,r){var i,o=3>n&1);u[Math.floor(n/3)][n%3+f-8-3]=r}for(n=0;n<18;n+=1)r=!e&&1==(t>>n&1),u[n%3+f-8-3][Math.floor(n/3)]=r},h=function(e,t){for(var n=l<<3|t,r=w.getBCHTypeInfo(n),i=0;i<15;i+=1){var o=!e&&1==(r>>i&1);i<6?u[i][8]=o:i<8?u[i+1][8]=o:u[f-15+i][8]=o}for(i=0;i<15;i+=1)o=!e&&1==(r>>i&1),i<8?u[8][f-i-1]=o:i<9?u[8][15-i-1+1]=o:u[8][15-i-1]=o;u[f-8][8]=!e},g=function(e,t){for(var n=-1,r=f-1,i=7,o=0,a=w.getMaskFunction(t),s=f-1;0>>i&1)),a(r,s-c)&&(l=!l),u[r][s-c]=l,-1==--i&&(o+=1,i=7));if((r+=n)<0||f<=r){r-=n,n=-n;break}}},m=function(e,t,n){for(var r=x.getRSBlocks(e,t),i=k(),o=0;o8*s)throw"code length overflow. ("+i.getLengthInBits()+">"+8*s+")";for(i.getLengthInBits()+4<=8*s&&i.put(0,4);i.getLengthInBits()%8!=0;)i.putBit(!1);for(;!(i.getLengthInBits()>=8*s||(i.put(236,8),i.getLengthInBits()>=8*s));)i.put(17,8);return function(e,t){for(var n=0,r=0,i=0,o=new Array(t.length),a=new Array(t.length),s=0;s',n+="";for(var r=0;r";for(var i=0;i';n+=""}return(n+="")+""},p.createSvgTag=function(e,t,n,r){var i={};"object"==$(arguments[0])&&(e=(i=arguments[0]).cellSize,t=i.margin,n=i.alt,r=i.title),e=e||2,t=void 0===t?4*e:t,(n="string"==typeof n?{text:n}:n||{}).text=n.text||null,n.id=n.text?n.id||"qrcode-description":null,(r="string"==typeof r?{text:r}:r||{}).text=r.text||null,r.id=r.text?r.id||"qrcode-title":null;var o,a,s,l=p.getModuleCount()*e+2*t,c="",u="l"+e+",0 0,"+e+" -"+e+",0 0,-"+e+"z ";for(c+=''+v(r.text)+"":"",c+=n.text?''+v(n.text)+"":"",c+='',c+='"},p.createDataURL=function(i,e){i=i||2,e=void 0===e?4*i:e;var t=p.getModuleCount()*i+2*e,o=e,a=t-e;return T(t,t,function(e,t){if(o<=e&&e"};var v=function(e){for(var t="",n=0;n":t+=">";break;case"&":t+="&";break;case'"':t+=""";break;default:t+=r}}return t};return p.createASCII=function(e,t){if((e=e||1)<2)return function(e){e=void 0===e?2:e;for(var t,n,r,i,o=+p.getModuleCount()+2*e,a=e,s=o-e,l={"██":"█","█ ":"▀"," █":"▄"," ":" "},c={"██":"▀","█ ":"▀"," █":" "," ":" "},u="",f=0;f>>8),t.push(255&r)):t.push(a)}return t}};var t,e,b={L:1,M:0,Q:3,H:2},w=(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]],(e={}).getBCHTypeInfo=function(e){for(var t=e<<10;0<=n(t)-n(1335);)t^=1335<>>=1;return t}var a=function(){for(var t=new Array(256),n=new Array(256),e=0;e<8;e+=1)t[e]=1<>>8)},writeBytes:function(e,t,n){t=t||0,n=n||e.length;for(var r=0;r>>7-e%8&1)},put:function(e,t){for(var n=0;n>>t-n-1&1))},getLengthInBits:function(){return r},putBit:function(e){var t=Math.floor(r/8);n.length<=t&&n.push(0),e&&(n[t]|=128>>>r%8),r+=1}};return i},S=function(e){var r=e,t={getMode:function(){return 1},getLength:function(){return r.length},write:function(e){for(var t=r,n=0;n+2>>8&255)+(255&r),e.put(r,13),n+=2}if(n=n.length){if(0==o)return-1;throw"unexpected end of file./"+o}var e=n.charAt(r);if(r+=1,"="==e)return o=0,-1;e.match(/^\s$/)||(i=i<<6|a(e.charCodeAt(0)),o+=6)}var t=i>>>o-8&255;return o-=8,t}},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"c:"+e};return t},T=function(e,t,n){for(var r,i,o,a,h,s,l,g,c=(o=r=e,a=i=t,h=new Array(r*i),s={setPixel:function(e,t,n){h[t*o+e]=n},write:function(e){e.writeString("GIF87a"),e.writeShort(o),e.writeShort(a),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(o),e.writeShort(a),e.writeByte(0);var t=l(2);e.writeByte(2);for(var n=0;255>>t!=0)throw"length over";for(;8<=s+t;)a.writeByte(255&(e<>>=8-s,s=l=0;l|=e<>>m-6),m-=6},w.flush=function(){if(0>6,128|63&r):r<55296||57344<=r?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},void 0===(i="function"==typeof(r=function(){return o})?r.apply(t,[]):r)||(e.exports=i)},function(e,t,n){function f(e,t,n,r,i,o){e.is_dark(i,o)&&t.rect(o*r,i*r,r,r)}var d=n(5),p=n(6),h=n(7);e.exports=function(e,t,n){var r,i,o,a,s,l=t.ratio||d.dpr,c=d.create_canvas(t.size,l),u=c.getContext("2d");return u.scale(l,l),r=e,s=i=u,(a=o=t).back&&(s.fillStyle=a.back,s.fillRect(0,0,a.size,a.size)),function(e,t,n){if(e){var r=0\n

      Language

      \n
      \n