From efa31cb734392e29ab2463d0f416961d896a68ed Mon Sep 17 00:00:00 2001 From: Klocus Date: Mon, 12 Mar 2018 13:23:44 +0100 Subject: [PATCH] Add Batflat 1.3.4 to repository --- .htaccess | 23 + LICENSE.txt | 99 ++ ReadMe.md | 10 +- admin/.htaccess | 10 + admin/index.php | 58 + favicon.ico | Bin 0 -> 1150 bytes inc/core/Admin.php | 352 +++++ inc/core/AdminModule.php | 28 + inc/core/BaseModule.php | 203 +++ inc/core/Main.php | 379 +++++ inc/core/Site.php | 125 ++ inc/core/SiteModule.php | 57 + inc/core/defines.php | 51 + inc/core/lib/Autoloader.php | 47 + inc/core/lib/Event.php | 49 + inc/core/lib/HttpRequest.php | 95 ++ inc/core/lib/Image.php | 449 ++++++ inc/core/lib/Indenter.php | 184 +++ inc/core/lib/License.php | 94 ++ inc/core/lib/ModulesCollection.php | 128 ++ inc/core/lib/Pagination.php | 179 +++ inc/core/lib/Parsedown.php | 1301 +++++++++++++++++ inc/core/lib/QueryBuilder.php | 897 ++++++++++++ inc/core/lib/Router.php | 110 ++ inc/core/lib/Settings.php | 113 ++ inc/core/lib/Templates.php | 306 ++++ inc/core/lib/Widget.php | 53 + inc/core/lib/functions.php | 423 ++++++ inc/css/bootstrap-theme.min.css | 1 + inc/css/bootstrap.min.css | 5 + inc/data/.gitkeep | 0 inc/fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes inc/fonts/glyphicons-halflings-regular.svg | 288 ++++ inc/fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes inc/fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes inc/fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes inc/jscripts/are-you-sure.min.js | 14 + inc/jscripts/bootbox.min.js | 6 + inc/jscripts/bootstrap.min.js | 7 + inc/jscripts/editor/highlight.min.js | 2 + inc/jscripts/editor/images/bold.png | Bin 0 -> 304 bytes inc/jscripts/editor/images/clean.png | Bin 0 -> 667 bytes inc/jscripts/editor/images/code.png | Bin 0 -> 859 bytes inc/jscripts/editor/images/h1.png | Bin 0 -> 276 bytes inc/jscripts/editor/images/h2.png | Bin 0 -> 304 bytes inc/jscripts/editor/images/h3.png | Bin 0 -> 306 bytes inc/jscripts/editor/images/handle.png | Bin 0 -> 258 bytes inc/jscripts/editor/images/image.png | Bin 0 -> 516 bytes inc/jscripts/editor/images/italic.png | Bin 0 -> 223 bytes inc/jscripts/editor/images/link.png | Bin 0 -> 343 bytes inc/jscripts/editor/images/list-bullet.png | Bin 0 -> 344 bytes inc/jscripts/editor/images/list-item.png | Bin 0 -> 248 bytes inc/jscripts/editor/images/list-numeric.png | Bin 0 -> 357 bytes inc/jscripts/editor/images/menu.png | Bin 0 -> 27151 bytes inc/jscripts/editor/images/paragraph.png | Bin 0 -> 361 bytes inc/jscripts/editor/images/picture.png | Bin 0 -> 606 bytes inc/jscripts/editor/images/quotes.png | Bin 0 -> 743 bytes inc/jscripts/editor/images/stroke.png | Bin 0 -> 269 bytes inc/jscripts/editor/images/submenu.png | Bin 0 -> 240 bytes .../editor/markitup.highlight.min.css | 1 + inc/jscripts/editor/markitup.highlight.min.js | 1 + inc/jscripts/editor/markitup.min.css | 1 + inc/jscripts/editor/markitup.min.js | 27 + inc/jscripts/editor/sets/html/set.min.css | 1 + inc/jscripts/editor/sets/html/set.min.js | 1 + inc/jscripts/editor/sets/markdown/set.min.css | 1 + inc/jscripts/editor/sets/markdown/set.min.js | 1 + inc/jscripts/html.sortable.min.js | 2 + inc/jscripts/lightbox/lightbox.min.css | 1 + inc/jscripts/lightbox/lightbox.min.js | 2 + inc/jscripts/tinynav.min.js | 3 + inc/jscripts/wysiwyg/font/summernote.eot | Bin 0 -> 13238 bytes inc/jscripts/wysiwyg/font/summernote.ttf | Bin 0 -> 13052 bytes inc/jscripts/wysiwyg/font/summernote.woff | Bin 0 -> 8332 bytes inc/jscripts/wysiwyg/lang/pl_polski.js | 112 ++ inc/jscripts/wysiwyg/summernote.min.css | 1 + inc/jscripts/wysiwyg/summernote.min.js | 4 + inc/lang/en_english/admin/general.ini | 34 + inc/lang/pl_polski/admin/general.ini | 34 + inc/modules/blog/Admin.php | 472 ++++++ inc/modules/blog/Info.php | 79 + inc/modules/blog/ReadMe.md | 15 + inc/modules/blog/Site.php | 373 +++++ inc/modules/blog/css/admin/blog.css | 20 + inc/modules/blog/img/default.jpg | Bin 0 -> 49323 bytes inc/modules/blog/img/indicator.gif | Bin 0 -> 1553 bytes inc/modules/blog/js/admin/blog.js | 200 +++ inc/modules/blog/lang/admin/en_english.ini | 84 ++ inc/modules/blog/lang/admin/pl_polski.ini | 84 ++ inc/modules/blog/lang/en_english.ini | 40 + inc/modules/blog/lang/pl_polski.ini | 36 + inc/modules/blog/view/admin/form.html | 122 ++ inc/modules/blog/view/admin/manage.html | 86 ++ inc/modules/blog/view/admin/settings.html | 42 + inc/modules/blog/view/disqus.html | 23 + inc/modules/blog/view/feed.xml | 23 + inc/modules/carousel/Info.php | 19 + inc/modules/carousel/ReadMe.md | 5 + inc/modules/carousel/Site.php | 48 + .../carousel/lang/admin/en_english.ini | 2 + inc/modules/carousel/lang/admin/pl_polski.ini | 2 + inc/modules/carousel/view/carousel.html | 29 + inc/modules/contact/Admin.php | 92 ++ inc/modules/contact/Info.php | 35 + inc/modules/contact/Site.php | 177 +++ inc/modules/contact/lang/admin/en_english.ini | 21 + inc/modules/contact/lang/admin/pl_polski.ini | 21 + inc/modules/contact/lang/en_english.ini | 10 + inc/modules/contact/lang/pl_polski.ini | 10 + inc/modules/contact/view/admin/settings.html | 89 ++ inc/modules/contact/view/form.html | 32 + inc/modules/contact/view/mail.html | 318 ++++ inc/modules/dashboard/Admin.php | 100 ++ inc/modules/dashboard/Info.php | 19 + inc/modules/dashboard/css/style.css | 82 ++ .../dashboard/lang/admin/en_english.ini | 6 + .../dashboard/lang/admin/pl_polski.ini | 6 + .../dashboard/view/admin/dashboard.html | 50 + inc/modules/devbar/Admin.php | 62 + inc/modules/devbar/Dump.php | 7 + inc/modules/devbar/Info.php | 24 + inc/modules/devbar/ReadMe.md | 3 + inc/modules/devbar/Site.php | 62 + inc/modules/devbar/css/style.css | 113 ++ inc/modules/devbar/css/style.less | 121 ++ inc/modules/devbar/functions.php | 68 + inc/modules/devbar/view/bar.html | 97 ++ inc/modules/galleries/Admin.php | 254 ++++ inc/modules/galleries/Info.php | 46 + inc/modules/galleries/Site.php | 58 + .../galleries/lang/admin/en_english.ini | 28 + .../galleries/lang/admin/pl_polski.ini | 28 + inc/modules/galleries/view/admin/edit.html | 109 ++ inc/modules/galleries/view/admin/manage.html | 59 + inc/modules/galleries/view/gallery.html | 26 + inc/modules/langswitcher/Info.php | 25 + inc/modules/langswitcher/ReadMe.md | 1 + inc/modules/langswitcher/Site.php | 103 ++ .../langswitcher/lang/admin/en_english.ini | 3 + .../langswitcher/lang/admin/pl_polski.ini | 3 + inc/modules/langswitcher/view/switcher.html | 7 + inc/modules/modules/Admin.php | 264 ++++ inc/modules/modules/Info.php | 30 + inc/modules/modules/lang/admin/en_english.ini | 40 + inc/modules/modules/lang/admin/pl_polski.ini | 40 + inc/modules/modules/view/admin/details.html | 64 + inc/modules/modules/view/admin/manage.html | 84 ++ inc/modules/modules/view/admin/upload.html | 30 + inc/modules/navigation/Admin.php | 447 ++++++ inc/modules/navigation/Info.php | 54 + inc/modules/navigation/Site.php | 103 ++ .../navigation/lang/admin/en_english.ini | 22 + .../navigation/lang/admin/pl_polski.ini | 22 + .../navigation/view/admin/form.link.html | 77 + .../navigation/view/admin/form.nav.html | 18 + inc/modules/navigation/view/admin/manage.html | 68 + inc/modules/navigation/view/nav.html | 19 + inc/modules/pages/Admin.php | 281 ++++ inc/modules/pages/Info.php | 81 + inc/modules/pages/ReadMe.md | 18 + inc/modules/pages/Site.php | 144 ++ inc/modules/pages/js/admin/pages.js | 156 ++ inc/modules/pages/lang/admin/en_english.ini | 21 + inc/modules/pages/lang/admin/pl_polski.ini | 21 + inc/modules/pages/lang/en_english.ini | 1 + inc/modules/pages/lang/pl_polski.ini | 1 + inc/modules/pages/view/admin/form.html | 75 + inc/modules/pages/view/admin/manage.html | 54 + inc/modules/sample/Admin.php | 45 + inc/modules/sample/Info.php | 27 + inc/modules/sample/Site.php | 81 + inc/modules/sample/lang/admin/en_english.ini | 6 + inc/modules/sample/lang/admin/pl_polski.ini | 6 + inc/modules/sample/lang/en_english.ini | 1 + inc/modules/sample/lang/pl_polski.ini | 1 + inc/modules/sample/view/admin/index.html | 16 + inc/modules/sample/view/hello.html | 9 + inc/modules/searchbox/Info.php | 28 + inc/modules/searchbox/ReadMe.md | 2 + inc/modules/searchbox/Site.php | 118 ++ .../searchbox/lang/admin/en_english.ini | 1 + .../searchbox/lang/admin/pl_polski.ini | 1 + inc/modules/searchbox/lang/en_english.ini | 4 + inc/modules/searchbox/lang/pl_polski.ini | 4 + inc/modules/searchbox/view/input.html | 8 + inc/modules/searchbox/view/results.html | 8 + inc/modules/settings/Admin.php | 839 +++++++++++ inc/modules/settings/Info.php | 47 + inc/modules/settings/ReadMe.md | 5 + inc/modules/settings/Site.php | 30 + inc/modules/settings/css/admin/settings.css | 14 + .../inc/RecursiveDotFilterIterator.php | 10 + .../settings/lang/admin/en_english.ini | 71 + inc/modules/settings/lang/admin/pl_polski.ini | 71 + inc/modules/settings/view/admin/general.html | 170 +++ inc/modules/settings/view/admin/theme.html | 61 + inc/modules/settings/view/admin/themes.html | 24 + .../settings/view/admin/translation.html | 107 ++ inc/modules/settings/view/admin/update.html | 65 + inc/modules/sitemap/Info.php | 28 + inc/modules/sitemap/ReadMe.md | 4 + inc/modules/sitemap/Site.php | 87 ++ inc/modules/sitemap/lang/admin/en_english.ini | 2 + inc/modules/sitemap/lang/admin/pl_polski.ini | 2 + inc/modules/sitemap/view/sitemap.xml | 14 + inc/modules/snippets/Admin.php | 190 +++ inc/modules/snippets/Info.php | 31 + inc/modules/snippets/Site.php | 34 + inc/modules/snippets/js/admin/snippets.js | 109 ++ .../snippets/lang/admin/en_english.ini | 12 + inc/modules/snippets/lang/admin/pl_polski.ini | 12 + inc/modules/snippets/view/admin/form.html | 33 + inc/modules/snippets/view/admin/manage.html | 42 + inc/modules/statistics/Admin.php | 159 ++ inc/modules/statistics/DB.php | 16 + inc/modules/statistics/Info.php | 47 + inc/modules/statistics/Site.php | 80 + inc/modules/statistics/assets/css/style.css | 14 + .../statistics/assets/js/Chart.bundle.min.js | 16 + inc/modules/statistics/assets/js/app.js | 55 + .../statistics/lang/admin/en_english.ini | 27 + .../statistics/lang/admin/pl_polski.ini | 27 + .../phpbrowserdetector/AcceptLanguage.php | 56 + .../statistics/phpbrowserdetector/Browser.php | 322 ++++ .../phpbrowserdetector/BrowserDetector.php | 1006 +++++++++++++ .../phpbrowserdetector/DetectorInterface.php | 7 + .../statistics/phpbrowserdetector/Device.php | 82 ++ .../phpbrowserdetector/DeviceDetector.php | 96 ++ .../InvalidArgumentException.php | 7 + .../phpbrowserdetector/Language.php | 125 ++ .../phpbrowserdetector/LanguageDetector.php | 45 + .../statistics/phpbrowserdetector/Os.php | 176 +++ .../phpbrowserdetector/OsDetector.php | 508 +++++++ .../phpbrowserdetector/UserAgent.php | 56 + inc/modules/statistics/src/Chart.php | 119 ++ inc/modules/statistics/src/Statistics.php | 124 ++ .../statistics/view/admin/dashboard.html | 226 +++ inc/modules/statistics/view/admin/pages.html | 44 + .../statistics/view/admin/referrer.html | 133 ++ .../statistics/view/admin/referrers.html | 48 + inc/modules/statistics/view/admin/url.html | 133 ++ inc/modules/users/Admin.php | 261 ++++ inc/modules/users/Info.php | 62 + inc/modules/users/Site.php | 31 + inc/modules/users/img/default.png | Bin 0 -> 1497 bytes inc/modules/users/lang/admin/en_english.ini | 23 + inc/modules/users/lang/admin/pl_polski.ini | 23 + inc/modules/users/view/admin/form.html | 71 + inc/modules/users/view/admin/manage.html | 40 + index.php | 30 + themes/admin/css/style.css | 810 ++++++++++ themes/admin/img/logo.svg | 1 + themes/admin/img/unknown_theme.png | Bin 0 -> 32632 bytes themes/admin/index.html | 98 ++ themes/admin/js/kalypto.min.js | 1 + themes/admin/js/scripts.js | 147 ++ themes/admin/js/selectator.min.js | 9 + themes/admin/login.html | 56 + themes/batblog/blog.html | 80 + themes/batblog/css/style.css | 645 ++++++++ themes/batblog/img/default-bg.jpg | Bin 0 -> 144560 bytes themes/batblog/img/profile.jpg | Bin 0 -> 33959 bytes themes/batblog/inc/footer.html | 21 + themes/batblog/inc/header.html | 45 + themes/batblog/inc/sidebar.html | 56 + themes/batblog/index.html | 31 + themes/batblog/js/theme.js | 28 + themes/batblog/manifest.json | 7 + themes/batblog/post.html | 75 + themes/batblog/preview.png | Bin 0 -> 122152 bytes themes/default/blog.html | 58 + themes/default/css/style.css | 477 ++++++ themes/default/img/default-bg.jpg | Bin 0 -> 145218 bytes themes/default/inc/footer.html | 47 + themes/default/inc/header.html | 44 + themes/default/index.html | 30 + themes/default/js/theme.js | 18 + themes/default/manifest.json | 7 + themes/default/post.html | 43 + themes/default/preview.png | Bin 0 -> 105865 bytes upgrade.php | 208 +++ uploads/.htaccess | 4 + uploads/index.html | 0 283 files changed, 22607 insertions(+), 1 deletion(-) create mode 100644 .htaccess create mode 100644 LICENSE.txt create mode 100644 admin/.htaccess create mode 100644 admin/index.php create mode 100644 favicon.ico create mode 100644 inc/core/Admin.php create mode 100644 inc/core/AdminModule.php create mode 100644 inc/core/BaseModule.php create mode 100644 inc/core/Main.php create mode 100644 inc/core/Site.php create mode 100644 inc/core/SiteModule.php create mode 100644 inc/core/defines.php create mode 100644 inc/core/lib/Autoloader.php create mode 100644 inc/core/lib/Event.php create mode 100644 inc/core/lib/HttpRequest.php create mode 100644 inc/core/lib/Image.php create mode 100644 inc/core/lib/Indenter.php create mode 100644 inc/core/lib/License.php create mode 100644 inc/core/lib/ModulesCollection.php create mode 100644 inc/core/lib/Pagination.php create mode 100644 inc/core/lib/Parsedown.php create mode 100644 inc/core/lib/QueryBuilder.php create mode 100644 inc/core/lib/Router.php create mode 100644 inc/core/lib/Settings.php create mode 100644 inc/core/lib/Templates.php create mode 100644 inc/core/lib/Widget.php create mode 100644 inc/core/lib/functions.php create mode 100644 inc/css/bootstrap-theme.min.css create mode 100644 inc/css/bootstrap.min.css create mode 100644 inc/data/.gitkeep create mode 100644 inc/fonts/glyphicons-halflings-regular.eot create mode 100644 inc/fonts/glyphicons-halflings-regular.svg create mode 100644 inc/fonts/glyphicons-halflings-regular.ttf create mode 100644 inc/fonts/glyphicons-halflings-regular.woff create mode 100644 inc/fonts/glyphicons-halflings-regular.woff2 create mode 100644 inc/jscripts/are-you-sure.min.js create mode 100644 inc/jscripts/bootbox.min.js create mode 100644 inc/jscripts/bootstrap.min.js create mode 100644 inc/jscripts/editor/highlight.min.js create mode 100644 inc/jscripts/editor/images/bold.png create mode 100644 inc/jscripts/editor/images/clean.png create mode 100644 inc/jscripts/editor/images/code.png create mode 100644 inc/jscripts/editor/images/h1.png create mode 100644 inc/jscripts/editor/images/h2.png create mode 100644 inc/jscripts/editor/images/h3.png create mode 100644 inc/jscripts/editor/images/handle.png create mode 100644 inc/jscripts/editor/images/image.png create mode 100644 inc/jscripts/editor/images/italic.png create mode 100644 inc/jscripts/editor/images/link.png create mode 100644 inc/jscripts/editor/images/list-bullet.png create mode 100644 inc/jscripts/editor/images/list-item.png create mode 100644 inc/jscripts/editor/images/list-numeric.png create mode 100644 inc/jscripts/editor/images/menu.png create mode 100644 inc/jscripts/editor/images/paragraph.png create mode 100644 inc/jscripts/editor/images/picture.png create mode 100644 inc/jscripts/editor/images/quotes.png create mode 100644 inc/jscripts/editor/images/stroke.png create mode 100644 inc/jscripts/editor/images/submenu.png create mode 100644 inc/jscripts/editor/markitup.highlight.min.css create mode 100644 inc/jscripts/editor/markitup.highlight.min.js create mode 100644 inc/jscripts/editor/markitup.min.css create mode 100644 inc/jscripts/editor/markitup.min.js create mode 100644 inc/jscripts/editor/sets/html/set.min.css create mode 100644 inc/jscripts/editor/sets/html/set.min.js create mode 100644 inc/jscripts/editor/sets/markdown/set.min.css create mode 100644 inc/jscripts/editor/sets/markdown/set.min.js create mode 100644 inc/jscripts/html.sortable.min.js create mode 100644 inc/jscripts/lightbox/lightbox.min.css create mode 100644 inc/jscripts/lightbox/lightbox.min.js create mode 100644 inc/jscripts/tinynav.min.js create mode 100644 inc/jscripts/wysiwyg/font/summernote.eot create mode 100644 inc/jscripts/wysiwyg/font/summernote.ttf create mode 100644 inc/jscripts/wysiwyg/font/summernote.woff create mode 100644 inc/jscripts/wysiwyg/lang/pl_polski.js create mode 100644 inc/jscripts/wysiwyg/summernote.min.css create mode 100644 inc/jscripts/wysiwyg/summernote.min.js create mode 100644 inc/lang/en_english/admin/general.ini create mode 100644 inc/lang/pl_polski/admin/general.ini create mode 100644 inc/modules/blog/Admin.php create mode 100644 inc/modules/blog/Info.php create mode 100644 inc/modules/blog/ReadMe.md create mode 100644 inc/modules/blog/Site.php create mode 100644 inc/modules/blog/css/admin/blog.css create mode 100644 inc/modules/blog/img/default.jpg create mode 100644 inc/modules/blog/img/indicator.gif create mode 100644 inc/modules/blog/js/admin/blog.js create mode 100644 inc/modules/blog/lang/admin/en_english.ini create mode 100644 inc/modules/blog/lang/admin/pl_polski.ini create mode 100644 inc/modules/blog/lang/en_english.ini create mode 100644 inc/modules/blog/lang/pl_polski.ini create mode 100644 inc/modules/blog/view/admin/form.html create mode 100644 inc/modules/blog/view/admin/manage.html create mode 100644 inc/modules/blog/view/admin/settings.html create mode 100644 inc/modules/blog/view/disqus.html create mode 100644 inc/modules/blog/view/feed.xml create mode 100644 inc/modules/carousel/Info.php create mode 100644 inc/modules/carousel/ReadMe.md create mode 100644 inc/modules/carousel/Site.php create mode 100644 inc/modules/carousel/lang/admin/en_english.ini create mode 100644 inc/modules/carousel/lang/admin/pl_polski.ini create mode 100644 inc/modules/carousel/view/carousel.html create mode 100644 inc/modules/contact/Admin.php create mode 100644 inc/modules/contact/Info.php create mode 100644 inc/modules/contact/Site.php create mode 100644 inc/modules/contact/lang/admin/en_english.ini create mode 100644 inc/modules/contact/lang/admin/pl_polski.ini create mode 100644 inc/modules/contact/lang/en_english.ini create mode 100644 inc/modules/contact/lang/pl_polski.ini create mode 100644 inc/modules/contact/view/admin/settings.html create mode 100644 inc/modules/contact/view/form.html create mode 100644 inc/modules/contact/view/mail.html create mode 100644 inc/modules/dashboard/Admin.php create mode 100644 inc/modules/dashboard/Info.php create mode 100644 inc/modules/dashboard/css/style.css create mode 100644 inc/modules/dashboard/lang/admin/en_english.ini create mode 100644 inc/modules/dashboard/lang/admin/pl_polski.ini create mode 100644 inc/modules/dashboard/view/admin/dashboard.html create mode 100644 inc/modules/devbar/Admin.php create mode 100644 inc/modules/devbar/Dump.php create mode 100644 inc/modules/devbar/Info.php create mode 100644 inc/modules/devbar/ReadMe.md create mode 100644 inc/modules/devbar/Site.php create mode 100644 inc/modules/devbar/css/style.css create mode 100644 inc/modules/devbar/css/style.less create mode 100644 inc/modules/devbar/functions.php create mode 100644 inc/modules/devbar/view/bar.html create mode 100644 inc/modules/galleries/Admin.php create mode 100644 inc/modules/galleries/Info.php create mode 100644 inc/modules/galleries/Site.php create mode 100644 inc/modules/galleries/lang/admin/en_english.ini create mode 100644 inc/modules/galleries/lang/admin/pl_polski.ini create mode 100644 inc/modules/galleries/view/admin/edit.html create mode 100644 inc/modules/galleries/view/admin/manage.html create mode 100644 inc/modules/galleries/view/gallery.html create mode 100644 inc/modules/langswitcher/Info.php create mode 100644 inc/modules/langswitcher/ReadMe.md create mode 100644 inc/modules/langswitcher/Site.php create mode 100644 inc/modules/langswitcher/lang/admin/en_english.ini create mode 100644 inc/modules/langswitcher/lang/admin/pl_polski.ini create mode 100644 inc/modules/langswitcher/view/switcher.html create mode 100644 inc/modules/modules/Admin.php create mode 100644 inc/modules/modules/Info.php create mode 100644 inc/modules/modules/lang/admin/en_english.ini create mode 100644 inc/modules/modules/lang/admin/pl_polski.ini create mode 100644 inc/modules/modules/view/admin/details.html create mode 100644 inc/modules/modules/view/admin/manage.html create mode 100644 inc/modules/modules/view/admin/upload.html create mode 100644 inc/modules/navigation/Admin.php create mode 100644 inc/modules/navigation/Info.php create mode 100644 inc/modules/navigation/Site.php create mode 100644 inc/modules/navigation/lang/admin/en_english.ini create mode 100644 inc/modules/navigation/lang/admin/pl_polski.ini create mode 100644 inc/modules/navigation/view/admin/form.link.html create mode 100644 inc/modules/navigation/view/admin/form.nav.html create mode 100644 inc/modules/navigation/view/admin/manage.html create mode 100644 inc/modules/navigation/view/nav.html create mode 100644 inc/modules/pages/Admin.php create mode 100644 inc/modules/pages/Info.php create mode 100644 inc/modules/pages/ReadMe.md create mode 100644 inc/modules/pages/Site.php create mode 100644 inc/modules/pages/js/admin/pages.js create mode 100644 inc/modules/pages/lang/admin/en_english.ini create mode 100644 inc/modules/pages/lang/admin/pl_polski.ini create mode 100644 inc/modules/pages/lang/en_english.ini create mode 100644 inc/modules/pages/lang/pl_polski.ini create mode 100644 inc/modules/pages/view/admin/form.html create mode 100644 inc/modules/pages/view/admin/manage.html create mode 100644 inc/modules/sample/Admin.php create mode 100644 inc/modules/sample/Info.php create mode 100644 inc/modules/sample/Site.php create mode 100644 inc/modules/sample/lang/admin/en_english.ini create mode 100644 inc/modules/sample/lang/admin/pl_polski.ini create mode 100644 inc/modules/sample/lang/en_english.ini create mode 100644 inc/modules/sample/lang/pl_polski.ini create mode 100644 inc/modules/sample/view/admin/index.html create mode 100644 inc/modules/sample/view/hello.html create mode 100644 inc/modules/searchbox/Info.php create mode 100644 inc/modules/searchbox/ReadMe.md create mode 100644 inc/modules/searchbox/Site.php create mode 100644 inc/modules/searchbox/lang/admin/en_english.ini create mode 100644 inc/modules/searchbox/lang/admin/pl_polski.ini create mode 100644 inc/modules/searchbox/lang/en_english.ini create mode 100644 inc/modules/searchbox/lang/pl_polski.ini create mode 100644 inc/modules/searchbox/view/input.html create mode 100644 inc/modules/searchbox/view/results.html create mode 100644 inc/modules/settings/Admin.php create mode 100644 inc/modules/settings/Info.php create mode 100644 inc/modules/settings/ReadMe.md create mode 100644 inc/modules/settings/Site.php create mode 100644 inc/modules/settings/css/admin/settings.css create mode 100644 inc/modules/settings/inc/RecursiveDotFilterIterator.php create mode 100644 inc/modules/settings/lang/admin/en_english.ini create mode 100644 inc/modules/settings/lang/admin/pl_polski.ini create mode 100644 inc/modules/settings/view/admin/general.html create mode 100644 inc/modules/settings/view/admin/theme.html create mode 100644 inc/modules/settings/view/admin/themes.html create mode 100644 inc/modules/settings/view/admin/translation.html create mode 100644 inc/modules/settings/view/admin/update.html create mode 100644 inc/modules/sitemap/Info.php create mode 100644 inc/modules/sitemap/ReadMe.md create mode 100644 inc/modules/sitemap/Site.php create mode 100644 inc/modules/sitemap/lang/admin/en_english.ini create mode 100644 inc/modules/sitemap/lang/admin/pl_polski.ini create mode 100644 inc/modules/sitemap/view/sitemap.xml create mode 100644 inc/modules/snippets/Admin.php create mode 100644 inc/modules/snippets/Info.php create mode 100644 inc/modules/snippets/Site.php create mode 100644 inc/modules/snippets/js/admin/snippets.js create mode 100644 inc/modules/snippets/lang/admin/en_english.ini create mode 100644 inc/modules/snippets/lang/admin/pl_polski.ini create mode 100644 inc/modules/snippets/view/admin/form.html create mode 100644 inc/modules/snippets/view/admin/manage.html create mode 100644 inc/modules/statistics/Admin.php create mode 100644 inc/modules/statistics/DB.php create mode 100644 inc/modules/statistics/Info.php create mode 100644 inc/modules/statistics/Site.php create mode 100644 inc/modules/statistics/assets/css/style.css create mode 100644 inc/modules/statistics/assets/js/Chart.bundle.min.js create mode 100644 inc/modules/statistics/assets/js/app.js create mode 100644 inc/modules/statistics/lang/admin/en_english.ini create mode 100644 inc/modules/statistics/lang/admin/pl_polski.ini create mode 100644 inc/modules/statistics/phpbrowserdetector/AcceptLanguage.php create mode 100644 inc/modules/statistics/phpbrowserdetector/Browser.php create mode 100644 inc/modules/statistics/phpbrowserdetector/BrowserDetector.php create mode 100644 inc/modules/statistics/phpbrowserdetector/DetectorInterface.php create mode 100644 inc/modules/statistics/phpbrowserdetector/Device.php create mode 100644 inc/modules/statistics/phpbrowserdetector/DeviceDetector.php create mode 100644 inc/modules/statistics/phpbrowserdetector/InvalidArgumentException.php create mode 100644 inc/modules/statistics/phpbrowserdetector/Language.php create mode 100644 inc/modules/statistics/phpbrowserdetector/LanguageDetector.php create mode 100644 inc/modules/statistics/phpbrowserdetector/Os.php create mode 100644 inc/modules/statistics/phpbrowserdetector/OsDetector.php create mode 100644 inc/modules/statistics/phpbrowserdetector/UserAgent.php create mode 100644 inc/modules/statistics/src/Chart.php create mode 100644 inc/modules/statistics/src/Statistics.php create mode 100644 inc/modules/statistics/view/admin/dashboard.html create mode 100644 inc/modules/statistics/view/admin/pages.html create mode 100644 inc/modules/statistics/view/admin/referrer.html create mode 100644 inc/modules/statistics/view/admin/referrers.html create mode 100644 inc/modules/statistics/view/admin/url.html create mode 100644 inc/modules/users/Admin.php create mode 100644 inc/modules/users/Info.php create mode 100644 inc/modules/users/Site.php create mode 100644 inc/modules/users/img/default.png create mode 100644 inc/modules/users/lang/admin/en_english.ini create mode 100644 inc/modules/users/lang/admin/pl_polski.ini create mode 100644 inc/modules/users/view/admin/form.html create mode 100644 inc/modules/users/view/admin/manage.html create mode 100644 index.php create mode 100644 themes/admin/css/style.css create mode 100644 themes/admin/img/logo.svg create mode 100644 themes/admin/img/unknown_theme.png create mode 100644 themes/admin/index.html create mode 100644 themes/admin/js/kalypto.min.js create mode 100644 themes/admin/js/scripts.js create mode 100644 themes/admin/js/selectator.min.js create mode 100644 themes/admin/login.html create mode 100644 themes/batblog/blog.html create mode 100644 themes/batblog/css/style.css create mode 100644 themes/batblog/img/default-bg.jpg create mode 100644 themes/batblog/img/profile.jpg create mode 100644 themes/batblog/inc/footer.html create mode 100644 themes/batblog/inc/header.html create mode 100644 themes/batblog/inc/sidebar.html create mode 100644 themes/batblog/index.html create mode 100644 themes/batblog/js/theme.js create mode 100644 themes/batblog/manifest.json create mode 100644 themes/batblog/post.html create mode 100644 themes/batblog/preview.png create mode 100644 themes/default/blog.html create mode 100644 themes/default/css/style.css create mode 100644 themes/default/img/default-bg.jpg create mode 100644 themes/default/inc/footer.html create mode 100644 themes/default/inc/header.html create mode 100644 themes/default/index.html create mode 100644 themes/default/js/theme.js create mode 100644 themes/default/manifest.json create mode 100644 themes/default/post.html create mode 100644 themes/default/preview.png create mode 100644 upgrade.php create mode 100644 uploads/.htaccess create mode 100644 uploads/index.html diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..e04fec1 --- /dev/null +++ b/.htaccess @@ -0,0 +1,23 @@ +# Prevent directory listings +Options -Indexes + +# Prevent visitors from viewing files directly + + + Order allow,deny + Deny from all + Satisfy All + + + Require all denied + + + +# URL rewrites + + RewriteEngine On + RewriteRule ^(inc/|themes/|tmp/).*\.(php|html)$ - [F,L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^ index.php [L] + \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..1eef15b --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,99 @@ +Batflat Freeware License + +1. Preamble + +This License applies to the computer program which with this licence is distributed (now +the "Program"). The Program is intellectual property of Paweł Klockiewicz and +Wojciech Król (the "Authors") and is placed under the protection of copyright laws, +including Polish legislation and international treaties such as the Berne Convention. + +Please note that this License is not a free software licence as defined by the Free +Software Foundation. Usage of the software covered by this licence is allowed free of +charge, but its COMMERCIAL DISTRIBUTION IS PROHIBITED. While the authors of this software +support the open-source philosophy and also distributes other GPL-licenced software, this +licence states that no profit could be made by third parties from the covered software. + +BY USING OR DISTRIBUTING THE PROGRAM (OR ANY WORK BASED ON THE PROGRAM), YOU INDICATE YOUR +ACCEPTANCE OF THIS LICENSE TO DO SO, AND ALL ITS TERMS AND CONDITIONS FOR USING AND +DISTRIBUTING THE PROGRAM OR WORKS BASED ON IT. NOTHING OTHER THAN THIS LICENSE GRANTS YOU +PERMISSION TO DISTRIBUTE THE PROGRAM OR ITS DERIVATIVE WORKS. THESE ACTIONS ARE PROHIBITED +BY LAW. IF YOU DO NOT ACCEPT THESE TERMS AND CONDITIONS, DO NOT DISTRIBUTE THE PROGRAM. + +2. Licenses + +Licensor hereby grants you the following rights, provided that you comply with all of the +restrictions set forth in this License and provided, further, that you distribute an +unmodified copy of this License with the Program: + + (a) Permission is granted to use the Program for non-commercial, non-military + purposes. + + (b) You may copy and distribute literal (i.e. verbatim) copies of the Program as you + receive it throughout the world, in any medium. + + (c) You may create works based on the Program and distribute copies of such throughout + the world, in any medium. + +3. Restrictions + +This license is subject to the following restrictions: + + (a) The Program may not be used for commercial or milatary purposes. + + (b) Every disribution of the Program must retain a copy of this Licence. + + (c) The Program may not be sold or incorporated into any product which is sold without + prior permission from the Authors. Distribution of the Program or any work based on the + Program by a commercial organization to any third party without permission is prohibited + if any payment is made in connection with such distribution, whether directly (as in + payment for a copy of the Program) or indirectly (as in payment for some service related + to the Program, or payment for some product or service that includes a copy of the Program + "without charge"). + + (d) The Program, especially the name of the Program, logo, a backlink to the official + website and the names of the Authors must remain unmodified. + + (e) Any output produced through the use of the Program, or derived from, is subject to + this license, i.e. content made by running the Program may be freely distributed provided + that no direct or indirect payment is required by the distributor in exchange of this + content. Distribution of produced content must also follow the rules that may govern + distribution and exploitation of the input material and/or the software that generated. + + (f) You must meet all of the following conditions with respect to any work that you + distribute or publish that in whole or in part contains or is derived from the Program + (the "Work"): + + (i) You must cause the Work to be licensed as a whole and at no charge to all + third parties under the terms of this License; + + (ii) If the Work normally reads commands interactively when run, you must cause + it, at each time the Work commences operation, to print or display an announcement + including an appropriate copyright notice. Such notice must also state that users may + redistribute the Work only under the conditions of this License and tell the user how + to view the copy of this License included with the Work; + + (iii) If you distribute any written or printed material at all with the Work, such + material must include either a written copy of this License, or a prominent written + indication that the Work is covered by this License and written instructions for + printing and/or displaying the copy of the License on the distribution medium; + + (iv) You may not impose any further restrictions on the recipient's exercise of + the rights granted herein. + +4. Reservation of Rights + +No rights are granted to the Program except as expressly set forth herein. You may not +copy, modify, sublicense, or distribute the Program except as expressly provided under +this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program +is void, and will automatically terminate your rights under this License. However, parties +who have received copies, or rights, from you under this License will not have their +licenses terminated so long as such parties remain in full compliance. + +5. Limitations + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/ReadMe.md b/ReadMe.md index d6715cf..276c441 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,7 +1,15 @@ Batflat ======= -This repository is used to report bugs and to list available languages, themes and modules. To download the CMS go to the project page. +Batflat was created as a lightweight alternative to heavy and outdated CMS'. Many people use complex solutions for simple pages, unnecessarily. Building this content management system, we focused on simplicity - even novice webmaster adapt his template and writes his own module. To achieve this, we implemented a simple template system and trivial application architecture. + +Batflat does not require MySQL database, because all the data are collected in a single file. This provides perfect portability when changing your hosting provider. Just copy all the files from one account to another. That's all. There's nothing to configure or to change. However, if you SQLite does not meet your requirements, you can quickly change the database type thanks to PDO. + +What's more, Batflat does not have installation wizard, because there is no such need. Right after uploading a package to an FTP server, Batflat is ready for action! Therefore, the installation process takes as much time as it takes to transfer files ;-) + +Each page can have it's own individual name and URL, that makes Batflat SEO friendly. Your site may be available in multiple languages. Currently Bootflat supports translation to Polish, English, French, Turkish, Swedish, Italian and Russian. + +Control panel and the default template is fully responsive, which makes it accessible from any mobile device, even on the phone thanks to used CSS framework - Bootstrap. Each of our module is adapted to it. ## Project page diff --git a/admin/.htaccess b/admin/.htaccess new file mode 100644 index 0000000..f8b0d81 --- /dev/null +++ b/admin/.htaccess @@ -0,0 +1,10 @@ +# Prevent directory listings +Options -Indexes + +# URL rewrites + + RewriteEngine On + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^ index.php [L] + \ No newline at end of file diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..c65eddd --- /dev/null +++ b/admin/index.php @@ -0,0 +1,58 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +ob_start(); +header('Content-Type:text/html;charset=utf-8'); +define('BASE_DIR', __DIR__.'/..'); +require_once('../inc/core/defines.php'); + +if (DEV_MODE) { + error_reporting(E_ALL); + ini_set('display_errors', 1); +} else { + error_reporting(0); +} + +require_once('../inc/core/lib/Autoloader.php'); + +// Admin core init +$core = new Inc\Core\Admin; + +if ($core->loginCheck()) { + $core->loadModules(); + + // Modules routing + $core->router->set('(:str)/(:str)(:any)', function ($module, $method, $params) use ($core) { + $core->createNav($module, $method); + if ($params) { + $core->loadModule($module, $method, explode('/', trim($params, '/'))); + } else { + $core->loadModule($module, $method); + } + }); + + $core->router->execute(); + $core->drawTheme('index.html'); + $core->module->finishLoop(); +} else { + if (isset($_POST['login'])) { + if ($core->login($_POST['username'], $_POST['password'], isset($_POST['remember_me']))) { + if (count($arrayURL = parseURL()) > 1) { + $url = array_merge([ADMIN], $arrayURL); + redirect(url($url)); + } + redirect(url([ADMIN, 'dashboard', 'main'])); + } + } + $core->drawTheme('login.html'); +} + +ob_end_flush(); diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..10bb3c3f03c760d9f3a1c2a342102d909f4a0584 GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lFaYJyfzaOX|AqGbAPc>!ztY4yP_J5h^!vCVPPhzMOop<)XbX@6w z$+Bq(Ib{2Hef}@J`4!wwoPOH+`o9oREm$5|KRIDQMg0=B^Z!fK%>6IcxBb7!!VCX} z*FX6$wCybz3$K6tUv$BFpxn0q64i76OVlnvalhEq1OFA3l>aL!DZ#NKkd2H{<&^)6 zO*;q!pv3F&?Z|i%#2YQ5$EKD1$ucv GDjxv;_59HQ literal 0 HcmV?d00001 diff --git a/inc/core/Admin.php b/inc/core/Admin.php new file mode 100644 index 0000000..8081fe2 --- /dev/null +++ b/inc/core/Admin.php @@ -0,0 +1,352 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core; + +/** + * Core Admin class + */ +class Admin extends Main +{ + /** + * Assigned variables for templates + * + * @var array + */ + private $assign = []; + + /** + * Registered module pages + * + * @var array + */ + private $registerPage = []; + + /** + * Instance of Modules Collection + * + * @var \Inc\Core\Lib\ModulesCollection + */ + public $module = null; + + /** + * Admin constructor + */ + public function __construct() + { + parent::__construct(); + + $this->router->set('logout', function () { + $this->logout(); + }); + $this->loadLanguage($this->settings->get('settings.lang_admin')); + } + + /** + * set variables to template core and display them + * @param string $file + * @return void + */ + public function drawTheme($file) + { + $username = $this->getUserInfo('fullname'); + + $this->assign['username'] = !empty($username) ? $username : $this->getUserInfo('username'); + $this->assign['notify'] = $this->getNotify(); + $this->assign['path'] = url(); + $this->assign['version'] = $this->settings->get('settings.version'); + $this->assign['has_update'] = $this->module ? $this->module->settings->_checkUpdate() : false; + + $this->assign['header'] = isset_or($this->appends['header'], ['']); + $this->assign['footer'] = isset_or($this->appends['footer'], ['']); + + $this->tpl->set('bat', $this->assign); + echo $this->tpl->draw(THEMES.'/admin/'.$file, true); + } + + /** + * load language files + * @param string $lang + * @return void + */ + private function loadLanguage($language) + { + $this->lang['name'] = $language; + + foreach (glob(MODULES.'/*/lang/admin/'.$language.'.ini') as $file) { + $base = str_replace($language, 'en_english', $file); + $module = str_replace([MODULES.'/', '/lang/admin/'.$language.'.ini'], null, $file); + $this->lang[$module] = array_merge(parse_ini_file($base), parse_ini_file($file)); + } + + foreach (glob('../inc/lang/'.$language.'/admin/*.ini') as $glob) { + $base = str_replace($language, 'en_english', $glob); + $file = pathinfo($glob); + $this->lang[$file['filename']] = array_merge(parse_ini_file($base), parse_ini_file($glob)); + } + $this->tpl->set('lang', $this->lang); + } + + /** + * load module and set variables + * @param string $name + * @param string $feature + * @param array $params (optional) + * @return void + */ + public function loadModule($name, $method, $params = []) + { + $row = $this->module->{$name}; + + if ($row && ($details = $this->getModuleInfo($name))) { + if (($this->getUserInfo('access') == 'all') || in_array($name, explode(',', $this->getUserInfo('access')))) { + $anyMethod = 'any'.ucfirst($method); + $method = strtolower($_SERVER['REQUEST_METHOD']).ucfirst($method); + + if (method_exists($this->module->{$name}, $method)) { + $details['content'] = call_user_func_array([$this->module->{$name}, $method], array_values($params)); + } elseif (method_exists($this->module->{$name}, $anyMethod)) { + $details['content'] = call_user_func_array([$this->module->{$name}, $anyMethod], array_values($params)); + } else { + http_response_code(404); + $this->setNotify('failure', "[@{$method}] ".$this->lang['general']['unknown_method']); + $details['content'] = null; + } + + $this->tpl->set('module', $details); + } else { + exit; + } + } else { + exit; + } + } + + /** + * create list of modules + * @param string $activeModile + * @param string $activeFeature + * @return void + */ + public function createNav($activeModule, $activeMethod) + { + $nav = []; + $modules = $this->module->getArray(); + + if ($this->getUserInfo('access') != 'all') { + $modules = array_intersect_key($modules, array_fill_keys(explode(',', $this->getUserInfo('access')), null)); + } + + foreach ($modules as $dir => $module) { + $subnav = $this->getModuleNav($dir); + $details = $this->getModuleInfo($dir); + + if (isset($details['pages'])) { + foreach ($details['pages'] as $pageName => $pageSlug) { + $this->registerPage($pageName, $pageSlug); + } + } + if ($subnav) { + if ($activeModule == $dir) { + $activeElement = 'active'; + } else { + $activeElement = null; + } + + $subnavURLs = []; + foreach ($subnav as $key => $val) { + if (($activeModule == $dir) && isset($activeMethod) && ($activeMethod == $val)) { + $activeSubElement = 'active'; + } else { + $activeSubElement = null; + } + + $subnavURLs[] = [ + 'name' => $key, + 'url' => url([ADMIN, $dir, $val]), + 'active' => $activeSubElement, + ]; + } + + if (count($subnavURLs) == 1) { + $moduleURL = $subnavURLs[0]['url']; + $subnavURLs = []; + } else { + $moduleURL = '#'; + } + + $nav[] = [ + 'dir' => $dir, + 'name' => $details['name'], + 'icon' => $details['icon'], + 'url' => $moduleURL, + 'active' => $activeElement, + 'subnav' => $subnavURLs, + ]; + } + } + $this->assign['nav'] = $nav; + } + + /** + * get module informations + * @param string $dir + * @return array + */ + public function getModuleInfo($dir) + { + $file = MODULES.'/'.$dir.'/Info.php'; + $core = $this; + + if (file_exists($file)) { + return include($file); + } else { + return false; + } + } + + /** + * get module's methods + * @param string $dir + * @return array + */ + public function getModuleNav($dir) + { + if ($this->module->has($dir)) { + return $this->module->{$dir}->navigation(); + } + + return false; + } + + /** + * get module method + * @param string $dir + * @param string $feature + * @param array $params (optional) + * @return array + */ + public function getModuleMethod($name, $method, $params = []) + { + if (method_exists($this->module->{$name}, $method)) { + return call_user_func_array([$this->module->{$name}, $method], array_values($params)); + } + + $this->setNotify('failure', $this->lang['general']['unknown_method']); + return false; + } + + /** + * user login + * @param string $username + * @param string $password + * @return bool + */ + public function login($username, $password, $remember_me = false) + { + // Check attempt + $attempt = $this->db('login_attempts')->where('ip', $_SERVER['REMOTE_ADDR'])->oneArray(); + + // Create attempt if does not exist + if (!$attempt) { + $this->db('login_attempts')->save(['ip' => $_SERVER['REMOTE_ADDR'], 'attempts' => 0]); + $attempt = ['ip' => $_SERVER['REMOTE_ADDR'], 'attempts' => 0, 'expires' => 0]; + } else { + $attempt['attempts'] = intval($attempt['attempts']); + $attempt['expires'] = intval($attempt['expires']); + } + + // Is IP blocked? + if ((time() - $attempt['expires']) < 0) { + $this->setNotify('failure', sprintf($this->lang['general']['login_attempts'], ceil(($attempt['expires']-time())/60))); + return false; + } + + $row = $this->db('users')->where('username', $username)->oneArray(); + + if (count($row) && password_verify(trim($password), $row['password'])) { + // Reset fail attempts for this IP + $this->db('login_attempts')->where('ip', $_SERVER['REMOTE_ADDR'])->save(['attempts' => 0]); + + $_SESSION['bat_user'] = $row['id']; + $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(6)); + $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT']; + $_SESSION['IPaddress'] = $_SERVER['REMOTE_ADDR']; + + if ($remember_me) { + $token = str_gen(64, "1234567890qwertyuiop[]asdfghjkl;zxcvbnm,./"); + + $this->db('remember_me')->save(['user_id' => $row['id'], 'token' => $token, 'expiry' => time()+60*60*24*30]); + + setcookie('batflat_remember', $row['id'].':'.$token, time()+60*60*24*365, '/'); + } + return true; + } else { + // Increase attempt + $this->db('login_attempts')->where('ip', $_SERVER['REMOTE_ADDR'])->save(['attempts' => $attempt['attempts']+1]); + $attempt['attempts'] += 1; + + // ... and block if reached maximum attempts + if ($attempt['attempts'] % 3 == 0) { + $this->db('login_attempts')->where('ip', $_SERVER['REMOTE_ADDR'])->save(['expires' => strtotime("+10 minutes")]); + $attempt['expires'] = strtotime("+10 minutes"); + + $this->setNotify('failure', sprintf($this->lang['general']['login_attempts'], ceil(($attempt['expires']-time())/60))); + } else { + $this->setNotify('failure', $this->lang['general']['login_failure']); + } + + return false; + } + } + + /** + * user logout + * @return void + */ + private function logout() + { + $_SESSION = []; + + // Delete remember_me token from database and cookie + if (isset($_COOKIE['batflat_remember'])) { + $token = explode(':', $_COOKIE['batflat_remember']); + $this->db('remember_me')->where('user_id', $token[0])->where('token', $token[1])->delete(); + setcookie('batflat_remember', null, -1, '/'); + } + + session_unset(); + session_destroy(); + redirect(url(ADMIN.'/')); + } + + /** + * Register module page + * + * @param string $name + * @param string $path + * @return void + */ + private function registerPage($name, $path) + { + $this->registerPage[] = ['id' => null, 'title' => $name, 'slug' => $path]; + } + + /** + * Get registered pages + * + * @return array + */ + public function getRegisteredPages() + { + return $this->registerPage; + } +} diff --git a/inc/core/AdminModule.php b/inc/core/AdminModule.php new file mode 100644 index 0000000..94b4073 --- /dev/null +++ b/inc/core/AdminModule.php @@ -0,0 +1,28 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core; + +/** + * Admin class for administration panel + */ +abstract class AdminModule extends BaseModule +{ + /** + * Module navigation + * + * @return array + */ + public function navigation() + { + return []; + } +} diff --git a/inc/core/BaseModule.php b/inc/core/BaseModule.php new file mode 100644 index 0000000..94b98f3 --- /dev/null +++ b/inc/core/BaseModule.php @@ -0,0 +1,203 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core; + +/** + * Base class for each module functionality + */ +class BaseModule +{ + /** + * Reference to Core instance + * + * @var \Inc\Core\Main + */ + protected $core; + + /** + * Reference to Template instance + * + * @var \Inc\Core\Lib\Templates + */ + protected $tpl; + + /** + * Reference to Router instance + * + * @var \Inc\Core\Lib\Router + */ + protected $route; + + /** + * Reference to Settings instance + * + * @var \Inc\Core\Lib\Settings + */ + protected $settings; + + /** + * Module dir name + * + * @var string + */ + protected $name; + + /** + * Reference to language array + * + * @var array + */ + protected $lang; + + /** + * Module constructor + * + * @param Inc\Core\Main $core + * @return void + */ + public function __construct(Main $core) + { + $this->core = $core; + $this->tpl = $core->tpl; + $this->router = $core->router; + $this->settings = $core->settings; + $this->lang = $core->lang; + $this->name = strtolower(str_replace(['Inc\Modules\\', '\\Admin', '\\Site'], null, static::class)); + } + + /** + * Module initialization + * + * @return void + */ + public function init() + { + } + + /** + * Procedures before destroy + * + * @return void + */ + public function finish() + { + } + + /** + * Languages list + * @param string $selected + * @param string $active ('active' or 'selected') + * @return array + */ + protected function _getLanguages($selected = null, $active = 'active') + { + $langs = glob(BASE_DIR.'/inc/lang/*', GLOB_ONLYDIR); + + $result = []; + foreach ($langs as $lang) { + if ($selected == basename($lang)) { + $attr = $active; + } else { + $attr = null; + } + $result[] = ['name' => basename($lang), 'attr' => $attr]; + } + return $result; + } + + /** + * Hook to draw template with set variables + * + * @param string $file + * @param array $variables + * @return string + */ + protected function draw($file, array $variables = []) + { + if (!empty($variables)) { + foreach ($variables as $key => $value) { + $this->tpl->set($key, $value); + } + } + + if (strpos($file, BASE_DIR) !== 0) { + if ($this instanceof AdminModule) { + $file = MODULES.'/'.$this->name.'/view/admin/'.$file; + } else { + $file = MODULES.'/'.$this->name.'/view/'.$file; + } + } + + return $this->tpl->draw($file); + } + + /** + * Get current module language value + * + * @param string $key + * @param string $module + * @return string + */ + protected function lang($key, $module = null) + { + if (empty($module)) { + $module = $this->name; + } + + return isset_or($this->lang[$module][$key], null); + } + + /** + * Get or set module settings + * + * @param string $module Example 'module' or shorter 'module.field' + * @param mixed $field If module has field it contains value + * @param mixed $value OPTIONAL + * @return mixed + */ + protected function settings($module, $field = false, $value = false) + { + if (substr_count($module, '.') == 1) { + $value = $field; + list($module, $field) = explode('.', $module); + } + + if ($value === false) { + return $this->settings->get($module, $field); + } else { + return $this->settings->set($module, $field, $value); + } + } + + /** + * Database QueryBuilder + * + * @param string $table + * @return \Inc\Core\Lib\QueryBuilder + */ + protected function db($table = null) + { + return $this->core->db($table); + } + + /** + * Create notification + * @param string $type ('success' or 'failure') + * @param string $text + * @param mixed $args [, mixed $... ]] + * @return void + */ + protected function notify() + { + call_user_func_array([$this->core, 'setNotify'], func_get_args()); + } +} diff --git a/inc/core/Main.php b/inc/core/Main.php new file mode 100644 index 0000000..512ee69 --- /dev/null +++ b/inc/core/Main.php @@ -0,0 +1,379 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core; + +use Inc\Core\Lib\QueryBuilder; +use Inc\Core\Lib\Templates; +use Inc\Core\Lib\Router; +use Inc\Core\Lib\Settings; +use Inc\Core\Lib\License; + +/** + * Base for core classes + */ +abstract class Main +{ + /** + * Language array + * + * @var array + */ + public $lang = []; + + /** + * Templates instance + * + * @var Templates + */ + public $tpl; + + /** + * Router instance + * + * @var Router + */ + public $router; + + /** + * Settings instance + * + * @var Settings + */ + public $settings; + + /** + * List of additional header or footer content + * + * @var array + */ + public $appends = []; + + /** + * Reference to ModulesCollection + * + * @var \Inc\Core\Lib\ModulesCollection|null + */ + public $module = null; + + /** + * Settings cache + * + * @var array + */ + protected static $settingsCache = []; + + /** + * User cache + * + * @var array + */ + protected static $userCache = []; + + /** + * Main constructor + */ + public function __construct() + { + $this->setSession(); + + $dbFile = BASE_DIR.'/inc/data/database.sdb'; + + if (file_exists($dbFile)) { + QueryBuilder::connect("sqlite:{$dbFile}"); + } else { + $this->freshInstall($dbFile); + } + + $this->settings = new Settings($this); + date_default_timezone_set($this->settings->get('settings.timezone')); + + $this->tpl = new Templates($this); + $this->router = new Router; + + $this->append(base64_decode('PG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJCYXRmbGF0IiAvPg=='), 'header'); + } + + /** + * New instance of QueryBuilder + * + * @param string $table + * @return QueryBuilder + */ + public function db($table = null) + { + return new QueryBuilder($table); + } + + /** + * get module settings + * @param string $module + * @param string $field + * @param bool $refresh + * + * @deprecated + * + * @return string or array + */ + public function getSettings($module = 'settings', $field = null, $refresh = false) + { + if ($refresh) { + $this->settings->reload(); + } + + return $this->settings->get($module, $field); + } + + /** + * Set module settings value + * + * @param string $module + * @param string $field + * @param string $value + * + * @deprecated + * + * @return bool + */ + public function setSettings($module, $field, $value) + { + return $this->settings->set($module, $field, $value); + } + + /** + * safe session + * @return void + */ + private function setSession() + { + ini_set('session.use_only_cookies', 1); + session_name('bat'); + session_start(); + } + + /** + * create notification + * @param string $type ('success' or 'failure') + * @param string $text + * @param mixed $args [, mixed $... ]] + * @return void + */ + public function setNotify($type, $text, $args = null) + { + $variables = []; + $numargs = func_num_args(); + $arguments = func_get_args(); + + if ($numargs > 1) { + for ($i = 1; $i < $numargs; $i++) { + $variables[] = $arguments[$i]; + } + $text = call_user_func_array('sprintf', $variables); + $_SESSION[$arguments[0]] = $text; + } + } + + /** + * display notification + * @return array or false + */ + public function getNotify() + { + if (isset($_SESSION['failure'])) { + $result = ['text' => $_SESSION['failure'], 'type' => 'danger']; + unset($_SESSION['failure']); + return $result; + } elseif (isset($_SESSION['success'])) { + $result = ['text' => $_SESSION['success'], 'type' => 'success']; + unset($_SESSION['success']); + return $result; + } else { + return false; + } + } + + /** + * adds CSS URL to array + * @param string $path + * @return void + */ + public function addCSS($path) + { + $this->appends['header'][] = "\n"; + } + + /** + * adds JS URL to array + * @param string $path + * @param string $location (header / footer) + * @return void + */ + public function addJS($path, $location = 'header') + { + $this->appends[$location][] = "\n"; + } + + /** + * adds string to array + * @param string $string + * @param string $location (header / footer) + * @return void + */ + public function append($string, $location) + { + $this->appends[$location][] = $string."\n"; + } + + /** + * Batflat license verify + * By removing or modifing these procedures you break our license. + * + * @param string $buffer + * @return string + */ + public static function verifyLicense($buffer) + { + $core = isset_or($GLOBALS['core'], false); + if (!$core) { + return $buffer; + } + $checkBuffer = preg_replace('//', '', $buffer); + $isHTML = strpos(get_headers_list('Content-Type'), 'text/html') !== false; + $hasBacklink = strpos($checkBuffer, 'Powered by Batflat') !== false; + $hasHeader = get_headers_list('X-Created-By') === 'Batflat '; + $license = License::verify($core->settings->get('settings.license')); + if (($license == License::FREE) && $isHTML && (!$hasBacklink || !$hasHeader)) { + return 'Batflat license system
The return link has been deleted or modified.'; + } elseif ($license == License::TIME_OUT) { + return $buffer.''; + } elseif ($license == License::ERROR) { + return 'Batflat license system
The license is not valid. Please correct it or go to free version.'; + } + + return trim($buffer); + } + + /** + * chcec if user is login + * @return bool + */ + public function loginCheck() + { + if (isset($_SESSION['bat_user']) && isset($_SESSION['token']) && isset($_SESSION['userAgent']) && isset($_SESSION['IPaddress'])) { + if ($_SESSION['IPaddress'] != $_SERVER['REMOTE_ADDR']) { + return false; + } + if ($_SESSION['userAgent'] != $_SERVER['HTTP_USER_AGENT']) { + return false; + } + + if (empty(parseURL(1))) { + redirect(url([ADMIN, 'dashboard', 'main'])); + } elseif (!isset($_GET['t']) || ($_SESSION['token'] != @$_GET['t'])) { + return false; + } + + return true; + } elseif (isset($_COOKIE['batflat_remember'])) { + $token = explode(":", $_COOKIE['batflat_remember']); + if (count($token) == 2) { + $row = $this->db('users')->leftJoin('remember_me', 'remember_me.user_id = users.id')->where('users.id', $token[0])->where('remember_me.token', $token[1])->select(['users.*', 'remember_me.expiry', 'token_id' => 'remember_me.id'])->oneArray(); + + if ($row) { + if (time() - $row['expiry'] > 0) { + $this->db('remember_me')->delete(['id' => $row['token_id']]); + } else { + $_SESSION['bat_user'] = $row['id']; + $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(6)); + $_SESSION['userAgent'] = $_SERVER['HTTP_USER_AGENT']; + $_SESSION['IPaddress'] = $_SERVER['REMOTE_ADDR']; + + $this->db('remember_me')->where('remember_me.user_id', $token[0])->where('remember_me.token', $token[1])->save(['expiry' => time()+60*60*24*30]); + + if (strpos($_SERVER['SCRIPT_NAME'], '/'.ADMIN.'/') !== false) { + redirect(url([ADMIN, 'dashboard', 'main'])); + } + + return true; + } + } + } + setcookie('batflat_remember', null, -1, '/'); + } + + return false; + } + + /** + * get user informations + * @param string $filed + * @param int $id (optional) + * @return string + */ + public function getUserInfo($field, $id = null, $refresh = false) + { + if (!$id) { + $id = isset_or($_SESSION['bat_user'], 0); + } + + if (empty(self::$userCache) || $refresh) { + self::$userCache = $this->db('users')->where('id', $id)->oneArray(); + } + + return self::$userCache[$field]; + } + + /** + * Load installed modules + * + * @return void + */ + public function loadModules() + { + if ($this->module == null) { + $this->module = new Lib\ModulesCollection($this); + } + } + + /** + * Generating database with Batflat data + * @param string $dbFile path to Batflat SQLite database + * @return void + */ + private function freshInstall($dbFile) + { + QueryBuilder::connect("sqlite:{$dbFile}"); + $pdo = QueryBuilder::pdo(); + + $core = $this; + + $modules = unserialize(BASIC_MODULES); + foreach ($modules as $module) { + $file = MODULES.'/'.$module.'/Info.php'; + + if (file_exists($file)) { + $this->lang[$module] = parse_ini_file(MODULES.'/'.$module.'/lang/admin/en_english.ini'); + + $info = include($file); + if (isset($info['install'])) { + $info['install'](); + } + } + } + + foreach ($modules as $order => $name) { + $core->db('modules')->save(['dir' => $name, 'sequence' => $order]); + } + + + redirect(url()); + } +} diff --git a/inc/core/Site.php b/inc/core/Site.php new file mode 100644 index 0000000..a811e84 --- /dev/null +++ b/inc/core/Site.php @@ -0,0 +1,125 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core; + +/** + * Core Site class + */ +class Site extends Main +{ + /** + * Current site template file + * Does not use template if set to false + * + * @var mixed + */ + public $template = 'index.html'; + + /** + * Site constructor + */ + public function __construct() + { + parent::__construct(); + $this->loadLanguage(); + $this->loadModules(); + + $return = $this->router->execute(); + + if (is_string($this->template)) { + $this->drawTheme($this->template); + } elseif ($this->template === false) { + if (strpos(get_headers_list('Content-Type'), 'text/html') !== false) { + header("Content-type: text/plain"); + } + + echo $return; + } + + $this->module->finishLoop(); + } + + /** + * set variables to template core and display them + * @param string $file + * @return void + */ + private function drawTheme($file) + { + $assign = []; + $assign['notify'] = $this->getNotify(); + $assign['powered'] = 'Powered by Batflat'; + $assign['path'] = url(); + $assign['theme'] = url(THEMES.'/'.$this->settings->get('settings.theme')); + $assign['lang'] = $this->lang['name']; + + $assign['header'] = isset_or($this->appends['header'], ['']); + $assign['footer'] = isset_or($this->appends['footer'], ['']); + + $this->tpl->set('bat', $assign); + echo $this->tpl->draw(THEMES.'/'.$this->settings->get('settings.theme').'/'.$file, true); + } + + /** + * load files with language + * @param string $lang + * @return void + */ + public function loadLanguage($lang = null) + { + $this->lang = []; + + if ($lang != null && is_dir('inc/lang/'.$lang)) { + $_SESSION['lang'] = $lang; + } + + if (!isset($_SESSION['lang']) || !is_dir('inc/lang/'.$_SESSION['lang'])) { + $this->lang['name'] = $this->settings->get('settings.lang_site'); + $_SESSION['lang'] = $this->lang['name']; + } else { + $this->lang['name'] = $_SESSION['lang']; + } + + + foreach (glob(MODULES.'/*/lang/'.$this->lang['name'].'.ini') as $file) { + $base = str_replace($this->lang['name'], 'en_english', $file); + $module = str_replace([MODULES.'/', '/lang/'.$this->lang['name'].'.ini'], null, $file); + $this->lang[$module] = array_merge(parse_ini_file($base), parse_ini_file($file)); + } + foreach (glob('inc/lang/'.$this->lang['name'].'/*.ini') as $file) { + $base = str_replace($this->lang['name'], 'en_english', $file); + $pathInfo = pathinfo($file); + $this->lang[$pathInfo['filename']] = array_merge(parse_ini_file($base), parse_ini_file($file)); + } + + $this->tpl->set('lang', $this->lang); + } + + /** + * check if user is login + * @return bool + */ + public function loginCheck() + { + if (isset($_SESSION['bat_user']) && isset($_SESSION['token']) && isset($_SESSION['userAgent']) && isset($_SESSION['IPaddress'])) { + if ($_SESSION['IPaddress'] != $_SERVER['REMOTE_ADDR']) { + return false; + } + if ($_SESSION['userAgent'] != $_SERVER['HTTP_USER_AGENT']) { + return false; + } + return true; + } else { + return false; + } + } +} diff --git a/inc/core/SiteModule.php b/inc/core/SiteModule.php new file mode 100644 index 0000000..1d66f69 --- /dev/null +++ b/inc/core/SiteModule.php @@ -0,0 +1,57 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core; + +/** + * Site class for website's module controller + */ +abstract class SiteModule extends BaseModule +{ + /** + * Routes declarations for Site + * Moved from __construct() + * + * @return void + */ + public function routes() + { + } + + /** + * Set route + * + * @param string $pattern + * @param mixed $callback callable function or name of module method + * @return void + */ + protected function route($pattern, $callback) + { + if (is_callable($callback)) { + $this->core->router->set($pattern, $callback); + } else { + $this->core->router->set($pattern, function () use ($callback) { + return call_user_func_array([$this, $callback], func_get_args()); + }); + } + } + + /** + * Set site template + * + * @param string $file + * @return void + */ + protected function setTemplate($file) + { + $this->core->template = $file; + } +} diff --git a/inc/core/defines.php b/inc/core/defines.php new file mode 100644 index 0000000..d14d57b --- /dev/null +++ b/inc/core/defines.php @@ -0,0 +1,51 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + + if (!version_compare(PHP_VERSION, '5.5.0', '>=')) { + exit("Batflat requires at least PHP 5.5"); + } + + // Admin cat name + define('ADMIN', 'admin'); + + // Themes path + define('THEMES', BASE_DIR . '/themes'); + + // Modules path + define('MODULES', BASE_DIR . '/inc/modules'); + + // Uploads path + define('UPLOADS', BASE_DIR . '/uploads'); + + // Lock files + define('FILE_LOCK', false); + + // Basic modules + define('BASIC_MODULES', serialize([ + 8 => 'settings', + 0 => 'dashboard', + 2 => 'pages', + 3 => 'navigation', + 7 => 'users', + 1 => 'blog', + 4 => 'galleries', + 5 => 'snippets', + 6 => 'modules', + 9 => 'contact', + 10 => 'langswitcher', + 11 => 'devbar', + ])); + + // HTML beautifier + define('HTML_BEAUTY', false); + + // Developer mode + define('DEV_MODE', false); \ No newline at end of file diff --git a/inc/core/lib/Autoloader.php b/inc/core/lib/Autoloader.php new file mode 100644 index 0000000..ddc5f98 --- /dev/null +++ b/inc/core/lib/Autoloader.php @@ -0,0 +1,47 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +require_once('functions.php'); + +/** + * Batflat autoloader + */ +class Autoloader +{ + /** + * Autoload initialization + * + * @param string $className + * @return void + */ + public static function init($className) + { + // Convert directories to lowercase and process uppercase for class files + $className = explode('\\', $className); + $file = array_pop($className); + $file = strtolower(implode('/', $className)).'/'.$file.'.php'; + + if (strpos($_SERVER['SCRIPT_NAME'], '/'.ADMIN.'/') !== false) { + $file = '../'.$file; + } + if (is_readable($file)) { + require_once($file); + } + } +} + +header(gz64_decode("eNqL0HUuSk0sSU3Rdaq0UnBKLEnLSSxRsEmCMPTyi9LtANXtDCw")); +spl_autoload_register('Autoloader::init'); + +// Autoload vendors if exist +if (file_exists(BASE_DIR.'/vendor/autoload.php')) { + require_once(BASE_DIR.'/vendor/autoload.php'); +} diff --git a/inc/core/lib/Event.php b/inc/core/lib/Event.php new file mode 100644 index 0000000..5cbd924 --- /dev/null +++ b/inc/core/lib/Event.php @@ -0,0 +1,49 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * Events class + */ +class Event +{ + /** @var array */ + protected static $events = []; + + /** + * Add new event handler + * + * @param string $name + * @param callable $callback + * @return void + */ + public static function add($name, callable $callback) + { + static::$events[$name][] = $callback; + } + + /** + * Execute registered event handlers + * + * @param string $name + * @param array $params + * @return bool + */ + public static function call($name, array $params = []) + { + $return = true; + foreach (isset_or(static::$events[$name], []) as $value) { + $return = $return && (call_user_func_array($value, $params) !== false); + } + return $return; + } +} diff --git a/inc/core/lib/HttpRequest.php b/inc/core/lib/HttpRequest.php new file mode 100644 index 0000000..3db2ad8 --- /dev/null +++ b/inc/core/lib/HttpRequest.php @@ -0,0 +1,95 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * HttpRequest Class + */ +class HttpRequest +{ + /** + * Status of latest request + * + * @var string + */ + protected static $lastStatus = null; + + /** + * GET method request + * + * @param string $url + * @param array $datafields + * @param array $headers + * @return string Output + */ + public static function get($url, $datafields = [], $headers = []) + { + return self::request('GET', $url, $datafields, $headers); + } + + /** + * POST method request + * + * @param string $url + * @param array $datafields + * @param array $headers + * @return string Output + */ + public static function post($url, $datafields = [], $headers = []) + { + return self::request('POST', $url, $datafields, $headers); + } + + /** + * Get last request status + * + * @return string + */ + public static function getStatus() + { + return self::$lastStatus; + } + + /** + * Universal request method + * + * @param string $type GET, POST, PUT, DELETE, UPDATE + * @param string $url + * @param array $datafields + * @param array $headers + * @return string + */ + protected static function request($type, $url, $datafields, $headers) + { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $type); + + if (!empty($datafields)) { + curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($datafields)); + } + + if (!empty($headers)) { + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + } + + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0); + curl_setopt($ch, CURLOPT_TIMEOUT, 3); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + $output = curl_exec($ch); + self::$lastStatus = curl_error($ch); + curl_close($ch); + + return $output; + } +} diff --git a/inc/core/lib/Image.php b/inc/core/lib/Image.php new file mode 100644 index 0000000..98e72e8 --- /dev/null +++ b/inc/core/lib/Image.php @@ -0,0 +1,449 @@ + + * @link https://github.com/ushis/PHP-Image-Class + * @license DBAD License (http://philsturgeon.co.uk/code/dbad-license) + */ + +namespace Inc\Core\Lib; + +/** + * Image processor + */ +class Image +{ + + /** + * Image resource + * + * @var resource + * @access private + */ + private $image; + + /** + * Type of image + * + * @var string + * @access private + */ + private $type = 'png'; + + /** + * Width of the image in pixel + * + * @var integer + * @access private + */ + private $width; + + /** + * Height of the image in pixel + * + * @var integer + * @access private + */ + private $height; + + /** + * Return infos about the image + * + * @return array image infos + * @access public + */ + public function getInfos($what = null) + { + if ($what !== null && in_array($what, ['width', 'height', 'type'])) { + return $this->{$what}; + } + + return array( + 'width' => $this->width, + 'height' => $this->height, + 'type' => $this->type, + 'resource' => $this->image, + ); + } + + /** + * Get color in rgb + * + * @param string $hex Color in hexadecimal code + * @return array Color in rgb + * @access public + */ + private function hex2rgb($hex) + { + $hex = str_replace('#', '', $hex); + $hex = (preg_match('/^([a-fA-F0-9]{3})|([a-fA-F0-9]{6})$/', $hex)) ? $hex : '000'; + + switch (strlen($hex)) { + case 3: + $rgb['r'] = hexdec(substr($hex, 0, 1).substr($hex, 0, 1)); + $rgb['g'] = hexdec(substr($hex, 1, 1).substr($hex, 1, 1)); + $rgb['b'] = hexdec(substr($hex, 2, 1).substr($hex, 2, 1)); + break; + + case 6: + $rgb['r'] = hexdec(substr($hex, 0, 2)); + $rgb['g'] = hexdec(substr($hex, 2, 2)); + $rgb['b'] = hexdec(substr($hex, 4, 2)); + break; + } + + return $rgb; + } + + /** + * Creates image resource from file + * + * @param string $path Path to an image + * @return boolean true if resource was created + * @access public + */ + public function load($path) + { + if (empty($path)) { + return false; + } + + $file = @fopen($path, 'r'); + + if (!$file) { + return false; + } + + fclose($file); + $info = getimagesize($path); + + switch ($info[2]) { + case 1: + $this->image = imagecreatefromgif($path); + $this->type = 'gif'; + break; + + case 2: + $this->image = imagecreatefromjpeg($path); + $this->type = 'jpg'; + break; + + case 3: + $this->image = imagecreatefrompng($path); + $this->type = 'png'; + imagealphablending($this->image, false); + imagesavealpha($this->image, true); + break; + + default: + return false; + } + + $this->width = $info[0]; + $this->height = $info[1]; + return true; + } + + /** + * Creates image resource with background + * + * @param integer $width Width of the image + * @param integer $height Height of the image + * @param string $background Background color in hexadecimal code + * @return boolean true if resource was created + * @access public + */ + public function create($width, $height, $background = null) + { + if ($width > 0 && $height > 0) { + $this->image = imagecreatetruecolor($width, $height); + $this->width = $width; + $this->height = $height; + if (preg_match('/^([a-fA-F0-9]{3})|([a-fA-F0-9]{6})$/', $background)) { + $rgb = $this->hex2rgb($background); + $background = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']); + imagefill($this->image, 0, 0, $background); + } else { + imagealphablending($this->image, false); + $black = imagecolorallocate($this->image, 0, 0, 0); + imagefilledrectangle($this->image, 0, 0, $this->width, $this->height, $black); + imagecolortransparent($this->image, $black); + imagealphablending($this->image, true); + } + return true; + } + + return false; + } + + /** + * Resizes the image + * + * @param integer $width New width + * @param integer $height New height + * @return boolean true if image was resized + * @access public + */ + public function resize($width, $height = 0) + { + if ($width <= 0 && $height <= 0) { + return false; + } elseif ($width > 0 && $height <= 0) { + $height = $this->height*$width/$this->width; + } elseif ($width <= 0 && $height > 0) { + $width = $this->width*$height/$this->height; + } + + $image = imagecreatetruecolor($width, $height); + imagealphablending($image, false); + imagesavealpha($image, true); + imagecopyresampled($image, $this->image, 0, 0, 0, 0, $width, $height, $this->width, $this->height); + $this->image = $image; + $this->width = $width; + $this->height = $height; + return true; + } + + /** + * Crops a part of the image + * + * @param integer $x X-coordinate + * @param integer $y Y-coordinate + * @param integer $width Width of cutout + * @param integer $height Height of cutout + * @access public + */ + public function crop($x, $y, $width, $height) + { + $image = imagecreatetruecolor($width, $height); + imagealphablending($image, false); + imagesavealpha($image, true); + imagecopyresampled($image, $this->image, 0, 0, $x, $y, $width, $height, $width, $height); + $this->image = $image; + $this->width = $width; + $this->height = $height; + } + + /** + * Resizes and crops image to specified size + * + * @param int $width New width + * @param int $height New height + * @access public + * @return void + */ + public function fit($width, $height) + { + if ($this->width > $this->height) { + $this->resize(0, $height); + $this->crop(($this->width - $width) / 2, 0, $width, $height); + } else { + $this->resize($width); + $this->crop(0, ($this->height - $height) / 2, $width, $height); + } + } + + /** + * Rotates image + * + * @param integer $angle in degree + * @access public + */ + public function rotate($angle) + { + $this->image = imagerotate($this->image, $angle, 0); + } + + /** + * Creates rectangle + * + * @param integer $x1 X1-coordinate + * @param integer $y1 Y1-coordinate + * @param integer $x2 X2-coordinate + * @param integer $y2 Y2-coordinate + * @param string $color Color in hexadecimal code + * @access public + */ + public function rectangle($x1, $y1, $x2, $y2, $color) + { + $rgb = $this->hex2rgb($color); + $color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']); + imagefilledrectangle($this->image, $x1, $y1, $x2, $y2, $color); + } + /** + * Creates ellipse + * + * @param integer $x X-coordinate + * @param integer $y Y-coordinate + * @param integer $width Width of ellipse + * @param integer $height Height of ellipse + * @param string $color Color in hexadecimal code + * @access public + */ + public function ellipse($x, $y, $width, $height, $color) + { + $rgb = $this->hex2rgb($color); + $color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']); + imagefilledellipse($this->image, $x, $y, $width, $height, $color); + } + /** + * Creates polygon + * + * @param array $points Coordinates of the vertices + * @param string $color Color in hexadecimal code + * @access public + */ + public function polygon($points, $color) + { + $rgb = $this->hex2rgb($color); + $color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']); + $num = count($points)/2; + imagefilledpolygon($this->image, $points, $num, $color); + } + /** + * Draws a line + * + * @param array $points Coordinates of the vertices + * @param string $color Color in hexadecimal code + * @access public + */ + public function line($points, $color) + { + $rgb = $this->hex2rgb($color); + $color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']); + imageline($this->image, $points[0], $points[1], $points[2], $points[3], $color); + } + + /** + * Writes on image + * + * @param integer $x X-coordinate + * @param integer $y Y-coordinate + * @param string $font Path to ttf + * @param integer $size Font size + * @param integer $angle in degree + * @param string $color Color in hexadecimal code + * @param string $text Text + * @access public + */ + public function write($x, $y, $font, $size, $angle, $color, $text) + { + $rgb = $this->hex2rgb($color); + $color = imagecolorallocate($this->image, $rgb['r'], $rgb['g'], $rgb['b']); + imagettftext($this->image, $size, $angle, $x, $y, $color, $font, $text); + } + + /** + * Merges image with another + * + * @param Image $img object + * @param mixed $x X-coordinate + * @param mixed $y Y-coordinate + * @access public + */ + public function merge($img, $x, $y) + { + $infos = $img->getInfos(); + + switch ($x) { + case 'left': + $x = 0; + break; + + case 'right': + $x = $this->width-$infos['width']; + break; + + default: + $x = $x; + } + + switch ($y) { + case 'top': + $y = 0; + break; + + case 'bottom': + $y = $this->height-$infos['height']; + break; + + default: + $y = $y; + } + + imagealphablending($this->image, true); + imagecopy($this->image, $infos['resource'], $x, $y, 0, 0, $infos['width'], $infos['height']); + } + + /** + * Shows image + * + * @param string $type Filetype + * @access public + */ + public function show($type = 'png') + { + $type = ($type != 'gif' && $type != 'jpeg' && $type != 'png') ? $this->type : $type; + + switch ($type) { + case 'gif': + header('Content-type: image/gif'); + imagegif($this->image); + break; + + case 'jpeg': + header('Content-type: image/jpeg'); + imagejpeg($this->image, '', 100); + break; + + default: + header('Content-type: image/png'); + imagepng($this->image); + } + } + + /** + * Saves image + * + * @param string $path Path to location + * @param string $type Filetype + * @return boolean true if image was saved + * @access public + */ + public function save($path, $quality = 90) + { + $dir = dirname($path); + $type = pathinfo($path, PATHINFO_EXTENSION); + + if (!file_exists($dir) || !is_dir($dir)) { + return false; + } + + if (!is_writable($dir)) { + return false; + } + + if ($type != 'gif' && $type != 'jpeg' && $type != 'jpg' && $type != 'png') { + $type = $this->type; + $path .= '.'.$type; + } + + switch ($type) { + case 'gif': + imagegif($this->image, $path); + break; + + case 'jpeg': case 'jpg': + imagejpeg($this->image, $path, $quality); + break; + + default: + imagepng($this->image, $path); + } + + return true; + } +} diff --git a/inc/core/lib/Indenter.php b/inc/core/lib/Indenter.php new file mode 100644 index 0000000..17e6faf --- /dev/null +++ b/inc/core/lib/Indenter.php @@ -0,0 +1,184 @@ + ' ' + ); + private $inline_elements = array('b', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'cite', 'code', 'dfn', 'em', 'kbd', 'strong', 'samp', 'var', 'a', 'bdo', 'br', 'img', 'span', 'sub', 'sup'); + private $temporary_replacements_script = array(); + private $temporary_replacements_inline = array(); + + const ELEMENT_TYPE_BLOCK = 0; + const ELEMENT_TYPE_INLINE = 1; + + const MATCH_INDENT_NO = 0; + const MATCH_INDENT_DECREASE = 1; + const MATCH_INDENT_INCREASE = 2; + const MATCH_DISCARD = 3; + + /** + * @param array $options + */ + public function __construct(array $options = array()) + { + foreach ($options as $name => $value) { + if (!array_key_exists($name, $this->options)) { + trigger_error('Indenter: Unrecognized option.', E_USER_NOTICE); + } + + $this->options[$name] = $value; + } + } + + /** + * @param string $element_name Element name, e.g. "b". + * @param ELEMENT_TYPE_BLOCK|ELEMENT_TYPE_INLINE $type + * @return null + */ + public function setElementType($element_name, $type) + { + if ($type === static::ELEMENT_TYPE_BLOCK) { + $this->inline_elements = array_diff($this->inline_elements, array($element_name)); + } elseif ($type === static::ELEMENT_TYPE_INLINE) { + $this->inline_elements[] = $element_name; + } else { + trigger_error('Indenter: Unrecognized element type.', E_USER_NOTICE); + } + + $this->inline_elements = array_unique($this->inline_elements); + } + + /** + * @param string $input HTML input. + * @return string Indented HTML. + */ + public function indent($input) + { + $this->log = array(); + + // Dindent does not indent ', $input); + } + } + + // Removing double whitespaces to make the source code easier to read. + // $input = str_replace("\t", '', $input); + // $input = preg_replace('/\s{2,}/', ' ', $input); + + // Remove inline elements and replace them with text entities. + if (preg_match_all('/<(' . implode('|', $this->inline_elements) . ')[^>]*>(?:[^<]*)<\/\1>/', $input, $matches)) { + $this->temporary_replacements_inline = $matches[0]; + foreach ($matches[0] as $i => $match) { + $input = str_replace($match, 'ᐃ' . ($i + 1) . 'ᐃ', $input); + } + } + + $subject = $input; + + $output = ''; + + $next_line_indentation_level = 0; + + do { + $indentation_level = $next_line_indentation_level; + + $patterns = array( + // block tag + '/^(<([a-z]+)(?:[^>]*)>(?:[^<]*)<\/(?:\2)>)/' => static::MATCH_INDENT_NO, + // DOCTYPE + '/^]*)>/' => static::MATCH_INDENT_NO, + // tag with implied closing + '/^<(input|link|meta|base|br|img|hr)([^>]*)>/' => static::MATCH_INDENT_NO, + // opening tag + '/^<[^\/]([^>]*)>/' => static::MATCH_INDENT_INCREASE, + // closing tag + '/^<\/([^>]*)>/' => static::MATCH_INDENT_DECREASE, + // self-closing tag + '/^<(.+)\/>/' => static::MATCH_INDENT_DECREASE, + // whitespace + '/^(\s+)/' => static::MATCH_DISCARD, + // text node + '/([^<]+)/' => static::MATCH_INDENT_NO + ); + $rules = array('NO', 'DECREASE', 'INCREASE', 'DISCARD'); + + foreach ($patterns as $pattern => $rule) { + if ($match = preg_match($pattern, $subject, $matches)) { + $this->log[] = array( + 'rule' => $rules[$rule], + 'pattern' => $pattern, + 'subject' => $subject, + 'match' => $matches[0] + ); + + $subject = mb_substr($subject, mb_strlen($matches[0])); + + if ($rule === static::MATCH_DISCARD) { + break; + } + + if ($rule === static::MATCH_INDENT_NO) { + } elseif ($rule === static::MATCH_INDENT_DECREASE) { + $next_line_indentation_level--; + $indentation_level--; + } else { + $next_line_indentation_level++; + } + + if ($indentation_level < 0) { + $indentation_level = 0; + } + + $output .= str_repeat($this->options['indentation_character'], $indentation_level) . $matches[0] . "\n"; + + break; + } + } + } while ($match); + + $interpreted_input = ''; + foreach ($this->log as $e) { + $interpreted_input .= $e['match']; + } + + if ($interpreted_input !== $input) { + trigger_error('Indenter: Did not reproduce the exact input.', E_USER_NOTICE); + } + + $output = preg_replace('/(<(\w+)[^>]*>)\s*(<\/\2>)/', '\\1\\3', $output); + + foreach ($this->temporary_replacements_script as $i => $original) { + $output = str_replace('', $original, $output); + } + + foreach ($this->temporary_replacements_inline as $i => $original) { + $output = str_replace('ᐃ' . ($i + 1) . 'ᐃ', $original, $output); + } + + return trim($output); + } + + /** + * Debugging utility. Get log for the last indent operation. + * + * @return array + */ + public function getLog() + { + return $this->log; + } +} diff --git a/inc/core/lib/License.php b/inc/core/lib/License.php new file mode 100644 index 0000000..ff8fec4 --- /dev/null +++ b/inc/core/lib/License.php @@ -0,0 +1,94 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * Batflat License class + * By removing or modifing these procedures you break license. + */ +class License +{ + const FREE = 1; + const COMMERCIAL = 2; + const ERROR = 3; + const INVALID_DOMAIN = 4; + const TIME_OUT = 5; + + private static $feedURL = 'http://feed.sruu.pl'; + + public static function verify($license) + { + $license = self::unpack($license); + + if ($license[0] === false && $license[1] === false && $license[2] === false && $license[3] === false && $license[4] === false) { + return License::FREE; + } + + if ($license[0] == md5($license[1].$license[2].$license[3].domain(false))) { + if (time() < $license[4] || strtotime("-48 hours") > $license[4]) { + if (self::remoteCheck($license)) { + self::update($license); + return License::COMMERCIAL; + } elseif (strpos(HttpRequest::getStatus(), 'timed out') !== false) { + return License::TIME_OUT; + } else { + return License::ERROR; + } + } else { + return License::COMMERCIAL; + } + } + + return License::ERROR; + } + + public static function getLicenseData($domainCode) + { + $response = json_decode(HttpRequest::post(self::$feedURL.'/batflat/commercial/license/data', ['code' => $domainCode, 'domain' => domain(false)]), true); + + if (isset_or($response['status'], false) == 'verified') { + return $response['data']; + } + + return false; + } + + private static function unpack($code) + { + $code = base64_decode($code); + $code = empty($code) ? [] : json_decode($code, true); + $code = array_replace(array_fill(0, 5, false), $code); + array_walk($code, function (&$value) { + $value = is_numeric($value) ? intval($value) : $value; + }); + return $code; + } + + private static function update($license) + { + $license[4] = time(); + $core = $GLOBALS['core']; + $core->db('settings')->where('module', 'settings')->where('field', 'license')->save(['value' => base64_encode(json_encode($license))]); + } + + private static function remoteCheck($license) + { + $output = HttpRequest::post(self::$feedURL.'/batflat/commercial/license/verify', ['pid' => $license[1], 'code' => $license[2], 'domain' => domain(false), 'domainCode' => $license[3]]); + $output = json_decode($output, true); + + if (isset_or($output['status'], false) == 'verified') { + return true; + } + + return false; + } +} diff --git a/inc/core/lib/ModulesCollection.php b/inc/core/lib/ModulesCollection.php new file mode 100644 index 0000000..275f3e1 --- /dev/null +++ b/inc/core/lib/ModulesCollection.php @@ -0,0 +1,128 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * Batflat modules collection + */ +class ModulesCollection +{ + /** + * List of loaded modules + * + * @var array + */ + protected $modules = []; + + /** + * ModulesCollection constructor + * + * @param \Inc\Core\Main $core + */ + public function __construct($core) + { + $modules = array_column($core->db('modules')->asc('sequence')->toArray(), 'dir'); + if ($core instanceof \Inc\Core\Admin) { + $clsName = 'Admin'; + } else { + $clsName = 'Site'; + } + + foreach ($modules as $dir) { + $file = MODULES.'/'.$dir.'/'.$clsName.'.php'; + if (file_exists($file)) { + $namespace = 'inc\modules\\'.$dir.'\\'.$clsName; + $this->modules[$dir] = new $namespace($core); + } + } + + // Init loop + $this->initLoop(); + + // Routes loop for Site + if ($clsName != 'Admin') { + $this->routesLoop(); + } + } + + /** + * Executes all init methods + * + * @return void + */ + protected function initLoop() + { + foreach ($this->modules as $module) { + $module->init(); + } + } + + /** + * Executes all routes methods + * + * @return void + */ + protected function routesLoop() + { + foreach ($this->modules as $module) { + $module->routes(); + } + } + + /** + * Executes all finish methods + * + * @return void + */ + public function finishLoop() + { + foreach ($this->modules as $module) { + $module->finish(); + } + } + + /** + * Get list of modules as array + * + * @return array + */ + public function getArray() + { + return $this->modules; + } + + /** + * Check if collection has loaded module + * + * @param string $name + * @return bool + */ + public function has($name) + { + return array_key_exists($name, $this->modules); + } + + /** + * Get specified module by magic method + * + * @param string $module + * @return \Inc\Core\BaseModule + */ + public function __get($module) + { + if (isset($this->modules[$module])) { + return $this->modules[$module]; + } else { + return null; + } + } +} diff --git a/inc/core/lib/Pagination.php b/inc/core/lib/Pagination.php new file mode 100644 index 0000000..b6e105e --- /dev/null +++ b/inc/core/lib/Pagination.php @@ -0,0 +1,179 @@ + + * @link http://leonard.shtika.info + * @copyright (C) Leonard Shtika + * @license MIT. + */ + +namespace Inc\Core\Lib; + +class Pagination +{ + private $_currentPage; + private $_totalRecords; + private $_recordsPerPage; + private $_url; + + public function __construct($currentPage = 1, $totalRecords = 0, $recordsPerPage = 10, $url = '?page=%d') + { + $this->_currentPage = (int) $currentPage; + $this->_totalRecords = (int) $totalRecords; + $this->_recordsPerPage = (int) $recordsPerPage; + $this->_url = $url; + } + + /** + * Calculate offset + * @return int + * Example: for 10 recores per page + * page 1 has offset 0 + * page 2 has offset 10 + */ + public function offset() + { + return ($this->_currentPage - 1) * $this->_recordsPerPage; + } + + /** + * Get the records per page + * @return int + */ + public function getRecordsPerPage() + { + return $this->_recordsPerPage; + } + + /** + * Calculate total pages + */ + private function _totalPages() + { + return ceil($this->_totalRecords / $this->_recordsPerPage); + } + + /** + * Calculate previous page + * @return int + */ + private function _previousPage() + { + return $this->_currentPage - 1; + } + + /** + * Calculate next page + * @return int + */ + private function _nextPage() + { + return $this->_currentPage + 1; + } + + /** + * Check if there is a previous page + * @return boolean + */ + private function _hasPreviousPage() + { + return ($this->_previousPage() >= 1) ? true : false; + } + + /** + * Check if there is a next page + * @return boolean + */ + private function _hasNextPage() + { + return ($this->_nextPage() <= $this->_totalPages()) ? true : false; + } + + /** + * Generate navigation + * @param string $type ('pagination' or 'pager') + * @param int $maxLinks + * @return mixed (string or false) + */ + public function nav($type = 'pagination', $maxLinks = 10) + { + if ($this->_totalPages() > 1) { + $filename = htmlspecialchars(pathinfo($_SERVER["SCRIPT_FILENAME"], PATHINFO_BASENAME), ENT_QUOTES, "utf-8"); + + $links = ''; + + // Return all links of Pagination + return $links; + } else { + return false; + } + } +} diff --git a/inc/core/lib/Parsedown.php b/inc/core/lib/Parsedown.php new file mode 100644 index 0000000..ec38cdc --- /dev/null +++ b/inc/core/lib/Parsedown.php @@ -0,0 +1,1301 @@ +`~\\'; + protected $specialCharacters = array( + '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', '|', + ); + protected $DefinitionData; + protected $StrongRegex = array( + '*' => '/^[*]{2}((?:\\\\\*|[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', + '_' => '/^__((?:\\\\_|[^_]|_[^_]*_)+?)__(?!_)/us', + ); + protected $EmRegex = array( + '*' => '/^[*]((?:\\\\\*|[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', + '_' => '/^_((?:\\\\_|[^_]|__[^_]*__)+?)_(?!_)\b/us', + ); + protected $regexHtmlAttribute = '[a-zA-Z_:][\w:.-]*(?:\s*=\s*(?:[^"\'=<>`\s]+|"[^"]*"|\'[^\']*\'))?'; + protected $voidElements = array( + 'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', + ); + protected $textLevelElements = array( + 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', + 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', + 'i', 'rp', 'del', 'code', 'strike', 'marquee', + 'q', 'rt', 'ins', 'font', 'strong', + 's', 'tt', 'sub', 'mark', + 'u', 'xm', 'sup', 'nobr', + 'var', 'ruby', + 'wbr', 'span', + 'time', + ); + private static $instances = array(); + + public function text($text) + { + # make sure no definitions are set + $this->DefinitionData = array(); + + # standardize line breaks + $text = str_replace(array("\r\n", "\r"), "\n", $text); + + # remove surrounding line breaks + $text = trim($text, "\n"); + + # split text into lines + $lines = explode("\n", $text); + + # iterate through lines to identify blocks + $markup = $this->lines($lines); + + # trim line breaks + $markup = trim($markup, "\n"); + + return $markup; + } + + public function setBreaksEnabled($breaksEnabled) + { + $this->breaksEnabled = $breaksEnabled; + + return $this; + } + + public function setMarkupEscaped($markupEscaped) + { + $this->markupEscaped = $markupEscaped; + + return $this; + } + + public function setUrlsLinked($urlsLinked) + { + $this->urlsLinked = $urlsLinked; + + return $this; + } + + protected $urlsLinked = true; + + protected $BlockTypes = array( + '#' => array('Header'), + '*' => array('Rule', 'List'), + '+' => array('List'), + '-' => array('SetextHeader', 'Table', 'Rule', 'List'), + '0' => array('List'), + '1' => array('List'), + '2' => array('List'), + '3' => array('List'), + '4' => array('List'), + '5' => array('List'), + '6' => array('List'), + '7' => array('List'), + '8' => array('List'), + '9' => array('List'), + ':' => array('Table'), + '<' => array('Comment', 'Markup'), + '=' => array('SetextHeader'), + '>' => array('Quote'), + '[' => array('Reference'), + '_' => array('Rule'), + '`' => array('FencedCode'), + '|' => array('Table'), + '~' => array('FencedCode'), + ); + + protected $unmarkedBlockTypes = array( + 'Code', + ); + + protected function lines(array $lines) + { + $CurrentBlock = null; + + foreach ($lines as $line) { + if (chop($line) === '') { + if (isset($CurrentBlock)) { + $CurrentBlock['interrupted'] = true; + } + + continue; + } + + if (strpos($line, "\t") !== false) { + $parts = explode("\t", $line); + + $line = $parts[0]; + + unset($parts[0]); + + foreach ($parts as $part) { + $shortage = 4 - mb_strlen($line, 'utf-8') % 4; + + $line .= str_repeat(' ', $shortage); + $line .= $part; + } + } + + $indent = 0; + + while (isset($line[$indent]) and $line[$indent] === ' ') { + $indent ++; + } + + $text = $indent > 0 ? substr($line, $indent) : $line; + + # ~ + + $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); + + # ~ + + if (isset($CurrentBlock['continuable'])) { + $Block = $this->{'block'.$CurrentBlock['type'].'Continue'}($Line, $CurrentBlock); + + if (isset($Block)) { + $CurrentBlock = $Block; + + continue; + } else { + if ($this->isBlockCompletable($CurrentBlock['type'])) { + $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + } + } + } + + # ~ + + $marker = $text[0]; + + # ~ + + $blockTypes = $this->unmarkedBlockTypes; + + if (isset($this->BlockTypes[$marker])) { + foreach ($this->BlockTypes[$marker] as $blockType) { + $blockTypes []= $blockType; + } + } + + # + # ~ + + foreach ($blockTypes as $blockType) { + $Block = $this->{'block'.$blockType}($Line, $CurrentBlock); + + if (isset($Block)) { + $Block['type'] = $blockType; + + if (! isset($Block['identified'])) { + $Blocks []= $CurrentBlock; + + $Block['identified'] = true; + } + + if ($this->isBlockContinuable($blockType)) { + $Block['continuable'] = true; + } + + $CurrentBlock = $Block; + + continue 2; + } + } + + # ~ + + if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) { + $CurrentBlock['element']['text'] .= "\n".$text; + } else { + $Blocks []= $CurrentBlock; + + $CurrentBlock = $this->paragraph($Line); + + $CurrentBlock['identified'] = true; + } + } + + # ~ + + if (isset($CurrentBlock['continuable']) and $this->isBlockCompletable($CurrentBlock['type'])) { + $CurrentBlock = $this->{'block'.$CurrentBlock['type'].'Complete'}($CurrentBlock); + } + + # ~ + + $Blocks []= $CurrentBlock; + + unset($Blocks[0]); + + # ~ + + $markup = ''; + + foreach ($Blocks as $Block) { + if (isset($Block['hidden'])) { + continue; + } + + $markup .= "\n"; + $markup .= isset($Block['markup']) ? $Block['markup'] : $this->element($Block['element']); + } + + $markup .= "\n"; + + # ~ + + return $markup; + } + + protected function isBlockContinuable($Type) + { + return method_exists($this, 'block'.$Type.'Continue'); + } + + protected function isBlockCompletable($Type) + { + return method_exists($this, 'block'.$Type.'Complete'); + } + + protected function blockCode($Line, $Block = null) + { + if (isset($Block) and ! isset($Block['type']) and ! isset($Block['interrupted'])) { + return; + } + + if ($Line['indent'] >= 4) { + $text = substr($Line['body'], 4); + + $Block = array( + 'element' => array( + 'name' => 'pre', + 'handler' => 'element', + 'text' => array( + 'name' => 'code', + 'text' => $text, + ), + ), + ); + + return $Block; + } + } + + protected function blockCodeContinue($Line, $Block) + { + if ($Line['indent'] >= 4) { + if (isset($Block['interrupted'])) { + $Block['element']['text']['text'] .= "\n"; + + unset($Block['interrupted']); + } + + $Block['element']['text']['text'] .= "\n"; + + $text = substr($Line['body'], 4); + + $Block['element']['text']['text'] .= $text; + + return $Block; + } + } + + protected function blockCodeComplete($Block) + { + $text = $Block['element']['text']['text']; + + $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); + + $Block['element']['text']['text'] = $text; + + return $Block; + } + + protected function blockComment($Line) + { + if ($this->markupEscaped) { + return; + } + + if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') { + $Block = array( + 'markup' => $Line['body'], + ); + + if (preg_match('/-->$/', $Line['text'])) { + $Block['closed'] = true; + } + + return $Block; + } + } + + protected function blockCommentContinue($Line, array $Block) + { + if (isset($Block['closed'])) { + return; + } + + $Block['markup'] .= "\n" . $Line['body']; + + if (preg_match('/-->$/', $Line['text'])) { + $Block['closed'] = true; + } + + return $Block; + } + + protected function blockFencedCode($Line) + { + if (preg_match('/^['.$Line['text'][0].']{3,}[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) { + $Element = array( + 'name' => 'code', + 'text' => '', + ); + + if (isset($matches[1])) { + $class = 'language-'.$matches[1]; + + $Element['attributes'] = array( + 'class' => $class, + ); + } + + $Block = array( + 'char' => $Line['text'][0], + 'element' => array( + 'name' => 'pre', + 'handler' => 'element', + 'text' => $Element, + ), + ); + + return $Block; + } + } + + protected function blockFencedCodeContinue($Line, $Block) + { + if (isset($Block['complete'])) { + return; + } + + if (isset($Block['interrupted'])) { + $Block['element']['text']['text'] .= "\n"; + + unset($Block['interrupted']); + } + + if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) { + $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); + + $Block['complete'] = true; + + return $Block; + } + + $Block['element']['text']['text'] .= "\n".$Line['body']; + ; + + return $Block; + } + + protected function blockFencedCodeComplete($Block) + { + $text = $Block['element']['text']['text']; + + $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); + + $Block['element']['text']['text'] = $text; + + return $Block; + } + + protected function blockHeader($Line) + { + if (isset($Line['text'][1])) { + $level = 1; + + while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') { + $level ++; + } + + if ($level > 6) { + return; + } + + $text = trim($Line['text'], '# '); + + $Block = array( + 'element' => array( + 'name' => 'h' . min(6, $level), + 'text' => $text, + 'handler' => 'line', + ), + ); + + return $Block; + } + } + + protected function blockList($Line) + { + list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); + + if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) { + $Block = array( + 'indent' => $Line['indent'], + 'pattern' => $pattern, + 'element' => array( + 'name' => $name, + 'handler' => 'elements', + ), + ); + + $Block['li'] = array( + 'name' => 'li', + 'handler' => 'li', + 'text' => array( + $matches[2], + ), + ); + + $Block['element']['text'] []= & $Block['li']; + + return $Block; + } + } + + protected function blockListContinue($Line, array $Block) + { + if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'(?:[ ]+(.*)|$)/', $Line['text'], $matches)) { + if (isset($Block['interrupted'])) { + $Block['li']['text'] []= ''; + + unset($Block['interrupted']); + } + + unset($Block['li']); + + $text = isset($matches[1]) ? $matches[1] : ''; + + $Block['li'] = array( + 'name' => 'li', + 'handler' => 'li', + 'text' => array( + $text, + ), + ); + + $Block['element']['text'] []= & $Block['li']; + + return $Block; + } + + if ($Line['text'][0] === '[' and $this->blockReference($Line)) { + return $Block; + } + + if (! isset($Block['interrupted'])) { + $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + + $Block['li']['text'] []= $text; + + return $Block; + } + + if ($Line['indent'] > 0) { + $Block['li']['text'] []= ''; + + $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); + + $Block['li']['text'] []= $text; + + unset($Block['interrupted']); + + return $Block; + } + } + + protected function blockQuote($Line) + { + if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) { + $Block = array( + 'element' => array( + 'name' => 'blockquote', + 'handler' => 'lines', + 'text' => (array) $matches[1], + ), + ); + + return $Block; + } + } + + protected function blockQuoteContinue($Line, array $Block) + { + if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) { + if (isset($Block['interrupted'])) { + $Block['element']['text'] []= ''; + + unset($Block['interrupted']); + } + + $Block['element']['text'] []= $matches[1]; + + return $Block; + } + + if (! isset($Block['interrupted'])) { + $Block['element']['text'] []= $Line['text']; + + return $Block; + } + } + + protected function blockRule($Line) + { + if (preg_match('/^(['.$Line['text'][0].'])([ ]*\1){2,}[ ]*$/', $Line['text'])) { + $Block = array( + 'element' => array( + 'name' => 'hr' + ), + ); + + return $Block; + } + } + + protected function blockSetextHeader($Line, array $Block = null) + { + if (! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) { + return; + } + + if (chop($Line['text'], $Line['text'][0]) === '') { + $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; + + return $Block; + } + } + + protected function blockMarkup($Line) + { + if ($this->markupEscaped) { + return; + } + + if (preg_match('/^<(\w*)(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*(\/)?>/', $Line['text'], $matches)) { + $element = strtolower($matches[1]); + + if (in_array($element, $this->textLevelElements)) { + return; + } + + $Block = array( + 'name' => $matches[1], + 'depth' => 0, + 'markup' => $Line['text'], + ); + + $length = strlen($matches[0]); + + $remainder = substr($Line['text'], $length); + + if (trim($remainder) === '') { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) { + $Block['closed'] = true; + + $Block['void'] = true; + } + } else { + if (isset($matches[2]) or in_array($matches[1], $this->voidElements)) { + return; + } + + if (preg_match('/<\/'.$matches[1].'>[ ]*$/i', $remainder)) { + $Block['closed'] = true; + } + } + + return $Block; + } + } + + protected function blockMarkupContinue($Line, array $Block) + { + if (isset($Block['closed'])) { + return; + } + + if (preg_match('/^<'.$Block['name'].'(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*>/i', $Line['text'])) { # open + $Block['depth'] ++; + } + + if (preg_match('/(.*?)<\/'.$Block['name'].'>[ ]*$/i', $Line['text'], $matches)) { # close + if ($Block['depth'] > 0) { + $Block['depth'] --; + } else { + $Block['closed'] = true; + } + } + + if (isset($Block['interrupted'])) { + $Block['markup'] .= "\n"; + + unset($Block['interrupted']); + } + + $Block['markup'] .= "\n".$Line['body']; + + return $Block; + } + + protected function blockReference($Line) + { + if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) { + $id = strtolower($matches[1]); + + $Data = array( + 'url' => $matches[2], + 'title' => null, + ); + + if (isset($matches[3])) { + $Data['title'] = $matches[3]; + } + + $this->DefinitionData['Reference'][$id] = $Data; + + $Block = array( + 'hidden' => true, + ); + + return $Block; + } + } + + protected function blockTable($Line, array $Block = null) + { + if (! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) { + return; + } + + if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') { + $alignments = array(); + + $divider = $Line['text']; + + $divider = trim($divider); + $divider = trim($divider, '|'); + + $dividerCells = explode('|', $divider); + + foreach ($dividerCells as $dividerCell) { + $dividerCell = trim($dividerCell); + + if ($dividerCell === '') { + continue; + } + + $alignment = null; + + if ($dividerCell[0] === ':') { + $alignment = 'left'; + } + + if (substr($dividerCell, - 1) === ':') { + $alignment = $alignment === 'left' ? 'center' : 'right'; + } + + $alignments []= $alignment; + } + + # ~ + + $HeaderElements = array(); + + $header = $Block['element']['text']; + + $header = trim($header); + $header = trim($header, '|'); + + $headerCells = explode('|', $header); + + foreach ($headerCells as $index => $headerCell) { + $headerCell = trim($headerCell); + + $HeaderElement = array( + 'name' => 'th', + 'text' => $headerCell, + 'handler' => 'line', + ); + + if (isset($alignments[$index])) { + $alignment = $alignments[$index]; + + $HeaderElement['attributes'] = array( + 'style' => 'text-align: '.$alignment.';', + ); + } + + $HeaderElements []= $HeaderElement; + } + + # ~ + + $Block = array( + 'alignments' => $alignments, + 'identified' => true, + 'element' => array( + 'name' => 'table', + 'handler' => 'elements', + ), + ); + + $Block['element']['text'] []= array( + 'name' => 'thead', + 'handler' => 'elements', + ); + + $Block['element']['text'] []= array( + 'name' => 'tbody', + 'handler' => 'elements', + 'text' => array(), + ); + + $Block['element']['text'][0]['text'] []= array( + 'name' => 'tr', + 'handler' => 'elements', + 'text' => $HeaderElements, + ); + + return $Block; + } + } + + protected function blockTableContinue($Line, array $Block) + { + if (isset($Block['interrupted'])) { + return; + } + + if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) { + $Elements = array(); + + $row = $Line['text']; + + $row = trim($row); + $row = trim($row, '|'); + + preg_match_all('/(?:(\\\\[|])|[^|`]|`[^`]+`|`)+/', $row, $matches); + + foreach ($matches[0] as $index => $cell) { + $cell = trim($cell); + + $Element = array( + 'name' => 'td', + 'handler' => 'line', + 'text' => $cell, + ); + + if (isset($Block['alignments'][$index])) { + $Element['attributes'] = array( + 'style' => 'text-align: '.$Block['alignments'][$index].';', + ); + } + + $Elements []= $Element; + } + + $Element = array( + 'name' => 'tr', + 'handler' => 'elements', + 'text' => $Elements, + ); + + $Block['element']['text'][1]['text'] []= $Element; + + return $Block; + } + } + + protected function paragraph($Line) + { + $Block = array( + 'element' => array( + 'name' => 'p', + 'text' => $Line['text'], + 'handler' => 'line', + ), + ); + + return $Block; + } + + protected $InlineTypes = array( + '"' => array('SpecialCharacter'), + '!' => array('Image'), + '&' => array('SpecialCharacter'), + '*' => array('Emphasis'), + ':' => array('Url'), + '<' => array('UrlTag', 'EmailTag', 'Markup', 'SpecialCharacter'), + '>' => array('SpecialCharacter'), + '[' => array('Link'), + '_' => array('Emphasis'), + '`' => array('Code'), + '~' => array('Strikethrough'), + '\\' => array('EscapeSequence'), + ); + + public function line($text) + { + $markup = ''; + + # $excerpt is based on the first occurrence of a marker + + while ($excerpt = strpbrk($text, $this->inlineMarkerList)) { + $marker = $excerpt[0]; + + $markerPosition = strpos($text, $marker); + + $Excerpt = array('text' => $excerpt, 'context' => $text); + + foreach ($this->InlineTypes[$marker] as $inlineType) { + $Inline = $this->{'inline'.$inlineType}($Excerpt); + + if (! isset($Inline)) { + continue; + } + + # makes sure that the inline belongs to "our" marker + + if (isset($Inline['position']) and $Inline['position'] > $markerPosition) { + continue; + } + + # sets a default inline position + + if (! isset($Inline['position'])) { + $Inline['position'] = $markerPosition; + } + + # the text that comes before the inline + $unmarkedText = substr($text, 0, $Inline['position']); + + # compile the unmarked text + $markup .= $this->unmarkedText($unmarkedText); + + # compile the inline + $markup .= isset($Inline['markup']) ? $Inline['markup'] : $this->element($Inline['element']); + + # remove the examined text + $text = substr($text, $Inline['position'] + $Inline['extent']); + + continue 2; + } + + # the marker does not belong to an inline + + $unmarkedText = substr($text, 0, $markerPosition + 1); + + $markup .= $this->unmarkedText($unmarkedText); + + $text = substr($text, $markerPosition + 1); + } + + $markup .= $this->unmarkedText($text); + + return $markup; + } + + protected function inlineCode($Excerpt) + { + $marker = $Excerpt['text'][0]; + + if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), + 'element' => array( + 'name' => 'code', + 'text' => $text, + ), + ); + } + } + + protected function inlineEmailTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<((mailto:)?\S+?@\S+?)>/i', $Excerpt['text'], $matches)) { + $url = $matches[1]; + + if (! isset($matches[2])) { + $url = 'mailto:' . $url; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $matches[1], + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + protected function inlineEmphasis($Excerpt) + { + if (! isset($Excerpt['text'][1])) { + return; + } + + $marker = $Excerpt['text'][0]; + + if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) { + $emphasis = 'strong'; + } elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) { + $emphasis = 'em'; + } else { + return; + } + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => $emphasis, + 'handler' => 'line', + 'text' => $matches[1], + ), + ); + } + + protected function inlineEscapeSequence($Excerpt) + { + if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) { + return array( + 'markup' => $Excerpt['text'][1], + 'extent' => 2, + ); + } + } + + protected function inlineImage($Excerpt) + { + if (! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '[') { + return; + } + + $Excerpt['text']= substr($Excerpt['text'], 1); + + $Link = $this->inlineLink($Excerpt); + + if ($Link === null) { + return; + } + + $Inline = array( + 'extent' => $Link['extent'] + 1, + 'element' => array( + 'name' => 'img', + 'attributes' => array( + 'src' => $Link['element']['attributes']['href'], + 'alt' => $Link['element']['text'], + ), + ), + ); + + $Inline['element']['attributes'] += $Link['element']['attributes']; + + unset($Inline['element']['attributes']['href']); + + return $Inline; + } + + protected function inlineLink($Excerpt) + { + $Element = array( + 'name' => 'a', + 'handler' => 'line', + 'text' => null, + 'attributes' => array( + 'href' => null, + 'title' => null, + ), + ); + + $extent = 0; + + $remainder = $Excerpt['text']; + + if (preg_match('/\[((?:[^][]|(?R))*)\]/', $remainder, $matches)) { + $Element['text'] = $matches[1]; + + $extent += strlen($matches[0]); + + $remainder = substr($remainder, $extent); + } else { + return; + } + + if (preg_match('/^[(]((?:[^ ()]|[(][^ )]+[)])+)(?:[ ]+("[^"]*"|\'[^\']*\'))?[)]/', $remainder, $matches)) { + $Element['attributes']['href'] = $matches[1]; + + if (isset($matches[2])) { + $Element['attributes']['title'] = substr($matches[2], 1, - 1); + } + + $extent += strlen($matches[0]); + } else { + if (preg_match('/^\s*\[(.*?)\]/', $remainder, $matches)) { + $definition = strlen($matches[1]) ? $matches[1] : $Element['text']; + $definition = strtolower($definition); + + $extent += strlen($matches[0]); + } else { + $definition = strtolower($Element['text']); + } + + if (! isset($this->DefinitionData['Reference'][$definition])) { + return; + } + + $Definition = $this->DefinitionData['Reference'][$definition]; + + $Element['attributes']['href'] = $Definition['url']; + $Element['attributes']['title'] = $Definition['title']; + } + + $Element['attributes']['href'] = str_replace(array('&', '<'), array('&', '<'), $Element['attributes']['href']); + + return array( + 'extent' => $extent, + 'element' => $Element, + ); + } + + protected function inlineMarkup($Excerpt) + { + if ($this->markupEscaped or strpos($Excerpt['text'], '>') === false) { + return; + } + + if ($Excerpt['text'][1] === '/' and preg_match('/^<\/\w*[ ]*>/s', $Excerpt['text'], $matches)) { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] === '!' and preg_match('/^/s', $Excerpt['text'], $matches)) { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + + if ($Excerpt['text'][1] !== ' ' and preg_match('/^<\w*(?:[ ]*'.$this->regexHtmlAttribute.')*[ ]*\/?>/s', $Excerpt['text'], $matches)) { + return array( + 'markup' => $matches[0], + 'extent' => strlen($matches[0]), + ); + } + } + + protected function inlineSpecialCharacter($Excerpt) + { + if ($Excerpt['text'][0] === '&' and ! preg_match('/^&#?\w+;/', $Excerpt['text'])) { + return array( + 'markup' => '&', + 'extent' => 1, + ); + } + + $SpecialCharacter = array('>' => 'gt', '<' => 'lt', '"' => 'quot'); + + if (isset($SpecialCharacter[$Excerpt['text'][0]])) { + return array( + 'markup' => '&'.$SpecialCharacter[$Excerpt['text'][0]].';', + 'extent' => 1, + ); + } + } + + protected function inlineStrikethrough($Excerpt) + { + if (! isset($Excerpt['text'][1])) { + return; + } + + if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) { + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'del', + 'text' => $matches[1], + 'handler' => 'line', + ), + ); + } + } + + protected function inlineUrl($Excerpt) + { + if ($this->urlsLinked !== true or ! isset($Excerpt['text'][2]) or $Excerpt['text'][2] !== '/') { + return; + } + + if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) { + $Inline = array( + 'extent' => strlen($matches[0][0]), + 'position' => $matches[0][1], + 'element' => array( + 'name' => 'a', + 'text' => $matches[0][0], + 'attributes' => array( + 'href' => $matches[0][0], + ), + ), + ); + + return $Inline; + } + } + + protected function inlineUrlTag($Excerpt) + { + if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\w+:\/{2}[^ >]+)>/i', $Excerpt['text'], $matches)) { + $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); + + return array( + 'extent' => strlen($matches[0]), + 'element' => array( + 'name' => 'a', + 'text' => $url, + 'attributes' => array( + 'href' => $url, + ), + ), + ); + } + } + + protected function unmarkedText($text) + { + if ($this->breaksEnabled) { + $text = preg_replace('/[ ]*\n/', "
\n", $text); + } else { + $text = preg_replace('/(?:[ ][ ]+|[ ]*\\\\)\n/', "
\n", $text); + $text = str_replace(" \n", "\n", $text); + } + + return $text; + } + + protected function element(array $Element) + { + $markup = '<'.$Element['name']; + + if (isset($Element['attributes'])) { + foreach ($Element['attributes'] as $name => $value) { + if ($value === null) { + continue; + } + + $markup .= ' '.$name.'="'.$value.'"'; + } + } + + if (isset($Element['text'])) { + $markup .= '>'; + + if (isset($Element['handler'])) { + $markup .= $this->{$Element['handler']}($Element['text']); + } else { + $markup .= $Element['text']; + } + + $markup .= ''; + } else { + $markup .= ' />'; + } + + return $markup; + } + + protected function elements(array $Elements) + { + $markup = ''; + + foreach ($Elements as $Element) { + $markup .= "\n" . $this->element($Element); + } + + $markup .= "\n"; + + return $markup; + } + + protected function li($lines) + { + $markup = $this->lines($lines); + + $trimmedMarkup = trim($markup); + + if (! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

') { + $markup = $trimmedMarkup; + $markup = substr($markup, 3); + + $position = strpos($markup, "

"); + + $markup = substr_replace($markup, '', $position, 4); + } + + return $markup; + } + + public function parse($text) + { + $markup = $this->text($text); + + return $markup; + } + + public static function instance($name = 'default') + { + if (isset(self::$instances[$name])) { + return self::$instances[$name]; + } + + $instance = new static(); + + self::$instances[$name] = $instance; + + return $instance; + } +} diff --git a/inc/core/lib/QueryBuilder.php b/inc/core/lib/QueryBuilder.php new file mode 100644 index 0000000..c8c70f8 --- /dev/null +++ b/inc/core/lib/QueryBuilder.php @@ -0,0 +1,897 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * Batflat QueryBuilder class + */ +class QueryBuilder +{ + protected static $db = null; + + protected static $last_sqls = []; + + protected static $options = []; + + protected $table = null; + + protected $columns = []; + + protected $joins = []; + + protected $conditions = []; + + protected $condition_binds = []; + + protected $sets = []; + + protected $set_binds = []; + + protected $orders = []; + + protected $group_by = []; + + protected $having = []; + + protected $limit = ''; + + protected $offset = ''; + + /** + * constructor + * + * @param string $table + */ + public function __construct($table = null) + { + if ($table) { + $this->table = $table; + } + } + + /** + * PDO instance + * + * @return PDO + */ + public static function pdo() + { + return static::$db; + } + + /** + * last SQL queries + * + * @return array SQLs array + */ + public static function lastSqls() + { + return static::$last_sqls; + } + + /** + * creates connection with database + * + * Qb::connect($dsn); // default user, password and options + * Qb::connect($dsn, $user); // default password and options + * Qb::connect($dsn, $user, $pass); // default options + * Qb::connect($dsn, $user, $pass, $options); + * Qb::connect($dsn, $options); + * Qb::connect($dsn, $user, $options); + * + * @param string $dsn + * @param string $user + * @param string $pass + * @param array $options + * primary_key: primary column name, default: 'id' + * error_mode: default: \PDO::ERRMODE_EXCEPTION + * json_options: default: JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT + */ + public static function connect($dsn, $user = '', $pass = '', $options = []) + { + if (is_array($user)) { + $options = $user; + $user = ''; + $pass = ''; + } elseif (is_array($pass)) { + $options = $pass; + $pass = ''; + } + static::$options = array_merge([ + 'primary_key' => 'id', + 'error_mode' => \PDO::ERRMODE_EXCEPTION, + 'json_options' => JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT, + ], $options); + static::$db = new \PDO($dsn, $user, $pass); + static::$db->setAttribute(\PDO::ATTR_ERRMODE, static::$options['error_mode']); + if (strpos($dsn, 'sqlite') !== false) { + static::$db->exec("pragma synchronous = off;"); + } + } + + /** + * close connection with database + */ + public static function close() + { + static::$db = null; + } + + /** + * get or set options + * + * @param string $name + * @param mixed $value + */ + public static function config($name, $value = null) + { + if ($value === null) { + return static::$options[$name]; + } else { + static::$options[$name] = $value; + } + } + + /** + * SELECT + * + * select('column1')->select('column2') // SELECT column1, column2 + * select(['column1', 'column2', ...]) // SELECT column1, column2, ... + * select(['alias1' => 'column1', 'column2', ...]) // SELECT column1 AS alias1, column2, ... + * + * @param string|array $columns + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function select($columns) + { + if (!is_array($columns)) { + $columns = array($columns); + } + foreach ($columns as $alias => $column) { + if (!is_numeric($alias)) { + $column .= " AS $alias"; + } + array_push($this->columns, $column); + } + return $this; + } + + /** + * INNER JOIN + * + * @param string $table + * @param string $condition + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function join($table, $condition) + { + array_push($this->joins, "INNER JOIN $table ON $condition"); + return $this; + } + + /** + * LEFT OUTER JOIN + * + * @param string $table + * @param string $condition + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function leftJoin($table, $condition) + { + array_push($this->joins, "LEFT JOIN $table ON $condition"); + return $this; + } + + /** + * HAVING + * + * having(aggregate_function, operator, value) // HAVING aggregate_function (=, <, >, <=, >=, <>) value + * having(aggregate_function, value) // HAVING aggregate_function = value + * + * @param string $aggregate_function + * @param mixed $value + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function having($aggregate_function, $operator, $value = null, $ao = 'AND') + { + if ($value === null) { + $value = $operator; + $operator = '='; + } + + if (is_array($value)) { + $qs = '(' . implode(',', array_fill(0, count($value), '?')) . ')'; + if (empty($this->having)) { + array_push($this->having, "$aggregate_function $operator $qs"); + } else { + array_push($this->having, "$ao $aggregate_function $operator $qs"); + } + foreach ($value as $v) { + array_push($this->condition_binds, $v); + } + } else { + if (empty($this->having)) { + array_push($this->having, "$aggregate_function $operator ?"); + } else { + array_push($this->having, "$ao $aggregate_function $operator ?"); + } + array_push($this->condition_binds, $value); + } + return $this; + } + + public function orHaving($aggregate_function, $operator, $value = null) + { + return $this->having($aggregate_function, $operator, $value, 'OR'); + } + + /** + * WHERE + * + * where(column, operator, value) // WHERE column (=, <, >, <=, >=, <>) value + * where(column, value) // WHERE column = value + * where(value) // WHERE id = value + * where(function($st) { + * $st->where()... + * }) + * + * @param mixed $column + * @param mixed $value + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function where($column, $operator = null, $value = null, $ao = 'AND') + { + // Where group + if (!is_string($column) && is_callable($column)) { + if (empty($this->conditions) || strpos(end($this->conditions), '(') !== false) { + array_push($this->conditions, '('); + } else { + array_push($this->conditions, $ao.' ('); + } + + call_user_func($column, $this); + array_push($this->conditions, ')'); + + return $this; + } + + if ($operator === null) { + $value = $column; + $column = static::$options['primary_key']; + $operator = '='; + } elseif ($value === null) { + $value = $operator; + $operator = '='; + } + + if (is_array($value)) { + foreach ($value as $v) { + array_push($this->condition_binds, $v); + } + $value = '(' . implode(',', array_fill(0, count($value), '?')) . ')'; + } else { + array_push($this->condition_binds, $value); + } + + if (empty($this->conditions) || strpos(end($this->conditions), '(') !== false) { + array_push($this->conditions, "$column $operator ?"); + } else { + array_push($this->conditions, "$ao $column $operator ?"); + } + + return $this; + } + + /** + * OR WHERE + * + * orWhere(column, operator, value) // WHERE column (=, <, >, <=, >=, <>) value + * orWhere(column, value) // WHERE column = value + * orWhere(value) // WHERE id = value + * orWhere(function($st) { + * $st->where()... + * }) + * + * @param mixed $column + * @param mixed $value + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function orWhere($column, $operator = null, $value = null) + { + return $this->where($column, $operator, $value, 'OR'); + } + + /** + * WHERE IS NULL + * + * @param string $column + * @param string $ao + * @return \Inc\Core\Lib\QueryBuilder + */ + public function isNull($column, $ao = 'AND') + { + if (is_array($column)) { + foreach ($column as $c) { + $this->isNull($c, $ao); + } + + return $this; + } + + if (empty($this->conditions) || strpos(end($this->conditions), '(') !== false) { + array_push($this->conditions, "$column IS NULL"); + } else { + array_push($this->conditions, "$ao $column IS NULL"); + } + + return $this; + } + + /** + * WHERE IS NOT NULL + * + * @param string $column + * @param string $ao + * @return \Inc\Core\Lib\QueryBuilder + */ + public function isNotNull($column, $ao = 'AND') + { + if (is_array($column)) { + foreach ($column as $c) { + $this->isNotNull($c, $ao); + } + + return $this; + } + + if (empty($this->conditions) || strpos(end($this->conditions), '(') !== false) { + array_push($this->conditions, "$column IS NOT NULL"); + } else { + array_push($this->conditions, "$ao $column IS NOT NULL"); + } + + return $this; + } + + /** + * OR WHERE IS NULL + * + * @param string $column + * @return \Inc\Core\Lib\QueryBuilder + */ + public function orIsNull($column) + { + return $this->isNull($column, 'OR'); + } + + /** + * OR WHERE IS NOT NULL + * + * @param string $column + * @return \Inc\Core\Lib\QueryBuilder + */ + public function orIsNotNull($column) + { + return $this->isNotNull($column, 'OR'); + } + + /** + * WHERE LIKE + * + * @param string $column + * @param mixed $value + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function like($column, $value) + { + $this->where($column, 'LIKE', $value); + return $this; + } + + /** + * WHERE OR LIKE + * + * @param string $column + * @param mixed $value + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function orLike($column, $value) + { + $this->where($column, 'LIKE', $value, 'OR'); + return $this; + } + + /** + * WHERE NOT LIKE + * + * @param string $column + * @param mixed $value + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function notLike($column, $value) + { + $this->where($column, 'NOT LIKE', $value); + return $this; + } + + /** + * WHERE OR NOT LIKE + * + * @param string $column + * @param mixed $value + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function orNotLike($column, $value) + { + $this->where($column, 'NOT LIKE', $value, 'OR'); + return $this; + } + + /** + * WHERE IN + * + * @param string $column + * @param array $values + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function in($column, $values) + { + $this->where($column, 'IN', $values); + return $this; + } + + /** + * WHERE OR IN + * + * @param string $column + * @param array $values + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function orIn($column, $values) + { + $this->where($column, 'IN', $values, 'OR'); + return $this; + } + + /** + * WHERE NOT IN + * + * @param string $column + * @param array $values + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function notIn($column, $values) + { + $this->where($column, 'NOT IN', $values); + return $this; + } + + /** + * WHERE OR NOT IN + * + * @param string $column + * @param array $values + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function orNotIn($column, $values) + { + $this->where($column, 'NOT IN', $values, 'OR'); + return $this; + } + + /** + * get or set column value + * + * @param string $column + * @param mixed $value + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function set($column, $value = null) + { + if (is_array($column)) { + $sets = $column; + } else { + $sets = [$column => $value]; + } + $this->sets += $sets; + return $this; + } + + /** + * UPDATE or INSERT + * + * @param string $column + * @param mixed $value + * + * @return integer / boolean + */ + public function save($column = null, $value = null) + { + if ($column) { + $this->set($column, $value); + } + $st = $this->_build(); + if ($lid = static::$db->lastInsertId()) { + return $lid; + } else { + return $st; + } + } + + /** + * UPDATE + * + * @param string $column + * @param mixed $value + * + * @return boolean + */ + public function update($column = null, $value = null) + { + if ($column) { + $this->set($column, $value); + } + return $this->_build(['only_update' => true]); + } + + /** + * ORDER BY ASC + * + * @param string $column + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function asc($column) + { + array_push($this->orders, "$column ASC"); + return $this; + } + + /** + * ORDER BY DESC + * + * @param string $column + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function desc($column) + { + array_push($this->orders, "$column DESC"); + return $this; + } + + /** + * GROUP BY + * + * @param mixed $column + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function group($columns) + { + if (is_array($columns)) { + foreach ($columns as $column) { + array_push($this->group_by, "$column"); + } + } else { + array_push($this->group_by, "$columns"); + } + return $this; + } + + /** + * LIMIT + * + * @param integer $num + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function limit($num) + { + $this->limit = " LIMIT $num"; + return $this; + } + + /** + * OFFSET + * + * @param integer $num + * + * @return \Inc\Core\Lib\QueryBuilder + */ + public function offset($num) + { + $this->offset = " OFFSET $num"; + return $this; + } + + /** + * create array with all rows + * + * @return array + */ + public function toArray() + { + $st = $this->_build(); + return $st->fetchAll(\PDO::FETCH_ASSOC); + } + + /** + * create object with all rows + * + * @return \stdObject[] + */ + public function toObject() + { + $st = $this->_build(); + return $st->fetchAll(\PDO::FETCH_OBJ); + } + + /** + * create JSON array with all rows + * + * @return string + */ + public function toJson() + { + $rows = $this->toArray(); + return json_encode($rows, static::$options['json_options']); + } + + /** + * create array with one row + * + * @param string $column + * @param mixed $value + * + * @return array + */ + public function oneArray($column = null, $value = null) + { + if ($column !== null) { + $this->where($column, $value); + } + $st = $this->_build(); + return $st->fetch(\PDO::FETCH_ASSOC); + } + + /** + * create object with one row + * + * @param string $column + * @param mixed $value + * + * @return \stdObject + */ + public function oneObject($column = null, $value = null) + { + if ($column !== null) { + $this->where($column, $value); + } + $st = $this->_build(); + return $st->fetch(\PDO::FETCH_OBJ); + } + + /** + * create JSON array with one row + * + * @param string $column + * @param mixed $value + * + * @return string + */ + public function oneJson($column = null, $value = null) + { + if ($column !== null) { + $this->where($column, $value); + } + $row = $this->oneArray(); + return json_encode($row, static::$options['json_options']); + } + + /** + * returns rows count + * + * @return integer + */ + public function count() + { + $st = $this->_build('count'); + return $st->fetchColumn(); + } + + /** + * Last inserted id + * + * @return integer + */ + public function lastInsertId() + { + return static::$db->lastInsertId(); + } + + /** + * DELETE + * + * @param string $column + * @param mixed $value + */ + public function delete($column = null, $value = null) + { + if ($column !== null) { + $this->where($column, $value); + } + $st = $this->_build('delete'); + return $st->rowCount(); + } + + /** + * Create SQL query + * + * @param $type `default`, `delete`, `count` + * + * @return string + */ + public function toSql($type = 'default') + { + $sql = ''; + $sql_where = ''; + $sql_having = ''; + + // build conditions + $conditions = implode(' ', $this->conditions); + $conditions = str_replace(['( ', ' )'], ['(', ')'], $conditions); + if ($conditions) { + $sql_where .= " WHERE $conditions"; + } + + // build having + $having = implode(' ', $this->having); + if ($having) { + $sql_having .= " HAVING $having"; + } + + // if some columns have set value then UPDATE or INSERT + if ($this->sets) { + // get table columns + $table_cols = $this->_getColumns(); + + // Update updated_at column if exists + if (in_array('updated_at', $table_cols) && !array_key_exists('updated_at', $this->sets)) { + $this->set('updated_at', time()); + } + + // if there are some conditions then UPDATE + if (!empty($this->conditions)) { + $insert = false; + $columns = implode('=?,', array_keys($this->sets)) . '=?'; + $this->set_binds = array_values($this->sets); + $sql = "UPDATE $this->table SET $columns"; + $sql .= $sql_where; + + return $sql; + } + // if there aren't conditions, then INSERT + else { + // Update created_at column if exists + if (in_array('created_at', $table_cols) && !array_key_exists('created_at', $this->sets)) { + $this->set('created_at', time()); + } + + $columns = implode(',', array_keys($this->sets)); + $this->set_binds = array_values($this->sets); + $qs = implode(',', array_fill(0, count($this->sets), '?')); + $sql = "INSERT INTO $this->table($columns) VALUES($qs)"; + $this->condition_binds = array(); + + return $sql; + } + } else { + if ($type == 'delete') { + // DELETE + $sql = "DELETE FROM $this->table"; + $sql .= $sql_where; + + return $sql; + } else { + // SELECT + $columns = implode(',', $this->columns); + if (!$columns) { + $columns = '*'; + } + if ($type == 'count') { + $columns = "COUNT($columns) AS count"; + } + $sql = "SELECT $columns FROM $this->table"; + $joins = implode(' ', $this->joins); + if ($joins) { + $sql .= " $joins"; + } + $order = ''; + if (count($this->orders) > 0) { + $order = ' ORDER BY ' . implode(',', $this->orders); + } + + $group_by = ''; + if (count($this->group_by) > 0) { + $group_by = ' GROUP BY ' . implode(',', $this->group_by); + } + + $sql .= $sql_where . $group_by . $order . $sql_having . $this->limit . $this->offset; + + return $sql; + } + } + + return null; + } + /** + * build SQL query + * + * @param array $type `default`, `delete`, `count` + * + * @return PDOStatement + */ + protected function _build($type = 'default') + { + return $this->_query($this->toSql($type)); + } + + /** + * execute SQL query + * + * @param string $sql + * + * @return PDOStatement + */ + protected function _query($sql) + { + $binds = array_merge($this->set_binds, $this->condition_binds); + $st = static::$db->prepare($sql); + foreach ($binds as $key => $bind) { + $pdo_param = \PDO::PARAM_STR; + if (is_numeric($bind)) { + $pdo_param = \PDO::PARAM_INT; + } + $st->bindValue($key+1, $bind, $pdo_param); + } + $st->execute(); + static::$last_sqls[] = $sql; + return $st; + } + + /** + * Get current table columns + * + * @return array + */ + protected function _getColumns() + { + $q = $this->pdo()->query("PRAGMA table_info(".$this->table.")")->fetchAll(); + return array_column($q, 'name'); + } +} diff --git a/inc/core/lib/Router.php b/inc/core/lib/Router.php new file mode 100644 index 0000000..16e83ad --- /dev/null +++ b/inc/core/lib/Router.php @@ -0,0 +1,110 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * Batflat Router class + */ +class Router +{ + /** + * Declared routes + * + * @var array + */ + private $routes = array(); + + /** + * Route patterns that converts to regexp style + * + * @var array + */ + private $patterns = array( + ':any' => '.*', + ':int' => '[0-9]+', + ':str' => '[a-zA-Z0-9_-]+', + ); + + /** + * Set route + * + * @param string $pattern + * @param callable $callback + * @return void + */ + public function set($pattern, $callback) + { + $pattern = str_replace('/', '\/', $pattern); + + $this->routes[$pattern] = $callback; + } + + /** + * Executes routing and parse matches + * + * @param boolean $returnPath + * @return mixed + */ + public function execute($returnPath = false) + { + if (empty($path) && empty($_SERVER['PATH_INFO'])) { + $_SERVER['PATH_INFO'] = explode("?", $_SERVER['REQUEST_URI'])[0]; + } + + $url = rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/'); + $url = trim(str_replace($url, '', $_SERVER['PATH_INFO']), '/'); + + if ($returnPath) { + return $url; + } + + $patterns = '/('.implode('|', array_keys($this->patterns)).')/'; + uksort($this->routes, function ($a, $b) use ($patterns) { + $pointsA = preg_match_all('/(\/)/', $a); + $pointsB = preg_match_all('/(\/)/', $b); + + if ($pointsA == $pointsB) { + $pointsA = preg_match_all($patterns, $a); + $pointsB = preg_match_all($patterns, $b); + } + + return $pointsA > $pointsB; + }); + + foreach ($this->routes as $pattern => $callback) { + if (strpos($pattern, ':') !== false) { + $pattern = str_replace(array_keys($this->patterns), array_values($this->patterns), $pattern); + } + if (preg_match('#^'.$pattern.'$#', $url, $params) === 1) { + array_shift($params); + array_walk($params, function (&$val) { + $val = $val ?: null; + }); + + return call_user_func_array($callback, array_values($params)); + } + } + + Event::call('router.notfound'); + } + + /** + * Change current "path" to custom + * + * @param string $path + * @return void + */ + public function changeRoute($path) + { + $_SERVER['PATH_INFO'] = $path; + } +} diff --git a/inc/core/lib/Settings.php b/inc/core/lib/Settings.php new file mode 100644 index 0000000..6268708 --- /dev/null +++ b/inc/core/lib/Settings.php @@ -0,0 +1,113 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * Batflat modules settings + */ +class Settings +{ + /** + * Instance of core class + * + * @var \Inc\Core\Main + */ + protected $core; + + /** + * Cached settings variables + * + * @var array + */ + protected $cache = []; + + /** + * Settings constructor + * + * @param \Inc\Core\Main $core + */ + public function __construct(\Inc\Core\Main $core) + { + $this->core = $core; + $this->reload(); + } + + /** + * Get all settings + * + * @return array + */ + public function all() + { + return $this->cache; + } + + /** + * Fetch fresh data from database + * + * @return void + */ + public function reload() + { + $results = $this->core->db('settings')->toArray(); + foreach ($results as $result) { + $this->cache[$result['module']][$result['field']] = $result['value']; + } + } + + /** + * Get specified field + * + * @param string $module Example 'module' or shorter 'module.field' + * @param string $field OPTIONAL + * @return string + */ + public function get($module, $field = false) + { + if (substr_count($module, '.') == 1) { + list($module, $field) = explode('.', $module); + } + + if (empty($field)) { + return $this->cache[$module]; + } + + return $this->cache[$module][$field]; + } + + /** + * Save specified settings value + * + * @param string $module Example 'module' or shorter 'module.field' + * @param string $field If module has field it contains value + * @param string $value OPTIONAL + * @return bool + */ + public function set($module, $field, $value = false) + { + if (substr_count($module, '.') == 1) { + $value = $field; + list($module, $field) = explode('.', $module); + } + + if ($value === false) { + throw new \Exception('Value cannot be empty'); + } + + if ($this->core->db('settings')->where('module', $module)->where('field', $field)->save(['value' => $value])) { + $this->cache[$module][$field] = $value; + return true; + } + + return false; + } +} diff --git a/inc/core/lib/Templates.php b/inc/core/lib/Templates.php new file mode 100644 index 0000000..f3373b1 --- /dev/null +++ b/inc/core/lib/Templates.php @@ -0,0 +1,306 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * Templates class + */ +class Templates +{ + /** + * Variables for template usage + * + * @var array + */ + private $data = []; + + /** + * Temporary directory for Templates cache + * + * @var string + */ + private $tmp = 'tmp/'; + + /** + * Template tags list + * + * @var array + */ + private $tags = [ + '{\*(.*?)\*}' => 'self::comment', + '{noparse}(.*?){\/noparse}' => 'self::noParse', + '{if: ([^}]*)}' => '', + '{else}' => '', + '{elseif: ([^}]*)}' => '', + '{\/if}' => '', + '{loop: ([^}]*) as ([^}]*)=>([^}]*)}' => '$3): ?>', + '{loop: ([^}]*) as ([^}]*)}' => ' $2): ?>', + '{loop: ([^}]*)}' => ' $value): ?>', + '{\/loop}' => '', + '{\?(\=){0,1}([^}]*)\?}' => '', + '{(\$[a-zA-Z\-\._\[\]\'"0-9]+)}' => '', + '{(\$[a-zA-Z\-\._\[\]\'"0-9]+)\|e}' => '', + '{(\$[a-zA-Z\-\._\[\]\'"0-9]+)\|cut:([0-9]+)}' => '', + '{widget: ([\.\-a-zA-Z0-9]+)}' => '', + '{include: (.+?\.[a-z]{2,4})}' => '', + '{template: (.+?\.[a-z]{2,4})}' => '', + '{lang: ([a-z]{2}_[a-z]+)}' => '', + '{/lang}' => '', + ]; + + /** + * Instance of Batflat core class + * + * @var \Inc\Core\Main + */ + public $core; + + /** + * Templates constructor + * + * @param Inc\Core\Main $object + */ + public function __construct($object) + { + $this->core = $object; + if (!file_exists($this->tmp)) { + mkdir($this->tmp); + } + } + + /** + * set variable + * @param string $name + * @param mixed $value + * @return Templates $this + */ + public function set($name, $value) + { + $this->data[$name] = $value; + + return $this; + } + + /** + * append array variable + * @param string $name + * @param mixed $value + * @return void + */ + public function append($name, $value) + { + $this->data[$name][] = $value; + } + + /** + * content parsing + * @param string $content + * @return string + */ + private function parse($content) + { + // replace tags with PHP + foreach ($this->tags as $regexp => $replace) { + if (strpos($replace, 'self') !== false) { + $content = preg_replace_callback('#'.$regexp.'#s', $replace, $content); + } else { + $content = preg_replace('#'.$regexp.'#', $replace, $content); + } + } + + // replace variables + if (preg_match_all('/(\$(?:[a-zA-Z0-9_-]+)(?:\.(?:(?:[a-zA-Z0-9_-][^\s]+)))*)/', $content, $matches)) { + $matches = $this->organize_array($matches); + usort($matches, function ($a, $b) { + return strlen($a[0]) < strlen($b[0]); + }); + + foreach ($matches as $match) { + // $a.b to $a["b"] + $rep = $this->replaceVariable($match[1]); + $content = str_replace($match[0], $rep, $content); + } + } + + // remove spaces betweend %% and $ + $content = preg_replace('/\%\%\s+/', '%%', $content); + + // call cv() for signed variables + if (preg_match_all('/\%\%(.)([a-zA-Z0-9_-]+)/', $content, $matches)) { + $matches = $this->organize_array($matches); + usort($matches, function ($a, $b) { + return strlen($a[2]) < strlen($b[2]); + }); + + foreach ($matches as $match) { + if ($match[1] == '$') { + $content = str_replace($match[0], 'cv($'.$match[2].')', $content); + } else { + $content = str_replace($match[0], $match[1].$match[2], $content); + } + } + } + + return $content; + } + + /** + * Organize preg_match_all matches array + * + * @param array $input + * @return array + */ + protected function organize_array($input) + { + for ($z = 0; $z < count($input); $z++) { + for ($x = 0; $x < count($input[$z]); $x++) { + $rt[$x][$z] = $input[$z][$x]; + } + } + + return $rt; + } + + /** + * execute PHP code + * @param string $file + * @return string + */ + private function execute($file, $counter = 0) + { + $pathInfo = pathinfo($file); + $tmpFile = $this->tmp.$pathInfo['basename']; + + if (!is_file($file)) { + echo "Template '$file' not found."; + } else { + $content = file_get_contents($file); + + if ($this->searchTags($content) && ($counter < 3)) { + file_put_contents($tmpFile, $content); + $content = $this->execute($tmpFile, ++$counter); + } + file_put_contents($tmpFile, $this->parse($content)); + + extract($this->data, EXTR_SKIP); + + ob_start(); + include($tmpFile); + if (!DEV_MODE) { + unlink($tmpFile); + } + return ob_get_clean(); + } + } + + /** + * display compiled code + * @param string $file + * @param bool $last + * @return string + */ + public function draw($file, $last = false) + { + if (preg_match('#inc(\/modules\/[^"]*\/)view\/([^"]*.'.pathinfo($file, PATHINFO_EXTENSION).')#', $file, $m)) { + $themeFile = THEMES.'/'.$this->core->settings->get('settings.theme').$m[1].$m[2]; + if (is_file($themeFile)) { + $file = $themeFile; + } + } + + $result = $this->execute($file); + if (!$last) { + return $result; + } else { + $result = str_replace(['*bracket*','*/bracket*'], ['{', '}'], $result); + $result = str_replace('*dollar*', '$', $result); + + if (HTML_BEAUTY) { + $tidyHTML = new Indenter; + return $tidyHTML->indent($result); + } + return $result; + } + } + + /** + * replace signs {,},$ in string with *words* + * @param string $content + * @return string + */ + public function noParse($content) + { + if (is_array($content)) { + $content = $content[1]; + } + $content = str_replace(['{', '}'], ['*bracket*', '*/bracket*'], $content); + return str_replace('$', '*dollar*', $content); + } + + /** + * replace signs {,},$ in array with *words* + * @param arry $array + * @return array + */ + public function noParse_array($array) + { + foreach ($array as $key => $value) { + if (is_array($value)) { + $array[$key] = $this->noParse_array($value); + } else { + $array[$key] = $this->noParse($value); + } + } + return $array; + } + + /** + * remove selected content from source code + * @param string $content + * @return null + */ + public function comment($content) + { + return null; + } + + /** + * search tags in content + * @param string $content + * @return bool + */ + private function searchTags($content) + { + foreach ($this->tags as $regexp => $replace) { + if (preg_match('#'.$regexp.'#sU', $content, $matches)) { + return true; + } + } + return false; + } + + /** + * Replace dot based variable to PHP version + * $a.b => $a['b'] + * + * @param string $var + * @return string + */ + private function replaceVariable($var) + { + if (strpos($var, '.') === false) { + return $var; + } + + return preg_replace('/\.([a-zA-Z\-_0-9]*(?![a-zA-Z\-_0-9]*(\'|\")))/', "['$1']", $var); + } +} diff --git a/inc/core/lib/Widget.php b/inc/core/lib/Widget.php new file mode 100644 index 0000000..ba2d6fb --- /dev/null +++ b/inc/core/lib/Widget.php @@ -0,0 +1,53 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Core\Lib; + +/** + * Widgets class + */ +class Widget +{ + /** @var array Widgets collection */ + protected static $widgets = []; + + /** + * Add widget to collection + * + * @param string $name + * @param callable $callback + * @return void + */ + public static function add($name, callable $callback) + { + static::$widgets[$name][] = $callback; + } + + /** + * Execute all widgets and get content + * + * @param string $name + * @param array $params + * @return string + */ + public static function call($name, $params = []) + { + $result = []; + foreach (isset_or(static::$widgets[$name], []) as $widget) { + $content = call_user_func_array($widget, $params); + if (is_string($content)) { + $result[] = $content; + } + } + + return implode("\n", $result); + } +} diff --git a/inc/core/lib/functions.php b/inc/core/lib/functions.php new file mode 100644 index 0000000..12b2af3 --- /dev/null +++ b/inc/core/lib/functions.php @@ -0,0 +1,423 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + +/** + * check if array have an empty values + * + * @param array $keys + * @param array $array + * + * @return boolean + */ +function checkEmptyFields(array $keys, array $array) +{ + foreach ($keys as $field) { + if (empty($array[$field])) { + return true; + } + } + + return false; +} + +/** + * delte dir with files + * + * @param string $path + * + * @return boolean + */ +function deleteDir($path) +{ + return !empty($path) && is_file($path) + ? @unlink($path) + : (array_reduce(glob($path.'/*'), + function ($r, $i) { + return $r && deleteDir($i); + }, true)) + && @rmdir($path); +} + +/** + * remove special chars from string + * + * @param string $text + * + * @return string + */ +function createSlug($text) +{ + setlocale(LC_ALL, 'pl_PL'); + $text = str_replace(' ', '-', trim($text)); + $text = str_replace('.', '-', trim($text)); + $text = iconv('utf-8', 'ascii//translit', $text); + $text = preg_replace('#[^a-z0-9\-]#si', '', $text); + + return strtolower(str_replace('\'', '', $text)); +} + +/** + * convert special chars from array + * + * @param array $array + * + * @return array + */ +function htmlspecialchars_array(array $array) +{ + foreach ($array as $key => $value) { + if (is_array($value)) { + $array[$key] = htmlspecialchars_array($value); + } else { + $array[$key] = htmlspecialchars($value, ENT_QUOTES | ENT_HTML5, 'UTF-8'); + } + } + + return $array; +} + +/** + * convert all characters to HTML entities from array + * + * @param array $array + * + * @return array + */ +function htmlentities_array(array $array) +{ + foreach ($array as $key => $value) { + if (is_array($value)) { + $array[$key] = htmlentities_array($value); + } else { + $array[$key] = htmlentities($value, ENT_QUOTES | ENT_HTML5, 'UTF-8'); + } + } + + return $array; +} + +/** + * redirect to URL + * + * @param string $url + * @param array $data + * + * @return void + */ +function redirect($url, array $data = []) +{ + if ($data) { + $_SESSION['REDIRECT_DATA'] = $data; + } + + header("Location: $url"); + exit(); +} + +/** + * get data from session + * + * @return array or null + */ +function getRedirectData() +{ + if (isset($_SESSION['REDIRECT_DATA'])) { + $tmp = $_SESSION['REDIRECT_DATA']; + unset($_SESSION['REDIRECT_DATA']); + + return $tmp; + } + + return null; +} + +/** + * Returns current url + * + * @param boolean $query + * + * @return string + */ +function currentURL($query = false) +{ + if (isset_or($GLOBALS['core'], null) instanceof \Inc\Core\Admin) { + $url = url(ADMIN.'/'.implode('/', parseURL())); + } else { + $url = url(implode('/', parseURL())); + } + + if ($query) { + return $url.'?'.$_SERVER['QUERY_STRING']; + } else { + return $url; + } +} + +/** + * parse URL + * + * @param int $key + * + * @return mixed array, string or false + */ +function parseURL($key = null) +{ + $url = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/'); + $url = trim(str_replace($url, '', $_SERVER['REQUEST_URI']), '/'); + $url = explode('?', $url); + $array = explode('/', $url[0]); + + if ($key) { + return isset_or($array[$key - 1], false); + } else { + return $array; + } +} + +/** + * add token to URL + * + * @param string $url + * + * @return string + */ +function addToken($url) +{ + if (isset($_SESSION['token'])) { + if (parse_url($url, PHP_URL_QUERY)) { + return $url.'&t='.$_SESSION['token']; + } else { + return $url.'?t='.$_SESSION['token']; + } + } + + return $url; +} + +/** + * create URL + * + * @param string / array $data + * + * @return string + */ +function url($data = null) +{ + if (filter_var($data, FILTER_VALIDATE_URL) !== false) { + return $data; + } + + if (!is_array($data) && strpos($data, '#') === 0) { + return $data; + } + + if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') + || isset_or($_SERVER['SERVER_PORT'], null) == 443 + || isset_or($_SERVER['HTTP_X_FORWARDED_PORT'], null) == 443 + ) { + $protocol = 'https://'; + } else { + $protocol = 'http://'; + } + + $url = trim($protocol.$_SERVER['HTTP_HOST'].dirname($_SERVER['SCRIPT_NAME']), '/\\'); + $url = str_replace('/'.ADMIN, '', $url); + + if (is_array($data)) { + $url = $url.'/'.implode('/', $data); + } elseif ($data) { + $data = str_replace(BASE_DIR.'/', null, $data); + $url = $url.'/'.trim($data, '/'); + } + + if (strpos($url, '/'.ADMIN.'/') !== false) { + $url = addToken($url); + } + + return $url; +} + +/** + * Current domain name + * + * @return string + */ +function domain($with_protocol = true) +{ + $url = parse_url(url()); + + if ($with_protocol) { + return $url['scheme'].'://'.$url['host']; + } + + return $url['host']; +} + +/** + * toggle empty variable + * + * @param mixed $var + * @param mixed $alternate + * + * @return mixed + */ +function isset_or(&$var, $alternate = null) +{ + return (isset($var)) ? $var : $alternate; +} + +/** + * compares two version number strings + * + * @param string $a + * @param string $b + * + * @return int + */ +function cmpver($a, $b) +{ + $a = explode(".", $a); + $b = explode(".", $b); + foreach ($a as $depth => $aVal) { + if (isset($b[$depth])) { + $bVal = $b[$depth]; + } else { + $bVal = "0"; + } + + list($aLen, $bLen) = [strlen($aVal), strlen($bVal)]; + + if ($aLen > $bLen) { + $bVal = str_pad($bVal, $aLen, "0"); + } elseif ($bLen > $aLen) { + $aVal = str_pad($aVal, $bLen, "0"); + } + + if ($aVal == $bVal) { + continue; + } + + if ($aVal > $bVal) { + return 1; + } + + if ($aVal < $bVal) { + return -1; + } + } + + return 0; +} + +/** + * Limits string to specified length and appends with $end value + * + * @param string $text Input text + * @param integer $limit String max length + * @param string $end Appending variable if text is longer than limit + * + * @return string Limited string + */ +function str_limit($text, $limit = 100, $end = '...') +{ + if (mb_strlen($text, 'UTF-8') > $limit) { + return mb_substr($text, 0, $limit, 'UTF-8').$end; + } + + return $text; +} + +/** + * Get response headers list + * + * @param string $key + * + * @return mixed Array of headers or specified header by $key + */ +function get_headers_list($key = null) +{ + $headers_list = headers_list(); + $headers = []; + foreach ($headers_list as $header) { + $e = explode(":", $header); + $headers[strtolower(array_shift($e))] = trim(implode(":", $e)); + } + + if ($key) { + return isset_or($headers[strtolower($key)], false); + } + + return $headers; +} + +/** + * Generating random hash from specified characters + * + * @param int $length Hash length + * @param string $characters Characters for hash + * + * @return string Generated random string + */ +function str_gen($length, $characters = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM") +{ + $return = null; + + if (is_string($characters)) { + $characters = str_split($characters); + } + + for ($i = 0; $i < $length; $i++) { + $return .= $characters[rand(0, count($characters) - 1)]; + } + + return $return; +} + +/** + * Compressed base64_encode + * + * @param strin $string + * + * @return string + */ +function gz64_encode($string) +{ + return str_replace(['+', '/'], ['_', '-'], trim(base64_encode(gzcompress($string, 9)), "=")); +} + +/** + * Decompress base64_decode + * + * @param string $string + * + * @return string + */ +function gz64_decode($string) +{ + return gzuncompress(base64_decode(str_replace(['_', '-'], ['+', '/'], $string))); +} + +/** + * Call variable which can be callback or other type. + * If it is anonymous function it will be executed, otherwise $variable will be returned. + * + * @param mixed $variable + * + * @return mixed + */ +function cv($variable) +{ + if (!is_string($variable) && is_callable($variable)) { + return $variable(); + } + + return $variable; +} diff --git a/inc/css/bootstrap-theme.min.css b/inc/css/bootstrap-theme.min.css new file mode 100644 index 0000000..2e6f5c0 --- /dev/null +++ b/inc/css/bootstrap-theme.min.css @@ -0,0 +1 @@ +@import url("//fonts.googleapis.com/css?family=Open+Sans:300,400,600,700&subset=latin,latin-ext");body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.4;color:#656565;background-color:#f5f5f5}a{color:#656d78}a:hover,a:focus{color:#434a54;text-decoration:underline}.img-rounded{border-radius:0}.img-thumbnail{padding:4px;line-height:1.4;background-color:#f5f5f5;border:1px solid #e9e9e9;border-radius:0}hr{margin-top:21px;margin-bottom:21px;border-top:1px solid #e9e9e9}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{color:#434a54}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:80%}mark,.mark{background-color:#fcf8e3}.text-muted{color:#434a54}.text-primary{color:#434a54}a.text-primary:hover,a.text-primary:focus{color:#2c3138}.text-success{color:#8cc152}a.text-success:hover,a.text-success:focus{color:#72a53b}.text-info{color:#3bafda}a.text-info:hover,a.text-info:focus{color:#2494be}.text-warning{color:#f8be12}a.text-warning:hover,a.text-warning:focus{color:#d19e06}.text-danger{color:#e9573f}a.text-danger:hover,a.text-danger:focus{color:#dc3519}.bg-primary{background-color:#434a54}a.bg-primary:hover,a.bg-primary:focus{background-color:#2c3138}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #e9e9e9}ul,ol{margin-bottom:10.5px}dl{margin-bottom:21px}dt,dd{line-height:1.4}@media (min-width:768px){.dl-horizontal dt{width:160px}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{border-bottom:1px dotted #434a54}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #e9e9e9}blockquote footer,blockquote small,blockquote .small{line-height:1.4;color:#434a54}.blockquote-reverse,blockquote.pull-right{border-right:5px solid #e9e9e9}address{margin-bottom:21px;line-height:1.4}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#656565;background-color:#f6f8fa;border-radius:0}kbd{color:#fff;background-color:#333;border-radius:0}pre{padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.4;color:#656d78;background-color:#f6f8fa;border:1px solid #e9e9e9;border-radius:0}.pre-scrollable{max-height:340px}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#434a54}.table{margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.4;border-top:1px solid #e9e9e9}.table>thead>tr>th{border-bottom:2px solid #e9e9e9}.table>tbody+tbody{border-top:2px solid #e9e9e9}.table .table{background-color:#f5f5f5}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #e9e9e9}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #e9e9e9}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{margin-bottom:15.75px;border:1px solid #e9e9e9}}legend{margin-bottom:21px;font-size:22.5px;color:#656d78;border-bottom:1px solid #e5e5e5}output{padding-top:9px;font-size:15px;line-height:1.4;color:#434a54}.form-control{height:39px;padding:8px 12px;font-size:15px;line-height:1.4;color:#434a54;background-color:#fff;border:1px solid #ccc;border-radius:0}.form-control:focus{border-color:#ffce54;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(255, 206, 84, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(255, 206, 84, 0.6)}.form-control::-moz-placeholder{color:#ccd1d9;opacity:1}.form-control:-ms-input-placeholder{color:#ccd1d9}.form-control::-webkit-input-placeholder{color:#ccd1d9}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ccd1d9}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:39px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:36px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:60px}}.form-group{margin-bottom:15px}.radio label,.checkbox label{min-height:21px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:9px;padding-bottom:9px;min-height:36px}.input-sm{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}select.input-sm{height:36px;line-height:36px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:36px;padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}.form-group-sm select.form-control{height:36px;line-height:36px}.form-group-sm .form-control-static{height:36px;min-height:33px;padding:9px 12px;font-size:12px;line-height:1.5}.input-lg{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}select.input-lg{height:60px;line-height:60px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:60px;padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}.form-group-lg select.form-control{height:60px;line-height:60px}.form-group-lg .form-control-static{height:60px;min-height:40px;padding:17px 20px;font-size:19px;line-height:1.3333333}.has-feedback .form-control{padding-right:48.75px}.form-control-feedback{width:39px;height:39px;line-height:39px}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:60px;height:60px;line-height:60px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:36px;height:36px;line-height:36px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#8cc152}.has-success .form-control{border-color:#8cc152;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#72a53b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #bedc9d;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #bedc9d}.has-success .input-group-addon{color:#8cc152;border-color:#8cc152;background-color:#dff0d8}.has-success .form-control-feedback{color:#8cc152}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#f8be12}.has-warning .form-control{border-color:#f8be12;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#d19e06;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fbd975;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fbd975}.has-warning .input-group-addon{color:#f8be12;border-color:#f8be12;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#f8be12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#e9573f}.has-error .form-control{border-color:#e9573f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#dc3519;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f3a79b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #f3a79b}.has-error .input-group-addon{color:#e9573f;border-color:#e9573f;background-color:#f2dede}.has-error .form-control-feedback{color:#e9573f}.has-feedback label~.form-control-feedback{top:26px}.help-block{color:#a5a5a5}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:9px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:30px}@media (min-width:768px){.form-horizontal .control-label{padding-top:9px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:17px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:9px;font-size:12px}}.btn{font-weight:normal;padding:8px 12px;font-size:15px;line-height:1.4;border-radius:0}.btn:hover,.btn:focus,.btn.focus{color:#434a54}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed}.btn-default{color:#434a54;background-color:#e6e9ed;border-color:#656d78}.btn-default:focus,.btn-default.focus{color:#434a54;background-color:#ccd1d9;border-color:#656d78}.btn-default:hover{color:#434a54;background-color:#ccd1d9;border-color:#717a86}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#434a54;background-color:#ccd1d9;border-color:#717a86}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#434a54;background-color:#ccd1d9;border-color:#656d78}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#e6e9ed;border-color:#656d78}.btn-default .badge{color:#e6e9ed;background-color:#434a54}.btn-primary{color:#fff;background-color:#434a54;border-color:#383e46}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#656d78;border-color:#383e46}.btn-primary:hover{color:#fff;background-color:#656d78;border-color:#434a54}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#656d78;border-color:#434a54}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#656d78;border-color:#383e46}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#434a54;border-color:#383e46}.btn-primary .badge{color:#434a54;background-color:#fff}.btn-success{color:#fff;background-color:#8cc152;border-color:#7fb842}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#a0d468;border-color:#7fb842}.btn-success:hover{color:#fff;background-color:#a0d468;border-color:#8cc152}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#a0d468;border-color:#8cc152}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#a0d468;border-color:#7fb842}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#8cc152;border-color:#7fb842}.btn-success .badge{color:#8cc152;background-color:#fff}.btn-info{color:#fff;background-color:#3bafda;border-color:#28a5d4}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#4fc1e9;border-color:#28a5d4}.btn-info:hover{color:#fff;background-color:#4fc1e9;border-color:#3bafda}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#4fc1e9;border-color:#3bafda}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#4fc1e9;border-color:#28a5d4}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#3bafda;border-color:#28a5d4}.btn-info .badge{color:#3bafda;background-color:#fff}.btn-warning{color:#fff;background-color:#f8be12;border-color:#eab007}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ffce54;border-color:#eab007}.btn-warning:hover{color:#fff;background-color:#ffce54;border-color:#f8be12}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ffce54;border-color:#f8be12}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#ffce54;border-color:#eab007}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f8be12;border-color:#eab007}.btn-warning .badge{color:#f8be12;background-color:#fff}.btn-danger{color:#fff;background-color:#e9573f;border-color:#e64328}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#fc6e51;border-color:#e64328}.btn-danger:hover{color:#fff;background-color:#fc6e51;border-color:#e9573f}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#fc6e51;border-color:#e9573f}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#fc6e51;border-color:#e64328}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#e9573f;border-color:#e64328}.btn-danger .badge{color:#e9573f;background-color:#fff}.btn-link{color:#656d78}.btn-link:hover,.btn-link:focus{color:#434a54;text-decoration:underline}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#ccd1d9}.btn-lg{padding:16px 20px;font-size:19px;line-height:1.3333333;border-radius:0}.btn-sm{padding:8px 12px;font-size:12px;line-height:1.5;border-radius:0}.btn-xs{padding:4px 6px;font-size:12px;line-height:1.5;border-radius:0}.caret{border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-menu{font-size:15px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:rgba(0,0,0,0.2)}.dropdown-menu>li>a{line-height:1.4;color:#555}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#59606a;background-color:#eee}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;background-color:#434a54}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#ccd1d9}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{cursor:not-allowed}.dropdown-header{font-size:12px;line-height:1.4;color:#ccd1d9}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-bottom:4px dashed;border-bottom:4px solid \9}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.input-group-addon{padding:8px 12px;font-size:15px;color:#434a54;background-color:#e6e9ed;border:1px solid #ccc;border-radius:0}.input-group-addon.input-sm{padding:8px 12px;font-size:12px;border-radius:0}.input-group-addon.input-lg{padding:16px 20px;font-size:19px;border-radius:0}.nav>li>a{padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{background-color:#e6e9ed}.nav>li.disabled>a{color:#ccd1d9}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#ccd1d9;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#e6e9ed;border-color:#656d78}.nav-tabs{border-bottom:1px solid #e9e9e9}.nav-tabs>li>a{line-height:1.4;border-radius:0 0 0 0;color:#aab2bd}.nav-tabs>li>a:hover{border-color:#e6e9ed #e6e9ed #e9e9e9}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#656565;background-color:#f5f5f5;border:1px solid #e9e9e9}.nav-pills>li>a{border-radius:0}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#434a54}.nav-tabs-justified>li>a{border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #e9e9e9}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #e9e9e9;border-radius:0 0 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#f5f5f5}}.navbar{min-height:50px;margin-bottom:21px}@media (min-width:768px){.navbar{border-radius:0}}.navbar-collapse{padding-right:15px;padding-left:15px}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-brand{padding:14.5px 15px;font-size:19px;line-height:21px;height:50px}.navbar-toggle{margin-right:15px;border-radius:0}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.25px -15px}.navbar-nav>li>a{line-height:21px}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:14.5px;padding-bottom:14.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;margin-top:5.5px;margin-bottom:5.5px}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0}.navbar-btn{margin-top:5.5px;margin-bottom:5.5px}.navbar-btn.btn-sm{margin-top:7px;margin-bottom:7px}.navbar-text{margin-top:14.5px;margin-bottom:14.5px}@media (min-width:768px){.navbar-text{margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-right{margin-right:-15px}}.navbar-default{background-color:#333;border-color:#222}.navbar-default .navbar-brand{color:#fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#fff;background-color:none}.navbar-default .navbar-text{color:#fff}.navbar-default .navbar-nav>li>a{color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#1a1a1a}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#1a1a1a}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#1a1a1a}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#222}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#1a1a1a;color:#fff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#1a1a1a}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#1a1a1a}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#fff}.navbar-default .navbar-link:hover{color:#fff}.navbar-default .btn-link{color:#fff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#fff}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#fff;border-color:#e6e9ed}.navbar-inverse .navbar-brand{color:#656565}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#656d78;background-color:transparent}.navbar-inverse .navbar-text{color:#434a54}.navbar-inverse .navbar-nav>li>a{color:#656565}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#656d78;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#656d78;background-color:transparent}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:transparent}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ccc}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#ededed}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:transparent;color:#656d78}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#e6e9ed}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#e6e9ed}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#656565}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#656d78;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#656d78;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#656565}.navbar-inverse .navbar-link:hover{color:#656d78}.navbar-inverse .btn-link{color:#656565}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#656d78}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#ccc}.breadcrumb{padding:8px 15px;margin-bottom:21px;background-color:#f5f5f5;border-radius:0}.breadcrumb>li+li:before{content:"/\00a0";color:#ccd1d9}.breadcrumb>.active{color:#656d78}.pagination{margin:21px 0;border-radius:0}.pagination>li>a,.pagination>li>span{padding:8px 12px;line-height:1.4;color:#656d78;background-color:transparent;border:1px solid transparent}.pagination>li:first-child>a,.pagination>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#434a54;background-color:#e6e9ed;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{color:#fff;background-color:#434a54;border-color:transparent}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#ccd1d9;background-color:#fff;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:16px 20px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:8px 12px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:0;border-top-right-radius:0}.pager{margin:21px 0}.pager li>a,.pager li>span{background-color:transparent;border:1px solid transparent;border-radius:3px}.pager li>a:hover,.pager li>a:focus{background-color:#e6e9ed}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#ccd1d9;background-color:transparent;cursor:not-allowed}.label{color:#fff}a.label:hover,a.label:focus{color:#fff}.label-default{background-color:#aab2bd}.label-default[href]:hover,.label-default[href]:focus{background-color:#8d98a7}.label-primary{background-color:#434a54}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#2c3138}.label-success{background-color:#8cc152}.label-success[href]:hover,.label-success[href]:focus{background-color:#72a53b}.label-info{background-color:#3bafda}.label-info[href]:hover,.label-info[href]:focus{background-color:#2494be}.label-warning{background-color:#f8be12}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#d19e06}.label-danger{background-color:#e9573f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#dc3519}.badge{font-size:12px;font-weight:bold;color:#fff;line-height:1;background-color:#434a54;border-radius:10px}a.badge:hover,a.badge:focus{color:#fff}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#656d78;background-color:#fff}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#fafafa}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px}.jumbotron>hr{border-top-color:#e1e1e1}.container .jumbotron,.container-fluid .jumbotron{border-radius:0;padding-left:15px;padding-right:15px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{padding:4px;margin-bottom:21px;line-height:1.4;background-color:#f5f5f5;border:1px solid #e9e9e9;border-radius:0}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#656d78}.thumbnail .caption{padding:9px;color:#656565}.alert{padding:15px;margin-bottom:21px;border-radius:0}.alert .alert-link{font-weight:bold}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-success{background-color:#8cc152;border-color:#7fb842;color:#fff}.alert-success hr{border-top-color:#72a53b}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#3bafda;border-color:#269ecb;color:#fff}.alert-info hr{border-top-color:#228eb6}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f8be12;border-color:#eab007;color:#fff}.alert-warning hr{border-top-color:#d19e06}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#e9573f;border-color:#e64328;color:#fff}.alert-danger hr{border-top-color:#dc3519}.alert-danger .alert-link{color:#e6e6e6}.progress{height:21px;margin-bottom:21px;background-color:#f5f5f5;border-radius:0}.progress-bar{font-size:12px;line-height:21px;color:#fff;background-color:#434a54}.progress-bar-success{background-color:#8cc152}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#3bafda}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f8be12}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e9573f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.list-group-item{background-color:#fff;border:1px solid #e9e9e9}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{border-bottom-right-radius:0;border-bottom-left-radius:0}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{color:#555;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#e6e9ed;color:#ccd1d9;cursor:not-allowed}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#ccd1d9}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{color:#fff;background-color:#434a54;border-color:#434a54}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#a9b0ba}.list-group-item-success{color:#8cc152;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#8cc152}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#8cc152;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#8cc152;border-color:#8cc152}.list-group-item-info{color:#3bafda;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#3bafda}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#3bafda;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#3bafda;border-color:#3bafda}.list-group-item-warning{color:#f8be12;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#f8be12}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#f8be12;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#f8be12;border-color:#f8be12}.list-group-item-danger{color:#e9573f;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#e9573f}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#e9573f;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#e9573f;border-color:#e9573f}.panel{margin-bottom:21px;background-color:#fff;border-radius:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-top-right-radius:-1;border-top-left-radius:-1}.panel-title{font-size:17px}.panel-footer{padding:10px 15px;background-color:#fafafa;border-top:1px solid #e9e9e9;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:-1;border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:-1;border-top-right-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:-1}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:-1}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:-1;border-bottom-right-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:-1}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:-1}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #e9e9e9}.panel-group{margin-bottom:21px}.panel-group .panel{border-radius:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #e9e9e9}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #e9e9e9}.panel-default{border-color:#e9e9e9}.panel-default>.panel-heading{color:#616262;background-color:#fafafa;border-color:#e9e9e9}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e9e9e9}.panel-default>.panel-heading .badge{color:#fafafa;background-color:#616262}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e9e9e9}.panel-primary{border-color:#434a54}.panel-primary>.panel-heading{color:#fff;background-color:#434a54;border-color:#434a54}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#434a54}.panel-primary>.panel-heading .badge{color:#434a54;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#434a54}.panel-success{border-color:#e9e9e9}.panel-success>.panel-heading{color:#fff;background-color:#8cc152;border-color:#e9e9e9}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e9e9e9}.panel-success>.panel-heading .badge{color:#8cc152;background-color:#fff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e9e9e9}.panel-info{border-color:#e9e9e9}.panel-info>.panel-heading{color:#fff;background-color:#3bafda;border-color:#e9e9e9}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e9e9e9}.panel-info>.panel-heading .badge{color:#3bafda;background-color:#fff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e9e9e9}.panel-warning{border-color:#e9e9e9}.panel-warning>.panel-heading{color:#fff;background-color:#f8be12;border-color:#e9e9e9}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e9e9e9}.panel-warning>.panel-heading .badge{color:#f8be12;background-color:#fff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e9e9e9}.panel-danger{border-color:#e9e9e9}.panel-danger>.panel-heading{color:#fff;background-color:#e9573f;border-color:#e9e9e9}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e9e9e9}.panel-danger>.panel-heading .badge{color:#e9573f;background-color:#fff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e9e9e9}.well{background-color:#fafafa;border:1px solid #e8e8e8;border-radius:0}.well-lg{border-radius:0}.well-sm{border-radius:0}.close{font-size:22.5px;font-weight:bold;color:#fff;text-shadow:0 1px 0 #fff}.close:hover,.close:focus{color:#fff}.modal-content{background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:0}.modal-backdrop{background-color:#000}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-title{line-height:1.4}.modal-body{padding:20px}.modal-footer{padding:20px;border-top:1px solid #e5e5e5}@media (min-width:768px){.modal-dialog{width:600px}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{font-size:12px}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;color:#fff;background-color:#434a54;border-radius:0}.tooltip.top .tooltip-arrow{margin-left:-5px;border-width:5px 5px 0;border-top-color:#434a54}.tooltip.top-left .tooltip-arrow{right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#434a54}.tooltip.top-right .tooltip-arrow{left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#434a54}.tooltip.right .tooltip-arrow{margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#434a54}.tooltip.left .tooltip-arrow{margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#434a54}.tooltip.bottom .tooltip-arrow{margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#434a54}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#434a54}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#434a54}.popover{max-width:276px;font-size:15px;background-color:#656d78;border:1px solid #656d78;border:1px solid transparent;border-radius:0}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{font-size:15px;background-color:#656d78;border-bottom:1px solid #59606a;border-radius:-1 -1 0 0}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px}.popover.top>.arrow{margin-left:-11px;border-top-color:#363b41;border-top-color:rgba(0,0,0,0.05);bottom:-11px}.popover.top>.arrow:after{margin-left:-10px;border-top-color:#656d78}.popover.right>.arrow{left:-11px;margin-top:-11px;border-right-color:#363b41;border-right-color:rgba(0,0,0,0.05)}.popover.right>.arrow:after{bottom:-10px;border-right-color:#656d78}.popover.bottom>.arrow{margin-left:-11px;border-bottom-color:#363b41;border-bottom-color:rgba(0,0,0,0.05);top:-11px}.popover.bottom>.arrow:after{margin-left:-10px;border-bottom-color:#656d78}.popover.left>.arrow{right:-11px;margin-top:-11px;border-left-color:#363b41;border-left-color:rgba(0,0,0,0.05)}.popover.left>.arrow:after{border-left-color:#656d78;bottom:-10px}.carousel-control{width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control:hover,.carousel-control:focus{color:#fff}.carousel-indicators li{border:1px solid #fff}.carousel-indicators .active{background-color:#fff}.carousel-caption{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,0.6)}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}}.navbar-inverse .badge{background-color:#fff;color:#434a54}body{-webkit-font-smoothing:antialiased}.text-primary,.text-primary:hover{color:#434a54}.text-success,.text-success:hover{color:#8cc152}.text-danger,.text-danger:hover{color:#e9573f}.text-warning,.text-warning:hover{color:#f8be12}.text-info,.text-info:hover{color:#3bafda}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success a,.table .success a,table .warning a,.table .warning a,table .danger a,.table .danger a,table .info a,.table .info a{color:#fff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f8be12}.has-warning .form-control,.has-warning .form-control:focus,.has-warning .input-group-addon{border:1px solid #f8be12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#e9573f}.has-error .form-control,.has-error .form-control:focus,.has-error .input-group-addon{border:1px solid #e9573f}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#8cc152}.has-success .form-control,.has-success .form-control:focus,.has-success .input-group-addon{border:1px solid #8cc152}.nav-pills>li>a{border-radius:0}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:none}.close{text-decoration:none;text-shadow:none;opacity:.4}.close:hover,.close:focus{opacity:1}.alert{border:none}.alert .alert-link{text-decoration:underline;color:#fff}.label{border-radius:0}.progress{height:8px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:8px;line-height:8px}.panel-heading,.panel-footer{border-top-right-radius:0;border-top-left-radius:0}.panel-default .close{color:#656565}a.list-group-item-success.active{background-color:#dff0d8}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#d0e9c6}a.list-group-item-warning.active{background-color:#fcf8e3}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#faf2cc}a.list-group-item-danger.active{background-color:#f2dede}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#ebcccc}.modal .close{color:#656565}.popover{color:#656565} \ No newline at end of file diff --git a/inc/css/bootstrap.min.css b/inc/css/bootstrap.min.css new file mode 100644 index 0000000..a9558eb --- /dev/null +++ b/inc/css/bootstrap.min.css @@ -0,0 +1,5 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/inc/data/.gitkeep b/inc/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/inc/fonts/glyphicons-halflings-regular.eot b/inc/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 zcma%hV{j!vx9y2-`@~L8?1^pLwlPU2wr$&<*tR|KBoo`2;LUg6eW-eW-tKDb)vH%` z^`A!Vd<6hNSRMcX|Cb;E|1qflDggj6Kmr)xA10^t-vIc3*Z+F{r%|K(GyE^?|I{=9 zNq`(c8=wS`0!RZy0g3{M(8^tv41d}oRU?8#IBFtJy*9zAN5dcxqGlMZGL>GG%R#)4J zDJ2;)4*E1pyHia%>lMv3X7Q`UoFyoB@|xvh^)kOE3)IL&0(G&i;g08s>c%~pHkN&6 z($7!kyv|A2DsV2mq-5Ku)D#$Kn$CzqD-wm5Q*OtEOEZe^&T$xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr&^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xCk z>w+s)@`O4(4_I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3eV)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHnf$Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk&uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_Bc;$)xN4Ti>Lgg4vaip!%M z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO|9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J$F!EB0YF1je9hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901*R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzql5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=>Exm{b@>UCW|c8vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDRcHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!It#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPmSW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIyi(dvG3<1KoVt>kGV=zZiG7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki<`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r)z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_iSZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56=Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC!HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8)9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaEvC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X)Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpECTbfYgPI4#LZq0PKqnPCD}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNcP{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX>EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr!*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb+*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o*uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m$sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Glu!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P&ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53=MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)VNPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^&E4BGc{m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a`(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y?=H9EYQy8N$8^bni9TpDp zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tveN{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?OknLw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmODaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB@FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u_oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOMs=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!>pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!HpA5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG>bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4Or&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi`5>MxPe(DmjjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL&7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;?bdSt8V&IIi}sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q`rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc`jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f#;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcLL%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIYFPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8Hy`bv}qbgs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgklJV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzzn|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJfV;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq_#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1;M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r<5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}mBO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inc/fonts/glyphicons-halflings-regular.ttf b/inc/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/inc/fonts/glyphicons-halflings-regular.woff2 b/inc/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/inc/jscripts/are-you-sure.min.js b/inc/jscripts/are-you-sure.min.js new file mode 100644 index 0000000..71e4252 --- /dev/null +++ b/inc/jscripts/are-you-sure.min.js @@ -0,0 +1,14 @@ +/*! + * jQuery Plugin: Are-You-Sure (Dirty Form Detection) + * https://github.com/codedance/jquery.AreYouSure/ + * + * Copyright (c) 2012-2014, Chris Dance and PaperCut Software http://www.papercut.com/ + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Author: chris.dance@papercut.com + * Version: 1.9.0 + * Date: 13th August 2014 + */ + +!function(e){e.fn.areYouSure=function(i){var t=e.extend({message:"You have unsaved changes!",dirtyClass:"dirty",change:null,silent:!1,addRemoveFieldsMarksDirty:!1,fieldEvents:"change keyup propertychange input",fieldSelector:":input:not(input[type=submit]):not(input[type=button])"},i),r=function(i){if(i.hasClass("ays-ignore")||i.hasClass("aysIgnore")||i.attr("data-ays-ignore")||void 0===i.attr("name"))return null;if(i.is(":disabled"))return"ays-disabled";var t,r=i.attr("type");switch(i.is("select")&&(r="select"),r){case"checkbox":case"radio":t=i.is(":checked");break;case"select":t="",i.find("option").each(function(i){var r=e(this);r.is(":selected")&&(t+=r.val())});break;default:t=i.val()}return t},n=function(e){e.data("ays-orig",r(e))},a=function(i){var n=function(e){var i=e.data("ays-orig");return void 0===i?!1:r(e)!=i},a=e(this).is("form")?e(this):e(this).parents("form");if(n(e(i.target)))return void o(a,!0);if($fields=a.find(t.fieldSelector),t.addRemoveFieldsMarksDirty){var s=a.data("ays-orig-field-count");if(s!=$fields.length)return void o(a,!0)}var d=!1;$fields.each(function(){return $field=e(this),n($field)?(d=!0,!1):void 0}),o(a,d)},s=function(i){var r=i.find(t.fieldSelector);e(r).each(function(){n(e(this))}),e(r).unbind(t.fieldEvents,a),e(r).bind(t.fieldEvents,a),i.data("ays-orig-field-count",e(r).length),o(i,!1)},o=function(e,i){var r=i!=e.hasClass(t.dirtyClass);e.toggleClass(t.dirtyClass,i),r&&(t.change&&t.change.call(e,e),i&&e.trigger("dirty.areYouSure",[e]),i||e.trigger("clean.areYouSure",[e]),e.trigger("change.areYouSure",[e]))},d=function(){var i=e(this),r=i.find(t.fieldSelector);e(r).each(function(){var i=e(this);i.data("ays-orig")||(n(i),i.bind(t.fieldEvents,a))}),i.trigger("checkform.areYouSure")},u=function(){s(e(this))};return t.silent||window.aysUnloadSet||(window.aysUnloadSet=!0,e(window).bind("beforeunload",function(){if($dirtyForms=e("form").filter("."+t.dirtyClass),0!=$dirtyForms.length){if(navigator.userAgent.toLowerCase().match(/msie|chrome/)){if(window.aysHasPrompted)return;window.aysHasPrompted=!0,window.setTimeout(function(){window.aysHasPrompted=!1},900)}return t.message}})),this.each(function(i){if(e(this).is("form")){var r=e(this);r.submit(function(){r.removeClass(t.dirtyClass)}),r.bind("reset",function(){o(r,!1)}),r.bind("rescan.areYouSure",d),r.bind("reinitialize.areYouSure",u),r.bind("checkform.areYouSure",a),s(r)}})}}(jQuery); \ No newline at end of file diff --git a/inc/jscripts/bootbox.min.js b/inc/jscripts/bootbox.min.js new file mode 100644 index 0000000..0dc0cbd --- /dev/null +++ b/inc/jscripts/bootbox.min.js @@ -0,0 +1,6 @@ +/** + * bootbox.js v4.4.0 + * + * http://bootboxjs.com/license.txt + */ +!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["jquery"],b):"object"==typeof exports?module.exports=b(require("jquery")):a.bootbox=b(a.jQuery)}(this,function a(b,c){"use strict";function d(a){var b=q[o.locale];return b?b[a]:q.en[a]}function e(a,c,d){a.stopPropagation(),a.preventDefault();var e=b.isFunction(d)&&d.call(c,a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){var c,d;if("object"!=typeof a)throw new Error("Please supply an object of options");if(!a.message)throw new Error("Please specify a message");return a=b.extend({},o,a),a.buttons||(a.buttons={}),c=a.buttons,d=f(c),g(c,function(a,e,f){if(b.isFunction(e)&&(e=c[a]={callback:e}),"object"!==b.type(e))throw new Error("button with key "+a+" must be an object");e.label||(e.label=a),e.className||(e.className=2>=d&&f===d-1?"btn-primary":"btn-default")}),a}function i(a,b){var c=a.length,d={};if(1>c||c>2)throw new Error("Invalid argument length");return 2===c||"string"==typeof a[0]?(d[b[0]]=a[0],d[b[1]]=a[1]):d=a[0],d}function j(a,c,d){return b.extend(!0,{},a,i(c,d))}function k(a,b,c,d){var e={className:"bootbox-"+a,buttons:l.apply(null,b)};return m(j(e,d,c),b)}function l(){for(var a={},b=0,c=arguments.length;c>b;b++){var e=arguments[b],f=e.toLowerCase(),g=e.toUpperCase();a[f]={label:d(g)}}return a}function m(a,b){var d={};return g(b,function(a,b){d[b]=!0}),g(a.buttons,function(a){if(d[a]===c)throw new Error("button key "+a+" is not allowed (options are "+b.join("\n")+")")}),a}var n={dialog:"",header:"",footer:"",closeButton:"",form:"
",inputs:{text:"",textarea:"",email:"",select:"",checkbox:"
",date:"",time:"",number:"",password:""}},o={locale:"en",backdrop:"static",animate:!0,className:null,closeButton:!0,show:!0,container:"body"},p={};p.alert=function(){var a;if(a=k("alert",["ok"],["message","callback"],arguments),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback.call(this):!0},p.dialog(a)},p.confirm=function(){var a;if(a=k("confirm",["cancel","confirm"],["message","callback"],arguments),a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,!1)},a.buttons.confirm.callback=function(){return a.callback.call(this,!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return p.dialog(a)},p.prompt=function(){var a,d,e,f,h,i,k;if(f=b(n.form),d={className:"bootbox-prompt",buttons:l("cancel","confirm"),value:"",inputType:"text"},a=m(j(d,arguments,["title","callback"]),["cancel","confirm"]),i=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback.call(this,null)},a.buttons.confirm.callback=function(){var c;switch(a.inputType){case"text":case"textarea":case"email":case"select":case"date":case"time":case"number":case"password":c=h.val();break;case"checkbox":var d=h.find("input:checked");c=[],g(d,function(a,d){c.push(b(d).val())})}return a.callback.call(this,c)},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");if(!n.inputs[a.inputType])throw new Error("invalid prompt type");switch(h=b(n.inputs[a.inputType]),a.inputType){case"text":case"textarea":case"email":case"date":case"time":case"number":case"password":h.val(a.value);break;case"select":var o={};if(k=a.inputOptions||[],!b.isArray(k))throw new Error("Please pass an array of input options");if(!k.length)throw new Error("prompt with select requires options");g(k,function(a,d){var e=h;if(d.value===c||d.text===c)throw new Error("given options in wrong format");d.group&&(o[d.group]||(o[d.group]=b("").attr("label",d.group)),e=o[d.group]),e.append("")}),g(o,function(a,b){h.append(b)}),h.val(a.value);break;case"checkbox":var q=b.isArray(a.value)?a.value:[a.value];if(k=a.inputOptions||[],!k.length)throw new Error("prompt with checkbox requires options");if(!k[0].value||!k[0].text)throw new Error("given options in wrong format");h=b("
"),g(k,function(c,d){var e=b(n.inputs[a.inputType]);e.find("input").attr("value",d.value),e.find("label").append(d.text),g(q,function(a,b){b===d.value&&e.find("input").prop("checked",!0)}),h.append(e)})}return a.placeholder&&h.attr("placeholder",a.placeholder),a.pattern&&h.attr("pattern",a.pattern),a.maxlength&&h.attr("maxlength",a.maxlength),f.append(h),f.on("submit",function(a){a.preventDefault(),a.stopPropagation(),e.find(".btn-primary").click()}),e=p.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){h.focus()}),i===!0&&e.modal("show"),e},p.dialog=function(a){a=h(a);var d=b(n.dialog),f=d.find(".modal-dialog"),i=d.find(".modal-body"),j=a.buttons,k="",l={onEscape:a.onEscape};if(b.fn.modal===c)throw new Error("$.fn.modal is not defined; please double check you have included the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ for more details.");if(g(j,function(a,b){k+="",l[a]=b.callback}),i.find(".bootbox-body").html(a.message),a.animate===!0&&d.addClass("fade"),a.className&&d.addClass(a.className),"large"===a.size?f.addClass("modal-lg"):"small"===a.size&&f.addClass("modal-sm"),a.title&&i.before(n.header),a.closeButton){var m=b(n.closeButton);a.title?d.find(".modal-header").prepend(m):m.css("margin-top","-10px").prependTo(i)}return a.title&&d.find(".modal-title").html(a.title),k.length&&(i.after(n.footer),d.find(".modal-footer").html(k)),d.on("hidden.bs.modal",function(a){a.target===this&&d.remove()}),d.on("shown.bs.modal",function(){d.find(".btn-primary:first").focus()}),"static"!==a.backdrop&&d.on("click.dismiss.bs.modal",function(a){d.children(".modal-backdrop").length&&(a.currentTarget=d.children(".modal-backdrop").get(0)),a.target===a.currentTarget&&d.trigger("escape.close.bb")}),d.on("escape.close.bb",function(a){l.onEscape&&e(a,d,l.onEscape)}),d.on("click",".modal-footer button",function(a){var c=b(this).data("bb-handler");e(a,d,l[c])}),d.on("click",".bootbox-close-button",function(a){e(a,d,l.onEscape)}),d.on("keyup",function(a){27===a.which&&d.trigger("escape.close.bb")}),b(a.container).append(d),d.modal({backdrop:a.backdrop?"static":!1,keyboard:!1,show:!1}),a.show&&d.modal("show"),d},p.setDefaults=function(){var a={};2===arguments.length?a[arguments[0]]=arguments[1]:a=arguments[0],b.extend(o,a)},p.hideAll=function(){return b(".bootbox").modal("hide"),p};var q={bg_BG:{OK:"Ок",CANCEL:"Отказ",CONFIRM:"Потвърждавам"},br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},cs:{OK:"OK",CANCEL:"Zrušit",CONFIRM:"Potvrdit"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},el:{OK:"Εντάξει",CANCEL:"Ακύρωση",CONFIRM:"Επιβεβαίωση"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},et:{OK:"OK",CANCEL:"Katkesta",CONFIRM:"OK"},fa:{OK:"قبول",CANCEL:"لغو",CONFIRM:"تایید"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},he:{OK:"אישור",CANCEL:"ביטול",CONFIRM:"אישור"},hu:{OK:"OK",CANCEL:"Mégsem",CONFIRM:"Megerősít"},hr:{OK:"OK",CANCEL:"Odustani",CONFIRM:"Potvrdi"},id:{OK:"OK",CANCEL:"Batal",CONFIRM:"OK"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},ja:{OK:"OK",CANCEL:"キャンセル",CONFIRM:"確認"},lt:{OK:"Gerai",CANCEL:"Atšaukti",CONFIRM:"Patvirtinti"},lv:{OK:"Labi",CANCEL:"Atcelt",CONFIRM:"Apstiprināt"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},no:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},pt:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Confirmar"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},sq:{OK:"OK",CANCEL:"Anulo",CONFIRM:"Prano"},sv:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},th:{OK:"ตกลง",CANCEL:"ยกเลิก",CONFIRM:"ยืนยัน"},tr:{OK:"Tamam",CANCEL:"İptal",CONFIRM:"Onayla"},zh_CN:{OK:"OK",CANCEL:"取消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"取消",CONFIRM:"確認"}};return p.addLocale=function(a,c){return b.each(["OK","CANCEL","CONFIRM"],function(a,b){if(!c[b])throw new Error("Please supply a translation for '"+b+"'")}),q[a]={OK:c.OK,CANCEL:c.CANCEL,CONFIRM:c.CONFIRM},p},p.removeLocale=function(a){return delete q[a],p},p.setLocale=function(a){return p.setDefaults("locale",a)},p.init=function(c){return a(c||b)},p}); \ No newline at end of file diff --git a/inc/jscripts/bootstrap.min.js b/inc/jscripts/bootstrap.min.js new file mode 100644 index 0000000..9bcd2fc --- /dev/null +++ b/inc/jscripts/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/inc/jscripts/editor/highlight.min.js b/inc/jscripts/editor/highlight.min.js new file mode 100644 index 0000000..f5ac8b8 --- /dev/null +++ b/inc/jscripts/editor/highlight.min.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.11.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}}); \ No newline at end of file diff --git a/inc/jscripts/editor/images/bold.png b/inc/jscripts/editor/images/bold.png new file mode 100644 index 0000000000000000000000000000000000000000..889ae80e37b6167cc15f2a89e05a183815ec18b2 GIT binary patch literal 304 zcmV-00nh%4P)b^}|6b=Y6y(;Y{!a!g z@UQp#@Aw}>L3(}s|7f5BUjeuKZvQRjV<2U7yvu*H{aAbvQ6K!@3oKzW z-{Qa8d3gae1^)HE{~f^!v<1}u>;4xnKvUpW540I-w9J3a{{r=B3T*2g{_BH1CtaZO zpZ`6V0*V5g1e5i;`_=Z#_e=H*@8|93RG@lX;D!K7TKswwko8{x0000LlS^n5Q5c2KWM*m}YV3eAws|yDY&wl?DsIf8f*>k% z<*Hc~7ec_5rHi-`yO3f)SBkFeMi8|t(GpA*#H3ciSWBp+c{r^&PVFO&3C&}i$+#MA zZCZ-`mgm3cyWAfxp=la+gJD~$f3lF*v;Jqx`Q8T$Z@WYD zo5ULg-eG}Z89L0f4Zd=*mecc6xt8;=w2x)zu;*%)sVnHZF8Gfgv50&V?aO?Vg=C`G zqt8;QwVsqD3w#sp>uk4(?#r`&eMV@ShR&fc4IOUt64yxY7gl5?KAAs}zQf1Y-^2&g z$Gu&9-`V$(R7R2uQ}2HsoE!1T1^`G5aq_1Rg+NBCRv6kqwQ}ZBXMdtuFS`d*&78wH z%FqTXD^)8WCsqSp-l}5wzGHH~3TMv4``ZJRQO3=(w6oCI`;E z`gMDg;9p*xrm`moLYyi48W1M{s};+X6Y)q)IQvrJsBPN-$Qt1?9(Dn}gMTvW8Vj;U zv~1YHR;Z*VmZrvRmZz6cE&o6XK(RnVCGj2D!Cx>lhwjfzzEPx#2?dhIYK}l!BvcK! z3)ER+Jz{5>jf6w4x#gTU%_MMNlkNp$oSbvBp&uHw9M;u0-4@=t5BI zP6Hx#-C_{5RMJ z0_P+Xkumexn8%)S+Y)#l(gR;YJP<6#1-=jjK0LONWPdJQIR8uK1HpvVIxBIQ2ztt+ zqoEx_X9S%QGMe=~(k#sebCL-an)%CR%a7YtUOQUgv+G>~?N~XSWhx=? z@$fx}0MB;$`JWcQ-Re{XV~5|{DvU(#*+NF*g)j^qk#b~G9_O!i*y&mZVZ=a3;Go(K z`DkskYn56Nhu+k@1Ke*uY|x zI&k6j$JfNe_a{GH%=n2rZOz$Z8R9V?Pe36hIk}jo+A-`;dt9vyvBu#Xm@veu&@v`| zzt%mwc_$nd0-sMVx2d)b0!MqGxmfCumx7yB#nIUWvA{!HOMfslMyW1iV&nY>zxwyj z8^JfLN|kT z4m^Q1mhO(_r4w@`V?H=YNkOf(i&bHT3Auc3bryK1_{hDSetLoLN{VLB^78ULiNFy^ zkUqqG$fjVkJj5tfWkOn|P5`HVEp5@-mGnc0wvJGHC=+39MC2TWT#i?t*~fNch*he_ zgtS^8dH$(KlW)EF1b4Fzv~?&0IQaNdg;W5&{t&Bmg9&N1-rBBr_;Rg8ekw^mn;@T# zlS{|Rq+-Nlg18i%UY;i|q1NnSwf>I@85#4U4002ovPDHLkV1mEDi4_0< literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/h1.png b/inc/jscripts/editor/images/h1.png new file mode 100644 index 0000000000000000000000000000000000000000..9c122e91e358860733eaf08fd543e5fc585d4cfd GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$x=IP=XqH%ujg^j!|20W|*-XbO@ zAtBSd^khRzd{=pNv@vN)9uZDqGTXuVPf6#I=?;x2B`Y;1YQMI>>GxvE??vtn{c>{A z7MYxUVrui2JTF|YR&ldntL8M3{q7no52$4`vIX;r@S8@YTFOM5*~nV4Gk-UYI5L$} zDw(h9UDksmVjphbEsSQ?UdGUxU4Htk{EZoY&3@-Y5*_;Wwk`ZAkg@!FaC~ii{N>;; VD%(>GD}XL$@O1TaS?83{1OVXtVO9VD literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/h2.png b/inc/jscripts/editor/images/h2.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd87657fbe001c0a78fb095284fffc32e739497 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$ROXGNhtQ`{C(%$wdeB3 zGTnLdz~IMJtNg?T>Z(s;oVU0)KW5x*9xvq)rPF;` zY|Fc4&#rLa>Txf#@y+aKf+ac0%`STzAI(*qdYo^XFH557y+_x*JpKO5^1S9?c^6}{ zP=+&OVHtDUrGNmdKI;Vst0KHFj AM*si- literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/h3.png b/inc/jscripts/editor/images/h3.png new file mode 100644 index 0000000000000000000000000000000000000000..c7836cf09e4565cc76c13bd14c13971c9e093c40 GIT binary patch literal 306 zcmV-20nPr2P)wEzGB literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/handle.png b/inc/jscripts/editor/images/handle.png new file mode 100644 index 0000000000000000000000000000000000000000..3993b20337e33a36c9125d139f1f53a279a4c128 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{X#0(?@t!)i}6mzkYX9x!e$L)vy4}e^r0G|-o z4LkP#|NsB{_wSo_?oZ!X{TC?CQWE4B{GZ|f|H~VSrU3bz1s;*b3=G^tAk28_ZrvZC zpje4(M2T}zYGO%dex5=|W^O8jfw{hsp}v86ds2l5P=!25MR0yvNqJ&XDuZuga#4P6 zYD#9Jf?H-$YI%N9cCmuR){ILPK&1wrE{-7_Gm{H=1WS1m6Eb=Pa(faIBBVrjnVf1= soMNglKFuA6ghUcX`bbD&-ZPgg&ebxsLQ0Hz~TmH+?% literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/image.png b/inc/jscripts/editor/images/image.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3c393caa3bc4371d12d0c67ffd6d333ecf1d8e GIT binary patch literal 516 zcmV+f0{i`mP)0oSgT$J*kO*Aq9I~CW*s{G*(t$KS{OS+#aO%?udUme<*TTEO`Fr@r_QT zk=#}u-n~>Vm!+9S1PE{@3<)G~CPb<$Za;W?3+O}|+q)?*Pn355=}S(XIZmEANjZci zf5 zj<%@MX^bD1^BwlS^+AD|$dm-1wial0hwPI;CDM?Y9SXW#@w-UF0SQ8OgplRTleOB2 zUjkDS|0U9pI|lSN*EvXUa~*UIclJdZ#)Npbwh9>YT?Z;=B8|l&^t~P~om?<5Lre$+ z;%`P>SL7`djY#8Y9$wv9dv|3p)C#5QQ<|d}62BjvZR2H60wE-$B^mK6y(Kw&{<9vg>Q9!g~ne(gm zmj4swoA@7?D86%i^8WzK9JM17E&sp&Z#dpHfz$E-U9ks&4?Z9Gyg!%0k2Q{M-Tz#> z2OnD>vrPZ*#{EHKLq)>Jcx{H|Ovdb&|4aQZWSipI{El%e^Cxx{^9vSw28s;a3IDB= TS1%U=TF&6<>gTe~DWM4fm>N^1 literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/link.png b/inc/jscripts/editor/images/link.png new file mode 100644 index 0000000000000000000000000000000000000000..25eacb7c2524142262d68bf729c5e2b61adfd6d4 GIT binary patch literal 343 zcmV-d0jU0oP)$`dXYaZs9=SbAto%g@>T~?_bH&lTUn@`uo|1bXE{eSR(AO)ESb=V4`uk}mK|39Px&03WLbv~pzk+s7D@lK^ zn+aB+sp)&Y_x-B3>;6ywU--WQNUr<8>TU0P-|L#1U&;A)67w(+> pDf@fM7q9#F25QXo3rUI;002ro52U44e~JJA002ovPDHLkV1l;_q@Mr) literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/list-bullet.png b/inc/jscripts/editor/images/list-bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8672bde48f806d3d4d37db192588a9aa3eac10 GIT binary patch literal 344 zcmV-e0jK_nP)PbXFR5;6H z`2YVu10|S&DhA}te_Swi*Xsu$nk)lAnzx?+_#Z@r_~qs0*+Bfiq@?73K|#U)?Ck9S zsi~>|6A}{sM@B~e4-O9gPhA%bd?2RGd{of6>E(lvp1b6Ep>6&12TPB<{a?EDDL4@0 z;^ML+A|n0=1_u83^78uc?CkvC#>VEqiHXU7U0vP(YHDhzff&$ntDt1@;|H#l*M@2! z+U8#>h@W=vfpy*`^1J}j+`sMRe-I7g8yOj8Yin!&S5Z;4nJ za0`JjjT>IsBgv4lr1ei5v f6q=~=F)=fo7mTXfp0{^0&;<;hu6{1-oD!MVicFNp}SURRVGD{CSNFe~ni^^#wyl5uzj4je z|23%2?k#{x(*%mqe9M%mih+W%ElRQ}7!$^91> z7ymCLB=nz$hvz>#JNtiTW@gkt1Zf0eyP_){bPq%T_kY#2Z7&xs00000NkvXXu0mjf DNYA0= literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/menu.png b/inc/jscripts/editor/images/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..44a07afd30f499cdba30847094a1e92f13e1320e GIT binary patch literal 27151 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

+35?Hj$O) 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 Ze*oTy+;kdDB`N>_002ovPDHLkV1l3CM+g7_ literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/images/stroke.png b/inc/jscripts/editor/images/stroke.png new file mode 100644 index 0000000000000000000000000000000000000000..612058a78eba4e3ca259aa13417fd60cd6cf2fbd GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%c@9E+gqH#X?$N2_%qkv$?&V++! z-fX$@sb%KG-5a$|R8J4(Tcmu7`G0cYgxS-++3#dN^zA^J(=P8r|6lx9G_LLaZ+v5S z!d9iC@)!RP{FnQmdw#}3Ee(C$|NPA#|L6YmR@fBO9w|C7oMMQ$vc`Tu(RETvC<`(>OPJ!ieM-fH~m>7>jD5&Wq={HDKYyh!yx+)ugh??;-Fdk_+?B=(Ett`c{f#J|ni6^h+9saOK z3Me!bX#Qh3B9wk^&d+Wg4grT7BK8ehe_Hhz1sr%56u2D&0-YC020Q`|Jxg4;92g7@ eConKD@i1hIny&nuDpC)04TGnvpUXO@geCwEnM@7< literal 0 HcmV?d00001 diff --git a/inc/jscripts/editor/markitup.highlight.min.css b/inc/jscripts/editor/markitup.highlight.min.css new file mode 100644 index 0000000..0059efd --- /dev/null +++ b/inc/jscripts/editor/markitup.highlight.min.css @@ -0,0 +1 @@ +.markItUpHighlight{position:relative;overflow:hidden}.markItUpHighlight textarea{position:relative;z-index:2;display:block;background:transparent!important;color:rgba(255,255,255,.5);-webkit-overflow-scrolling:touch;-webkit-text-fill-color:transparent;caret-color:#000;resize:vertical}.markItUpHighlight pre{pointer-events:none!important;border:0!important;flex-direction:column!important;word-wrap:break-word!important;word-break:normal!important;line-height:22px!important;font-size:12px!important;font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace!important}.markItUpHighlight pre code{position:absolute;z-index:1;top:0;left:0;bottom:5px;right:0;white-space:inherit!important;padding:6px 6px 6px 6px !important;line-height:22px!important;font-size:inherit!important;font-family:inherit!important;background:transparent!important}.hljs{display:block;padding:.5em;background:#fff;color:#000}.hljs-comment,.hljs-quote{color:#800}.hljs-keyword,.hljs-selector-tag,.hljs-section,.hljs-title,.hljs-name{color:#008}.hljs-variable,.hljs-template-variable{color:#660}.hljs-string,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-regexp{color:#080}.hljs-literal,.hljs-symbol,.hljs-bullet,.hljs-meta,.hljs-number,.hljs-link{color:#066}.hljs-title,.hljs-doctag,.hljs-type,.hljs-attr,.hljs-built_in,.hljs-builtin-name,.hljs-params{color:#606}.hljs-attribute,.hljs-subst{color:#000}.hljs-formula{background-color:#eee;font-style:italic}.hljs-selector-id,.hljs-selector-class{color:#9b703f}.hljs-addition{background-color:#baeeba}.hljs-deletion{background-color:#ffc8bd}.hljs-doctag,.hljs-strong{font-weight:700}.hljs-emphasis{font-style:italic} \ No newline at end of file diff --git a/inc/jscripts/editor/markitup.highlight.min.js b/inc/jscripts/editor/markitup.highlight.min.js new file mode 100644 index 0000000..b12afcc --- /dev/null +++ b/inc/jscripts/editor/markitup.highlight.min.js @@ -0,0 +1 @@ +!function(a){a.fn.highlight=function(b){function i(b,c){var d=a(b).val(),e=j(d+"\n");a(c).html(e),a(c).each(function(a,b){hljs.highlightBlock(b)})}function j(a){return a.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function k(){var b=a("

").css({visibility:"hidden",width:100,overflow:"scroll"}).appendTo("body"),c=a("
").css({width:"100%"}).appendTo(b).outerWidth();return b.remove(),100-c}if(!document.documentMode&&!window.StyleMedia&&!/Mobi/i.test(navigator.userAgent)){var c=this,d=k();if(b=a.extend({whiteSpace:"pre-wrap",lang:c.data("lang")},b),b.lang)var e=b.lang;else var e=c.closest('div[class^="markItUpSet"]').attr("class").replace("markItUpSet-","");var f=document.createElement("div");a(f).addClass("markItUpHighlight"),a(c).wrap(f);var g=document.createElement("pre");a(g).addClass("markItUpSyntax").appendTo(c.parent());var h=document.createElement("code");a(h).addClass(e).appendTo(a(g)),a(g).css("white-space",b.whiteSpace),c.css("white-space",b.whiteSpace),c.attr("spellcheck",!1),c[0].scrollHeight>c[0].clientHeight?a(h).css("right",d):a(h).css("right",0),i(c,h),c.on("input mouseup",function(){this.scrollHeight>this.clientHeight?a(h).css("right",d):a(h).css("right",0),i(this,h)}),c.scroll(function(){a(h).css({top:-c.scrollTop(),left:-c.scrollLeft()})})}}}(jQuery); \ No newline at end of file diff --git a/inc/jscripts/editor/markitup.min.css b/inc/jscripts/editor/markitup.min.css new file mode 100644 index 0000000..effecb7 --- /dev/null +++ b/inc/jscripts/editor/markitup.min.css @@ -0,0 +1 @@ +.markItUp *{margin:0;padding:0;outline:0;box-sizing:border-box}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace;font-size:12px;padding:5px;width:100%;height:320px;clear:both;line-height:22px;overflow:auto;color:#000}.markItUpEditor.nowrap{white-space:nowrap}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(images/handle.png);cursor:n-resize}.markItUpHeader ul{margin-bottom:5px}.markItUpHeader ul li{list-style:none;display:inline-block;position:relative;margin:0 4px;vertical-align:middle}.markItUpHeader ul li:first-of-type{margin-left:0}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(images/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(images/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:0 10px;width:1px;height:16px;overflow:hidden;background-color:#CCC}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000} \ No newline at end of file diff --git a/inc/jscripts/editor/markitup.min.js b/inc/jscripts/editor/markitup.min.js new file mode 100644 index 0000000..ecdc88f --- /dev/null +++ b/inc/jscripts/editor/markitup.min.js @@ -0,0 +1,27 @@ +// ---------------------------------------------------------------------------- +// markItUp! Universal MarkUp Engine, JQuery plugin +// v 1.1.x +// Dual licensed under the MIT and GPL licenses. +// ---------------------------------------------------------------------------- +// Copyright (C) 2007-2012 Jay Salvat +// http://markitup.jaysalvat.com/ +// ---------------------------------------------------------------------------- +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// ---------------------------------------------------------------------------- +!function($){$.fn.markItUp=function(settings,extraSettings){var method,params,options,ctrlKey,shiftKey,altKey;ctrlKey=shiftKey=altKey=!1,"string"==typeof settings&&(method=settings,params=extraSettings),options={id:"",nameSpace:"",root:"",previewHandler:!1,previewInWindow:"",previewInElement:"",previewAutoRefresh:!0,previewPosition:"after",previewTemplatePath:"~/templates/preview.html",previewParser:!1,previewParserPath:"",previewParserVar:"data",resizeHandle:!0,beforeInsert:"",afterInsert:"",onEnter:{},onShiftEnter:{},onCtrlEnter:{},onTab:{},markupSet:[{}]},$.extend(options,settings,extraSettings),options.root||$("script").each(function(a,b){miuScript=$(b).get(0).src.match(/(.*)jquery\.markitup(\.pack)?\.js$/),null!==miuScript&&(options.root=miuScript[1])});var uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},matched=uaMatch(navigator.userAgent),browser={};return matched.browser&&(browser[matched.browser]=!0,browser.version=matched.version),browser.chrome?browser.webkit=!0:browser.webkit&&(browser.safari=!0),this.each(function(){function localize(a,b){return b?a.replace(/("|')~\//g,"$1"+options.root):a.replace(/^~\//,options.root)}function init(){id="",nameSpace="",options.id?id='id="'+options.id+'"':$$.attr("id")&&(id='id="markItUp'+$$.attr("id").substr(0,1).toUpperCase()+$$.attr("id").substr(1)+'"'),options.nameSpace&&(nameSpace='class="'+options.nameSpace+'"'),$$.wrap("
"),$$.wrap("
'),$$.wrap('
'),$$.addClass("markItUpEditor"),header=$('
').insertBefore($$),$(dropMenus(options.markupSet)).appendTo(header),footer=$('
').insertAfter($$),!0===options.resizeHandle&&!0!==browser.safari&&(resizeHandle=$('
').insertAfter($$).bind("mousedown.markItUp",function(a){var d,e,b=$$.height(),c=a.clientY;d=function(a){return $$.css("height",Math.max(20,a.clientY+b-c)+"px"),!1},e=function(a){return $("html").unbind("mousemove.markItUp",d).unbind("mouseup.markItUp",e),!1},$("html").bind("mousemove.markItUp",d).bind("mouseup.markItUp",e)}),footer.append(resizeHandle)),$$.bind("keydown.markItUp",keyPressed).bind("keyup",keyPressed),$$.bind("insertion.markItUp",function(a,b){!1!==b.target&&get(),textarea===$.markItUp.focused&&markup(b)}),$$.bind("focus.markItUp",function(){$.markItUp.focused=this}),options.previewInElement&&refreshPreview()}function dropMenus(markupSet){var ul=$("
    "),i=0;return $("li:hover > ul",ul).css("display","block"),$.each(markupSet,function(){var button=this,t="",title,li,j;if(title=button.key?(button.name||"")+" [Ctrl+"+button.key+"]":button.name||"",key=button.key?'accesskey="'+button.key+'"':"",button.separator)li=$('
  • '+(button.separator||"")+"
  • ").appendTo(ul);else{for(i++,j=levels.length-1;j>=0;j--)t+=levels[j]+"-";li=$('
  • '+(button.name||"")+"
  • ").bind("contextmenu.markItUp",function(){return!1}).bind("click.markItUp",function(a){a.preventDefault()}).bind("focusin.markItUp",function(){$$.focus()}).bind("mouseup",function(){return button.call&&eval(button.call)(),setTimeout(function(){markup(button)},1),!1}).bind("mouseenter.markItUp",function(){$("> ul",this).show(),$(document).one("click",function(){$("ul ul",header).hide()})}).bind("mouseleave.markItUp",function(){$("> ul",this).hide()}).appendTo(ul),button.dropMenu&&(levels.push(i),$(li).addClass("markItUpDropMenu").append(dropMenus(button.dropMenu)))}}),levels.pop(),ul}function magicMarkups(a){return a?(a=a.toString(),a=a.replace(/\(\!\(([\s\S]*?)\)\!\)/g,function(a,b){var c=b.split("|!|");return!0===altKey?void 0!==c[1]?c[1]:c[0]:void 0===c[1]?"":c[0]}),a=a.replace(/\[\!\[([\s\S]*?)\]\!\]/g,function(a,b){var c=b.split(":!:");return!0!==abort&&(value=prompt(c[0],c[1]?c[1]:""),null===value&&(abort=!0),value)})):""}function prepare(a){return $.isFunction(a)&&(a=a(hash)),magicMarkups(a)}function build(a){var b=prepare(clicked.openWith),c=prepare(clicked.placeHolder),d=prepare(clicked.replaceWith),e=prepare(clicked.closeWith),f=prepare(clicked.openBlockWith),g=prepare(clicked.closeBlockWith),h=clicked.multiline;if(""!==d)block=b+d+e;else if(""===selection&&""!==c)block=b+c+e;else{a=a||selection;var i=[a],j=[];!0===h&&(i=a.split(/\r?\n/));for(var k=0;k=9.5&&0==b)return!1;range=textarea.createTextRange(),range.collapse(!0),range.moveStart("character",a),range.moveEnd("character",b),range.select()}else textarea.setSelectionRange&&textarea.setSelectionRange(a,a+b);textarea.scrollTop=scrollPosition,textarea.focus()}function get(){if(textarea.focus(),scrollPosition=textarea.scrollTop,document.selection)if(selection=document.selection.createRange().text,browser.msie){var a=document.selection.createRange(),b=a.duplicate();for(b.moveToElementText(textarea),caretPosition=-1;b.inRange(a);)b.moveStart("character"),caretPosition++}else caretPosition=textarea.selectionStart;else caretPosition=textarea.selectionStart,selection=textarea.value.substring(caretPosition,textarea.selectionEnd);return selection}function preview(){"function"==typeof options.previewHandler?previewWindow=!0:options.previewInElement?previewWindow=$(options.previewInElement):!previewWindow||previewWindow.closed?options.previewInWindow?(previewWindow=window.open("","preview",options.previewInWindow),$(window).unload(function(){previewWindow.close()})):(iFrame=$(''),"after"==options.previewPosition?iFrame.insertAfter(footer):iFrame.insertBefore(header),previewWindow=iFrame[iFrame.length-1].contentWindow||frame[iFrame.length-1]):!0===altKey&&(iFrame?iFrame.remove():previewWindow.close(),previewWindow=iFrame=!1),options.previewAutoRefresh||refreshPreview(),options.previewInWindow&&previewWindow.focus()}function refreshPreview(){renderPreview()}function renderPreview(){if(options.previewHandler&&"function"==typeof options.previewHandler)options.previewHandler($$.val());else if(options.previewParser&&"function"==typeof options.previewParser){var b=options.previewParser($$.val());writeInPreview(localize(b,1))}else""!==options.previewParserPath?$.ajax({type:"POST",dataType:"text",global:!1,url:options.previewParserPath,data:options.previewParserVar+"="+encodeURIComponent($$.val()),success:function(a){writeInPreview(localize(a,1))}}):template||$.ajax({url:options.previewTemplatePath,dataType:"text",global:!1,success:function(a){writeInPreview(localize(a,1).replace(//g,$$.val()))}});return!1}function writeInPreview(a){if(options.previewInElement)$(options.previewInElement).html(a);else if(previewWindow&&previewWindow.document){try{sp=previewWindow.document.documentElement.scrollTop}catch(a){sp=0}previewWindow.document.open(),previewWindow.document.write(a),previewWindow.document.close(),previewWindow.document.documentElement.scrollTop=sp}}function keyPressed(a){if(shiftKey=a.shiftKey,altKey=a.altKey,ctrlKey=(!a.altKey||!a.ctrlKey)&&(a.ctrlKey||a.metaKey),"keydown"===a.type){if(!0===ctrlKey&&(li=$('a[accesskey="'+(13==a.keyCode?"\\n":String.fromCharCode(a.keyCode))+'"]',header).parent("li"),0!==li.length))return ctrlKey=!1,setTimeout(function(){li.triggerHandler("mouseup")},1),!1;if(13===a.keyCode||10===a.keyCode)return!0===ctrlKey?(ctrlKey=!1,markup(options.onCtrlEnter),options.onCtrlEnter.keepDefault):!0===shiftKey?(shiftKey=!1,markup(options.onShiftEnter),options.onShiftEnter.keepDefault):(markup(options.onEnter),options.onEnter.keepDefault);if(9===a.keyCode)return 1!=shiftKey&&1!=ctrlKey&&1!=altKey&&(-1!==caretOffset?(get(),caretOffset=$$.val().length-caretOffset,set(caretOffset,0),caretOffset=-1,!1):(markup(options.onTab),options.onTab.keepDefault))}}function remove(){$$.unbind(".markItUp").removeClass("markItUpEditor"),$$.parent("div").closest("div.markItUp").parent("div").replaceWith($$),$$.data("markItUp",null)}var $$,textarea,levels,scrollPosition,caretPosition,caretOffset,clicked,hash,header,footer,previewWindow,template,iFrame,abort;if($$=$(this),textarea=this,levels=[],abort=!1,scrollPosition=caretPosition=0,caretOffset=-1,options.previewParserPath=localize(options.previewParserPath),options.previewTemplatePath=localize(options.previewTemplatePath),method)switch(method){case"remove":remove();break;case"insert":markup(params);break;default:$.error("Method "+method+" does not exist on jQuery.markItUp")}else init()})},$.fn.markItUpRemove=function(){return this.each(function(){$(this).markItUp("remove")})},$.markItUp=function(a){var b={target:!1};if($.extend(b,a),b.target)return $(b.target).each(function(){$(this).focus(),$(this).trigger("insertion",[b])});$("textarea").trigger("insertion",[b])}}(jQuery); diff --git a/inc/jscripts/editor/sets/html/set.min.css b/inc/jscripts/editor/sets/html/set.min.css new file mode 100644 index 0000000..213d13a --- /dev/null +++ b/inc/jscripts/editor/sets/html/set.min.css @@ -0,0 +1 @@ +.markItUpSet-html .markItUpButton1 a{background-image:url(../../images/h1.png)}.markItUpSet-html .markItUpButton2 a{background-image:url(../../images/h2.png)}.markItUpSet-html .markItUpButton3 a{background-image:url(../../images/h3.png)}.markItUpSet-html .markItUpButton4 a{background-image:url(../../images/paragraph.png)}.markItUpSet-html .markItUpButton5 a{background-image:url(../../images/bold.png)}.markItUpSet-html .markItUpButton6 a{background-image:url(../../images/italic.png)}.markItUpSet-html .markItUpButton7 a{background-image:url(../../images/stroke.png)}.markItUpSet-html .markItUpButton8 a{background-image:url(../../images/list-bullet.png)}.markItUpSet-html .markItUpButton9 a{background-image:url(../../images/list-numeric.png)}.markItUpSet-html .markItUpButton10 a{background-image:url(../../images/list-item.png)}.markItUpSet-html .markItUpButton11 a{background-image:url(../../images/picture.png)}.markItUpSet-html .markItUpButton12 a{background-image:url(../../images/link.png)}.markItUpSet-html .markItUpButton13 a{background-image:url(../../images/clean.png)} \ No newline at end of file diff --git a/inc/jscripts/editor/sets/html/set.min.js b/inc/jscripts/editor/sets/html/set.min.js new file mode 100644 index 0000000..a724158 --- /dev/null +++ b/inc/jscripts/editor/sets/html/set.min.js @@ -0,0 +1 @@ +var markItUp_html={nameSpace:"markItUpSet-html",onShiftEnter:{keepDefault:!1,replaceWith:"
    \n"},onCtrlEnter:{keepDefault:!1,openWith:"\n

    ",closeWith:"

    "},onTab:{keepDefault:!1,replaceWith:" "},markupSet:[{key:"1",openWith:'',closeWith:""},{key:"2",openWith:'',closeWith:""},{key:"3",openWith:'',closeWith:""},{openWith:'',closeWith:"

    "},{separator:"---------------"},{key:"B",openWith:"(!(|!|)!)",closeWith:"(!(|!|)!)"},{key:"I",openWith:"(!(|!|)!)",closeWith:"(!(|!|)!)"},{key:"S",openWith:"",closeWith:""},{separator:"---------------"},{openWith:"
  • ",closeWith:"
  • ",multiline:!0,openBlockWith:"
      \n",closeBlockWith:"\n
    "},{openWith:"
  • ",closeWith:"
  • ",multiline:!0,openBlockWith:"
      \n",closeBlockWith:"\n
    "},{openWith:"
  • ",closeWith:"
  • "},{separator:"---------------"},{key:"P",replaceWith:'[![Alternative text]!]'},{key:"L",openWith:'[![Name]!]',closeWith:""},{separator:"---------------"},{className:"clean",replaceWith:function(a){return a.selection.replace(/<(.*?)>/g,"")}}],afterInsert:function(a){$(a.textarea).trigger("input")}}; \ No newline at end of file diff --git a/inc/jscripts/editor/sets/markdown/set.min.css b/inc/jscripts/editor/sets/markdown/set.min.css new file mode 100644 index 0000000..d327539 --- /dev/null +++ b/inc/jscripts/editor/sets/markdown/set.min.css @@ -0,0 +1 @@ +.markItUpSet-markdown .markItUpButton1 a{background-image:url(../../images/h1.png)}.markItUpSet-markdown .markItUpButton2 a{background-image:url(../../images/h2.png)}.markItUpSet-markdown .markItUpButton3 a{background-image:url(../../images/h3.png)}.markItUpSet-markdown .markItUpButton4 a{background-image:url(../../images/bold.png)}.markItUpSet-markdown .markItUpButton5 a{background-image:url(../../images/italic.png)}.markItUpSet-markdown .markItUpButton6 a{background-image:url(../../images/list-bullet.png)}.markItUpSet-markdown .markItUpButton7 a{background-image:url(../../images/list-numeric.png)}.markItUpSet-markdown .markItUpButton8 a{background-image:url(../../images/picture.png)}.markItUpSet-markdown .markItUpButton9 a{background-image:url(../../images/link.png)}.markItUpSet-markdown .markItUpButton10 a{background-image:url(../../images/quotes.png)}.markItUpSet-markdown .markItUpButton11 a{background-image:url(../../images/code.png)} \ No newline at end of file diff --git a/inc/jscripts/editor/sets/markdown/set.min.js b/inc/jscripts/editor/sets/markdown/set.min.js new file mode 100644 index 0000000..8a057b5 --- /dev/null +++ b/inc/jscripts/editor/sets/markdown/set.min.js @@ -0,0 +1 @@ +var markItUp_markdown={nameSpace:"markItUpSet-markdown",onShiftEnter:{keepDefault:!1,openWith:"\n\n"},onTab:{keepDefault:!1,replaceWith:" "},markupSet:[{key:"1",placeHolder:"H1",closeWith:function(a){return miu.markdownTitle(a,"=")}},{key:"2",placeHolder:"H2",closeWith:function(a){return miu.markdownTitle(a,"-")}},{openWith:"### ",placeHolder:"H3"},{separator:"---------------"},{key:"B",openWith:"**",closeWith:"**"},{key:"I",openWith:"_",closeWith:"_"},{separator:"---------------"},{openWith:"- "},{openWith:function(a){return a.line+". "}},{separator:"---------------"},{key:"P",replaceWith:"![[![Alternative text]!]]([![Url:!:http://]!])"},{key:"L",openWith:"[[![Name]!]",closeWith:"]([![Url:!:http://]!])"},{separator:"---------------"},{openWith:"> "},{openWith:"(!(\t|!|`)!)",closeWith:"(!(`)!)"}],afterInsert:function(a){$(a.textarea).trigger("input")}},miu={markdownTitle:function(a,b){for(heading="",n=$.trim(a.selection||a.placeHolder).length,i=0;it){var c=i-t,f=p(this).top;if(ld&&a.pageY>f+i-c)return}void 0===e.oldDisplay&&(e.oldDisplay=e.style.display),e.style.display="none",l
    ')}b(h).each(function(i){b(this).on("click",function(j){j.preventDefault();g.updatePictureInLightbox(b(this),h,i);b("#bootstrap-media-lightbox").modal("show")})})};a.prototype.updatePictureInLightbox=function(f,i,d){var e=this;if(this.options.gallery===false||i.size()<2){b("#bootstrap-media-lightbox-backward").hide();b("#bootstrap-media-lightbox-forward").hide()}else{if(d==0){b("#bootstrap-media-lightbox-backward").hide();b("#bootstrap-media-lightbox-forward").show()}else{if(d==i.size()-1){b("#bootstrap-media-lightbox-backward").show();b("#bootstrap-media-lightbox-forward").hide()}else{b("#bootstrap-media-lightbox-backward").show();b("#bootstrap-media-lightbox-forward").show()}}}var g=f.attr("href");var c=["png","jpg","jpeg","bmp"];var h=g.split(".").pop().toLowerCase();if(f.data("target")!==undefined){}if(b.inArray(h,c)>-1){this.addImage(g)}else{if(g.substr(0,22)=="http://www.youtube.com"){this.addYoutubeVideo(g)}else{if(g.substr(0,16)=="http://vimeo.com"){this.addVimeoVideo(g)}else{if(g.substr(0,4)=="http"){this.addIframe(g)}}}}this.addCaption(f);b("#bootstrap-media-lightbox-forward").unbind("click");b("#bootstrap-media-lightbox-forward").click(function(){e.updatePictureInLightbox(i.eq(d+1),i,d+1)});b("#bootstrap-media-lightbox-backward").unbind("click");b("#bootstrap-media-lightbox-backward").click(function(){e.updatePictureInLightbox(i.eq(d-1),i,d-1)});b("#bootstrap-media-lightbox-close").click(function(){b("#bootstrap-media-lightbox-iframe").attr("src","")})};a.prototype.addImage=function(e){var d=this;var c=new Image();c.onload=function(){if(d.options.width===undefined&&d.options.height===undefined){d.contentWidth=c.width;d.contentHeight=c.height}else{if(d.options.width===undefined){d.contentWidth=d.options.height/c.height*c.width;d.contentHeight=d.options.height}else{if(d.options.height===undefined){d.contentHeight=d.options.width/c.width*c.height;d.contentWidth=d.options.width}}}d.validateSize();var f=b("#bootstrap-media-lightbox-content-container");f.html('');d.setMargins(f)};c.src=e};a.prototype.addIframe=function(d){if(this.options.width===undefined&&this.options.height===undefined){this.contentWidth=420;this.contentHeight=315}else{if(this.options.width===undefined){this.contentWidth=420/(315/this.options.height);this.contentHeight=this.options.height}else{if(this.options.height===undefined){this.contentHeight=315/(420/this.options.width);this.contentWidth=this.options.width}}}var e=b("#bootstrap-media-lightbox-content-container");var c='';this.setMargins(e);e.html(c)};a.prototype.addYoutubeVideo=function(e){if(this.options.width===undefined&&this.options.height===undefined){this.contentWidth=420;this.contentHeight=315}else{if(this.options.width===undefined){this.contentWidth=420/(315/this.options.height);this.contentHeight=this.options.height}else{if(this.options.height===undefined){this.contentHeight=315/(420/this.options.width);this.contentWidth=this.options.width}}}this.validateSize();var f=b("#bootstrap-media-lightbox-content-container");var d=e.substr(31);var c='';f.html(c);this.setMargins(f)};a.prototype.addVimeoVideo=function(e){if(this.options.width===undefined&&this.options.height===undefined){this.contentWidth=420;this.contentHeight=315}else{if(this.options.width===undefined){this.contentWidth=420/(315/this.options.height);this.contentHeight=this.options.height}else{if(this.options.height===undefined){this.contentHeight=315/(420/this.options.width);this.contentWidth=this.options.width}}}this.validateSize();var f=b("#bootstrap-media-lightbox-content-container");var d=e.substr(17);var c='';f.html(c);this.setMargins(f)};a.prototype.addCaption=function(d){var c=d.attr("title");if(c!==""&&c!==undefined&&this.options.caption===true){b("#bootstrap-media-lightbox-caption-container").show();b("#bootstrap-media-lightbox-caption").text(c)}else{b("#bootstrap-media-lightbox-caption-container").hide()}};a.prototype.getFontSet=function(){var c=b('');if(c.css("font-family")==="FontAwesome"){return"fa"}return"glyphicon"};a.prototype.validateSize=function(e){var g=b(window).height();var d=b(window).width();if(this.contentWidth+50>d){var c=this.contentWidth;this.contentWidth=d-50;this.contentHeight=this.contentHeight*this.contentWidth/c}if(this.contentHeight+80>g){var f=this.contentHeight;this.contentHeight=g-80;this.contentWidth=this.contentWidth*this.contentHeight/f}};a.prototype.setMargins=function(c){var e=b(window).height();var d=b(window).width();c.css({"margin-top":(e-50-this.contentHeight)/2});c.css({"margin-left":(d-this.contentWidth)/2})};b.fn.lightbox=function(c){new a(b(this),c)};b(".lightbox").lightbox()})(jQuery); \ No newline at end of file diff --git a/inc/jscripts/tinynav.min.js b/inc/jscripts/tinynav.min.js new file mode 100644 index 0000000..74a0405 --- /dev/null +++ b/inc/jscripts/tinynav.min.js @@ -0,0 +1,3 @@ +/*! http://tinynav.viljamis.com v1.2 by @viljamis */ +(function(a,k,g){a.fn.tinyNav=function(l){var c=a.extend({active:"selected",header:"",indent:"- ",label:""},l);return this.each(function(){g++;var h=a(this),b="tinynav"+g,f=".l_"+b,e=a(" +
    +
    + +
    + + + + + + + +
    +
    +
    +

    {$lang.general.settings}

    +
    +
    +
    + + {if: !empty($blog.form.cover_photo)} + + {else} + + {/if} +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + + +
    + +
    + +
    + +
    + +
    + + + {$lang.general.cancel} +
    +
    +
    + + \ No newline at end of file diff --git a/inc/modules/blog/view/admin/manage.html b/inc/modules/blog/view/admin/manage.html new file mode 100644 index 0000000..597f31d --- /dev/null +++ b/inc/modules/blog/view/admin/manage.html @@ -0,0 +1,86 @@ +
    +
    +
    +
    +

    {$lang.general.manage}

    + +
    + +
    +
    +
    +

    {$lang.blog.post_count} {$blog.postCount}

    + +
    +
    + + + + + + + + + + + + + + {if: !empty($blog.posts)} + {loop: $blog.posts} + + + + + + + + + + {/loop} + {else} + + {/if} + +
    {$lang.blog.manage_title}{$lang.blog.manage_status}{$lang.blog.manage_author}{$lang.blog.manage_comments}{$lang.blog.manage_date}{$lang.general.actions}
    {$value.title} + {if: $value.status >= 2} + + {elseif: $value.status == 1} + + {else} + + {/if} + {$value.user}{$value.comments}{$value.published_at} + + + +
    {$lang.general.empty_array}
    +
    +
    + {$blog.pagination} +
    +
    +
    +
    + + diff --git a/inc/modules/blog/view/admin/settings.html b/inc/modules/blog/view/admin/settings.html new file mode 100644 index 0000000..55f7032 --- /dev/null +++ b/inc/modules/blog/view/admin/settings.html @@ -0,0 +1,42 @@ +
    +
    +
    +
    +
    +

    {$lang.settings.general}

    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/blog/view/disqus.html b/inc/modules/blog/view/disqus.html new file mode 100644 index 0000000..16608ec --- /dev/null +++ b/inc/modules/blog/view/disqus.html @@ -0,0 +1,23 @@ +{if: !empty($settings.blog.disqus)} + {if: isset($isPost) && $post.comments == 1} + + {/if} + {if: isset($isBlog) || isset($isPost)} + + {/if} +{/if} \ No newline at end of file diff --git a/inc/modules/blog/view/feed.xml b/inc/modules/blog/view/feed.xml new file mode 100644 index 0000000..d97b436 --- /dev/null +++ b/inc/modules/blog/view/feed.xml @@ -0,0 +1,23 @@ + + + + {$settings.title} + {?= url() ?} + {$settings.description} +{loop: $posts} + + {$value.title} + {$value.url} + {$value.content|cut:250} + {$value.published_at} + {if: $value.cover_photo} + + {$value.cover_url} + {$value.title} + {?= url() ?} + + {/if} + +{/loop} + + \ No newline at end of file diff --git a/inc/modules/carousel/Info.php b/inc/modules/carousel/Info.php new file mode 100644 index 0000000..4ae29f5 --- /dev/null +++ b/inc/modules/carousel/Info.php @@ -0,0 +1,19 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['carousel']['module_name'], + 'description' => $core->lang['carousel']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.0', + 'compatibility' => '1.3.*', + 'icon' => 'retweet', +]; diff --git a/inc/modules/carousel/ReadMe.md b/inc/modules/carousel/ReadMe.md new file mode 100644 index 0000000..5ff6067 --- /dev/null +++ b/inc/modules/carousel/ReadMe.md @@ -0,0 +1,5 @@ +This module displays images from the selected photo gallery. Paste code below in the template or in the page content: + +`{$carousel.gallery-name}` + +After that, change `gallery-name` to chosen gallery slug. \ No newline at end of file diff --git a/inc/modules/carousel/Site.php b/inc/modules/carousel/Site.php new file mode 100644 index 0000000..7513a04 --- /dev/null +++ b/inc/modules/carousel/Site.php @@ -0,0 +1,48 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Carousel; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + public function init() + { + $this->tpl->set('carousel', $this->_insertCarousels()); + } + + private function _insertCarousels() + { + $assign = []; + $tempAssign = []; + $galleries = $this->db('galleries')->toArray(); + + if (!empty($galleries)) { + foreach ($galleries as $gallery) { + $items = $this->db('galleries_items')->where('gallery', $gallery['id'])->toArray(); + $tempAssign = $gallery; + + if (count($items)) { + foreach ($items as &$item) { + $item['src'] = unserialize($item['src']); + } + + $tempAssign['items'] = $items; + + $assign[$gallery['slug']] = $this->draw('carousel.html', ['carousel' => $tempAssign]); + } + } + } + + return $assign; + } +} diff --git a/inc/modules/carousel/lang/admin/en_english.ini b/inc/modules/carousel/lang/admin/en_english.ini new file mode 100644 index 0000000..2b9436c --- /dev/null +++ b/inc/modules/carousel/lang/admin/en_english.ini @@ -0,0 +1,2 @@ +module_name = "Carousel" +module_desc = "Cyclic slideshow. It requires the gallery module." \ No newline at end of file diff --git a/inc/modules/carousel/lang/admin/pl_polski.ini b/inc/modules/carousel/lang/admin/pl_polski.ini new file mode 100644 index 0000000..d373fd5 --- /dev/null +++ b/inc/modules/carousel/lang/admin/pl_polski.ini @@ -0,0 +1,2 @@ +module_name = "Karuzela" +module_desc = "Cykliczny pokaz slajdów. Do działania wymaga modułu galerii." \ No newline at end of file diff --git a/inc/modules/carousel/view/carousel.html b/inc/modules/carousel/view/carousel.html new file mode 100644 index 0000000..e5b4e2d --- /dev/null +++ b/inc/modules/carousel/view/carousel.html @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/inc/modules/contact/Admin.php b/inc/modules/contact/Admin.php new file mode 100644 index 0000000..8642d46 --- /dev/null +++ b/inc/modules/contact/Admin.php @@ -0,0 +1,92 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Contact; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + public function navigation() + { + return [ + $this->lang('settings', 'general') => 'settings', + ]; + } + + public function getSettings() + { + $value = $this->settings('contact'); + + if (is_numeric($value['email'])) { + $assign['users'] = $this->_getUsers($value['email']); + $assign['email'] = null; + } else { + $assign['users'] = $this->_getUsers(); + $assign['email'] = $value['email']; + } + + $assign['driver'] = $value['driver']; + $assign['phpmailer'] = [ + 'server' => $value['phpmailer.server'], + 'port' => $value['phpmailer.port'], + 'username' => $value['phpmailer.username'], + 'password' => $value['phpmailer.password'], + 'name' => $value['phpmailer.name'], + ]; + + return $this->draw('settings.html', ['contact' => $assign]); + } + + public function postSave() + { + $update = [ + 'email' => ($_POST['user'] > 0 ? $_POST['user'] : $_POST['email']), + 'driver' => $_POST['driver'], + 'phpmailer.server' => $_POST['phpmailer']['server'], + 'phpmailer.port' => $_POST['phpmailer']['port'], + 'phpmailer.username' => $_POST['phpmailer']['username'], + 'phpmailer.password' => $_POST['phpmailer']['password'], + 'phpmailer.name' => $_POST['phpmailer']['name'], + ]; + + $errors = 0; + foreach ($update as $field => $value) { + if (!$this->db('settings')->where('module', 'contact')->where('field', $field)->save(['value' => $value])) { + $errors++; + } + } + + if (!$errors) { + $this->notify('success', $this->lang('save_success')); + } else { + $this->notify('failure', $this->lang('save_failure')); + } + + redirect(url([ADMIN, 'contact', 'settings'])); + } + + private function _getUsers($id = null) + { + $rows = $this->db('users')->where('role', 'admin')->toArray(); + if (count($rows)) { + foreach ($rows as $row) { + if ($id == $row['id']) { + $attr = 'selected'; + } else { + $attr = null; + } + $result[] = $row + ['attr' => $attr]; + } + } + return $result; + } +} diff --git a/inc/modules/contact/Info.php b/inc/modules/contact/Info.php new file mode 100644 index 0000000..70b3d1d --- /dev/null +++ b/inc/modules/contact/Info.php @@ -0,0 +1,35 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['contact']['module_name'], + 'description' => $core->lang['contact']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.1', + 'compatibility' => '1.3.*', + 'icon' => 'envelope', + + 'install' => function () use ($core) { + $core->db()->pdo()->exec("INSERT INTO `settings` + (`module`, `field`, `value`) + VALUES + ('contact', 'email', 1), + ('contact', 'driver', 'mail'), + ('contact', 'phpmailer.server', 'smtp.example.com'), + ('contact', 'phpmailer.port', '587'), + ('contact', 'phpmailer.username', 'login@example.com'), + ('contact', 'phpmailer.name', 'Batflat contact'), + ('contact', 'phpmailer.password', 'yourpassword')"); + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DELETE FROM `settings` WHERE `module` = 'contact'"); + } +]; diff --git a/inc/modules/contact/Site.php b/inc/modules/contact/Site.php new file mode 100644 index 0000000..1b296b3 --- /dev/null +++ b/inc/modules/contact/Site.php @@ -0,0 +1,177 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Contact; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + private $_headers; + private $_params; + private $_error = null; + + private $mail = []; + + public function init() + { + $this->tpl->set('contact', function () { + if (isset($_POST['send-email'])) { + if ($this->_initDriver()) { + if ($this->_sendEmail()) { + $this->notify('success', $this->lang('send_success')); + } else { + $this->notify('failure', $this->_error); + } + } else { + $this->notify('failure', $this->_error); + } + + redirect(currentURL()); + } + return ['form' => $this->_insertForm()]; + }); + } + + private function _insertForm() + { + return $this->draw('form.html'); + } + + private function _initDriver() + { + $settings = $this->settings('contact'); + + $this->email['driver'] = $settings['driver']; + + $data = $_POST; + htmlspecialchars_array($data); + + if ($this->_checkErrors($data)) { + return false; + } + + $this->email['subject'] = $data['subject']; + $this->email['from'] = $data['from']; + + if ($settings['driver'] == 'mail') { + $this->email['sender'] = $this->settings('settings', 'title')." "; + } elseif ($settings['driver'] == 'phpmailer' && class_exists('PHPMailer')) { + $this->email['sender'] = [ + $this->settings('contact', 'phpmailer.username'), + $this->settings('contact', 'phpmailer.name'), + ]; + } + + if (!is_numeric($settings['email'])) { + $this->email['to'] = $settings['email']; + } else { + $user = $this->db('users')->where($settings['email'])->oneArray(); + $this->email['to'] = $user['email']; + } + + $this->email['message'] = $this->draw('mail.html', ['mail' => $data]); + + return true; + } + + private function _checkErrors($array) + { + if (!filter_var($array['from'], FILTER_VALIDATE_EMAIL)) { + $this->_error = $this->lang('wrong_email'); + } + + if (checkEmptyFields(['name', 'subject', 'from', 'message'], $array)) { + $this->_error = $this->lang('empty_inputs'); + } + + // antibot field + if (!empty($array['title'])) { + exit(); + } + + if (isset($_COOKIE['MailWasSend'])) { + $this->_error = $this->lang('antiflood'); + } + + if ($this->_error) { + return true; + } + + return false; + } + + private function _sendEmail() + { + if ($this->email['driver'] == 'mail') { + $headers = "From: {$this->email['sender']}\n"; + $headers .= "Reply-To: {$this->email['from']}\n"; + $headers .= "MIME-Version: 1.0\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + + if (@mail($this->email['to'], '=?UTF-8?B?'.base64_encode($this->email['subject']).'?=', $this->email['message'], $headers)) { + // cookies antiflood + $cookieParams = session_get_cookie_params(); + setcookie("MailWasSend", 'BATFLAT', time()+360, $cookieParams["path"], $cookieParams["domain"], null, true); + return true; + } else { + $this->_error = $this->lang('send_failure'); + return false; + } + } elseif ($this->email['driver'] == 'phpmailer') { + $settings = $this->settings('contact'); + + try { + $mail = new \PHPMailer(true); + $mail->isSMTP(); // Set mailer to use SMTP + $mail->Host = $settings['phpmailer.server']; // Specify main and backup SMTP servers + $mail->SMTPAuth = true; // Enable SMTP authentication + $mail->Username = $settings['phpmailer.username']; // SMTP username + $mail->Password = $settings['phpmailer.password']; // SMTP password + $mail->SMTPSecure = 'TLS'; // Enable TLS encryption, `ssl` also accepted + $mail->Port = $settings['phpmailer.port']; // TCP port to connect to + $mail->CharSet = 'UTF-8'; + + $mail->Subject = $this->email['subject']; + $mail->Body = $this->email['message']; + + $mail->addReplyTo($this->email['from']); + $mail->setFrom($this->email['sender'][0], $this->email['sender'][1]); + $mail->addAddress($this->email['to']); + + $mail->SMTPOptions = array( + 'ssl' => array( + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ) + ); + + $mail->isHTML(true); + + if ($mail->send()) { + $cookieParams = session_get_cookie_params(); + setcookie("MailWasSend", 'BATFLAT', time()+360, $cookieParams["path"], $cookieParams["domain"], null, true); + } + } catch (\phpmailerException $e) { + $this->_error = $e->errorMessage(); + } catch (\Exception $e) { + $this->_error = $e->getMessage(); + } + + if ($this->_error) { + return false; + } + + return true; + } + } +} diff --git a/inc/modules/contact/lang/admin/en_english.ini b/inc/modules/contact/lang/admin/en_english.ini new file mode 100644 index 0000000..3a1a01b --- /dev/null +++ b/inc/modules/contact/lang/admin/en_english.ini @@ -0,0 +1,21 @@ +module_name = "Contact" +module_desc = "Display contact form on the page." + +recipient = "Recipient" +custom = "-- Custom email address --" +or_mail = "or custom e-mail address" +example = "Example: contact@johndoe.com" +save_success = "Contact data saved." +save_failure = "Failed to save contact data." +info = "Place this tag in website template" + +phpmailer_error = "Sorry, I can't find PHPMailer class. Please, execute composer require phpmailer/phpmailer in your project terminal." + +driver = "Mail driver" +mail = "mail() (default)" +phpmailer = "PHPMailer (SMTP)" +server = "Server" +port = "Port" +username = "Username" +password = "Password" +name = "Sender name" \ No newline at end of file diff --git a/inc/modules/contact/lang/admin/pl_polski.ini b/inc/modules/contact/lang/admin/pl_polski.ini new file mode 100644 index 0000000..4944ab2 --- /dev/null +++ b/inc/modules/contact/lang/admin/pl_polski.ini @@ -0,0 +1,21 @@ +module_name = "Kontakt" +module_desc = "Wyświetla formularz kontaktowy na stronie." + +recipient = "Odbiorca" +custom = "-- Własny adres mailowy --" +or_mail = "lub adres e-mail" +example = "Przykład: adam@nowak.com" +save_success = "Pomyślnie zaktualizowano dane kontaktowe." +save_failure = "Nie udało się zaktualizować danych kontaktowych." +info = "Aby wyświetlić formularz na stronie, wklej tag" + +phpmailer_error = "Klasa PHPMailer nie jest zainstalowana. Użyj composer require phpmailer/phpmailer aby zainstalować dodatkowy pakiet." + +driver = "Wybierz sterownik do wysyłania wiadomości" +mail = "mail() (domyślne)" +phpmailer = "PHPMailer (SMTP)" +server = "Serwer poczty wychodzącej" +port = "Port" +username = "Nazwa użytkownika" +password = "Hasło użytkownika" +name = "Nazwa wyświetlana" \ No newline at end of file diff --git a/inc/modules/contact/lang/en_english.ini b/inc/modules/contact/lang/en_english.ini new file mode 100644 index 0000000..0d5a526 --- /dev/null +++ b/inc/modules/contact/lang/en_english.ini @@ -0,0 +1,10 @@ +full_name = "Firstname and surname" +email = "E-mail" +subject = "Subject" +message = "Message" +send = "Send" +send_success = "Mail successfully sent. I will contact you soon." +send_failure = "Unable to send a message. Probably mail() function is disabled on the server." +wrong_email = "Submited e-mail address is incorrect." +empty_inputs = "Fill all required fields to send a message." +antiflood = "You have to wait a while before you will send another message." \ No newline at end of file diff --git a/inc/modules/contact/lang/pl_polski.ini b/inc/modules/contact/lang/pl_polski.ini new file mode 100644 index 0000000..b83d4db --- /dev/null +++ b/inc/modules/contact/lang/pl_polski.ini @@ -0,0 +1,10 @@ +full_name = "Imię i nazwisko" +email = "Adres e-mail" +subject = "Temat" +message = "Wiadomość" +send = "Wyślij" +send_success = "Wiadomość została pomyślnie wysłana! Wkrótce się z Tobą skontaktujemy." +send_failure = "Nie udało się wysłać wiadomości. Możliwe, że funkcja mail() jest wyłączona na serwerze." +wrong_email = "Wprowadzony adres e-mail jest niepoprawny. Popraw go." +empty_inputs = "Nie uzupełniono wszystkich wymaganych pól formularza. Popraw je." +antiflood = "Przed chwilą wysłałeś już jednego maila. Musisz trochę poczekać." \ No newline at end of file diff --git a/inc/modules/contact/view/admin/settings.html b/inc/modules/contact/view/admin/settings.html new file mode 100644 index 0000000..31522af --- /dev/null +++ b/inc/modules/contact/view/admin/settings.html @@ -0,0 +1,89 @@ +
    +
    +
    +
    {$lang.general.settings}
    +
    +
    +
    + + +
    +
    + + +
    +
    + +

    + +
    + +

    +
    + {if: !class_exists("PHPMailer")} +
    {$lang.contact.phpmailer_error}
    + {/if} +
    +
    +
    + + +
    +
    + + +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + +
    +
    + {$lang.contact.info} {noparse}{$contact.form}{/noparse}. + info +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/inc/modules/contact/view/form.html b/inc/modules/contact/view/form.html new file mode 100644 index 0000000..75a5952 --- /dev/null +++ b/inc/modules/contact/view/form.html @@ -0,0 +1,32 @@ +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + + +
    + +
    + + + + +
    \ No newline at end of file diff --git a/inc/modules/contact/view/mail.html b/inc/modules/contact/view/mail.html new file mode 100644 index 0000000..8f9f70e --- /dev/null +++ b/inc/modules/contact/view/mail.html @@ -0,0 +1,318 @@ + + + + + + {$mail.subject} + + + + + + + + + + +
      +
    + + + + +
    + + {$mail.name|e} ({$mail.from}) +

    {$mail.subject|e}

    + + + +
    + {?=nl2br($mail.message)?} +
    +
    + + + + + +
    +
     
    + + \ No newline at end of file diff --git a/inc/modules/dashboard/Admin.php b/inc/modules/dashboard/Admin.php new file mode 100644 index 0000000..c07c7d1 --- /dev/null +++ b/inc/modules/dashboard/Admin.php @@ -0,0 +1,100 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Dashboard; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + public function navigation() + { + return [ + 'Main' => 'main' + ]; + } + + public function getMain() + { + $this->core->addCSS(url(MODULES.'/dashboard/css/style.css?v={$bat.version}')); + return $this->draw('dashboard.html', ['modules' => $this->_modulesList(), 'news' => $this->_fetchNews()]); + } + + private function _modulesList() + { + $modules = array_column($this->db('modules')->toArray(), 'dir'); + $result = []; + + if ($this->core->getUserInfo('access') != 'all') { + $modules = array_intersect($modules, explode(',', $this->core->getUserInfo('access'))); + } + + foreach ($modules as $name) { + $files = [ + 'info' => MODULES.'/'.$name.'/Info.php', + 'admin' => MODULES.'/'.$name.'/Admin.php', + ]; + + if (file_exists($files['info']) && file_exists($files['admin'])) { + $details = $this->core->getModuleInfo($name); + $features = $this->core->getModuleNav($name); + + if (empty($features)) { + continue; + } + + $details['url'] = url([ADMIN, $name, array_shift($features)]); + + $result[] = $details; + } + } + return $result; + } + + private function _fetchNews() + { + \libxml_use_internal_errors(true); + $assign = []; + $lang = $this->settings('settings.lang_admin'); + if (!in_array($lang, ['en_english', 'pl_polski'])) { + $lang = 'en_english'; + } + + $xml = \Inc\Core\Lib\HttpRequest::get('https://batflat.org/blog/feed/'.$lang); + if (!empty($xml) && ($rss = simplexml_load_string($xml))) { + $counter = 0; + foreach ($rss->channel->item as $item) { + if ($counter >= 3) { + break; + } + + $assign[$counter]['title'] = (string) $item->title; + $assign[$counter]['link'] = (string) $item->link; + $assign[$counter]['desc'] = (string) $item->description; + $assign[$counter]['date'] = date('Y-m-d', strtotime($item->pubDate)); + if (isset($item->image)) { + $assign[$counter]['image'] = (string) $item->image->url; + } + + $counter++; + } + } else { + $assign[] = [ + 'title' => $this->lang('rss_fail_title'), + 'link' => '#', + 'desc' => $this->lang('rss_fail_desc'), + 'date' => null + ]; + } + + return $assign; + } +} diff --git a/inc/modules/dashboard/Info.php b/inc/modules/dashboard/Info.php new file mode 100644 index 0000000..c04999e --- /dev/null +++ b/inc/modules/dashboard/Info.php @@ -0,0 +1,19 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['dashboard']['module_name'], + 'description' => $core->lang['dashboard']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.1', + 'compatibility' => '1.3.*', + 'icon' => 'home' +]; diff --git a/inc/modules/dashboard/css/style.css b/inc/modules/dashboard/css/style.css new file mode 100644 index 0000000..8151b8d --- /dev/null +++ b/inc/modules/dashboard/css/style.css @@ -0,0 +1,82 @@ +.module { + display: inline-block; + width: 25%; + padding-left: 15px; + padding-right: 15px; + margin-right: -4px; +} + .module .panel-body { + display: block; + padding: 0; + } + .module .panel-body .panel-thumb { + color: #222222; + font-size: 48px; + background: #F8BE12; + height: 108px; + position: relative; + overflow: hidden; + } + .module .panel-body .panel-thumb .fa { + font-size: 48px; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%) scale(1, 1); + -webkit-transform: translate(-50%, -50%) scale(1, 1); + transition: transform 0.2s; + } + .module .panel-body .panel-thumb:hover .fa { + transform: translate(-50%, -50%) scale(1.5, 1.5); + -webkit-transform: translate(-50%, -50%) scale(1.5, 1.5); + } + .module .panel-body h4 { + color: #656565; + } + + .module:nth-child(-3n+5) .panel-thumb, + .module:nth-child(3n+4):nth-child(-3n+13) .panel-thumb, + .module:nth-child(3n+12):nth-child(-3n+18) .panel-thumb, + .module:nth-child(n+20):nth-child(-n+21) .panel-thumb, + .module:nth-child(2n+21) .panel-thumb { + background: #222222; + color: #F8BE12; + } + +@media (min-width: 992px) and (max-width: 1200px) { + .module { + width: 33.33%; + } +} +@media (min-width: 768px) and (max-width: 992px) { + .module { + width: 50%; + } +} +@media (max-width: 768px) { + .module { + width: 100%; + } +} + +.news { + max-height: 425px; + overflow: auto; +} + .news-item:not(:last-of-type) { + padding-bottom: 15px; + margin-bottom: 10px; + border-bottom: 1px solid #e9e9e9; + } + .news-item .news-header { + margin-bottom: 8px; + } + .news-item .news-header .title { + font-weight: 700; + } + .news-item .news-header time { + font-size: 12px; + } + .news-item .news-content { + font-size: 14px; + } \ No newline at end of file diff --git a/inc/modules/dashboard/lang/admin/en_english.ini b/inc/modules/dashboard/lang/admin/en_english.ini new file mode 100644 index 0000000..0a6fb5c --- /dev/null +++ b/inc/modules/dashboard/lang/admin/en_english.ini @@ -0,0 +1,6 @@ +module_name = "Dashboard" +module_desc = "Fast access to modules and news." + +news = "News" +rss_fail_title = "Connection timeout" +rss_fail_desc = "Unable to download latest news from Batflat.org." \ No newline at end of file diff --git a/inc/modules/dashboard/lang/admin/pl_polski.ini b/inc/modules/dashboard/lang/admin/pl_polski.ini new file mode 100644 index 0000000..9371a2a --- /dev/null +++ b/inc/modules/dashboard/lang/admin/pl_polski.ini @@ -0,0 +1,6 @@ +module_name = "Ekran startowy" +module_desc = "Szybki dostęp do modułów i aktualności." + +news = "Aktualności" +rss_fail_title = "Upłnął czas żądania" +rss_fail_desc = "Nie można pobrać aktualności ze strony Batflat.org." \ No newline at end of file diff --git a/inc/modules/dashboard/view/admin/dashboard.html b/inc/modules/dashboard/view/admin/dashboard.html new file mode 100644 index 0000000..adb1e69 --- /dev/null +++ b/inc/modules/dashboard/view/admin/dashboard.html @@ -0,0 +1,50 @@ +
    +
    +
    + + {loop: $modules} + + {/loop} + +
    +
    + +
    + +
    +
    \ No newline at end of file diff --git a/inc/modules/devbar/Admin.php b/inc/modules/devbar/Admin.php new file mode 100644 index 0000000..5a61cbe --- /dev/null +++ b/inc/modules/devbar/Admin.php @@ -0,0 +1,62 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Devbar; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + private $timer = 0; + + public function __construct(\Inc\Core\Main $core) + { + parent::__construct($core); + + $this->timer = -microtime(true); + } + public function init() + { + if (DEV_MODE && strpos(get_headers_list('Content-Type'), 'text/html') !== false) { + $this->core->addCSS(url(MODULES.'/devbar/css/style.css?ver={?= time() ?}')); + } + } + + public function finish() + { + if (DEV_MODE && strpos(get_headers_list('Content-Type'), 'text/html') !== false) { + $a = \debug_backtrace(); + foreach (Dump::$data as &$d) { + $d['value'] = \htmlspecialchars($this->tpl->noParse($d['value'])); + } + + echo $this->draw(MODULES.'/devbar/view/bar.html', [ + 'devbar' => [ + 'version' => $this->settings('settings', 'version'), + 'timer' => round(($this->timer + microtime(true))*1000, 2), + 'memory' => round(memory_get_usage()/1024/1024, 2), + 'database' => \Inc\Core\Lib\QueryBuilder::lastSqls(), + 'requests' => [ + '$_GET' => ['print' => print_r($_GET, true), 'count' => count($_GET)], + '$_POST' => ['print' => print_r($_POST, true), 'count' => count($_POST)], + '$_COOKIE' => ['print' => print_r($_COOKIE, true), 'count' => 0], + '$_SERVER' => ['print' => print_r($_SERVER, true), 'count' => 0], + ], + 'dump' => Dump::$data, + 'sqlite' => $this->db()->pdo()->query('select sqlite_version()')->fetch()[0], + 'modules' => array_keys($this->core->module->getArray()), + ], + ]); + } + } +} + +require_once('functions.php'); diff --git a/inc/modules/devbar/Dump.php b/inc/modules/devbar/Dump.php new file mode 100644 index 0000000..e652c23 --- /dev/null +++ b/inc/modules/devbar/Dump.php @@ -0,0 +1,7 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => 'Debug bar', + 'description' => 'Shows helpful information for developers', + 'author' => 'Sruu.pl', + 'version' => '1.0', + 'compatibility' => '1.3.*', + 'icon' => 'bug', + + 'install' => function () use ($core) { + }, + 'uninstall' => function () use ($core) { + } +]; diff --git a/inc/modules/devbar/ReadMe.md b/inc/modules/devbar/ReadMe.md new file mode 100644 index 0000000..0e0e1f5 --- /dev/null +++ b/inc/modules/devbar/ReadMe.md @@ -0,0 +1,3 @@ +After installing this module, you must enable `DEV_MODE` in the `inc/core/defines.php` file. Otherwise, the debugger will not appear. + +To debug variable values put in the code `dump([your_variable])` function. \ No newline at end of file diff --git a/inc/modules/devbar/Site.php b/inc/modules/devbar/Site.php new file mode 100644 index 0000000..70af545 --- /dev/null +++ b/inc/modules/devbar/Site.php @@ -0,0 +1,62 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Devbar; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + private $timer = 0; + + public function __construct(\Inc\Core\Main $core) + { + parent::__construct($core); + + $this->timer = -microtime(true); + } + public function init() + { + if (DEV_MODE && strpos(get_headers_list('Content-Type'), 'text/html') !== false) { + $this->core->addCSS(url(MODULES.'/devbar/css/style.css?ver={?= time() ?}')); + } + } + + public function finish() + { + if (DEV_MODE && strpos(get_headers_list('Content-Type'), 'text/html') !== false) { + $a = \debug_backtrace(); + foreach (Dump::$data as &$d) { + $d['value'] = \htmlspecialchars($this->tpl->noParse($d['value'])); + } + + echo $this->draw('bar.html', [ + 'devbar' => [ + 'version' => $this->settings('settings', 'version'), + 'timer' => round(($this->timer + microtime(true))*1000, 2), + 'memory' => round(memory_get_usage()/1024/1024, 2), + 'database' => \Inc\Core\Lib\QueryBuilder::lastSqls(), + 'requests' => [ + '$_GET' => ['print' => print_r($_GET, true), 'count' => count($_GET)], + '$_POST' => ['print' => print_r($_POST, true), 'count' => count($_POST)], + '$_COOKIE' => ['print' => print_r($_COOKIE, true), 'count' => 0], + '$_SERVER' => ['print' => print_r($_SERVER, true), 'count' => 0], + ], + 'dump' => Dump::$data, + 'sqlite' => $this->db()->pdo()->query('select sqlite_version()')->fetch()[0], + 'modules' => array_keys($this->core->module->getArray()), + ], + ]); + } + } +} + +require_once('functions.php'); diff --git a/inc/modules/devbar/css/style.css b/inc/modules/devbar/css/style.css new file mode 100644 index 0000000..083d190 --- /dev/null +++ b/inc/modules/devbar/css/style.css @@ -0,0 +1,113 @@ +body { + margin-bottom: 30px; +} +#devbar { + z-index: 1000; + position: fixed; + bottom: 0; + left: -2px; + right: -2px; + padding: 0px; + background: #222; + border-top: 1px solid #444; + color: #FFF; + font-size: 14px; + font-family: "Lucida Console", Monaco, monospace !important; + font-weight: 400; + line-height: 1.4; +} +#devbar > ul { + position: relative; + min-height: auto; + border: 0; + border-radius: 0; + list-style: none; + padding: 0; + margin: 0; +} +#devbar > ul > li { + position: static; + padding: 0; + margin: 0; + float: left; +} +#devbar > ul > li > a { + color: #FFF; + text-decoration: none; +} +#devbar > ul > li:not(:last-of-type) { + border-right: 1px solid #444; +} +#devbar > ul > li.title { + font-weight: bold; +} +#devbar > ul > li.title span > span { + color: #f8be12; +} +#devbar > ul > li.show-hide { + position: absolute; + top: 0; + right: 14px; + bottom: 0; + padding: 3px 6px 0 6px; + cursor: pointer; +} +#devbar > ul > li.show-hide i.fa:after { + content: '\f0d8'; +} +#devbar > ul > li.show-hide[aria-expanded="true"] i.fa:after { + content: '\f0d7'; +} +#devbar > ul > li > span, +#devbar > ul > li > a { + display: inline-block; + padding: 3px 10px 2px 10px; +} +#devbar > ul > li.logo { + padding: 2px 20px 2px 20px; +} +#devbar > ul > li.logo img { + height: 18px; + width: auto; +} +#devbar .tab-pane { + background: #FFF; + height: 300px; + color: #000; + width: 100%; + overflow: auto; +} +#devbar .tab-pane ul { + list-style: none; + padding: 0; + margin: 0; +} +#devbar .tab-pane ul li { + padding: 5px 10px; + border-bottom: 1px solid #e5e5e5; + font-family: monospace; +} +#devbar .tab-pane ul li dl { + margin-bottom: 0; +} +#devbar .tab-pane ul li dl dd, +#devbar .tab-pane ul li dl dt { + line-height: 1.4; +} +#devbar .tab-pane ul li .truncate { + cursor: pointer; +} +#devbar .tab-pane ul li .truncate.active { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; +} +#devbar .tab-pane ul li pre { + background: none; + border: none; + margin: 0; + padding: 0; + white-space: pre-wrap; + color: #656d78; + font-size: 13px; +} diff --git a/inc/modules/devbar/css/style.less b/inc/modules/devbar/css/style.less new file mode 100644 index 0000000..519d3fc --- /dev/null +++ b/inc/modules/devbar/css/style.less @@ -0,0 +1,121 @@ +body { + margin-bottom: 30px; +} +#devbar { + z-index: 1000; + position: fixed; + bottom: 0; + left: -2px; + right: -2px; + padding: 0px; + background: #222; + border-top: 1px solid #444; + color: #FFF; + font-size: 14px; + font-family: "Lucida Console", Monaco, monospace !important; + font-weight: 400; + line-height: 1.4; + > ul { + position: relative; + min-height: auto; + border: 0; + border-radius: 0; + list-style: none; + padding: 0; + margin: 0; + > li { + position: static; + padding: 0; + margin: 0; + float: left; + > a { + color:#FFF; + text-decoration: none; + } + &:not(:last-of-type) { + border-right: 1px solid #444; + } + &.title { + font-weight: bold; + + span > span { + color:#f8be12; + } + } + &.show-hide { + position: absolute; + top: 0; + right: 14px; + bottom: 0; + padding: 3px 6px 0 6px; + cursor: pointer; + + i.fa:after { + content: '\f0d8'; + } + &[aria-expanded="true"] i.fa:after { + content: '\f0d7'; + } + } + & > span, & > a { + display: inline-block; + padding: 3px 10px 2px 10px; + } + + &.logo { + padding: 2px 20px 2px 20px; + img { + height: 18px; + width: auto; + } + } + } + } + .tab-pane { + background: #FFF; + height: 300px; + color: #000; + width: 100%; + overflow: auto; + + ul { + list-style: none; + padding: 0; + margin: 0; + + li { + padding: 5px 10px; + border-bottom: 1px solid #e5e5e5; + font-family: monospace; + + dl { + margin-bottom: 0; + + dd, dt { + line-height: 1.4; + } + } + + .truncate { + cursor: pointer; + + &.active { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + + pre { + background: none; + border: none; + margin: 0; + padding: 0; + white-space: pre-wrap; + color: #656d78; + font-size: 13px; + } + } + } + } +} \ No newline at end of file diff --git a/inc/modules/devbar/functions.php b/inc/modules/devbar/functions.php new file mode 100644 index 0000000..591cec6 --- /dev/null +++ b/inc/modules/devbar/functions.php @@ -0,0 +1,68 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +function dump($variable) +{ + $backtrace = debug_backtrace()[0]; + Inc\Modules\Devbar\Dump::$data[] = [ + 'trace' => 'file '.str_replace(BASE_DIR, null, $backtrace['file']).' in line '.$backtrace['line'].'', + 'value' => print_r($variable, true), + ]; +} + +function http_response_status() +{ + $text = null; + switch (http_response_code()) { + case 100: $text = 'Continue'; break; + case 101: $text = 'Switching Protocols'; break; + case 200: $text = 'OK'; break; + case 201: $text = 'Created'; break; + case 202: $text = 'Accepted'; break; + case 203: $text = 'Non-Authoritative Information'; break; + case 204: $text = 'No Content'; break; + case 205: $text = 'Reset Content'; break; + case 206: $text = 'Partial Content'; break; + case 300: $text = 'Multiple Choices'; break; + case 301: $text = 'Moved Permanently'; break; + case 302: $text = 'Moved Temporarily'; break; + case 303: $text = 'See Other'; break; + case 304: $text = 'Not Modified'; break; + case 305: $text = 'Use Proxy'; break; + case 400: $text = 'Bad Request'; break; + case 401: $text = 'Unauthorized'; break; + case 402: $text = 'Payment Required'; break; + case 403: $text = 'Forbidden'; break; + case 404: $text = 'Not Found'; break; + case 405: $text = 'Method Not Allowed'; break; + case 406: $text = 'Not Acceptable'; break; + case 407: $text = 'Proxy Authentication Required'; break; + case 408: $text = 'Request Time-out'; break; + case 409: $text = 'Conflict'; break; + case 410: $text = 'Gone'; break; + case 411: $text = 'Length Required'; break; + case 412: $text = 'Precondition Failed'; break; + case 413: $text = 'Request Entity Too Large'; break; + case 414: $text = 'Request-URI Too Large'; break; + case 415: $text = 'Unsupported Media Type'; break; + case 500: $text = 'Internal Server Error'; break; + case 501: $text = 'Not Implemented'; break; + case 502: $text = 'Bad Gateway'; break; + case 503: $text = 'Service Unavailable'; break; + case 504: $text = 'Gateway Time-out'; break; + case 505: $text = 'HTTP Version not supported'; break; + default: + $text = 'Unknown http status code "' . htmlentities($code) . '"'; + break; + } + + return $text; +} diff --git a/inc/modules/devbar/view/bar.html b/inc/modules/devbar/view/bar.html new file mode 100644 index 0000000..6f1a91c --- /dev/null +++ b/inc/modules/devbar/view/bar.html @@ -0,0 +1,97 @@ +
    + +
    +
    +
      +
    • HTTP status: {?= http_response_code() ?} {?= http_response_status() ?}
    • +
    • Route: /{?= implode('/', parseURL()) ?}
    • +
    • Batflat version: {$devbar.version}
    • +
    • PHP version: {?= phpversion() ?}
    • +
    • SQLite version: {?= $devbar.sqlite ?}
    • +
    • Batflat modules: {?= implode(', ', $devbar.modules) ?}
    • +
    • PHP extensions: {?= implode(', ', get_loaded_extensions()) ?}
    • +
    +
    +
    +
      + {loop: $devbar.database} +
    • {$value}
    • + {/loop} +
    +
    +
    +
      + {loop: $devbar.requests} +
    • +
      +
      {$key}
      +
      {$value.print}
      +
      +
    • + {/loop} +
    +
    +
    +
      + {loop: $devbar.dump} +
    • + + {$value.trace} +
      {$value.value}
      +
    • + {/loop} +
    +
    +
    +
    + \ No newline at end of file diff --git a/inc/modules/galleries/Admin.php b/inc/modules/galleries/Admin.php new file mode 100644 index 0000000..1233413 --- /dev/null +++ b/inc/modules/galleries/Admin.php @@ -0,0 +1,254 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Galleries; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + private $_thumbs = ['md' => 600, 'sm' => 300, 'xs' => 150]; + private $_uploads = UPLOADS.'/galleries'; + + public function navigation() + { + return [ + $this->lang('manage', 'general') => 'manage', + ]; + } + + /** + * galleries manage + */ + public function getManage() + { + $assign = []; + + // list + $rows = $this->db('galleries')->toArray(); + if (count($rows)) { + foreach ($rows as $row) { + $row['tag'] = $this->tpl->noParse('{$gallery.'.$row['slug'].'}'); + $row['editURL'] = url([ADMIN, 'galleries', 'edit', $row['id']]); + $row['delURL'] = url([ADMIN, 'galleries', 'delete', $row['id']]); + + $assign[] = $row; + } + } + + return $this->draw('manage.html', ['galleries' => $assign]); + } + + /** + * add new gallery + */ + public function anyAdd() + { + $location = [ADMIN, 'galleries', 'manage']; + + if (!empty($_POST['name'])) { + $name = trim($_POST['name']); + if (!$this->db('galleries')->where('slug', createSlug($name))->count()) { + $query = $this->db('galleries')->save(['name' => $name, 'slug' => createSlug($name)]); + + if ($query) { + $id = $this->db()->lastInsertId(); + $dir = $this->_uploads.'/'.$id; + + if (mkdir($dir, 0755, true)) { + $this->notify('success', $this->lang('add_gallery_success')); + $location = [ADMIN, 'galleries', 'edit', $this->db()->lastInsertId()]; + } + } else { + $this->notify('failure', $this->lang('add_gallery_failure')); + } + } else { + $this->notify('failure', $this->lang('gallery_already_exists')); + } + } else { + $this->notify('failure', $this->lang('empty_inputs', 'general')); + } + + redirect(url($location)); + } + + /** + * remove gallery + */ + public function getDelete($id) + { + $query = $this->db('galleries')->delete($id); + + deleteDir($this->_uploads.'/'.$id); + + if ($query) { + $this->notify('success', $this->lang('delete_gallery_success')); + } else { + $this->notify('failure', $this->lang('delete_gallery_failure')); + } + + redirect(url([ADMIN, 'galleries', 'manage'])); + } + + /** + * edit gallery + */ + public function getEdit($id, $page = 1) + { + $assign = []; + $assign['settings'] = $this->db('galleries')->oneArray($id); + + // pagination + $totalRecords = $this->db('galleries_items')->where('gallery', $id)->toArray(); + $pagination = new \Inc\Core\Lib\Pagination($page, count($totalRecords), 10, url([ADMIN, 'galleries', 'edit', $id, '%d'])); + $assign['pagination'] = $pagination->nav(); + $assign['page'] = $page; + + // items + if ($assign['settings']['sort'] == 'ASC') { + $rows = $this->db('galleries_items')->where('gallery', $id) + ->limit($pagination->offset().', '.$pagination->getRecordsPerPage()) + ->asc('id')->toArray(); + } else { + $rows = $this->db('galleries_items')->where('gallery', $id) + ->limit($pagination->offset().', '.$pagination->getRecordsPerPage()) + ->desc('id')->toArray(); + } + + if (count($rows)) { + foreach ($rows as $row) { + $row['title'] = $this->tpl->noParse(htmlspecialchars($row['title'])); + $row['desc'] = $this->tpl->noParse(htmlspecialchars($row['desc'])); + $row['src'] = unserialize($row['src']); + + if (!isset($row['src']['sm'])) { + $row['src']['sm'] = $row['src']['xs']; + } + + $assign['images'][] = $row; + } + } + + $assign['id'] = $id; + + $this->core->addCSS(url('inc/jscripts/lightbox/lightbox.min.css')); + $this->core->addJS(url('inc/jscripts/lightbox/lightbox.min.js')); + $this->core->addJS(url('inc/jscripts/are-you-sure.min.js')); + + return $this->draw('edit.html', ['gallery' => $assign]); + } + + /** + * save gallery data + */ + public function postSaveSettings($id) + { + if (checkEmptyFields(['name', 'sort'], $_POST)) { + $this->notify('failure', $this->lang('empty_inputs', 'general')); + redirect(url([ADMIN, 'galleries', 'edit', $id])); + } + + $_POST['slug'] = createSlug($_POST['name']); + if ($this->db('galleries')->where($id)->save($_POST)) { + $this->notify('success', $this->lang('save_settings_success')); + } + + redirect(url([ADMIN, 'galleries', 'edit', $id])); + } + + /** + * save images data + */ + public function postSaveImages($id, $page) + { + foreach ($_POST['img'] as $key => $val) { + $query = $this->db('galleries_items')->where($key)->save(['title' => $val['title'], 'desc' => $val['desc']]); + } + + if ($query) { + $this->notify('success', $this->lang('save_settings_success')); + } + + redirect(url([ADMIN, 'galleries', 'edit', $id, $page])); + } + + /** + * image uploading + */ + public function postUpload($id) + { + $dir = $this->_uploads.'/'.$id; + $cntr = 0; + + if (!is_uploaded_file($_FILES['files']['tmp_name'][0])) { + $this->notify('failure', $this->lang('no_files')); + } else { + foreach ($_FILES['files']['tmp_name'] as $image) { + $img = new \Inc\Core\Lib\Image(); + + if ($img->load($image)) { + $imgName = time().$cntr++; + $imgPath = $dir.'/'.$imgName.'.'.$img->getInfos('type'); + $src = []; + + // oryginal size + $img->save($imgPath); + $src['lg'] = str_replace(BASE_DIR.'/', null, $imgPath); + + // generate thumbs + foreach ($this->_thumbs as $key => $width) { + if ($img->getInfos('width') > $width) { + $img->resize($width); + $img->save($thumbPath = "{$dir}/{$imgName}-{$key}.{$img->getInfos('type')}"); + $src[$key] = str_replace(BASE_DIR.'/', null, $thumbPath); + } + } + + $query = $this->db('galleries_items')->save(['src' => serialize($src), 'gallery' => $id]); + } else { + $this->notify('failure', $this->lang('wrong_extension'), 'jpg, png, gif'); + } + } + + if ($query) { + $this->notify('success', $this->lang('add_images_success')); + }; + } + + redirect(url([ADMIN, 'galleries', 'edit', $id])); + } + + /** + * remove image + */ + public function getDeleteImage($id) + { + $image = $this->db('galleries_items')->where($id)->oneArray(); + if (!empty($image)) { + if ($this->db('galleries_items')->delete($id)) { + $images = unserialize($image['src']); + foreach ($images as $src) { + if (file_exists(BASE_DIR.'/'.$src)) { + if (!unlink(BASE_DIR.'/'.$src)) { + $this->notify('failure', $this->lang('delete_image_failure')); + } else { + $this->notify('success', $this->lang('delete_image_success')); + } + } + } + } + } else { + $this->notify('failure', $this->lang('image_doesnt_exists')); + } + + redirect(url([ADMIN, 'galleries', 'edit', $image['gallery']])); + } +} diff --git a/inc/modules/galleries/Info.php b/inc/modules/galleries/Info.php new file mode 100644 index 0000000..8b68c4f --- /dev/null +++ b/inc/modules/galleries/Info.php @@ -0,0 +1,46 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['galleries']['module_name'], + 'description' => $core->lang['galleries']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.0', + 'compatibility' => '1.3.*', + 'icon' => 'camera', + + 'install' => function () use ($core) { + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `galleries` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `name` text NOT NULL, + `slug` text NOT NULL, + `img_per_page` integer NOT NULL DEFAULT 0, + `sort` text NOT NULL DEFAULT 'DESC' + )"); + + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `galleries_items` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `gallery` integer NOT NULL, + `src` text NOT NULL, + `title` text NULL, + `desc` text NULL + )"); + + if (!file_exists(UPLOADS.'/galleries')) { + mkdir(UPLOADS.'/galleries', 0755, true); + } + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DROP TABLE `galleries`"); + $core->db()->pdo()->exec("DROP TABLE `galleries_items`"); + deleteDir(UPLOADS.'/galleries'); + } +]; diff --git a/inc/modules/galleries/Site.php b/inc/modules/galleries/Site.php new file mode 100644 index 0000000..dce6197 --- /dev/null +++ b/inc/modules/galleries/Site.php @@ -0,0 +1,58 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Galleries; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + public function init() + { + $this->_importGalleries(); + } + + private function _importGalleries() + { + $assign = []; + $tempAssign = []; + $galleries = $this->db('galleries')->toArray(); + + if (count($galleries)) { + foreach ($galleries as $gallery) { + if ($gallery['sort'] == 'ASC') { + $items = $this->db('galleries_items')->where('gallery', $gallery['id'])->asc('id')->toArray(); + } else { + $items = $this->db('galleries_items')->where('gallery', $gallery['id'])->desc('id')->toArray(); + } + + $tempAssign = $gallery; + + if (count($items)) { + foreach ($items as &$item) { + $item['src'] = unserialize($item['src']); + if (!isset($item['src']['sm'])) { + $item['src']['sm'] = $item['src']['xs']; + } + } + + $tempAssign['items'] = $items; + + $assign[$gallery['slug']] = $this->draw('gallery.html', ['gallery' => $tempAssign]); + } + } + } + $this->tpl->set('gallery', $assign); + + $this->core->addCSS(url('inc/jscripts/lightbox/lightbox.min.css')); + $this->core->addJS(url('inc/jscripts/lightbox/lightbox.min.js')); + } +} diff --git a/inc/modules/galleries/lang/admin/en_english.ini b/inc/modules/galleries/lang/admin/en_english.ini new file mode 100644 index 0000000..20210d9 --- /dev/null +++ b/inc/modules/galleries/lang/admin/en_english.ini @@ -0,0 +1,28 @@ +module_name = "Galleries" +module_desc = "Allows you to create galleries, and then display them on the page." + +add_gallery = "Add gallery" +edit = "Edit gallery" +settings = "Settings" +delete_confirm = "Are you sure you want do delete?" +delete_gallery_success = "Gallery successfully deleted." +delete_gallery_failure = "Failed to delete gallery." +add_gallery_success = "Gallery created." +add_gallery_failure = "Unable to create new gallery." +gallery_already_exists = "Gallery with this name already exists." +img_per_page = "Pictures per page" +sort = "Sort" +desc = "Descending" +asc = "Ascending" +add_images = "Add photo" +thumbnail = "Thumbnail" +data = "Data" +title = "Title" +description = "Description" +no_files = "You have to select at least one picture to upload." +wrong_extension = "One ore more has incorrect extension. Allowed extensions: %s." +add_images_success = "New photos successfully added." +save_settings_success = "Gallery data successfully saved." +delete_image_success = "Picture successfully deleted." +delete_image_failure = "Unable to delete photo from server. Delete it manually and check directory CHMODs." +image_doesnt_exists = "Image does not exist!" \ No newline at end of file diff --git a/inc/modules/galleries/lang/admin/pl_polski.ini b/inc/modules/galleries/lang/admin/pl_polski.ini new file mode 100644 index 0000000..09c60f6 --- /dev/null +++ b/inc/modules/galleries/lang/admin/pl_polski.ini @@ -0,0 +1,28 @@ +module_name = "Galerie" +module_desc = "Pozwala utworzyć galerie, a następnie wyświetlić je na stronie." + +add_gallery = "Dodaj galerię" +edit = "Edycja galerii" +settings = "Ustawienia" +delete_confirm = "Czy na pewno chcesz usunąć wybrany obiekt?" +delete_gallery_success = "Pomyślnie usunięto wybraną galerię." +delete_gallery_failure = "Nie udało się usunąć wybranej galerii." +add_gallery_success = "Pomyślnie dodano nową galerię." +add_gallery_failure = "Nie udało się dodać nowej galerii." +gallery_already_exists = "Galeria o takiej nazwie już istnieje." +img_per_page = "Liczba obrazów na stronę" +sort = "Sortowanie" +desc = "Malejąco" +asc = "Rosnąco" +add_images = "Dodaj zdjęcia" +thumbnail = "Miniaturka" +data = "Dane" +title = "Tytuł" +description = "Opis" +no_files = "Brak plików do wgrania! Musisz wybrać co najmniej jeden." +wrong_extension = "Jeden lub więcej plików posiada niedozwolone rozszerzenie. Akceptowane pliki: %s." +add_images_success = "Pomyślnie dodano nowe pliki do galerii." +save_settings_success = "Pomyślnie zapisano dane galerii." +delete_image_success = "Pomyślnie usunięto zdjęcie." +delete_image_failure = "Nie udało się usunąć zdjęcia z serwera. Zrób to ręcznie i sprawdź CHMOD-y." +image_doesnt_exists = "Taki obraz nie istnieje!" \ No newline at end of file diff --git a/inc/modules/galleries/view/admin/edit.html b/inc/modules/galleries/view/admin/edit.html new file mode 100644 index 0000000..124c55f --- /dev/null +++ b/inc/modules/galleries/view/admin/edit.html @@ -0,0 +1,109 @@ +
    +
    +
    +
    +

    {$lang.galleries.edit}

    +
    + +
    + {if: !empty($gallery.images)} +
    +
    + + + + + + + + {loop: $gallery.images} + + + + + + {/loop} + +
    {$lang.galleries.thumbnail}{$lang.galleries.data}{$lang.general.actions}
    + + + + +
    + +
    +
    + +
    +
    + + + +
    +
    + +
    + {$gallery.pagination} + {else} +
    + +

    {$lang.general.empty_array}

    +
    + {/if} +
    +
    +
    + +
    +
    +
    +

    {$lang.galleries.settings}

    +
    +
    +
    +
    + + +
    + +
    + +
    + + +
    +
    + +
    +
    +
    + +
    +
    +

    {$lang.galleries.add_images}

    +
    +
    +
    +
    + +
    + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/inc/modules/galleries/view/admin/manage.html b/inc/modules/galleries/view/admin/manage.html new file mode 100644 index 0000000..4663ef3 --- /dev/null +++ b/inc/modules/galleries/view/admin/manage.html @@ -0,0 +1,59 @@ +
    +
    +
    +
    +

    {$lang.general.manage}

    +
    +
    + {if: !empty($galleries)} +
    + + + + + + + + + + {loop: $galleries} + + + + + + {/loop} + +
    {$lang.general.name}Tag{$lang.general.actions}
    {$value.name}{$value.tag} + + + + + + +
    +
    + {else} +

    {$lang.general.empty_array}

    + {/if} +
    +
    +
    + +
    +
    +
    +

    {$lang.galleries.add_gallery}

    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/galleries/view/gallery.html b/inc/modules/galleries/view/gallery.html new file mode 100644 index 0000000..7f0a524 --- /dev/null +++ b/inc/modules/galleries/view/gallery.html @@ -0,0 +1,26 @@ +
    + +
    + + \ No newline at end of file diff --git a/inc/modules/langswitcher/Info.php b/inc/modules/langswitcher/Info.php new file mode 100644 index 0000000..9ecfe8c --- /dev/null +++ b/inc/modules/langswitcher/Info.php @@ -0,0 +1,25 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['langswitcher']['module_name'], + 'description' => $core->lang['langswitcher']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.1', + 'compatibility' => '1.3.*', + 'icon' => 'flag', + 'install' => function () use ($core) { + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'autodetectlang', 0)"); + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DELETE FROM `settings` WHERE `field` = 'autodetectlang'"); + } +]; diff --git a/inc/modules/langswitcher/ReadMe.md b/inc/modules/langswitcher/ReadMe.md new file mode 100644 index 0000000..8456cb9 --- /dev/null +++ b/inc/modules/langswitcher/ReadMe.md @@ -0,0 +1 @@ +Paste `{$langSwitcher}` in a template file to display select box with available languages. \ No newline at end of file diff --git a/inc/modules/langswitcher/Site.php b/inc/modules/langswitcher/Site.php new file mode 100644 index 0000000..f33baf6 --- /dev/null +++ b/inc/modules/langswitcher/Site.php @@ -0,0 +1,103 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\LangSwitcher; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + public function init() + { + if ($this->settings('settings', 'autodetectlang') == '1' && empty(parseURL(1)) && !isset($_SESSION['langswitcher']['detected'])) { + $detedcted = false; + $languages = $this->_detectBrowserLanguage(); + foreach ($languages as $value => $priority) { + $value = substr($value, 0, 2); + if ($detect = glob('inc/lang/'.$value.'_*')) { + $this->core->loadLanguage(basename($detect[0])); + break; + } + } + } + + $_SESSION['langswitcher']['detected'] = true; + if (isset($_GET['lang'])) { + $lang = explode('_', $_GET['lang'])[0]; + $this->_setLanguage($_GET['lang']); + + $dir = trim(dirname($_SERVER['SCRIPT_NAME']), '/'); + + $e = parseURL(); + foreach ($this->_getLanguages() as $lng) { + if ($lng['symbol'] == $e[0]) { + array_shift($e); + break; + } + } + $slug = implode('/', $e); + + if ($this->db('pages')->where('slug', $slug)->where('lang', $_GET['lang'])->oneArray()) { + redirect(url($lang.'/'.$slug)); + } else { + redirect(url($slug)); + } + } + + $this->tpl->set('langSwitcher', $this->_insertSwitcher()); + } + + private function _insertSwitcher() + { + return $this->draw('switcher.html', ['languages' => $this->_getLanguages()]); + } + + protected function _getLanguages($selected = null, $attr = 'selected') + { + $langs = glob('inc/lang/*', GLOB_ONLYDIR); + + $result = []; + foreach ($langs as $lang) { + $lang = basename($lang); + + $result[] = [ + 'dir' => $lang, + 'name' => mb_strtoupper(preg_replace('/_[a-z]+/', null, $lang)), + 'symbol'=> preg_replace('/_[a-z]+/', null, $lang), + 'attr' => (($selected ? $selected : $this->core->lang['name']) == $lang) ? $attr : null + ]; + } + return $result; + } + + private function _setLanguage($value) + { + if (in_array($value, array_column($this->_getLanguages(), 'dir'))) { + $_SESSION['lang'] = $value; + return true; + } + return false; + } + + private function _detectBrowserLanguage() + { + $prefLocales = array_reduce( + explode(',', isset_or($_SERVER['HTTP_ACCEPT_LANGUAGE'], null)), + function ($res, $el) { + list($l, $q) = array_merge(explode(';q=', $el), [1]); + $res[$l] = (float) $q; + return $res; + }, []); + arsort($prefLocales); + + return $prefLocales; + } +} diff --git a/inc/modules/langswitcher/lang/admin/en_english.ini b/inc/modules/langswitcher/lang/admin/en_english.ini new file mode 100644 index 0000000..53b5a5f --- /dev/null +++ b/inc/modules/langswitcher/lang/admin/en_english.ini @@ -0,0 +1,3 @@ +module_name = "langSwitcher" +module_desc = "Allows to change the language by guests." +autodetect = "Auto detect browser language" \ No newline at end of file diff --git a/inc/modules/langswitcher/lang/admin/pl_polski.ini b/inc/modules/langswitcher/lang/admin/pl_polski.ini new file mode 100644 index 0000000..652859b --- /dev/null +++ b/inc/modules/langswitcher/lang/admin/pl_polski.ini @@ -0,0 +1,3 @@ +module_name = "langSwitcher" +module_desc = "Pozwala na zmianę języka przez gości." +autodetect = "Automatycznie wykryj język użytkownika" \ No newline at end of file diff --git a/inc/modules/langswitcher/view/switcher.html b/inc/modules/langswitcher/view/switcher.html new file mode 100644 index 0000000..3b995d3 --- /dev/null +++ b/inc/modules/langswitcher/view/switcher.html @@ -0,0 +1,7 @@ +
    + +
    \ No newline at end of file diff --git a/inc/modules/modules/Admin.php b/inc/modules/modules/Admin.php new file mode 100644 index 0000000..4aa38d7 --- /dev/null +++ b/inc/modules/modules/Admin.php @@ -0,0 +1,264 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Modules; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + public function navigation() + { + return [ + $this->lang('manage', 'general') => 'manage', + $this->lang('upload_new') => 'upload' + ]; + } + + /** + * list of active/inactive modules + */ + public function getManage($type = 'active') + { + $modules = $this->_modulesList($type); + return $this->draw('manage.html', ['modules' => array_chunk($modules, 2), 'tab' => $type]); + } + + /** + * module upload + */ + public function getUpload() + { + return $this->draw('upload.html'); + } + + /** + * module extract + */ + public function postExtract() + { + if (isset($_FILES['zip_module']['tmp_name']) && !FILE_LOCK) { + $backURL = url([ADMIN, 'modules', 'upload']); + $file = $_FILES['zip_module']['tmp_name']; + + // Verify ZIP + $zip = zip_open($file); + $modules = array(); + while ($entry = zip_read($zip)) { + $entry = zip_entry_name($entry); + if (preg_match('/^(.*?)\/Info.php$/', $entry, $matches)) { + $modules[] = ['path' => $matches[0], 'name' => $matches[1]]; + } + + if (strpos($entry, '/') === false) { + $this->notify('failure', $this->lang('upload_bad_file')); + redirect($backURL); + } + } + + // Extract to modules + $zip = new \ZipArchive; + if ($zip->open($file) === true) { + foreach ($modules as $module) { + if (file_exists(MODULES.'/'.$module['name'])) { + $tmpName = md5(time().rand(1, 9999)); + file_put_contents('tmp/'.$tmpName, $zip->getFromName($module['path'])); + $info_new = include('tmp/'.$tmpName); + $info_old = include(MODULES.'/'.$module['name'].'/Info.php'); + unlink('tmp/'.$tmpName); + + if (cmpver($info_new['version'], $info_old['version']) <= 0) { + $this->notify('failure', $this->lang('upload_bad_version')); + continue; + } + } + $this->unzip($file, MODULES.'/'.$module['name'], $module['name']); + } + + $this->notify('success', $this->lang('upload_success')); + } else { + $this->notify('failure', $this->lang('upload_bad_file')); + } + } + + redirect($backURL); + } + + public function getInstall($dir) + { + $files = [ + 'info' => MODULES.'/'.$dir.'/Info.php', + 'admin' => MODULES.'/'.$dir.'/Admin.php', + 'site' => MODULES.'/'.$dir.'/Site.php' + ]; + + if ((file_exists($files['info']) && file_exists($files['admin'])) || (file_exists($files['info']) && file_exists($files['site']))) { + $core = $this->core; + $info = include($files['info']); + if (!$this->checkCompatibility(isset_or($info['compatibility']))) { + $this->notify('failure', $this->lang('module_outdated'), $dir); + } elseif ($this->db('modules')->save(['dir' => $dir, 'sequence' => $this->db('modules')->count()])) { + if (isset($info['install'])) { + $info['install'](); + } + + $this->notify('success', $this->lang('activate_success'), $dir); + } else { + $this->notify('failure', $this->lang('activate_failure'), $dir); + } + } else { + $this->notify('failure', $this->lang('activate_failure_files'), $dir); + } + + redirect(url([ADMIN, 'modules', 'manage', 'inactive'])); + } + + public function getUninstall($dir) + { + if (in_array($dir, unserialize(BASIC_MODULES))) { + $this->notify('failure', $this->lang('deactivate_failure'), $dir); + redirect(url([ADMIN, 'modules', 'manage', 'active'])); + } + + if ($this->db('modules')->delete('dir', $dir)) { + $core = $this->core; + $info = include(MODULES.'/'.$dir.'/Info.php'); + + if (isset($info['uninstall'])) { + $info['uninstall'](); + } + + $this->notify('success', $this->lang('deactivate_success'), $dir); + } else { + $this->notify('failure', $this->lang('deactivate_failure'), $dir); + } + + redirect(url([ADMIN, 'modules', 'manage', 'active'])); + } + + public function getRemove($dir) + { + if (in_array($dir, unserialize(BASIC_MODULES))) { + $this->notify('failure', $this->lang('remove_failure'), $dir); + redirect(url([ADMIN, 'modules', 'manage', 'inactive'])); + } + + $path = MODULES.'/'.$dir; + if (is_dir($path)) { + if (deleteDir($path)) { + $this->notify('success', $this->lang('remove_success'), $dir); + } else { + $this->notify('failure', $this->lang('remove_failure'), $dir); + } + } + redirect(url([ADMIN, 'modules', 'manage', 'inactive'])); + } + + public function getDetails($dir) + { + $files = [ + 'info' => MODULES.'/'.$dir.'/Info.php', + 'readme' => MODULES.'/'.$dir.'/ReadMe.md' + ]; + + $module = $this->core->getModuleInfo($dir); + $module['description'] = $this->tpl->noParse($module['description']); + $module['last_modified'] = date("Y-m-d", filemtime($files['info'])); + + // ReadMe.md + if (file_exists($files['readme'])) { + $parsedown = new \Inc\Core\Lib\Parsedown(); + $module['readme'] = $parsedown->text($this->tpl->noParse(file_get_contents($files['readme']))); + } + + $this->tpl->set('module', $module); + echo $this->tpl->draw(MODULES.'/modules/view/admin/details.html', true); + exit(); + } + + private function _modulesList($type) + { + $dbModules = array_column($this->db('modules')->toArray(), 'dir'); + $result = []; + + foreach (glob(MODULES.'/*', GLOB_ONLYDIR) as $dir) { + $dir = basename($dir); + $files = [ + 'info' => MODULES.'/'.$dir.'/Info.php', + 'admin' => MODULES.'/'.$dir.'/Admin.php', + 'site' => MODULES.'/'.$dir.'/Site.php' + ]; + + if ($type == 'active') { + $inArray = in_array($dir, $dbModules); + } else { + $inArray = !in_array($dir, $dbModules); + } + + if (((file_exists($files['info']) && file_exists($files['admin'])) || (file_exists($files['info']) && file_exists($files['site']))) && $inArray) { + $details = $this->core->getModuleInfo($dir); + $details['description'] = $this->tpl->noParse($details['description']); + $features = $this->core->getModuleNav($dir); + $other = []; + $urls = [ + 'url' => (is_array($features) ? url([ADMIN, $dir, array_shift($features)]) : '#'), + 'uninstallUrl' => url([ADMIN, 'modules', 'uninstall', $dir]), + 'removeUrl' => url([ADMIN, 'modules', 'remove', $dir]), + 'installUrl' => url([ADMIN, 'modules', 'install', $dir]), + 'detailsUrl' => url([ADMIN, 'modules', 'details', $dir]) + ]; + + $other['installed'] = $type == 'active' ? true : false; + + if (in_array($dir, unserialize(BASIC_MODULES))) { + $other['basic'] = true; + } else { + $other['basic'] = false; + } + + $other['compatible'] = $this->checkCompatibility(isset_or($details['compatibility'], '1.0.0')); + $result[] = $details + $urls + $other; + } + } + return $result; + } + + private function unzip($zipFile, $to, $path = '/') + { + $path = trim($path, '/'); + $zip = new \ZipArchive; + $zip->open($zipFile); + + for ($i = 0; $i < $zip->numFiles; $i++) { + $filename = $zip->getNameIndex($i); + + if (empty($path) || strpos($filename, $path) == 0) { + $file = $to.'/'.str_replace($path, null, $filename); + if (!file_exists(dirname($file))) { + mkdir(dirname($file), 0777, true); + } + + if (substr($file, -1) != '/') { + file_put_contents($to.'/'.str_replace($path, null, $filename), $zip->getFromIndex($i)); + } + } + } + + $zip->close(); + } + + private function checkCompatibility($version) + { + $systemVersion = $this->settings('settings', 'version'); + $version = str_replace(['.', '*'], ['\\.', '[0-9]+'], $version); + return preg_match('/^'.$version.'[a-z]*$/', $systemVersion); + } +} diff --git a/inc/modules/modules/Info.php b/inc/modules/modules/Info.php new file mode 100644 index 0000000..968cfb1 --- /dev/null +++ b/inc/modules/modules/Info.php @@ -0,0 +1,30 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['modules']['module_name'], + 'description' => $core->lang['modules']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.1', + 'compatibility' => '1.3.*', + 'icon' => 'plug', + + 'install' => function () use ($core) { + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `modules` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `dir` text NOT NULL, + `sequence` integer DEFAULT 0 + )"); + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DROP TABLE `modules`"); + } +]; diff --git a/inc/modules/modules/lang/admin/en_english.ini b/inc/modules/modules/lang/admin/en_english.ini new file mode 100644 index 0000000..0a5f185 --- /dev/null +++ b/inc/modules/modules/lang/admin/en_english.ini @@ -0,0 +1,40 @@ +module_name = "Modules" +module_desc = "Management modules." + +module = "Module" +version = "Version" +status = "Status" +author = "Author" +active = "Active" +activate = "Activate" +inactive = "Inactive" +deactivate = "Deactivate" +details = "Details" +upload_new = "Upload" +outdated = "outdated" +compatible = "compatible" +short_description = "Short description" +full_description = "Full description" +created_by = "Created by" +compatible_with = "Compatible with" +last_modified = "Last modified" +module_outdated = "Can't install module because is outdated. Please update module and try again." +deactivate_success = "'%s' module successfully deactivated." +deactivate_failure = "Unable to deactivate '%s' module." +deactivate_confirm = "Are you sure you want to deactivate this module?" +activate_success = "'%s' module successfully activated." +activate_failure = "Unable to activate '%s' module." +activate_failure_files = "Unable to activate '%s' module, because does not contain required files." +remove_confirm = "Are you sure you want to remove selected module?" +remove_success = "Module files '%s' has been successfully deleted." +remove_failure = "Unable to delete '%s' module files." +select_zip = "Select module with .zip extension." +upload_zip_subinfo = "Keep your modules up-to-date and upload compressed modules with .zip extension." +upload_zip_warning = "Module will be replaced if already exists." +upload_zip = "Upload" +upload_bad_file = "Module is incorrect or is interrupted." +upload_no_info = "File with informations about module does not exist." +upload_success = "Module successfully added. Go to Inactive page and activate it." +upload_bad_version = "Uploaded module is older or has the same version as installed." + +file_lock = "File uploading is disabled. You have to upload packages through FTP." \ No newline at end of file diff --git a/inc/modules/modules/lang/admin/pl_polski.ini b/inc/modules/modules/lang/admin/pl_polski.ini new file mode 100644 index 0000000..70a7ddb --- /dev/null +++ b/inc/modules/modules/lang/admin/pl_polski.ini @@ -0,0 +1,40 @@ +module_name = "Moduły" +module_desc = "Zarządzanie modułami." + +module = "Moduł" +version = "Wersja" +status = "Status" +author = "Autor" +active = "Aktywne" +activate = "Aktywuj" +inactive = "Nieaktywne" +deactivate = "Dezaktywuj" +details = "Szczegóły" +upload_new = "Wgraj nowy" +outdated = "przestarzały" +compatible = "kompatybilny" +short_description = "Krótki opis" +full_description = "Pełen opis" +created_by = "Stworzony przez" +compatible_with = "Kompatybilny z" +last_modified = "Ostatnio zmodyfikowany" +module_outdated = "Moduł jest przestarzały i nie może zostać zainstalowany. Prosimy zaktualizować go i spróbować ponownie." +deactivate_success = "Moduł '%s' został pomyślnie dezaktywowany." +deactivate_failure = "Nie udało się dezaktywować modułu '%s'." +deactivate_confirm = "Czy na pewno chcesz dezaktywować wybrany moduł?" +activate_success = "Moduł '%s' został pomyślnie aktywowany." +activate_failure = "Nie udało się aktywować modułu '%s'." +activate_failure_files = "Nie udało się aktywować modułu '%s', ponieważ nie posiada on wymaganych plików." +remove_confirm = "Na pewno chcesz usunąć wybrany moduł?" +remove_success = "Pliki modułu '%s' zostały pomyślnie usunięte." +remove_failure = "Nie udało się usunąć plików modułu '%s'." +select_zip = "Wybierz moduł w formacie *.zip" +upload_zip_subinfo = "Skompresowane moduły z rozszerzeniem .zip pozwolą ci szybko i sprawnie wzbogacić twój system o kolejne moduły." +upload_zip_warning = "Jeżeli moduł w systemie już istnieje, to zostanie nadpisany." +upload_zip = "Prześlij" +upload_bad_file = "Archiwum modułu jest niepoprawne lub zostało uszkodzone." +upload_no_info = "Brak pliku z informacjami o module" +upload_success = "Moduł został pomyślnie wgrany. Przejdź do zakładki Nieaktywne w celu jego aktywacji." +upload_bad_version = "Wgrywany moduł jest starszy lub posiadą tą samą wersję co obecnie zainstalowany." + +file_lock = "Przesyłanie paczek jest zablokowane. Aktualizację modułu musisz przeprowadzić ręcznie." \ No newline at end of file diff --git a/inc/modules/modules/view/admin/details.html b/inc/modules/modules/view/admin/details.html new file mode 100644 index 0000000..38254c8 --- /dev/null +++ b/inc/modules/modules/view/admin/details.html @@ -0,0 +1,64 @@ + + + \ No newline at end of file diff --git a/inc/modules/modules/view/admin/manage.html b/inc/modules/modules/view/admin/manage.html new file mode 100644 index 0000000..6b6c59f --- /dev/null +++ b/inc/modules/modules/view/admin/manage.html @@ -0,0 +1,84 @@ +
    +
    +
    +
    +

    {$lang.general.manage}

    + +
    +
    + {if: !empty($modules)} +
    + + + + + + + + + + + {loop: $modules} + {loop: $value} + + + + + + + + {/loop} + {/loop} + +
    {$lang.modules.module}{$lang.modules.version}{$lang.modules.status}{$lang.general.actions}
    + + {$value.name} + +

    {$value.description|cut:54}

    +
    {$value.version} + {if: !$value.compatible} + {$lang.modules.outdated} + {else} + {$lang.modules.compatible} + {/if} + + + + + {if: $value.installed} + + + + {else} + + + + + + + {/if} +
    +
    + {else} +

    {$lang.general.empty_array}

    + {/if} +
    +
    +
    +
    + + + \ No newline at end of file diff --git a/inc/modules/modules/view/admin/upload.html b/inc/modules/modules/view/admin/upload.html new file mode 100644 index 0000000..49e571c --- /dev/null +++ b/inc/modules/modules/view/admin/upload.html @@ -0,0 +1,30 @@ +
    +
    +
    +
    {$lang.modules.upload_new}
    +
    + {if: FILE_LOCK} +
    {$lang.modules.file_lock}FILE_LOCK
    + {/if} +
    +
    + {$lang.modules.upload_zip_subinfo} + info +
    + +
    + {$lang.modules.upload_zip_warning} + info +
    + +
    + + +
    + + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/navigation/Admin.php b/inc/modules/navigation/Admin.php new file mode 100644 index 0000000..2eff3bb --- /dev/null +++ b/inc/modules/navigation/Admin.php @@ -0,0 +1,447 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Navigation; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + private $assign = []; + public function navigation() + { + return [ + $this->lang('manage', 'general') => 'manage', + $this->lang('add_link') => 'newLink', + $this->lang('add_nav') => 'newNav' + ]; + } + + /** + * list of navs and their children + */ + public function getManage() + { + // lang + if (!empty($_GET['lang'])) { + $lang = $_GET['lang']; + $_SESSION['navigation']['last_lang'] = $lang; + } elseif (!empty($_SESSION['navigation']['last_lang'])) { + $lang = $_SESSION['navigation']['last_lang']; + } else { + $lang = $this->settings('settings', 'lang_site'); + } + + $this->assign['langs'] = $this->_getLanguages($lang, 'active'); + + // list + $rows = $this->db('navs')->toArray(); + if (count($rows)) { + foreach ($rows as $row) { + $row['name'] = $this->tpl->noParse('{$navigation.'.$row['name'].'}'); + $row['editURL'] = url([ADMIN, 'navigation', 'editNav', $row['id']]); + $row['delURL'] = url([ADMIN, 'navigation', 'deleteNav', $row['id']]); + $row['items'] = $this->_getNavItems($row['id'], $lang); + + $this->assign['navs'][] = $row; + } + } + + return $this->draw('manage.html', ['navigation' => $this->assign]); + } + + /** + * add new link + */ + public function getNewLink() + { + // lang + if (isset($_GET['lang'])) { + $lang = $_GET['lang']; + } else { + $lang = $this->settings('settings', 'lang_site'); + } + $this->assign['langs'] = $this->_getLanguages($lang, 'selected'); + + $this->assign['link'] = ['name' => '', 'lang' => '', 'page' => '', 'url' => '', 'parent' => '', 'class' => '']; + + // list of pages + $this->assign['pages'] = $this->_getPages($lang); + foreach ($this->core->getRegisteredPages() as $page) { + $this->assign['pages'][] = array_merge($page, ['id' => $page['slug'], 'attr' => null]); + } + + // list of parents + $this->assign['navs'] = $this->_getParents($lang); + + $this->assign['title'] = $this->lang('add_link'); + return $this->draw('form.link.html', ['navigation' => $this->assign]); + } + + /** + * edit link + */ + public function getEditLink($id) + { + $row = $this->db('navs_items')->oneArray($id); + + if (!empty($row)) { + // lang + if (isset($_GET['lang'])) { + $lang = $_GET['lang']; + } else { + $lang = $row['lang']; + } + $this->assign['langs'] = $this->_getLanguages($lang, 'selected'); + + $this->assign['link'] = filter_var_array($row, FILTER_SANITIZE_SPECIAL_CHARS); + + // list of pages + $this->assign['pages'] = $this->_getPages($lang, $row['page']); + foreach ($this->core->getRegisteredPages() as $page) { + $this->assign['pages'][] = array_merge($page, ['id' => $page['slug'], 'attr' => (($row['page'] == 0 && $row['url'] == $page['slug']) ? 'selected' : null)]); + } + + // list of parents + $this->assign['navs'] = $this->_getParents($lang, $row['nav'], $row['parent'], $row['id']); + + $this->assign['title'] = $this->lang('edit_link'); + return $this->draw('form.link.html', ['navigation' => $this->assign]); + } else { + redirect(url([ADMIN, 'navigation', 'manage'])); + } + } + + /** + * save link data + */ + public function postSaveLink($id = null) + { + unset($_POST['save']); + + // check if it's an external link + if ($_POST['page']) { + $fields = ['name', 'page', 'lang', 'parent']; + } else { + $fields = ['name', 'url', 'lang', 'parent']; + } + + if (!$id) { + $location = url([ADMIN, 'navigation', 'newLink']); + } else { + $location = url([ADMIN, 'navigation', 'editLink', $id]); + } + + if (checkEmptyFields($fields, $_POST)) { + $this->notify('failure', $this->lang('empty_inputs', 'general')); + $this->assign['form'] = filter_var_array($_POST, FILTER_SANITIZE_SPECIAL_CHARS); + redirect($location); + } + + if ($_POST['page']) { + $_POST['url'] = null; + } + + // get parent + $parent = explode('_', $_POST['parent']); + $_POST['nav'] = $parent[0]; + $_POST['parent'] = (isset($parent[1]) ? $parent[1] : 0); + + if (!is_numeric($_POST['page'])) { + $_POST['url'] = $_POST['page']; + $_POST['page'] = 0; + } + + if (!$id) { + $_POST['"order"'] = $this->_getHighestOrder($_POST['nav'], $_POST['parent'], $_POST['lang']) + 1; + $query = $this->db('navs_items')->save($_POST); + } else { + $query = $this->db('navs_items')->where($id)->save($_POST); + if ($query) { + $query = $this->db('navs_items')->where('parent', $id)->update(['nav' => $_POST['nav']]); + } + } + + if ($query) { + $this->notify('success', $this->lang('save_link_success')); + } else { + $this->notify('failure', $this->lang('save_link_failure')); + } + + redirect($location); + } + + /** + * delete link + */ + public function getDeleteLink($id) + { + if ($this->db('navs_items')->where('id', $id)->orWhere('parent', $id)->delete()) { + $this->notify('success', $this->lang('delete_link_success')); + } else { + $this->notify('failure', $this->lang('delete_link_failure')); + } + + redirect(url([ADMIN, 'navigation', 'manage'])); + } + + /** + * add new nav + */ + public function getNewNav() + { + $this->assign['title'] = $this->lang('add_nav'); + + $this->assign['name'] = ''; + return $this->draw('form.nav.html', ['navigation' => $this->assign]); + } + + /** + * edit nav + */ + public function getEditNav($id) + { + $this->assign['title'] = $this->lang('edit_nav'); + $row = $this->db('navs')->where($id)->oneArray(); + + if (!empty($row)) { + $this->assign['name'] = $row['name']; + $this->assign['id'] = $row['id']; + } else { + redirect(url([ADMIN, 'navigation', 'manage'])); + } + + return $this->draw('form.nav.html', ['navigation', $this->assign]); + } + + /** + * save nav + */ + public function postSaveNav($id = null) + { + if (empty($_POST['name'])) { + if (!$id) { + redirect(url([ADMIN, 'navigation', 'newNav'])); + } else { + redirect(url([ADMIN, 'navigation', 'editNav', $id])); + } + + $this->notify('failure', $this->lang('empty_inputs', 'general')); + } + + $name = createSlug($_POST['name']); + + // check if nav already exists + if (!$this->db('navs')->where('name', $name)->count()) { + if (!$id) { + $query = $this->db('navs')->save(['name' => $name]); + } else { + $query = $this->db('navs')->where($id)->save(['name' => $name]); + } + + if ($query) { + $this->notify('success', $this->lang('save_nav_success')); + } else { + $this->notify('success', $this->lang('save_nav_failure')); + } + } else { + $this->notify('failure', $this->lang('nav_already_exists')); + } + + redirect(url([ADMIN, 'navigation', 'manage'])); + } + + /** + * remove nav + */ + public function getDeleteNav($id) + { + if ($this->db('navs')->delete($id)) { + $this->db('navs_items')->delete('nav', $id); + $this->notify('success', $this->lang('delete_nav_success')); + } else { + $this->notify('failure', $this->lang('delete_nav_failure')); + } + + redirect(url([ADMIN, 'navigation', 'manage'])); + } + + /** + * list of pages + * @param string $lang + * @param integer $selected + * @return array + */ + private function _getPages($lang, $selected = null) + { + $rows = $this->db('pages')->where('lang', $lang)->toArray(); + if (count($rows)) { + foreach ($rows as $row) { + if ($selected == $row['id']) { + $attr = 'selected'; + } else { + $attr = null; + } + $result[] = ['id' => $row['id'], 'title' => $row['title'], 'slug' => $row['slug'], 'attr' => $attr]; + } + } + return $result; + } + + /** + * list of parents + * @param string $lang + * @param integer $selected + * @return array + */ + private function _getParents($lang, $nav = null, $page = null, $except = null) + { + $rows = $this->db('navs')->toArray(); + if (count($rows)) { + foreach ($rows as &$row) { + $row['name'] = $this->tpl->noParse('{$navigation.'.$row['name'].'}'); + $row['items'] = $this->_getNavItems($row['id'], $lang); + + if ($nav && !$page && ($nav == $row['id'])) { + $row['attr'] = 'selected'; + } else { + $row['attr'] = null; + } + + if (is_array($row['items'])) { + foreach ($row['items'] as $key => &$value) { + if ($except && ($except == $value['id'])) { + unset($row['items'][$key]); + } else { + if ($nav && $page && ($page == $value['id'])) { + $value['attr'] = 'selected'; + } else { + $value['attr'] = null; + } + } + } + } + } + } + return $rows; + } + + /** + * list of nav items + * @param integer $nav + * @param string $lang + * @return array + */ + private function _getNavItems($nav, $lang) + { + $items = $this->db('navs_items')->where('nav', $nav)->where('lang', $lang)->asc('"order"')->toArray(); + + if (count($items)) { + foreach ($items as &$item) { + $item['editURL'] = url([ADMIN, 'navigation', 'editLink', $item['id']]); + $item['delURL'] = url([ADMIN, 'navigation', 'deleteLink', $item['id']]); + $item['upURL'] = url([ADMIN, 'navigation', 'changeOrder', 'up', $item['id']]); + $item['downURL'] = url([ADMIN, 'navigation', 'changeOrder', 'down', $item['id']]); + + if ($item['page'] > 0) { + $page = $this->db('pages')->where('id', $item['page'])->oneArray(); + $item['fullURL'] = '/'.$page['slug']; + } else { + $item['fullURL'] = (parse_url($item['url'], PHP_URL_SCHEME) || strpos($item['url'], '#') === 0 ? '' : '/').trim($item['url'], '/'); + } + } + return $this->buildTree($items); + } + } + + /** + * generate tree from array + * @param array $items + * @return array + */ + public function buildTree(array $items) + { + $children = [0 => []]; + + foreach ($items as &$item) { + $children[$item['parent']][] = &$item; + } + unset($item); + + foreach ($items as &$item) { + if (isset($children[$item['id']])) { + $item['children'] = $children[$item['id']]; + } + } + + return $children[0]; + } + + /** + * change order of nav item + * @param string $direction + * @param integer $id + * @return void + */ + public function getChangeOrder($direction, $id) + { + $item = $this->db('navs_items')->oneArray($id); + + if (!empty($item)) { + if ($direction == 'up') { + $nextItem = $this->db('navs_items') + ->where('"order"', '<', $item['order']) + ->where('nav', $item['nav']) + ->where('parent', $item['parent']) + ->where('lang', $item['lang']) + ->desc('"order"') + ->oneArray(); + } else { + $nextItem = $this->db('navs_items') + ->where('"order"', '>', $item['order']) + ->where('nav', $item['nav']) + ->where('parent', $item['parent']) + ->where('lang', $item['lang']) + ->asc('"order"') + ->oneArray(); + } + + if (!empty($nextItem)) { + $this->db('navs_items')->where('id', $item['id'])->save(['"order"' => $nextItem['order']]); + $this->db('navs_items')->where('id', $nextItem['id'])->save(['"order"' => $item['order']]); + } + } + redirect(url(ADMIN.'/navigation/manage?lang='.$item['lang'])); + } + + /** + * get item with highest order + * @param integer $nav + * @param integer $parent + * @param string $lang + * @return integer + */ + private function _getHighestOrder($nav, $parent, $lang) + { + $item = $this->db('navs_items') + ->where('nav', $nav) + ->where('parent', $parent) + ->where('lang', $lang) + ->desc('"order"') + ->oneArray(); + + if (!empty($item)) { + return $item['order']; + } else { + return 0; + } + } +} diff --git a/inc/modules/navigation/Info.php b/inc/modules/navigation/Info.php new file mode 100644 index 0000000..d05a777 --- /dev/null +++ b/inc/modules/navigation/Info.php @@ -0,0 +1,54 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['navigation']['module_name'], + 'description' => $core->lang['navigation']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.1', + 'compatibility' => '1.3.*', + 'icon' => 'list-ul', + + 'install' => function () use ($core) { + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `navs` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `name` text NOT NULL + )"); + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `navs_items` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `name` text NOT NULL, + `url` text NULL, + `page` integer NULL, + `lang` text NOT NULL, + `parent` integer NOT NULL DEFAULT 0, + `nav` integer NOT NULL, + `order` integer NOT NULL, + `class` text NULL + )"); + $core->db()->pdo()->exec("INSERT INTO `navs` (`name`) VALUES ('main')"); + $core->db()->pdo()->exec("INSERT INTO `navs_items` (`name`, `url`, `page`, `lang`, `nav`, `order`) + VALUES ('Home', 'blog', 0, 'en_english', 1, 1)"); + $core->db()->pdo()->exec("INSERT INTO `navs_items` (`name`, `url`, `page`, `lang`, `nav`, `order`) + VALUES ('Strona główna', 'blog', 0, 'pl_polski', 1, 1)"); + $core->db()->pdo()->exec("INSERT INTO `navs_items` (`name`, `page`, `lang`, `nav`, `order`) + VALUES ('About me', 1, 'en_english', 1, 2)"); + $core->db()->pdo()->exec("INSERT INTO `navs_items` (`name`, `page`, `lang`, `nav`, `order`) + VALUES ('O mnie', 2, 'pl_polski', 1, 2)"); + $core->db()->pdo()->exec("INSERT INTO `navs_items` (`name`, `page`, `lang`, `nav`, `order`) + VALUES ('Contact', 3, 'en_english', 1, 3)"); + $core->db()->pdo()->exec("INSERT INTO `navs_items` (`name`, `page`, `lang`, `nav`, `order`) + VALUES ('Kontakt', 4, 'pl_polski', 1, 3)"); + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DROP TABLE `navs`"); + $core->db()->pdo()->exec("DROP TABLE `navs_items`"); + } +]; diff --git a/inc/modules/navigation/Site.php b/inc/modules/navigation/Site.php new file mode 100644 index 0000000..e94c2e9 --- /dev/null +++ b/inc/modules/navigation/Site.php @@ -0,0 +1,103 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Navigation; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + public function routes() + { + $this->_insertMenu(); + } + + /** + * get nav data + */ + private function _insertMenu() + { + $assign = []; + $homepage = $this->settings('settings', 'homepage'); + + $lang_prefix = $this->core->lang['name']; + if ($lang_prefix != $this->settings('settings', 'lang_site')) { + $lang_prefix = explode('_', $lang_prefix)[0]; + } else { + $lang_prefix = null; + } + + // get nav + $navs = $this->db('navs')->toArray(); + foreach ($navs as $nav) { + // get nav children + $items = $this->db('navs_items')->leftJoin('pages', 'pages.id = navs_items.page')->where('navs_items.nav', $nav['id'])->where('navs_items.lang', $this->core->lang['name'])->asc('`order`')->select(['navs_items.*', 'pages.slug'])->toArray(); + + if (count($items)) { + // generate URL + foreach ($items as &$item) { + // if external URL field is empty, it means that it's a batflat page + $item['active'] = null; + if (!$item['url']) { + if ($item['slug'] == $homepage) { + $item['url'] = $lang_prefix ? url([$lang_prefix]) : url(''); + } else { + $item['url'] = $lang_prefix ? url([$lang_prefix, $item['slug']]) : url([$item['slug']]); + } + + $url = parseURL(); + if ($url[0] == $item['slug'] || (preg_match('/^[a-z]{2}$/', $url[0]) && isset_or($url[1], $homepage) == $item['slug']) || $this->_isChildActive($item['id'], $url[0]) || ($url[0] == null && $homepage == $item['slug'])) { + $item['active'] = 'active'; + } + } else { + $item['url'] = url($item['url']); + $page = ['slug' => null]; + + if (url(parseURL(1)) == $item['url'] || $this->_isChildActive($item['id'], parseURL(1)) || (parseURL(1) == null && url($homepage) == $item['url'])) { + $item['active'] = 'active'; + } + + if ($item['url'] == url($homepage)) { + $item['url'] = url(''); + } + } + } + + $navigation_admin = new Admin($this->core); + $assign[$nav['name']] = $this->draw('nav.html', ['navigation' => ['list' => $navigation_admin->buildTree($items)]]); + } else { + $assign[$nav['name']] = null; + } + } + + $this->tpl->set('navigation', $assign); + } + + /** + * check if parent's child is active + */ + private function _isChildActive($itemID, $slug) + { + $rows = $this->db('pages') + ->leftJoin('navs_items', 'pages.id = navs_items.page') + ->where('navs_items.parent', $itemID) + ->toArray(); + + if (count($rows)) { + foreach ($rows as $row) { + if ($slug == $row['slug']) { + return true; + } + } + } + return false; + } +} diff --git a/inc/modules/navigation/lang/admin/en_english.ini b/inc/modules/navigation/lang/admin/en_english.ini new file mode 100644 index 0000000..3f1253c --- /dev/null +++ b/inc/modules/navigation/lang/admin/en_english.ini @@ -0,0 +1,22 @@ +module_name = "Navigation" +module_desc = "Management elements in navigation." + +add_link = "Add link" +edit_link = "Edit link" +save_link_success = "Link successfully saved." +save_link_failure = "Failed to save link." +delete_link_success = "Link successfully deleted." +delete_link_failure = "Unable to delete link." +delete_link_confirm = "Are you sure you want to delete link?" +add_nav = "Add navigation" +edit_nav = "Edit navigation" +save_nav_success = "Navigation successfully saved." +save_nav_failure = "Failed to save navigation." +delete_nav_success = "Navigation successfully deleted." +delete_nav_failure = "Unable to delete navigation." +delete_nav_confirm = "Are you sure you want to delete navigation?" +nav_already_exists = "Navigation already exists." +page = "Page" +url = "URL" +class = "Additional CSS class" +parent = "Parent" \ No newline at end of file diff --git a/inc/modules/navigation/lang/admin/pl_polski.ini b/inc/modules/navigation/lang/admin/pl_polski.ini new file mode 100644 index 0000000..f85c368 --- /dev/null +++ b/inc/modules/navigation/lang/admin/pl_polski.ini @@ -0,0 +1,22 @@ +module_name = "Nawigacja" +module_desc = "Zarządzanie elementami w nawigacji." + +add_link = "Dodaj odnośnik" +edit_link = "Edycja odnośnika" +save_link_success = "Pomyślnie zapisano odnośnik." +save_link_failure = "Nie udało się zapisać odnośnika." +delete_link_success = "Pomyślnie usunięto odnośnik." +delete_link_failure = "Nie udało się usunąć odnośnika." +delete_link_confirm = "Czy na pewno chcesz usunąć wybrany odnośnik?" +add_nav = "Dodaj nawigację" +edit_nav = "Edycja nawigacji" +save_nav_success = "Pomyślnie zapisano nawigację." +save_nav_failure = "Nie udało się zapisać nawigacji." +delete_nav_success = "Pomyślnie usunięto nawigację." +delete_nav_failure = "Nie udało się usunąć nawigacji." +delete_nav_confirm = "Czy na pewno chcesz usunąć wybraną nawigację?" +nav_already_exists = "Nawigacja o takiej nazwie już istnieje." +page = "Strona" +url = "URL" +class = "Dodatkowa klasa CSS" +parent = "Rodzic" \ No newline at end of file diff --git a/inc/modules/navigation/view/admin/form.link.html b/inc/modules/navigation/view/admin/form.link.html new file mode 100644 index 0000000..f8b96d5 --- /dev/null +++ b/inc/modules/navigation/view/admin/form.link.html @@ -0,0 +1,77 @@ +
    +
    +
    +
    +

    {$navigation.title}

    +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    + +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/inc/modules/navigation/view/admin/form.nav.html b/inc/modules/navigation/view/admin/form.nav.html new file mode 100644 index 0000000..ddf5477 --- /dev/null +++ b/inc/modules/navigation/view/admin/form.nav.html @@ -0,0 +1,18 @@ +
    +
    +
    +
    +

    {$navigation.title}

    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/navigation/view/admin/manage.html b/inc/modules/navigation/view/admin/manage.html new file mode 100644 index 0000000..f48cf4a --- /dev/null +++ b/inc/modules/navigation/view/admin/manage.html @@ -0,0 +1,68 @@ +
    +
    +
    +
    +

    {$lang.general.manage}

    + +
    +
    + {if: isset($navigation.navs)} + {loop: $navigation.navs} +
    + + + + + + + + + + {if: is_array($value.items)} + {loop: $value.items} + + + + + + {if: isset($value.children)} + {loop: $value.children} + + + + + + {/loop} + {/if} + {/loop} + {/if} + +
    {$value.name} + + + + + + +
    {$value.name}{$value.fullURL} + + + + +
    {$value.name}{$value.fullURL} + + + + +
    +
    + {/loop} + {/if} +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/navigation/view/nav.html b/inc/modules/navigation/view/nav.html new file mode 100644 index 0000000..2fe8cc3 --- /dev/null +++ b/inc/modules/navigation/view/nav.html @@ -0,0 +1,19 @@ +{loop: $navigation.list} + {if: !isset($value.children)} +
  • + {$value.name} +
  • + {else} + + {/if} +{/loop} \ No newline at end of file diff --git a/inc/modules/pages/Admin.php b/inc/modules/pages/Admin.php new file mode 100644 index 0000000..20fe236 --- /dev/null +++ b/inc/modules/pages/Admin.php @@ -0,0 +1,281 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Pages; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + private $assign = []; + + public function navigation() + { + return [ + $this->lang('manage', 'general') => 'manage', + $this->lang('add_new') => 'add' + ]; + } + + /** + * list of pages + */ + public function getManage($page = 1) + { + // lang + if (!empty($_GET['lang'])) { + $lang = $_GET['lang']; + $_SESSION['pages']['last_lang'] = $lang; + } elseif (!empty($_SESSION['pages']['last_lang'])) { + $lang = $_SESSION['pages']['last_lang']; + } else { + $lang = $this->settings('settings', 'lang_site'); + } + + // pagination + $totalRecords = $this->db('pages')->where('lang', $lang)->toArray(); + $pagination = new \Inc\Core\Lib\Pagination($page, count($totalRecords), 10, url([ADMIN, 'pages', 'manage', '%d'])); + $this->assign['pagination'] = $pagination->nav(); + // list + $rows = $this->db('pages')->where('lang', $lang) + ->limit($pagination->offset().', '.$pagination->getRecordsPerPage()) + ->toArray(); + + $this->assign['list'] = []; + if (count($rows)) { + foreach ($rows as $row) { + $row = htmlspecialchars_array($row); + $row['editURL'] = url([ADMIN, 'pages', 'edit', $row['id']]); + $row['delURL'] = url([ADMIN, 'pages', 'delete', $row['id']]); + $row['viewURL'] = url(explode('_', $lang)[0].'/'.$row['slug']); + $row['desc'] = str_limit($row['desc'], 48); + + $this->assign['list'][] = $row; + } + } + + $this->assign['langs'] = $this->_getLanguages($lang); + return $this->draw('manage.html', ['pages' => $this->assign]); + } + + /** + * add new page + */ + public function getAdd() + { + $this->assign['editor'] = $this->settings('settings', 'editor'); + $this->_addHeaderFiles(); + + // Unsaved data with failure + if (!empty($e = getRedirectData())) { + $this->assign['form'] = ['title' => isset_or($e['title'], ''), 'desc' => isset_or($e['desc'], ''), 'content' => isset_or($e['content'], ''), 'slug' => isset_or($e['slug'], '')]; + } else { + $this->assign['form'] = ['title' => '', 'desc' => '', 'content' => '', 'slug' => '', 'markdown' => 0]; + } + + $this->assign['title'] = $this->lang('new_page'); + $this->assign['langs'] = $this->_getLanguages($this->settings('settings.lang_site'), 'selected'); + $this->assign['templates'] = $this->_getTemplates(isset_or($e['template'], 'index.html')); + $this->assign['manageURL'] = url([ADMIN, 'pages', 'manage']); + + return $this->draw('form.html', ['pages' => $this->assign]); + } + + + /** + * edit page + */ + public function getEdit($id) + { + $this->assign['editor'] = $this->settings('settings', 'editor'); + $this->_addHeaderFiles(); + + $page = $this->db('pages')->where('id', $id)->oneArray(); + + if (!empty($page)) { + // Unsaved data with failure + if (!empty($e = getRedirectData())) { + $page = array_merge($page, ['title' => isset_or($e['title'], ''), 'desc' => isset_or($e['desc'], ''), 'content' => isset_or($e['content'], ''), 'slug' => isset_or($e['slug'], '')]); + } + + $this->assign['form'] = htmlspecialchars_array($page); + $this->assign['form']['content'] = $this->tpl->noParse($this->assign['form']['content']); + + $this->assign['title'] = $this->lang('edit_page'); + $this->assign['langs'] = $this->_getLanguages($page['lang'], 'selected'); + $this->assign['templates'] = $this->_getTemplates($page['template']); + $this->assign['manageURL'] = url([ADMIN, 'pages', 'manage']); + + return $this->draw('form.html', ['pages' => $this->assign]); + } else { + redirect(url([ADMIN, 'pages', 'manage'])); + } + } + + /** + * save data + */ + public function postSave($id = null) + { + unset($_POST['save'], $_POST['files']); + + if (!$id) { + $location = url([ADMIN, 'pages', 'add']); + } else { + $location = url([ADMIN, 'pages', 'edit', $id]); + } + + if (checkEmptyFields(['title', 'lang', 'template'], $_POST)) { + $this->notify('failure', $this->lang('empty_inputs', 'general')); + redirect($location, $_POST); + } + + $_POST['title'] = trim($_POST['title']); + if (!isset($_POST['markdown'])) { + $_POST['markdown'] = 0; + } + + if (empty($_POST['slug'])) { + $_POST['slug'] = createSlug($_POST['title']); + } else { + $_POST['slug'] = createSlug($_POST['slug']); + } + + if ($id != null && $this->db('pages')->where('slug', $_POST['slug'])->where('lang', $_POST['lang'])->where('id', '!=', $id)->oneArray()) { + $this->notify('failure', $this->lang('page_exists')); + redirect(url([ADMIN, 'pages', 'edit', $id]), $_POST); + } elseif ($id == null && $this->db('pages')->where('slug', $_POST['slug'])->where('lang', $_POST['lang'])->oneArray()) { + $this->notify('failure', $this->lang('page_exists')); + redirect(url([ADMIN, 'pages', 'add']), $_POST); + } + + if (!$id) { + $_POST['date'] = date('Y-m-d H:i:s'); + $query = $this->db('pages')->save($_POST); + $location = url([ADMIN, 'pages', 'edit', $this->db()->pdo()->lastInsertId()]); + } else { + $query = $this->db('pages')->where('id', $id)->save($_POST); + } + + if ($query) { + $this->notify('success', $this->lang('save_success')); + } else { + $this->notify('failure', $this->lang('save_failure')); + } + + redirect($location); + } + + /** + * remove page + */ + public function getDelete($id) + { + if ($this->db('pages')->delete($id)) { + $this->notify('success', $this->lang('delete_success')); + } else { + $this->notify('failure', $this->lang('delete_failure')); + } + + redirect(url([ADMIN, 'pages', 'manage'])); + } + + + /** + * image upload from WYSIWYG + */ + public function postEditorUpload() + { + header('Content-type: application/json'); + $dir = UPLOADS.'/pages'; + $error = null; + + if (!file_exists($dir)) { + mkdir($dir, 0777, true); + } + + if (isset($_FILES['file']['tmp_name'])) { + $img = new \Inc\Core\Lib\Image; + + if ($img->load($_FILES['file']['tmp_name'])) { + $imgPath = $dir.'/'.time().'.'.$img->getInfos('type'); + $img->save($imgPath); + echo json_encode(['status' => 'success', 'result' => url($imgPath)]); + } else { + $error = $this->lang('editor_upload_fail'); + } + + if ($error) { + echo json_encode(['status' => 'failure', 'result' => $error]); + } + } + exit(); + } + + /** + * module JavaScript + */ + public function getJavascript() + { + header('Content-type: text/javascript'); + echo $this->draw(MODULES.'/pages/js/admin/pages.js'); + exit(); + } + + /** + * list of theme's templates + * @param string $selected + * @return array + */ + private function _getTemplates($selected = null) + { + $theme = $this->settings('settings', 'theme'); + $tpls = glob(THEMES.'/'.$theme.'/*.html'); + + $result = []; + foreach ($tpls as $tpl) { + if ($selected == basename($tpl)) { + $attr = 'selected'; + } else { + $attr = null; + } + $result[] = ['name' => basename($tpl), 'attr' => $attr]; + } + return $result; + } + + private function _addHeaderFiles() + { + // WYSIWYG + $this->core->addCSS(url('inc/jscripts/wysiwyg/summernote.min.css')); + $this->core->addJS(url('inc/jscripts/wysiwyg/summernote.min.js')); + if ($this->settings('settings', 'lang_admin') != 'en_english') { + $this->core->addJS(url('inc/jscripts/wysiwyg/lang/'.$this->settings('settings', 'lang_admin').'.js')); + } + + // HTML & MARKDOWN EDITOR + $this->core->addCSS(url('/inc/jscripts/editor/markitup.min.css')); + $this->core->addCSS(url('/inc/jscripts/editor/markitup.highlight.min.css')); + $this->core->addCSS(url('/inc/jscripts/editor/sets/html/set.min.css')); + $this->core->addCSS(url('/inc/jscripts/editor/sets/markdown/set.min.css')); + $this->core->addJS(url('/inc/jscripts/editor/highlight.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/markitup.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/markitup.highlight.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/sets/html/set.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/sets/markdown/set.min.js')); + + // ARE YOU SURE? + $this->core->addJS(url('inc/jscripts/are-you-sure.min.js')); + + // MODULE SCRIPTS + $this->core->addJS(url([ADMIN, 'pages', 'javascript'])); + } +} diff --git a/inc/modules/pages/Info.php b/inc/modules/pages/Info.php new file mode 100644 index 0000000..218a301 --- /dev/null +++ b/inc/modules/pages/Info.php @@ -0,0 +1,81 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['pages']['module_name'], + 'description' => $core->lang['pages']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.1', + 'compatibility' => '1.3.*', + 'icon' => 'file', + + 'install' => function () use ($core) { + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `pages` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `title` text NOT NULL, + `slug` text NOT NULL, + `desc` text NULL, + `lang` text NOT NULL, + `template` text NOT NULL, + `date` text NOT NULL, + `content` text NOT NULL, + `markdown` INTEGER DEFAULT 0 + )"); + + // About - EN + $core->db()->pdo()->exec("INSERT INTO `pages` (`title`, `slug`, `desc`, `lang`, `template`, `date`, `content`) + VALUES ('About me', 'about-me', 'Maecenas cursus accumsan est, sed interdum est pharetra quis.', 'en_english', 'index.html', datetime('now'), + '

    My name is Merely Ducard but I speak for Ra’s al Ghul… a man greatly feared by the criminal underworld. A mon who can offer you a path. Someone like you is only here by choice. You have been exploring the criminal fraternity but whatever your original intentions you have to become truly lost. The path of a man who shares his hatred of evil and wishes to serve true justice. The path of the League of Shadows.

    +

    Every year, I took a holiday. I went to Florence, this cafe on the banks of the Arno. Every fine evening, I would sit there and order a Fernet Branca. I had this fantasy, that I would look across the tables and I would see you there with a wife maybe a couple of kids. You wouldn’t say anything to me, nor me to you. But we would both know that you’ve made it, that you were happy. I never wanted you to come back to Gotham. I always knew there was nothing here for you except pain and tragedy and I wanted something more for you than that. I still do.

    ') + "); + + // About - PL + $core->db()->pdo()->exec("INSERT INTO `pages` (`title`, `slug`, `desc`, `lang`, `template`, `date`, `content`) + VALUES ('O mnie', 'about-me', 'Maecenas cursus accumsan est, sed interdum est pharetra quis.', 'pl_polski', 'index.html', datetime('now'), + '

    O, jak drudzy i świadki. I też same szczypiąc trawę ciągnęły powoli pod Twoją opiek ofiarowany, martwą podniosłem powiek i na kształt ogrodowych grządek: Że architekt był legijonistą przynosił kości stare na nim widzi sprzęty, też nie rozwity, lecz podmurowany. Świeciły się nagłe, jej wzrost i goście proszeni. Sień wielka jak znawcy, ci znowu w okolicy. i narody giną. Więc zbliżył się kołem. W mym domu przyszłą urządza zabawę. Dał rozkaz ekonomom, wójtom i w tkackim pudermanie). Wdział więc, jak wytnie dwa smycze chartów przedziwnie udawał psy tuż na polu szukała kogoś okiem, daleko, na Ojczyzny.

    +

    Bonapartą. tu pan Hrabia z rzadka ciche szmery a brano z boru i Waszeć z Podkomorzym przy zachodzie wszystko porzucane niedbale i w pogody lilia jeziór skroń ucałowawszy, uprzejmie pozdrowił. A zatem. tu mieszkał? Stary żołnierz, stał w bitwie, gdzie panieńskim rumieńcem dzięcielina pała a brano z nieba spadała w pomroku. Wprawdzie zdała się pan Sędzia w lisa, tak nie rzuca w porządku. naprzód dzieci mało wdawał się ukłoni i czytając, z których nie śmieli. I bór czernił się pan rejent Bolesta, zwano go powitać.

    ') + "); + + // Contact - EN + $core->db()->pdo()->exec("INSERT INTO `pages` (`title`, `slug`, `desc`, `lang`, `template`, `date`, `content`) + VALUES ('Contact', 'contact', '', 'en_english', 'index.html', datetime('now'), + '

    Want to get in touch with me? Fill out the form below to send me a message and I will try to get back to you within 24 hours!

    + {\$contact.form}') + "); + + // Contact - PL + $core->db()->pdo()->exec("INSERT INTO `pages` (`title`, `slug`, `desc`, `lang`, `template`, `date`, `content`) + VALUES ('Kontakt', 'contact', '', 'pl_polski', 'index.html', datetime('now'), + '

    Chcesz się ze mną skontaktować? Wypełnij poniższy formularz, aby wysłać mi wiadomość, a ja postaram się odpisać w ciągu 24 godzin!

    + {\$contact.form}') + "); + + // 404 - EN + $core->db()->pdo()->exec("INSERT INTO `pages` (`title`, `slug`, `desc`, `lang`, `template`, `date`, `content`) + VALUES ('404', '404', 'Not found', 'en_english', 'index.html', datetime('now'), + '

    Sorry, page does not exist.

    ') + "); + + // 404 -PL + $core->db()->pdo()->exec("INSERT INTO `pages` (`title`, `slug`, `desc`, `lang`, `template`, `date`, `content`) + VALUES ('404', '404', 'Not found', 'pl_polski', 'index.html', datetime('now'), + '

    Niestety taka strona nie istnieje.

    ') + "); + + if (!is_dir(UPLOADS."/pages")) { + mkdir(UPLOADS."/pages", 0777); + } + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DROP TABLE `pages`"); + deleteDir(UPLOADS."/pages"); + } +]; diff --git a/inc/modules/pages/ReadMe.md b/inc/modules/pages/ReadMe.md new file mode 100644 index 0000000..5908828 --- /dev/null +++ b/inc/modules/pages/ReadMe.md @@ -0,0 +1,18 @@ +`{$page.title}` — displays the title of the page + +`{$page.desc}` — displays the page description + +`{$page.content}` — displays the contents of the page + +`{$pages}` — array with the data of all pages + +`{$pages.ID}` — array with the data of specific page + +If you want to make a "one page" website, you can use the loop: + +``` +{loop: $pages} +

    {$value.title}

    +

    {$value.content}

    +{/loop} +``` \ No newline at end of file diff --git a/inc/modules/pages/Site.php b/inc/modules/pages/Site.php new file mode 100644 index 0000000..9d38f49 --- /dev/null +++ b/inc/modules/pages/Site.php @@ -0,0 +1,144 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Pages; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + public function init() + { + $slug = parseURL(); + $lang = $this->_getLanguageBySlug($slug[0]); + if ($lang !== false) { + $this->core->loadLanguage($lang); + } + + if (empty($slug[0]) || ($lang !== false && empty($slug[1]))) { + $this->core->router->changeRoute($this->settings('settings', 'homepage')); + } + + \Inc\Core\Lib\Event::add('router.notfound', function () { + $this->get404(); + }); + } + + public function routes() + { + // Load pages from default language + $this->route('(:str)', function ($slug) { + $this->_importPage($slug); + }); + + // Load pages from specified language prefix + $this->route('(:str)/(:str)', function ($lang, $slug) { + // get current language by slug + $lang = $this->_getLanguageBySlug($lang); + + // Set current language to specified or if not exists to default + if ($lang) { + $this->core->loadLanguage($lang); + } else { + $slug = null; + } + + $this->_importPage($slug); + }); + + $this->_importAllPages(); + } + + /** + * get a specific page + */ + private function _importPage($slug = null) + { + if (!empty($slug)) { + $row = $this->db('pages')->where('slug', $slug)->where('lang', $this->_getCurrentLang())->oneArray(); + + if (empty($row)) { + return $this->get404(); + } + } else { + return $this->get404(); + } + + if (intval($row['markdown'])) { + $parsedown = new \Inc\Core\Lib\Parsedown(); + $row['content'] = $parsedown->text($row['content']); + } + + $this->filterRecord($row); + $this->setTemplate($row['template']); + $this->tpl->set('page', $row); + } + + /** + * get array with all pages + */ + private function _importAllPages() + { + $this->tpl->set('pages', function () { + $rows = $this->db('pages')->where('lang', $this->_getCurrentLang())->toArray(); + + $assign = []; + foreach ($rows as $row) { + $this->filterRecord($row); + $assign[$row['id']] = $row; + } + + return $assign; + }); + } + + public function get404() + { + http_response_code(404); + if (!($row = $this->db('pages')->like('slug', '404%')->where('lang', $this->_getCurrentLang())->oneArray())) { + echo '

    404 Not Found

    '; + echo $this->lang('not_found'); + exit; + } + + $this->setTemplate($row['template']); + $this->tpl->set('page', $row); + } + + private function _getCurrentLang() + { + if (!isset($_SESSION['lang'])) { + return $this->settings('settings', 'lang_site'); + } else { + return $_SESSION['lang']; + } + } + + protected function _getLanguageBySlug($slug) + { + $langs = parent::_getLanguages(); + foreach ($langs as $lang) { + preg_match_all('/([a-z]{2})_([a-z]+)/', $lang['name'], $matches); + if ($slug == $matches[1][0]) { + return $matches[0][0]; + } + } + + return false; + } + + protected function filterRecord(array &$page) + { + if (isset($page['title'])) { + $page['title'] = htmlspecialchars($page['title']); + } + } +} diff --git a/inc/modules/pages/js/admin/pages.js b/inc/modules/pages/js/admin/pages.js new file mode 100644 index 0000000..601baa8 --- /dev/null +++ b/inc/modules/pages/js/admin/pages.js @@ -0,0 +1,156 @@ +function insertEditor(type) +{ + var editor = $('.editor'); + + if(type == 'wysiwyg') + { + if($('.markItUp').length) + { + editor.markItUpRemove(); + } + + editor.summernote( + { + lang: '{$lang.name}', + height: 335, + callbacks: + { + onInit: function() + { + $('.note-codable').keyup(function() + { + editor.val($(this).val()); + }); + }, + onImageUpload: function(files) + { + sendFile(files[0], this); + }, + onChange: function() + { + editor.parents('form').trigger('checkform.areYouSure'); + } + } + }); + } + else + { + if($('.note-editor').length) + { + editor.each(function() + { + var isEmpty = $(this).summernote('isEmpty'); + $(this).summernote('destroy'); + if(isEmpty) + $(this).html(''); + }); + } + + var checkbox = $('input[name="markdown"]'); + editor.each(function() + { + var currentEditor = $(this); + currentEditor.markItUp(checkbox.is(':checked') ? markItUp_markdown : markItUp_html).highlight(); + + if($('.editor').data('editor') == 'html') + { + checkbox.change(function() + { + currentEditor.markItUpRemove(); + if (checkbox.is(':checked')) + currentEditor.markItUp(markItUp_markdown).highlight(); + else + currentEditor.markItUp(markItUp_html).highlight(); + }); + } + }); + } +} + +function sendFile(file, editor) +{ + var formData = new FormData(); + formData.append('file', file); + + var fileData = URL.createObjectURL(file); + $(editor).summernote('insertImage', fileData, function ($image) + { + $.ajax({ + xhr: function() + { + var xhr = new window.XMLHttpRequest(); + + $('input[type="submit"]').prop('disabled', true); + var progress = $('.progress:first').clone(); + progress = (progress.fadeIn()).appendTo($('.progress-wrapper')); + + xhr.upload.addEventListener("progress", function(evt) + { + if(evt.lengthComputable) + { + var percentComplete = evt.loaded / evt.total; + percentComplete = parseInt(percentComplete * 100); + progress.children().css('width', percentComplete + '%'); + + if(percentComplete === 100) + { + progress.fadeOut(); + progress.remove(); + $('input[type="submit"]').prop('disabled', false); + } + } + }, false); + + return xhr; + }, + url: '{?=url([ADMIN, "pages", "editorUpload"])?}', + data: formData, + type: 'POST', + cache: false, + contentType: false, + processData: false, + dataType: 'json', + success: function(data) + { + if(data.status == 'success') + { + $image.remove(); + $(editor).summernote('insertImage', data.result); + } + else if(data.status == 'failure') + { + $image.remove(); + bootbox.alert(data.result); + } + } + }); + }); +} + +function markdown() +{ + var checkbox = $('input[name="markdown"]'); + if($('.editor').data('editor') == 'wysiwyg') + { + checkbox.change(function() + { + if($(this).is(':checked')) + insertEditor('html'); + else + insertEditor('wysiwyg'); + }); + + if(checkbox.is(':checked')) + insertEditor('html'); + else + insertEditor('wysiwyg'); + } + else + insertEditor('html'); +} + +$(document).ready(function() +{ + markdown(); + $('form').areYouSure( {'message':'{$lang.general.unsaved_warning}'} ); +}); \ No newline at end of file diff --git a/inc/modules/pages/lang/admin/en_english.ini b/inc/modules/pages/lang/admin/en_english.ini new file mode 100644 index 0000000..86ff62f --- /dev/null +++ b/inc/modules/pages/lang/admin/en_english.ini @@ -0,0 +1,21 @@ +module_name = "Pages" +module_desc = "Management of sub-pages." + +pages_count = "Pages:" +add_new = "Add new" +new_page = "New page" +edit_page = "Edit page" +description = "Description" +keywords = "Tags" +content = "Content" +view = "Preview" +slug = "Slug" +markdown = "Enable Markdown" +save_success = "Page successfully saved." +save_failure = "Failed to save page." +delete_success = "Page successfully deleted." +delete_failure = "Unable to delete page." +delete_confirm = "Are you sure you want to delete this page?" +page_exists = "Page slug already exists. Changes on the page have not been saved." + +editor_upload_fail = "Can't load image. Probably unsupported type." \ No newline at end of file diff --git a/inc/modules/pages/lang/admin/pl_polski.ini b/inc/modules/pages/lang/admin/pl_polski.ini new file mode 100644 index 0000000..3216738 --- /dev/null +++ b/inc/modules/pages/lang/admin/pl_polski.ini @@ -0,0 +1,21 @@ +module_name = "Strony" +module_desc = "Zarządzanie podstronami." + +pages_count = "Podstron:" +add_new = "Dodaj nową" +new_page = "Nowa strona" +edit_page = "Edycja strony" +description = "Opis" +keywords = "Tagi" +content = "Zawartość" +view = "Zobacz" +slug = "Nazwa odnośnika" +markdown = "Włącz Markdown" +save_success = "Pomyślnie zapisano stronę." +save_failure = "Nie udało się zapisać strony." +delete_success = "Pomyślnie usunięto stronę." +delete_failure = "Nie udało się usunąć strony." +delete_confirm = "Na pewno chcesz usunąć wybraną stronę?" +page_exists = "Strona o takiej nazwie już istnieje. Strona nie została zapisana." + +editor_upload_fail = "Nie udało się załadować obrazu. Prawdopodobnie nieobsługiwany typ." \ No newline at end of file diff --git a/inc/modules/pages/lang/en_english.ini b/inc/modules/pages/lang/en_english.ini new file mode 100644 index 0000000..2380578 --- /dev/null +++ b/inc/modules/pages/lang/en_english.ini @@ -0,0 +1 @@ +not_found = "Sorry, page does not exist." \ No newline at end of file diff --git a/inc/modules/pages/lang/pl_polski.ini b/inc/modules/pages/lang/pl_polski.ini new file mode 100644 index 0000000..04056cb --- /dev/null +++ b/inc/modules/pages/lang/pl_polski.ini @@ -0,0 +1 @@ +not_found = "Żądana strona nie została odnaleziona." \ No newline at end of file diff --git a/inc/modules/pages/view/admin/form.html b/inc/modules/pages/view/admin/form.html new file mode 100644 index 0000000..539528a --- /dev/null +++ b/inc/modules/pages/view/admin/form.html @@ -0,0 +1,75 @@ +
    +
    +
    +
    +
    +

    {$pages.title}

    +
    +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +

    SEO

    +
    +
    +
    + + +
    +
    + + +
    +
    +
    + +
    +
    +

    {$lang.general.settings}

    +
    +
    +
    + + +
    +
    + + +
    + +
    + +
    + + {$lang.general.cancel} +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/pages/view/admin/manage.html b/inc/modules/pages/view/admin/manage.html new file mode 100644 index 0000000..017467b --- /dev/null +++ b/inc/modules/pages/view/admin/manage.html @@ -0,0 +1,54 @@ +
    +
    +
    +
    +

    {$lang.general.manage}

    + +
    +
    +

    {$lang.pages.pages_count} {?=count($pages.list)?}

    +
    + + + + + + + + + + + {if: !empty($pages.list)} + {loop: $pages.list} + + + + + + + {/loop} + {else} + + {/if} + +
    {$lang.general.title}{$lang.pages.slug}{$lang.general.template}{$lang.general.actions}
    {$value.title} {$value.desc}/{$value.slug}{$value.template} + + + + + + + + + +
    {$lang.general.empty_array}
    +
    + {$pages.pagination} +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/sample/Admin.php b/inc/modules/sample/Admin.php new file mode 100644 index 0000000..0b2ae65 --- /dev/null +++ b/inc/modules/sample/Admin.php @@ -0,0 +1,45 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Sample; + +use Inc\Core\AdminModule; + +/** + * Sample admin class + */ +class Admin extends AdminModule +{ + /** + * Module navigation + * Items of the returned array will be displayed in the administration sidebar + * + * @return array + */ + public function navigation() + { + return [ + $this->lang('index') => 'index', + ]; + } + + /** + * GET: /admin/sample/index + * Subpage method of the module + * + * @return string + */ + public function getIndex() + { + $text = 'Hello World'; + return $this->draw('index.html', ['text' => $text]); + } +} diff --git a/inc/modules/sample/Info.php b/inc/modules/sample/Info.php new file mode 100644 index 0000000..54a4140 --- /dev/null +++ b/inc/modules/sample/Info.php @@ -0,0 +1,27 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['sample']['module_name'], + 'description' => $core->lang['sample']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.0', + 'compatibility' => '1.3.*', // Compatibility with Batflat version + 'icon' => 'code', // Icon from http://fontawesome.io/icons/ + + // Registering page for possible use as a homepage + 'pages' => ['Sample Page' => 'sample'], + + 'install' => function () use ($core) { + }, + 'uninstall' => function () use ($core) { + } +]; diff --git a/inc/modules/sample/Site.php b/inc/modules/sample/Site.php new file mode 100644 index 0000000..a8c4ea6 --- /dev/null +++ b/inc/modules/sample/Site.php @@ -0,0 +1,81 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Sample; + +use Inc\Core\SiteModule; + +/** + * Sample site class + */ +class Site extends SiteModule +{ + /** + * Example module variable + * + * @var string + */ + protected $foo; + + /** + * Module initialization + * Here everything is done while the module starts + * + * @return void + */ + public function init() + { + $this->foo = 'Hello'; + } + /** + * Register module routes + * Call the appropriate method/function based on URL + * + * @return void + */ + public function routes() + { + // Simple: + $this->route('sample', 'getIndex'); + /* + * Or: + * $this->route('sample', function() { + * $this->getIndex(); + * }); + * + * or: + * $this->router->set('sample', $this->getIndex()); + * + * or: + * $this->router->set('sample', function() { + * $this->getIndex(); + * }); + */ + } + + /** + * GET: /sample + * Called method by router + * + * @return string + */ + public function getIndex() + { + $page = [ + 'title' => $this->lang('title'), + 'desc' => 'Your page description here', + 'content' => $this->draw('hello.html') + ]; + + $this->setTemplate('index.html'); + $this->tpl->set('page', $page); + } +} diff --git a/inc/modules/sample/lang/admin/en_english.ini b/inc/modules/sample/lang/admin/en_english.ini new file mode 100644 index 0000000..392a68a --- /dev/null +++ b/inc/modules/sample/lang/admin/en_english.ini @@ -0,0 +1,6 @@ +module_name = "Sample module" +module_desc = "This is an example of module structure and usage in Batflat." + +index = "Look here!" +example = "Hello World!" +button = "Go to sample module front page" \ No newline at end of file diff --git a/inc/modules/sample/lang/admin/pl_polski.ini b/inc/modules/sample/lang/admin/pl_polski.ini new file mode 100644 index 0000000..07d4b5b --- /dev/null +++ b/inc/modules/sample/lang/admin/pl_polski.ini @@ -0,0 +1,6 @@ +module_name = "Przykładowy moduł" +module_desc = "To jest przykładowy moduł, dzięki któremu poznasz podstawę tworzenia modułów dla Batflata." + +index = "Zobacz tutaj!" +example = "Witaj świecie!" +button = "Przejdź do przykładowej podstrony modułu" \ No newline at end of file diff --git a/inc/modules/sample/lang/en_english.ini b/inc/modules/sample/lang/en_english.ini new file mode 100644 index 0000000..a8f0376 --- /dev/null +++ b/inc/modules/sample/lang/en_english.ini @@ -0,0 +1 @@ +title = "Sample module title" \ No newline at end of file diff --git a/inc/modules/sample/lang/pl_polski.ini b/inc/modules/sample/lang/pl_polski.ini new file mode 100644 index 0000000..703415a --- /dev/null +++ b/inc/modules/sample/lang/pl_polski.ini @@ -0,0 +1 @@ +title = "Testowa strona modułu" \ No newline at end of file diff --git a/inc/modules/sample/view/admin/index.html b/inc/modules/sample/view/admin/index.html new file mode 100644 index 0000000..1342e65 --- /dev/null +++ b/inc/modules/sample/view/admin/index.html @@ -0,0 +1,16 @@ +
    +
    +
    +
    +

    {$text}

    +
    +
    +
    +

    {$lang.sample.example}

    +
    + {$lang.sample.button} +
    +
    + +
    +
    diff --git a/inc/modules/sample/view/hello.html b/inc/modules/sample/view/hello.html new file mode 100644 index 0000000..351d311 --- /dev/null +++ b/inc/modules/sample/view/hello.html @@ -0,0 +1,9 @@ +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce lacinia porta fermentum. Pellentesque lacus nulla, sagittis id mollis ut, euismod sit amet sapien. Nulla at est tellus. Suspendisse sed ligula nec sem bibendum volutpat at non neque. Nam fringilla pellentesque lacus. Morbi sit amet sem vitae nibh dignissim accumsan viverra ut lectus. Sed semper at elit id convallis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec consequat nulla a risus placerat, ac convallis ligula eleifend. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque rutrum mattis tortor, vitae efficitur lacus porta egestas. In gravida massa et iaculis congue.

    + +

    Morbi elementum suscipit neque, nec ultrices tellus dignissim ac. Vestibulum fermentum nisi ac tempus pulvinar. Donec at luctus tortor, eu mattis orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Proin faucibus dapibus consequat. Vestibulum vulputate varius metus, non consequat neque commodo vel. Morbi et velit nibh. In magna mi, auctor non metus sed, venenatis dignissim lorem. Duis quis sollicitudin ipsum. Curabitur euismod vitae est sit amet tristique. Cras tincidunt lobortis elit a fermentum. Vivamus luctus rhoncus turpis, dapibus tempor dui tristique quis. Nam sit amet purus ac tellus finibus dignissim eu in urna. Nulla fringilla justo sed efficitur suscipit.

    + +

    In hac habitasse platea dictumst. Donec lorem eros, vehicula ut condimentum non, consequat a nisl. Aliquam nunc turpis, tristique nec eros eget, sagittis aliquam turpis. Etiam rhoncus pharetra odio id euismod. Aliquam aliquet, quam et venenatis scelerisque, elit massa auctor massa, at iaculis lorem arcu at purus. Proin justo mi, lobortis ac vestibulum in, vestibulum quis mi. Sed dui lectus, pretium vitae tortor sed, luctus sagittis eros. Quisque tellus nisl, posuere at sem id, placerat porta risus. Quisque convallis ante tempor massa luctus pellentesque. Nunc mattis feugiat dolor, sed bibendum ante mattis eu. Quisque euismod pharetra dolor. Mauris aliquet imperdiet sollicitudin. Etiam maximus rhoncus sapien, nec euismod velit aliquet non. Vivamus non neque molestie, faucibus neque ac, eleifend libero. Cras aliquet bibendum enim, ac eleifend elit egestas a.

    + +

    Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla rutrum sapien nec arcu tempus, consectetur imperdiet ex commodo. Nulla pretium, tortor non suscipit vulputate, augue neque consectetur tortor, in rutrum lectus nisi nec eros. Praesent cursus, urna ac dictum fringilla, est dui efficitur odio, vitae porttitor velit ante ut tellus. Sed pharetra dolor eget gravida porttitor. Nullam tempor sapien leo, a ornare dui malesuada at. Donec at ante quis velit sollicitudin scelerisque.

    + +

    Nam a turpis vitae justo ullamcorper accumsan sit amet ac sapien. Donec sem dui, congue eu egestas et, consequat nec massa. Phasellus tristique fringilla orci vitae facilisis. Aenean condimentum, massa sed pretium lobortis, sem nulla finibus ipsum, vestibulum imperdiet diam magna vitae elit. Nullam id nulla lacinia, interdum metus id, bibendum diam. Nunc ullamcorper, elit eu scelerisque mollis, nisl sem auctor massa, at interdum nunc eros eget urna. Etiam augue arcu, laoreet quis tincidunt in, pulvinar ac odio. In placerat, mi ut feugiat tempor, velit odio efficitur neque, id cursus ligula leo nec libero. Quisque tincidunt ut lacus vitae mollis. Nam lectus libero, dapibus vitae turpis ut, sodales vulputate enim. Etiam luctus molestie enim, ut auctor mauris ultrices id. Cras eget aliquet elit, at lobortis eros. Nulla sit amet dictum metus, et dignissim metus. Donec a pellentesque risus, eget consequat purus. Curabitur purus quam, egestas sed felis eu, vehicula rhoncus eros.

    \ No newline at end of file diff --git a/inc/modules/searchbox/Info.php b/inc/modules/searchbox/Info.php new file mode 100644 index 0000000..c5ea9f4 --- /dev/null +++ b/inc/modules/searchbox/Info.php @@ -0,0 +1,28 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + + return [ + 'name' => 'SearchBox', + 'description' => $core->lang['searchbox']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.0', + 'compatibility' => '1.3.*', + 'icon' => 'search', + + 'install' => function() use($core) + { + + }, + 'uninstall' => function() use($core) + { + + } + ]; \ No newline at end of file diff --git a/inc/modules/searchbox/ReadMe.md b/inc/modules/searchbox/ReadMe.md new file mode 100644 index 0000000..deef9d7 --- /dev/null +++ b/inc/modules/searchbox/ReadMe.md @@ -0,0 +1,2 @@ +Use the `{$searchBox}` tag to display search form. +By default, module uses the `index.html` template to display search results. If you want to change this, create a `search.html` template inside your theme. \ No newline at end of file diff --git a/inc/modules/searchbox/Site.php b/inc/modules/searchbox/Site.php new file mode 100644 index 0000000..c619238 --- /dev/null +++ b/inc/modules/searchbox/Site.php @@ -0,0 +1,118 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + + namespace Inc\Modules\SearchBox; + + use Inc\Core\SiteModule; + + class Site extends SiteModule + { + + public function init() + { + if(isset($_GET['search'])) + redirect(url('search/'.urlencode(strip_tags($_GET['search'])))); + + $this->tpl->set('searchBox', $this->_insertSearchBox()); + } + + + public function routes() + { + $this->route('search/(:any)', 'getSearch'); + $this->route('search/(:any)/(:int)', 'getSearch'); + } + + public function getSearch($phrase, $index = 1) + { + $phrase = urldecode($phrase); + $searchTemplate = 'search.html'; + $phraseMinLength = 3; + + $page = [ + 'title' => $this->tpl->noParse(sprintf($this->lang('results_for'), $phrase)), + 'desc' => $this->settings('settings.description') + ]; + + // if $searchTemplate exists, use it instead of "index.html" + if(file_exists(THEMES.'/'.$this->settings('settings.theme').'/'.$searchTemplate)) + $this->setTemplate($searchTemplate); + else + $this->setTemplate('index.html'); + + // check if $phrase is long as value of $phraseMinLength + if(strlen($phrase) < $phraseMinLength) + $page['content'] = sprintf($this->lang('too_short_phrase'), $phraseMinLength); + else + { + // select pages + $pages = $this->db()->pdo()->prepare("SELECT * FROM pages WHERE lang = ? AND (title LIKE ? OR content LIKE ?)"); + $pages->execute([$this->_currentLanguage(), '%'.$phrase.'%', '%'.$phrase.'%']); + $pagesArray = $pages->fetchAll(); + + // add URL key to pages array + foreach($pagesArray as &$item) + { + $item['url'] = url($item['slug']); + } + + // select blog entries + $blog = $this->db()->pdo()->prepare("SELECT * FROM blog WHERE lang = ? AND status = ? AND (title LIKE ? OR content LIKE ?)"); + $blog->execute([$this->_currentLanguage(), 2, '%'.$phrase.'%', '%'.$phrase.'%']); + $blogArray = $blog->fetchAll(); + + // add URL key to blog array + foreach($blogArray as &$item) + { + $item['url'] = url('blog/post/'.$item['slug']); + } + + // merge of pages and blog entries + $rows = array_merge($pagesArray, $blogArray); + + // display results + if(!empty($rows) && (count($rows) >= $index)) + { + $pagination = new \Inc\Core\Lib\Pagination($index, count($rows), 10, url('search/'.$phrase.'/%d')); + $rows = array_chunk($rows, $pagination->getRecordsPerPage()); + $page['content'] = $this->_insertResults($rows[$pagination->offset()]) . $pagination->nav(); + } + else + $page['content'] = sprintf($this->lang('no_results'), $phrase); + } + + $this->tpl->set('page', $page); + } + + private function _insertSearchBox() + { + return $this->draw('input.html'); + } + + private function _insertResults(array $results) + { + foreach($results as &$result) + { + // remove HTML and Template tags + $result['content'] = preg_replace('/{(.*?)}/', '', strip_tags($result['content'])); + } + return $this->draw('results.html', ['results' => $results]); + } + + private function _currentLanguage() + { + if(!isset($_SESSION['lang'])) + return $this->settings('settings', 'lang_site'); + else + return $_SESSION['lang']; + } + + } \ No newline at end of file diff --git a/inc/modules/searchbox/lang/admin/en_english.ini b/inc/modules/searchbox/lang/admin/en_english.ini new file mode 100644 index 0000000..95ac792 --- /dev/null +++ b/inc/modules/searchbox/lang/admin/en_english.ini @@ -0,0 +1 @@ +module_desc = "Allows you to search for pages and blog entries that contain the phrase you entered." \ No newline at end of file diff --git a/inc/modules/searchbox/lang/admin/pl_polski.ini b/inc/modules/searchbox/lang/admin/pl_polski.ini new file mode 100644 index 0000000..fd7ae48 --- /dev/null +++ b/inc/modules/searchbox/lang/admin/pl_polski.ini @@ -0,0 +1 @@ +module_desc = "Umożliwia wyszukiwanie stron oraz wpisów na blogu zawierających wpisaną frazę." \ No newline at end of file diff --git a/inc/modules/searchbox/lang/en_english.ini b/inc/modules/searchbox/lang/en_english.ini new file mode 100644 index 0000000..648650c --- /dev/null +++ b/inc/modules/searchbox/lang/en_english.ini @@ -0,0 +1,4 @@ +placeholder = "Search for..." +results_for = "Search results for '%s'" +too_short_phrase = "The phrase you entered is too short! Please enter at least %d characters." +no_results = "No results found for '%s'." \ No newline at end of file diff --git a/inc/modules/searchbox/lang/pl_polski.ini b/inc/modules/searchbox/lang/pl_polski.ini new file mode 100644 index 0000000..63f65dd --- /dev/null +++ b/inc/modules/searchbox/lang/pl_polski.ini @@ -0,0 +1,4 @@ +placeholder = "Szukaj..." +results_for = "Wyniki wyszukiwania dla '%s'" +too_short_phrase = "Wprowadzona fraza jest zbyt krótka! Podaj minimum %d znaki." +no_results = "Nie znaleziono wyników dotyczących zapytania '%s'." \ No newline at end of file diff --git a/inc/modules/searchbox/view/input.html b/inc/modules/searchbox/view/input.html new file mode 100644 index 0000000..ce6d949 --- /dev/null +++ b/inc/modules/searchbox/view/input.html @@ -0,0 +1,8 @@ +
    +
    + + + + +
    +
    \ No newline at end of file diff --git a/inc/modules/searchbox/view/results.html b/inc/modules/searchbox/view/results.html new file mode 100644 index 0000000..af00704 --- /dev/null +++ b/inc/modules/searchbox/view/results.html @@ -0,0 +1,8 @@ +
    + {loop: $results} +
    +
    {$value.title}
    +
    {$value.content|cut:160}
    +
    + {/loop} +
    \ No newline at end of file diff --git a/inc/modules/settings/Admin.php b/inc/modules/settings/Admin.php new file mode 100644 index 0000000..c05bae8 --- /dev/null +++ b/inc/modules/settings/Admin.php @@ -0,0 +1,839 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Settings; + +use Inc\Core\AdminModule; +use Inc\Core\Lib\License; +use Inc\Core\Lib\HttpRequest; + +use ZipArchive; +use RecursiveIteratorIterator; +use RecursiveDirectoryIterator; +use FilesystemIterator; +use Inc\Modules\Settings\Inc\RecursiveDotFilterIterator; + +class Admin extends AdminModule +{ + private $assign = []; + private $feed_url = "http://feed.sruu.pl"; + + public function init() + { + if (file_exists(BASE_DIR.'/inc/engine')) { + deleteDir(BASE_DIR.'/inc/engine'); + } + } + + public function navigation() + { + return [ + $this->lang('general') => 'general', + $this->lang('theme', 'general') => 'theme', + $this->lang('translation') => 'translation', + $this->lang('updates') => 'updates', + ]; + } + + public function getGeneral() + { + $settings = $this->settings('settings'); + + // lang + if (isset($_GET['lang']) && !empty($_GET['lang'])) { + $lang = $_GET['lang']; + } else { + $lang = $settings['lang_site']; + } + + $settings['langs'] = [ + 'site' => $this->_getLanguages($settings['lang_site'], 'selected'), + 'admin' => $this->_getLanguages($settings['lang_admin'], 'selected') + ]; + $settings['themes'] = $this->_getThemes(); + $settings['pages'] = $this->_getPages($lang); + $settings['timezones'] = $this->_getTimezones(); + $settings['system'] = [ + 'php' => PHP_VERSION, + 'sqlite' => $this->db()->pdo()->query('select sqlite_version()')->fetch()[0], + 'sqlite_size' => $this->roundSize(filesize(BASE_DIR.'/inc/data/database.sdb')), + 'system_size' => $this->roundSize($this->_directorySize(BASE_DIR)), + ]; + + $settings['license'] = []; + $settings['license']['type'] = $this->_verifyLicense(); + switch ($settings['license']['type']) { + case License::FREE: + $settings['license']['name'] = $this->lang('free'); + break; + case License::COMMERCIAL: + $settings['license']['name'] = $this->lang('commercial'); + break; + default: + $settings['license']['name'] = $this->lang('invalid_license'); + } + + foreach ($this->core->getRegisteredPages() as $page) { + $settings['pages'][] = $page; + } + + if (!empty($redirectData = getRedirectData())) { + $settings = array_merge($settings, $redirectData); + } + + $this->tpl->set('settings', $this->tpl->noParse_array(htmlspecialchars_array($settings))); + $this->tpl->set('updateurl', url([ADMIN, 'settings', 'updates'])); + + return $this->draw('general.html'); + } + + public function postSaveGeneral() + { + unset($_POST['save']); + if (checkEmptyFields(array_keys($_POST), $_POST)) { + $this->notify('failure', $this->lang('empty_inputs', 'general')); + redirect(url([ADMIN, 'settings', 'general']), $_POST); + } else { + $errors = 0; + + if ($this->settings('settings', 'autodetectlang')) { + $_POST['autodetectlang'] = isset_or($_POST['autodetectlang'], 0); + } + + foreach ($_POST as $field => $value) { + if (!$this->db('settings')->where('module', 'settings')->where('field', $field)->save(['value' => $value])) { + $errors++; + } + } + + if (!$errors) { + $this->notify('success', $this->lang('save_settings_success')); + } else { + $this->notify('failure', $this->lang('save_settings_failure')); + } + + unset($_SESSION['lang']); + redirect(url([ADMIN, 'settings', 'general'])); + } + } + + public function anyLicense() + { + if (isset($_POST['license-key'])) { + $licenseKey = str_replace('-', null, $_POST['license-key']); + + if (!($licenseKey = License::getLicenseData($licenseKey))) { + $this->notify('failure', $this->lang('license_invalid_key')); + } + + $verify = License::verify($licenseKey); + if ($verify != License::COMMERCIAL) { + $this->notify('failure', $this->lang('license_invalid_key')); + } else { + $this->notify('success', $this->lang('license_good_key')); + } + } elseif (isset($_GET['downgrade'])) { + $this->db('settings')->where('module', 'settings')->where('field', 'license')->save(['value' => '']); + } + + redirect(url([ADMIN,'settings','general'])); + } + + public function anyTheme($theme = null, $file = null) + { + $this->core->addCSS(url(MODULES.'/settings/css/admin/settings.css')); + + if (empty($theme) && empty($file)) { + $this->tpl->set('settings', $this->settings('settings')); + $this->tpl->set('themes', $this->_getThemes()); + return $this->draw('themes.html'); + } else { + if ($file == 'activate') { + $this->db('settings')->where('module', 'settings')->where('field', 'theme')->save(['value' => $theme]); + $this->notify('success', $this->lang('theme_changed')); + redirect(url([ADMIN, 'settings', 'theme'])); + } + + // Source code editor + $this->core->addCSS(url('/inc/jscripts/editor/markitup.min.css')); + $this->core->addCSS(url('/inc/jscripts/editor/markitup.highlight.min.css')); + $this->core->addCSS(url('/inc/jscripts/editor/sets/html/set.min.css')); + $this->core->addJS(url('/inc/jscripts/editor/highlight.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/markitup.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/markitup.highlight.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/sets/html/set.min.js')); + + $this->assign['files'] = $this->_getThemeFiles($file, $theme); + + if ($file) { + $file = $this->assign['files'][$file]['path']; + } else { + $file = reset($this->assign['files'])['path']; + } + + $this->assign['content'] = $this->tpl->noParse(htmlspecialchars(file_get_contents($file))); + $this->assign['lang'] = pathinfo($file, PATHINFO_EXTENSION); + + if (isset($_POST['save']) && !FILE_LOCK) { + if (file_put_contents($file, htmlspecialchars_decode($_POST['content']))) { + $this->notify('success', $this->lang('save_file_success')); + } else { + $this->notify('failure', $this->lang('save_file_failure')); + } + + redirect(url([ADMIN, 'settings', 'theme', $theme, md5($file)])); + } + + $this->tpl->set('settings', $this->settings('settings')); + $this->tpl->set('theme', array_merge($this->_getThemes($theme), $this->assign)); + return $this->draw('theme.html'); + } + } + + public function getTranslation() + { + if (isset($_GET['export'])) { + $export = $_GET['export']; + if (file_exists(BASE_DIR.'/inc/lang/'.$export)) { + $file = tempnam("tmp", "zip"); + $zip = new ZipArchive(); + $zip->open($file, ZipArchive::OVERWRITE); + + foreach (glob(BASE_DIR.'/inc/lang/'.$export.'/admin/*.ini') as $f) { + $zip->addFile($f, str_replace(BASE_DIR, null, $f)); + } + + foreach (glob(MODULES.'/*/lang/'.$export.'.ini') as $f) { + $zip->addFile($f, str_replace(BASE_DIR, null, $f)); + } + + foreach (glob(MODULES.'/*/lang/admin/'.$export.'.ini') as $f) { + $zip->addFile($f, str_replace(BASE_DIR, null, $f)); + } + + // Close and send to users + $zip->close(); + header('Content-Type: application/zip'); + header('Content-Length: ' . filesize($file)); + header('Content-Disposition: attachment; filename="Batflat_'.str_replace('.', '-', $this->settings('settings', 'version')).'_'.$export.'.zip"'); + readfile($file); + unlink($file); + exit(); + } + } + + if (!isset($_GET['lang'])) { + $_GET['lang'] = $this->settings('settings', 'lang_site'); + } + + if (!isset($_GET['source'])) { + $_GET['source'] = 0; + } + + $settings['langs'] = $this->_getLanguages($_GET['lang']); + $settings['selected'] = $_GET['lang']; + + $translations = $this->_getAllTranslations($_GET['lang']); + $translation = $translations[$_GET['source']]; + $translations = array_keys($translations); + + $this->tpl->set('translation', $translation); + $this->tpl->set('translations', $translations); + $this->tpl->set('module', $_GET['source']); + $this->tpl->set('settings', $settings); + + //unset($translations, $settings); + + return $this->draw('translation.html'); + } + + public function postTranslation() + { + if (!isset($_GET['lang'])) { + $_GET['lang'] = $this->settings('settings', 'lang_site'); + } + + if (!isset($_GET['source'])) { + $_GET['source'] = 0; + } + + if (isset($_POST['upload']) && FILE_LOCK === false) { + $zip = new ZipArchive(); + $error = false; + $file = !empty($_FILES['lang_package']['tmp_name']) ? $_FILES['lang_package']['tmp_name'] : '/'; + $open = $zip->open($file); + if ($open === true) { + for ($i = 0; $i < $zip->numFiles; $i++) { + $filename = pathinfo($zip->getNameIndex($i)); + + if (strpos($filename['dirname'].'/', '/lang/') === false) { + $error = true; + break; + } + + if ($filename['extension'] != 'ini') { + $error = true; + break; + } + } + + if (!$error) { + $zip->extractTo(BASE_DIR); + $zip->close(); + $this->notify('success', $this->lang('lang_import_success')); + } else { + $this->notify('failure', $this->lang('lang_import_error')); + } + } + } + + if (isset($_POST['new_language']) && FILE_LOCK === false) { + $lang = $_POST['language_name']; + if (preg_match("/^[a-z]{2}_[a-z]+$/", $lang)) { + if (file_exists(BASE_DIR.'/inc/lang/'.$lang)) { + $this->notify('failure', $this->lang('new_lang_exists')); + } else { + if (mkdir(BASE_DIR.'/inc/lang/'.$lang.'/admin', 0755, true)) { + $this->notify('success', $this->lang('new_lang_success')); + redirect(url([ADMIN, 'settings', 'translation?lang='.$lang])); + } else { + $this->notify('success', $this->lang('new_lang_create_fail')); + } + } + } else { + $this->notify('failure', $this->lang('new_lang_failure')); + } + } + if (isset($_POST['save'], $_POST[$_GET['source']]) && FILE_LOCK === false) { + $toSave = $_POST[$_GET['source']]; + if (is_numeric($_GET['source'])) { + $pad = 0; + array_walk($toSave['admin'], function ($value, $key) use (&$pad) { + $length = strlen($key); + if ($pad < $length) { + $pad = $length; + } + }); + + $pad = $pad + 4 - $pad%4; + + $output = []; + foreach ($toSave['admin'] as $key => $value) { + $value = preg_replace("/(?notify('success', $this->lang('save_file_success')); + } else { + $this->notify('failure', $this->lang('save_file_failure')); + } + } else { + if (isset($toSave['front'])) { + $pad = 0; + array_walk($toSave['front'], function ($value, $key) use (&$pad) { + $length = strlen($key); + if ($pad < $length) { + $pad = $length; + } + }); + + $pad = $pad + 4 - $pad%4; + + $output = []; + foreach ($toSave['front'] as $key => $value) { + $value = preg_replace("/(?notify('success', $this->lang('save_file_success')); + } else { + $this->notify('failure', $this->lang('save_file_failure')); + } + } + + if (isset($toSave['admin'])) { + $pad = 0; + array_walk($toSave['admin'], function ($value, $key) use (&$pad) { + $length = strlen($key); + if ($pad < $length) { + $pad = $length; + } + }); + + $pad = $pad + 4 - $pad%4; + + $output = []; + foreach ($toSave['admin'] as $key => $value) { + $value = preg_replace("/(?notify('success', $this->lang('save_file_success')); + } else { + $this->notify('failure', $this->lang('save_file_failure')); + } + } + } + } + + redirect(url([ADMIN, 'settings', 'translation?lang='.$_GET['lang']])); + } + + public function anyUpdates() + { + $this->tpl->set('allow_curl', intval(function_exists('curl_init'))); + $settings = $this->settings('settings'); + + if (isset($_POST['check'])) { + $request = $this->updateRequest('/batflat/update', [ + 'ip' => isset_or($_SERVER['SERVER_ADDR'], $_SERVER['SERVER_NAME']), + 'version' => $settings['version'], + 'domain' => url(), + ]); + + $this->_updateSettings('update_check', time()); + + if (!is_array($request)) { + $this->tpl->set('error', $request); + } elseif ($request['status'] == 'error') { + $this->tpl->set('error', $request['message']); + } else { + $this->_updateSettings('update_version', $request['data']['version']); + $this->_updateSettings('update_changelog', $request['data']['changelog']); + $this->tpl->set('update_version', $request['data']['version']); + + // if(DEV_MODE) + // $this->tpl->set('request', $request); + } + } elseif (isset($_POST['update'])) { + if (!class_exists("ZipArchive")) { + $this->tpl->set('error', "ZipArchive is required to update Batflat."); + } + + if (!isset($_GET['manual'])) { + $request = $this->updateRequest('/batflat/update', [ + 'ip' => isset_or($_SERVER['SERVER_ADDR'], $_SERVER['SERVER_NAME']), + 'version' => $settings['version'], + 'domain' => url(), + ]); + + $this->download($request['data']['download'], BASE_DIR.'/tmp/latest.zip'); + } else { + $package = glob(BASE_DIR.'/batflat-*.zip'); + if (!empty($package)) { + $package = array_shift($package); + $this->rcopy($package, BASE_DIR.'/tmp/latest.zip'); + } + } + + define("UPGRADABLE", true); + // Making backup + $backup_date = date('YmdHis'); + $this->rcopy(BASE_DIR, BASE_DIR.'/backup/'.$backup_date.'/', 0755, [BASE_DIR.'/backup', BASE_DIR.'/tmp/latest.zip', (isset($package) ? BASE_DIR.'/'.basename($package) : '')]); + + // Unzip latest update + $zip = new ZipArchive; + $zip->open(BASE_DIR.'/tmp/latest.zip'); + $zip->extractTo(BASE_DIR.'/tmp/update'); + + // Copy files + $this->rcopy(BASE_DIR.'/tmp/update/inc/css', BASE_DIR.'/inc/css'); + $this->rcopy(BASE_DIR.'/tmp/update/inc/core', BASE_DIR.'/inc/core'); + $this->rcopy(BASE_DIR.'/tmp/update/inc/jscripts', BASE_DIR.'/inc/jscripts'); + $this->rcopy(BASE_DIR.'/tmp/update/inc/lang', BASE_DIR.'/inc/lang'); + $this->rcopy(BASE_DIR.'/tmp/update/inc/modules', BASE_DIR.'/inc/modules'); + + // Restore defines + $this->rcopy(BASE_DIR.'/backup/'.$backup_date.'/inc/core/defines.php', BASE_DIR.'/inc/core/defines.php'); + + // Run upgrade script + $version = $settings['version']; + $new_version = include(BASE_DIR.'/tmp/update/upgrade.php'); + + // Close archive and delete all unnecessary files + $zip->close(); + unlink(BASE_DIR.'/tmp/latest.zip'); + deleteDir(BASE_DIR.'/tmp/update'); + + $this->_updateSettings('version', $new_version); + $this->_updateSettings('update_version', 0); + $this->_updateSettings('update_changelog', ''); + $this->_updateSettings('update_check', time()); + + sleep(2); + redirect(url([ADMIN, 'settings', 'updates'])); + } elseif (isset($_GET['reset'])) { + $this->_updateSettings('update_version', 0); + $this->_updateSettings('update_changelog', ''); + $this->_updateSettings('update_check', 0); + } elseif (isset($_GET['manual'])) { + $package = glob(BASE_DIR.'/batflat-*.zip'); + $version = false; + if (!empty($package)) { + $package_path = array_shift($package); + preg_match('/batflat\-([0-9\.a-z]+)\.zip$/', $package_path, $matches); + $version = $matches[1]; + } + + $manual_mode = ['version' => $version]; + } + + $this->settings->reload(); + $settings = $this->settings('settings'); + $this->tpl->set('settings', $settings); + $this->tpl->set('manual_mode', isset_or($manual_mode, false)); + return $this->draw('update.html'); + } + + public function postChangeOrderOfNavItem() + { + foreach ($_POST as $module => $order) { + $this->db('modules')->where('dir', $module)->save(['sequence' => $order]); + } + exit(); + } + + public function _checkUpdate() + { + $settings = $this->settings('settings'); + if (time() - $settings['update_check'] > 3600*6) { + $request = $this->updateRequest('/batflat/update', [ + 'ip' => isset_or($_SERVER['SERVER_ADDR'], $_SERVER['SERVER_NAME']), + 'version' => $settings['version'], + 'domain' => url(), + ]); + + if (is_array($request) && $request['status'] != 'error') { + $settings['update_version'] = $request['data']['version']; + $this->_updateSettings('update_version', $request['data']['version']); + $this->_updateSettings('update_changelog', $request['data']['changelog']); + } + + $this->_updateSettings('update_check', time()); + } + + if (cmpver($settings['update_version'], $settings['version']) === 1) { + return true; + } + + return false; + } + + private function updateRequest($resource, $params = []) + { + $output = HttpRequest::post($this->feed_url.$resource, $params); + if ($output === false) { + $output = HttpRequest::getStatus(); + } else { + $output = json_decode($output, true); + } + + return $output; + } + + private function download($source, $dest) + { + set_time_limit(0); + $fp = fopen($dest, 'w+'); + $ch = curl_init($source); + curl_setopt($ch, CURLOPT_TIMEOUT, 50); + curl_setopt($ch, CURLOPT_FILE, $fp); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_exec($ch); + curl_close($ch); + fclose($fp); + } + + /** + * list of themes + * @return array + */ + private function _getThemes($theme = null) + { + $themes = glob(THEMES.'/*', GLOB_ONLYDIR); + $return = []; + foreach ($themes as $e) { + if ($e != THEMES.'/admin') { + $manifest = array_fill_keys(['name', 'version', 'author', 'email', 'thumb'], 'Unknown'); + $manifest['name'] = basename($e); + $manifest['thumb'] = '../admin/img/unknown_theme.png'; + + if (file_exists($e.'/manifest.json')) { + $manifest = array_merge($manifest, json_decode(file_get_contents($e.'/manifest.json'), true)); + } + + if ($theme == basename($e)) { + return array_merge($manifest, ['dir' => basename($e)]); + } + + $return[] = array_merge($manifest, ['dir' => basename($e)]); + } + } + + return $return; + } + + /** + * list of pages + * @param string $lang + * @param integer $selected + * @return array + */ + private function _getPages($lang) + { + $rows = $this->db('pages')->where('lang', $lang)->toArray(); + if (count($rows)) { + foreach ($rows as $row) { + $result[] = ['id' => $row['id'], 'title' => $row['title'], 'slug' => $row['slug']]; + } + } + return $result; + } + + /** + * list of theme files (html, css & js) + * @param string $selected + * @return array + */ + private function _getThemeFiles($selected = null, $theme = null) + { + $theme = ($theme ? $theme : $this->settings('settings', 'theme')); + $files = $this->rglob(THEMES.'/'.$theme.'/*.html'); + $files = array_merge($files, $this->rglob(THEMES.'/'.$theme.'/*.css')); + $files = array_merge($files, $this->rglob(THEMES.'/'.$theme.'/*.js')); + + $result = []; + foreach ($files as $file) { + if ($selected && ($selected == md5($file))) { + $attr = 'selected'; + } else { + $attr = null; + } + + $result[md5($file)] = ['name' => basename($file), 'path' => $file, 'short' => str_replace(BASE_DIR, null, $file), 'attr' => $attr]; + } + + return $result; + } + + private function _updateSettings($field, $value) + { + return $this->settings('settings', $field, $value); + } + + private function rcopy($source, $dest, $permissions = 0755, $expect = []) + { + foreach ($expect as $e) { + if ($e == $source) { + return; + } + } + + if (is_link($source)) { + return symlink(readlink($source), $dest); + } + + if (is_file($source)) { + if (!is_dir(dirname($dest))) { + mkdir(dirname($dest), 0777, true); + } + + return copy($source, $dest); + } + + if (!is_dir($dest)) { + mkdir($dest, $permissions, true); + } + + $dir = dir($source); + while (false !== $entry = $dir->read()) { + if ($entry == '.' || $entry == '..') { + continue; + } + + $this->rcopy("$source/$entry", "$dest/$entry", $permissions, $expect); + } + + $dir->close(); + return true; + } + + private function _verifyLicense() + { + $licenseArray = (array) json_decode(base64_decode($this->settings('settings', 'license')), true); + $license = array_replace(array_fill(0, 5, null), $licenseArray); + list($md5hash, $pid, $lcode, $dcode, $tstamp) = $license; + + if (empty($md5hash)) { + return License::FREE; + } + + if ($md5hash == md5($pid.$lcode.$dcode.domain(false))) { + return License::COMMERCIAL; + } + + return License::ERROR; + } + + private function _getTimezones() + { + $regions = array( + \DateTimeZone::AFRICA, + \DateTimeZone::AMERICA, + \DateTimeZone::ANTARCTICA, + \DateTimeZone::ASIA, + \DateTimeZone::ATLANTIC, + \DateTimeZone::AUSTRALIA, + \DateTimeZone::EUROPE, + \DateTimeZone::INDIAN, + \DateTimeZone::PACIFIC, + \DateTimeZone::UTC, + ); + + $timezones = array(); + foreach ($regions as $region) { + $timezones = array_merge($timezones, \DateTimeZone::listIdentifiers($region)); + } + + $timezone_offsets = array(); + foreach ($timezones as $timezone) { + $tz = new \DateTimeZone($timezone); + $timezone_offsets[$timezone] = $tz->getOffset(new \DateTime); + } + + // sort timezone by offset + asort($timezone_offsets); + + $timezone_list = array(); + foreach ($timezone_offsets as $timezone => $offset) { + $offset_prefix = $offset < 0 ? '-' : '+'; + $offset_formatted = gmdate('H:i', abs($offset)); + + $pretty_offset = "UTC${offset_prefix}${offset_formatted}"; + + $timezone_list[$timezone] = "(${pretty_offset}) $timezone"; + } + + return $timezone_list; + } + + private function _getAllTranslations($lang) + { + $modules = []; + + $general = parse_ini_file('../inc/lang/en_english/admin/general.ini'); + + if (file_exists('../inc/lang/'.$lang.'/admin/general.ini')) { + $current = parse_ini_file('../inc/lang/'.$lang.'/admin/general.ini'); + } else { + $current = []; + } + + foreach ($general as $key => $value) { + $modules[0]['admin'][] = [ + 'key' => $key, + 'value' => isset_or($current[$key], null), + 'english' => $value + ]; + } + + $dirs = glob(MODULES.'/*'); + foreach ($dirs as $dir) { + $modules[basename($dir)] = []; + if (file_exists($dir.'/lang/en_english.ini')) { + $tmp = parse_ini_file($dir.'/lang/en_english.ini'); + + if (file_exists($dir.'/lang/'.$lang.'.ini')) { + $current = parse_ini_file($dir.'/lang/'.$lang.'.ini'); + } else { + $current = []; + } + + foreach ($tmp as $key => $value) { + $modules[basename($dir)]['front'][] = [ + 'key' => $key, + 'value' => isset_or($current[$key], null), + 'english' => $value + ]; + } + } + + if (file_exists($dir.'/lang/admin/en_english.ini')) { + $tmp = parse_ini_file($dir.'/lang/admin/en_english.ini'); + + if (file_exists($dir.'/lang/admin/'.$lang.'.ini')) { + $current = parse_ini_file($dir.'/lang/admin/'.$lang.'.ini'); + } else { + $current = []; + } + + foreach ($tmp as $key => $value) { + $modules[basename($dir)]['admin'][] = [ + 'key' => $key, + 'value' => isset_or($current[$key], null), + 'english' => $value + ]; + } + } + } + + return $modules; + } + + private function rglob($pattern, $flags = 0) + { + $files = glob($pattern, $flags); + foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) { + $files = array_merge($files, $this->rglob($dir.'/'.basename($pattern), $flags)); + } + return $files; + } + + private function _directorySize($path) + { + $bytestotal = 0; + $path = realpath($path); + if ($path!==false) { + foreach (new RecursiveIteratorIterator(new RecursiveDotFilterIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS))) as $object) { + try { + $bytestotal += $object->getSize(); + } catch (\Exception $e) { + } + } + } + + return $bytestotal; + } + + private function roundSize($bytes) + { + if ($bytes/1024 < 1) { + return $bytes.' B'; + } + if ($bytes/1024/1024 < 1) { + return round($bytes/1024).' KB'; + } + if ($bytes/1024/1024/1024 < 1) { + return round($bytes/1024/1024, 2).' MB'; + } else { + return round($bytes/1024/1024/1024, 2).' GB'; + } + } +} diff --git a/inc/modules/settings/Info.php b/inc/modules/settings/Info.php new file mode 100644 index 0000000..0aa90d7 --- /dev/null +++ b/inc/modules/settings/Info.php @@ -0,0 +1,47 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['settings']['module_name'], + 'description' => $core->lang['settings']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.2', + 'compatibility' => '1.3.*', + 'icon' => 'wrench', + + 'install' => function () use ($core) { + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `settings` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `module` text NOT NULL, + `field` text NOT NULL, + `value` text + )"); + + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'title', 'Batflat')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'description', 'Gotham’s time has come.')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'keywords', 'key, words')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'footer', 'Copyright {?=date(\"Y\")?} © by Company Name. All rights reserved.')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'homepage', 'blog')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'timezone', '".date_default_timezone_get()."')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'theme', 'batblog')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'editor', 'wysiwyg')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'lang_site', 'en_english')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'lang_admin', 'en_english')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'version', '1.3.4')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'update_check', '0')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'update_changelog', '')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'update_version', '0')"); + $core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'license', '')"); + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DROP TABLE `settings`"); + } +]; diff --git a/inc/modules/settings/ReadMe.md b/inc/modules/settings/ReadMe.md new file mode 100644 index 0000000..6a5f99f --- /dev/null +++ b/inc/modules/settings/ReadMe.md @@ -0,0 +1,5 @@ +You can display settings data by using construction below: + +``` +{$settings.field-name} +``` \ No newline at end of file diff --git a/inc/modules/settings/Site.php b/inc/modules/settings/Site.php new file mode 100644 index 0000000..32f5761 --- /dev/null +++ b/inc/modules/settings/Site.php @@ -0,0 +1,30 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Settings; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + public function init() + { + $this->_importSettings(); + } + + private function _importSettings() + { + $tmp = $this->core->settings->all(); + $tmp = array_merge($tmp, $tmp['settings']); + unset($tmp['settings']); + $this->tpl->set('settings', $tmp); + } +} diff --git a/inc/modules/settings/css/admin/settings.css b/inc/modules/settings/css/admin/settings.css new file mode 100644 index 0000000..a75513e --- /dev/null +++ b/inc/modules/settings/css/admin/settings.css @@ -0,0 +1,14 @@ +.theme-preview { + position: relative; + display: block; + overflow: hidden; + padding-bottom: 75%; +} + .theme-preview img { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: auto; + } \ No newline at end of file diff --git a/inc/modules/settings/inc/RecursiveDotFilterIterator.php b/inc/modules/settings/inc/RecursiveDotFilterIterator.php new file mode 100644 index 0000000..d5f4986 --- /dev/null +++ b/inc/modules/settings/inc/RecursiveDotFilterIterator.php @@ -0,0 +1,10 @@ +current()->getFilename(), 0, 1); + } +} diff --git a/inc/modules/settings/lang/admin/en_english.ini b/inc/modules/settings/lang/admin/en_english.ini new file mode 100644 index 0000000..2a0c5eb --- /dev/null +++ b/inc/modules/settings/lang/admin/en_english.ini @@ -0,0 +1,71 @@ +module_name = "Settings" +module_desc = "Basic settings of Batflat." + +general = "General" +translation = "Translation" +system_info = "System informations" +php_version = "PHP version" +sqlite_version = "SQLite version" +system_size = "Batflat size" +sqlite_size = "Database size" +other = "Other" +updates = "Updates" +title = "Website title" +description = "Description" +keywords = "Keywords" +homepage = "Homepage" +site_lang = "Website language" +admin_lang = "Admin language" +footer = "Footer" +editor = "Editor" +timezone = "Timezone" + +version = "Version" +license = "License" +check_updates = "Check updates" +update_fopen_error = "Unable to update system with current server configuration." +update_curl_error = "Unable to update system with current server configuration." + +author = "Author" +active = "Active" +activate = "Activate" +theme_changed = "Default template was changed." + +update_info = "Thanks to Batflat updates system is always safe and up-to-date!" +update_available = "New version is available" +update_button = "Update" +update_check = "Check update" +up_to_date = "Great! Batflat is up-to-date :)" +update_newer_version = "It's weird but... you have newer version than we do :D" + +save_settings_success = "Settings successfully saved." +save_settings_failure = "Failed to save settings." +save_file_success = "File successfully saved." +save_file_failure = "Unable to save file." + +file_lock = "File editing is disabled. You cannot edit files through admin panel." + +notranslation = "No translation" +new_lang = "New language" +new_lang_failure = "Language name is incorrect. It should match pattern: en_english." +new_lang_exists = "Language already exists." +new_lang_success = "Language successfully created." +new_lang_create_fail = "Unable to create language." +lang_export = "Export language" +lang_import = "Import language" +lang_import_success = "Successfully uploaded language." +lang_import_error = "Package contains one or more illegal files." +lang_upload = "Choose ZIP file containing language pack." + +license_key = "License key" +license_invalid_key = "Invalid license key." +license_good_key = "License key has been successfully accepted." +confirm_downgrade = "Are you sure you want downgrade Batflat to Free license?" +downgrade = "Downgrade to Free" +upgrade = "Upgrade to Commercial" +free = "Free" +commercial = "Commercial" +invalid_license = "Invalid license" + +get_commercial = "If you want to create a website for your client, choose a commercial license." +activate_info = "To activate the commercial version of the system, enter the license code. You will find it in the email confirming the purchase of the Batflat license." \ No newline at end of file diff --git a/inc/modules/settings/lang/admin/pl_polski.ini b/inc/modules/settings/lang/admin/pl_polski.ini new file mode 100644 index 0000000..6a5035d --- /dev/null +++ b/inc/modules/settings/lang/admin/pl_polski.ini @@ -0,0 +1,71 @@ +module_name = "Ustawienia" +module_desc = "Podstawowe ustawienia Batflata." + +general = "Ogólne" +translation = "Tłumaczenie" +system_info = "Informacje o systemie" +php_version = "Wersja PHP" +sqlite_version = "Wersja SQLite" +system_size = "Rozmiar strony" +sqlite_size = "Rozmiar bazy danych" +other = "Pozostałe" +updates = "Aktualizacje" +title = "Tytuł strony" +description = "Opis" +keywords = "Słowa kluczowe" +homepage = "Strona startowa" +site_lang = "Język strony" +admin_lang = "Język administracji" +footer = "Stopka" +editor = "Edytor" +timezone = "Strefa czasowa" + +version = "Wersja" +license = "Licencja" +check_updates = "Sprawdź aktualizacje" +update_fopen_error = "Nie można zaktualizować systemu, ponieważ konfiguracja serwera na to nie pozwala." +update_curl_error = "Nie można zaktualizować systemu, ponieważ konfiguracja serwera na to nie pozwala." + +author = "Autor" +active = "Aktywny" +activate = "Aktywuj" +theme_changed = "Domyślny szablon został zmieniony." + +update_info = "Dzięki aktualizacjom Batflat jest bezpieczny i aktualny. Pamiętaj aby regularnie je sprawdzać!" +update_available = "Dostępna jest nowa wersja systemu" +update_button = "Aktualizuj" +update_check = "Sprawdź aktualizacje" +up_to_date = "Super! Batflat jest aktualny :)" +update_newer_version = "To bardzo dziwne... bo masz nowszą wersję niż my :D" + +save_settings_success = "Pomyślnie zapisano ustawienia." +save_settings_failure = "Nie udało się zapisać wszystkich ustawień." +save_file_success = "Pomyślnie zaktualizowano plik." +save_file_failure = "Nie udało się zaktualizować pliku." + +file_lock = "Edytowanie zostało wyłączone. Nie można wprowadzać zmian w plikach poprzez panel administracyjny." + +notranslation = "Brak tłumaczenia" +new_lang = "Nowy język" +new_lang_failure = "Nazwa języka jest niepoprawna. Nazewnictwo powinno pasować do wzoru: en_english." +new_lang_exists = "Wybrany język już isteniej." +new_lang_success = "Język został pomyślnie utworzony." +new_lang_create_fail = "Nie można utworzyć nowego języka." +lang_export = "Exportuj język" +lang_import = "Importuj język" +lang_import_success = "Pomyślnie wgrano język." +lang_import_error = "Paczka zawiera jeden lub więcej niedozwolonych plików." +lang_upload = "Wybierz z dysku plik ZIP zawierający pliki językowe." + +license_key = "Klucz licencyjny" +license_invalid_key = "Niepoprawny klucz licencyjny" +license_good_key = "Wersja komercyjna została pomyślnie aktywowana." +confirm_downgrade = "Czy na pewno chcesz wrócić do wersji darmowej?" +downgrade = "Przejdź do wersji darmowej" +upgrade = "Zaktualizuj do wersji komercyjnej" +free = "Darmowa" +commercial = "Komercyjna" +invalid_license = "Niepoprawna licencja" + +get_commercial = "Jeżeli chcesz stworzyć stronę internetową dla swojego klienta, wybierz licencję do użytku komercyjnego." +activate_info = "Aby aktywować wersję komercyjną należy podać klucz licencyjny. Znajdziesz go we wiadomości e-mail potwierdzającej zakup licencji." \ No newline at end of file diff --git a/inc/modules/settings/view/admin/general.html b/inc/modules/settings/view/admin/general.html new file mode 100644 index 0000000..126d224 --- /dev/null +++ b/inc/modules/settings/view/admin/general.html @@ -0,0 +1,170 @@ +
    +
    +
    +
    +
    +

    {$lang.settings.general}

    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    +

    {$lang.settings.other}

    +
    +
    +
    + + + {if: isset($settings.autodetectlang)} + + {/if} +
    +
    + + +
    +
    + + +
    +
    + +
    + + +
    +
    + +
    +
    +
    + + + +
    +
    +
    +

    {$lang.settings.license}

    +
    +
    +
    + {if: $settings.license.type == \Inc\Core\Lib\License::ERROR} + + + + + {else} + + + + + {/if} +

    +

    + {$settings.license.name} +

    + {?=domain()?} +

    + {if: $settings.license.type == \Inc\Core\Lib\License::FREE} + {$lang.settings.upgrade} + {else} + {$lang.settings.downgrade} + {/if} +
    +
    +
    +
    +
    +

    {$lang.settings.system_info}

    +
    +
    +
    +
    {$lang.settings.version}
    +
    {$settings.version} ({$lang.settings.check_updates})
    +
    {$lang.settings.license}
    +
    + {$settings.license.name} + ({$lang.general.edit}) +
    +
    +
    +
    +
    {$lang.settings.php_version}
    +
    {$settings.system.php}
    +
    {$lang.settings.sqlite_version}
    +
    {$settings.system.sqlite}
    +
    +
    +
    +
    {$lang.settings.system_size}
    +
    {$settings.system.system_size}
    +
    {$lang.settings.sqlite_size}
    +
    {$settings.system.sqlite_size}
    +
    +
    +
    +
    +
    +
    + \ No newline at end of file diff --git a/inc/modules/settings/view/admin/theme.html b/inc/modules/settings/view/admin/theme.html new file mode 100644 index 0000000..9482584 --- /dev/null +++ b/inc/modules/settings/view/admin/theme.html @@ -0,0 +1,61 @@ +
    +
    +
    +
    +

    {$theme.name}

    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +

    {$lang.general.edit}

    +
    +
    + {if: FILE_LOCK} +
    {$lang.settings.file_lock}FILE_LOCK
    + {/if} +
    +
    + + +
    +
    + +
    +
    + + +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/settings/view/admin/themes.html b/inc/modules/settings/view/admin/themes.html new file mode 100644 index 0000000..1db40ef --- /dev/null +++ b/inc/modules/settings/view/admin/themes.html @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/inc/modules/settings/view/admin/translation.html b/inc/modules/settings/view/admin/translation.html new file mode 100644 index 0000000..e9dbd21 --- /dev/null +++ b/inc/modules/settings/view/admin/translation.html @@ -0,0 +1,107 @@ +{if: FILE_LOCK} +
    {$lang.settings.file_lock}FILE_LOCK
    +{/if} +
    +
    +
    +
    +

    {$lang.settings.translation}

    + +
    +
    +
    + + + +
    +
    +
    + + + {loop: $translation as $type => $row} + + + + {loop: $row} + + + + + {/loop} + {/loop} + +
    +

    {?= (is_numeric($module) ? 'General' : ucfirst($module)) ?} {?=($type == 'admin') ? 'Admin' : 'Front' ?}

    +
    {$value.key} +
    {$value.english|e}
    + +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +

    {$lang.settings.new_lang}

    +
    +
    +
    +
    + + +
    + +
    +
    +
    + +
    +
    +

    {$lang.settings.lang_import}

    +
    +
    +
    +
    + {$lang.settings.lang_upload} + info +
    +
    + + +
    + +
    +
    +
    + +
    +
    +

    {$lang.settings.lang_export}

    +
    +
    + + {loop: $settings.langs} + + + + + {/loop} +
    {$value.name} + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/settings/view/admin/update.html b/inc/modules/settings/view/admin/update.html new file mode 100644 index 0000000..2d416ff --- /dev/null +++ b/inc/modules/settings/view/admin/update.html @@ -0,0 +1,65 @@ +
    +
    +
    +
    {$lang.settings.updates}
    +
    + {if: $allow_curl==0} +
    + {$lang.settings.update_curl_error} (curl does not exist) + Check Error +
    + {/if} + {if: isset($error)} +
    + {$error} + System Error +
    + {/if} + {if: isset($request)} +
    + {?=print_r($request,true)?} + Debug +
    + {/if} +

    {$lang.settings.update_info}

    +

    {$lang.settings.version}: {$settings.version}

    + {if: $manual_mode} +
    + Manual mode enabled. Pleasy copy latest version of batflat to base directory. System will detect it automatically. + Info +
    + {if: $manual_mode['version']} +

    Detected package with version: {$manual_mode['version']}

    +
    + +
    + {else} +

    /batflat-*.zip does not detected.

    + + {/if} + {elseif: cmpver($settings['update_version'], $settings['version']) === 1} +

    {$lang.settings.update_available} ({$settings['update_version']})

    +
    + +
    +

    Changelog:

    +
    {$settings['update_changelog']}
    + {elseif: isset($update_version) && cmpver($update_version, $settings['version']) === 0} +

    {$lang.settings.up_to_date} ({$settings['update_version']})

    +
    + +
    + {elseif: isset($update_version) && cmpver($update_version, $settings['version']) === -1} +

    {$lang.settings.update_newer_version} ({$settings['update_version']})

    +
    + +
    + {else} +
    + +
    + {/if} +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/sitemap/Info.php b/inc/modules/sitemap/Info.php new file mode 100644 index 0000000..1ed6a2f --- /dev/null +++ b/inc/modules/sitemap/Info.php @@ -0,0 +1,28 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + + return [ + 'name' => $core->lang['sitemap']['module_name'], + 'description' => $core->lang['sitemap']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.0', + 'compatibility' => '1.3.*', + 'icon' => 'sitemap', + + 'install' => function() use($core) + { + + }, + 'uninstall' => function() use($core) + { + + } + ]; \ No newline at end of file diff --git a/inc/modules/sitemap/ReadMe.md b/inc/modules/sitemap/ReadMe.md new file mode 100644 index 0000000..7141561 --- /dev/null +++ b/inc/modules/sitemap/ReadMe.md @@ -0,0 +1,4 @@ +Sitemap is available at `example.com/sitemap.xml`. There are two ways to make your sitemap available to search engines: + ++ Submit it to Google using the [Search Console Sitemaps tool](https://www.google.com/webmasters/tools/sitemap-list) ++ Insert special line anywhere in your `robots.txt` file, e.g. `Sitemap: http://example.com/sitemap.xml` \ No newline at end of file diff --git a/inc/modules/sitemap/Site.php b/inc/modules/sitemap/Site.php new file mode 100644 index 0000000..44eb113 --- /dev/null +++ b/inc/modules/sitemap/Site.php @@ -0,0 +1,87 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + + namespace Inc\Modules\Sitemap; + + use Inc\Core\SiteModule; + + class Site extends SiteModule + { + public function routes() + { + $this->route('sitemap.xml', function() { + $this->setTemplate(false); + header('Content-type: application/xml'); + + $urls = []; + + // Home Page + $urls[] = [ + 'url' => url(), + 'lastmod' => null, + ]; + + // Pages + $pages = $this->db('pages')->asc('lang')->asc('id')->toArray(); + $lang = $this->settings('settings.lang_site'); + $homepage = $this->settings('settings.homepage'); + foreach($pages as $page) + { + $page['date'] = strtotime($page['date']); + + $shortLang = strstr($page['lang'], '_', true); + if(strpos($page['slug'], '404') !== FALSE) + continue; + + if($lang == $page['lang'] && $homepage == $page['slug']) + $urls[0]['lastmod'] = date('c', $page['date']); + else if($homepage == $page['slug']) + $urls[] = ['url' => url($shortLang), 'lastmod' => date('c', $page['date'])]; + else if($lang == $page['lang']) + $urls[] = ['url' => url($page['slug']), 'lastmod' => date('c', $page['date'])]; + else + $urls[] = ['url' => url([$shortLang, $page['slug']]), 'lastmod' => date('c', $page['date'])]; + } + + // Blog + $posts = $this->db('blog')->where('status', 2)->desc('published_at')->toArray(); + $tags = $this->db('blog_tags_relationship')->leftJoin('blog_tags', 'blog_tags.id = blog_tags_relationship.tag_id')->leftJoin('blog', 'blog.id', 'blog_tags_relationship.blog_id')->where('blog.status', 2)->group('blog_tags.slug')->select(['slug' => 'blog_tags.slug'])->toArray(); + if($homepage != 'blog') + { + $urls[] = [ + 'url' => url('blog'), + 'lastmod' => date('c', $posts[0]['published_at']) + ]; + } + else + { + $urls[0]['lastmod'] = date('c', $posts[0]['published_at']); + } + foreach($posts as $post) + { + $post['published_at'] = $post['published_at']; + $urls[] = [ + 'url' => url(['blog','post',$post['slug']]), + 'lastmod' => date('c', $post['published_at']), + ]; + } + foreach($tags as $tag) + { + $urls[] = [ + 'url' => url(['blog', 'tag', $tag['slug']]), + 'lastmod' => null, + ]; + } + + echo $this->draw('sitemap.xml', compact('urls')); + }); + } + } \ No newline at end of file diff --git a/inc/modules/sitemap/lang/admin/en_english.ini b/inc/modules/sitemap/lang/admin/en_english.ini new file mode 100644 index 0000000..842b66b --- /dev/null +++ b/inc/modules/sitemap/lang/admin/en_english.ini @@ -0,0 +1,2 @@ +module_name = "Sitemap generator" +module_desc = "Sitemap.xml generator for Batflat." \ No newline at end of file diff --git a/inc/modules/sitemap/lang/admin/pl_polski.ini b/inc/modules/sitemap/lang/admin/pl_polski.ini new file mode 100644 index 0000000..4f083f4 --- /dev/null +++ b/inc/modules/sitemap/lang/admin/pl_polski.ini @@ -0,0 +1,2 @@ +module_name = "Generator mapy strony" +module_desc = "Generuje plik stiemap.xml dla strony opartej o Batflat." \ No newline at end of file diff --git a/inc/modules/sitemap/view/sitemap.xml b/inc/modules/sitemap/view/sitemap.xml new file mode 100644 index 0000000..57858de --- /dev/null +++ b/inc/modules/sitemap/view/sitemap.xml @@ -0,0 +1,14 @@ + + +{loop: $urls} + + {$value.url} + {if: !empty($value.lastmod)}{$value.lastmod}{/if} + + +{/loop} + \ No newline at end of file diff --git a/inc/modules/snippets/Admin.php b/inc/modules/snippets/Admin.php new file mode 100644 index 0000000..db3666f --- /dev/null +++ b/inc/modules/snippets/Admin.php @@ -0,0 +1,190 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Snippets; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + public function navigation() + { + return [ + $this->lang('manage', 'general') => 'manage', + $this->lang('add') => 'add', + ]; + } + + /** + * list of snippets + */ + public function getManage() + { + $rows = $this->db('snippets')->toArray(); + if (count($rows)) { + foreach ($rows as &$row) { + $row['tag'] = $this->tpl->noParse('{$snippet.'.$row['slug'].'}'); + $row['editURL'] = url([ADMIN, 'snippets', 'edit', $row['id']]); + $row['delURL'] = url([ADMIN, 'snippets', 'delete', $row['id']]); + } + } + + return $this->draw('manage.html', ['snippets' => $rows]); + } + + /** + * add new snippet + */ + public function getAdd() + { + return $this->getEdit(); + } + + /** + * edit snippet + */ + public function getEdit($id = null) + { + $this->_add2header(); + + if (!empty($redirectData = getRedirectData())) { + $assign = $redirectData; + } + + if ($id === null) { + $row = ['name' => isset_or($assign['name'], null), 'content' => isset_or($assign['content'], null)]; + + $assign['title'] = $this->lang('add'); + } elseif (!empty($row = $this->db('snippets')->oneArray($id))) { + $assign['title'] = $this->lang('edit'); + } else { + redirect(url([ADMIN, 'snippets', 'manage'])); + } + + $assign = array_merge($assign, htmlspecialchars_array($row)); + $assign['languages'] = $this->_getLanguages($this->settings('settings', 'lang_site')); + + $assign['content'] = []; + preg_match_all("/{lang: ([a-z]{2}_[a-z]+)}(.*?){\/lang}/ms", $row['content'], $matches); + foreach ($matches[1] as $key => $value) { + $assign['content'][trim($value)] = $this->tpl->noParse(trim($matches[2][$key])); + } + + $assign['editor'] = $this->settings('settings', 'editor'); + + return $this->draw('form.html', ['snippets' => $assign]); + } + + /** + * remove snippet + */ + public function getDelete($id) + { + if ($this->db('snippets')->delete($id)) { + $this->notify('success', $this->lang('delete_success')); + } else { + $this->notify('failure', $this->lang('delete_failure')); + } + + redirect(url([ADMIN, 'snippets', 'manage'])); + } + + /** + * save snippet + */ + public function postSave($id = null) + { + unset($_POST['save']); + + if (checkEmptyFields(['name'], $_POST)) { + $this->notify('failure', $this->lang('empty_inputs', 'general')); + + if (!$id) { + redirect(url([ADMIN, 'snippets', 'add'])); + } else { + redirect(url([ADMIN, 'snippets', 'edit', $id])); + } + } + + $_POST['name'] = trim($_POST['name']); + $_POST['slug'] = createSlug($_POST['name']); + + $tmp = null; + foreach ($_POST['content'] as $lang => $content) { + $tmp .= "{lang: $lang}".$content."{/lang}"; + } + + $_POST['content'] = $tmp; + + if ($id === null) { // new + $location = url([ADMIN, 'snippets', 'add']); + if (!$this->db('snippets')->where('slug', $_POST['slug'])->count()) { + if ($this->db('snippets')->save($_POST)) { + $location = url([ADMIN, 'snippets', 'edit', $this->db()->lastInsertId()]); + $this->notify('success', $this->lang('save_success')); + } else { + $this->notify('failure', $this->lang('save_failure')); + } + } else { + $this->notify('failure', $this->lang('already_exists')); + } + } else { // edit + if (!$this->db('snippets')->where('slug', $_POST['slug'])->where('id', '<>', $id)->count()) { + if ($this->db('snippets')->where($id)->save($_POST)) { + $this->notify('success', $this->lang('save_success')); + } else { + $this->notify('failure', $this->lang('save_failure')); + } + } else { + $this->notify('failure', $this->lang('already_exists')); + } + + $location = url([ADMIN, 'snippets', 'edit', $id]); + } + + redirect($location, $_POST); + } + + /** + * module JavaScript + */ + public function getJavascript() + { + header('Content-type: text/javascript'); + echo $this->draw(MODULES.'/snippets/js/admin/snippets.js'); + exit(); + } + + private function _add2header() + { + // WYSIWYG + $this->core->addCSS(url('inc/jscripts/wysiwyg/summernote.min.css')); + $this->core->addJS(url('inc/jscripts/wysiwyg/summernote.min.js')); + if ($this->settings('settings', 'lang_admin') != 'en_english') { + $this->core->addJS(url('inc/jscripts/wysiwyg/lang/'.$this->settings('settings', 'lang_admin').'.js')); + } + + // HTML EDITOR + $this->core->addCSS(url('/inc/jscripts/editor/markitup.min.css')); + $this->core->addCSS(url('/inc/jscripts/editor/markitup.highlight.min.css')); + $this->core->addCSS(url('/inc/jscripts/editor/sets/html/set.min.css')); + $this->core->addJS(url('/inc/jscripts/editor/highlight.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/markitup.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/markitup.highlight.min.js')); + $this->core->addJS(url('/inc/jscripts/editor/sets/html/set.min.js')); + + // ARE YOU SURE? + $this->core->addJS(url('inc/jscripts/are-you-sure.min.js')); + + // MODULE SCRIPTS + $this->core->addJS(url([ADMIN, 'snippets', 'javascript'])); + } +} diff --git a/inc/modules/snippets/Info.php b/inc/modules/snippets/Info.php new file mode 100644 index 0000000..430a4c0 --- /dev/null +++ b/inc/modules/snippets/Info.php @@ -0,0 +1,31 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['snippets']['module_name'], + 'description' => $core->lang['snippets']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.1', + 'compatibility' => '1.3.*', + 'icon' => 'puzzle-piece', + + 'install' => function () use ($core) { + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `snippets` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `name` text NOT NULL, + `slug` text NOT NULL, + `content` text NOT NULL + )"); + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DROP TABLE `snippets`"); + } +]; diff --git a/inc/modules/snippets/Site.php b/inc/modules/snippets/Site.php new file mode 100644 index 0000000..324bd10 --- /dev/null +++ b/inc/modules/snippets/Site.php @@ -0,0 +1,34 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Snippets; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + public function init() + { + $this->_importSnippets(); + } + + private function _importSnippets() + { + $rows = $this->db('snippets')->toArray(); + + $snippets = []; + foreach ($rows as $row) { + $snippets[$row['slug']] = $row['content']; + } + + return $this->tpl->set('snippet', $snippets); + } +} diff --git a/inc/modules/snippets/js/admin/snippets.js b/inc/modules/snippets/js/admin/snippets.js new file mode 100644 index 0000000..f73867b --- /dev/null +++ b/inc/modules/snippets/js/admin/snippets.js @@ -0,0 +1,109 @@ +function insertEditor(type) { + var editor = $('.editor'); + + if (type == 'wysiwyg') { + if ($('.markItUp').length) { + editor.markItUpRemove(); + } + + editor.summernote({ + lang: '{$lang.name}', + height: 270, + callbacks: { + onInit: function() { + $('.note-codable').keyup(function() { + editor.val($(this).val()); + }); + }, + onImageUpload: function(files) { + sendFile(files[0], this); + }, + onChange: function() { + editor.parents('form').trigger('checkform.areYouSure'); + } + } + }); + + $('.note-group-select-from-files').remove(); + } else { + if ($('.note-editor').length) { + editor.each(function() { + var isEmpty = $(this).summernote('isEmpty'); + $(this).summernote('destroy'); + if (isEmpty) + $(this).html(''); + }); + } + + editor.each(function() { + $(this).markItUp(markItUp_html).highlight(); + }); + } +} + +function sendFile(file, editor) { + var formData = new FormData(); + formData.append('file', file); + + var fileData = URL.createObjectURL(file); + $(editor).summernote('insertImage', fileData, function($image) { + $.ajax({ + xhr: function() { + var xhr = new window.XMLHttpRequest(); + + $('input[type="submit"]').prop('disabled', true); + var progress = $('.progress:first').clone(); + progress = (progress.fadeIn()).appendTo($('.progress-wrapper')); + + xhr.upload.addEventListener("progress", function(evt) { + if (evt.lengthComputable) { + var percentComplete = evt.loaded / evt.total; + percentComplete = parseInt(percentComplete * 100); + progress.children().css('width', percentComplete + '%'); + + if (percentComplete === 100) { + progress.fadeOut(); + progress.remove(); + $('input[type="submit"]').prop('disabled', false); + } + } + }, false); + + return xhr; + }, + url: '{?=url([ADMIN, "blog", "editorUpload"])?}', + data: formData, + type: 'POST', + cache: false, + contentType: false, + processData: false, + dataType: 'json', + success: function(data) { + if (data.status == 'success') { + $image.remove(); + $(editor).summernote('insertImage', data.result); + } else if (data.status == 'failure') { + $image.remove(); + bootbox.alert(data.result); + } + } + }); + }); +} + +function select_editor() { + if ($('.editor').data('editor') == 'wysiwyg') { + insertEditor('wysiwyg'); + } else + insertEditor('html'); +} + +$(document).ready(function() { + select_editor(); + + $("#toggle-form label").click(function() { + $("#toggle-form .textarea").slideToggle("slow"); + }); + + $('form').areYouSure({ 'message': '{$lang.general.unsaved_warning}' }); +}); \ No newline at end of file diff --git a/inc/modules/snippets/lang/admin/en_english.ini b/inc/modules/snippets/lang/admin/en_english.ini new file mode 100644 index 0000000..8988b64 --- /dev/null +++ b/inc/modules/snippets/lang/admin/en_english.ini @@ -0,0 +1,12 @@ +module_name = "Snippets" +module_desc = "Displays your own pieces of code on the page." + +add = "Add" +edit = "Edit snippet" +save_success = "Snippet successfully saved." +save_failure = "Failed to save snippet." +content = "Content" +delete_success = "Snippet successfully deleted." +delete_failure = "Unable to delete snippet." +delete_confirm = "Are you sure you want to delete selected snippet?" +already_exists = "Snippet with that name already exists." \ No newline at end of file diff --git a/inc/modules/snippets/lang/admin/pl_polski.ini b/inc/modules/snippets/lang/admin/pl_polski.ini new file mode 100644 index 0000000..fc7cc06 --- /dev/null +++ b/inc/modules/snippets/lang/admin/pl_polski.ini @@ -0,0 +1,12 @@ +module_name = "Skrawki" +module_desc = "Wyświetla własne skrawki kodu na stronie." + +add = "Dodaj nowy" +edit = "Edycja skrawka" +save_success = "Pomyślnie zapisano skrawek." +save_failure = "Nie udało się zapisać skrawka." +content = "Zawartość" +delete_success = "Pomyślnie usunięto skrawek." +delete_failure = "Nie udało się usunąć skrawka." +delete_confirm = "Czy na pewno chcesz usunąć wybrany skrawek?" +already_exists = "Skrawek o takiej nazwie już istnieje." \ No newline at end of file diff --git a/inc/modules/snippets/view/admin/form.html b/inc/modules/snippets/view/admin/form.html new file mode 100644 index 0000000..2cd3f7b --- /dev/null +++ b/inc/modules/snippets/view/admin/form.html @@ -0,0 +1,33 @@ +
    +
    +
    +
    +

    {$snippets.title}

    + +
    +
    +
    +
    + + +
    +
    + +
    + {loop: $snippets.languages} +
    + +
    + {/loop} +
    +
    + +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/inc/modules/snippets/view/admin/manage.html b/inc/modules/snippets/view/admin/manage.html new file mode 100644 index 0000000..34933c2 --- /dev/null +++ b/inc/modules/snippets/view/admin/manage.html @@ -0,0 +1,42 @@ + \ No newline at end of file diff --git a/inc/modules/statistics/Admin.php b/inc/modules/statistics/Admin.php new file mode 100644 index 0000000..4beadcf --- /dev/null +++ b/inc/modules/statistics/Admin.php @@ -0,0 +1,159 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + +namespace Inc\Modules\Statistics; + +use Inc\Core\AdminModule; +use Inc\Modules\Statistics\Src\Chart; +use Inc\Modules\Statistics\Src\Statistics; + +class Admin extends AdminModule +{ + /** + * @var string + */ + protected $moduleDirectory = null; + + /** + * @var Chart + */ + protected $chart = null; + + /** + * @var Statistics + */ + protected $statistics = null; + + public function init() + { + $this->statistics = new Statistics(); + $this->chart = new Chart(); + + $this->moduleDirectory = MODULES.'/statistics'; + $this->core->addCSS(url($this->moduleDirectory.'/assets/css/style.css?v={$bat.version}')); + $this->core->addJS(url($this->moduleDirectory.'/assets/js/Chart.bundle.min.js')); + $this->core->addJS(url($this->moduleDirectory.'/assets/js/app.js?v={$bat.version}')); + } + + public function navigation() + { + return [ + 'Main' => 'main', + ]; + } + + public function getMain() + { + $statistics = $this->statistics; + $chart = $this->chart; + + // Numbers + $visitors['unique'] = $statistics->countUniqueVisits(); + $visitors['online'] = $statistics->countCurrentOnline(); + $visitors['visits']['today'] = $statistics->countAllVisits("TODAY"); + $visitors['visits']['yesterday'] = $statistics->countUniqueVisits("YESTERDAY"); + $visitors['visits']['7days'] = $statistics->countUniqueVisits("-7 days", 7); + $visitors['visits']['30days'] = $statistics->countUniqueVisits("-30 days", 30); + $visitors['visits']['all'] = $statistics->countUniqueVisits("ALL"); + + // Charts + $visitors['chart'] = $chart->getVisitors(14); + $visitors['platform'] = $chart->getOperatingSystems(); + $visitors['countries'] = $chart->getCountries(); + $visitors['browsers'] = $chart->getBrowsers(); + + // Lists + $visitors['pages'] = $statistics->getPages(); + $visitors['referrers'] = $statistics->getReferrers(); + + return $this->draw('dashboard.html', [ + 'visitors' => $visitors + ]); + } + + public function getUrl($urlBase64) + { + $statistics = $this->statistics; + $chart = $this->chart; + + $url = base64_decode($urlBase64); + + // Numbers + $visitors['unique'] = $statistics->countUniqueVisits('ALL', 1, $url); + $visitors['all'] = $statistics->countAllVisits('ALL', 1, $url); + + // Charts + $visitors['chart'] = $chart->getVisitors(14, 0, $url); + $visitors['platform'] = $chart->getOperatingSystems($url); + $visitors['countries'] = $chart->getCountries($url); + $visitors['browsers'] = $chart->getBrowsers($url); + + // Lists + $visitors['referrers'] = $statistics->getReferrers($url, false); + + return $this->draw('url.html', [ + 'url' => $url, + 'visitors' => $visitors + ]); + } + + public function getreferrer($urlBase64) + { + $statistics = $this->statistics; + $chart = $this->chart; + + $url = base64_decode($urlBase64); + + // Numbers + $visitors['unique'] = $statistics->countUniqueVisits('ALL', 1, null, $url); + $visitors['all'] = $statistics->countAllVisits('ALL', 1, null, $url); + + // Charts + $visitors['chart'] = $chart->getVisitors(14, 0, null, $url); + $visitors['platform'] = $chart->getOperatingSystems(null, $url); + $visitors['countries'] = $chart->getCountries(null, $url); + $visitors['browsers'] = $chart->getBrowsers(null, $url); + + // Lists + $visitors['referrers'] = $chart->getReferrers($url, false); + + return $this->draw('referrer.html', [ + 'url' => $url, + 'visitors' => $visitors + ]); + } + + public function getPages() + { + $statistics = $this->statistics; + $chart = $this->chart; + + $pages['chart'] = $chart->getPages(); + $pages['list'] = $statistics->getPages(null, false); + + return $this->draw('pages.html', [ + 'pages' => $pages + ]); + } + + public function getReferrers() + { + $statistics = $this->statistics; + $chart = $this->chart; + + $referrer['chart'] = $chart->getReferrers(); + $referrer['list'] = $statistics->getReferrers(null, false); + + return $this->draw('referrers.html', [ + 'referrers' => $referrer + ]); + } +} diff --git a/inc/modules/statistics/DB.php b/inc/modules/statistics/DB.php new file mode 100644 index 0000000..3c61f46 --- /dev/null +++ b/inc/modules/statistics/DB.php @@ -0,0 +1,16 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + +use Inc\Modules\Statistics\DB; + +return [ + 'name' => $core->lang['statistics']['module_name'], + 'description' => $core->lang['statistics']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.0', + 'compatibility' => '1.3.*', + 'icon' => 'pie-chart', + + 'install' => function () use ($core) { + if (file_exists(BASE_DIR.'/inc/data/statistics.sdb')) { + return; + } + + DB::pdo()->exec("CREATE TABLE IF NOT EXISTS `statistics` ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `ip` TEXT NOT NULL, + `useragent` TEXT, + `uniqhash` TEXT, + `browser` TEXT, + `country` TEXT, + `platform` TEXT, + `url` TEXT, + `referrer` TEXT, + `status_code` INTEGER NOT NULL, + `bot` INTEGER NOT NULL, + `created_at` INTEGER NOT NULL + );"); + + DB::pdo()->exec("CREATE INDEX statistics_idx1 ON statistics(ip,useragent,country,platform,url,referrer,status_code,bot)"); + }, + 'uninstall' => function () use ($core) { + unlink(BASE_DIR.'/inc/data/statistics.sdb'); + }, +]; diff --git a/inc/modules/statistics/Site.php b/inc/modules/statistics/Site.php new file mode 100644 index 0000000..5933d82 --- /dev/null +++ b/inc/modules/statistics/Site.php @@ -0,0 +1,80 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + +namespace Inc\Modules\Statistics; + +use Inc\Core\SiteModule; + +use Inc\Modules\Statistics\DB; +use Inc\Modules\Statistics\PHPBrowserDetector\Browser; +use Inc\Modules\Statistics\PHPBrowserDetector\Os; +use Inc\Core\Lib\HttpRequest; + +class Site extends SiteModule +{ + public function init() + { + // Browser + $browser = new Browser; + + // OS + $os = new Os; + + // IP and GEO + $ip = $_SERVER['REMOTE_ADDR']; + + // Get latest country or fetch new + $country = 'Unknown'; + $latest = $this->db('statistics')->where('ip', $ip)->desc('created_at')->limit(1)->oneArray(); + if (!$latest) { + $details = json_decode(HttpRequest::get('http://freegeoip.net/json/'.$ip), true); + if (!empty($details['country_code'])) { + $country = $details['country_code']; + } + } else { + $country = $latest['country']; + } + + // referrer + $referrer = isset_or($_SERVER['HTTP_referrer'], false); + if ($referrer && $url = parse_url($referrer)) { + if (strpos($url['host'], domain(false)) !== false) { + $referrer = null; + } + } else { + $referrer = null; + } + + // Add visitor record + $this->db('statistics')->save([ + 'ip' => $ip, + 'browser' => $browser->getName(), + 'useragent' => $browser->getUserAgent()->getUserAgentString(), + 'uniqhash' => md5($ip.$browser->getUserAgent()->getUserAgentString()), + 'country' => $country, + 'platform' => $os->getName(), + 'url' => '/'.implode('/', parseURL()), + 'referrer' => $referrer, + 'status_code' => http_response_code(), + 'bot' => ($browser->isRobot() ? 1 : 0), + ]); + } + + public function routes() + { + // + } + + protected function db($table = null) + { + return new DB($table); + } +} diff --git a/inc/modules/statistics/assets/css/style.css b/inc/modules/statistics/assets/css/style.css new file mode 100644 index 0000000..e165406 --- /dev/null +++ b/inc/modules/statistics/assets/css/style.css @@ -0,0 +1,14 @@ +.panel-body h1 { + font-weight:bold; + margin:10px 0; + font-size:48px; +} +.panel-body-nopadding { + padding:0; +} +.panel-body-nopadding table tr th { + border-top:0; +} +.panel-body-nopadding table tr td, .panel-body-nopadding table tr th { + padding-left:15px; +} \ No newline at end of file diff --git a/inc/modules/statistics/assets/js/Chart.bundle.min.js b/inc/modules/statistics/assets/js/Chart.bundle.min.js new file mode 100644 index 0000000..4621b00 --- /dev/null +++ b/inc/modules/statistics/assets/js/Chart.bundle.min.js @@ -0,0 +1,16 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 2.5.0 + * + * Copyright 2017 Nick Downie + * Released under the MIT license + * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Chart=t()}}(function(){var t;return function t(e,n,i){function a(o,s){if(!n[o]){if(!e[o]){var l="function"==typeof require&&require;if(!s&&l)return l(o,!0);if(r)return r(o,!0);var u=new Error("Cannot find module '"+o+"'");throw u.code="MODULE_NOT_FOUND",u}var d=n[o]={exports:{}};e[o][0].call(d.exports,function(t){var n=e[o][1][t];return a(n?n:t)},d,d.exports,t,e,n,i)}return n[o].exports}for(var r="function"==typeof require&&require,o=0;on?(e+.05)/(n+.05):(n+.05)/(e+.05)},level:function(t){var e=this.contrast(t);return e>=7.1?"AAA":e>=4.5?"AA":""},dark:function(){var t=this.values.rgb,e=(299*t[0]+587*t[1]+114*t[2])/1e3;return e<128},light:function(){return!this.dark()},negate:function(){for(var t=[],e=0;e<3;e++)t[e]=255-this.values.rgb[e];return this.setValues("rgb",t),this},lighten:function(t){var e=this.values.hsl;return e[2]+=e[2]*t,this.setValues("hsl",e),this},darken:function(t){var e=this.values.hsl;return e[2]-=e[2]*t,this.setValues("hsl",e),this},saturate:function(t){var e=this.values.hsl;return e[1]+=e[1]*t,this.setValues("hsl",e),this},desaturate:function(t){var e=this.values.hsl;return e[1]-=e[1]*t,this.setValues("hsl",e),this},whiten:function(t){var e=this.values.hwb;return e[1]+=e[1]*t,this.setValues("hwb",e),this},blacken:function(t){var e=this.values.hwb;return e[2]+=e[2]*t,this.setValues("hwb",e),this},greyscale:function(){var t=this.values.rgb,e=.3*t[0]+.59*t[1]+.11*t[2];return this.setValues("rgb",[e,e,e]),this},clearer:function(t){var e=this.values.alpha;return this.setValues("alpha",e-e*t),this},opaquer:function(t){var e=this.values.alpha;return this.setValues("alpha",e+e*t),this},rotate:function(t){var e=this.values.hsl,n=(e[0]+t)%360;return e[0]=n<0?360+n:n,this.setValues("hsl",e),this},mix:function(t,e){var n=this,i=t,a=void 0===e?.5:e,r=2*a-1,o=n.alpha()-i.alpha(),s=((r*o===-1?r:(r+o)/(1+r*o))+1)/2,l=1-s;return this.rgb(s*n.red()+l*i.red(),s*n.green()+l*i.green(),s*n.blue()+l*i.blue()).alpha(n.alpha()*a+i.alpha()*(1-a))},toJSON:function(){return this.rgb()},clone:function(){var t,e,n=new r,i=this.values,a=n.values;for(var o in i)i.hasOwnProperty(o)&&(t=i[o],e={}.toString.call(t),"[object Array]"===e?a[o]=t.slice(0):"[object Number]"===e?a[o]=t:console.error("unexpected color value:",t));return n}},r.prototype.spaces={rgb:["red","green","blue"],hsl:["hue","saturation","lightness"],hsv:["hue","saturation","value"],hwb:["hue","whiteness","blackness"],cmyk:["cyan","magenta","yellow","black"]},r.prototype.maxes={rgb:[255,255,255],hsl:[360,100,100],hsv:[360,100,100],hwb:[360,100,100],cmyk:[100,100,100,100]},r.prototype.getValues=function(t){for(var e=this.values,n={},i=0;i.04045?Math.pow((e+.055)/1.055,2.4):e/12.92,n=n>.04045?Math.pow((n+.055)/1.055,2.4):n/12.92,i=i>.04045?Math.pow((i+.055)/1.055,2.4):i/12.92;var a=.4124*e+.3576*n+.1805*i,r=.2126*e+.7152*n+.0722*i,o=.0193*e+.1192*n+.9505*i;return[100*a,100*r,100*o]}function d(t){var e,n,i,a=u(t),r=a[0],o=a[1],s=a[2];return r/=95.047,o/=100,s/=108.883,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,s=s>.008856?Math.pow(s,1/3):7.787*s+16/116,e=116*o-16,n=500*(r-o),i=200*(o-s),[e,n,i]}function c(t){return Y(d(t))}function h(t){var e,n,i,a,r,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0==s)return r=255*l,[r,r,r];n=l<.5?l*(1+s):l+s-l*s,e=2*l-n,a=[0,0,0];for(var u=0;u<3;u++)i=o+1/3*-(u-1),i<0&&i++,i>1&&i--,r=6*i<1?e+6*(n-e)*i:2*i<1?n:3*i<2?e+(n-e)*(2/3-i)*6:e,a[u]=255*r;return a}function f(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return 0===r?[0,0,0]:(r*=2,a*=r<=1?r:2-r,n=(r+a)/2,e=2*a/(r+a),[i,100*e,100*n])}function m(t){return o(h(t))}function p(t){return s(h(t))}function v(t){return l(h(t))}function y(t){var e=t[0]/60,n=t[1]/100,i=t[2]/100,a=Math.floor(e)%6,r=e-Math.floor(e),o=255*i*(1-n),s=255*i*(1-n*r),l=255*i*(1-n*(1-r)),i=255*i;switch(a){case 0:return[i,l,o];case 1:return[s,i,o];case 2:return[o,i,l];case 3:return[o,s,i];case 4:return[l,o,i];case 5:return[i,o,s]}}function x(t){var e,n,i=t[0],a=t[1]/100,r=t[2]/100;return n=(2-a)*r,e=a*r,e/=n<=1?n:2-n,e=e||0,n/=2,[i,100*e,100*n]}function k(t){return o(y(t))}function _(t){return s(y(t))}function w(t){return l(y(t))}function S(t){var e,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100,u=s+l;switch(u>1&&(s/=u,l/=u),e=Math.floor(6*o),n=1-l,i=6*o-e,0!=(1&e)&&(i=1-i),a=s+i*(n-s),e){default:case 6:case 0:r=n,g=a,b=s;break;case 1:r=a,g=n,b=s;break;case 2:r=s,g=n,b=a;break;case 3:r=s,g=a,b=n;break;case 4:r=a,g=s,b=n;break;case 5:r=n,g=s,b=a}return[255*r,255*g,255*b]}function M(t){return i(S(t))}function D(t){return a(S(t))}function C(t){return s(S(t))}function T(t){return l(S(t))}function P(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100,s=t[3]/100;return e=1-Math.min(1,a*(1-s)+s),n=1-Math.min(1,r*(1-s)+s),i=1-Math.min(1,o*(1-s)+s),[255*e,255*n,255*i]}function I(t){return i(P(t))}function A(t){return a(P(t))}function F(t){return o(P(t))}function O(t){return l(P(t))}function R(t){var e,n,i,a=t[0]/100,r=t[1]/100,o=t[2]/100;return e=3.2406*a+r*-1.5372+o*-.4986,n=a*-.9689+1.8758*r+.0415*o,i=.0557*a+r*-.204+1.057*o,e=e>.0031308?1.055*Math.pow(e,1/2.4)-.055:e*=12.92,n=n>.0031308?1.055*Math.pow(n,1/2.4)-.055:n*=12.92,i=i>.0031308?1.055*Math.pow(i,1/2.4)-.055:i*=12.92,e=Math.min(Math.max(0,e),1),n=Math.min(Math.max(0,n),1),i=Math.min(Math.max(0,i),1),[255*e,255*n,255*i]}function L(t){var e,n,i,a=t[0],r=t[1],o=t[2];return a/=95.047,r/=100,o/=108.883,a=a>.008856?Math.pow(a,1/3):7.787*a+16/116,r=r>.008856?Math.pow(r,1/3):7.787*r+16/116,o=o>.008856?Math.pow(o,1/3):7.787*o+16/116,e=116*r-16,n=500*(a-r),i=200*(r-o),[e,n,i]}function V(t){return Y(L(t))}function W(t){var e,n,i,a,r=t[0],o=t[1],s=t[2];return r<=8?(n=100*r/903.3,a=7.787*(n/100)+16/116):(n=100*Math.pow((r+16)/116,3),a=Math.pow(n/100,1/3)),e=e/95.047<=.008856?e=95.047*(o/500+a-16/116)/7.787:95.047*Math.pow(o/500+a,3),i=i/108.883<=.008859?i=108.883*(a-s/200-16/116)/7.787:108.883*Math.pow(a-s/200,3),[e,n,i]}function Y(t){var e,n,i,a=t[0],r=t[1],o=t[2];return e=Math.atan2(o,r),n=360*e/2/Math.PI,n<0&&(n+=360),i=Math.sqrt(r*r+o*o),[a,i,n]}function B(t){return R(W(t))}function z(t){var e,n,i,a=t[0],r=t[1],o=t[2];return i=o/360*2*Math.PI,e=r*Math.cos(i),n=r*Math.sin(i),[a,e,n]}function N(t){return W(z(t))}function H(t){return B(z(t))}function E(t){return J[t]}function U(t){return i(E(t))}function j(t){return a(E(t))}function G(t){return o(E(t))}function q(t){return s(E(t))}function Z(t){return d(E(t))}function X(t){return u(E(t))}e.exports={rgb2hsl:i,rgb2hsv:a,rgb2hwb:o,rgb2cmyk:s,rgb2keyword:l,rgb2xyz:u,rgb2lab:d,rgb2lch:c,hsl2rgb:h,hsl2hsv:f,hsl2hwb:m,hsl2cmyk:p,hsl2keyword:v,hsv2rgb:y,hsv2hsl:x,hsv2hwb:k,hsv2cmyk:_,hsv2keyword:w,hwb2rgb:S,hwb2hsl:M,hwb2hsv:D,hwb2cmyk:C,hwb2keyword:T,cmyk2rgb:P,cmyk2hsl:I,cmyk2hsv:A,cmyk2hwb:F,cmyk2keyword:O,keyword2rgb:E,keyword2hsl:U,keyword2hsv:j,keyword2hwb:G,keyword2cmyk:q,keyword2lab:Z,keyword2xyz:X,xyz2rgb:R,xyz2lab:L,xyz2lch:V,lab2xyz:W,lab2rgb:B,lab2lch:Y,lch2lab:z,lch2xyz:N,lch2rgb:H};var J={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},K={};for(var Q in J)K[JSON.stringify(J[Q])]=Q},{}],4:[function(t,e,n){var i=t(3),a=function(){return new u};for(var r in i){a[r+"Raw"]=function(t){return function(e){return"number"==typeof e&&(e=Array.prototype.slice.call(arguments)),i[t](e)}}(r);var o=/(\w+)2(\w+)/.exec(r),s=o[1],l=o[2];a[s]=a[s]||{},a[s][l]=a[r]=function(t){return function(e){"number"==typeof e&&(e=Array.prototype.slice.call(arguments));var n=i[t](e);if("string"==typeof n||void 0===n)return n;for(var a=0;a0)for(n in xi)i=xi[n],a=e[i],v(a)||(t[i]=a);return t}function y(e){b(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),ki===!1&&(ki=!0,t.updateOffset(this),ki=!1)}function x(t){return t instanceof y||null!=t&&null!=t._isAMomentObject}function k(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function _(t){var e=+t,n=0;return 0!==e&&isFinite(e)&&(n=k(e)),n}function w(t,e,n){var i,a=Math.min(t.length,e.length),r=Math.abs(t.length-e.length),o=0;for(i=0;i0?"future":"past"];return C(n)?n(e):n.replace(/%s/i,e)}function W(t,e){var n=t.toLowerCase();Fi[n]=Fi[n+"s"]=Fi[e]=t}function Y(t){return"string"==typeof t?Fi[t]||Fi[t.toLowerCase()]:void 0}function B(t){var e,n,i={};for(n in t)d(t,n)&&(e=Y(n),e&&(i[e]=t[n]));return i}function z(t,e){Oi[t]=e}function N(t){var e=[];for(var n in t)e.push({unit:n,priority:Oi[n]});return e.sort(function(t,e){return t.priority-e.priority}),e}function H(e,n){return function(i){return null!=i?(U(this,e,i),t.updateOffset(this,n),this):E(this,e)}}function E(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function U(t,e,n){t.isValid()&&t._d["set"+(t._isUTC?"UTC":"")+e](n)}function j(t){return t=Y(t),C(this[t])?this[t]():this}function G(t,e){if("object"==typeof t){t=B(t);for(var n=N(t),i=0;i=0;return(r?n?"+":"":"-")+Math.pow(10,Math.max(0,a)).toString().substr(1)+i}function Z(t,e,n,i){var a=i;"string"==typeof i&&(a=function(){return this[i]()}),t&&(Wi[t]=a),e&&(Wi[e[0]]=function(){return q(a.apply(this,arguments),e[1],e[2])}),n&&(Wi[n]=function(){return this.localeData().ordinal(a.apply(this,arguments),t)})}function X(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function J(t){var e,n,i=t.match(Ri);for(e=0,n=i.length;e=0&&Li.test(t);)t=t.replace(Li,n),Li.lastIndex=0,i-=1;return t}function $(t,e,n){ea[t]=C(e)?e:function(t,i){return t&&n?n:e}}function tt(t,e){return d(ea,t)?ea[t](e._strict,e._locale):new RegExp(et(t))}function et(t){return nt(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,n,i,a){return e||n||i||a}))}function nt(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function it(t,e){var n,i=e;for("string"==typeof t&&(t=[t]),s(e)&&(i=function(t,n){n[e]=_(t)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(t),s}function kt(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function _t(t,e,n){var i=7+e-n,a=(7+kt(t,0,i).getUTCDay()-e)%7;return-a+i-1}function wt(t,e,n,i,a){var r,o,s=(7+n-i)%7,l=_t(t,i,a),u=1+7*(e-1)+s+l;return u<=0?(r=t-1,o=vt(r)+u):u>vt(t)?(r=t+1,o=u-vt(t)):(r=t,o=u),{year:r,dayOfYear:o}}function St(t,e,n){var i,a,r=_t(t.year(),e,n),o=Math.floor((t.dayOfYear()-r-1)/7)+1;return o<1?(a=t.year()-1,i=o+Mt(a,e,n)):o>Mt(t.year(),e,n)?(i=o-Mt(t.year(),e,n),a=t.year()+1):(a=t.year(),i=o),{week:i,year:a}}function Mt(t,e,n){var i=_t(t,e,n),a=_t(t+1,e,n);return(vt(t)-i+a)/7}function Dt(t){return St(t,this._week.dow,this._week.doy).week}function Ct(){return this._week.dow}function Tt(){return this._week.doy}function Pt(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function It(t){var e=St(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function At(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function Ft(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function Ot(t,e){return t?a(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:this._weekdays}function Rt(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Lt(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function Vt(t,e,n){var i,a,r,o=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)r=h([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===e?(a=ha.call(this._weekdaysParse,o),a!==-1?a:null):"ddd"===e?(a=ha.call(this._shortWeekdaysParse,o),a!==-1?a:null):(a=ha.call(this._minWeekdaysParse,o),a!==-1?a:null):"dddd"===e?(a=ha.call(this._weekdaysParse,o),a!==-1?a:(a=ha.call(this._shortWeekdaysParse,o),a!==-1?a:(a=ha.call(this._minWeekdaysParse,o),a!==-1?a:null))):"ddd"===e?(a=ha.call(this._shortWeekdaysParse,o),a!==-1?a:(a=ha.call(this._weekdaysParse,o),a!==-1?a:(a=ha.call(this._minWeekdaysParse,o),a!==-1?a:null))):(a=ha.call(this._minWeekdaysParse,o),a!==-1?a:(a=ha.call(this._weekdaysParse,o),a!==-1?a:(a=ha.call(this._shortWeekdaysParse,o),a!==-1?a:null)))}function Wt(t,e,n){var i,a,r;if(this._weekdaysParseExact)return Vt.call(this,t,e,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(a=h([2e3,1]).day(i),n&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(a,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(a,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(a,"").replace(".",".?")+"$","i")),this._weekdaysParse[i]||(r="^"+this.weekdays(a,"")+"|^"+this.weekdaysShort(a,"")+"|^"+this.weekdaysMin(a,""),this._weekdaysParse[i]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===e&&this._fullWeekdaysParse[i].test(t))return i;if(n&&"ddd"===e&&this._shortWeekdaysParse[i].test(t))return i;if(n&&"dd"===e&&this._minWeekdaysParse[i].test(t))return i;if(!n&&this._weekdaysParse[i].test(t))return i}}function Yt(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=At(t,this.localeData()),this.add(t-e,"d")):e}function Bt(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function zt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=Ft(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function Nt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Ut.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=wa),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ht(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Ut.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Sa),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Et(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Ut.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ma),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Ut(){function t(t,e){return e.length-t.length}var e,n,i,a,r,o=[],s=[],l=[],u=[];for(e=0;e<7;e++)n=h([2e3,1]).day(e),i=this.weekdaysMin(n,""),a=this.weekdaysShort(n,""),r=this.weekdays(n,""),o.push(i),s.push(a),l.push(r),u.push(i),u.push(a),u.push(r);for(o.sort(t),s.sort(t),l.sort(t),u.sort(t),e=0;e<7;e++)s[e]=nt(s[e]),l[e]=nt(l[e]),u[e]=nt(u[e]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+o.join("|")+")","i")}function jt(){return this.hours()%12||12}function Gt(){return this.hours()||24}function qt(t,e){Z(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function Zt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Jt(t,e,n){return t>11?n?"pm":"PM":n?"am":"AM"}function Kt(t){return t?t.toLowerCase().replace("_","-"):t}function Qt(t){for(var e,n,i,a,r=0;r0;){if(i=$t(a.slice(0,e).join("-")))return i;if(n&&n.length>=e&&w(a,n,!0)>=e-1)break;e--}r++}return null}function $t(t){var i=null;if(!Ia[t]&&"undefined"!=typeof n&&n&&n.exports)try{i=Da._abbr,e("./locale/"+t),te(i)}catch(t){}return Ia[t]}function te(t,e){var n;return t&&(n=v(e)?ie(t):ee(t,e),n&&(Da=n)),Da._abbr}function ee(t,e){if(null!==e){var n=Pa;if(e.abbr=t,null!=Ia[t])D("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=Ia[t]._config;else if(null!=e.parentLocale){if(null==Ia[e.parentLocale])return Aa[e.parentLocale]||(Aa[e.parentLocale]=[]),Aa[e.parentLocale].push({name:t,config:e}),null;n=Ia[e.parentLocale]._config}return Ia[t]=new I(P(n,e)),Aa[t]&&Aa[t].forEach(function(t){ee(t.name,t.config)}),te(t),Ia[t]}return delete Ia[t],null}function ne(t,e){if(null!=e){var n,i=Pa;null!=Ia[t]&&(i=Ia[t]._config),e=P(i,e),n=new I(e),n.parentLocale=Ia[t],Ia[t]=n,te(t)}else null!=Ia[t]&&(null!=Ia[t].parentLocale?Ia[t]=Ia[t].parentLocale:null!=Ia[t]&&delete Ia[t]);return Ia[t]}function ie(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return Da;if(!a(t)){if(e=$t(t))return e;t=[t]}return Qt(t)}function ae(){return Mi(Ia)}function re(t){var e,n=t._a;return n&&g(t).overflow===-2&&(e=n[aa]<0||n[aa]>11?aa:n[ra]<1||n[ra]>ot(n[ia],n[aa])?ra:n[oa]<0||n[oa]>24||24===n[oa]&&(0!==n[sa]||0!==n[la]||0!==n[ua])?oa:n[sa]<0||n[sa]>59?sa:n[la]<0||n[la]>59?la:n[ua]<0||n[ua]>999?ua:-1,g(t)._overflowDayOfYear&&(era)&&(e=ra),g(t)._overflowWeeks&&e===-1&&(e=da),g(t)._overflowWeekday&&e===-1&&(e=ca),g(t).overflow=e),t}function oe(t){var e,n,i,a,r,o,s=t._i,l=Fa.exec(s)||Oa.exec(s);if(l){for(g(t).iso=!0,e=0,n=La.length;evt(a)&&(g(t)._overflowDayOfYear=!0),n=kt(a,0,t._dayOfYear),t._a[aa]=n.getUTCMonth(),t._a[ra]=n.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=r[e]=i[e];for(;e<7;e++)t._a[e]=r[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[oa]&&0===t._a[sa]&&0===t._a[la]&&0===t._a[ua]&&(t._nextDay=!0,t._a[oa]=0),t._d=(t._useUTC?kt:xt).apply(null,r),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[oa]=24)}}function ce(t){var e,n,i,a,r,o,s,l;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)r=1,o=4,n=le(e.GG,t._a[ia],St(xe(),1,4).year),i=le(e.W,1),a=le(e.E,1),(a<1||a>7)&&(l=!0);else{r=t._locale._week.dow,o=t._locale._week.doy;var u=St(xe(),r,o);n=le(e.gg,t._a[ia],u.year),i=le(e.w,u.week),null!=e.d?(a=e.d,(a<0||a>6)&&(l=!0)):null!=e.e?(a=e.e+r,(e.e<0||e.e>6)&&(l=!0)):a=r}i<1||i>Mt(n,r,o)?g(t)._overflowWeeks=!0:null!=l?g(t)._overflowWeekday=!0:(s=wt(n,i,a,r,o),t._a[ia]=s.year,t._dayOfYear=s.dayOfYear)}function he(e){if(e._f===t.ISO_8601)return void oe(e);e._a=[],g(e).empty=!0;var n,i,a,r,o,s=""+e._i,l=s.length,u=0;for(a=Q(e._f,e._locale).match(Ri)||[],n=0;n0&&g(e).unusedInput.push(o),s=s.slice(s.indexOf(i)+i.length),u+=i.length),Wi[r]?(i?g(e).empty=!1:g(e).unusedTokens.push(r),rt(r,i,e)):e._strict&&!i&&g(e).unusedTokens.push(r);g(e).charsLeftOver=l-u,s.length>0&&g(e).unusedInput.push(s),e._a[oa]<=12&&g(e).bigHour===!0&&e._a[oa]>0&&(g(e).bigHour=void 0),g(e).parsedDateParts=e._a.slice(0),g(e).meridiem=e._meridiem,e._a[oa]=fe(e._locale,e._a[oa],e._meridiem),de(e),re(e)}function fe(t,e,n){var i;return null==n?e:null!=t.meridiemHour?t.meridiemHour(e,n):null!=t.isPM?(i=t.isPM(n),i&&e<12&&(e+=12),i||12!==e||(e=0),e):e}function ge(t){var e,n,i,a,r;if(0===t._f.length)return g(t).invalidFormat=!0,void(t._d=new Date(NaN));for(a=0;athis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ye(){if(!v(this._isDSTShifted))return this._isDSTShifted;var t={};if(b(t,this),t=ve(t),t._a){var e=t._isUTC?h(t._a):xe(t._a);this._isDSTShifted=this.isValid()&&w(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Be(){return!!this.isValid()&&!this._isUTC}function ze(){return!!this.isValid()&&this._isUTC}function Ne(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function He(t,e){var n,i,a,r=t,o=null;return Me(t)?r={ms:t._milliseconds,d:t._days,M:t._months}:s(t)?(r={},e?r[e]=t:r.milliseconds=t):(o=Ha.exec(t))?(n="-"===o[1]?-1:1,r={y:0,d:_(o[ra])*n,h:_(o[oa])*n,m:_(o[sa])*n,s:_(o[la])*n,ms:_(De(1e3*o[ua]))*n}):(o=Ea.exec(t))?(n="-"===o[1]?-1:1,r={y:Ee(o[2],n),M:Ee(o[3],n),w:Ee(o[4],n),d:Ee(o[5],n),h:Ee(o[6],n),m:Ee(o[7],n),s:Ee(o[8],n)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(a=je(xe(r.from),xe(r.to)),r={},r.ms=a.milliseconds,r.M=a.months),i=new Se(r),Me(t)&&d(t,"_locale")&&(i._locale=t._locale),i}function Ee(t,e){var n=t&&parseFloat(t.replace(",","."));return(isNaN(n)?0:n)*e}function Ue(t,e){var n={milliseconds:0,months:0};return n.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(n.months,"M").isAfter(e)&&--n.months,n.milliseconds=+e-+t.clone().add(n.months,"M"),n}function je(t,e){var n;return t.isValid()&&e.isValid()?(e=Pe(e,t),t.isBefore(e)?n=Ue(t,e):(n=Ue(e,t),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function Ge(t,e){return function(n,i){var a,r;return null===i||isNaN(+i)||(D(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),r=n,n=i,i=r),n="string"==typeof n?+n:n,a=He(n,i),qe(this,a,t),this}}function qe(e,n,i,a){var r=n._milliseconds,o=De(n._days),s=De(n._months);e.isValid()&&(a=null==a||a,r&&e._d.setTime(e._d.valueOf()+r*i),o&&U(e,"Date",E(e,"Date")+o*i),s&&ct(e,E(e,"Month")+s*i),a&&t.updateOffset(e,o||s))}function Ze(t,e){var n=t.diff(e,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function Xe(e,n){var i=e||xe(),a=Pe(i,this).startOf("day"),r=t.calendarFormat(this,a)||"sameElse",o=n&&(C(n[r])?n[r].call(this,i):n[r]);return this.format(o||this.localeData().calendar(r,this,xe(i)))}function Je(){return new y(this)}function Ke(t,e){var n=x(t)?t:xe(t);return!(!this.isValid()||!n.isValid())&&(e=Y(v(e)?"millisecond":e),"millisecond"===e?this.valueOf()>n.valueOf():n.valueOf()r&&(e=r),Rn.call(this,t,e,n,i,a))}function Rn(t,e,n,i,a){var r=wt(t,e,n,i,a),o=kt(r.year,0,r.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}function Ln(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Vn(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Wn(t,e){e[ua]=_(1e3*("0."+t))}function Yn(){return this._isUTC?"UTC":""}function Bn(){return this._isUTC?"Coordinated Universal Time":""}function zn(t){return xe(1e3*t)}function Nn(){return xe.apply(null,arguments).parseZone()}function Hn(t){return t}function En(t,e,n,i){var a=ie(),r=h().set(i,e);return a[n](r,t)}function Un(t,e,n){if(s(t)&&(e=t,t=void 0),t=t||"",null!=e)return En(t,e,n,"month");var i,a=[];for(i=0;i<12;i++)a[i]=En(t,i,n,"month");return a}function jn(t,e,n,i){"boolean"==typeof t?(s(e)&&(n=e,e=void 0),e=e||""):(e=t,n=e,t=!1,s(e)&&(n=e,e=void 0),e=e||"");var a=ie(),r=t?a._week.dow:0;if(null!=n)return En(e,(n+r)%7,i,"day");var o,l=[];for(o=0;o<7;o++)l[o]=En(e,(o+r)%7,i,"day");return l}function Gn(t,e){return Un(t,e,"months")}function qn(t,e){return Un(t,e,"monthsShort")}function Zn(t,e,n){return jn(t,e,n,"weekdays")}function Xn(t,e,n){return jn(t,e,n,"weekdaysShort")}function Jn(t,e,n){return jn(t,e,n,"weekdaysMin")}function Kn(){var t=this._data;return this._milliseconds=tr(this._milliseconds),this._days=tr(this._days),this._months=tr(this._months),t.milliseconds=tr(t.milliseconds),t.seconds=tr(t.seconds),t.minutes=tr(t.minutes),t.hours=tr(t.hours),t.months=tr(t.months),t.years=tr(t.years),this}function Qn(t,e,n,i){var a=He(e,n);return t._milliseconds+=i*a._milliseconds,t._days+=i*a._days,t._months+=i*a._months,t._bubble()}function $n(t,e){return Qn(this,t,e,1)}function ti(t,e){return Qn(this,t,e,-1)}function ei(t){return t<0?Math.floor(t):Math.ceil(t)}function ni(){var t,e,n,i,a,r=this._milliseconds,o=this._days,s=this._months,l=this._data;return r>=0&&o>=0&&s>=0||r<=0&&o<=0&&s<=0||(r+=864e5*ei(ai(s)+o),o=0,s=0),l.milliseconds=r%1e3,t=k(r/1e3),l.seconds=t%60,e=k(t/60),l.minutes=e%60,n=k(e/60),l.hours=n%24,o+=k(n/24),a=k(ii(o)),s+=a,o-=ei(ai(a)),i=k(s/12),s%=12,l.days=o,l.months=s,l.years=i,this}function ii(t){return 4800*t/146097}function ai(t){return 146097*t/4800}function ri(t){var e,n,i=this._milliseconds;if(t=Y(t),"month"===t||"year"===t)return e=this._days+i/864e5,n=this._months+ii(e),"month"===t?n:n/12;switch(e=this._days+Math.round(ai(this._months)),t){case"week":return e/7+i/6048e5;case"day":return e+i/864e5;case"hour":return 24*e+i/36e5;case"minute":return 1440*e+i/6e4;case"second":return 86400*e+i/1e3;case"millisecond":return Math.floor(864e5*e)+i;default:throw new Error("Unknown unit "+t)}}function oi(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12)}function si(t){return function(){return this.as(t)}}function li(t){return t=Y(t),this[t+"s"]()}function ui(t){return function(){return this._data[t]}}function di(){return k(this.days()/7)}function ci(t,e,n,i,a){return a.relativeTime(e||1,!!n,t,i)}function hi(t,e,n){var i=He(t).abs(),a=pr(i.as("s")),r=pr(i.as("m")),o=pr(i.as("h")),s=pr(i.as("d")),l=pr(i.as("M")),u=pr(i.as("y")),d=a0,d[4]=n,ci.apply(null,d)}function fi(t){return void 0===t?pr:"function"==typeof t&&(pr=t,!0)}function gi(t,e){return void 0!==vr[t]&&(void 0===e?vr[t]:(vr[t]=e,!0))}function mi(t){var e=this.localeData(),n=hi(this,!t,e);return t&&(n=e.pastFuture(+this,n)),e.postformat(n)}function pi(){var t,e,n,i=br(this._milliseconds)/1e3,a=br(this._days),r=br(this._months);t=k(i/60),e=k(t/60),i%=60,t%=60,n=k(r/12),r%=12;var o=n,s=r,l=a,u=e,d=t,c=i,h=this.asSeconds();return h?(h<0?"-":"")+"P"+(o?o+"Y":"")+(s?s+"M":"")+(l?l+"D":"")+(u||d||c?"T":"")+(u?u+"H":"")+(d?d+"M":"")+(c?c+"S":""):"P0D"}var vi,bi;bi=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),n=e.length>>>0,i=0;i68?1900:2e3)};var ba=H("FullYear",!0);Z("w",["ww",2],"wo","week"),Z("W",["WW",2],"Wo","isoWeek"),W("week","w"),W("isoWeek","W"),z("week",5),z("isoWeek",5),$("w",Ei),$("ww",Ei,Bi),$("W",Ei),$("WW",Ei,Bi),at(["w","ww","W","WW"],function(t,e,n,i){e[i.substr(0,1)]=_(t)});var ya={dow:0,doy:6};Z("d",0,"do","day"),Z("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),Z("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),Z("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),Z("e",0,0,"weekday"),Z("E",0,0,"isoWeekday"),W("day","d"),W("weekday","e"),W("isoWeekday","E"),z("day",11),z("weekday",11),z("isoWeekday",11),$("d",Ei),$("e",Ei),$("E",Ei),$("dd",function(t,e){return e.weekdaysMinRegex(t)}),$("ddd",function(t,e){return e.weekdaysShortRegex(t)}),$("dddd",function(t,e){return e.weekdaysRegex(t)}),at(["dd","ddd","dddd"],function(t,e,n,i){var a=n._locale.weekdaysParse(t,i,n._strict);null!=a?e.d=a:g(n).invalidWeekday=t}),at(["d","e","E"],function(t,e,n,i){e[i]=_(t)});var xa="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ka="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),_a="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),wa=ta,Sa=ta,Ma=ta;Z("H",["HH",2],0,"hour"),Z("h",["hh",2],0,jt),Z("k",["kk",2],0,Gt),Z("hmm",0,0,function(){return""+jt.apply(this)+q(this.minutes(),2)}),Z("hmmss",0,0,function(){return""+jt.apply(this)+q(this.minutes(),2)+q(this.seconds(),2)}),Z("Hmm",0,0,function(){return""+this.hours()+q(this.minutes(),2)}),Z("Hmmss",0,0,function(){return""+this.hours()+q(this.minutes(),2)+q(this.seconds(),2)}),qt("a",!0),qt("A",!1),W("hour","h"),z("hour",13),$("a",Zt),$("A",Zt),$("H",Ei),$("h",Ei),$("HH",Ei,Bi),$("hh",Ei,Bi),$("hmm",Ui),$("hmmss",ji),$("Hmm",Ui),$("Hmmss",ji),it(["H","HH"],oa),it(["a","A"],function(t,e,n){n._isPm=n._locale.isPM(t),n._meridiem=t}),it(["h","hh"],function(t,e,n){e[oa]=_(t),g(n).bigHour=!0}),it("hmm",function(t,e,n){var i=t.length-2;e[oa]=_(t.substr(0,i)),e[sa]=_(t.substr(i)),g(n).bigHour=!0}),it("hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[oa]=_(t.substr(0,i)),e[sa]=_(t.substr(i,2)),e[la]=_(t.substr(a)),g(n).bigHour=!0}),it("Hmm",function(t,e,n){var i=t.length-2;e[oa]=_(t.substr(0,i)),e[sa]=_(t.substr(i))}),it("Hmmss",function(t,e,n){var i=t.length-4,a=t.length-2;e[oa]=_(t.substr(0,i)),e[sa]=_(t.substr(i,2)),e[la]=_(t.substr(a))});var Da,Ca=/[ap]\.?m?\.?/i,Ta=H("Hours",!0),Pa={calendar:Di,longDateFormat:Ci,invalidDate:Ti,ordinal:Pi,ordinalParse:Ii,relativeTime:Ai,months:ga,monthsShort:ma,week:ya,weekdays:xa,weekdaysMin:_a,weekdaysShort:ka,meridiemParse:Ca},Ia={},Aa={},Fa=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Oa=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ra=/Z|[+-]\d\d(?::?\d\d)?/,La=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Va=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Wa=/^\/?Date\((\-?\d+)/i; +t.createFromInputFallback=M("value provided is not in a recognized ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),t.ISO_8601=function(){};var Ya=M("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=xe.apply(null,arguments);return this.isValid()&&t.isValid()?tthis?this:t:p()}),za=function(){return Date.now?Date.now():+new Date};Ce("Z",":"),Ce("ZZ",""),$("Z",Qi),$("ZZ",Qi),it(["Z","ZZ"],function(t,e,n){n._useUTC=!0,n._tzm=Te(Qi,t)});var Na=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var Ha=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Ea=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;He.fn=Se.prototype;var Ua=Ge(1,"add"),ja=Ge(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Ga=M("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});Z(0,["gg",2],0,function(){return this.weekYear()%100}),Z(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Tn("gggg","weekYear"),Tn("ggggg","weekYear"),Tn("GGGG","isoWeekYear"),Tn("GGGGG","isoWeekYear"),W("weekYear","gg"),W("isoWeekYear","GG"),z("weekYear",1),z("isoWeekYear",1),$("G",Ji),$("g",Ji),$("GG",Ei,Bi),$("gg",Ei,Bi),$("GGGG",qi,Ni),$("gggg",qi,Ni),$("GGGGG",Zi,Hi),$("ggggg",Zi,Hi),at(["gggg","ggggg","GGGG","GGGGG"],function(t,e,n,i){e[i.substr(0,2)]=_(t)}),at(["gg","GG"],function(e,n,i,a){n[a]=t.parseTwoDigitYear(e)}),Z("Q",0,"Qo","quarter"),W("quarter","Q"),z("quarter",7),$("Q",Yi),it("Q",function(t,e){e[aa]=3*(_(t)-1)}),Z("D",["DD",2],"Do","date"),W("date","D"),z("date",9),$("D",Ei),$("DD",Ei,Bi),$("Do",function(t,e){return t?e._ordinalParse:e._ordinalParseLenient}),it(["D","DD"],ra),it("Do",function(t,e){e[ra]=_(t.match(Ei)[0],10)});var qa=H("Date",!0);Z("DDD",["DDDD",3],"DDDo","dayOfYear"),W("dayOfYear","DDD"),z("dayOfYear",4),$("DDD",Gi),$("DDDD",zi),it(["DDD","DDDD"],function(t,e,n){n._dayOfYear=_(t)}),Z("m",["mm",2],0,"minute"),W("minute","m"),z("minute",14),$("m",Ei),$("mm",Ei,Bi),it(["m","mm"],sa);var Za=H("Minutes",!1);Z("s",["ss",2],0,"second"),W("second","s"),z("second",15),$("s",Ei),$("ss",Ei,Bi),it(["s","ss"],la);var Xa=H("Seconds",!1);Z("S",0,0,function(){return~~(this.millisecond()/100)}),Z(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),Z(0,["SSS",3],0,"millisecond"),Z(0,["SSSS",4],0,function(){return 10*this.millisecond()}),Z(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),Z(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),Z(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),Z(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),Z(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),W("millisecond","ms"),z("millisecond",16),$("S",Gi,Yi),$("SS",Gi,Bi),$("SSS",Gi,zi);var Ja;for(Ja="SSSS";Ja.length<=9;Ja+="S")$(Ja,Xi);for(Ja="S";Ja.length<=9;Ja+="S")it(Ja,Wn);var Ka=H("Milliseconds",!1);Z("z",0,0,"zoneAbbr"),Z("zz",0,0,"zoneName");var Qa=y.prototype;Qa.add=Ua,Qa.calendar=Xe,Qa.clone=Je,Qa.diff=an,Qa.endOf=vn,Qa.format=un,Qa.from=dn,Qa.fromNow=cn,Qa.to=hn,Qa.toNow=fn,Qa.get=j,Qa.invalidAt=Dn,Qa.isAfter=Ke,Qa.isBefore=Qe,Qa.isBetween=$e,Qa.isSame=tn,Qa.isSameOrAfter=en,Qa.isSameOrBefore=nn,Qa.isValid=Sn,Qa.lang=Ga,Qa.locale=gn,Qa.localeData=mn,Qa.max=Ba,Qa.min=Ya,Qa.parsingFlags=Mn,Qa.set=G,Qa.startOf=pn,Qa.subtract=ja,Qa.toArray=kn,Qa.toObject=_n,Qa.toDate=xn,Qa.toISOString=sn,Qa.inspect=ln,Qa.toJSON=wn,Qa.toString=on,Qa.unix=yn,Qa.valueOf=bn,Qa.creationData=Cn,Qa.year=ba,Qa.isLeapYear=yt,Qa.weekYear=Pn,Qa.isoWeekYear=In,Qa.quarter=Qa.quarters=Ln,Qa.month=ht,Qa.daysInMonth=ft,Qa.week=Qa.weeks=Pt,Qa.isoWeek=Qa.isoWeeks=It,Qa.weeksInYear=Fn,Qa.isoWeeksInYear=An,Qa.date=qa,Qa.day=Qa.days=Yt,Qa.weekday=Bt,Qa.isoWeekday=zt,Qa.dayOfYear=Vn,Qa.hour=Qa.hours=Ta,Qa.minute=Qa.minutes=Za,Qa.second=Qa.seconds=Xa,Qa.millisecond=Qa.milliseconds=Ka,Qa.utcOffset=Ae,Qa.utc=Oe,Qa.local=Re,Qa.parseZone=Le,Qa.hasAlignedHourOffset=Ve,Qa.isDST=We,Qa.isLocal=Be,Qa.isUtcOffset=ze,Qa.isUtc=Ne,Qa.isUTC=Ne,Qa.zoneAbbr=Yn,Qa.zoneName=Bn,Qa.dates=M("dates accessor is deprecated. Use date instead.",qa),Qa.months=M("months accessor is deprecated. Use month instead",ht),Qa.years=M("years accessor is deprecated. Use year instead",ba),Qa.zone=M("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Fe),Qa.isDSTShifted=M("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ye);var $a=I.prototype;$a.calendar=A,$a.longDateFormat=F,$a.invalidDate=O,$a.ordinal=R,$a.preparse=Hn,$a.postformat=Hn,$a.relativeTime=L,$a.pastFuture=V,$a.set=T,$a.months=st,$a.monthsShort=lt,$a.monthsParse=dt,$a.monthsRegex=mt,$a.monthsShortRegex=gt,$a.week=Dt,$a.firstDayOfYear=Tt,$a.firstDayOfWeek=Ct,$a.weekdays=Ot,$a.weekdaysMin=Lt,$a.weekdaysShort=Rt,$a.weekdaysParse=Wt,$a.weekdaysRegex=Nt,$a.weekdaysShortRegex=Ht,$a.weekdaysMinRegex=Et,$a.isPM=Xt,$a.meridiem=Jt,te("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10,n=1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th";return t+n}}),t.lang=M("moment.lang is deprecated. Use moment.locale instead.",te),t.langData=M("moment.langData is deprecated. Use moment.localeData instead.",ie);var tr=Math.abs,er=si("ms"),nr=si("s"),ir=si("m"),ar=si("h"),rr=si("d"),or=si("w"),sr=si("M"),lr=si("y"),ur=ui("milliseconds"),dr=ui("seconds"),cr=ui("minutes"),hr=ui("hours"),fr=ui("days"),gr=ui("months"),mr=ui("years"),pr=Math.round,vr={s:45,m:45,h:22,d:26,M:11},br=Math.abs,yr=Se.prototype;return yr.abs=Kn,yr.add=$n,yr.subtract=ti,yr.as=ri,yr.asMilliseconds=er,yr.asSeconds=nr,yr.asMinutes=ir,yr.asHours=ar,yr.asDays=rr,yr.asWeeks=or,yr.asMonths=sr,yr.asYears=lr,yr.valueOf=oi,yr._bubble=ni,yr.get=li,yr.milliseconds=ur,yr.seconds=dr,yr.minutes=cr,yr.hours=hr,yr.days=fr,yr.weeks=di,yr.months=gr,yr.years=mr,yr.humanize=mi,yr.toISOString=pi,yr.toString=pi,yr.toJSON=pi,yr.locale=gn,yr.localeData=mn,yr.toIsoString=M("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",pi),yr.lang=Ga,Z("X",0,0,"unix"),Z("x",0,0,"valueOf"),$("x",Ji),$("X",$i),it("X",function(t,e,n){n._d=new Date(1e3*parseFloat(t,10))}),it("x",function(t,e,n){n._d=new Date(_(t))}),t.version="2.17.1",i(xe),t.fn=Qa,t.min=_e,t.max=we,t.now=za,t.utc=h,t.unix=zn,t.months=Gn,t.isDate=l,t.locale=te,t.invalid=p,t.duration=He,t.isMoment=x,t.weekdays=Zn,t.parseZone=Nn,t.localeData=ie,t.isDuration=Me,t.monthsShort=qn,t.weekdaysMin=Jn,t.defineLocale=ee,t.updateLocale=ne,t.locales=ae,t.weekdaysShort=Xn,t.normalizeUnits=Y,t.relativeTimeRounding=fi,t.relativeTimeThreshold=gi,t.calendarFormat=Ze,t.prototype=Qa,t})},{}],7:[function(t,e,n){var i=t(28)();t(26)(i),t(42)(i),t(22)(i),t(31)(i),t(25)(i),t(21)(i),t(23)(i),t(24)(i),t(29)(i),t(33)(i),t(34)(i),t(32)(i),t(35)(i),t(30)(i),t(27)(i),t(36)(i),t(37)(i),t(38)(i),t(39)(i),t(40)(i),t(45)(i),t(43)(i),t(44)(i),t(46)(i),t(47)(i),t(48)(i),t(15)(i),t(16)(i),t(17)(i),t(18)(i),t(19)(i),t(20)(i),t(8)(i),t(9)(i),t(10)(i),t(11)(i),t(12)(i),t(13)(i),t(14)(i),window.Chart=e.exports=i},{10:10,11:11,12:12,13:13,14:14,15:15,16:16,17:17,18:18,19:19,20:20,21:21,22:22,23:23,24:24,25:25,26:26,27:27,28:28,29:29,30:30,31:31,32:32,33:33,34:34,35:35,36:36,37:37,38:38,39:39,40:40,42:42,43:43,44:44,45:45,46:46,47:47,48:48,8:8,9:9}],8:[function(t,e,n){"use strict";e.exports=function(t){t.Bar=function(e,n){return n.type="bar",new t(e,n)}}},{}],9:[function(t,e,n){"use strict";e.exports=function(t){t.Bubble=function(e,n){return n.type="bubble",new t(e,n)}}},{}],10:[function(t,e,n){"use strict";e.exports=function(t){t.Doughnut=function(e,n){return n.type="doughnut",new t(e,n)}}},{}],11:[function(t,e,n){"use strict";e.exports=function(t){t.Line=function(e,n){return n.type="line",new t(e,n)}}},{}],12:[function(t,e,n){"use strict";e.exports=function(t){t.PolarArea=function(e,n){return n.type="polarArea",new t(e,n)}}},{}],13:[function(t,e,n){"use strict";e.exports=function(t){t.Radar=function(e,n){return n.type="radar",new t(e,n)}}},{}],14:[function(t,e,n){"use strict";e.exports=function(t){var e={hover:{mode:"single"},scales:{xAxes:[{type:"linear",position:"bottom",id:"x-axis-1"}],yAxes:[{type:"linear",position:"left",id:"y-axis-1"}]},tooltips:{callbacks:{title:function(){return""},label:function(t){return"("+t.xLabel+", "+t.yLabel+")"}}}};t.defaults.scatter=e,t.controllers.scatter=t.controllers.line,t.Scatter=function(e,n){return n.type="scatter",new t(e,n)}}},{}],15:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.bar={hover:{mode:"label"},scales:{xAxes:[{type:"category",categoryPercentage:.8,barPercentage:.9,gridLines:{offsetGridLines:!0}}],yAxes:[{type:"linear"}]}},t.controllers.bar=t.DatasetController.extend({dataElementType:t.elements.Rectangle,initialize:function(e,n){t.DatasetController.prototype.initialize.call(this,e,n);var i=this,a=i.getMeta(),r=i.getDataset();a.stack=r.stack,a.bar=!0},getStackCount:function(){var t=this,n=t.getMeta(),i=t.getScaleForId(n.yAxisID),a=[];return e.each(t.chart.data.datasets,function(e,n){var r=t.chart.getDatasetMeta(n);r.bar&&t.chart.isDatasetVisible(n)&&(i.options.stacked===!1||i.options.stacked===!0&&a.indexOf(r.stack)===-1||void 0===i.options.stacked&&(void 0===r.stack||a.indexOf(r.stack)===-1))&&a.push(r.stack)},t),a.length},update:function(t){var n=this;e.each(n.getMeta().data,function(e,i){n.updateElement(e,i,t)},n)},updateElement:function(t,n,i){var a=this,r=a.getMeta(),o=a.getScaleForId(r.xAxisID),s=a.getScaleForId(r.yAxisID),l=s.getBasePixel(),u=a.chart.options.elements.rectangle,d=t.custom||{},c=a.getDataset();t._xScale=o,t._yScale=s,t._datasetIndex=a.index,t._index=n;var h=a.getRuler(n);t._model={x:a.calculateBarX(n,a.index,h),y:i?l:a.calculateBarY(n,a.index),label:a.chart.data.labels[n],datasetLabel:c.label,horizontal:!1,base:i?l:a.calculateBarBase(a.index,n),width:a.calculateBarWidth(h),backgroundColor:d.backgroundColor?d.backgroundColor:e.getValueAtIndexOrDefault(c.backgroundColor,n,u.backgroundColor),borderSkipped:d.borderSkipped?d.borderSkipped:u.borderSkipped,borderColor:d.borderColor?d.borderColor:e.getValueAtIndexOrDefault(c.borderColor,n,u.borderColor),borderWidth:d.borderWidth?d.borderWidth:e.getValueAtIndexOrDefault(c.borderWidth,n,u.borderWidth)},t.pivot()},calculateBarBase:function(t,e){var n=this,i=n.getMeta(),a=n.getScaleForId(i.yAxisID),r=a.getBaseValue(),o=r;if(a.options.stacked===!0||void 0===a.options.stacked&&void 0!==i.stack){for(var s=n.chart,l=s.data.datasets,u=Number(l[t].data[e]),d=0;d0&&(t[0].yLabel?n=t[0].yLabel:e.labels.length>0&&t[0].index');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r'),a[r]&&e.push(a[r]),e.push("");return e.push(""),e.join("")},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var r=t.getDatasetMeta(0),o=n.datasets[0],s=r.data[a],l=s&&s.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:u(o.backgroundColor,a,d.backgroundColor),h=l.borderColor?l.borderColor:u(o.borderColor,a,d.borderColor),f=l.borderWidth?l.borderWidth:u(o.borderWidth,a,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(o.data[a])||r.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n=Math.PI?-1:g<-Math.PI?1:0);var m=g+f,p={x:Math.cos(g),y:Math.sin(g)},v={x:Math.cos(m),y:Math.sin(m)},b=g<=0&&0<=m||g<=2*Math.PI&&2*Math.PI<=m,y=g<=.5*Math.PI&&.5*Math.PI<=m||g<=2.5*Math.PI&&2.5*Math.PI<=m,x=g<=-Math.PI&&-Math.PI<=m||g<=Math.PI&&Math.PI<=m,k=g<=.5*-Math.PI&&.5*-Math.PI<=m||g<=1.5*Math.PI&&1.5*Math.PI<=m,_=h/100,w={x:x?-1:Math.min(p.x*(p.x<0?1:_),v.x*(v.x<0?1:_)),y:k?-1:Math.min(p.y*(p.y<0?1:_),v.y*(v.y<0?1:_))},S={x:b?1:Math.max(p.x*(p.x>0?1:_),v.x*(v.x>0?1:_)),y:y?1:Math.max(p.y*(p.y>0?1:_),v.y*(v.y>0?1:_))},M={width:.5*(S.x-w.x),height:.5*(S.y-w.y)};u=Math.min(s/M.width,l/M.height),d={x:(S.x+w.x)*-.5,y:(S.y+w.y)*-.5}}i.borderWidth=n.getMaxBorderWidth(c.data),i.outerRadius=Math.max((u-i.borderWidth)/2,0),i.innerRadius=Math.max(h?i.outerRadius/100*h:0,0),i.radiusLength=(i.outerRadius-i.innerRadius)/i.getVisibleDatasetCount(),i.offsetX=d.x*i.outerRadius,i.offsetY=d.y*i.outerRadius,c.total=n.calculateTotal(),n.outerRadius=i.outerRadius-i.radiusLength*n.getRingIndex(n.index),n.innerRadius=Math.max(n.outerRadius-i.radiusLength,0),e.each(c.data,function(e,i){n.updateElement(e,i,t)})},updateElement:function(t,n,i){var a=this,r=a.chart,o=r.chartArea,s=r.options,l=s.animation,u=(o.left+o.right)/2,d=(o.top+o.bottom)/2,c=s.rotation,h=s.rotation,f=a.getDataset(),g=i&&l.animateRotate?0:t.hidden?0:a.calculateCircumference(f.data[n])*(s.circumference/(2*Math.PI)),m=i&&l.animateScale?0:a.innerRadius,p=i&&l.animateScale?0:a.outerRadius,v=e.getValueAtIndexOrDefault;e.extend(t,{_datasetIndex:a.index,_index:n,_model:{x:u+r.offsetX,y:d+r.offsetY,startAngle:c,endAngle:h,circumference:g,outerRadius:p,innerRadius:m,label:v(f.label,n,r.data.labels[n])}});var b=t._model;this.removeHoverStyle(t),i&&l.animateRotate||(0===n?b.startAngle=s.rotation:b.startAngle=a.getMeta().data[n-1]._model.endAngle,b.endAngle=b.startAngle+b.circumference),t.pivot()},removeHoverStyle:function(e){t.DatasetController.prototype.removeHoverStyle.call(this,e,this.chart.options.elements.arc)},calculateTotal:function(){var t,n=this.getDataset(),i=this.getMeta(),a=0;return e.each(i.data,function(e,i){t=n.data[i],isNaN(t)||e.hidden||(a+=Math.abs(t))}),a},calculateCircumference:function(t){var e=this.getMeta().total;return e>0&&!isNaN(t)?2*Math.PI*(t/e):0},getMaxBorderWidth:function(t){for(var e,n,i=0,a=this.index,r=t.length,o=0;oi?e:i,i=n>i?n:i;return i}})}},{}],18:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return n.getValueOrDefault(t.showLine,e.showLines)}var n=t.helpers;t.defaults.line={showLines:!0,spanGaps:!1,hover:{mode:"label"},scales:{xAxes:[{type:"category",id:"x-axis-0"}],yAxes:[{type:"linear",id:"y-axis-0"}]}},t.controllers.line=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,update:function(t){var i,a,r,o=this,s=o.getMeta(),l=s.dataset,u=s.data||[],d=o.chart.options,c=d.elements.line,h=o.getScaleForId(s.yAxisID),f=o.getDataset(),g=e(f,d);for(g&&(r=l.custom||{},void 0!==f.tension&&void 0===f.lineTension&&(f.lineTension=f.tension),l._scale=h,l._datasetIndex=o.index,l._children=u,l._model={spanGaps:f.spanGaps?f.spanGaps:d.spanGaps,tension:r.tension?r.tension:n.getValueOrDefault(f.lineTension,c.tension),backgroundColor:r.backgroundColor?r.backgroundColor:f.backgroundColor||c.backgroundColor,borderWidth:r.borderWidth?r.borderWidth:f.borderWidth||c.borderWidth,borderColor:r.borderColor?r.borderColor:f.borderColor||c.borderColor,borderCapStyle:r.borderCapStyle?r.borderCapStyle:f.borderCapStyle||c.borderCapStyle,borderDash:r.borderDash?r.borderDash:f.borderDash||c.borderDash,borderDashOffset:r.borderDashOffset?r.borderDashOffset:f.borderDashOffset||c.borderDashOffset,borderJoinStyle:r.borderJoinStyle?r.borderJoinStyle:f.borderJoinStyle||c.borderJoinStyle,fill:r.fill?r.fill:void 0!==f.fill?f.fill:c.fill,steppedLine:r.steppedLine?r.steppedLine:n.getValueOrDefault(f.steppedLine,c.stepped),cubicInterpolationMode:r.cubicInterpolationMode?r.cubicInterpolationMode:n.getValueOrDefault(f.cubicInterpolationMode,c.cubicInterpolationMode),scaleTop:h.top,scaleBottom:h.bottom,scaleZero:h.getBasePixel()},l.pivot()),i=0,a=u.length;i');var n=t.data,i=n.datasets,a=n.labels;if(i.length)for(var r=0;r'),a[r]&&e.push(a[r]),e.push("");return e.push(""),e.join(""); +},legend:{labels:{generateLabels:function(t){var n=t.data;return n.labels.length&&n.datasets.length?n.labels.map(function(i,a){var r=t.getDatasetMeta(0),o=n.datasets[0],s=r.data[a],l=s.custom||{},u=e.getValueAtIndexOrDefault,d=t.options.elements.arc,c=l.backgroundColor?l.backgroundColor:u(o.backgroundColor,a,d.backgroundColor),h=l.borderColor?l.borderColor:u(o.borderColor,a,d.borderColor),f=l.borderWidth?l.borderWidth:u(o.borderWidth,a,d.borderWidth);return{text:i,fillStyle:c,strokeStyle:h,lineWidth:f,hidden:isNaN(o.data[a])||r.data[a].hidden,index:a}}):[]}},onClick:function(t,e){var n,i,a,r=e.index,o=this.chart;for(n=0,i=(o.data.datasets||[]).length;n0&&!isNaN(t)?2*Math.PI/e:0}})}},{}],20:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.radar={aspectRatio:1,scale:{type:"radialLinear"},elements:{line:{tension:0}}},t.controllers.radar=t.DatasetController.extend({datasetElementType:t.elements.Line,dataElementType:t.elements.Point,linkScales:e.noop,update:function(t){var n=this,i=n.getMeta(),a=i.dataset,r=i.data,o=a.custom||{},s=n.getDataset(),l=n.chart.options.elements.line,u=n.chart.scale;void 0!==s.tension&&void 0===s.lineTension&&(s.lineTension=s.tension),e.extend(i.dataset,{_datasetIndex:n.index,_children:r,_loop:!0,_model:{tension:o.tension?o.tension:e.getValueOrDefault(s.lineTension,l.tension),backgroundColor:o.backgroundColor?o.backgroundColor:s.backgroundColor||l.backgroundColor,borderWidth:o.borderWidth?o.borderWidth:s.borderWidth||l.borderWidth,borderColor:o.borderColor?o.borderColor:s.borderColor||l.borderColor,fill:o.fill?o.fill:void 0!==s.fill?s.fill:l.fill,borderCapStyle:o.borderCapStyle?o.borderCapStyle:s.borderCapStyle||l.borderCapStyle,borderDash:o.borderDash?o.borderDash:s.borderDash||l.borderDash,borderDashOffset:o.borderDashOffset?o.borderDashOffset:s.borderDashOffset||l.borderDashOffset,borderJoinStyle:o.borderJoinStyle?o.borderJoinStyle:s.borderJoinStyle||l.borderJoinStyle,scaleTop:u.top,scaleBottom:u.bottom,scaleZero:u.getBasePosition()}}),i.dataset.pivot(),e.each(r,function(e,i){n.updateElement(e,i,t)},n),n.updateBezierControlPoints()},updateElement:function(t,n,i){var a=this,r=t.custom||{},o=a.getDataset(),s=a.chart.scale,l=a.chart.options.elements.point,u=s.getPointPositionForValue(n,o.data[n]);e.extend(t,{_datasetIndex:a.index,_index:n,_scale:s,_model:{x:i?s.xCenter:u.x,y:i?s.yCenter:u.y,tension:r.tension?r.tension:e.getValueOrDefault(o.lineTension,a.chart.options.elements.line.tension),radius:r.radius?r.radius:e.getValueAtIndexOrDefault(o.pointRadius,n,l.radius),backgroundColor:r.backgroundColor?r.backgroundColor:e.getValueAtIndexOrDefault(o.pointBackgroundColor,n,l.backgroundColor),borderColor:r.borderColor?r.borderColor:e.getValueAtIndexOrDefault(o.pointBorderColor,n,l.borderColor),borderWidth:r.borderWidth?r.borderWidth:e.getValueAtIndexOrDefault(o.pointBorderWidth,n,l.borderWidth),pointStyle:r.pointStyle?r.pointStyle:e.getValueAtIndexOrDefault(o.pointStyle,n,l.pointStyle),hitRadius:r.hitRadius?r.hitRadius:e.getValueAtIndexOrDefault(o.hitRadius,n,l.hitRadius)}}),t._model.skip=r.skip?r.skip:isNaN(t._model.x)||isNaN(t._model.y)},updateBezierControlPoints:function(){var t=this.chart.chartArea,n=this.getMeta();e.each(n.data,function(i,a){var r=i._model,o=e.splineCurve(e.previousItem(n.data,a,!0)._model,r,e.nextItem(n.data,a,!0)._model,r.tension);r.controlPointPreviousX=Math.max(Math.min(o.previous.x,t.right),t.left),r.controlPointPreviousY=Math.max(Math.min(o.previous.y,t.bottom),t.top),r.controlPointNextX=Math.max(Math.min(o.next.x,t.right),t.left),r.controlPointNextY=Math.max(Math.min(o.next.y,t.bottom),t.top),i.pivot()})},draw:function(t){var n=this.getMeta(),i=t||1;e.each(n.data,function(t){t.transition(i)}),n.dataset.transition(i).draw(),e.each(n.data,function(t){t.draw()})},setHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,r=t._model;r.radius=i.hoverRadius?i.hoverRadius:e.getValueAtIndexOrDefault(n.pointHoverRadius,a,this.chart.options.elements.point.hoverRadius),r.backgroundColor=i.hoverBackgroundColor?i.hoverBackgroundColor:e.getValueAtIndexOrDefault(n.pointHoverBackgroundColor,a,e.getHoverColor(r.backgroundColor)),r.borderColor=i.hoverBorderColor?i.hoverBorderColor:e.getValueAtIndexOrDefault(n.pointHoverBorderColor,a,e.getHoverColor(r.borderColor)),r.borderWidth=i.hoverBorderWidth?i.hoverBorderWidth:e.getValueAtIndexOrDefault(n.pointHoverBorderWidth,a,r.borderWidth)},removeHoverStyle:function(t){var n=this.chart.data.datasets[t._datasetIndex],i=t.custom||{},a=t._index,r=t._model,o=this.chart.options.elements.point;r.radius=i.radius?i.radius:e.getValueAtIndexOrDefault(n.radius,a,o.radius),r.backgroundColor=i.backgroundColor?i.backgroundColor:e.getValueAtIndexOrDefault(n.pointBackgroundColor,a,o.backgroundColor),r.borderColor=i.borderColor?i.borderColor:e.getValueAtIndexOrDefault(n.pointBorderColor,a,o.borderColor),r.borderWidth=i.borderWidth?i.borderWidth:e.getValueAtIndexOrDefault(n.pointBorderWidth,a,o.borderWidth)}})}},{}],21:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.animation={duration:1e3,easing:"easeOutQuart",onProgress:e.noop,onComplete:e.noop},t.Animation=t.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),t.animationService={frameDuration:17,animations:[],dropFrames:0,request:null,addAnimation:function(t,e,n,i){var a=this;i||(t.animating=!0);for(var r=0;r1&&(n=Math.floor(t.dropFrames),t.dropFrames=t.dropFrames%1);for(var i=0;it.animations[i].animationObject.numSteps&&(t.animations[i].animationObject.currentStep=t.animations[i].animationObject.numSteps),t.animations[i].animationObject.render(t.animations[i].chartInstance,t.animations[i].animationObject),t.animations[i].animationObject.onAnimationProgress&&t.animations[i].animationObject.onAnimationProgress.call&&t.animations[i].animationObject.onAnimationProgress.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].animationObject.currentStep===t.animations[i].animationObject.numSteps?(t.animations[i].animationObject.onAnimationComplete&&t.animations[i].animationObject.onAnimationComplete.call&&t.animations[i].animationObject.onAnimationComplete.call(t.animations[i].chartInstance,t.animations[i]),t.animations[i].chartInstance.animating=!1,t.animations.splice(i,1)):++i;var a=Date.now(),r=(a-e)/t.frameDuration;t.dropFrames+=r,t.animations.length>0&&t.requestAnimationFrame()}}}},{}],22:[function(t,e,n){"use strict";e.exports=function(t){var e=t.canvasHelpers={};e.drawPoint=function(e,n,i,a,r){var o,s,l,u,d,c;if("object"==typeof n&&(o=n.toString(),"[object HTMLImageElement]"===o||"[object HTMLCanvasElement]"===o))return void e.drawImage(n,a-n.width/2,r-n.height/2);if(!(isNaN(i)||i<=0)){switch(n){default:e.beginPath(),e.arc(a,r,i,0,2*Math.PI),e.closePath(),e.fill();break;case"triangle":e.beginPath(),s=3*i/Math.sqrt(3),d=s*Math.sqrt(3)/2,e.moveTo(a-s/2,r+d/3),e.lineTo(a+s/2,r+d/3),e.lineTo(a,r-2*d/3),e.closePath(),e.fill();break;case"rect":c=1/Math.SQRT2*i,e.beginPath(),e.fillRect(a-c,r-c,2*c,2*c),e.strokeRect(a-c,r-c,2*c,2*c);break;case"rectRounded":var h=i/Math.SQRT2,f=a-h,g=r-h,m=Math.SQRT2*i;t.helpers.drawRoundedRectangle(e,f,g,m,m,i/2),e.fill();break;case"rectRot":c=1/Math.SQRT2*i,e.beginPath(),e.moveTo(a-c,r),e.lineTo(a,r+c),e.lineTo(a+c,r),e.lineTo(a,r-c),e.closePath(),e.fill();break;case"cross":e.beginPath(),e.moveTo(a,r+i),e.lineTo(a,r-i),e.moveTo(a-i,r),e.lineTo(a+i,r),e.closePath();break;case"crossRot":e.beginPath(),l=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(a-l,r-u),e.lineTo(a+l,r+u),e.moveTo(a-l,r+u),e.lineTo(a+l,r-u),e.closePath();break;case"star":e.beginPath(),e.moveTo(a,r+i),e.lineTo(a,r-i),e.moveTo(a-i,r),e.lineTo(a+i,r),l=Math.cos(Math.PI/4)*i,u=Math.sin(Math.PI/4)*i,e.moveTo(a-l,r-u),e.lineTo(a+l,r+u),e.moveTo(a-l,r+u),e.lineTo(a+l,r-u),e.closePath();break;case"line":e.beginPath(),e.moveTo(a-i,r),e.lineTo(a+i,r),e.closePath();break;case"dash":e.beginPath(),e.moveTo(a,r),e.lineTo(a+i,r),e.closePath()}e.stroke()}},e.clipArea=function(t,e){t.save(),t.beginPath(),t.rect(e.left,e.top,e.right-e.left,e.bottom-e.top),t.clip()},e.unclipArea=function(t){t.restore()}}},{}],23:[function(t,e,n){"use strict";e.exports=function(t){function e(e){e=e||{};var n=e.data=e.data||{};return n.datasets=n.datasets||[],n.labels=n.labels||[],e.options=i.configMerge(t.defaults.global,t.defaults[e.type],e.options||{}),e}function n(t){var e=t.options;e.scale?t.scale.options=e.scale:e.scales&&e.scales.xAxes.concat(e.scales.yAxes).forEach(function(e){t.scales[e.id].options=e}),t.tooltip._options=e.tooltips}var i=t.helpers,a=t.plugins,r=t.platform;t.types={},t.instances={},t.controllers={},t.Controller=function(n,a,o){var s=this;a=e(a);var l=r.acquireContext(n,a),u=l&&l.canvas,d=u&&u.height,c=u&&u.width;return o.ctx=l,o.canvas=u,o.config=a,o.width=c,o.height=d,o.aspectRatio=d?c/d:null,s.id=i.uid(),s.chart=o,s.config=a,s.options=a.options,s._bufferedRender=!1,t.instances[s.id]=s,Object.defineProperty(s,"data",{get:function(){return s.config.data}}),l&&u?(s.initialize(),s.update(),s):(console.error("Failed to create chart: can't acquire context from the given item"),s)},i.extend(t.Controller.prototype,{initialize:function(){var t=this;return a.notify(t,"beforeInit"),i.retinaScale(t.chart),t.bindEvents(),t.options.responsive&&t.resize(!0),t.ensureScalesHaveIDs(),t.buildScales(),t.initToolTip(),a.notify(t,"afterInit"),t},clear:function(){return i.clear(this.chart),this},stop:function(){return t.animationService.cancelAnimation(this),this},resize:function(t){var e=this,n=e.chart,r=e.options,o=n.canvas,s=r.maintainAspectRatio&&n.aspectRatio||null,l=Math.floor(i.getMaximumWidth(o)),u=Math.floor(s?l/s:i.getMaximumHeight(o));if((n.width!==l||n.height!==u)&&(o.width=n.width=l,o.height=n.height=u,o.style.width=l+"px",o.style.height=u+"px",i.retinaScale(n),!t)){var d={width:l,height:u};a.notify(e,"resize",[d]),e.options.onResize&&e.options.onResize(e,d),e.stop(),e.update(e.options.responsiveAnimationDuration)}},ensureScalesHaveIDs:function(){var t=this.options,e=t.scales||{},n=t.scale;i.each(e.xAxes,function(t,e){t.id=t.id||"x-axis-"+e}),i.each(e.yAxes,function(t,e){t.id=t.id||"y-axis-"+e}),n&&(n.id=n.id||"scale")},buildScales:function(){var e=this,n=e.options,a=e.scales={},r=[];n.scales&&(r=r.concat((n.scales.xAxes||[]).map(function(t){return{options:t,dtype:"category"}}),(n.scales.yAxes||[]).map(function(t){return{options:t,dtype:"linear"}}))),n.scale&&r.push({options:n.scale,dtype:"radialLinear",isDefault:!0}),i.each(r,function(n){var r=n.options,o=i.getValueOrDefault(r.type,n.dtype),s=t.scaleService.getScaleConstructor(o);if(s){var l=new s({id:r.id,options:r,ctx:e.chart.ctx,chart:e});a[l.id]=l,n.isDefault&&(e.scale=l)}}),t.scaleService.addScalesToLayout(this)},buildOrUpdateControllers:function(){var e=this,n=[],a=[];if(i.each(e.data.datasets,function(i,r){var o=e.getDatasetMeta(r);o.type||(o.type=i.type||e.config.type),n.push(o.type),o.controller?o.controller.updateIndex(r):(o.controller=new t.controllers[o.type](e,r),a.push(o.controller))},e),n.length>1)for(var r=1;r0||(a.forEach(function(e){delete t[e]}),delete t._chartjs)}}var i=t.helpers,a=["push","pop","shift","splice","unshift"];t.DatasetController=function(t,e){this.initialize(t,e)},i.extend(t.DatasetController.prototype,{datasetElementType:null,dataElementType:null,initialize:function(t,e){var n=this;n.chart=t,n.index=e,n.linkScales(),n.addElements()},updateIndex:function(t){this.index=t},linkScales:function(){var t=this,e=t.getMeta(),n=t.getDataset();null===e.xAxisID&&(e.xAxisID=n.xAxisID||t.chart.options.scales.xAxes[0].id),null===e.yAxisID&&(e.yAxisID=n.yAxisID||t.chart.options.scales.yAxes[0].id)},getDataset:function(){return this.chart.data.datasets[this.index]},getMeta:function(){return this.chart.getDatasetMeta(this.index)},getScaleForId:function(t){return this.chart.scales[t]},reset:function(){this.update(!0)},destroy:function(){this._data&&n(this._data,this)},createMetaDataset:function(){var t=this,e=t.datasetElementType;return e&&new e({_chart:t.chart.chart,_datasetIndex:t.index})},createMetaData:function(t){var e=this,n=e.dataElementType;return n&&new n({_chart:e.chart.chart,_datasetIndex:e.index,_index:t})},addElements:function(){var t,e,n=this,i=n.getMeta(),a=n.getDataset().data||[],r=i.data;for(t=0,e=a.length;ti&&t.insertElements(i,a-i)},insertElements:function(t,e){for(var n=0;n=0;a--)e.call(n,t[a],a);else for(a=0;a=i[n].length||!i[n][a].type?i[n].push(r.configMerge(s,e)):e.type&&e.type!==i[n][a].type?i[n][a]=r.configMerge(i[n][a],s,e):i[n][a]=r.configMerge(i[n][a],e)}):(i[n]=[],r.each(e,function(e){var a=r.getValueOrDefault(e.type,"xAxes"===n?"category":"linear");i[n].push(r.configMerge(t.scaleService.getScaleDefaults(a),e))})):i.hasOwnProperty(n)&&"object"==typeof i[n]&&null!==i[n]&&"object"==typeof e?i[n]=r.configMerge(i[n],e):i[n]=e}),i},r.getValueAtIndexOrDefault=function(t,e,n){return void 0===t||null===t?n:r.isArray(t)?e=0;i--){var a=t[i];if(e(a))return a}},r.inherits=function(t){var e=this,n=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return e.apply(this,arguments)},i=function(){this.constructor=n};return i.prototype=e.prototype,n.prototype=new i,n.extend=r.inherits,t&&r.extend(n.prototype,t),n.__super__=e.prototype,n},r.noop=function(){},r.uid=function(){var t=0;return function(){return t++}}(),r.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},r.almostEquals=function(t,e,n){return Math.abs(t-e)t},r.max=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.max(t,e)},Number.NEGATIVE_INFINITY)},r.min=function(t){return t.reduce(function(t,e){return isNaN(e)?t:Math.min(t,e)},Number.POSITIVE_INFINITY)},r.sign=Math.sign?function(t){return Math.sign(t)}:function(t){return t=+t,0===t||isNaN(t)?t:t>0?1:-1},r.log10=Math.log10?function(t){return Math.log10(t)}:function(t){return Math.log(t)/Math.LN10},r.toRadians=function(t){return t*(Math.PI/180)},r.toDegrees=function(t){return t*(180/Math.PI)},r.getAngleFromPoint=function(t,e){var n=e.x-t.x,i=e.y-t.y,a=Math.sqrt(n*n+i*i),r=Math.atan2(i,n);return r<-.5*Math.PI&&(r+=2*Math.PI),{angle:r,distance:a}},r.distanceBetweenPoints=function(t,e){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))},r.aliasPixel=function(t){return t%2===0?0:.5},r.splineCurve=function(t,e,n,i){var a=t.skip?e:t,r=e,o=n.skip?e:n,s=Math.sqrt(Math.pow(r.x-a.x,2)+Math.pow(r.y-a.y,2)),l=Math.sqrt(Math.pow(o.x-r.x,2)+Math.pow(o.y-r.y,2)),u=s/(s+l),d=l/(s+l);u=isNaN(u)?0:u,d=isNaN(d)?0:d;var c=i*u,h=i*d;return{previous:{x:r.x-c*(o.x-a.x),y:r.y-c*(o.y-a.y)},next:{x:r.x+h*(o.x-a.x),y:r.y+h*(o.y-a.y)}}},r.EPSILON=Number.EPSILON||1e-14,r.splineCurveMonotone=function(t){var e,n,i,a,o=(t||[]).map(function(t){return{model:t._model,deltaK:0,mK:0}}),s=o.length;for(e=0;e0?o[e-1]:null,a=e0?o[e-1]:null,a=e=t.length-1?t[0]:t[e+1]:e>=t.length-1?t[t.length-1]:t[e+1]},r.previousItem=function(t,e,n){return n?e<=0?t[t.length-1]:t[e-1]:e<=0?t[0]:t[e-1]},r.niceNum=function(t,e){var n,i=Math.floor(r.log10(t)),a=t/Math.pow(10,i);return n=e?a<1.5?1:a<3?2:a<7?5:10:a<=1?1:a<=2?2:a<=5?5:10,n*Math.pow(10,i)};var o=r.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var e=1.70158,n=0,i=1;return 0===t?0:1===(t/=1)?1:(n||(n=.3),i0?(n=l[0].clientX,i=l[0].clientY):(n=a.clientX,i=a.clientY);var u=parseFloat(r.getStyle(o,"padding-left")),d=parseFloat(r.getStyle(o,"padding-top")),c=parseFloat(r.getStyle(o,"padding-right")),h=parseFloat(r.getStyle(o,"padding-bottom")),f=s.right-s.left-u-c,g=s.bottom-s.top-d-h;return n=Math.round((n-s.left-u)/f*o.width/e.currentDevicePixelRatio),i=Math.round((i-s.top-d)/g*o.height/e.currentDevicePixelRatio),{x:n,y:i}},r.addEvent=function(t,e,n){t.addEventListener?t.addEventListener(e,n):t.attachEvent?t.attachEvent("on"+e,n):t["on"+e]=n},r.removeEvent=function(t,e,n){t.removeEventListener?t.removeEventListener(e,n,!1):t.detachEvent?t.detachEvent("on"+e,n):t["on"+e]=r.noop},r.getConstraintWidth=function(t){return a(t,"max-width","clientWidth")},r.getConstraintHeight=function(t){return a(t,"max-height","clientHeight")},r.getMaximumWidth=function(t){var e=t.parentNode,n=parseInt(r.getStyle(e,"padding-left"),10),i=parseInt(r.getStyle(e,"padding-right"),10),a=e.clientWidth-n-i,o=r.getConstraintWidth(t);return isNaN(o)?a:Math.min(a,o)},r.getMaximumHeight=function(t){var e=t.parentNode,n=parseInt(r.getStyle(e,"padding-top"),10),i=parseInt(r.getStyle(e,"padding-bottom"),10),a=e.clientHeight-n-i,o=r.getConstraintHeight(t);return isNaN(o)?a:Math.min(a,o)},r.getStyle=function(t,e){return t.currentStyle?t.currentStyle[e]:document.defaultView.getComputedStyle(t,null).getPropertyValue(e)},r.retinaScale=function(t){var e=t.currentDevicePixelRatio=window.devicePixelRatio||1;if(1!==e){var n=t.canvas,i=t.height,a=t.width;n.height=i*e,n.width=a*e,t.ctx.scale(e,e),n.style.height=i+"px",n.style.width=a+"px"}},r.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},r.fontString=function(t,e,n){return e+" "+t+"px "+n},r.longestText=function(t,e,n,i){i=i||{};var a=i.data=i.data||{},o=i.garbageCollect=i.garbageCollect||[];i.font!==e&&(a=i.data={},o=i.garbageCollect=[],i.font=e),t.font=e;var s=0;r.each(n,function(e){void 0!==e&&null!==e&&r.isArray(e)!==!0?s=r.measureText(t,a,o,s,e):r.isArray(e)&&r.each(e,function(e){void 0===e||null===e||r.isArray(e)||(s=r.measureText(t,a,o,s,e))})});var l=o.length/2;if(l>n.length){for(var u=0;ui&&(i=r),i},r.numberOfLabelLines=function(t){var e=1;return r.each(t,function(t){r.isArray(t)&&t.length>e&&(e=t.length)}),e},r.drawRoundedRectangle=function(t,e,n,i,a,r){t.beginPath(),t.moveTo(e+r,n),t.lineTo(e+i-r,n),t.quadraticCurveTo(e+i,n,e+i,n+r),t.lineTo(e+i,n+a-r),t.quadraticCurveTo(e+i,n+a,e+i-r,n+a),t.lineTo(e+r,n+a),t.quadraticCurveTo(e,n+a,e,n+a-r),t.lineTo(e,n+r),t.quadraticCurveTo(e,n,e+r,n),t.closePath()},r.color=function(e){return i?i(e instanceof CanvasGradient?t.defaults.global.defaultColor:e):(console.error("Color.js not found!"),e)},r.isArray=Array.isArray?function(t){return Array.isArray(t)}:function(t){return"[object Array]"===Object.prototype.toString.call(t)},r.arrayEquals=function(t,e){var n,i,a,o;if(!t||!e||t.length!==e.length)return!1;for(n=0,i=t.length;n0&&(s=t.getDatasetMeta(s[0]._datasetIndex).data),s},"x-axis":function(t,e){return r(t,e,!0)},point:function(t,n){var a=e(n,t.chart);return i(t,a)},nearest:function(t,n,i){var r=e(n,t.chart),o=a(t,r,i.intersect);return o.length>1&&o.sort(function(t,e){var n=t.getArea(),i=e.getArea(),a=n-i;return 0===a&&(a=t._datasetIndex-e._datasetIndex),a}),o.slice(0,1)},x:function(t,i,a){var r=e(i,t.chart),o=[],s=!1;return n(t,function(t){t.inXRange(r.x)&&o.push(t),t.inRange(r.x,r.y)&&(s=!0)}),a.intersect&&!s&&(o=[]),o},y:function(t,i,a){var r=e(i,t.chart),o=[],s=!1;return n(t,function(t){t.inYRange(r.y)&&o.push(t),t.inRange(r.x,r.y)&&(s=!0)}),a.intersect&&!s&&(o=[]),o}}}}},{}],28:[function(t,e,n){"use strict";e.exports=function(){var t=function(e,n){return this.controller=new t.Controller(e,n,this),this.controller};return t.defaults={global:{responsive:!0,responsiveAnimationDuration:0,maintainAspectRatio:!0,events:["mousemove","mouseout","click","touchstart","touchmove"],hover:{onHover:null,mode:"nearest",intersect:!0,animationDuration:400},onClick:null,defaultColor:"rgba(0,0,0,0.1)",defaultFontColor:"#666",defaultFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",defaultFontSize:12,defaultFontStyle:"normal",showLines:!0,elements:{},legendCallback:function(t){var e=[];e.push('
      ');for(var n=0;n'),t.data.datasets[n].label&&e.push(t.data.datasets[n].label),e.push("");return e.push("
    "),e.join("")}}},t.Chart=t,t}},{}],29:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.layoutService={defaults:{},addBox:function(t,e){t.boxes||(t.boxes=[]),t.boxes.push(e)},removeBox:function(t,e){t.boxes&&t.boxes.splice(t.boxes.indexOf(e),1)},update:function(t,n,i){function a(t){var e,n=t.isHorizontal();n?(e=t.update(t.options.fullWidth?y:M,S),D-=e.height):(e=t.update(w,_),M-=e.width),C.push({horizontal:n,minSize:e,box:t})}function r(t){var n=e.findNextWhere(C,function(e){return e.box===t});if(n)if(t.isHorizontal()){var i={left:Math.max(F,T),right:Math.max(O,P),top:0,bottom:0};t.update(t.options.fullWidth?y:M,x/2,i)}else t.update(n.minSize.width,D)}function o(t){var n=e.findNextWhere(C,function(e){return e.box===t}),i={left:0,right:0,top:R,bottom:L};n&&t.update(n.minSize.width,D,i)}function s(t){t.isHorizontal()?(t.left=t.options.fullWidth?d:F,t.right=t.options.fullWidth?n-c:F+M,t.top=N,t.bottom=N+t.height,N=t.bottom):(t.left=z,t.right=z+t.width,t.top=R,t.bottom=R+D,z=t.right)}if(t){var l=t.options.layout,u=l?l.padding:null,d=0,c=0,h=0,f=0;isNaN(u)?(d=u.left||0,c=u.right||0,h=u.top||0,f=u.bottom||0):(d=u,c=u,h=u,f=u);var g=e.where(t.boxes,function(t){return"left"===t.options.position}),m=e.where(t.boxes,function(t){return"right"===t.options.position}),p=e.where(t.boxes,function(t){return"top"===t.options.position}),v=e.where(t.boxes,function(t){return"bottom"===t.options.position}),b=e.where(t.boxes,function(t){return"chartArea"===t.options.position});p.sort(function(t,e){return(e.options.fullWidth?1:0)-(t.options.fullWidth?1:0)}),v.sort(function(t,e){return(t.options.fullWidth?1:0)-(e.options.fullWidth?1:0)});var y=n-d-c,x=i-h-f,k=y/2,_=x/2,w=(n-k)/(g.length+m.length),S=(i-_)/(p.length+v.length),M=y,D=x,C=[];e.each(g.concat(m,p,v),a);var T=0,P=0,I=0,A=0;e.each(p.concat(v),function(t){if(t.getPadding){var e=t.getPadding();T=Math.max(T,e.left),P=Math.max(P,e.right)}}),e.each(g.concat(m),function(t){if(t.getPadding){var e=t.getPadding();I=Math.max(I,e.top),A=Math.max(A,e.bottom)}});var F=d,O=c,R=h,L=f;e.each(g.concat(m),r),e.each(g,function(t){F+=t.width}),e.each(m,function(t){O+=t.width}),e.each(p.concat(v),r),e.each(p,function(t){R+=t.height}),e.each(v,function(t){L+=t.height}),e.each(g.concat(m),o),F=d,O=c,R=h,L=f,e.each(g,function(t){F+=t.width}),e.each(m,function(t){O+=t.width}),e.each(p,function(t){R+=t.height}),e.each(v,function(t){L+=t.height});var V=Math.max(T-F,0);F+=V,O+=Math.max(P-O,0);var W=Math.max(I-R,0);R+=W,L+=Math.max(A-L,0);var Y=i-R-L,B=n-F-O;B===M&&Y===D||(e.each(g,function(t){t.height=Y}),e.each(m,function(t){t.height=Y}),e.each(p,function(t){t.options.fullWidth||(t.width=B)}),e.each(v,function(t){t.options.fullWidth||(t.width=B)}),D=Y,M=B);var z=d+V,N=h+W;e.each(g.concat(p),s),z+=M,N+=D,e.each(m,s),e.each(v,s),t.chartArea={left:F,top:R,right:F+M,bottom:R+D},e.each(b,function(e){e.left=t.chartArea.left,e.top=t.chartArea.top,e.right=t.chartArea.right,e.bottom=t.chartArea.bottom,e.update(M,D)})}}}}},{}],30:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}function n(e,n){var i=new t.Legend({ctx:e.chart.ctx,options:n,chart:e});e.legend=i,t.layoutService.addBox(e,i)}var i=t.helpers,a=i.noop;t.defaults.global.legend={display:!0,position:"top",fullWidth:!0,reverse:!1,onClick:function(t,e){var n=e.datasetIndex,i=this.chart,a=i.getDatasetMeta(n);a.hidden=null===a.hidden?!i.data.datasets[n].hidden:null,i.update()},onHover:null,labels:{boxWidth:40,padding:10,generateLabels:function(t){var e=t.data;return i.isArray(e.datasets)?e.datasets.map(function(e,n){return{text:e.label,fillStyle:i.isArray(e.backgroundColor)?e.backgroundColor[0]:e.backgroundColor,hidden:!t.isDatasetVisible(n),lineCap:e.borderCapStyle,lineDash:e.borderDash,lineDashOffset:e.borderDashOffset,lineJoin:e.borderJoinStyle,lineWidth:e.borderWidth,strokeStyle:e.borderColor,pointStyle:e.pointStyle,datasetIndex:n}},this):[]}}},t.Legend=t.Element.extend({initialize:function(t){i.extend(this,t),this.legendHitBoxes=[],this.doughnutMode=!1},beforeUpdate:a,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:a,beforeSetDimensions:a,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:a,beforeBuildLabels:a,buildLabels:function(){var t=this,e=t.options.labels,n=e.generateLabels.call(t,t.chart);e.filter&&(n=n.filter(function(n){return e.filter(n,t.chart.data)})),t.options.reverse&&n.reverse(),t.legendItems=n},afterBuildLabels:a,beforeFit:a,fit:function(){var n=this,a=n.options,r=a.labels,o=a.display,s=n.ctx,l=t.defaults.global,u=i.getValueOrDefault,d=u(r.fontSize,l.defaultFontSize),c=u(r.fontStyle,l.defaultFontStyle),h=u(r.fontFamily,l.defaultFontFamily),f=i.fontString(d,c,h),g=n.legendHitBoxes=[],m=n.minSize,p=n.isHorizontal();if(p?(m.width=n.maxWidth,m.height=o?10:0):(m.width=o?10:0,m.height=n.maxHeight),o)if(s.font=f,p){var v=n.lineWidths=[0],b=n.legendItems.length?d+r.padding:0;s.textAlign="left",s.textBaseline="top",i.each(n.legendItems,function(t,i){var a=e(r,d),o=a+d/2+s.measureText(t.text).width;v[v.length-1]+o+r.padding>=n.width&&(b+=d+r.padding,v[v.length]=n.left),g[i]={left:0,top:0,width:o,height:d},v[v.length-1]+=o+r.padding}),m.height+=b}else{var y=r.padding,x=n.columnWidths=[],k=r.padding,_=0,w=0,S=d+y;i.each(n.legendItems,function(t,n){var i=e(r,d),a=i+d/2+s.measureText(t.text).width;w+S>m.height&&(k+=_+r.padding,x.push(_),_=0,w=0),_=Math.max(_,a),w+=S,g[n]={left:0,top:0,width:a,height:d}}),k+=_,x.push(_),m.width+=k}n.width=m.width,n.height=m.height},afterFit:a,isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},draw:function(){var n=this,a=n.options,r=a.labels,o=t.defaults.global,s=o.elements.line,l=n.width,u=n.lineWidths;if(a.display){var d,c=n.ctx,h=i.getValueOrDefault,f=h(r.fontColor,o.defaultFontColor),g=h(r.fontSize,o.defaultFontSize),m=h(r.fontStyle,o.defaultFontStyle),p=h(r.fontFamily,o.defaultFontFamily),v=i.fontString(g,m,p);c.textAlign="left",c.textBaseline="top",c.lineWidth=.5,c.strokeStyle=f,c.fillStyle=f,c.font=v;var b=e(r,g),y=n.legendHitBoxes,x=function(e,n,i){if(!(isNaN(b)||b<=0)){c.save(),c.fillStyle=h(i.fillStyle,o.defaultColor),c.lineCap=h(i.lineCap,s.borderCapStyle),c.lineDashOffset=h(i.lineDashOffset,s.borderDashOffset),c.lineJoin=h(i.lineJoin,s.borderJoinStyle),c.lineWidth=h(i.lineWidth,s.borderWidth),c.strokeStyle=h(i.strokeStyle,o.defaultColor);var r=0===h(i.lineWidth,s.borderWidth);if(c.setLineDash&&c.setLineDash(h(i.lineDash,s.borderDash)),a.labels&&a.labels.usePointStyle){var l=g*Math.SQRT2/2,u=l/Math.SQRT2,d=e+u,f=n+u;t.canvasHelpers.drawPoint(c,i.pointStyle,l,d,f)}else r||c.strokeRect(e,n,b,g),c.fillRect(e,n,b,g);c.restore()}},k=function(t,e,n,i){c.fillText(n.text,b+g/2+t,e),n.hidden&&(c.beginPath(),c.lineWidth=2,c.moveTo(b+g/2+t,e+g/2),c.lineTo(b+g/2+t+i,e+g/2),c.stroke())},_=n.isHorizontal();d=_?{x:n.left+(l-u[0])/2,y:n.top+r.padding,line:0}:{x:n.left+r.padding,y:n.top+r.padding,line:0};var w=g+r.padding;i.each(n.legendItems,function(t,e){var i=c.measureText(t.text).width,a=b+g/2+i,o=d.x,s=d.y;_?o+a>=l&&(s=d.y+=w,d.line++,o=d.x=n.left+(l-u[d.line])/2):s+w>n.bottom&&(o=d.x=o+n.columnWidths[d.line]+r.padding,s=d.y=n.top+r.padding,d.line++),x(o,s,t),y[e].left=o,y[e].top=s,k(o,s,t,i),_?d.x+=a+r.padding:d.y+=w})}},handleEvent:function(t){var e=this,n=e.options,i="mouseup"===t.type?"click":t.type,a=!1;if("mousemove"===i){if(!n.onHover)return}else{if("click"!==i)return;if(!n.onClick)return}var r=t.x,o=t.y;if(r>=e.left&&r<=e.right&&o>=e.top&&o<=e.bottom)for(var s=e.legendHitBoxes,l=0;l=u.left&&r<=u.left+u.width&&o>=u.top&&o<=u.top+u.height){if("click"===i){n.onClick.call(e,t.native,e.legendItems[l]),a=!0;break}if("mousemove"===i){n.onHover.call(e,t.native,e.legendItems[l]),a=!0;break}}}return a}}),t.plugins.register({beforeInit:function(t){var e=t.options.legend;e&&n(t,e)},beforeUpdate:function(e){var a=e.options.legend;a?(a=i.configMerge(t.defaults.global.legend,a),e.legend?e.legend.options=a:n(e,a)):(t.layoutService.removeBox(e,e.legend),delete e.legend)},afterEvent:function(t,e){var n=t.legend;n&&n.handleEvent(e)}})}},{}],31:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers;t.defaults.global.plugins={},t.plugins={_plugins:[],_cacheId:0,register:function(t){var e=this._plugins;[].concat(t).forEach(function(t){e.indexOf(t)===-1&&e.push(t)}),this._cacheId++},unregister:function(t){var e=this._plugins;[].concat(t).forEach(function(t){var n=e.indexOf(t);n!==-1&&e.splice(n,1)}),this._cacheId++},clear:function(){this._plugins=[],this._cacheId++},count:function(){return this._plugins.length},getAll:function(){return this._plugins},notify:function(t,e,n){var i,a,r,o,s,l=this.descriptors(t),u=l.length;for(i=0;ic&&ot.maxHeight){o--;break}o++,d=s*u}t.labelRotation=o},afterCalculateTickRotation:function(){i.callCallback(this.options.afterCalculateTickRotation,[this])},beforeFit:function(){i.callCallback(this.options.beforeFit,[this])},fit:function(){var t=this,a=t.minSize={width:0,height:0},r=t.options,o=r.ticks,s=r.scaleLabel,l=r.gridLines,u=r.display,d=t.isHorizontal(),c=n(o),h=1.5*n(s).size,f=r.gridLines.tickMarkLength;if(d?a.width=t.isFullWidth()?t.maxWidth-t.margins.left-t.margins.right:t.maxWidth:a.width=u&&l.drawTicks?f:0,d?a.height=u&&l.drawTicks?f:0:a.height=t.maxHeight,s.display&&u&&(d?a.height+=h:a.width+=h),o.display&&u){var g=i.longestText(t.ctx,c.font,t.ticks,t.longestTextCache),m=i.numberOfLabelLines(t.ticks),p=.5*c.size;if(d){t.longestLabelWidth=g;var v=i.toRadians(t.labelRotation),b=Math.cos(v),y=Math.sin(v),x=y*g+c.size*m+p*m;a.height=Math.min(t.maxHeight,a.height+x),t.ctx.font=c.font;var k=t.ticks[0],_=e(t.ctx,k,c.font),w=t.ticks[t.ticks.length-1],S=e(t.ctx,w,c.font);0!==t.labelRotation?(t.paddingLeft="bottom"===r.position?b*_+3:b*p+3,t.paddingRight="bottom"===r.position?b*p+3:b*S+3):(t.paddingLeft=_/2+3,t.paddingRight=S/2+3)}else o.mirror?g=0:g+=t.options.ticks.padding,a.width+=g,t.paddingTop=c.size/2,t.paddingBottom=c.size/2}t.handleMargins(),t.width=a.width,t.height=a.height},handleMargins:function(){var t=this;t.margins&&(t.paddingLeft=Math.max(t.paddingLeft-t.margins.left,0),t.paddingTop=Math.max(t.paddingTop-t.margins.top,0),t.paddingRight=Math.max(t.paddingRight-t.margins.right,0),t.paddingBottom=Math.max(t.paddingBottom-t.margins.bottom,0))},afterFit:function(){i.callCallback(this.options.afterFit,[this])},isHorizontal:function(){return"top"===this.options.position||"bottom"===this.options.position},isFullWidth:function(){return this.options.fullWidth},getRightValue:function(t){return null===t||"undefined"==typeof t?NaN:"number"!=typeof t||isFinite(t)?"object"==typeof t?t instanceof Date||t.isValid?t:this.getRightValue(this.isHorizontal()?t.x:t.y):t:NaN},getLabelForIndex:i.noop,getPixelForValue:i.noop,getValueForPixel:i.noop,getPixelForTick:function(t,e){var n=this;if(n.isHorizontal()){var i=n.width-(n.paddingLeft+n.paddingRight),a=i/Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),r=a*t+n.paddingLeft;e&&(r+=a/2);var o=n.left+Math.round(r);return o+=n.isFullWidth()?n.margins.left:0}var s=n.height-(n.paddingTop+n.paddingBottom);return n.top+t*(s/(n.ticks.length-1))},getPixelForDecimal:function(t){var e=this;if(e.isHorizontal()){var n=e.width-(e.paddingLeft+e.paddingRight),i=n*t+e.paddingLeft,a=e.left+Math.round(i);return a+=e.isFullWidth()?e.margins.left:0}return e.top+t*e.height},getBasePixel:function(){return this.getPixelForValue(this.getBaseValue())},getBaseValue:function(){var t=this,e=t.min,n=t.max;return t.beginAtZero?0:e<0&&n<0?n:e>0&&n>0?e:0},draw:function(e){var a=this,r=a.options;if(r.display){var o,s,l=a.ctx,u=t.defaults.global,d=r.ticks,c=r.gridLines,h=r.scaleLabel,f=0!==a.labelRotation,g=d.autoSkip,m=a.isHorizontal();d.maxTicksLimit&&(s=d.maxTicksLimit);var p=i.getValueOrDefault(d.fontColor,u.defaultFontColor),v=n(d),b=c.drawTicks?c.tickMarkLength:0,y=i.getValueOrDefault(c.borderDash,u.borderDash),x=i.getValueOrDefault(c.borderDashOffset,u.borderDashOffset),k=i.getValueOrDefault(h.fontColor,u.defaultFontColor),_=n(h),w=i.toRadians(a.labelRotation),S=Math.cos(w),M=a.longestLabelWidth*S;l.fillStyle=p;var D=[];if(m){if(o=!1,f&&(M/=2),(M+d.autoSkipPadding)*a.ticks.length>a.width-(a.paddingLeft+a.paddingRight)&&(o=1+Math.floor((M+d.autoSkipPadding)*a.ticks.length/(a.width-(a.paddingLeft+a.paddingRight)))),s&&a.ticks.length>s)for(;!o||a.ticks.length/(o||1)>s;)o||(o=1),o+=1;g||(o=!1)}var C="right"===r.position?a.left:a.right-b,T="right"===r.position?a.left+b:a.right,P="bottom"===r.position?a.top:a.bottom-b,I="bottom"===r.position?a.top+b:a.bottom;if(i.each(a.ticks,function(t,n){if(void 0!==t&&null!==t){var s=a.ticks.length===n+1,l=o>1&&n%o>0||n%o===0&&n+o>=a.ticks.length;if((!l||s)&&void 0!==t&&null!==t){var u,h;n===("undefined"!=typeof a.zeroLineIndex?a.zeroLineIndex:0)?(u=c.zeroLineWidth,h=c.zeroLineColor):(u=i.getValueAtIndexOrDefault(c.lineWidth,n),h=i.getValueAtIndexOrDefault(c.color,n));var g,p,v,k,_,S,M,A,F,O,R="middle",L="middle";if(m){"bottom"===r.position?(L=f?"middle":"top",R=f?"right":"center",O=a.top+b):(L=f?"middle":"bottom",R=f?"left":"center",O=a.bottom-b);var V=a.getPixelForTick(n)+i.aliasPixel(u);F=a.getPixelForTick(n,c.offsetGridLines)+d.labelOffset,g=v=_=M=V,p=P,k=I,S=e.top,A=e.bottom}else{var W,Y="left"===r.position,B=d.padding;d.mirror?(R=Y?"left":"right",W=B):(R=Y?"right":"left",W=b+B),F=Y?a.right-W:a.left+W;var z=a.getPixelForTick(n);z+=i.aliasPixel(u),O=a.getPixelForTick(n,c.offsetGridLines),g=C,v=T,_=e.left,M=e.right,p=k=S=A=z}D.push({tx1:g,ty1:p,tx2:v,ty2:k,x1:_,y1:S,x2:M,y2:A,labelX:F,labelY:O,glWidth:u,glColor:h,glBorderDash:y,glBorderDashOffset:x,rotation:-1*w,label:t,textBaseline:L,textAlign:R})}}}),i.each(D,function(t){if(c.display&&(l.save(),l.lineWidth=t.glWidth,l.strokeStyle=t.glColor,l.setLineDash&&(l.setLineDash(t.glBorderDash),l.lineDashOffset=t.glBorderDashOffset),l.beginPath(),c.drawTicks&&(l.moveTo(t.tx1,t.ty1),l.lineTo(t.tx2,t.ty2)),c.drawOnChartArea&&(l.moveTo(t.x1,t.y1),l.lineTo(t.x2,t.y2)),l.stroke(),l.restore()),d.display){l.save(),l.translate(t.labelX,t.labelY),l.rotate(t.rotation),l.font=v.font,l.textBaseline=t.textBaseline,l.textAlign=t.textAlign;var e=t.label;if(i.isArray(e))for(var n=0,a=0;n0)i=t.stepSize;else{var r=e.niceNum(n.max-n.min,!1);i=e.niceNum(r/(t.maxTicks-1),!0)}var o=Math.floor(n.min/i)*i,s=Math.ceil(n.max/i)*i;t.min&&t.max&&t.stepSize&&e.almostWhole((t.max-t.min)/t.stepSize,i/1e3)&&(o=t.min,s=t.max);var l=(s-o)/i;l=e.almostEquals(l,Math.round(l),i/1e3)?Math.round(l):Math.ceil(l),a.push(void 0!==t.min?t.min:o);for(var u=1;u3?i[2]-i[1]:i[1]-i[0];Math.abs(a)>1&&t!==Math.floor(t)&&(a=t-Math.floor(t));var r=e.log10(Math.abs(a)),o="";if(0!==t){var s=-1*Math.floor(r);s=Math.max(Math.min(s,20),0),o=t.toFixed(s)}else o="0";return o},logarithmic:function(t,n,i){var a=t/Math.pow(10,Math.floor(e.log10(t)));return 0===t?"0":1===a||2===a||5===a||0===n||n===i.length-1?t.toExponential():""}}}}},{}],35:[function(t,e,n){"use strict";e.exports=function(t){function e(e,n){var i=new t.Title({ctx:e.chart.ctx,options:n,chart:e});e.titleBlock=i,t.layoutService.addBox(e,i)}var n=t.helpers;t.defaults.global.title={display:!1,position:"top",fullWidth:!0,fontStyle:"bold",padding:10,text:""};var i=n.noop;t.Title=t.Element.extend({initialize:function(t){var e=this;n.extend(e,t),e.legendHitBoxes=[]},beforeUpdate:i,update:function(t,e,n){var i=this;return i.beforeUpdate(),i.maxWidth=t,i.maxHeight=e,i.margins=n,i.beforeSetDimensions(),i.setDimensions(),i.afterSetDimensions(),i.beforeBuildLabels(),i.buildLabels(),i.afterBuildLabels(),i.beforeFit(),i.fit(),i.afterFit(),i.afterUpdate(),i.minSize},afterUpdate:i,beforeSetDimensions:i,setDimensions:function(){var t=this;t.isHorizontal()?(t.width=t.maxWidth,t.left=0,t.right=t.width):(t.height=t.maxHeight,t.top=0,t.bottom=t.height),t.paddingLeft=0,t.paddingTop=0,t.paddingRight=0,t.paddingBottom=0,t.minSize={width:0,height:0}},afterSetDimensions:i,beforeBuildLabels:i,buildLabels:i,afterBuildLabels:i,beforeFit:i,fit:function(){var e=this,i=n.getValueOrDefault,a=e.options,r=t.defaults.global,o=a.display,s=i(a.fontSize,r.defaultFontSize),l=e.minSize;e.isHorizontal()?(l.width=e.maxWidth,l.height=o?s+2*a.padding:0):(l.width=o?s+2*a.padding:0,l.height=e.maxHeight),e.width=l.width,e.height=l.height},afterFit:i,isHorizontal:function(){var t=this.options.position;return"top"===t||"bottom"===t},draw:function(){var e=this,i=e.ctx,a=n.getValueOrDefault,r=e.options,o=t.defaults.global;if(r.display){var s,l,u,d=a(r.fontSize,o.defaultFontSize),c=a(r.fontStyle,o.defaultFontStyle),h=a(r.fontFamily,o.defaultFontFamily),f=n.fontString(d,c,h),g=0,m=e.top,p=e.left,v=e.bottom,b=e.right;i.fillStyle=a(r.fontColor,o.defaultFontColor),i.font=f,e.isHorizontal()?(s=p+(b-p)/2,l=m+(v-m)/2,u=b-p):(s="left"===r.position?p+d/2:b-d/2,l=m+(v-m)/2,u=v-m,g=Math.PI*("left"===r.position?-.5:.5)),i.save(),i.translate(s,l),i.rotate(g),i.textAlign="center",i.textBaseline="middle",i.fillText(r.text,0,0,u),i.restore()}}}),t.plugins.register({beforeInit:function(t){var n=t.options.title;n&&e(t,n)},beforeUpdate:function(i){var a=i.options.title;a?(a=n.configMerge(t.defaults.global.title,a),i.titleBlock?i.titleBlock.options=a:e(i,a)):(t.layoutService.removeBox(i,i.titleBlock),delete i.titleBlock)}})}},{}],36:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){var n=l.color(t);return n.alpha(e*n.alpha()).rgbaString()}function n(t,e){return e&&(l.isArray(e)?Array.prototype.push.apply(t,e):t.push(e)),t}function i(t){var e=t._xScale,n=t._yScale||t._scale,i=t._index,a=t._datasetIndex;return{xLabel:e?e.getLabelForIndex(i,a):"",yLabel:n?n.getLabelForIndex(i,a):"",index:i,datasetIndex:a,x:t._model.x,y:t._model.y}}function a(e){var n=t.defaults.global,i=l.getValueOrDefault;return{xPadding:e.xPadding,yPadding:e.yPadding,xAlign:e.xAlign,yAlign:e.yAlign,bodyFontColor:e.bodyFontColor,_bodyFontFamily:i(e.bodyFontFamily,n.defaultFontFamily),_bodyFontStyle:i(e.bodyFontStyle,n.defaultFontStyle),_bodyAlign:e.bodyAlign,bodyFontSize:i(e.bodyFontSize,n.defaultFontSize),bodySpacing:e.bodySpacing,titleFontColor:e.titleFontColor,_titleFontFamily:i(e.titleFontFamily,n.defaultFontFamily),_titleFontStyle:i(e.titleFontStyle,n.defaultFontStyle),titleFontSize:i(e.titleFontSize,n.defaultFontSize),_titleAlign:e.titleAlign,titleSpacing:e.titleSpacing, +titleMarginBottom:e.titleMarginBottom,footerFontColor:e.footerFontColor,_footerFontFamily:i(e.footerFontFamily,n.defaultFontFamily),_footerFontStyle:i(e.footerFontStyle,n.defaultFontStyle),footerFontSize:i(e.footerFontSize,n.defaultFontSize),_footerAlign:e.footerAlign,footerSpacing:e.footerSpacing,footerMarginTop:e.footerMarginTop,caretSize:e.caretSize,cornerRadius:e.cornerRadius,backgroundColor:e.backgroundColor,opacity:0,legendColorBackground:e.multiKeyBackground,displayColors:e.displayColors}}function r(t,e){var n=t._chart.ctx,i=2*e.yPadding,a=0,r=e.body,o=r.reduce(function(t,e){return t+e.before.length+e.lines.length+e.after.length},0);o+=e.beforeBody.length+e.afterBody.length;var s=e.title.length,u=e.footer.length,d=e.titleFontSize,c=e.bodyFontSize,h=e.footerFontSize;i+=s*d,i+=s?(s-1)*e.titleSpacing:0,i+=s?e.titleMarginBottom:0,i+=o*c,i+=o?(o-1)*e.bodySpacing:0,i+=u?e.footerMarginTop:0,i+=u*h,i+=u?(u-1)*e.footerSpacing:0;var f=0,g=function(t){a=Math.max(a,n.measureText(t).width+f)};return n.font=l.fontString(d,e._titleFontStyle,e._titleFontFamily),l.each(e.title,g),n.font=l.fontString(c,e._bodyFontStyle,e._bodyFontFamily),l.each(e.beforeBody.concat(e.afterBody),g),f=e.displayColors?c+2:0,l.each(r,function(t){l.each(t.before,g),l.each(t.lines,g),l.each(t.after,g)}),f=0,n.font=l.fontString(h,e._footerFontStyle,e._footerFontFamily),l.each(e.footer,g),a+=2*e.xPadding,{width:a,height:i}}function o(t,e){var n=t._model,i=t._chart,a=t._chartInstance.chartArea,r="center",o="center";n.yi.height-e.height&&(o="bottom");var s,l,u,d,c,h=(a.left+a.right)/2,f=(a.top+a.bottom)/2;"center"===o?(s=function(t){return t<=h},l=function(t){return t>h}):(s=function(t){return t<=e.width/2},l=function(t){return t>=i.width-e.width/2}),u=function(t){return t+e.width>i.width},d=function(t){return t-e.width<0},c=function(t){return t<=f?"top":"bottom"},s(n.x)?(r="left",u(n.x)&&(r="center",o=c(n.y))):l(n.x)&&(r="right",d(n.x)&&(r="center",o=c(n.y)));var g=t._options;return{xAlign:g.xAlign?g.xAlign:r,yAlign:g.yAlign?g.yAlign:o}}function s(t,e,n){var i=t.x,a=t.y,r=t.caretSize,o=t.caretPadding,s=t.cornerRadius,l=n.xAlign,u=n.yAlign,d=r+o,c=s+o;return"right"===l?i-=e.width:"center"===l&&(i-=e.width/2),"top"===u?a+=d:a-="bottom"===u?e.height+d:e.height/2,"center"===u?"left"===l?i+=d:"right"===l&&(i-=d):"left"===l?i-=c:"right"===l&&(i+=c),{x:i,y:a}}var l=t.helpers;t.defaults.global.tooltips={enabled:!0,custom:null,mode:"nearest",position:"average",intersect:!0,backgroundColor:"rgba(0,0,0,0.8)",titleFontStyle:"bold",titleSpacing:2,titleMarginBottom:6,titleFontColor:"#fff",titleAlign:"left",bodySpacing:2,bodyFontColor:"#fff",bodyAlign:"left",footerFontStyle:"bold",footerSpacing:2,footerMarginTop:6,footerFontColor:"#fff",footerAlign:"left",yPadding:6,xPadding:6,caretSize:5,cornerRadius:6,multiKeyBackground:"#fff",displayColors:!0,callbacks:{beforeTitle:l.noop,title:function(t,e){var n="",i=e.labels,a=i?i.length:0;if(t.length>0){var r=t[0];r.xLabel?n=r.xLabel:a>0&&r.indexl;)r-=2*Math.PI;for(;r=s&&r<=l,d=o>=i.innerRadius&&o<=i.outerRadius;return u&&d}return!1},getCenterPoint:function(){var t=this._view,e=(t.startAngle+t.endAngle)/2,n=(t.innerRadius+t.outerRadius)/2;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},getArea:function(){var t=this._view;return Math.PI*((t.endAngle-t.startAngle)/(2*Math.PI))*(Math.pow(t.outerRadius,2)-Math.pow(t.innerRadius,2))},tooltipPosition:function(){var t=this._view,e=t.startAngle+(t.endAngle-t.startAngle)/2,n=(t.outerRadius-t.innerRadius)/2+t.innerRadius;return{x:t.x+Math.cos(e)*n,y:t.y+Math.sin(e)*n}},draw:function(){var t=this._chart.ctx,e=this._view,n=e.startAngle,i=e.endAngle;t.beginPath(),t.arc(e.x,e.y,e.outerRadius,n,i),t.arc(e.x,e.y,e.innerRadius,i,n,!0),t.closePath(),t.strokeStyle=e.borderColor,t.lineWidth=e.borderWidth,t.fillStyle=e.backgroundColor,t.fill(),t.lineJoin="bevel",e.borderWidth&&t.stroke()}})}},{}],38:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=t.defaults.global;t.defaults.global.elements.line={tension:.4,backgroundColor:n.defaultColor,borderWidth:3,borderColor:n.defaultColor,borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",capBezierPoints:!0,fill:!0},t.elements.Line=t.Element.extend({draw:function(){function t(t,e){var n=e._view;e._view.steppedLine===!0?(l.lineTo(n.x,t._view.y),l.lineTo(n.x,n.y)):0===e._view.tension?l.lineTo(n.x,n.y):l.bezierCurveTo(t._view.controlPointNextX,t._view.controlPointNextY,n.controlPointPreviousX,n.controlPointPreviousY,n.x,n.y)}var i=this,a=i._view,r=a.spanGaps,o=a.scaleZero,s=i._loop;s||("top"===a.fill?o=a.scaleTop:"bottom"===a.fill&&(o=a.scaleBottom));var l=i._chart.ctx;l.save();var u=i._children.slice(),d=-1;s&&u.length&&u.push(u[0]);var c,h,f,g;if(u.length&&a.fill){for(l.beginPath(),c=0;ce?1:-1,o=1,s=u.borderSkipped||"left"):(e=u.x-u.width/2,n=u.x+u.width/2,i=u.y,a=u.base,r=1,o=a>i?1:-1,s=u.borderSkipped||"bottom"),d){var c=Math.min(Math.abs(e-n),Math.abs(i-a));d=d>c?c:d;var h=d/2,f=e+("left"!==s?h*r:0),g=n+("right"!==s?-h*r:0),m=i+("top"!==s?h*o:0),p=a+("bottom"!==s?-h*o:0);f!==g&&(i=m,a=p),m!==p&&(e=f,n=g)}l.beginPath(),l.fillStyle=u.backgroundColor,l.strokeStyle=u.borderColor,l.lineWidth=d;var v=[[e,a],[e,i],[n,i],[n,a]],b=["bottom","left","top","right"],y=b.indexOf(s,0);y===-1&&(y=0);var x=t(0);l.moveTo(x[0],x[1]);for(var k=1;k<4;k++)x=t(k),l.lineTo(x[0],x[1]);l.fill(),d&&l.stroke()},height:function(){var t=this._view;return t.base-t.y},inRange:function(t,e){var i=!1;if(this._view){var a=n(this);i=t>=a.left&&t<=a.right&&e>=a.top&&e<=a.bottom}return i},inLabelRange:function(t,i){var a=this;if(!a._view)return!1;var r=!1,o=n(a);return r=e(a)?t>=o.left&&t<=o.right:i>=o.top&&i<=o.bottom},inXRange:function(t){var e=n(this);return t>=e.left&&t<=e.right},inYRange:function(t){var e=n(this);return t>=e.top&&t<=e.bottom},getCenterPoint:function(){var t,n,i=this._view;return e(this)?(t=i.x,n=(i.y+i.base)/2):(t=(i.x+i.base)/2,n=i.y),{x:t,y:n}},getArea:function(){var t=this._view;return t.width*Math.abs(t.y-t.base)},tooltipPosition:function(){var t=this._view;return{x:t.x,y:t.y}}})}},{}],41:[function(t,e,n){"use strict";e.exports=function(t){function e(t,e){var n=l.getStyle(t,e),i=n&&n.match(/(\d+)px/);return i?Number(i[1]):void 0}function n(t,n){var i=t.style,a=t.getAttribute("height"),r=t.getAttribute("width");if(t._chartjs={initial:{height:a,width:r,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",null===r||""===r){var o=e(t,"width");void 0!==o&&(t.width=o)}if(null===a||""===a)if(""===t.style.height)t.height=t.width/(n.options.aspectRatio||2);else{var s=e(t,"height");void 0!==o&&(t.height=s)}return t}function i(t,e,n,i,a){return{type:t,chart:e,native:a||null,x:void 0!==n?n:null,y:void 0!==i?i:null}}function a(t,e){var n=u[t.type]||t.type,a=l.getRelativePosition(t,e);return i(n,e,a.x,a.y,t)}function r(t){var e=document.createElement("iframe");return e.className="chartjs-hidden-iframe",e.style.cssText="display:block;overflow:hidden;border:0;margin:0;top:0;left:0;bottom:0;right:0;height:100%;width:100%;position:absolute;pointer-events:none;z-index:-1;",e.tabIndex=-1,l.addEvent(e,"load",function(){l.addEvent(e.contentWindow||e,"resize",t),t()}),e}function o(t,e,n){var a=t._chartjs={ticking:!1},o=function(){a.ticking||(a.ticking=!0,l.requestAnimFrame.call(window,function(){if(a.resizer)return a.ticking=!1,e(i("resize",n))}))};a.resizer=r(o),t.insertBefore(a.resizer,t.firstChild)}function s(t){if(t&&t._chartjs){var e=t._chartjs.resizer;e&&(e.parentNode.removeChild(e),t._chartjs.resizer=null),delete t._chartjs}}var l=t.helpers,u={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"};return{acquireContext:function(t,e){if("string"==typeof t?t=document.getElementById(t):t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t instanceof HTMLCanvasElement){var i=t.getContext&&t.getContext("2d");if(i instanceof CanvasRenderingContext2D)return n(t,e),i}return null},releaseContext:function(t){var e=t.canvas;if(e._chartjs){var n=e._chartjs.initial;["height","width"].forEach(function(t){var i=n[t];void 0===i||null===i?e.removeAttribute(t):e.setAttribute(t,i)}),l.each(n.style||{},function(t,n){e.style[n]=t}),e.width=e.width,delete e._chartjs}},addEventListener:function(t,e,n){var i=t.chart.canvas;if("resize"===e)return void o(i.parentNode,n,t.chart);var r=n._chartjs||(n._chartjs={}),s=r.proxies||(r.proxies={}),u=s[t.id+"_"+e]=function(e){n(a(e,t.chart))};l.addEvent(i,e,u)},removeEventListener:function(t,e,n){var i=t.chart.canvas;if("resize"===e)return void s(i.parentNode,n);var a=n._chartjs||{},r=a.proxies||{},o=r[t.id+"_"+e];o&&l.removeEvent(i,e,o)}}}},{}],42:[function(t,e,n){"use strict";var i=t(41);e.exports=function(t){t.platform={acquireContext:function(){},releaseContext:function(){},addEventListener:function(){},removeEventListener:function(){}},t.helpers.extend(t.platform,i(t))}},{41:41}],43:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"bottom"},i=t.Scale.extend({getLabels:function(){var t=this.chart.data;return(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels},determineDataLimits:function(){var t=this,n=t.getLabels();t.minIndex=0,t.maxIndex=n.length-1;var i;void 0!==t.options.ticks.min&&(i=e.indexOf(n,t.options.ticks.min),t.minIndex=i!==-1?i:t.minIndex),void 0!==t.options.ticks.max&&(i=e.indexOf(n,t.options.ticks.max),t.maxIndex=i!==-1?i:t.maxIndex),t.min=n[t.minIndex],t.max=n[t.maxIndex]},buildTicks:function(){var t=this,e=t.getLabels();t.ticks=0===t.minIndex&&t.maxIndex===e.length-1?e:e.slice(t.minIndex,t.maxIndex+1)},getLabelForIndex:function(t,e){var n=this,i=n.chart.data,a=n.isHorizontal();return i.yLabels&&!a?n.getRightValue(i.datasets[e].data[t]):n.ticks[t-n.minIndex]},getPixelForValue:function(t,e,n,i){var a=this,r=Math.max(a.maxIndex+1-a.minIndex-(a.options.gridLines.offsetGridLines?0:1),1);if(void 0!==t&&isNaN(e)){var o=a.getLabels(),s=o.indexOf(t);e=s!==-1?s:e}if(a.isHorizontal()){var l=a.width/r,u=l*(e-a.minIndex);return(a.options.gridLines.offsetGridLines&&i||a.maxIndex===a.minIndex&&i)&&(u+=l/2),a.left+Math.round(u)}var d=a.height/r,c=d*(e-a.minIndex);return a.options.gridLines.offsetGridLines&&i&&(c+=d/2),a.top+Math.round(c)},getPixelForTick:function(t,e){return this.getPixelForValue(this.ticks[t],t+this.minIndex,null,e)},getValueForPixel:function(t){var e,n=this,i=Math.max(n.ticks.length-(n.options.gridLines.offsetGridLines?0:1),1),a=n.isHorizontal(),r=(a?n.width:n.height)/i;return t-=a?n.left:n.top,n.options.gridLines.offsetGridLines&&(t-=r/2),e=t<=0?0:Math.round(t/r)},getBasePixel:function(){return this.bottom}});t.scaleService.registerScaleType("category",i,n)}},{}],44:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:t.Ticks.formatters.linear}},i=t.LinearScaleBase.extend({determineDataLimits:function(){function t(t){return s?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=n.chart,r=a.data,o=r.datasets,s=n.isHorizontal();n.min=null,n.max=null;var l=i.stacked;if(void 0===l&&e.each(o,function(e,n){if(!l){var i=a.getDatasetMeta(n);a.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(l=!0)}}),i.stacked||l){var u={};e.each(o,function(r,o){var s=a.getDatasetMeta(o),l=[s.type,void 0===i.stacked&&void 0===s.stack?o:"",s.stack].join(".");void 0===u[l]&&(u[l]={positiveValues:[],negativeValues:[]});var d=u[l].positiveValues,c=u[l].negativeValues;a.isDatasetVisible(o)&&t(s)&&e.each(r.data,function(t,e){var a=+n.getRightValue(t);isNaN(a)||s.data[e].hidden||(d[e]=d[e]||0,c[e]=c[e]||0,i.relativePoints?d[e]=100:a<0?c[e]+=a:d[e]+=a)})}),e.each(u,function(t){var i=t.positiveValues.concat(t.negativeValues),a=e.min(i),r=e.max(i);n.min=null===n.min?a:Math.min(n.min,a),n.max=null===n.max?r:Math.max(n.max,r)})}else e.each(o,function(i,r){var o=a.getDatasetMeta(r);a.isDatasetVisible(r)&&t(o)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||o.data[e].hidden||(null===n.min?n.min=i:in.max&&(n.max=i))})});this.handleTickRangeOptions()},getTickLimit:function(){var n,i=this,a=i.options.ticks;if(i.isHorizontal())n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.width/50));else{var r=e.getValueOrDefault(a.fontSize,t.defaults.global.defaultFontSize);n=Math.min(a.maxTicksLimit?a.maxTicksLimit:11,Math.ceil(i.height/(2*r)))}return n},handleDirectionalChanges:function(){this.isHorizontal()||this.ticks.reverse()},getLabelForIndex:function(t,e){return+this.getRightValue(this.chart.data.datasets[e].data[t])},getPixelForValue:function(t){var e,n=this,i=n.start,a=+n.getRightValue(t),r=n.end-i;return n.isHorizontal()?(e=n.left+n.width/r*(a-i),Math.round(e)):(e=n.bottom-n.height/r*(a-i),Math.round(e))},getValueForPixel:function(t){var e=this,n=e.isHorizontal(),i=n?e.width:e.height,a=(n?t-e.left:e.bottom-t)/i;return e.start+(e.end-e.start)*a},getPixelForTick:function(t){return this.getPixelForValue(this.ticksAsNumbers[t])}});t.scaleService.registerScaleType("linear",i,n)}},{}],45:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n=e.noop;t.LinearScaleBase=t.Scale.extend({handleTickRangeOptions:function(){var t=this,n=t.options,i=n.ticks;if(i.beginAtZero){var a=e.sign(t.min),r=e.sign(t.max);a<0&&r<0?t.max=0:a>0&&r>0&&(t.min=0)}void 0!==i.min?t.min=i.min:void 0!==i.suggestedMin&&(t.min=Math.min(t.min,i.suggestedMin)),void 0!==i.max?t.max=i.max:void 0!==i.suggestedMax&&(t.max=Math.max(t.max,i.suggestedMax)),t.min===t.max&&(t.max++,i.beginAtZero||t.min--)},getTickLimit:n,handleDirectionalChanges:n,buildTicks:function(){var n=this,i=n.options,a=i.ticks,r=n.getTickLimit();r=Math.max(2,r);var o={maxTicks:r,min:a.min,max:a.max,stepSize:e.getValueOrDefault(a.fixedStepSize,a.stepSize)},s=n.ticks=t.Ticks.generators.linear(o,n);n.handleDirectionalChanges(),n.max=e.max(s),n.min=e.min(s),a.reverse?(s.reverse(),n.start=n.max,n.end=n.min):(n.start=n.min,n.end=n.max)},convertTicksToLabels:function(){var e=this;e.ticksAsNumbers=e.ticks.slice(),e.zeroLineIndex=e.ticks.indexOf(0),t.Scale.prototype.convertTicksToLabels.call(e)}})}},{}],46:[function(t,e,n){"use strict";e.exports=function(t){var e=t.helpers,n={position:"left",ticks:{callback:t.Ticks.formatters.logarithmic}},i=t.Scale.extend({determineDataLimits:function(){function t(t){return u?t.xAxisID===n.id:t.yAxisID===n.id}var n=this,i=n.options,a=i.ticks,r=n.chart,o=r.data,s=o.datasets,l=e.getValueOrDefault,u=n.isHorizontal();n.min=null,n.max=null,n.minNotZero=null;var d=i.stacked;if(void 0===d&&e.each(s,function(e,n){if(!d){var i=r.getDatasetMeta(n);r.isDatasetVisible(n)&&t(i)&&void 0!==i.stack&&(d=!0)}}),i.stacked||d){var c={};e.each(s,function(a,o){var s=r.getDatasetMeta(o),l=[s.type,void 0===i.stacked&&void 0===s.stack?o:"",s.stack].join(".");r.isDatasetVisible(o)&&t(s)&&(void 0===c[l]&&(c[l]=[]),e.each(a.data,function(t,e){var a=c[l],r=+n.getRightValue(t);isNaN(r)||s.data[e].hidden||(a[e]=a[e]||0,i.relativePoints?a[e]=100:a[e]+=r)}))}),e.each(c,function(t){var i=e.min(t),a=e.max(t);n.min=null===n.min?i:Math.min(n.min,i),n.max=null===n.max?a:Math.max(n.max,a)})}else e.each(s,function(i,a){var o=r.getDatasetMeta(a);r.isDatasetVisible(a)&&t(o)&&e.each(i.data,function(t,e){var i=+n.getRightValue(t);isNaN(i)||o.data[e].hidden||(null===n.min?n.min=i:in.max&&(n.max=i),0!==i&&(null===n.minNotZero||ia?{start:e-n-5,end:e}:{start:e,end:e+n+5}}function r(t){var r,o,s,l=n(t),u=Math.min(t.height/2,t.width/2),d={l:t.width,r:0,t:t.height,b:0},c={};t.ctx.font=l.font,t._pointLabelSizes=[];var h=e(t);for(r=0;rd.r&&(d.r=p.end,c.r=g),v.startd.b&&(d.b=v.end,c.b=g)}t.setReductions(u,d,c)}function o(t){var e=Math.min(t.height/2,t.width/2);t.drawingArea=Math.round(e),t.setCenterPoint(0,0,0,0)}function s(t){return 0===t||180===t?"center":t<180?"left":"right"}function l(t,e,n,i){if(f.isArray(e))for(var a=n.y,r=1.5*i,o=0;o270||t<90)&&(n.y-=e.h)}function d(t){var i=t.ctx,a=f.getValueOrDefault,r=t.options,o=r.angleLines,d=r.pointLabels;i.lineWidth=o.lineWidth,i.strokeStyle=o.color;var c=t.getDistanceFromCenterForValue(r.reverse?t.min:t.max),h=n(t);i.textBaseline="top";for(var m=e(t)-1;m>=0;m--){if(o.display){var p=t.getPointPosition(m,c);i.beginPath(),i.moveTo(t.xCenter,t.yCenter),i.lineTo(p.x,p.y),i.stroke(),i.closePath()}var v=t.getPointPosition(m,c+5),b=a(d.fontColor,g.defaultFontColor);i.font=h.font,i.fillStyle=b;var y=t.getIndexAngle(m),x=f.toDegrees(y);i.textAlign=s(x),u(x,t._pointLabelSizes[m],v),l(i,t.pointLabels[m]||"",v,h.size)}}function c(t,n,i,a){var r=t.ctx;if(r.strokeStyle=f.getValueAtIndexOrDefault(n.color,a-1),r.lineWidth=f.getValueAtIndexOrDefault(n.lineWidth,a-1),t.options.lineArc)r.beginPath(),r.arc(t.xCenter,t.yCenter,i,0,2*Math.PI),r.closePath(),r.stroke();else{var o=e(t);if(0===o)return;r.beginPath();var s=t.getPointPosition(0,i);r.moveTo(s.x,s.y);for(var l=1;l0&&n>0?e:0)},draw:function(){var t=this,e=t.options,n=e.gridLines,i=e.ticks,a=f.getValueOrDefault; +if(e.display){var r=t.ctx,o=a(i.fontSize,g.defaultFontSize),s=a(i.fontStyle,g.defaultFontStyle),l=a(i.fontFamily,g.defaultFontFamily),u=f.fontString(o,s,l);f.each(t.ticks,function(s,l){if(l>0||e.reverse){var d=t.getDistanceFromCenterForValue(t.ticksAsNumbers[l]),h=t.yCenter-d;if(n.display&&0!==l&&c(t,n,d,l),i.display){var f=a(i.fontColor,g.defaultFontColor);if(r.font=u,i.showLabelBackdrop){var m=r.measureText(s).width;r.fillStyle=i.backdropColor,r.fillRect(t.xCenter-m/2-i.backdropPaddingX,h-o/2-i.backdropPaddingY,m+2*i.backdropPaddingX,o+2*i.backdropPaddingY)}r.textAlign="center",r.textBaseline="middle",r.fillStyle=f,r.fillText(s,t.xCenter,h)}}}),e.lineArc||d(t)}}});t.scaleService.registerScaleType("radialLinear",p,m)}},{}],48:[function(t,e,n){"use strict";var i=t(6);i="function"==typeof i?i:window.moment,e.exports=function(t){var e=t.helpers,n={units:[{name:"millisecond",steps:[1,2,5,10,20,50,100,250,500]},{name:"second",steps:[1,2,5,10,30]},{name:"minute",steps:[1,2,5,10,30]},{name:"hour",steps:[1,2,3,6,12]},{name:"day",steps:[1,2,5]},{name:"week",maxStep:4},{name:"month",maxStep:3},{name:"quarter",maxStep:4},{name:"year",maxStep:!1}]},a={position:"bottom",time:{parser:!1,format:!1,unit:!1,round:!1,displayFormat:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{millisecond:"h:mm:ss.SSS a",second:"h:mm:ss a",minute:"h:mm:ss a",hour:"MMM D, hA",day:"ll",week:"ll",month:"MMM YYYY",quarter:"[Q]Q - YYYY",year:"YYYY"}},ticks:{autoSkip:!1}},r=t.Scale.extend({initialize:function(){if(!i)throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com");t.Scale.prototype.initialize.call(this)},getLabelMoment:function(t,e){return null===t||null===e?null:"undefined"!=typeof this.labelMoments[t]?this.labelMoments[t][e]:null},getLabelDiff:function(t,e){var n=this;return null===t||null===e?null:(void 0===n.labelDiffs&&n.buildLabelDiffs(),"undefined"!=typeof n.labelDiffs[t]?n.labelDiffs[t][e]:null)},getMomentStartOf:function(t){var e=this;return"week"===e.options.time.unit&&e.options.time.isoWeekday!==!1?t.clone().startOf("isoWeek").isoWeekday(e.options.time.isoWeekday):t.clone().startOf(e.tickUnit)},determineDataLimits:function(){var t=this;t.labelMoments=[];var n=[];t.chart.data.labels&&t.chart.data.labels.length>0?(e.each(t.chart.data.labels,function(e){var i=t.parseTime(e);i.isValid()&&(t.options.time.round&&i.startOf(t.options.time.round),n.push(i))},t),t.firstTick=i.min.call(t,n),t.lastTick=i.max.call(t,n)):(t.firstTick=null,t.lastTick=null),e.each(t.chart.data.datasets,function(a,r){var o=[],s=t.chart.isDatasetVisible(r);"object"==typeof a.data[0]&&null!==a.data[0]?e.each(a.data,function(e){var n=t.parseTime(t.getRightValue(e));n.isValid()&&(t.options.time.round&&n.startOf(t.options.time.round),o.push(n),s&&(t.firstTick=null!==t.firstTick?i.min(t.firstTick,n):n,t.lastTick=null!==t.lastTick?i.max(t.lastTick,n):n))},t):o=n,t.labelMoments.push(o)},t),t.options.time.min&&(t.firstTick=t.parseTime(t.options.time.min)),t.options.time.max&&(t.lastTick=t.parseTime(t.options.time.max)),t.firstTick=(t.firstTick||i()).clone(),t.lastTick=(t.lastTick||i()).clone()},buildLabelDiffs:function(){var t=this;t.labelDiffs=[];var n=[];t.chart.data.labels&&t.chart.data.labels.length>0&&e.each(t.chart.data.labels,function(e){var i=t.parseTime(e);i.isValid()&&(t.options.time.round&&i.startOf(t.options.time.round),n.push(i.diff(t.firstTick,t.tickUnit,!0)))},t),e.each(t.chart.data.datasets,function(i){var a=[];"object"==typeof i.data[0]&&null!==i.data[0]?e.each(i.data,function(e){var n=t.parseTime(t.getRightValue(e));n.isValid()&&(t.options.time.round&&n.startOf(t.options.time.round),a.push(n.diff(t.firstTick,t.tickUnit,!0)))},t):a=n,t.labelDiffs.push(a)},t)},buildTicks:function(){var i=this;i.ctx.save();var a=e.getValueOrDefault(i.options.ticks.fontSize,t.defaults.global.defaultFontSize),r=e.getValueOrDefault(i.options.ticks.fontStyle,t.defaults.global.defaultFontStyle),o=e.getValueOrDefault(i.options.ticks.fontFamily,t.defaults.global.defaultFontFamily),s=e.fontString(a,r,o);if(i.ctx.font=s,i.ticks=[],i.unitScale=1,i.scaleSizeInUnits=0,i.options.time.unit)i.tickUnit=i.options.time.unit||"day",i.displayFormat=i.options.time.displayFormats[i.tickUnit],i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0),i.unitScale=e.getValueOrDefault(i.options.time.unitStepSize,1);else{var l=i.isHorizontal()?i.width:i.height,u=i.tickFormatFunction(i.firstTick,0,[]),d=i.ctx.measureText(u).width,c=Math.cos(e.toRadians(i.options.ticks.maxRotation)),h=Math.sin(e.toRadians(i.options.ticks.maxRotation));d=d*c+a*h;var f=l/d;i.tickUnit=i.options.time.minUnit,i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0),i.displayFormat=i.options.time.displayFormats[i.tickUnit];for(var g=0,m=n.units[g];g=Math.ceil(i.scaleSizeInUnits/f)){i.unitScale=e.getValueOrDefault(i.options.time.unitStepSize,m.steps[p]);break}break}if(m.maxStep===!1||Math.ceil(i.scaleSizeInUnits/f)=0&&(i.lastTick=x),i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0)}i.options.time.displayFormat&&(i.displayFormat=i.options.time.displayFormat),i.ticks.push(i.firstTick.clone());for(var _=i.unitScale;_<=i.scaleSizeInUnits;_+=i.unitScale){var w=y.clone().add(_,i.tickUnit);if(i.options.time.max&&w.diff(i.lastTick,i.tickUnit,!0)>=0)break;i.ticks.push(w)}var S=i.ticks[i.ticks.length-1].diff(i.lastTick,i.tickUnit);0===S&&0!==i.scaleSizeInUnits||(i.options.time.max?(i.ticks.push(i.lastTick.clone()),i.scaleSizeInUnits=i.lastTick.diff(i.ticks[0],i.tickUnit,!0)):(i.ticks.push(i.lastTick.clone()),i.scaleSizeInUnits=i.lastTick.diff(i.firstTick,i.tickUnit,!0))),i.ctx.restore(),i.labelDiffs=void 0},getLabelForIndex:function(t,e){var n=this,i=n.chart.data.labels&&tsetAcceptLanguageString($acceptLanguageString); + } + } + + /** + * @param string $acceptLanguageString + * + * @return $this + */ + public function setAcceptLanguageString($acceptLanguageString) + { + $this->acceptLanguageString = $acceptLanguageString; + + return $this; + } + + /** + * @return string + */ + public function getAcceptLanguageString() + { + if (null === $this->acceptLanguageString) { + $this->createAcceptLanguageString(); + } + + return $this->acceptLanguageString; + } + + /** + * @return string + */ + public function createAcceptLanguageString() + { + $acceptLanguageString = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : null; + $this->setAcceptLanguageString($acceptLanguageString); + + return $acceptLanguageString; + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/Browser.php b/inc/modules/statistics/phpbrowserdetector/Browser.php new file mode 100644 index 0000000..e36a681 --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/Browser.php @@ -0,0 +1,322 @@ +setUserAgent($userAgent); + } elseif (null === $userAgent || is_string($userAgent)) { + $this->setUserAgent(new UserAgent($userAgent)); + } else { + throw new InvalidArgumentException(); + } + } + + /** + * Set the name of the OS. + * + * @param string $name + * + * @return $this + */ + public function setName($name) + { + $this->name = (string)$name; + + return $this; + } + + /** + * Return the name of the Browser. + * + * @return string + */ + public function getName() + { + if (!isset($this->name)) { + BrowserDetector::detect($this, $this->getUserAgent()); + } + + return $this->name; + } + + /** + * Check to see if the specific browser is valid. + * + * @param string $name + * + * @return bool + */ + public function isBrowser($name) + { + return (0 == strcasecmp($this->getName(), trim($name))); + } + + /** + * Set the version of the browser. + * + * @param string $version + * + * @return $this + */ + public function setVersion($version) + { + $this->version = (string)$version; + + return $this; + } + + /** + * The version of the browser. + * + * @return string + */ + public function getVersion() + { + if (!isset($this->name)) { + BrowserDetector::detect($this, $this->getUserAgent()); + } + + return (string) $this->version; + } + + /** + * Set the Browser to be a robot. + * + * @param bool $isRobot + * + * @return $this + */ + public function setIsRobot($isRobot) + { + $this->isRobot = (bool)$isRobot; + + return $this; + } + + /** + * Is the browser from a robot (ex Slurp,GoogleBot)? + * + * @return bool + */ + public function getIsRobot() + { + if (!isset($this->name)) { + BrowserDetector::detect($this, $this->getUserAgent()); + } + + return $this->isRobot; + } + + /** + * @return bool + */ + public function isRobot() + { + return $this->getIsRobot(); + } + + /** + * @param bool $isChromeFrame + * + * @return $this + */ + public function setIsChromeFrame($isChromeFrame) + { + $this->isChromeFrame = (bool)$isChromeFrame; + + return $this; + } + + /** + * Used to determine if the browser is actually "chromeframe". + * + * @return bool + */ + public function getIsChromeFrame() + { + if (!isset($this->name)) { + BrowserDetector::detect($this, $this->getUserAgent()); + } + + return $this->isChromeFrame; + } + + /** + * @return bool + */ + public function isChromeFrame() + { + return $this->getIsChromeFrame(); + } + + /** + * @param bool $isFacebookWebView + * + * @return $this + */ + public function setIsFacebookWebView($isFacebookWebView) + { + $this->isFacebookWebView = (bool) $isFacebookWebView; + + return $this; + } + + /** + * Used to determine if the browser is actually "facebook". + * + * @return bool + */ + public function getIsFacebookWebView() + { + if (!isset($this->name)) { + BrowserDetector::detect($this, $this->getUserAgent()); + } + + return $this->isFacebookWebView; + } + + /** + * @return bool + */ + public function isFacebookWebView() + { + return $this->getIsFacebookWebView(); + } + + /** + * @param UserAgent $userAgent + * + * @return $this + */ + public function setUserAgent(UserAgent $userAgent) + { + $this->userAgent = $userAgent; + + return $this; + } + + /** + * @return UserAgent + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * @param bool + * + * @return $this + */ + public function setIsCompatibilityMode($isCompatibilityMode) + { + $this->isCompatibilityMode = $isCompatibilityMode; + + return $this; + } + + /** + * @return bool + */ + public function isCompatibilityMode() + { + return $this->isCompatibilityMode; + } + + /** + * Render pages outside of IE's compatibility mode. + */ + public function endCompatibilityMode() + { + header('X-UA-Compatible: IE=edge'); + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/BrowserDetector.php b/inc/modules/statistics/phpbrowserdetector/BrowserDetector.php new file mode 100644 index 0000000..43cb43e --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/BrowserDetector.php @@ -0,0 +1,1006 @@ +getUserAgent(); + } + self::$userAgentString = $userAgent->getUserAgentString(); + + self::$browser->setName(Browser::UNKNOWN); + self::$browser->setVersion(Browser::VERSION_UNKNOWN); + + self::checkChromeFrame(); + self::checkFacebookWebView(); + + foreach (self::$browsersList as $browserName) { + $funcName = self::FUNC_PREFIX . $browserName; + + if (self::$funcName()) { + return true; + } + } + + return false; + } + + /** + * Determine if the user is using Chrome Frame. + * + * @return bool + */ + public static function checkChromeFrame() + { + if (strpos(self::$userAgentString, 'chromeframe') !== false) { + self::$browser->setIsChromeFrame(true); + + return true; + } + + return false; + } + + /** + * Determine if the user is using Facebook. + * + * @return bool + */ + public static function checkFacebookWebView() + { + if (strpos(self::$userAgentString, 'FBAV') !== false) { + self::$browser->setIsFacebookWebView(true); + + return true; + } + + return false; + } + + /** + * Determine if the user is using a BlackBerry. + * + * @return bool + */ + public static function checkBrowserBlackBerry() + { + if (stripos(self::$userAgentString, 'blackberry') !== false) { + if (stripos(self::$userAgentString, 'Version/') !== false) { + $aresult = explode('Version/', self::$userAgentString); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + } else { + $aresult = explode('/', stristr(self::$userAgentString, 'BlackBerry')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + } + self::$browser->setName(Browser::BLACKBERRY); + + return true; + } elseif (stripos(self::$userAgentString, 'BB10') !== false) { + $aresult = explode('Version/10.', self::$userAgentString); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion('10.' . $aversion[0]); + } + self::$browser->setName(Browser::BLACKBERRY); + return true; + } + + return false; + } + + /** + * Determine if the browser is a robot. + * + * @return bool + */ + public static function checkBrowserRobot() + { + if (stripos(self::$userAgentString, 'bot') !== false || + stripos(self::$userAgentString, 'spider') !== false || + stripos(self::$userAgentString, 'crawler') !== false + ) { + self::$browser->setIsRobot(true); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Internet Explorer. + * + * @return bool + */ + public static function checkBrowserInternetExplorer() + { + // Test for v1 - v1.5 IE + if (stripos(self::$userAgentString, 'microsoft internet explorer') !== false) { + self::$browser->setName(Browser::IE); + self::$browser->setVersion('1.0'); + $aresult = stristr(self::$userAgentString, '/'); + if (preg_match('/308|425|426|474|0b1/i', $aresult)) { + self::$browser->setVersion('1.5'); + } + + return true; + } // Test for versions > 1.5 and < 11 and some cases of 11 + else { + if (stripos(self::$userAgentString, 'msie') !== false && stripos(self::$userAgentString, 'opera') === false + ) { + // See if the browser is the odd MSN Explorer + if (stripos(self::$userAgentString, 'msnb') !== false) { + $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'MSN')); + self::$browser->setName(Browser::MSN); + if (isset($aresult[1])) { + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + } + + return true; + } + $aresult = explode(' ', stristr(str_replace(';', '; ', self::$userAgentString), 'msie')); + self::$browser->setName(Browser::IE); + if (isset($aresult[1])) { + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aresult[1])); + } + // See https://msdn.microsoft.com/en-us/library/ie/hh869301%28v=vs.85%29.aspx + // Might be 11, anyway ! + if (stripos(self::$userAgentString, 'trident') !== false) { + preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + + // At this poing in the method, we know the MSIE and Trident + // strings are present in the $userAgentString. If we're in + // compatibility mode, we need to determine the true version. + // If the MSIE version is 7.0, we can look at the Trident + // version to *approximate* the true IE version. If we don't + // find a matching pair, ( e.g. MSIE 7.0 && Trident/7.0 ) + // we're *not* in compatibility mode and the browser really + // is version 7.0. + if (stripos(self::$userAgentString, 'MSIE 7.0;')) { + if (stripos(self::$userAgentString, 'Trident/7.0;')) { + // IE11 in compatibility mode + self::$browser->setVersion('11.0'); + self::$browser->setIsCompatibilityMode(true); + } elseif (stripos(self::$userAgentString, 'Trident/6.0;')) { + // IE10 in compatibility mode + self::$browser->setVersion('10.0'); + self::$browser->setIsCompatibilityMode(true); + } elseif (stripos(self::$userAgentString, 'Trident/5.0;')) { + // IE9 in compatibility mode + self::$browser->setVersion('9.0'); + self::$browser->setIsCompatibilityMode(true); + } elseif (stripos(self::$userAgentString, 'Trident/4.0;')) { + // IE8 in compatibility mode + self::$browser->setVersion('8.0'); + self::$browser->setIsCompatibilityMode(true); + } + } + } + + return true; + } // Test for versions >= 11 + else { + if (stripos(self::$userAgentString, 'trident') !== false) { + self::$browser->setName(Browser::IE); + + preg_match('/rv:(\d+\.\d+)/', self::$userAgentString, $matches); + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + + return true; + } else { + return false; + } + } // Test for Pocket IE + else { + if (stripos(self::$userAgentString, 'mspie') !== false || + stripos( + self::$userAgentString, + 'pocket' + ) !== false + ) { + $aresult = explode(' ', stristr(self::$userAgentString, 'mspie')); + self::$browser->setName(Browser::POCKET_IE); + + if (stripos(self::$userAgentString, 'mspie') !== false) { + if (isset($aresult[1])) { + self::$browser->setVersion($aresult[1]); + } + } else { + $aversion = explode('/', self::$userAgentString); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } + } + + return true; + } + } + } + } + + return false; + } + + /** + * Determine if the browser is Opera. + * + * @return bool + */ + public static function checkBrowserOpera() + { + if (stripos(self::$userAgentString, 'opera mini') !== false) { + $resultant = stristr(self::$userAgentString, 'opera mini'); + if (preg_match('/\//', $resultant)) { + $aresult = explode('/', $resultant); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + } else { + $aversion = explode(' ', stristr($resultant, 'opera mini')); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } + } + self::$browser->setName(Browser::OPERA_MINI); + + return true; + } elseif (stripos(self::$userAgentString, 'OPiOS') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'OPiOS')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::OPERA_MINI); + + return true; + } elseif (stripos(self::$userAgentString, 'opera') !== false) { + $resultant = stristr(self::$userAgentString, 'opera'); + if (preg_match('/Version\/(1[0-2].*)$/', $resultant, $matches)) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + } elseif (preg_match('/\//', $resultant)) { + $aresult = explode('/', str_replace('(', ' ', $resultant)); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + } else { + $aversion = explode(' ', stristr($resultant, 'opera')); + self::$browser->setVersion(isset($aversion[1]) ? $aversion[1] : ''); + } + self::$browser->setName(Browser::OPERA); + + return true; + } elseif (stripos(self::$userAgentString, ' OPR/') !== false) { + self::$browser->setName(Browser::OPERA); + if (preg_match('/OPR\/([\d\.]*)/', self::$userAgentString, $matches)) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + } + + return true; + } + + return false; + } + + /** + * Determine if the browser is Samsung. + * + * @return bool + */ + public static function checkBrowserSamsung() + { + if (stripos(self::$userAgentString, 'SamsungBrowser') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'SamsungBrowser')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::SAMSUNG_BROWSER); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Chrome. + * + * @return bool + */ + public static function checkBrowserChrome() + { + if (stripos(self::$userAgentString, 'Chrome') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Chrome')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::CHROME); + + return true; + } elseif (stripos(self::$userAgentString, 'CriOS') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'CriOS')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::CHROME); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Vivaldi. + * + * @return bool + */ + public static function checkBrowserVivaldi() + { + if (stripos(self::$userAgentString, 'Vivaldi') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Vivaldi')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::VIVALDI); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Microsoft Edge. + * + * @return bool + */ + public static function checkBrowserEdge() + { + if (stripos(self::$userAgentString, 'Edge') !== false) { + $version = explode('Edge/', self::$userAgentString); + if (isset($version[1])) { + self::$browser->setVersion((float)$version[1]); + } + self::$browser->setName(Browser::EDGE); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Google Search Appliance. + * + * @return bool + */ + public static function checkBrowserGsa() + { + if (stripos(self::$userAgentString, 'GSA') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'GSA')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::GSA); + + return true; + } + + return false; + } + + /** + * Determine if the browser is WebTv. + * + * @return bool + */ + public static function checkBrowserWebTv() + { + if (stripos(self::$userAgentString, 'webtv') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'webtv')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::WEBTV); + + return true; + } + + return false; + } + + /** + * Determine if the browser is NetPositive. + * + * @return bool + */ + public static function checkBrowserNetPositive() + { + if (stripos(self::$userAgentString, 'NetPositive') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'NetPositive')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion(str_replace(array('(', ')', ';'), '', $aversion[0])); + } + self::$browser->setName(Browser::NETPOSITIVE); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Galeon. + * + * @return bool + */ + public static function checkBrowserGaleon() + { + if (stripos(self::$userAgentString, 'galeon') !== false) { + $aresult = explode(' ', stristr(self::$userAgentString, 'galeon')); + $aversion = explode('/', $aresult[0]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } + self::$browser->setName(Browser::GALEON); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Konqueror. + * + * @return bool + */ + public static function checkBrowserKonqueror() + { + if (stripos(self::$userAgentString, 'Konqueror') !== false) { + $aresult = explode(' ', stristr(self::$userAgentString, 'Konqueror')); + $aversion = explode('/', $aresult[0]); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } + self::$browser->setName(Browser::KONQUEROR); + + return true; + } + + return false; + } + + /** + * Determine if the browser is iCab. + * + * @return bool + */ + public static function checkBrowserIcab() + { + if (stripos(self::$userAgentString, 'icab') !== false) { + $aversion = explode(' ', stristr(str_replace('/', ' ', self::$userAgentString), 'icab')); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } + self::$browser->setName(Browser::ICAB); + + return true; + } + + return false; + } + + /** + * Determine if the browser is OmniWeb. + * + * @return bool + */ + public static function checkBrowserOmniWeb() + { + if (stripos(self::$userAgentString, 'omniweb') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'omniweb')); + $aversion = explode(' ', isset($aresult[1]) ? $aresult[1] : ''); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::OMNIWEB); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Phoenix. + * + * @return bool + */ + public static function checkBrowserPhoenix() + { + if (stripos(self::$userAgentString, 'Phoenix') !== false) { + $aversion = explode('/', stristr(self::$userAgentString, 'Phoenix')); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } + self::$browser->setName(Browser::PHOENIX); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Firebird. + * + * @return bool + */ + public static function checkBrowserFirebird() + { + if (stripos(self::$userAgentString, 'Firebird') !== false) { + $aversion = explode('/', stristr(self::$userAgentString, 'Firebird')); + if (isset($aversion[1])) { + self::$browser->setVersion($aversion[1]); + } + self::$browser->setName(Browser::FIREBIRD); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Netscape Navigator 9+. + * + * @return bool + */ + public static function checkBrowserNetscapeNavigator9Plus() + { + if (stripos(self::$userAgentString, 'Firefox') !== false && + preg_match('/Navigator\/([^ ]*)/i', self::$userAgentString, $matches) + ) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); + + return true; + } elseif (stripos(self::$userAgentString, 'Firefox') === false && + preg_match('/Netscape6?\/([^ ]*)/i', self::$userAgentString, $matches) + ) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + self::$browser->setName(Browser::NETSCAPE_NAVIGATOR); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Shiretoko. + * + * @return bool + */ + public static function checkBrowserShiretoko() + { + if (stripos(self::$userAgentString, 'Mozilla') !== false && + preg_match('/Shiretoko\/([^ ]*)/i', self::$userAgentString, $matches) + ) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + self::$browser->setName(Browser::SHIRETOKO); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Ice Cat. + * + * @return bool + */ + public static function checkBrowserIceCat() + { + if (stripos(self::$userAgentString, 'Mozilla') !== false && + preg_match('/IceCat\/([^ ]*)/i', self::$userAgentString, $matches) + ) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + self::$browser->setName(Browser::ICECAT); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Nokia. + * + * @return bool + */ + public static function checkBrowserNokia() + { + if (preg_match("/Nokia([^\/]+)\/([^ SP]+)/i", self::$userAgentString, $matches)) { + self::$browser->setVersion($matches[2]); + if (stripos(self::$userAgentString, 'Series60') !== false || + strpos(self::$userAgentString, 'S60') !== false + ) { + self::$browser->setName(Browser::NOKIA_S60); + } else { + self::$browser->setName(Browser::NOKIA); + } + + return true; + } + + return false; + } + + /** + * Determine if the browser is Firefox. + * + * @return bool + */ + public static function checkBrowserFirefox() + { + if (stripos(self::$userAgentString, 'safari') === false) { + if (preg_match("/Firefox[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + self::$browser->setName(Browser::FIREFOX); + + return true; + } elseif (preg_match('/Firefox$/i', self::$userAgentString, $matches)) { + self::$browser->setVersion(''); + self::$browser->setName(Browser::FIREFOX); + + return true; + } + } + + return false; + } + + /** + * Determine if the browser is SeaMonkey. + * + * @return bool + */ + public static function checkBrowserSeaMonkey() + { + if (stripos(self::$userAgentString, 'safari') === false) { + if (preg_match("/SeaMonkey[\/ \(]([^ ;\)]+)/i", self::$userAgentString, $matches)) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + self::$browser->setName(Browser::SEAMONKEY); + + return true; + } elseif (preg_match('/SeaMonkey$/i', self::$userAgentString, $matches)) { + self::$browser->setVersion(''); + self::$browser->setName(Browser::SEAMONKEY); + + return true; + } + } + + return false; + } + + /** + * Determine if the browser is Iceweasel. + * + * @return bool + */ + public static function checkBrowserIceweasel() + { + if (stripos(self::$userAgentString, 'Iceweasel') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Iceweasel')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::ICEWEASEL); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Mozilla. + * + * @return bool + */ + public static function checkBrowserMozilla() + { + if (stripos(self::$userAgentString, 'mozilla') !== false && + preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString) && + stripos(self::$userAgentString, 'netscape') === false + ) { + $aversion = explode(' ', stristr(self::$userAgentString, 'rv:')); + preg_match('/rv:[0-9].[0-9][a-b]?/i', self::$userAgentString, $aversion); + self::$browser->setVersion(str_replace('rv:', '', $aversion[0])); + self::$browser->setName(Browser::MOZILLA); + + return true; + } elseif (stripos(self::$userAgentString, 'mozilla') !== false && + preg_match('/rv:[0-9]\.[0-9]/i', self::$userAgentString) && + stripos(self::$userAgentString, 'netscape') === false + ) { + $aversion = explode('', stristr(self::$userAgentString, 'rv:')); + self::$browser->setVersion(str_replace('rv:', '', $aversion[0])); + self::$browser->setName(Browser::MOZILLA); + + return true; + } elseif (stripos(self::$userAgentString, 'mozilla') !== false && + preg_match('/mozilla\/([^ ]*)/i', self::$userAgentString, $matches) && + stripos(self::$userAgentString, 'netscape') === false + ) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + self::$browser->setName(Browser::MOZILLA); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Lynx. + * + * @return bool + */ + public static function checkBrowserLynx() + { + if (stripos(self::$userAgentString, 'lynx') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Lynx')); + $aversion = explode(' ', (isset($aresult[1]) ? $aresult[1] : '')); + self::$browser->setVersion($aversion[0]); + self::$browser->setName(Browser::LYNX); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Amaya. + * + * @return bool + */ + public static function checkBrowserAmaya() + { + if (stripos(self::$userAgentString, 'amaya') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Amaya')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::AMAYA); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Safari. + * + * @return bool + */ + public static function checkBrowserWkhtmltopdf() + { + if (stripos(self::$userAgentString, 'wkhtmltopdf') !== false) { + self::$browser->setName(Browser::WKHTMLTOPDF); + return true; + } + + return false; + } + /** + * Determine if the browser is Safari. + * + * @return bool + */ + public static function checkBrowserSafari() + { + if (stripos(self::$userAgentString, 'Safari') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Version')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } else { + self::$browser->setVersion(Browser::VERSION_UNKNOWN); + } + self::$browser->setName(Browser::SAFARI); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Yandex. + * + * @return bool + */ + public static function checkBrowserYandex() + { + if (stripos(self::$userAgentString, 'YaBrowser') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'YaBrowser')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::YANDEX); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Comodo Dragon / Ice Dragon / Chromodo. + * + * @return bool + */ + public static function checkBrowserDragon() + { + if (stripos(self::$userAgentString, 'Dragon') !== false) { + $aresult = explode('/', stristr(self::$userAgentString, 'Dragon')); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + self::$browser->setVersion($aversion[0]); + } + self::$browser->setName(Browser::DRAGON); + + return true; + } + + return false; + } + + /** + * Determine if the browser is Android. + * + * @return bool + */ + public static function checkBrowserAndroid() + { + // Navigator + if (stripos(self::$userAgentString, 'Android') !== false) { + if (preg_match('/Version\/([\d\.]*)/i', self::$userAgentString, $matches)) { + if (isset($matches[1])) { + self::$browser->setVersion($matches[1]); + } + } else { + self::$browser->setVersion(Browser::VERSION_UNKNOWN); + } + self::$browser->setName(Browser::NAVIGATOR); + + return true; + } + + return false; + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/DetectorInterface.php b/inc/modules/statistics/phpbrowserdetector/DetectorInterface.php new file mode 100644 index 0000000..703cfba --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/DetectorInterface.php @@ -0,0 +1,7 @@ +setUserAgent($userAgent); + } elseif (null === $userAgent || is_string($userAgent)) { + $this->setUserAgent(new UserAgent($userAgent)); + } else { + throw new InvalidArgumentException(); + } + } + + /** + * @param UserAgent $userAgent + * + * @return $this + */ + public function setUserAgent(UserAgent $userAgent) + { + $this->userAgent = $userAgent; + + return $this; + } + + /** + * @return UserAgent + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * @return string + */ + public function getName() + { + if (!isset($this->name)) { + DeviceDetector::detect($this, $this->getUserAgent()); + } + + return $this->name; + } + + /** + * @param string $name + * + * @return $this + */ + public function setName($name) + { + $this->name = (string)$name; + + return $this; + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/DeviceDetector.php b/inc/modules/statistics/phpbrowserdetector/DeviceDetector.php new file mode 100644 index 0000000..45ed221 --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/DeviceDetector.php @@ -0,0 +1,96 @@ +setName($device::UNKNOWN); + + return ( + self::checkIpad($device, $userAgent) || + self::checkIphone($device, $userAgent) || + self::checkWindowsPhone($device, $userAgent) || + self::checkSamsungPhone($device, $userAgent) + ); + } + + /** + * Determine if the device is iPad. + * + * @param Device $device + * @param UserAgent $userAgent + * @return bool + */ + private static function checkIpad(Device $device, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'ipad') !== false) { + $device->setName(Device::IPAD); + return true; + } + + return false; + } + + /** + * Determine if the device is iPhone. + * + * @param Device $device + * @param UserAgent $userAgent + * @return bool + */ + private static function checkIphone(Device $device, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'iphone;') !== false) { + $device->setName(Device::IPHONE); + return true; + } + + return false; + } + + /** + * Determine if the device is Windows Phone. + * + * @param Device $device + * @param UserAgent $userAgent + * @return bool + */ + private static function checkWindowsPhone(Device $device, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'Windows Phone') !== false) { + if (preg_match('/Microsoft; (Lumia [^)]*)\)/', $userAgent->getUserAgentString(), $matches)) { + $device->setName($matches[1]); + return true; + } + + $device->setName($device::WINDOWS_PHONE); + return true; + } + return false; + } + + /** + * Determine if the device is Windows Phone. + * + * @param Device $device + * @param UserAgent $userAgent + * @return bool + */ + private static function checkSamsungPhone(Device $device, UserAgent $userAgent) + { + if (preg_match('/SAMSUNG SM-([^ ]*)/i', $userAgent->getUserAgentString(), $matches)) { + $device->setName(str_ireplace('SAMSUNG', 'Samsung', $matches[0])); + return true; + } + return false; + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/InvalidArgumentException.php b/inc/modules/statistics/phpbrowserdetector/InvalidArgumentException.php new file mode 100644 index 0000000..5cba91d --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/InvalidArgumentException.php @@ -0,0 +1,7 @@ +setAcceptLanguage($acceptLanguage); + } elseif (null === $acceptLanguage || is_string($acceptLanguage)) { + $this->setAcceptLanguage(new AcceptLanguage($acceptLanguage)); + } else { + throw new InvalidArgumentException(); + } + } + + /** + * Get all user's languages. + * + * @return array + */ + public function getLanguages() + { + if (!is_array($this->languages)) { + LanguageDetector::detect($this, $this->getAcceptLanguage()); + } + + return $this->languages; + } + + /** + * Set languages. + * + * @param array $languages + * + * @return $this + */ + public function setLanguages($languages) + { + $this->languages = $languages; + + return $this; + } + + /** + * Get a user's language. + * + * @return string + */ + public function getLanguage() + { + if (!is_array($this->languages)) { + LanguageDetector::detect($this, $this->getAcceptLanguage()); + } + + return strtolower(substr(reset($this->languages), 0, 2)); + } + + /** + * Get a user's language and locale. + * + * @param string $separator + * + * @return string + */ + public function getLanguageLocale($separator = '-') + { + if (!is_array($this->languages)) { + LanguageDetector::detect($this, $this->getAcceptLanguage()); + } + + $userLanguage = $this->getLanguage(); + foreach ($this->languages as $language) { + if (strlen($language) === 5 && strpos($language, $userLanguage) === 0) { + $locale = substr($language, -2); + break; + } + } + + if (!empty($locale)) { + return $userLanguage . $separator . strtoupper($locale); + } else { + return $userLanguage; + } + } + + /** + * @param AcceptLanguage $acceptLanguage + * + * @return $this + */ + public function setAcceptLanguage(AcceptLanguage $acceptLanguage) + { + $this->acceptLanguage = $acceptLanguage; + + return $this; + } + + /** + * @return AcceptLanguage + */ + public function getAcceptLanguage() + { + return $this->acceptLanguage; + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/LanguageDetector.php b/inc/modules/statistics/phpbrowserdetector/LanguageDetector.php new file mode 100644 index 0000000..7019481 --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/LanguageDetector.php @@ -0,0 +1,45 @@ +getAcceptLanguageString(); + $languages = array(); + $language->setLanguages($languages); + + if (!empty($acceptLanguageString)) { + $httpLanguages = preg_split( + '/q=([\d\.]*)/', + $acceptLanguageString, + -1, + PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE + ); + + $key = 0; + foreach (array_reverse($httpLanguages) as $value) { + $value = trim($value, ',; .'); + if (is_numeric($value)) { + $key = $value; + } else { + $languages[$key] = explode(',', $value); + } + } + krsort($languages); + + foreach ($languages as $value) { + $language->setLanguages(array_merge($language->getLanguages(), $value)); + } + } + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/Os.php b/inc/modules/statistics/phpbrowserdetector/Os.php new file mode 100644 index 0000000..f771a91 --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/Os.php @@ -0,0 +1,176 @@ +setUserAgent($userAgent); + } elseif (null === $userAgent || is_string($userAgent)) { + $this->setUserAgent(new UserAgent($userAgent)); + } else { + throw new InvalidArgumentException(); + } + } + + /** + * Return the name of the OS. + * + * @return string + */ + public function getName() + { + if (!isset($this->name)) { + OsDetector::detect($this, $this->getUserAgent()); + } + + return $this->name; + } + + /** + * Set the name of the OS. + * + * @param string $name + * + * @return $this + */ + public function setName($name) + { + $this->name = (string)$name; + + return $this; + } + + /** + * Return the version of the OS. + * + * @return string + */ + public function getVersion() + { + if (isset($this->version)) { + return (string)$this->version; + } else { + OsDetector::detect($this, $this->getUserAgent()); + + return (string)$this->version; + } + } + + /** + * Set the version of the OS. + * + * @param string $version + * + * @return $this + */ + public function setVersion($version) + { + $this->version = (string)$version; + + return $this; + } + + /** + * Is the browser from a mobile device? + * + * @return bool + */ + public function getIsMobile() + { + if (!isset($this->name)) { + OsDetector::detect($this, $this->getUserAgent()); + } + + return $this->isMobile; + } + + /** + * @return bool + */ + public function isMobile() + { + return $this->getIsMobile(); + } + + /** + * Set the Browser to be mobile. + * + * @param bool $isMobile + */ + public function setIsMobile($isMobile = true) + { + $this->isMobile = (bool)$isMobile; + } + + /** + * @param UserAgent $userAgent + * + * @return $this + */ + public function setUserAgent(UserAgent $userAgent) + { + $this->userAgent = $userAgent; + + return $this; + } + + /** + * @return UserAgent + */ + public function getUserAgent() + { + return $this->userAgent; + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/OsDetector.php b/inc/modules/statistics/phpbrowserdetector/OsDetector.php new file mode 100644 index 0000000..1ec4e86 --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/OsDetector.php @@ -0,0 +1,508 @@ +setName($os::UNKNOWN); + $os->setVersion($os::VERSION_UNKNOWN); + $os->setIsMobile(false); + + self::checkMobileBrowsers($os, $userAgent); + + return ( + // Chrome OS before OS X + self::checkChromeOs($os, $userAgent) || + // iOS before OS X + self::checkIOS($os, $userAgent) || + self::checkOSX($os, $userAgent) || + self::checkSymbOS($os, $userAgent) || + self::checkWindows($os, $userAgent) || + self::checkWindowsPhone($os, $userAgent) || + self::checkFreeBSD($os, $userAgent) || + self::checkOpenBSD($os, $userAgent) || + self::checkNetBSD($os, $userAgent) || + self::checkOpenSolaris($os, $userAgent) || + self::checkSunOS($os, $userAgent) || + self::checkOS2($os, $userAgent) || + self::checkBeOS($os, $userAgent) || + // Android before Linux + self::checkAndroid($os, $userAgent) || + self::checkLinux($os, $userAgent) || + self::checkNokia($os, $userAgent) || + self::checkBlackBerry($os, $userAgent) + ); + } + + /** + * Determine if the user's browser is on a mobile device. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + public static function checkMobileBrowsers(Os $os, UserAgent $userAgent) + { + // Check for Opera Mini + if (stripos($userAgent->getUserAgentString(), 'opera mini') !== false) { + $os->setIsMobile(true); + } // Set is mobile for Pocket IE + elseif (stripos($userAgent->getUserAgentString(), 'mspie') !== false || + stripos($userAgent->getUserAgentString(), 'pocket') !== false) { + $os->setIsMobile(true); + } + } + + /** + * Determine if the user's operating system is iOS. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkIOS(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'CPU OS') !== false || + stripos($userAgent->getUserAgentString(), 'iPhone OS') !== false && + stripos($userAgent->getUserAgentString(), 'OS X')) { + $os->setName($os::IOS); + if (preg_match('/CPU( iPhone)? OS ([\d_]*)/i', $userAgent->getUserAgentString(), $matches)) { + $os->setVersion(str_replace('_', '.', $matches[2])); + } + $os->setIsMobile(true); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is Chrome OS. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkChromeOs(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), ' CrOS') !== false || + stripos($userAgent->getUserAgentString(), 'CrOS ') !== false + ) { + $os->setName($os::CHROME_OS); + if (preg_match('/Chrome\/([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { + $os->setVersion($matches[1]); + } + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is OS X. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkOSX(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'OS X') !== false) { + $os->setName($os::OSX); + if (preg_match('/OS X ([\d\._]*)/i', $userAgent->getUserAgentString(), $matches)) { + if (isset($matches[1])) { + $os->setVersion(str_replace('_', '.', $matches[1])); + } + } + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is Windows. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkWindows(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'Windows NT') !== false) { + $os->setName($os::WINDOWS); + // Windows version + if (preg_match('/Windows NT ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { + if (isset($matches[1])) { + switch (str_replace('_', '.', $matches[1])) { + case '6.3': + $os->setVersion('8.1'); + break; + case '6.2': + $os->setVersion('8'); + break; + case '6.1': + $os->setVersion('7'); + break; + case '6.0': + $os->setVersion('Vista'); + break; + case '5.2': + case '5.1': + $os->setVersion('XP'); + break; + case '5.01': + case '5.0': + $os->setVersion('2000'); + break; + case '4.0': + $os->setVersion('NT 4.0'); + break; + default: + if ((float)$matches[1] >= 10.0) { + $os->setVersion($matches[1]); + } + break; + } + } + } + + return true; + } // Windows Me, Windows 98, Windows 95, Windows CE + elseif (preg_match( + '/(Windows 98; Win 9x 4\.90|Windows 98|Windows 95|Windows CE)/i', + $userAgent->getUserAgentString(), + $matches + )) { + $os->setName($os::WINDOWS); + switch (strtolower($matches[0])) { + case 'windows 98; win 9x 4.90': + $os->setVersion('Me'); + break; + case 'windows 98': + $os->setVersion('98'); + break; + case 'windows 95': + $os->setVersion('95'); + break; + case 'windows ce': + $os->setVersion('CE'); + break; + } + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is Windows Phone. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkWindowsPhone(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'Windows Phone') !== false) { + $os->setIsMobile(true); + $os->setName($os::WINDOWS_PHONE); + // Windows version + if (preg_match('/Windows Phone ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { + if (isset($matches[1])) { + $os->setVersion((float)$matches[1]); + } + } + + return true; + } + return false; + } + + /** + * Determine if the user's operating system is SymbOS. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkSymbOS(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'SymbOS') !== false) { + $os->setName($os::SYMBOS); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is Linux. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkLinux(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'Linux') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::LINUX); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is Nokia. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkNokia(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'Nokia') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::NOKIA); + $os->setIsMobile(true); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is BlackBerry. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkBlackBerry(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'BlackBerry') !== false) { + if (stripos($userAgent->getUserAgentString(), 'Version/') !== false) { + $aresult = explode('Version/', $userAgent->getUserAgentString()); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + $os->setVersion($aversion[0]); + } + } else { + $os->setVersion($os::VERSION_UNKNOWN); + } + $os->setName($os::BLACKBERRY); + $os->setIsMobile(true); + + return true; + } elseif (stripos($userAgent->getUserAgentString(), 'BB10') !== false) { + $aresult = explode('Version/10.', $userAgent->getUserAgentString()); + if (isset($aresult[1])) { + $aversion = explode(' ', $aresult[1]); + $os->setVersion('10.' . $aversion[0]); + } else { + $os->setVersion('10'); + } + $os->setName($os::BLACKBERRY); + $os->setIsMobile(true); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is Android. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkAndroid(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'Android') !== false) { + if (preg_match('/Android ([\d\.]*)/i', $userAgent->getUserAgentString(), $matches)) { + if (isset($matches[1])) { + $os->setVersion($matches[1]); + } + } else { + $os->setVersion($os::VERSION_UNKNOWN); + } + $os->setName($os::ANDROID); + $os->setIsMobile(true); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is FreeBSD. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkFreeBSD(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'FreeBSD') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::FREEBSD); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is OpenBSD. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkOpenBSD(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'OpenBSD') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::OPENBSD); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is SunOS. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkSunOS(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'SunOS') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::SUNOS); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is NetBSD. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkNetBSD(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'NetBSD') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::NETBSD); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is OpenSolaris. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkOpenSolaris(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'OpenSolaris') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::OPENSOLARIS); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is OS2. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkOS2(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'OS\/2') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::OS2); + + return true; + } + + return false; + } + + /** + * Determine if the user's operating system is BeOS. + * + * @param Os $os + * @param UserAgent $userAgent + * + * @return bool + */ + private static function checkBeOS(Os $os, UserAgent $userAgent) + { + if (stripos($userAgent->getUserAgentString(), 'BeOS') !== false) { + $os->setVersion($os::VERSION_UNKNOWN); + $os->setName($os::BEOS); + + return true; + } + + return false; + } +} diff --git a/inc/modules/statistics/phpbrowserdetector/UserAgent.php b/inc/modules/statistics/phpbrowserdetector/UserAgent.php new file mode 100644 index 0000000..36a2e42 --- /dev/null +++ b/inc/modules/statistics/phpbrowserdetector/UserAgent.php @@ -0,0 +1,56 @@ +setUserAgentString($userAgentString); + } + } + + /** + * @param string $userAgentString + * + * @return $this + */ + public function setUserAgentString($userAgentString) + { + $this->userAgentString = (string)$userAgentString; + + return $this; + } + + /** + * @return string + */ + public function getUserAgentString() + { + if (null === $this->userAgentString) { + $this->createUserAgentString(); + } + + return $this->userAgentString; + } + + /** + * @return string + */ + public function createUserAgentString() + { + $userAgentString = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null; + $this->setUserAgentString($userAgentString); + + return $userAgentString; + } +} diff --git a/inc/modules/statistics/src/Chart.php b/inc/modules/statistics/src/Chart.php new file mode 100644 index 0000000..c76cf4d --- /dev/null +++ b/inc/modules/statistics/src/Chart.php @@ -0,0 +1,119 @@ +db('statistics') + ->select([ + 'count' => 'COUNT(*)', + 'count_unique' => 'COUNT(DISTINCT uniqhash)', + 'formatedDate' => "strftime('%Y-%m-%d', datetime(created_at, 'unixepoch', 'localtime'))", + ]) + ->where('bot', 0) + ->where('created_at', '>=', $time) + ->group(['formatedDate']) + ->asc('formatedDate'); + + if (!empty($url)) { + $query->where('url', $url); + } + + if (!empty($referrer)) { + $query->where('referrer', $referrer); + } + + $data = $query->toArray(); + + $return = [ + 'labels' => [], + 'uniques' => [], + 'visits' => [], + ]; + + while ($time < (time() - ($offset * 86400))) { + $return['labels'][] = '"'.date("Y-m-d", $time).'"'; + $return['readable'][] = '"'.date("d M Y", $time).'"'; + $return['uniques'][] = 0; + $return['visits'][] = 0; + + $time = strtotime('+1 day', $time); + } + + foreach ($data as $day) { + $index = array_search('"'.$day['formatedDate'].'"', $return['labels']); + if ($index === false) { + continue; + } + + $return['uniques'][$index] = $day['count_unique']; + $return['visits'][$index] = $day['count']; + } + + return $return; + } + + public function getOperatingSystems($url = null, $referrer = null) + { + return $this->getPopularBy('platform', $url, $referrer); + } + + public function getBrowsers($url = null, $referrer = null) + { + return $this->getPopularBy('browser', $url, $referrer); + } + + public function getCountries($url = null, $referrer = null) + { + return $this->getPopularBy('country', $url, $referrer); + } + + public function getPages($url = null, $referrer = null) + { + return $this->getPopularBy('url', $url, $referrer); + } + + public function getReferrers($url = null, $referrer = null) + { + return $this->getPopularBy('referrer', $url, $referrer); + } + + protected function getPopularBy($group, $url = null, $referrer = null) + { + $data = $this->db('statistics') + ->select([ + $group, + 'count' => 'COUNT(DISTINCT uniqhash)', + ]) + ->where('bot', 0) + ->group([$group]) + ->asc('count'); + + if (!empty($url)) { + $data->where('url', $url); + } + if (!empty($referrer)) { + $data->where('referrer', $referrer); + } + + $data = $data->toArray(); + + return [ + 'labels' => array_map(function (&$value) { + return '"'.$value.'"'; + }, array_column($data, $group)), + 'data' => array_column($data, 'count'), + ]; + } + + protected function db($table) + { + return new DB($table); + } +} diff --git a/inc/modules/statistics/src/Statistics.php b/inc/modules/statistics/src/Statistics.php new file mode 100644 index 0000000..2a2d2ce --- /dev/null +++ b/inc/modules/statistics/src/Statistics.php @@ -0,0 +1,124 @@ +db('statistics') + ->select([ + 'referrer', + 'count_unique' => 'COUNT(DISTINCT uniqhash)', + 'count' => 'COUNT(uniqhash)', + ]) + ->where('bot', $bot ? 1 : 0) + ->group(['referrer']) + ->desc('count'); + + if (!empty($url)) { + $query->where('url', $url); + } + if ($limit !== false) { + $query->limit($limit); + } + + $urls = $query->toArray(); + + return $urls; + } + + public function getPages($referrer = null, $limit = 15) + { + $query = $this->db('statistics') + ->select([ + 'url', + 'count_unique' => 'COUNT(DISTINCT uniqhash)', + 'count' => 'COUNT(uniqhash)', + ]) + ->group(['url']) + ->desc('count'); + + if ($limit !== false) { + $query->limit($limit); + } + + if (!empty($referrer)) { + $query->where('referrer', $referrer); + } + + $urls = $query->toArray(); + + return $urls; + } + + public function countCurrentOnline($margin = "-5 minutes") + { + $online = $this->db('statistics') + ->select([ + 'count' => 'COUNT(DISTINCT uniqhash)', + ]) + ->where('bot', 0) + ->where('created_at', '>', strtotime($margin)) + ->oneArray(); + + return $online['count']; + } + + public function countAllVisits($date = 'TODAY', $days = 1, $url = null, $referrer = null) + { + $query = $this->db('statistics') + ->select([ + 'count' => 'COUNT(uniqhash)', + ]) + ->where('bot', 0); + + if ($date != 'ALL') { + $date = strtotime($date); + $query->where('created_at', '>=', $date)->where('created_at', '<', $date + $days * 86400); + } + + if (!empty($url)) { + $query->where('url', $url); + } + if (!empty($referrer)) { + $query->where('referrer', $referrer); + } + + $all = $query->oneArray(); + + return $all['count']; + } + + public function countUniqueVisits($date = 'TODAY', $days = 1, $url = null, $referrer = null) + { + $query = $this->db('statistics') + ->select([ + 'count' => 'COUNT(DISTINCT uniqhash)', + ]) + ->where('bot', 0); + + if ($date != 'ALL') { + $date = strtotime($date); + $query->where('created_at', '>=', $date)->where('created_at', '<', $date + $days * 86400); + } + + if (!empty($url)) { + $query->where('url', $url); + } + if (!empty($referrer)) { + $query->where('referrer', $referrer); + } + + $record = $query->oneArray(); + + return $record['count']; + } + + protected function db($table) + { + return new DB($table); + } +} diff --git a/inc/modules/statistics/view/admin/dashboard.html b/inc/modules/statistics/view/admin/dashboard.html new file mode 100644 index 0000000..88ecb5c --- /dev/null +++ b/inc/modules/statistics/view/admin/dashboard.html @@ -0,0 +1,226 @@ +
    +
    + +
    +
    +

    {$lang.statistics.unique_today}

    +
    +
    +

    {?= $visitors.unique ?}

    +
    +
    + +
    +
    + +
    +
    +

    {$lang.statistics.today_visits}

    +
    +
    +

    {?= $visitors.visits.today ?}

    +
    +
    + +
    +
    + +
    +
    +

    {$lang.statistics.online}

    +
    +
    +

    {?= $visitors.online ?}

    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    +

    {$lang.statistics.yesterday}

    +
    +
    +

    {?= $visitors.visits.yesterday ?}

    +
    +
    + +
    + +
    + +
    +
    +

    {$lang.statistics.7days}

    +
    +
    +

    {?= $visitors.visits.7days ?}

    +
    +
    + +
    + +
    + +
    +
    +

    {$lang.statistics.30days}

    +
    +
    +

    {?= $visitors.visits.30days ?}

    +
    +
    + +
    + +
    + +
    +
    +

    {$lang.statistics.total}

    +
    +
    +

    {?= $visitors.visits.all ?}

    +
    +
    + +
    +
    + +
    +
    +
    +
    +

    {$lang.statistics.os}

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.browsers}

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.countries}

    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.referrals}

    + {$lang.statistics.show} +
    +
    + + + + + + + {loop: $visitors.referrers} + + {if: $value.referrer == NULL} + + {else} + + {/if} + + + + {/loop} +
    {$lang.statistics.url}{$lang.statistics.visits}{$lang.statistics.unique}
    (direct visit){$value.referrer}{$value.count}{$value.count_unique}
    +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.pages}

    + {$lang.statistics.show} +
    +
    + + + + + + + {loop: $visitors.pages} + + + + + + {/loop} +
    {$lang.statistics.url}{$lang.statistics.visits}{$lang.statistics.unique}
    {$value.url}{$value.count}{$value.count_unique}
    +
    +
    +
    +
    diff --git a/inc/modules/statistics/view/admin/pages.html b/inc/modules/statistics/view/admin/pages.html new file mode 100644 index 0000000..2baf830 --- /dev/null +++ b/inc/modules/statistics/view/admin/pages.html @@ -0,0 +1,44 @@ +

    {$lang.statistics.all_pages}

    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.pages}

    +
    +
    + + + + + + + {loop: $pages.list} + + + + + + {/loop} +
    {$lang.statistics.url}{$lang.statistics.visits}{$lang.statistics.unique}
    {$value.url}{$value.count}{$value.count_unique}
    +
    +
    +
    +
    diff --git a/inc/modules/statistics/view/admin/referrer.html b/inc/modules/statistics/view/admin/referrer.html new file mode 100644 index 0000000..7cccc1c --- /dev/null +++ b/inc/modules/statistics/view/admin/referrer.html @@ -0,0 +1,133 @@ +

    {$lang.statistics.referrals_from} {$url}

    +
    +
    + +
    +
    +

    {$lang.statistics.all_unique}

    +
    +
    +

    {?= $visitors.unique ?}

    +
    +
    + +
    +
    + +
    +
    +

    {$lang.statistics.all_visits}

    +
    +
    +

    {?= $visitors.all ?}

    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.os}

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.browsers}

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.countries}

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.target}

    +
    +
    + + + + + + + {loop: $visitors.referrers} + + {if: $value.url == NULL} + + {else} + + {/if} + + + + {/loop} +
    {$lang.statistics.url}{$lang.statistics.visits}{$lang.statistics.unique}
    ({$lang.statistics.direct_visit}){$value.url}{$value.count}{$value.count_unique}
    +
    +
    +
    +
    diff --git a/inc/modules/statistics/view/admin/referrers.html b/inc/modules/statistics/view/admin/referrers.html new file mode 100644 index 0000000..5cba24c --- /dev/null +++ b/inc/modules/statistics/view/admin/referrers.html @@ -0,0 +1,48 @@ +

    {$lang.statistics.all_referrals}

    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.from_address}

    +
    +
    + + + + + + + {loop: $referrers.list} + + {if: $value.referrer == NULL} + + {else} + + {/if} + + + + {/loop} +
    {$lang.statistics.url}{$lang.statistics.visits}{$lang.statistics.unique}
    ({$lang.statistics.direct_visit}){$value.referrer}{$value.count}{$value.count_unique}
    +
    +
    +
    +
    diff --git a/inc/modules/statistics/view/admin/url.html b/inc/modules/statistics/view/admin/url.html new file mode 100644 index 0000000..3cbfe5b --- /dev/null +++ b/inc/modules/statistics/view/admin/url.html @@ -0,0 +1,133 @@ +

    {$lang.statistics.stats_page} {$url}

    +
    +
    + +
    +
    +

    {$lang.statistics.all_unique}

    +
    +
    +

    {?= $visitors.unique ?}

    +
    +
    + +
    +
    + +
    +
    +

    {$lang.statistics.all_visits}

    +
    +
    +

    {?= $visitors.all ?}

    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.os}

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.browsers}

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.countries}

    +
    +
    + +
    +
    +
    +
    +
    +
    +

    {$lang.statistics.referrals}

    +
    +
    + + + + + + + {loop: $visitors.referrers} + + {if: $value.referrer == NULL} + + {else} + + {/if} + + + + {/loop} +
    {$lang.statistics.url}{$lang.statistics.visits}{$lang.statistics.unique}
    ({$lang.statistics.direct_visit}){$value.referrer}{$value.count}{$value.count_unique}
    +
    +
    +
    +
    diff --git a/inc/modules/users/Admin.php b/inc/modules/users/Admin.php new file mode 100644 index 0000000..98b735f --- /dev/null +++ b/inc/modules/users/Admin.php @@ -0,0 +1,261 @@ + + * @author Wojciech Król + * @copyright 2017 Paweł Klockiewicz, Wojciech Król + * @license https://batflat.org/license + * @link https://batflat.org + */ + +namespace Inc\Modules\Users; + +use Inc\Core\AdminModule; + +class Admin extends AdminModule +{ + private $assign = []; + + public function navigation() + { + return [ + $this->lang('manage', 'general') => 'manage', + $this->lang('add_new') => 'add' + ]; + } + + /** + * users list + */ + public function getManage() + { + $rows = $this->db('users')->toArray(); + foreach ($rows as &$row) { + if (empty($row['fullname'])) { + $row['fullname'] = '----'; + } + $row['editURL'] = url([ADMIN, 'users', 'edit', $row['id']]); + $row['delURL'] = url([ADMIN, 'users', 'delete', $row['id']]); + } + + return $this->draw('manage.html', ['myId' => $this->core->getUserInfo('id'), 'users' => $rows]); + } + + /** + * add new user + */ + public function getAdd() + { + if (!empty($redirectData = getRedirectData())) { + $this->assign['form'] = filter_var_array($redirectData, FILTER_SANITIZE_STRING); + } else { + $this->assign['form'] = ['username' => '', 'email' => '', 'fullname' => '', 'description' => '']; + } + + + $this->assign['title'] = $this->lang('new_user'); + $this->assign['modules'] = $this->_getModules('all'); + $this->assign['avatarURL'] = url(MODULES.'/users/img/default.png'); + + return $this->draw('form.html', ['users' => $this->assign]); + } + + /** + * edit user + */ + public function getEdit($id) + { + $user = $this->db('users')->oneArray($id); + + if (!empty($user)) { + $this->assign['form'] = $user; + $this->assign['title'] = $this->lang('edit_user'); + $this->assign['modules'] = $this->_getModules($user['access']); + $this->assign['avatarURL'] = url(UPLOADS.'/users/'.$user['avatar']); + + return $this->draw('form.html', ['users' => $this->assign]); + } else { + redirect(url([ADMIN, 'users', 'manage'])); + } + } + + /** + * save user data + */ + public function postSave($id = null) + { + $errors = 0; + + // location to redirect + if (!$id) { + $location = url([ADMIN, 'users', 'add']); + } else { + $location = url([ADMIN, 'users', 'edit', $id]); + } + + // admin + if ($id == 1) { + $_POST['access'] = ['all']; + } + + // check if required fields are empty + if (checkEmptyFields(['username', 'email', 'access'], $_POST)) { + $this->notify('failure', $this->lang('empty_inputs', 'general')); + redirect($location, $_POST); + } + + // check if user already exists + if ($this->_userAlreadyExists($id)) { + $errors++; + $this->notify('failure', $this->lang('user_already_exists')); + } + // chech if e-mail adress is correct + $_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); + if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { + $errors++; + $this->notify('failure', $this->lang('wrong_email')); + } + // check if password is longer than 5 characters + if (isset($_POST['password']) && strlen($_POST['password']) < 5) { + $errors++; + $this->notify('failure', $this->lang('too_short_pswd')); + } + // access to modules + if ((count($_POST['access']) == count($this->_getModules())) || ($id == 1)) { + $_POST['access'] = 'all'; + } else { + $_POST['access'][] = 'dashboard'; + $_POST['access'] = implode(',', $_POST['access']); + } + + // CREATE / EDIT + if (!$errors) { + unset($_POST['save']); + + if (!empty($_POST['password'])) { + $_POST['password'] = password_hash($_POST['password'], PASSWORD_BCRYPT); + } + + if (($photo = isset_or($_FILES['photo']['tmp_name'], false)) || !$id) { + $img = new \Inc\Core\Lib\Image; + + if (empty($photo) && !$id) { + $photo = MODULES.'/users/img/default.png'; + } + if ($img->load($photo)) { + if ($img->getInfos('width') < $img->getInfos('height')) { + $img->crop(0, 0, $img->getInfos('width'), $img->getInfos('width')); + } else { + $img->crop(0, 0, $img->getInfos('height'), $img->getInfos('height')); + } + + if ($img->getInfos('width') > 512) { + $img->resize(512, 512); + } + + if ($id) { + $user = $this->db('users')->oneArray($id); + } + + $_POST['avatar'] = uniqid('avatar').".".$img->getInfos('type'); + } + } + + if (!$id) { // new + $query = $this->db('users')->save($_POST); + } else { // edit + $query = $this->db('users')->where('id', $id)->save($_POST); + } + + if ($query) { + if (isset($img) && $img->getInfos('width')) { + if (isset($user)) { + unlink(UPLOADS."/users/".$user['avatar']); + } + + $img->save(UPLOADS."/users/".$_POST['avatar']); + } + + $this->notify('success', $this->lang('save_success')); + } else { + $this->notify('failure', $this->lang('save_failure')); + } + + redirect($location); + } + + redirect($location, $_POST); + } + + /** + * remove user + */ + public function getDelete($id) + { + if ($id != 1 && $this->core->getUserInfo('id') != $id && ($user = $this->db('users')->oneArray($id))) { + if ($this->db('users')->delete($id)) { + if (!empty($user['avatar'])) { + unlink(UPLOADS."/users/".$user['avatar']); + } + + $this->notify('success', $this->lang('delete_success')); + } else { + $this->notify('failure', $this->lang('delete_failure')); + } + } + redirect(url([ADMIN, 'users', 'manage'])); + } + + /** + * list of active modules + * @return array + */ + private function _getModules($access = null) + { + $result = []; + $rows = $this->db('modules')->toArray(); + + if (!$access) { + $accessArray = []; + } else { + $accessArray = explode(',', $access); + } + + foreach ($rows as $row) { + if ($row['dir'] != 'dashboard') { + $details = $this->core->getModuleInfo($row['dir']); + + if (empty($accessArray)) { + $attr = ''; + } else { + if (in_array($row['dir'], $accessArray) || ($accessArray[0] == 'all')) { + $attr = 'selected'; + } else { + $attr = ''; + } + } + $result[] = ['dir' => $row['dir'], 'name' => $details['name'], 'icon' => $details['icon'], 'attr' => $attr]; + } + } + return $result; + } + + /** + * check if user already exists + * @return array + */ + private function _userAlreadyExists($id = null) + { + if (!$id) { // new + $count = $this->db('users')->where('username', $_POST['username'])->count(); + } else { // edit + $count = $this->db('users')->where('username', $_POST['username'])->where('id', '<>', $id)->count(); + } + if ($count > 0) { + return true; + } else { + return false; + } + } +} diff --git a/inc/modules/users/Info.php b/inc/modules/users/Info.php new file mode 100644 index 0000000..6afec23 --- /dev/null +++ b/inc/modules/users/Info.php @@ -0,0 +1,62 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +return [ + 'name' => $core->lang['users']['module_name'], + 'description' => $core->lang['users']['module_desc'], + 'author' => 'Sruu.pl', + 'version' => '1.1', + 'compatibility' => '1.3.*', + 'icon' => 'user', + + 'install' => function () use ($core) { + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `users` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `username` text NOT NULL, + `fullname` text NULL, + `description` text NULL, + `password` text NOT NULL, + `avatar` text NOT NULL, + `email` text NOT NULL, + `role` text NOT NULL DEFAULT 'admin', + `access` text NOT NULL DEFAULT 'all' + )"); + + $core->db()->pdo()->exec("CREATE TABLE `login_attempts` ( + `ip` TEXT NOT NULL, + `attempts` INTEGER NOT NULL, + `expires` INTEGER NOT NULL DEFAULT 0 + )"); + + $core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `remember_me` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `token` text NOT NULL, + `user_id` integer NOT NULL REFERENCES users(id) ON DELETE CASCADE, + `expiry` integer NOT NULL + )"); + + $avatar = uniqid('avatar').'.png'; + $core->db()->pdo()->exec('INSERT INTO `users` (`username`, `fullname`, `description`, `password`, `avatar`, `email`, `role`, `access`) + VALUES ("admin", "Selina Kyle", "My name is Selina Kyle but I speak for Catwoman… A mon who can offer you a path. Someone like you is only here by choice. You have been exploring the criminal fraternity but whatever your original intentions you have to become truly lost.", "$2y$10$pgRnDiukCbiYVqsamMM3ROWViSRqbyCCL33N8.ykBKZx0dlplXe9i", "'.$avatar.'", "admin@localhost", "admin", "all")'); + + if (!is_dir(UPLOADS."/users")) { + mkdir(UPLOADS."/users", 0777); + } + + copy(MODULES.'/users/img/default.png', UPLOADS.'/users/'.$avatar); + }, + 'uninstall' => function () use ($core) { + $core->db()->pdo()->exec("DROP TABLE `users`"); + $core->db()->pdo()->exec("DROP TABLE `login_attempts`"); + $core->db()->pdo()->exec("DROP TABLE `remember_me`"); + deleteDir(UPLOADS."/users"); + } +]; diff --git a/inc/modules/users/Site.php b/inc/modules/users/Site.php new file mode 100644 index 0000000..542d924 --- /dev/null +++ b/inc/modules/users/Site.php @@ -0,0 +1,31 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +namespace Inc\Modules\Users; + +use Inc\Core\SiteModule; + +class Site extends SiteModule +{ + public function init() + { + $this->tpl->set('users', function () { + $result = []; + $users = $this->db('users')->select(['id', 'username', 'fullname', 'description', 'avatar', 'email'])->toArray(); + + foreach ($users as $key => $value) { + $result[$value['id']] = $users[$key]; + $result[$value['id']]['avatar'] = url('uploads/users/' . $value['avatar']); + } + return $result; + }); + } +} diff --git a/inc/modules/users/img/default.png b/inc/modules/users/img/default.png new file mode 100644 index 0000000000000000000000000000000000000000..eeae0e0c7d460f0c21ad19eb314bebbc94c14b01 GIT binary patch literal 1497 zcmV;~1t$85P)DJcPz?vX%000GuNklyO zz~2D?{&a30{OF_j`BeVh`#Ao3B7jFej&a^5yzyV-RxmK(;txI%cPA~ty-&qCOYogf z#@tchL?XNaIwCxhF2QS`jjiM0Sxmh5`Pj=8JR=R?`jwdC9bj*FfLpr*Oz{q|w>!YC zQz78)3?GR6;59(y2fz14v6Li)sUhJBM1187V?C!DJ-;@6OPd6L^QCc=Dgaxl0AV=2+Z<$sUJM*93D{c_ zu(c#$X-U9bIsr^A3mGvBIa(I7cjXYUwk%|6S;*Y7kf~)MBW58-z``f+@YU~5h`@|t zYjudV)ghKvhnQO(V(M9t3LzsFLXK7l+4~$wg^;ZkLe?HYs>CckfYb_@|8F#W;-%3K ztrs!1R={{U0KWIMh|Q3rHAD6n+cixS2}wD{jJ*mUU7f3y1!d~ zUGMKZEczakyvru&Gs-)y@?NvP+ph07OnEr+p3}VRHt##mJFolR^S=8&<>AODF!VDh z`Y9YO4fc8xOFoMxpT?8VBg!W-<8%qKMFGb-yTo%x*7 zd{S#ZtG1uk+s`ZRCpL#fobsvN`P}k)a(h0z{-sav@82)TUvS9Zu;^d$$lo!^Uvhc< z_!$nIu>wEDIq>El$euKMjD_e&zY>4R9#i_5iBVO0YZriVv!?>E&#W70T@TS z0NmOIU>x=Tgj@Z5z+HAS26(7HSS)13tfxS{efLnc;YzjpHcxZQk zTixn3;vL|j-2rYT2Ve?S2-w>l;8ytnz+FBX?x;Jjx3<@fIqvv0LKy@eN)p1YBq7|L zUk*P*ar}lh3EuMbSSlw3m_i)}j!uVxtxW-zHU*eU6@YP+DgY0i5dgQ&2!Ok)762GY zK@I?WGY<=ZwJ8Sym`fRgDRd&>C}jv9+8ktUbC9`|AsBHEa#Yn2z}Ds`JY0@juU z%qtU9101aku(vY6*2(~D4xrT`mR5(DTODF* zb%+t`5J#&+>^Xo|2-#X4Vr_MZrPU$k96&3COsxeD`6|j9B0KTI&gKs@sylcIPrL_X)96;+uOtBZ# zX2@t)pf^K~96)P^>^Xqe4B2u3tsArE0NQeZcWpVq5=(Ji4lsWW0KWH(@xCpHn9?Nd z3nIqXumYYn;)00dw-4YIZAo+i_{OuwPi;xab^&N>Qq~JVTb1)J2hbi1So(sb1kj&L zm@fc1fc9j@`-_I{*_7#8f!{uWdrm!{Uo`wTRruEVD*XY@00000NkvXXu0mjf$&jy? literal 0 HcmV?d00001 diff --git a/inc/modules/users/lang/admin/en_english.ini b/inc/modules/users/lang/admin/en_english.ini new file mode 100644 index 0000000..540bd62 --- /dev/null +++ b/inc/modules/users/lang/admin/en_english.ini @@ -0,0 +1,23 @@ +module_name = "Users" +module_desc = "Management user accounts." + +add_new = "Add user" +new_user = "New user" +edit_user = "Edit user" +display_name = "Displayed name" +description = "Short description about you" +photo = "Avatar / Photo" +email = "E-mail" +new_password = "New password..." +access = "Access" +role = "Role" +user = "User" +admin = "Administrator" +save_success = "User successfully saved." +save_failure = "Failed to save user." +delete_success = "User successfully deleted." +delete_failure = "Unable to delete user." +delete_confirm = "Are you sure you want to delete selected user?" +user_already_exists = "Username already exist." +wrong_email = "E-mail is incorrect!" +too_short_pswd = "Minimum password length is 5 characters." \ No newline at end of file diff --git a/inc/modules/users/lang/admin/pl_polski.ini b/inc/modules/users/lang/admin/pl_polski.ini new file mode 100644 index 0000000..cf5fa59 --- /dev/null +++ b/inc/modules/users/lang/admin/pl_polski.ini @@ -0,0 +1,23 @@ +module_name = "Użytkownicy" +module_desc = "Zarządzanie kontami użytkowników." + +add_new = "Dodaj nowego" +new_user = "Nowy użytkownik" +edit_user = "Edycja użytkownika" +display_name = "Nazwa wyświetlana" +description = "Krótki opis Ciebie" +photo = "Avatar / Zdjęcie" +email = "Adres e-mail" +new_password = "Nowe hasło..." +access = "Dostęp" +role = "Rola" +user = "Użytkownik" +admin = "Administrator" +save_success = "Pomyślnie zapisano użytkownika." +save_failure = "Nie udało się zapisać użytkownika." +delete_success = "Pomyślnie usunięto użytkownika." +delete_failure = "Nie udało się usunąć użytkownika." +delete_confirm = "Na pewno chcesz usunąć wybranego użytkownika?" +user_already_exists = "Użytkownik o takim loginie już istnieje." +wrong_email = "Wprowadzono błędny adres e-mail!" +too_short_pswd = "Hasło musi zawierać minimum 5 znaków." \ No newline at end of file diff --git a/inc/modules/users/view/admin/form.html b/inc/modules/users/view/admin/form.html new file mode 100644 index 0000000..bb93527 --- /dev/null +++ b/inc/modules/users/view/admin/form.html @@ -0,0 +1,71 @@ +
    +
    +
    +
    +

    {$users.title}

    +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    + +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    + + \ No newline at end of file diff --git a/inc/modules/users/view/admin/manage.html b/inc/modules/users/view/admin/manage.html new file mode 100644 index 0000000..55ebf1b --- /dev/null +++ b/inc/modules/users/view/admin/manage.html @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..0b19ab9 --- /dev/null +++ b/index.php @@ -0,0 +1,30 @@ + +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +header('Content-Type:text/html;charset=utf-8'); + +define('BASE_DIR', __DIR__); +require_once('inc/core/defines.php'); + +if (DEV_MODE) { + error_reporting(E_ALL); + ini_set('display_errors', 1); +} else { + error_reporting(0); +} + +require_once('inc/core/lib/Autoloader.php'); +ob_start(base64_decode('XEluY1xDb3JlXE1haW46OnZlcmlmeUxpY2Vuc2U=')); + +// Site core init +$core = new Inc\Core\Site; + +ob_end_flush(); diff --git a/themes/admin/css/style.css b/themes/admin/css/style.css new file mode 100644 index 0000000..f32d0ed --- /dev/null +++ b/themes/admin/css/style.css @@ -0,0 +1,810 @@ +@charset "UTF-8"; +@import url('//cdn.jsdelivr.net/animatecss/3.5.0/animate.min.css'); + +html { + height: 100%; +} + body { + padding-bottom: 30px; + position: relative; + min-height: 100%; + } + +a, .btn { + transition: background 0.2s, color 0.2s; +} + a:hover, + a:focus { + text-decoration: none; + } + +/* 1. MAIN WRAPPER +--------------------------------------------------------- */ +#wrapper { + padding-left: 0; + transition: all 0.5s ease; + position: relative; +} +#wrapper.toggled { + padding-left: 250px; +} + +/* 2. SIDEBAR +--------------------------------------------------------- */ +#sidebar-wrapper { + z-index: 1000; + position: fixed; + left: 250px; + width: 0; + height: 100%; + margin-left: -250px; + overflow-y: auto; + overflow-x: hidden; + background: #222; + transition: all 0.5s ease; +} +#wrapper.toggled #sidebar-wrapper { + width: 250px; +} + +.sidebar-brand { + position: absolute; + top: 0; + width: 250px; + text-align: center; + padding: 20px 0; +} + .sidebar-brand img { + width: auto; + height: 30px; + display: inline-block; + margin-right: 2px; + } + .sidebar-brand h2 { + display: inline-block; + margin: 0; + vertical-align: middle; + font-weight: 600; + font-size: 24px; + } + .sidebar-brand h2 span { + color: #fff; + } + +.sidebar-nav { + position: absolute; + top: 75px; + width: 250px; + margin: 0; + padding: 0; + list-style: none; +} + .sidebar-nav > li { + text-indent: 10px; + line-height: 42px; + } + .sidebar-nav > li.sortable-placeholder { + background: rgba(255,255,255,0.03); + border-top: 1px solid rgba(255,255,255,0.075); + border-bottom: 1px solid rgba(255,255,255,0.075); + padding: 21px 0; + } + .sidebar-nav > li a { + display: block; + text-decoration: none; + color: #757575; + font-weight: 600; + } + .sidebar-nav > li > a:hover, + .sidebar-nav > li.active > a { + text-decoration: none; + color: #fff; + background: #F8BE12; + } + .sidebar-nav > li > a:active, + .sidebar-nav > li > a:focus { + text-decoration: none; + } + .sidebar-nav > li > a i.fa { + padding-right: 10px; + font-size: 14px; + cursor: move; + } + .sidebar-nav > li > ul { + background: rgba(255,255,255,0.03); + list-style: none; + margin: 0; + padding: 0 0 0 24px; + border-left: 1px solid #222; + position: relative; + } + .sidebar-nav > li > ul:before { + content: ""; + height: 100%; + width: 1px; + position: absolute; + background: rgba(255,255,255,0.075); + left: 24px; + top: 0; + } + .sidebar-nav > li > ul li { + line-height: 35px; + } + .sidebar-nav > li > ul li a { + font-weight: 400; + font-size: 90%; + padding: 0 8px; + position: relative; + } + .sidebar-nav > li > ul li a:hover { + color: #fff; + } + .sidebar-nav > li > ul li a:before { + content: ""; + width: 8px; + height: 1px; + background: rgba(255,255,255,0.075); + position: absolute; + left: 1px; + top: 17px; + } + .sidebar-nav > li > ul li.active a { + color: #fff; + } + +/* 3. NAVBAR +--------------------------------------------------------- */ +#navbar-wrapper { + width: 100%; + position: absolute; + z-index: 2; +} +#wrapper.toggled #navbar-wrapper { + position: absolute; + margin-right: -250px; +} + #navbar-wrapper .navbar { + padding: 10px 15px; + border-width: 0 0 0 0; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); + font-size: 24px; + margin-bottom: 0; + } + #navbar-wrapper .navbar .navbar-header { + float: left; + } + #navbar-wrapper .navbar .navbar-header .navbar-brand { + font-size: 24px; + } + + #navbar-wrapper .navbar ul.navbar-nav { + float: right; + } + #navbar-wrapper .navbar ul.navbar-nav li { + float: left; + } + #navbar-wrapper .navbar ul.navbar-nav li:not(.hello) a { + color: #F8BE12; + } + #navbar-wrapper .navbar ul.navbar-nav li:not(.hello) a:hover { + color: #656565; + } + #navbar-wrapper .navbar ul.navbar-nav li.hello a { + pointer-events: none; + } + #navbar-wrapper .navbar ul.navbar-nav li.hello a span { + font-size: 70%; + position: relative; + bottom: 2px; + } + +/* 4. CONTENT +--------------------------------------------------------- */ +#content-wrapper { + width: 100%; + position: absolute; + padding: 15px; + top: 100px; +} +#wrapper.toggled #content-wrapper { + position: absolute; + margin-right: -250px; +} +.content-title { + margin: 11px 0 30px 0; +} +h3.panel-title { + font-weight: 400; +} + h3.panel-title .btn { + color: #fff; + } +.panel-heading { + position: relative; +} +.panel-heading .nav-tabs { + position: absolute; + bottom: 0; + right: 13px; + border-bottom: 0; +} + .panel-heading .nav-tabs > li a { + padding: 5px 10px; + margin-left: 2px; + } + .panel-heading .nav-tabs > li.active a { + border-bottom: 1px solid #fff; + background-color: #fff; + color: #616262; + } + +#notify { + display: none; + width: 100%; + position: absolute; + padding: 12px 30px; + color: #fff; + box-sizing: border-box; + margin: 0; + top: 75px; +} + #notify.alert-danger:before { + content: '\f071'; + font-family: 'FontAwesome'; + padding-right: 1em; + } + #notify.alert-success:before { + content: '\f00c'; + font-family: 'FontAwesome'; + padding-right: 1em; + } + #notify .close { + position: static; + } + + +/* 5. FOOTER +--------------------------------------------------------- */ +footer { + position: absolute; + right: 10px; + bottom: 5px; + height: 20px; + width: calc(100% - 15px); + text-align: right; + font-size: 12px; +} + +/* 6. LOGIN +--------------------------------------------------------- */ +#login { + width: 90%; + max-width: 420px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); +} + #login .panel { + border: 0; + box-shadow: none; + background: none; + } + + #login .panel-heading { + background-color: #222; + color: #F8BE12; + text-align: center; + border: 0; + margin-top: -1px; + } + #login .panel-heading img { + height: 25px; + width: auto; + display: inline-block; + vertical-align: middle; + margin-right: 2px; + } + #login .panel-heading h2 { + font-weight: 600; + display: inline-block; + vertical-align: middle; + margin: 0; + font-size: 21px; + } + #login .panel-heading h2 span { + color: #FFF; + } + + #login .panel-body { + background: #FFF; + } + #login .panel-body .remember-me { + margin-top: 8px; + font-weight: 400; + font-size: 14px; + } + + #login #notify { + display: block; + position: static; + width: 100%; + display: block; + margin-top: 20px; + text-align: center; + } + #login .fa-lock { + padding: 0 1px 0 1px; + } + +/* 7. CUSTOM CHECKBOXES & RADIO BUTTONS +--------------------------------------------------------- */ +.toggle, +.toggleR { + position: relative; + background: #fff; + border: 1px solid #ccc; + display: inline-block; + vertical-align: middle; + width: 18px; + height: 18px; + padding: 2px; + margin-right: 5px; +} + .toggle.checked:after { + content: '\2713'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #F8BE12; + font-weight: bold; + } +.toggleR { + border-radius: 50%; +} + .toggleR.checked:after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 10px; + height: 10px; + margin: -5px 0 0 -5px; + background-color: #F8BE12; + border-radius: 50%; + } +.toggle.disabled, +.toggleR.disabled { + opacity: .7; +} +.checkbox-inline .toggle, +.radio-inline .toggleR { + margin-left: -20px; +} + +/* 8. CUSTOM SELECTORS +--------------------------------------------------------- */ +#selectator_dimmer { + background-color: rgba(0, 0, 0, 0); + width: 100%; + height: 100%; + left: 0; + top: 0; + bottom: 0; + right: 0; + position: fixed; + z-index: 100; +} +.selectator_element { + width: 100%; + border: 1px solid #ccc; + box-sizing: border-box; + background-color: #fff; + display: inline-block; + text-decoration: none; + vertical-align: middle; + box-shadow: inset 0 1px 1px rgba(0,0,0,.075); +} +.selectator_element * { + box-sizing: border-box; + text-decoration: none; +} +.selectator_element img { + display: block; +} +.selectator_element.disabled { + background-color: #f5f5f5; + cursor: not-allowed; +} +.selectator_element.disabled * { + cursor: not-allowed !important; +} +.selectator_element.multiple { + padding: 4px 20px 4px 12px !important; +} +.selectator_element.single { + height: 39px; + padding: 9px 12px !important; +} +.selectator_element.focused { + border: 1px solid #ffce54; + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(255, 206, 84, 0.6); +} +.selectator_element:after { + position: absolute; + content: '\25BC'; + font-size: 70%; + transform: scaleY(0.75); + right: 4px; + color: #434a54; + top: 50%; + line-height: 0; +} +.selectator_element.loading:before { + border: 3px solid rgba(0, 0, 0, 0.1); + border-top: 3px solid rgba(0, 0, 0, 0.5); + border-radius: 50%; + width: 14px; + line-height: 0; + height: 14px; + margin-top: -10px; + animation: selectator_spinner 500ms linear infinite; + content: ''; + position: absolute; + right: 20px; + top: 50%; +} + +.selectator_selected_items .selectator_placeholder { + font-size: 80%; + color: rgba(0, 0, 0, 0.5); +} +.single .selectator_selected_items { + display: block; +} +.multiple .selectator_selected_items { + display: inline; +} +.selectator_selected_items .selectator_selected_item { + color: rgba(0, 0, 0, 0.75); + position: relative; + vertical-align: top; +} +.single .selectator_selected_items .selectator_selected_item { + background-color: transparent; + display: block; + margin: 0; + padding: 0; + font-size: inherit; + text-decoration: none; +} +.multiple .selectator_selected_items .selectator_selected_item { + background-color: #f5f5f5; + display: inline-block; + margin: 2.5px 5px 2.5px 0; + padding: 0 20px 0 5px; + font-size: 80%; + border: 1px solid #ccc; + line-height: 22px; +} +.selectator_selected_items .selectator_selected_item .selectator_selected_item_left { + float: left; +} +.single .selectator_selected_items .selectator_selected_item .selectator_selected_item_left { + float: left; + width: 30px; +} +.single .selectator_selected_items .selectator_selected_item .selectator_selected_item_left img { + height: 22px; +} +.multiple .selectator_selected_items .selectator_selected_item .selectator_selected_item_left { + float: left; + width: 22px; +} +.multiple .selectator_selected_items .selectator_selected_item .selectator_selected_item_left img { + height: 18px; +} +.single .selectator_selected_items .selectator_selected_item .selectator_selected_item_title { + height: auto; + line-height: 1.3; +} +.multiple .selectator_selected_items .selectator_selected_item .selectator_selected_item_title { + float: left; + font-weight: 700; +} +.selectator_selected_items .selectator_selected_item .selectator_selected_item_subtitle { + display: none; +} +.single .selectator_selected_items .selectator_selected_item .selectator_selected_item_right { + float: right; + background-color: #ac6; + color: #fff; + font-weight: bold; + font-size: 80%; + text-align: center; + line-height: 16px; + border-radius: 12px; + padding: 2px 12px; + margin-right: 40px; +} +.multiple .selectator_selected_items .selectator_selected_item .selectator_selected_item_right { + display: none; +} +.single .selectator_selected_items .selectator_selected_item .selectator_selected_item_remove { + display: block; + position: absolute; + right: 16px; + cursor: pointer; + font-size: 75%; + font-weight: bold; + color: rgba(0, 0, 0, 0.75); + padding: 2px; + line-height: 0; + top: 50%; + transform: scaleX(1.2); +} +.multiple .selectator_selected_items .selectator_selected_item .selectator_selected_item_remove { + display: inline-block; + font-weight: bold; + color: rgba(0, 0, 0, 0.75); + margin: 0 0 0 5px; + cursor: pointer; + font-size: 100%; + font-weight: 700; + line-height: 22px; + vertical-align: top; + border-radius: 0 2px 2px 0; + position: absolute; + right: 0; + top: 0; + bottom: 0; + padding: 0 5px 0 5px; +} +.multiple .selectator_selected_items .selectator_selected_item .selectator_selected_item_remove:hover { + background-color: rgba(0, 0, 0, 0.1); +} + +.selectator_input, .selectator_textlength { + border: 0; + display: inline-block; + margin: 0; + background-color: transparent; + font-size: 13px; + outline: none; +} +.multiple .selectator_input, .multiple .selectator_textlength { + padding: 3px 0 0 0; + margin: 3px 0 2px 5px; +} +.single .selectator_input { + border: 1px solid #ccc; + position: absolute; + bottom: -41px; + left: -1px; + z-index: 101; + padding: 9px 12px; + width: 100%; + width: calc(100% + 2px); + border-bottom: 0; + background-color: #f5f5f5; + color: #333; + font-size: inherit; +} +.single.options-hidden .selectator_input { + opacity: 0; + position: absolute; + left: -10000px; +} +.single.options-visible .selectator_input { + opacity: 1; +} +.disable_search .selectator_input { + opacity: 0; + padding: 0 1px 1px 0 !important; +} + +.selectator_options { + margin: 0; + padding: 0; + border: 1px solid #ccc; + position: absolute; + box-sizing: border-box; + z-index: 101; + background-color: #fff; + overflow-y: auto; + list-style: none; + left: -1px; + right: -1px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1); +} +.disable_search .selectator_options { + border-top: 1px solid #ccc; +} +.single.disable_search .selectator_options { + padding-top: 0; +} +.options-hidden .selectator_options { + display: none; +} +.selectator_options .selectator_group { + padding: 5px; + font-weight: bold; +} +.selectator_options .selectator_option { + padding: 5px; + cursor: pointer; + color: #434a54; +} +.selectator_options .selectator_option.selectator_group_option { + padding-left: 20px; +} +.selectator_options .selectator_option:before, .selectator_options .selectator_option:after { + content: ""; + display: table; +} +.selectator_options .selectator_option:after { + clear: both; +} +.selectator_options .selectator_option .selectator_option_left { + float: left; + margin: 0 8px 0 12px; +} +.selectator_options .selectator_option .selectator_option_left img { + height: 30px; + border-radius: 2px; +} +.selectator_options .selectator_option .selectator_option_title { + margin-left: 12px; +} +.selectator_options .selectator_option .selectator_option_subtitle { + font-size: 70%; + color: rgba(0, 0, 0, 0.5); + margin-top: -4px; + margin-bottom: -1px; + margin-left: 12px; +} +.selectator_options .selectator_option .selectator_option_right { + float: right; + color: #434a54; + font-weight: bold; + font-size: 80%; + text-align: center; + line-height: 16px; + border-radius: 12px; + padding: 2px 12px; + margin-top: 4px; +} +.selectator_options .selectator_option.active { + background-color: #f5f5f5; +} +.selectator_options .selectator_option.active .selectator_option_subtitle { + color: rgba(255, 255, 255, 0.6); +} +@keyframes selectator_spinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +/* 9. OTHER STUFF +--------------------------------------------------------- */ +[class*="bg-"] { + padding: 15px; +} +.well .label { + font-size: 80%; + padding: .4em .9em .4em; +} +.tooltip-inner { + white-space: pre; +} +.table>tbody>tr>td { + vertical-align: middle; +} +.table a:not(.btn), +table a:not(.btn) { + text-decoration: none; +} +.pagination { + margin: 21px 0 0 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #f5f5f5; +} +select[multiple].form-control { + height: 39px; +} +.text-muted { + color:#bababa; +} +.modal-title { + font-weight: 400; +} + +/* 10. HELPERS +--------------------------------------------------------- */ +.no-margin { + margin: 0; +} +.no-top-margin { + margin-top: 0; +} +.no-bottom-margin { + margin-bottom: 0; +} +.margin-tiny { + margin-bottom: 1rem; +} +.margin-small { + margin-bottom: 2rem; +} +.margin-medium { + margin-bottom: 4rem; +} +.margin-large { + margin-bottom: 6rem; +} + +/* 11. MEDIA QUERIES +--------------------------------------------------------- */ +.panel-heading .tinynav { + position: absolute; + top: 7px; + right: 15px; + display: block +} +.panel-heading .nav-tabs { + display: none +} + +@media(min-width: 768px) { + #wrapper { + padding-left: 250px; + } + + #wrapper.toggled { + padding-left: 0; + } + + #sidebar-wrapper { + width: 250px; + } + + #wrapper.toggled #sidebar-wrapper { + width: 0; + } + + #navbar-wrapper { + position: relative; + } + + #content-wrapper { + position: relative; + top: 0; + } + + #wrapper.toggled #navbar-wrapper, + #wrapper.toggled #content-wrapper { + position: relative; + margin-right: 0; + } + + #notify { + position: relative; + top: 0; + } + + .panel-heading .tinynav { + display: none; + } + .panel-heading .nav-tabs { + display: block; + } +} \ No newline at end of file diff --git a/themes/admin/img/logo.svg b/themes/admin/img/logo.svg new file mode 100644 index 0000000..35b23b3 --- /dev/null +++ b/themes/admin/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/themes/admin/img/unknown_theme.png b/themes/admin/img/unknown_theme.png new file mode 100644 index 0000000000000000000000000000000000000000..adf94c5c48fd472b39e354f443da244d9e4cc604 GIT binary patch literal 32632 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 XUq9p-k5xDT2%@H}1us>!4F5j>N`ZlO literal 0 HcmV?d00001 diff --git a/themes/admin/index.html b/themes/admin/index.html new file mode 100644 index 0000000..d7cb515 --- /dev/null +++ b/themes/admin/index.html @@ -0,0 +1,98 @@ + + + + + + + Batflat - {$module.name} + + + + + + + + + + + + + {loop: $bat.header}{$value}{/loop} + + + + +
    + + + + + + {if: $bat.notify} + + {/if} + +
    +
    +
    +
    +

    {$module.name}

    + {$module.content} +
    +
    +
    +
    + +
    + + + + + {loop: $bat.footer}{$value}{/loop} + + \ No newline at end of file diff --git a/themes/admin/js/kalypto.min.js b/themes/admin/js/kalypto.min.js new file mode 100644 index 0000000..b93cc28 --- /dev/null +++ b/themes/admin/js/kalypto.min.js @@ -0,0 +1 @@ +!function(e){"use strict";function t(t){function s(){var s=e(this);if(void 0===s.data("kalypto")){var n=new e.kalypto(this,t);s.data("kalypto",n)}else console.log("Kalypto is already defined on this element.",s)}return this.each(s)}function s(t,s){function n(){d.settings=e.extend({},o,s),i(),a()}function i(){function e(){var e=d.settings.toggleClass;if(d.settings.copyInputClasses){var t=g.attr("class");t&&(e+=" "+t)}return d.settings.customClasses.length&&(e+=" "+d.settings.customClasses),g.is("[disabled]")&&(e+=" disabled"),g.is(":checked")?''+d.settings.dataLabel+"":''+d.settings.dataLabel+""}g.next().hasClass(d.settings.toggleClass)||(g.after(e),d.settings.hideInputs&&g.hide(),l=g.next(),g.trigger(d.settings.elBuiltEvent))}function a(){g.next().bind("click",c),g.bind("change",c)}function c(t){function s(){"radio"===g.attr("type")&&i.each(n),g.trigger(g.is(":checked")?d.settings.checkedEvent:d.settings.uncheckedEvent),g.next().toggleClass(d.settings.checkedClass)}function n(t,s){var n=e(s);n.next().removeClass(d.settings.checkedClass),n.is(":checked")||d.lastClickedEl===n.next().get(0)||n.trigger(d.settings.uncheckedEvent)}var i="radio"===g.attr("type")?e('input[name="'+g.attr("name")+'"]'):g;if("INPUT"!==this.tagName){if(t.preventDefault(),g.is("[disabled]"))return;d.lastClickedEl=this,g.trigger("click")}else setTimeout(s,0)}var l,d=this,g=e(t),o={toggleClass:"toggle",checkedClass:"checked",hideInputs:!0,copyInputClasses:!0,dataLabel:g.data("label")||"",checkedEvent:"k_checked",uncheckedEvent:"k_unchecked",elBuiltEvent:"k_elbuilt",customClasses:""};d.settings={},d.init=n,d.init()}e.kalypto=s,e.fn.kalypto=t}(jQuery); \ No newline at end of file diff --git a/themes/admin/js/scripts.js b/themes/admin/js/scripts.js new file mode 100644 index 0000000..769ec35 --- /dev/null +++ b/themes/admin/js/scripts.js @@ -0,0 +1,147 @@ +/* 1. TOGGLE SIDEBAR +--------------------------------------------------------- */ +$("#sidebar-toggle").click(function(e) { + e.preventDefault(); + $("#wrapper").toggleClass("toggled"); +}); + +/* 2. COLLAPSE LINKS IN SIDEBAR +--------------------------------------------------------- */ +$('.sidebar-nav li a').click(function(e) +{ + if($('li:hidden', $(this).next()).length) + { + e.preventDefault(); + $('.sidebar-nav li ul.in').collapse('hide'); + $(this).next('ul').collapse('show'); + } + else if($('li:visible', $(this).next()).length) + { + e.preventDefault(); + $(this).next('ul').collapse('hide'); + } +}); +$('.sidebar-nav li.active ul').addClass('in'); + +/* 3. CONFIRM BOX +--------------------------------------------------------- */ +$(document).on('click touchstart', '[data-confirm]:not(.disabled):not([disabled])', function(evt) +{ + evt.preventDefault(); + var text = $(this).attr('data-confirm'); + var source = $(this); + + bootbox.confirm({ + message: text, + callback: function(result) { + if(result) + { + if(source.is('[type="submit"]')) + { + $(document).off('click touchstart', '[data-confirm]:not(.disabled):not([disabled])'); + source.click(); + } + else if(source.is('a')) + { + $(location).attr('href', source.attr('href')); + } + } + } + }); +}); + +/* 4. TOOLTIP ACTIVATION +--------------------------------------------------------- */ +$(function () { + $("[data-toggle='tooltip']").tooltip(); + $("[data-toggle='popover']").popover(); +}); + +/* 5. NOTIFICATION +--------------------------------------------------------- */ +$(function () { + if($('#notify').length) + { + $('#notify').slideDown(500); + if($( window ).width() < 768) + $('#content-wrapper').animate({'top' : '+=46'}, 500); + + setTimeout(function() { + $('#notify').slideUp(500); + if($( window ).width() < 768) + $('#content-wrapper').animate({'top' : '-=46'}, 500); + }, 8000); + } +}); + +/* 6. SORTABLE SIDEBAR +--------------------------------------------------------- */ +$(function () { + sortable('.sidebar-nav', {handle:'i'})[0].addEventListener('sortupdate', function(e) { + var baseURL = batflat.url + '/' + batflat.admin; + var items = {}; + + $(e.detail.endparent).children('li').each(function(index, element) { + var module = $(element).data('module'); + items[module] = index; + }); + + $.ajax({ + url: baseURL + '/settings/changeOrderOfNavItem?t=' + batflat.token, + type: 'POST', + cache: false, + data: items, + success: function(respond) { + console.log(respond); + } + }); + }); +}); + +/* 7. TINYNAV +--------------------------------------------------------- */ +$(function () { + $('.panel-heading .nav-tabs').tinyNav({ + active: 'active' + }); +}); + +/* 8. CUSTOM CHECKBOXES & RADIO BUTTONS +--------------------------------------------------------- */ +$(':checkbox').kalypto(); +$(':radio').kalypto({toggleClass: 'toggleR'}); + +/* 9. REMOTE MODAL +--------------------------------------------------------- */ +$('a[data-toggle="modal"]').on('click', function(e) { + var target_modal = $(e.currentTarget).data('target'); + var remote_content = $(e.currentTarget).attr('href'); + + if(remote_content.indexOf('#') === 0) return; + + var modal = $(target_modal); + var modalContent = $(target_modal + ' .modal-content'); + + modal.off('show.bs.modal'); + modal.on('show.bs.modal', function () { + modalContent.load(remote_content); + }).modal(); + + return false; +}); + +/* 10. CUSTOM SELECT +--------------------------------------------------------- */ +$('select').each(function () { + var options = { + useDimmer: true, + useSearch: false, + labels: { + search: '...' + } + }; + $.each($(this).data(), function (key, value) { + options[key] = value; + }); + $(this).selectator(options); +}); \ No newline at end of file diff --git a/themes/admin/js/selectator.min.js b/themes/admin/js/selectator.min.js new file mode 100644 index 0000000..9aee847 --- /dev/null +++ b/themes/admin/js/selectator.min.js @@ -0,0 +1,9 @@ + /* + Selectator jQuery Plugin + version 3.1, 30.04.2017 + by Ingi P. Jacobsen (Faroe Media) & Sruu.pl + + The MIT License (MIT) + */ + +!function(a){"use strict";a.selectator=function(b,c){var d={prefix:"selectator_",width:"100%",height:"auto",optionsHeight:"158px",useDimmer:!1,useSearch:!0,useOnMobile:!1,showAllOptionsOnFocus:!1,selectFirstOptionOnSearch:!0,keepOpen:!1,submitCallback:function(){},load:null,delay:0,minSearchLength:0,valueField:"value",textField:"text",searchFields:["value","text"],placeholder:"",render:{selected_item:function(a,b){var c="";return void 0!==a.left&&(c+='
    '+a.left+"
    "),void 0!==a.right&&(c+='
    '+a.right+"
    "),c+='
    '+(void 0!==a.text?b(a.text):"")+"
    ",void 0!==a.subtitle&&(c+='
    '+b(a.subtitle)+"
    "),c+='
    x
    '},option:function(a,b){var c="";return void 0!==a.left&&(c+='
    '+a.left+"
    "),void 0!==a.right&&(c+='
    '+a.right+"
    "),c+='
    '+(void 0!==a.text?b(a.text):"")+"
    ",void 0!==a.subtitle&&(c+='
    '+b(a.subtitle)+"
    "),c}},labels:{search:"Search..."}},e=this;e.options={},e.$source_element=a(b),e.$container_element=null,e.$selecteditems_element=null,e.$input_element=null,e.$textlength_element=null,e.$options_element=null,e.usefilterResults=!0;var f=void 0===e.$source_element.attr("multiple"),g=!f,h=e.$source_element.is(":disabled"),i=/Mobi/i.test(navigator.userAgent),j=!1,k=!0,l=null,m={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,capslock:20,escape:27,pageup:33,pagedown:34,end:35,home:36,left:37,up:38,right:39,down:40};e.init=function(){if(e.options=a.extend(!0,{},d,c),a.each(e.$source_element.data(),function(a,b){"selectator"==a.substring(0,10)&&(e.options[a.substring(10,11).toLowerCase()+a.substring(11)]=b)}),e.options.searchFields="string"==typeof e.options.searchFields?e.options.searchFields.split(" "):e.options.searchFields,e.$source_element.find("option").each(function(){a(this).data("value",this.value),a(this).data("text",this.text)}),j=null!==e.options.load,e.options.useDimmer&&0===a("#"+e.options.prefix+"dimmer").length){var b=a(document.createElement("div"));b.attr("id",e.options.prefix+"dimmer"),b.hide(),a(document.body).prepend(b)}e.$source_element.addClass("selectator"),e.$source_element.attr("placeholder")&&(e.options.placeholder=e.$source_element.attr("placeholder")),e.$container_element=a(document.createElement("div")),void 0!==e.$source_element.attr("id")&&e.$container_element.attr("id",e.options.prefix+e.$source_element.attr("id")),e.$container_element.addClass(e.options.prefix+"element "+(g?"multiple ":"single ")+"options-hidden"),e.options.useSearch||e.$container_element.addClass("disable_search"),h&&e.$container_element.addClass("disabled"),e.$container_element.css({width:e.options.width,minHeight:"auto"===e.options.height?e.$source_element.css("height"):e.options.height,padding:e.$source_element.css("padding"),"flex-grow":e.$source_element.css("flex-grow"),position:"relative"}),"element"===e.options.height&&e.$container_element.css({height:e.$source_element.outerHeight()+"px"}),e.$textlength_element=a(document.createElement("span")),e.$textlength_element.addClass(e.options.prefix+"textlength"),e.$textlength_element.css({position:"absolute",visibility:"hidden"}),e.$container_element.append(e.$textlength_element),e.$selecteditems_element=a(document.createElement("div")),e.$selecteditems_element.addClass(e.options.prefix+"selected_items"),e.$container_element.append(e.$selecteditems_element),e.$input_element=a(document.createElement("input")),e.$input_element.addClass(e.options.prefix+"input"),e.$input_element.attr("tabindex",e.$source_element.attr("tabindex")),e.options.useSearch?f?e.$input_element.attr("placeholder",e.options.labels.search):(""!=e.options.placeholder&&e.$input_element.attr("placeholder",e.options.placeholder),e.$input_element.width(20)):(e.$input_element.attr("readonly",!0),e.$input_element.css({width:"0px",height:"0px",overflow:"hidden",border:0,padding:0,position:"absolute"})),e.$input_element.attr("autocomplete","false"),e.$container_element.append(e.$input_element),e.$options_element=a(document.createElement("ul")),e.$options_element.addClass(e.options.prefix+"options"),e.$options_element.css("max-height",e.options.optionsHeight),e.$container_element.append(e.$options_element),e.$source_element.after(e.$container_element),e.$source_element.hide(),"undefined"!=typeof Scrollator&&e.$options_element.scrollator({zIndex:1001,customClass:"ease_preventOverlay"}),e.$source_element.change(function(){o()}),e.$container_element.not(".disabled").on("focus",function(){e.$input_element.focus(),e.$input_element.trigger("focus")}),e.$container_element.not(".disabled").on("mousedown",function(a){if(a.preventDefault(),e.$input_element.focus(),e.$input_element.trigger("focus"),e.$input_element[0].setSelectionRange)e.$input_element[0].setSelectionRange(e.$input_element.val().length,e.$input_element.val().length);else if(e.$input_element[0].createTextRange){var b=e.$input_element[0].createTextRange();b.collapse(!0),b.moveEnd("character",e.$input_element.val().length),b.moveStart("character",e.$input_element.val().length),b.select()}}),e.$container_element.not(".disabled").on("click",function(){e.$input_element.focus(),e.$input_element.trigger("focus")}),e.$container_element.not(".disabled").on("dblclick",function(){e.$input_element.select(),e.$input_element.trigger("focus")}),e.$input_element.on("keydown",function(a){var b=a.keyCode||a.which,c=null,d=null;switch(b){case m.up:a.preventDefault(),t(),c=e.$options_element.find(".active"),0!==c.length?(d=c.prevUntil("."+e.options.prefix+"option:visible").add(c).first().prev("."+e.options.prefix+"option:visible"),c.removeClass("active"),d.addClass("active")):e.$options_element.find("."+e.options.prefix+"option").filter(":visible").last().addClass("active"),v();break;case m.down:a.preventDefault(),t(),c=e.$options_element.find(".active"),0!==c.length?(d=c.nextUntil("."+e.options.prefix+"option:visible").add(c).last().next("."+e.options.prefix+"option:visible"),c.removeClass("active"),d.addClass("active")):e.$options_element.find("."+e.options.prefix+"option").filter(":visible").first().addClass("active"),v();break;case m.escape:a.preventDefault();break;case m.enter:a.preventDefault(),c=e.$options_element.find(".active"),0!==c.length?w():""!==e.$input_element.val()&&e.options.submitCallback(e.$input_element.val()),n();break;case m.backspace:e.options.useSearch?(""===e.$input_element.val()&&g&&e.$source_element.find("option:selected").length&&(e.$source_element.find("option:selected").last()[0].removeAttribute("selected"),e.$source_element.find("option:selected").last()[0].selected=!1,e.$source_element.trigger("change"),o()),n()):a.preventDefault();break;default:n()}}),e.$input_element.on("keyup",function(a){a.preventDefault(),a.stopPropagation();var b=a.which;switch(b){case m.escape:u();break;case m.enter:e.options.keepOpen||u();break;case m.left:case m.right:case m.up:case m.down:case m.tab:case m.shift:break;default:r()}!e.$container_element.hasClass("options-hidden")||b!==m.left&&b!==m.right&&b!==m.up&&b!==m.down||t(),n()}),e.$input_element.on("focus",function(){e.$container_element.addClass("focused"),(f||e.options.showAllOptionsOnFocus||!e.options.useSearch)&&t()}),e.$input_element.on("blur",function(){e.$container_element.removeClass("focused"),u()}),e.$container_element.not(".disabled").on("mouseup","."+e.options.prefix+"selected_item_remove",function(){var b=a(this).closest("."+e.options.prefix+"selected_item").data("source_item_element");b.removeAttribute("selected"),b.selected=!1,f&&e.$source_element.find('[value=""]').length&&(e.$source_element.find('[value=""]')[0].selected=!0,e.$source_element.find('[value=""]')[0].removeAttribute("selected")),e.$source_element.trigger("change"),s(e.usefilterResults),p(),o()}),e.$container_element.on("mouseover","."+e.options.prefix+"option",function(){e.$options_element.find(".active").removeClass("active"),a(this).addClass("active")}),e.$container_element.on("mousedown","."+e.options.prefix+"option",function(a){a.preventDefault(),a.stopPropagation()}),e.$container_element.on("mouseup","."+e.options.prefix+"option",function(){w()}),e.$container_element.on("click","."+e.options.prefix+"option",function(a){a.stopPropagation()}),e.options.$source_element=e.$source_element,e.options.$container_element=e.$container_element,e.options.$selecteditems_element=e.$selecteditems_element,e.options.$input_element=e.$input_element,e.options.$textlength_element=e.$textlength_element,e.options.$options_element=e.$options_element,p(),o(),n()};var n=function(){if(g){e.$textlength_element.text(""===e.$input_element.val()&&""!==e.options.placeholder?e.options.placeholder:e.$input_element.val());var a=e.$textlength_element.width()>e.$container_element.width()-30?e.$container_element.width()-30:e.$textlength_element.width()+30;e.$input_element.css({width:a+"px"})}},o=function(){e.$selecteditems_element.empty(),e.$source_element.find("option").each(function(){var b=a(this);if(this.selected){var c=a(document.createElement("div"));c.data("source_item_element",this),c.addClass(e.options.prefix+"selected_item"),c.addClass(e.options.prefix+"value_"+b.val().replace(/\W/g,"")),void 0!==b.attr("class")&&c.addClass(b.attr("class"));var d={value:this.value,text:this.text};a.each(this.attributes,function(){this.specified&&(d[this.name.replace("data-","")]=this.value)}),a.extend(d,a(this).data("item_data")),c.append(e.options.render.selected_item(d,x)),!f||""!=d[e.options.valueField]&&void 0!==d[e.options.valueField]&&0!==e.$source_element.find('[value=""]').length||c.find("."+e.options.prefix+"selected_item_remove").remove(),e.$selecteditems_element.append(c)}}),f&&(""==e.options.placeholder||""!==e.$source_element.val()&&null!==e.$source_element.val()?e.$selecteditems_element.find("."+e.options.prefix+"placeholder").remove():(e.$selecteditems_element.empty(),e.$selecteditems_element.append('
    '+e.options.placeholder+"
    ")))},p=function(){e.$options_element.empty();var b=[];e.$source_element.children().each(function(){if("optgroup"===a(this).prop("tagName").toLowerCase()){var c=a(this);if(0!==c.children("option").length){var d=[];c.children("option").each(function(){d.push({type:"option",text:a(this).html(),element:this})}),b.push({type:"group",text:c.attr("label"),options:d,element:c})}}else b.push({type:"option",text:a(this).html(),element:this})}),a(b).each(function(){if("group"===this.type){var b=a(document.createElement("li"));b.addClass(e.options.prefix+"group"),void 0!==a(this.element).attr("class")&&b.addClass(a(this.element).attr("class")),b.html(a(this.element).attr("label")),e.$options_element.append(b),a(this.options).each(function(){var a=q.call(this.element,!0);e.$options_element.append(a)})}else{var c=q.call(this.element,!1);e.$options_element.append(c)}}),s(e.usefilterResults)},q=function(b){var c=a(document.createElement("li"));c.data("source_option_element",this),c.addClass(e.options.prefix+"option"),c.addClass(e.options.prefix+"value_"+a(this).val().replace(/\W/g,"")),b&&c.addClass(e.options.prefix+"group_option"),this.selected&&c.addClass("active"),void 0!==a(this).attr("class")&&c.addClass(a(this).attr("class"));var d={value:this.value,text:this.text};return a.each(this.attributes,function(){this.specified&&(d[this.name.replace("data-","")]=this.value)}),a.extend(d,a(this).data("item_data")),g&&this.selected&&c.hide(),c.append(e.options.render.option(d,x)),c},r=function(){clearTimeout(l),l=setTimeout(function(){e.$container_element.addClass("loading"),j?e.options.load(e.$input_element.val(),function(b,c){if(e.usefilterResults=void 0!==c&&c,e.$source_element.children("option").not(":selected").not('[value=""]').remove(),void 0!==b){var d=[];if(a.each(e.$source_element.children("option:selected"),function(a,b){d.push(b.value)}),f&&0===e.$source_element.find('[value=""]').length&&e.$source_element.prepend(a('')),e.$input_element.val().replace(/\s/g,"").length>=e.options.minSearchLength)for(var g=0;g'+h[e.options.textField]+"");e.$source_element.append(i),i.data("item_data",h)}}}p(),e.$container_element.removeClass("loading"),s(e.usefilterResults)}):(e.$container_element.removeClass("loading"),s(e.usefilterResults))},e.options.delay)},s=function(b){b=void 0!==b&&b;var c=e.$input_element.val().replace(/\s/g,"").length0&&e.$options_element.scrollTop(e.$options_element.scrollTop()+a.position().top-e.$options_element.height()/2+a.height()/2)},w=function(){var a=e.$options_element.find(".active");a.data("source_option_element").selected=!0,a.data("source_option_element").removeAttribute("selected"),e.$source_element.trigger("change"),e.options.keepOpen||e.$input_element.val(""),s(e.usefilterResults),o(),n(),j&&!e.options.keepOpen&&(e.$source_element.children("option").not(":selected").not('[value=""]').remove(),p(),u()),e.options.keepOpen||u()},x=function(a){return(a+"").replace(/&/g,"&").replace(//g,">").replace(/"/g,""")};e.refresh=function(){o()},e.destroy=function(){e.$container_element.remove(),a.removeData(b,"selectator"),e.$source_element.show(),0===a("."+e.options.prefix+"element").length&&a("#"+e.options.prefix+"dimmer").remove()},e.init(),!e.options.useOnMobile&&i&&e.destroy()},a.fn.selectator=function(b){var c=void 0!==b?b:{};return this.each(function(){var b=a(this);if("object"==typeof c){if(void 0===b.data("selectator")){var d=new a.selectator(this,c);b.data("selectator",d)}}else b.data("selectator")[c]?b.data("selectator")[c].apply(this,Array.prototype.slice.call(arguments,1)):a.error("Method "+c+" does not exist in $.selectator")})}}(jQuery); \ No newline at end of file diff --git a/themes/admin/login.html b/themes/admin/login.html new file mode 100644 index 0000000..7270a0c --- /dev/null +++ b/themes/admin/login.html @@ -0,0 +1,56 @@ + + + + + + + Batflat + + + + + + + + + + +
    +
    +
    + logo

    batflat

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    + + +
    +
    +
    +
    + {if: $bat.notify} +
    {$bat.notify.text}
    + {/if} +
    + + + + \ No newline at end of file diff --git a/themes/batblog/blog.html b/themes/batblog/blog.html new file mode 100644 index 0000000..e79e6b0 --- /dev/null +++ b/themes/batblog/blog.html @@ -0,0 +1,80 @@ +{template: inc/header.html} + + +
    +
    +
    +
    +
    +

    {$blog.title}

    +
    + {$blog.desc} +
    +
    +
    +
    +
    + + +
    +
    +
    + {if: $bat.notify} +
    {$bat.notify.text}
    + {/if} + + {loop: $blog.posts} + + {/loop} + + +
    + {template: inc/sidebar.html} +
    +
    + +{template: inc/footer.html} \ No newline at end of file diff --git a/themes/batblog/css/style.css b/themes/batblog/css/style.css new file mode 100644 index 0000000..92c8a7f --- /dev/null +++ b/themes/batblog/css/style.css @@ -0,0 +1,645 @@ +@import url('//fonts.googleapis.com/css?family=Roboto:300,400,700,800&subset=latin-ext'); +body { + font-family: 'Roboto', sans-serif; + font-size: 16px; + font-weight: 300; + color: #888; + background-color: #fff; +} +p { + line-height: 1.5; + margin: 30px 0; +} +p a { + text-decoration: underline +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Roboto', sans-serif; + font-weight: 800; +} +a { + color: #404040 +} +a:hover, +a:focus { + color: #f8be12 +} +blockquote { + color: #808080; + font-style: italic; +} +hr.small { + max-width: 100px; + margin: 10px auto; + border-width: 1px; + border-color: white; +} +.navbar-custom { + position: absolute; + left: 0; + width: 100%; + z-index: 3; + font-family: 'Roboto', sans-serif; + border:0; + border-radius: 0; +} +.navbar-custom .navbar-brand { + font-weight: 800 +} +.navbar-custom .nav > li > a { + font-size: 16px; + font-weight: 400; + letter-spacing: 1px; + border-bottom: 1px solid transparent; +} +.navbar-custom .nav > li.active > a { + color: #f8be12; + border-color: transparent; +} +.navbar-default .navbar-nav>.open>a, +.navbar-default .navbar-nav>.open>a:hover, +.navbar-default .navbar-nav>.open>a:focus { + background-color: transparent +} +@media only screen and (min-width: 768px) { + .navbar-custom { + background: transparent; + border-bottom: 1px solid transparent; + } + .navbar-custom .navbar-brand { + color: white; + padding: 20px; + } + .navbar-custom .navbar-brand:hover, + .navbar-custom .navbar-brand:focus { + color: rgba(255, 255, 255, 0.8) + } + .navbar-custom .nav > li > a { + color: white; + padding: 20px; + font-weight: 300; + } + .navbar-custom .nav > li.active > a { + color: #fff; + border-color: #fff; + } + .navbar-custom .nav > li.active > a:hover { + color: #fff; + opacity: .85; + } + .navbar-custom .nav > li > form { + padding: 12px; + } + .navbar-custom .nav > li > form > select { + background:transparent; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='white'%3E%E2%96%BE%3C/text%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: center right; + padding:6px 22px 6px 12px; + border:1px solid #FFF; + color:#FFF; + border-radius: 0; + -moz-appearance: none; + -webkit-appearance: none; + } + .navbar-custom .nav > li > form > select:focus { + box-shadow: none; + } + .navbar-custom .nav > li > form > select > option { + color: initial; + } + .navbar-custom .nav > li > a:hover, + .navbar-custom .nav > li > a:focus { + color: rgba(255, 255, 255, 0.8); + background-color: transparent; + } +} +@media only screen and (min-width: 1170px) { + .navbar-custom { + -webkit-transition: all 0.3s; + transition: all 0.3s; + } + .navbar-custom.is-fixed { + position: fixed; + background-color: rgba(255, 255, 255, 0.9); + border-bottom: 1px solid #f2f2f2; + } + .navbar-custom.is-fixed .navbar-brand { + color: #404040 + } + .navbar-custom.is-fixed .navbar-brand:hover, + .navbar-custom.is-fixed .navbar-brand:focus { + color: #f8be12 + } + .navbar-custom.is-fixed .nav > li > a { + color: #404040 + } + .navbar-custom.is-fixed .nav > li > a:hover, + .navbar-custom.is-fixed .nav > li > a:focus, + .navbar-custom.is-fixed .nav > li.active > a { + color: #f8be12 + } + .navbar-custom.is-fixed .nav > li > form > select { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='#404040'%3E%E2%96%BE%3C/text%3E%3C/svg%3E"); + border:1px solid #404040; + color:#404040; + } +} +.navbar-default .navbar-nav>.active>a, +.navbar-default .navbar-nav>.active>a:focus, +.navbar-default .navbar-nav>.active>a:hover, +.navbar-default .navbar-nav>li>a:focus, +.navbar-default .navbar-nav>li>a:hover { + background-color: transparent +} +.intro-header { + background-color: #808080; + background-attachment: fixed; + background-position: bottom center; + background-repeat: no-repeat; + background-size: cover; + margin-bottom: 50px; +} +.intro-header .site-heading, +.intro-header .post-heading, +.intro-header .page-heading { + padding: 100px 0 50px; + color: white; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading, + .intro-header .post-heading, + .intro-header .page-heading { + padding: 120px 0 + } +} +.intro-header .site-heading, +.intro-header .page-heading { + text-align: center +} +.intro-header .site-heading h1, +.intro-header .page-heading h1 { + margin-top: 0; + font-weight:300; + font-size: 38px; +} +.intro-header .site-heading .subheading, +.intro-header .page-heading .subheading { + font-size: 16px; + line-height: 1.1; + display: block; + font-family: 'Roboto', sans-serif; + font-weight: 300; + margin: 10px 0 0; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading h1, + .intro-header .page-heading h1 { + font-size: 38px; + font-weight:300; + } +} +.intro-header .post-heading h1 { + font-size: 35px; + font-weight:300; +} +.intro-header .post-heading .subheading, +.intro-header .post-heading .meta { + line-height: 1.1; + display: block; +} +.intro-header .post-heading .subheading { + font-family: 'Roboto', sans-serif; + font-size: 24px; + margin: 10px 0 30px; + font-weight: 600; +} +.intro-header .post-heading .meta { + font-family: 'Roboto', sans-serif; + font-style: italic; + font-weight: 300; + font-size: 20px; +} +.intro-header .post-heading .meta a { + color: white +} +@media only screen and (min-width: 768px) { + .intro-header .post-heading h1 { + font-size: 55px + } + .intro-header .post-heading .subheading { + font-size: 30px + } +} +.post-preview > a { + color: #404040 +} +.post-preview > a:hover, +.post-preview > a:focus { + text-decoration: none; + color: #f8be12; +} +.post-preview > a > .post-cover { + max-width: 100% +} +.post-preview > a > .post-title { + font-size: 30px; + margin-top: 30px; + margin-bottom: 10px; +} +.post-preview > a > .post-subtitle { + margin: 0; + font-weight: 300; + margin-bottom: 10px; +} +.post-preview > .post-meta { + color: #808080; + font-size: 18px; + font-style: italic; + margin-top: 0; +} +.post-preview > .post-meta > a { + text-decoration: none; + color: #404040; +} +.post-preview > .post-meta > a:hover, +.post-preview > .post-meta > a:focus { + color: #f8be12; + text-decoration: underline; +} +@media only screen and (min-width: 768px) { + .post-preview > a > .post-title { + font-size: 36px + } +} +.section-heading { + font-size: 36px; + margin-top: 60px; + font-weight: 700; +} +.caption { + text-align: center; + font-size: 14px; + padding: 10px; + font-style: italic; + margin: 0; + display: block; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +.thumbnail .caption h3 { + margin-top: 0; + margin-bottom: 0; +} +.thumbnail .caption p { + margin-top: 10px; + margin-bottom: 0; + line-height: 1.2; +} +footer { + padding: 50px 0 65px +} +footer .list-inline { + margin: 0; + padding: 0; +} +footer .copyright { + font-size: 14px; + text-align: center; + margin-bottom: 0; +} +.form-control { + border-radius: 0; + box-shadow: none; +} +.form-control:focus { + border-color: #f8be12; + box-shadow: 0 0 8px rgba(249, 190, 18, .6); +} +.form-group { + font-size: 14px; + position: relative; + margin-bottom: 0; + padding-bottom: 1.5em; + padding-right: 15px; + padding-left: 15px; + border-bottom: 1px solid #eeeeee; +} +form .form-group:last-of-type { + margin-bottom: 25px +} +form .btn { + margin-left: 15px +} +.form-group input, +.form-group textarea { + z-index: 1; + position: relative; + padding-right: 0; + padding-left: 0; + border: none; + font-size: 1.5em; + background: none; + box-shadow: none !important; + resize: none; +} +.form-group label { + display: block; + z-index: 0; + position: relative; + top: 2em; + margin: 0; + font-size: 0.85em; + line-height: 1.764705882em; + opacity: 0; + -webkit-transition: top 0.3s ease, opacity 0.3s ease; + transition: top 0.3s ease, opacity 0.3s ease; +} +.form-group::not(:first-child) { + padding-left: 14px; + border-left: 1px solid #eeeeee; +} +.form-group-with-value label { + top: 0; + opacity: 1; +} +.form-group-with-focus label { + color: #f8be12 +} +form .row:first-child .form-group { + border-top: 1px solid #eeeeee +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #AAB2BD !important +} +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #AAB2BD !important +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #AAB2BD !important +} +.btn { + font-family: 'Roboto', sans-serif; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + border-radius: 0; + padding: 15px 25px; +} +.btn-lg { + font-size: 16px; + padding: 25px 35px; +} +.btn-default { + background-color: #fff +} +.btn-default:hover, +.btn-default:focus { + background-color: #f8be12; + border: 1px solid #f8be12; + color: white; +} +.input-group .btn { + padding: 6px 12px; + font-size: 14px; + font-weight: 400; +} +.pager { + margin: 20px 0 0 +} +.pager li > a, +.pager li > span { + font-family: 'Roboto', sans-serif; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + padding: 15px 25px; + background-color: white; + border-radius: 0; +} +.pager li > a:hover, +.pager li > a:focus { + color: white; + background-color: #f8be12; + border: 1px solid #f8be12; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #808080; + background-color: #404040; + cursor: not-allowed; +} +.pagination > li > a, +.pagination > li > span { + color: inherit; +} +.pagination > li > a:hover, +.pagination > li > span:hover + color: inherit; +} +.pagination > li:first-child > a, +.pagination > li:last-child > a, +.pagination > li:first-child > span, +.pagination > li:last-child > span { + border-radius: 0; +} +.pagination > .active > a, +.pagination > .active > a:focus, +.pagination > .active > a:hover, +.pagination > .active > span, +.pagination > .active > span:focus, +.pagination > .active > span:hover { + border-color: #f8be12; + background: #f8be12; +} +::-moz-selection { + color: white; + text-shadow: none; + background: #f8be12; +} +::selection { + color: white; + text-shadow: none; + background: #f8be12; +} +img::selection { + color: white; + background: transparent; +} +img::-moz-selection { + color: white; + background: transparent; +} +h1.page-title { + color:#333; + position:relative; + text-align: center; + padding:0 0 15px; + margin:0 0 15px; +} +h1.page-title:after { + content:""; + position:absolute; + height:1px; + background:#888; + bottom:0; + left:40%; + right:40%; +} +.posts article { + margin-bottom:45px; +} +.posts article .post-image img { + width:100%; + border-radius:5px; +} +.posts article .post-header h2 { + font-size:22px; + font-weight: 200; + padding-bottom:10px; + margin:0; +} +.posts article .post-content { + font-size:16px; + line-height: 30px; + color:#888; + padding:20px 0px; + text-align: justify; +} +.posts article .post-content p { + margin:10px 0; +} +.posts article .post-meta { + padding-top:0px; + padding-bottom:10px; + font-size:12px; +} +.posts article .post-footer { + border:1px solid #e3e3e3; + padding:10px; + font-size:12px; +} +.posts article .post-footer a { + font-size:14px; + margin:0 5px; + text-decoration: none; +} +.posts article .post-profile { + margin:15px 0; + padding:10px; + border:1px solid #e3e3e3; +} +.posts article .post-profile .row div:first-of-type { + text-align: center; +} +.posts article .post-profile img { + width:64px; + float:left; + margin-right:15px; + margin-left:0px; + margin-bottom:15px; + border-radius:50%; +} +.posts article .post-profile h2 { + font-size:22px; + color:#333; + margin:20px 0 10px; + padding:0 +} +.sidebar { + padding-left:20px; + padding-bottom:60px; +} +@media only screen and (max-width: 767px) { + .sidebar { + padding-left:0; + } +} +.sidebar .sidebar-content { + list-style: none; + padding:0; + margin:0; +} +.sidebar .sidebar-content .widget { + margin-bottom:30px; + font-size:16px; +} +.sidebar .sidebar-content .widget a { + text-decoration: none; +} +.sidebar .sidebar-content .widget h3 { + padding:20px 0; + margin:0; + font-size:18px; + font-weight: 300; + text-transform: uppercase; + border-bottom:1px solid #e3e3e3; + color:#333; +} +.sidebar .sidebar-content .widget:first-of-type h3 { + padding-top:0; +} +.sidebar .sidebar-content .widget ul { + list-style: none; + padding:0; + margin:0; +} +.sidebar .sidebar-content .widget ul li { + padding:7px 10px; + border-bottom:1px solid #e9e9e9; +} +.sidebar .sidebar-content .widget ul li a { + padding:0; + margin:0; + font-size:16px; + color:#888; +} +.sidebar .sidebar-content .widget.profile { + text-align: center; +} +.sidebar .sidebar-content .widget.profile img { + padding:25px; + border-radius:50%; + max-width:80%; +} +#disqus_thread { + margin-top:30px; +} +.gallery > div[class*="col-"] .thumbnail { + position:relative; + overflow:hidden; + margin-bottom:10px; +} +.gallery > div[class*="col-"] .thumbnail img { + position:absolute; + margin:auto; + top:0; + right:0; + bottom:0; + left:0; + transform:scale(1.1); + transition:all 1s; + max-width:none; +} +.gallery > div[class*="col-"] .thumbnail img:hover { + transform:scale(1.2); +} +body.modal-open > *:not(.modal):not(.modal-backdrop) { + -webkit-filter: blur(5px); + -moz-filter: blur(5px); + -o-filter: blur(5px); + -ms-filter: blur(5px); + filter: blur(5px); +} \ No newline at end of file diff --git a/themes/batblog/img/default-bg.jpg b/themes/batblog/img/default-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51506dffbcf2221d79fd0d1e34f263d3cf14190b GIT binary patch literal 144560 zcmb5Vc|27A8$Nty3?a*e%4Z~_m{7JF`!-QRw(Mk!WGk|Tu?gP|NahUUUSYFubJ!I@B6;4>%Px_U;q07zzuZubpZ$j z03hHG@ZU6`1F*qZ*;rw0Y^-d@jJ;)4@;vH-q?F`8BGPiw5^~}ak`jOa3FO$ZW1Q@q{G6Qp5{Od>iT~^EzmLEPc9!5{ zI2On`0D1z#asu*SFCYW}EReq&@c(ZRC=2*`kAVmO`QMTM^BC~Iga3U4xL6t(t!7Hk}!9A?IoNvbTDNQ&etGMA8{dI&}r zJ&=F%%wMt!aD87A@5aY-CSDGMQ0B?k;4R5Ja!sG1NpHnY1ABZ$0EjL;?p${CGl^?j@ArK2oTlXW3U6e#Z{nu=C=x8Mz?0!XIsq#?5?07h zw^xnGEI94x(<#3iKHIWqrn#IKkJd9?%NrlwREk!az(`}=$+?~DBI#jATJGzST7`@H zzmKABXw^LD$)~ODFjdx+LfB0{~#mcc8frgj)sKi^T`eAc+578@{iYdVoezx3<& zzXmgt+@6EP$kSOrgF`j4H*B%t4NE)WWJjgk)c|_KyYDKigUwbgv$wzBRE#Z`lo$@m zU7VJ7&6VDoxRSF&3s(;d|JCO0;}ASp!xNuQ9Be2g$UlHON5{XkTs3nOx{7-K*6w)B zd$_<1i6vIDKg^Adu&KBjpIPV zqXD)uYaRDBm3L(2Eym%0fYc^6T?Xe2BK5xj1|WoJG{6P?0|5VnI2-r@11bRz0RYgs z@8y_F)bo#p{X7Xvgm1~qR52@qSGv6q_7mA5~R&U6cuqr;G1FG}wQ6kgS&XV2NI|q?@rOo#=k98kj z8OT@nZQm=boTIEPZ6Ashew}Cf18=x*zI0oDNZ;KqaN?od7@)Zo>|UZ)_0Y~zzPQ&{ z^*w#mTvubb(IWnC>!$7XT=!&b{t2QQ_06z%0b{TMy7xA%lMs@)>;3`I*8{kACmow|6(N&fFkYWU2 z2tQ|ceBb2xt}>n3n*KD5)_UY>e;{$AKEa4Xh1d1dpO($h>EUVO3cWP#E+bafH@m9T zM2EOZ?I=}SA{P?r;j?)(mNE^kE2K{y(=&`&B5%#i;zDUk*RJL#r|A9fA1+;p_bnuZ zwtx3)`@P(LgZK2=!|>URDJ|)rpA=}3yTzj&7cN+%f}?m>LfREN?`h<$)Rz{XYCZq! z?v|$a)bIG=Hyar|!ST=SsFxI;R|d-_RAhxS=7t$Y)be0#fm6+(`O^N8V+$jI5OIb7 zA(CY^GI+&LV*}eXM;V^q*{j`~jWU1SeCgDbXI_)uaou9o%QuN8qP?0+Y*d>jY z$$V;r$kVE)6&tP>mb-jQLCpWZ%|j3X&|Q!s9H))}QkPT<18{JNM>m+R0brsIo%YQc z>D(QU05YE$>(r#^*O&Za++OJP?(q&?_N0Htb9gv}XULA3JR$cqzgiC1URNpF`1k$$ zwT=0WrHLPjs}CP-(fieI7+SY1L^u^Te+%n8J+i#95t6T=+!1VDQ=l5AY2EjGcZq48 zK12`S%?t~n-Z1hT!X8=D0{bf{-QyIZ$QHex-#K)CO4ke^GJ|2 z^D=YRg0YcN#XS{KB0koI!`s2XA1&XsM4tY&r{y|Ck5Cxt>Eun{V2mEP=l%-$&d?3h zr41jy#m!>aPBh`beo`V1l80LQ&2N8xb^O}AZhY=@!;8lM)?C`2R2U8%?gFmrL7qtt zN|nceiCl_CYR%*ukt{~V;^>E)S^MfP?LHz!pV|s!-!6{L4bJo)T;sum*MJ?cf`X7E zow*EQ-2?z52RDNO7a@WGj2$q>0r1{20O4upUS`9B;c~r-WaT$Cw5V?TIg+4See0f& zLlTg#?Uga6?B{>;q-sKz&!*OW@45h@lJW6Dg6Ue}Ot{iS=zds7VQxj%$gl0+OzhI{ zHZA=h4u=hlUycr1n4QqZO)A-5(>h?iBdorQwo7Lo2sxaS8{XaAQlZs%-n#9beXZ=B4*%`n)QU9hFL#Y4Hx*xDwiC5<6A>+A$BqK% zq%5H@ucq+!W3>t8-|LGMg?DQ8rQZjpdg_DRMnVq$12Q&4zWc>g&AceDAJJ0Zk3=vH zmOIWSg?ba!qYC~U7$11!f3FXl+rTNr=456%W|_99m`$h0ksnXc@9h3Rn|ep4(!mR)QjuJPe}*6H#9r_ z7LKB~!791x_b7l`r*(@K={p)U_w>y;&3}C@-1pn>O*%zwhEU+v&OOTM(mwm|XAbpOcW6NmH%B^UjTZXm4te9rXTxWLz8LYYYWmjj z(;bNkzi7csEs>`KdOyySKNAhFdicvuIkqvqtN1FI@Mt7I@_6d%4OYrU>v%A}Dei85lVKy7T}@12C~?vvPNp z3$h+zLz%n#jyIa8ll|Hp?kqBAjS3SXtzh!U02kqjh5-NH3y=-SAw3Wt{1yNgM9vU~ zM!K+7LgWPTs(4ww_pW?45@eh(5}pu)nxBHQMaL%%0vJ5olM1dXxG49K017P*k0V8B zt^5Zh93{*#mF6ReAGcPgv*M}Pqo~s5B@J;ZZ|FWnYkZF)Vsd+Wo}M4_L7CZtRWcP@ zuyyr+QOi7Gb5qm3VP0V_VD;(9@7sMdyCyQ(tK-wlK>-`n8rUs*NO(b3?#i~COjzi^ z2T#%(_1w zu$oZ&E41OX;p2Z_PL#L+l^R;g>6^048Wh<`imXX)-A%IA4T8!i z$NR_o?QQ5k{ajb~zP%Y5Pp18g9|PF3zqxwGj-{c^a}iK;3_JYTN@4z?h{~VPfJdSG zhZoBGn|&^J&dU=cs(sjA-^zjo9^#EvN?*jnGkAXgh;b9~>2~024Qy0I!)2YA|Ntymb zIk}^CsgQR$m~nW(h$g@AySbxYU_HuUVzDZ7EAwlMYyA&S@ENP#K{xhC3=i11(c3z2 zewqH*Q_5RPdl7W^yJtQzQnT>vQKu(mu=C5Fh&xSfX{rDIqq#3WwNwYyGwlu$Usngl zN#I2}R@&X+Xgsw^&MKcAoTP4UFt)ea!Z!nYH8(G0zuZ+9 z2$!YZa4c+OApoC-kt)xS=EH+Z?$MSqQ{^{Bjp;jaB)$Bd7v@#T-^a*>Av+b!K71!MNrA)>$yY|7AOn`1m5WXgPiWGBbsBFM|RG!a7Z3W@hZ>ez#7G zalyL;Szy`X+Ml}s{UReSXlgIC2vS6jd~l_+o_277_{udja86p|hTn+rf55GU!(&+^ z1R>hi=HNR!YWec^lhkUgGE+gdMQM>*LyHhm@)gp|*w}Ur+sLQw1O^9eJS}!m-~B!{ zINjmsON_AYw>akYyWW7-sZ{ad`ZC!wInrlF;fu0{vx?Fxr)ZtZQizgh)2=d78Eh;KVu|J~dkK<1;O)FY#&>tqBg%Y7 zdP2hxU7otKM<{Ig_b-rKe;)uB5Xx?Xyd0P(vg7`@2VlW~&t&1D>oZ?bv3Q95nCZ-W zKl8gr24$q)F2OE1kX>bggBn4dtK?wvob14{heLXzp8?B^RsXQI<`t$goe^O^INq&f zC_m~?&clDH?WstpF)z*Xi40@%W-xgRyoW{=cOFhQ^UOLXwaTGdcjxG5_SHi7)gJaN zX%6-_P<>^l>ZIFh8#;^0AE(uJtnn$jA!l2Be;tsBYw9ZDB88oi>W9LiN($syfBH6k zsk@KTJz3!S>h8*NOBj!ilHuZ*USPT&lz>A#1T2@ldao)dT!QNq85&(CEjeF%{00dZ zNEJAFDG_4%*wCOX)lEU$QjEY3K_S*Y$k(awZ^=b4ml+P$N*Xk(Ywj2FMk*L<;06Vy z3#cl=8s&+D0x+(>u?I#U7Y2ZO^^R_8ocnbj6Dya2$>tt}E#_3gqn}9@6~XWT=WrVM z1nY7J*dbiENI?uWRsl=nVm1E>t#}S*CTHi zOl0T3r*~lSQ?x7%mEKvuwUEPf#}s!F-?MM)6oyrH6p}@*{E;0v{fyTn$E@t6=s8^+ z07zqyBza}T$!EGaj5$UQhE}>%_RPfvFp}~t9#in(F<<*tI`n80H~%7`J8c}tmXi#KR38O(E!W;0E0mR zRscBBI7rqww~9s>kZ^!ADm(p}ksc0y+!CGW0j68%EwmV^_Y>J78wrPCbd&ER9yW~f zwHxz>3DNfh$b+k-CrPWzSj_+j^HBHj1LjZ$k=$36;(N^J?VY-RCU4X%Y&XAi^4#X$ zcH7aCt_$5vDJP%wBPQp|ezBvj_|FwIR43;LtgLJYQYTLm98?CMPh9F~^NqLIEQn~! zPy4g`JNWlT_~DsvOT>KFwupYJu)TBuq5bT=<&QRL)fhtnHVy!yIG~p#CknxE0*|fE zn_a$rl?7jhGlB}DrNusx1tAI&=!t5{GfnJXX`bdrniUOMzPvT6i@6%cT3T7=lRaO; zKDD?N8ak6#1@Qn_DO>@5ST+iztZdmVY(TacDVqh;%MJ7bNC*a$4_4%xWDS?Ey;bb+ zF1Bp^-665~N(-cqt>r0G7*33Y%0R_(=4M@F<0yj5vja_jZs$t4y&O}@w%ccgAB}oH z4dyTcAv^2;=T4o<1k&R7qtHWnjoIL0|2v(ULG>3*cnYibI)#Jn-&2K^LEdy>Ty`p? zpk9mDyI!!IS;FYEm`3L>s7y9ZdG395Z`KtQ&BX6Exz9t2# zj8^l8&Zne>iO@%jlrs&L6y>?ih1KNix5zxH=ut6JG)@2sDpZA6=Ow-w3Q47E8@@9= z4>9^Zb$t2aApUWrU&TRAR*|#?himh;aCAUsh5W^NR}3B&6G#7q1d^( zW#oZp#Q2cCNNND?w z{P1BXYohG%!~I!{HwD?ti!W?`2T=_5`$rws0{R$-9Z~kK1Vqq6nTI>!xXrBMp~-fA zaEfI&Q)|$V9)7UTzRmp5+OqkXc2q%C4Pd6Q{5;YrbTsT3Tx<>a66_Ef5aBcwnKT%c z>#3m;y7|3ldU&B{gg6;@cjEU$tUaP%z*9Ih;}T3%+77~fxfjek!_(){cpgu(8lpwa zs|#6>!Q%k8{8*E-s5Gn5NplyA63Y@4p$s5jR(u9;7ZP|Y)MEsTIEwJn9*(av zk~G(OUs*N^1w73>%*{lr{|6lsQlWR(dSdTCz_*7Kbii2LJ-oswaUx7Et}wBTU z?}0T9*PA<0!3~^iHlr5hYTCy+TjHI&tI2IviWp)YIu+=7O+QR1 z4+EFBb0U2Ehg|D(CdumGfGK4{~g-8<|7UD!xj_{;Ypb8LSMhm(mI_J&%6&O@949uaikB+y!Ehv;@VkpEVh31s z4B=1+1|)Y@Pi}s6ORZ z;_^bW#-_45iyQq|8^@u-;ejzFDaK5&oG8sE_nY^UPSKL?Hx?It(+B7IF(Xf(>54Mt(^eqJ8s${N#=m$0~{sv4o8t~pE8 zU6@+ki>mnpY9XPXec6I-=27q@)9JZ)f`&i+;Zncn=5lX&2iCPiG4yL7?av(E3lA<@ zn_dY3z_GOT*j(eb1d1=9fg%=oChfS{|DsXc`9SXSH`H^ip z&9@Le_Gg~{Ws(FcblIDOKMzZn!q9V*3pJqj-&YrjGOkH+3n{$*i!oE6`~9qw$?4JU zKx|vbqq9lwQEGI}U?=H=;1QWRhxesq>a3>gr(I>*^e1M<8hvT&tZ&6KR-HK{w6H|m z*$!UF8=WvE0Vwu3v;Sp%LB1@3cspB530xxpInNKmjP8PyBuJnV#3uo`YJ3{rrR<~U zKYe|Ae`60^l8Jwx0RRDsVM9d|pw1w%%Lbr`YjW3*i;D`xb^(xLE;tGO<$a4!$qNFD z;J`x_H$buy<>lp8{c^N5OJFI9{ec{eqZlP6C>rAmmlrxjDbfA|f>zvnM#j}cY3t1} z|A0-(df11(=?kwk!;F(P3Yx(Bpn~2I<#q| zt!C!9mT%Jo*44NCCgb(-JO19uou!AtOaB3-d+m{h8D~8UJ88m>PS&G4A)3vd%d|)C zauUQBn7Cs70rJI^YV#- zeLUKrT*t`fnG4%E05xJ~1%nw{kW#oCzWbBzPF&tG7J4*DTzgeZmP{^zPVueO=5^)SB1PPLR z?kmXS3-X?4dcIS0t*`k*$$PN86Iqz`5!<0Ub!jQ>t7tg^BS6kWvWQ`l{iX~e_3xs7FOKZ zIaC{3+dC2&WrS@0X!l7G8dzuM9o;6Fyj%Z`)c`G}@wSKb(0vo7*1_!$rNSyl)@zLL zj?U=$jcs?w{{WrOYZLsZjn(&j3ypQ^a@8Y!-Loo0E@)|E1AaK>)=Ohap-+9R0`M4I z(cgLikN%2!Dfl;`VL&$$Ol#R3ARHi0s4A%p9cL)i>(sgVUOWVsje;T|k3k68L?Jjl z;FS$7U+@*zHSoazf?;QYlR$wcXDAMOmly~^Nwip0?*uC2nUJ1`9?pUr*3D&+{n!Wt zK;!@cLD8LlS&HY5eHbI0f?)(Rs+f+?_wpi_QJq&7nNd#~M%0(uu&sMUH70kYe+!)% z`5%z7KDWAWbmabZiy4_vzf@7d>pfriVr6M$K5%P4GMsvg@`UbBH?lj0-fn9W=e7B{ z8xci1h$IfTYNjlP2Cq`)w`cYbI<8DCOcFFG$JMZ*JA)OZ9meePmG4V52O{~-)1>w7 z2)0N*>LiKbdu64z)%HDL8xF|0KyCP)Lh?E zMnW)K3jcE0%S#srx-c$akwNQVpg0o9wdFCOc!QKX1AG9~4dmTiv0%070$af#8-n5_ z$Z(Ry<n#|w!I~894rdzk zC|xUWq;A$xR^=hBd2pH*kbi}ubT3`IydeGI&y}^g>6B9P{BvsCyXy7+;iZ-3&Bb9a zY(P6>cew5hRX3>ME&h@36xB)dyT%z|KS>Ttg}=o`;yUB8>FaeqSkq1h+JrCx}!iAmj56&+}f#kK&5wT`JPW$IW)e_a3sbv z6Y2Z)1@v%{8|kBaQB9luCb|12@qe0AZqJ7vJ@QgmSlbw!q#xwJ5Bj4Vx-;STwV)vK zNr<K9TeEO*jM1h+R3oS`<#>Y_jz=OY{hNCqav()8 z90&`zu>um=;0kB=;5R^bvBLVzJy!e)>?(I;tlWm4{XGE=xz-(DghrFd7!Y_6#9jc+ zg#pDLm}1c^Ff_L+?1zh>D2^jG(c&^ct3ifdxBRm^=V5puLxeLa5e7ht5CGc+2|!Nj zEvo8zb7a7MLP~p&Ar^vqMdT6Vjd;H;WY%94SwxdYaqo`-g*eI`y}r zs$34-Cqmo(cRG0o8dfy<*N&V_3kE0DAE=(%`aY5pEKLg%4pz^>+J6sm>zkgRTB6NH z$dCUFQFGg2hJFuSU2-2;3S63gvSr(>DXh>pxVkm zgYUw2eETazZrq)-U3CbLFx%-N3(fVAmM21gujadE1}5h@pL!FNd;46vp`%@|Tj*wL zOgA8337vQmI{vw#>6SH`jF+@%syLT9l9nPvS=B?+w zX|o-2xG5J|n7{g|rgl=@f4$#k`zVaUhwJ*4gWZ~jwl0j@N#E@!iQuvHq~l7syKUAj0kHq;3tg_5iBT$${b z;Ou}0SQ`Kgt1}WnbITdAfO(J%y3YK7plH!wOO=cSK>#-l_{VOAEaQujY$SQ&Bp?8Z z+m!oi8cH7G3grj8#@+H4A#8j_l00@4M8!|nmBvrI!^@75k^d?r z`}nlAZd0%A{OHYj<$i5YD&JKipzRqPkW`SgA6J!ck+cfLTb@MQ5`ty^UB6uY*>3$G zjcWS{X$_e$Dy4e);pnt7Rx|is!}sNVW#6+(;eoF8L35LnPc=32{sra9zY*4hMggvV zWR*vE=qDl^zHYBCh8#^MOuocMnm9H%Mio<22kOdu#)9rl_lXXTKM9bs`~26r$rc53 z6NedCPm6$TqzgFz(R-0kSM;hXXib4LJD9(krI!RNg@HuwGQ67`EGy_P1eg(x1bTn` z1?ul?P8Z()3U^!Mb|!P}AFWR( z7(46-&uuJGDm3<5b|w|ndR<2{-#k@vj0g$v))1P1O~x;EtM#I4A@LSTF9{7J$?@JQ zGZ%FYCf;DB-;8){YM>OelVnTeYWxa8cteklM;f@ytj70;%kp4Iu^{P_)-sLvlB&XhDckZp0Nqs+Z1Wdr&J9+n)-jh zTZVB#q(|lYzlLldA<55kCo44T92yF8J~5~j8ip4j0B|0NPPiXW6sIqn zPUghv1R+P?;^m;F2W})eShl|Q z=WaPTRImt$hRJim1%OvzEP<&7j29~yP5|A7>52wpFZ*v<{QDk`w+7l4d}bEig3&Qx zasu~2bb*h66 z#P~U>;kUlxZI5MW2RICJ1G!{t$xhHx-%LBRG7L^ltN#Am=U5AqA{G)3fz zM$ny|<0=EQ`7yIa7cW#Qlmru;+x;D;-Y%j)&parQt=OU51U0SB+E(Q4t-_*%$B|YA znRe8^5Q<@t=b+8XUe09PGi%uoLuCH*?&EEO)no(NEpe^_?BE|f*{hvYUy!miA`53KY^TFKL!qk{5b%X!nmeTLX_+WACtGgL+N{G z0ty?pn&}6Qc|NZ%gp6F9!DqQV|6Gv#AjP{EJl%oOwYf~n!so3_S~qlW40V%Qf?he! z`s$t_U*2y2o>yZSl>cu2XL99C!;4w%Wy(7}dSE`Sr?B4eeS{3}4L#zAyIajWb+ejU zwhA=i$SK*v@iNZelNAM{!;6fHZ>8L2{oGfEbQ0#AHHUdi z+2#|1EZ?Y)Xp@%(pQ(<^V=;aU9G@Ff2VRSjyViX*Mi9VcvpXYQin;i_a7ZD2iz+VA zJrP72!bPJo$~vqVfbT0u5r)U6w;R{}OppUNgPTEtlT@NCC(KX+T^T^USrZGq3xPWh zuIgfzMm8}Ck3cTIq8B(hqe=+ZRbyMiUZAUkllj(cXZp&a^`~t{fK83l4eC|Hv|3_~ zkza>rZQUv3AnrHcBY4$1hd-4ow3$O64ZijM`lqE`rPjS(-A7RoY=AqQ$W7J=pV+Dy zQE6=n9;4skh$lR2ztkEuG;~@D^na5WHCd%a%RwXdiQoN~ALU)zP`;w7s(E{Aol18u zCZFuoa)do`c-Z;vPEh@dAfD&WG?g^EmSrp8(_}(pdtZiXf1q<>0+sfQ2H+ zV-2!R``IB-I7A;G6cDsvx4XX6!CS?k6w=RLXc!#E3aj-eMfq)6^W?kN(ME>O*g8hE z{Z_h3URmomIiF0m$#jTaeOdo?TQj3Gp!OS8y!hoh*s6Bb;3tO9eE;h17(wzk&i28o z`gzqD_RavMdq;oCgph$ru;S>y$=Lbf*LrCtBzWPih28|Acy zYyGb%jeR3OW_CcF$|XN?6#v90V&c-DHpc^k{)EI+eRRB%*;ge_>3h~UtdCh)W@hW5 zZ18Zv#XmknvP9Pm3@PzM*N3>+TNq_jj7>Cvwk$J176ZNK;p_sQ0{VI`0J~S590CXb zcB%~EQ@Z2=5`A!*07Bqq;lG+}fkPZK2S)|i$kBYJz!QA}&~=7g!v9lwq9thVfu{ie zQkkMP=3o$d!a3sxny&9`GuuAwN8mv_{>snrU740cldR;gZXHfei=ij;nYLSxjIagn zO?~-$?oBIyXyHT>vw%mHDRL#grSnBeVdMk&vmQX^91;@1s|GUZ1frnBnfkeN`xkpDVV2jItm#kW$- zP4ulUy9YpkiN=7O4%M5@g&7rO!CbcK=H>#6E>|p|;wJVJ^6@^PZ3t2D0Iv`m(nAL{ zuz(_*hal9$<-{`t0I`WK5{z!)tg4*;x&=kv|(^@jk=%oFRm5UMWQ<0C~z0rIN)6= z6d#=0PJib}6o`I!7vB_@lm8zXL2!+ZbEZNi`?%R3h!(S8*b&#w zAl$XdrmWuZq!PhwQXJ~-h%+lUyz8%+f)G$(^P1(l91>s~2#n^k$cr|*V^Ktg0iRGT zUL|bRHXt>Ib+H1v+@|QO+Af08sRF5{F{2=dK|-!JzIdLiH?x8j@$MO?{_zVDo^`d) z_D+d}KXK-gd4N^yAN_Q2zgdL6V7+CVKNA4rEO?vy3C;9OUB;Iz=!apOn z9sAo`){2)`t7v#3OK)TG*94ZhBItb$UA}9~7F51-LtD ztTT=*i4=w-&q0Kv(&=I<^S~^J{CIWwn@P=|NT=1d*{3uSqb+9tS>bkJ5O&EjgPP4^E4G;HxRRfC&Ky6K^tEXigcC(K>HLNJ6t&iC>yeYIx|;r03{>A z>RoQy-COk96E|ky6*~%!>Z3^(jXt*8I(&kuq*or-IeLIQW~eD~s1Y|V_mY042IVyU z%-Vr*$JxkaC$0MA+516*70N~)=(!pD_OtaF5tXq!y<+4@drA=>Da ziQj+vb`E@RpIHZc?UQ+98Kqx}hZDQL={J(yc#+ziFV5pVbRbs+zWy*|iyjh{V^e{B zw83#oc}dw>JaIJ=NJUxzEU-%P*BCz5A~|QA925>99{{Y}%8+=)n-H9w=rar}LcbU~ zrlKqUV8Rk%b=M3}=s#z94sUs0QpyahK!A!X9GyzC<0w+(PD6Eh_IT*#RXZytNMs_U z#XCnkuk6nRF&JO`$Y(W^9qiw>F#}#+6nxT}kX2fmRU<^DBvjbUB?VAarx96tUkrZE zt>NXulUB$YZFssD}9`?xZUjq3LaPiR)2XlV6-fgN(O^nI|%n4Ma~~wl($w#4ypE@h-R# zF359qx9Lq6&UjrsXPRh&R4Tel&;N_gO{8gDd`z>#c|$&r7u66uup8Xs4-!Q#P+r6r z$(x@sa07Js0X>u{GznlgD3h|i_Wr?1>^+*49p<=s3GzVzSh7If3w2J{b}stHgXOKxW=vZqTz{|U=p zrp`z3egykOiwm6vlP0>p1!1$9!CTa?p$hZTa;wAf9$hzV<0k)ITBAG}{K?e1GMQXx z-ArWK?{@Y@bPfbAQN8nbmXO><_xU3!7sF?h9Sd%`pQtL+t~Oh3(hsaT!3`UIbMusL z?#2^;V5){Ec`~ttwo>5VI&7wD9O{_Ub8R{+Ff{*Q=Ix=A$>6?n`;qlM zN063lkk|dDmjk-Vg^%)H)zBK}X0HsFR)~Fj({e6eDt4r$DsZ~cwr+Uyicf@wrVjhI zk8E>ZNhT+sr|1BRs&QN?l<2-dT73NGKUbEjP2e&T zjS<8lto`)$kfXkeS0)>4 zu)VM=b?q&5>g1USlQQ=oGO)^dZRK zN-gYo+AcBp^9?iV4FhU=bCiq3!;N1p6ts>x<&F^hfBF47pjeZFHVdOi zHrHjJbk-4-H_2*@&I{{r8|L;pug$Lx{-{`2R^9$xXwu?G3!coIP+-vgMU4OdLL{=-GHamDDdxMV3^e5QH6V0Q11%vUfH=y(g}au}MW z>mn6;v-IHUkFM&QmFrlb_&9Je(JXMZygUnr1cih8f&-MgP_~$8zSk!jStMS>+=sIx zZ=pGg8$X>q=OU3MLB573pc+$g-7F^oxm13{iE9aFc(L&+xifEAEWR~9#dj1KO}4UA z$x&fT+YRI&J$5#&xKcK@C|Xa5s~z6;LS)s~SrU3?9#Rc&)BOZq zynW7BmWHpE3P9Oaxx%}lQVpfr_UIlZJ$_7%4y5`Vo0)6$<>F~kZ!w;$I4Fe0S+v{| z{mcX4;{>g9^AqPWEEXgHv;;s>7!A&0)#z5kzlq{ViOv8puWR-XUyi5Q9PSz5Kar-x zN0@)^KOZ|%ggBwkK2wr*>X{ojoRMAh4aG9t(3%O3M^3(3ASjj;i<*tWxd6{Ei};u0 zL*Ds)M(1q)nNeLe$XEr9pJHD7Rf2|Sg;9X7g39i(oG_Z~4d0~c!RF%rck1eV39V`7WsV=?LGPhV(iZ5%4K zIfY}YT*;-k{cNF?l4$KhgUz|dJ{k|dWcl1nCFe(+t`OmmvIY5nMezmH+3b#6ls^AA zrM7}3vXZRT!D*!x&!wucho59r-~QWT@a4IO4_KExKeJcle?(SWSv*j^v>?&qiF)p* zmvK_MBQTk~W4a6qWLIR*7~oPOs^jzEg7) za(F&xz>X#HDK#SN@_|X=Zi}~8LH{?#ca?+bozR`+8zZ&;9lHw4{Z5Lnvq&L)dO}K& zp!6h13)9q@*V+&>fv+d!gVJ;OoU`A0ma1&1x;p~_I% zQvzLLk~gJje&!EAe?OzF+1xO;OHcbBJqUr_17?a+d})Rufo2@g9eo}Hbuny`0|lrG z=C};7u~?wjpc@c~NqZ_+KE!<)4?*jVgxz`TT~NDx`^)@0E~Bv) zOPeOU6x&+gvk`vcL*A-`If3->BypxDF@2pnz2-|*eM6p}+j`wFy~-#kUA0cI#lGln zAD+6Ou2Ahw{43T(Dnx1-6ki$Jz0jS5PAf5P416Xo)&e!(c)7CGn#=iSEC*k;l!TA0 z;ZBb2dWPG{{C83oqzmsaIJpjJ0*1`W%u95k4kyo!Y=9Cj-{n>5XRK5 zn(mB#!*0ndPdQHQ|-xj`kE!e5J z+Mids+w#Vq^rG%y-~A@{o3WM21l#fqqtwclRJey=>c_Qq0mf!zp_4xrWSbqe z;&lFw-MYxBu-RZ^^($X(yEUdJB^zz>o?OrwS zmGANF=gt1LdSiaQO2%-h#w$aQEPB(bj8tB8RiOK%>HG}q=hUknmC-hLd3r%Z7GLBn z-^C5@gK?#L3VeIWbxo}Hy7}`ssA!P{pT8>Jto(EO-D<1HrWr*=Y;u|BJOyw?V(_2h zU#c2MkGXpGz|B(2QfH1Ab4$Fug=DdceIev_zj1@#06??%0)1e%2m8xLT!I;(o_cH~ zKd$5l&W<#?Sm4)({8y8f@8u05Ys)_F^xIDj)5e~g;wAr1dP7)LYX>K3zm_J?wlRs1 z?CyEIt!k%JM}0rke4(h(U-wiy@u#e{$>fE6ezj%0mW5aKCrc5WOfKm9l`n7MpC?ql zY~r+(Mhc(1A!RA9`fiJR9bqJ3Z=7^#sY8L|C4IOgHkIQRK*$g!J!hBX>oYX68512S zce}<;h-UlWE!T=TIQqHg`?NAi({neFfN4LM(J^#m`U|P&K6WFb#%D~`#O}V52MqWu z`F^mmpJ)_E&mqMxk0}Bp7o`P`Nf zt&h8KJm|5}cG^@H8dqUDv5818>RWaUeD%cKGIUi!;T$yWWMg?L44O8>Dt7CZw|?F# z+vTbPYjc|B0&ZuIeXx>o*gTdyHQ>Uq*xu-I&)0LSv$#IwcrbnM!R32aIi^c-0e)tE z-r5iWRCElEdjRzsKv^0YET)PPaG2_N=UA|rs)|RzMa}uIWtUpK96=&I4C2_`Q1EX6 zygSAtE#u~WBjsZf-8dC9ujpsd;DAo8z97!?if z-uvcS*4TwgWk+~C8+98p6^#LJ1u{1?@bEZJ$s!NYlHR-ly&8`fW-$Y96BeyjJ`M#w zw`=o0Oez?(s4|q|=GIT2f5u<#r~69Xt)--7ARzyw_9%z3hbKvi&+Noi?$|fneF8Vl z?2|wO22Q|%Jz~_;Th~##UKQHqiFZK(1n<&e8;g%ORmE@+YWd_m*b%G{uw8$?QnXm& ziE;7E`Dl62IT|J74d6)?=QF`sMZPN2>!x{7>AUY?T$%C$1Ds}a1T(8k0x{|Th`pQ# z?{>SHC08>4^;p@<6AFrDU7nSAHXIoIWFbRmZUv4C>pFxmZ0bCR<#~)`l`a09E{7by z1u7j)0)%JK1y41F?#($`)m zi?*y4c!c!e2N0yf{IM7P2yUUk2rQ|YO!?-4DhguE$2Wcd1<8XBW^JMla{Fvd#fncZ z_uu5SjI{2nO6(@+ zfByNeVF_6zx^^8vNk`9cpZCTCao|G(M%W|!Cm;zXuj2xo$niWY zzc{6u6!`h=Ym0nowhSR1)Ac}Rn3EajEU5zMdD@Ov_IP^f4}jkG-dP^Ua{B(WVfvml&B1u z!Sdwt)s;dvCl12&$Hi^%DLw1Z3x}Rxzoy;evBN1N z?QSV)r#RUet`SmJoVcW|pzH&85qVD{9T3160$5}pO~UhO(Kt$`_N=>C1Ze#N+`W4@ zgsS5e$Ip%zXYXR>y_FK75fQA-ob;eo6FY7$Zg@pCq`KiG^7-6ZOtr25t}Y~UnBKP7 zmSG2T85wTOUjabs1 zVgDipfK#%NKXAaK8a1g3-`=EYfo~^Sjr+Vl>Y%<;r-1HTCP%0MQw&JD- z!X4Fk!kmnkFBCK7*&#I4w9YDiDk?q4$~1rX9lb72_xGhAouD|lHBKT0GZA5%R}_H> zdzge)wXN!i4@-&n2h{hs3IZD}GN#K0$g~}STJ7oKgVJipxFbZh(ezo+~^mf`@ zVZ+GhAUuNy-w#K~Y{MM6``$)(O~!$e97iV^Kj!j&v!ajqFl$pDvxpTGo&4)DlQfj2`m(DD z?my(zVhi^Ftsb6#QoK`>%k-Vo>F3bhfbZEmV_^Z$W5~3@3W}Ph7yj(&7Zk2_zEg5V zG5Ua!c5E7G$-yYOS2Cv_u)e@5XK9hjROTeTiyD8LF8Uzhd;lt9ZN{Iqn&Vk5jR<}o zr#fvSAB?fF^H${{Zy`+S`g9KDA+XyX7yh+pO=oVpN_Wl;|2kb^W z%5s+kTv?pjWBqy_BGn7BQXbrH{B&kW`qVo=!X4-~?vaotZDfhcnSLgHkZe5Sxgxe9 zC!A@5dvRLMyvZ4-l%P20XYFOpw#ZlV14(R8T?$=(zvlF(I67Z%Oqe|JGZcPd%kkLa za&3LBu=KTf?|joNq1Q~-+wCY5_vTIa)yk^L+s17Ea;1jx1*0yw(5B7px_dvg#ES7! zJi=@GqOeidt%cD9-yBPq(vwlUjnPgu_6LrhtPkv6(a|5Z`@8r2ku2euU7@70u2j!) zMd9<`XCqWAJ**aL7JN7!hgrUm$DHi|?%|z!l~XgtCRI^u9dsR1ddW;cN#&p{R#(}R zB=#7PT#XfmX{|N3{`hwO%Wh{(t=lh!1tzUqGon3Ou|C4GnNo2`?anc(VKzCcccEL; zd0K?ja!Ra%3YU;N(&Z-E3!RF9WnAx2CwUFRLQ71FL0H(|mC*H#+!_tb>P(2hDSnAp zt85}5H9jn3niu|4oAMiVQc!9#(DI|T@{Uen%HtOUl=Hy#;|aBxqx4W_UHNz|Wqrz? zD3NbdzsrL>b|s}tOP9t_e{^~DDKTYEVM0c|tLaT=EHfP^`uy00OK9(Et4Y~c87^hNU_#@~XP%zJ&Uy~-HbGf@B>EpW(3%X#t@OW=zVN6^ z9VhDF7~L!1Z^Z8;#Ta*U<}zCuf!~QgYfZ))+d^(i+NaOEy;%{EHRGabNhhc#O@b|~ z(htgxWR3)Mj3DBzODz1m7t+I}=n)+~k$8mN3Rs`6(!3K(=}4fxh*2 z+d!d`L`o5UdVBC>%ue9m{IQ+GyZ1-4f9Pwn4$Z4euP7#idlJ;$#hghJ{JevK_goA% zxex(*1?O6{u1qoiet~OMPhD=V^goEuo5@_1QB?2q4BJ}FpDQWse5w9*xxr+Q`-COH zgU?vAU6H6QfQRS*C{$-&I(<5Jf4ml7;`>1NiUO%a$`3dytqW_z2=rQQh361j#jYsy zD&t<~2~Ckh6cbo0um#m12~6(v~*^*zgb#%>dvE|u?1w{s!!b{yob8ySjp z&1JB)gPHSky8LuM$*lN|LkSyo@p?3#gM%|#La7e}M!GVc139centwc6uiDc|d!SPE zfmB`xV-r2D8!H&t|v{?FA*{Pe)FjsLJa8#yR)ERK&qrS<#DgL_a6_Xm-!{xv{EPY(hfPdj&LHI%}pq z!;9hg{o=Ut40#vUvuS__THkWOJNMPe^cgo^QGxFdGy^?3_UtmdxAqsy&#_57HH$bj zE$laWPpf5UxkcB=#|&9k_=vybN%3!$Pp8UNW8Q?@rx&(u#_pF1EG4d~yNCKln?3Tg zkBdlr{4blYDE2M$t;R14ZAvke$S;c=ti5}*88~!iM0YMW{XDYU<^1ai@0q}hbMwZU zRi+DBIt+6`60zV2IXf~Od9G=a^T55dL#4vnaLy~Qt9yA&U7(5C{!_Uh#QMG@My%!Q z!bWJrX9SKlN`to#FO@DE?i4P6tI*@4hmhe|aLrCy$+Qt)wnSUp6~&)0=G1h!{)>oT z`3mB=<9{(s2MLcH$;k{4baL{ASa?1`PHDz#_IlhjHIXKWl$dLVrGC6KH0aYwzBzX~ zN+)FLzG*OTp4%vUL1|mJ8%Gudk^J;!Z#P|D*SBryK8>w3-20|ed_fyxmt@%RpQaywypJzAA@1^1STwNy}~2v+}@NrNpDD+tT!Ny>}vFxEucw_ z4Qu-JDm0Z&bthosocvuFxfzR0&lHG0gHeoC3b5xHx+lx2#}9az0QZpn+52*g?aA)e zOeN>deR=TK`&G5+I|IkcfnM|{f9c{`0U!>SR-j5<-*TUBsXM7_5!pLe+Hm(%blI$h zm~m4f3SBrvVn*^ze=Q1jsR+ll8%z#ch#ze%tiJx4{#yUnbdt*-;~cAS)`3f~{io#r zE?yXeI=79p_m$<6C=!Yp7hnZ9rYO3bCEQS4iPx?T^)mTW{o%ZsHYoH6`5h6s><5$M zj5-@RFU(kthUR?N`-riepGT;%4B>AR zfeXKBja<8iVFkR6r|OCop6PP;PJKG|9@0qp0iB=}+q@;2zd!1BYMU=Ys{}Qr`c1-f zuP5OXr#i%*OLYA7nI*Ah^!-FqMFf5D<6n)dwKD^ko}`{|9uYE9y6kR}*E=Ed(7Ut{ zX^(2wn4ieg+#yj{{A zT{-?7OApr5fWd_Ci?o_V9M&5yDO5st$NQ!N?zu>04lWzH=%bVZ znP#Vx!b(73G%sKp+MrlWloYu|+sA?4sp?}w24k0%gxOidi_Cq^OM9J5qrIoD5kj=_ zI*Bf@d*U1a9kSzFa{6LIVCwIDA;*VD<3;Hx-0~Mm z>H*3kRZ%#BP@*y@HeeciU;VL$vwQm!QYZk-ze+j0%DUoHtROhzdU~20z*G7jlsruz zg$QRVY)W0O5&h$1u{Wmfet?gQ{IDD$mCU?d>^x_h*z8uF#71`E+DWNl*+&Gjg7y=z zC-a^+dkf7*i{C;TiisIKfF$73XjVd_q(f|_;6q?@&N7M;{$9?)Gzh<5q zS>i{M7;E4u9Y4)V+PwKOkoVU$O07_$YC4OGk8}I%8|C#4a&9Yg9pUt!T*xE`Sjj{|CCX zd^+*bgJ}-ZQ)AqRZLo2}pS&?I=qWL{8F)Koy!Yj)io9_PtffnDmbGZw(J@=@o(o7N z(=Me%&cF9lqZ&)@BcK&>@iQg$4*%NMoz0E*%h*&l#Pp*fZ$FJ5Z zz8o=IZ)xGqUpg{j9Bd%}K>h(2Q<^)An85 zQo(F@sepTr1nf8lZGY%#i0x4Z2d2lGK2L}?-sDoN2+%9h)8OUP7R+i@!FZDJEQ8eK zbE(c#I^vNfIY084-2%7^OHLy~t1J3-DO=L@^>E|e{SOi$1@3dqC9Lm94-TzZN-CH) zB}L0SHHP&!f)R(x@5?szM~baQ4*8pGE;^ri!c#M!C^{Pp6=p-j}M2M zC*(`5x3Ep7jKdO}ypp62Ef2}jYE3Lq_2dPA9dw$?3V63rx17juq5I4Tz9jG8LLJa* z$`I(<7RL*bb?5y&{nldRbSTn=yVe9(V&b0jeQQhAzsN>3R~RW=?9EiavE3#l>zO|6 z6d8T#MAfXsrNmyHDaa<5tCooeVma7sUOz)uyBH8rDLlV3f$(s9WXMh4JD!01U!+|G z2a1&_o81nBokE?s8OGdColCmQ>QFqV0$5HzH^>Mv4kW*ugmO3f=FT}6>}KWN(okB7 z$HJ@%7{Dq-(!e|^e|OV8l{o5Zf@( z@8iq#D=PuPOaB@E`p-412!=U;bC!^4yA~l}Q%Q6tnuVp5Xwq*gr=mOI-!}xaoajFj z%yk0zNjRT>=w|QP^ zuQont2@Qm@lHPoMT4QB~SRjY+hgP>Hcf=N^?P4};Zp6Sms-Bwu?YoN(;pZ-jwZ&bH zXL#@FH1_0$(z4PBv(c)hk|=N4sJ436^GBcCicKbMuosdO@*e!R*qm7gDuoJHcTyLb z!nX=jO@i_&3}5^AVny959&As@vgg9z@|LEKjBYquoJPyk_*BEO;#U;uBc-{cUpJWZ z6r+J8w*8nsLzo{YhCw|UTGX|;kshV;{ZeE)ZWa7K`3!LD)tC~JuKHN>6kStp96F5j z>#DRKh3H>6#6M^6R7=VRWvEgszRik3pb`@~S=b+Yz9oK<&W{XJrB4{N(xtzm5UFl9 zKWIx^HnSFtFJ8k6;xkqSvB@RE8-aeu`l+_$}7q0hV7@eF*-&nIQ+}qZcQ;8{q>#}S*UN@>tDf*QyX_=Rs zbr@$mhzF|-tNdz9wY#0o0lLL&N_dnLIfT$d=u;Nn)YrA*P7crmqIFnLiB^_50dxWV zUl!pZwMV?3nY1_D_QP#oc2n;Un(@oF{pEdbw#94t!Qw!~DYNmn*NzevsK&E08FD$z zGgp*;4q8Tm7Id)(NOUa28h zTAWfJ9PDX|U|7*L1s!@f^_ujRXeIo0|9RYNP+(eNNE~3p(GKPtg7}H-;Hc;}70D}# z#+rQn(?Y5RInDvJwgxJ8tRi5jsfMZ7h~L17F*YM3O)sAF5Ed!0tf1)b)IXOt{Oo&@ zW(mvY;{pQZ_s3LIO;(#s-NP0NJSbxM^U*2c(DrB_`Zx%B1swA+^YpYfr{FezQY*j@ z9ygtY_Jv$CNvt&$8p<5yQhOVaD0Ys4wrh_ynJKHij$fZaB0ZBXmH!;bzdRno1n8BI z%M+Rs-)t?v?(*VQ0ldFqcCXXSS#XPGE|qsXQhC!gx0pLMG_P>fMZx_5_~q7yb(njo z+xT>4@SKnA2%&8;pv5bHOn``KRyL)3-&4~2ZDfDLJ!SdP2VOZ<)J2%J=eQ>Ehi^Ei z1y`oXo0u9-EmQ5ne{n;A9#AZoV_B+WSwO}){&E_TH@ouYpx6M1(23g&2YjKg<^DKU z`X8FgbP+dKUCdQwT$0RIn|LDCGW1p}K7=<=DSi0OY){klJ^6f-lK0hz3eWXXPA?s@ zdtM$-l#d6unT#4~i0~;q@Oxurabv0P|!hNMIWWoQ$M57K#N@e`hxXyQ$JZO-@HAj z;Nu#M3(jPpovWEr#^eOv$fd9~oKRAT=^Wl5jA@WjTO%}M#bQcNWD_g;!^SW1-<6+Plh0`7=*I2T=LoxVD}wK?Kk0e<@w!j(7B z;Q9X36@_PX%k-I&pns#)nwOLxads;$Ou1zzuTGcUk+EcZtjEKuG}lK%M)lj4{5Q9H z#@W&l6D4T^YK6zB@b&yXdN1R)3gIt*#y*!;82GCG@bu~52ZIIpw27Np?5ut5QZqx= z<5;vx_l4l@nD*!ZX%i{M##NP*Sg2eAAwmF!*Hw>*y2oKLwqyOH-tP2@BF)v)ome(TmxC~rb)Ihg4i{*f7W zJqPM{6XgK(^z>{3D^}XjastwcFJ@+}I!s-bxszvcMtIzVcwphJr5`56WyS?TnSR5H zB$Gt4jz(O%qIdj)rtgGFRWrLa?D=kn6U;1b3ycT&yhp5!5l+c~(H66*3pr=17v9V% zEUeL}N=V&mz_m`N?X41duCZXxd6`w1`}Du~fba2dlx(anE=iJ3z?g5C$yXdEqOhb1 zj)g^!a}z}_gx`-?>@AG2qQ#0Xz>4G}=EmU2Q=h<7VpDEOR$<<2Y?rvLL2X>%BU_G6 zGZ#LB!N7ct38Br=LC%jPkA`Q}z zjY9Zi-p1@YH{cU?Kq=N?&?}MWxCMw%#j@d&e|)ugpxHA#1CRdIyEfKv8ZjEYR@Q0I zn)k6qRQK0L!{^}Gs){?~(3162MaNUGQ1sh_a^?1NcllJvsz8d?L(Q7Cn^dHvyS{%U zjDR|7LU~*gd$_#;dc*#D!%xK|n5McI{iPVZy@xImp#f4bJ;JebkE-&796KJRP4hIw zi|*`+6-=c)_ow^&PP?4Xp)+vNoOm2-0|v0J4z4{1SA(+3RfXIOIFlQz91j7xx>ax?MDWE>J7=ie9SR0mJ{LfacMebJAg zVS-0eeOeUA(O4n5miZX6uYUY4gcqqG839c{?stZF z!L3B5!QutgUD3PZXTsA~3&<4_j= z6$NhJ(Mha}6dF&W<=>N7(TYeANzTN=t{)E#dN^x&rj3TExIHW6ntA}XuORmAj)TGC zF^lT<|9&%}Tk-xtsa{Wxt6i3z<@cLQm@TO`g$Qp9F*$3Gqr&kV&oD5+P=B88<_){l ziLb@Q^wu32e6SsP0BNI)Y;^J+sFs!5V)Tj6pqr+?Ksj66;QU;xet}Hevdt#Ca4f%z zk9|6w;`2#%!z7q~5Ous7{EDLI+upu!D!LTU7dSMC)%d;9V=!U78UEb>`|73w5NzM^ zf|oZY-f#15?B|KzylkYXG3)e4F137K7bztF?za)3gyBaU8eK8wP>sKaB#HD1SP1+Q z%H5YZuP}V>&ZxJcM_;WfDfuV7!0tSM_$lZoVOs(CHsM{smoq^+`UmzM38UoiPuN~i zRdUhmaC(^5@xk9K3d+G>(lV5ze=)?~ z3ayXUj95Gdte<+bM_7)0?vD(1>K8Mqz{sRysgJZUISEod)rvnaGLlshG_33od>=gg z^qMBQXoCwBs}>~3nTW`3+6>KL9qB4&1)K4*vPSB%_tEVM@(gOJ(4AlNZy_h zf>LAY=FRx$VE9WC73OCO$sC@e{X4>(-g7%pJAqSy$a?r(nk2;tWrE77QfbJ(uJ z$DDER3R!{GgF0Rm-n_*lj-kEg0`!Vop$B(m2bjG2c_=1tet|X}o#Aj-=GiH#I^K3J zX(Q9a<;F~&IB6uGmV`o)W9^+qyT#Lp3xAto?h%&G>0dSuY7gv3M8!MN9*n>w zu4%B}pE`-fspav`xQurHd<+1dF~};u{V;;|+=8ld4Y?uhRZaAicVX| z<3DiCu0{J;@kSbk>8eTq=%mA1Q)Cx{lS0t{C&iLEISe*`?K#qUcV&4(4eLwqX(#g2 z!S*}t0$HEr4Gopw=?Y-h*4=q^3jmMT*cIQg8$1`?bX?QF&S4)r%VD4SqK1;P$6oWL zGW|4Y0j-AZTYk#f3(6dP%0&`El#S@;<)F_o%kRFa(L;86-9nPi1p$n5OdF!UZOx|h z-jp%GjwJus$1m6BOE5a2j-JnZ@i%W`KpZM5B3MeW3J$RBi+~j!4`d1(a$VXM1s7}% zPvlo?F-fzH$lASdc2Kpz=aN)`w;$$)u2jokWd%j@XIOGRnZ9rh{0!zQ9 z2y`+}5H9kjNJXQ6q|B>ia=-1JjKW`TBRxGycfFjyhQl7AV}H=?|F{Ku8@GK$QMA*c z^zb*=+fB|P4e6(xgE0qg7uTUdj6^|Zkl8)Z(LQ=;mxnwx6F7BkGOByiL3nj}%!JpE zI;T{W6#X>6!1=ef?90H{-un85pW9L78dxGJP^rw;zhMDv@2WZ%kL4xWvGD@$3<3aH z#`Aus_x5#0t7jI%9Gr~{qI^7lO1xJT)1mCI%A-p7Q_G@EDrswX@O&X}$QKw(h*=rC z!RkSMzRy0dVBEL2BqI6CW6WFVU>%eyse!5*NXf|$k7W~xVsT*JMt}V}BDJa_c@CNO z-~IK?K6gK(z8BQEROiV@W_9gsW*!G6ataB;q+iZ*a|JRD52g!jdVt>zo&`O4 z=y*lJgekcgiqI>@v*k8rFlu&S4Vn6h!K+9!M}9fv6kM?ttf(F|x1E_gwdf0>_XY9D z2T{{LH@U-HhrAak3JS}*kqyWh%2;t<==m{6*)-40XZ=NW|HtjOLUr9EhGt_c-vl`C z@dFBP(y%IeHo~JXg|8!NaJyAtrG2y!)5|=q6P^YJJ$zc0QWLxK4G`ZmbbL^6MkqX_ z9nfa+jJ9r!WkOnQaBGjpsAd!QtMIQ0v`0lI3-_76!=#8GH!Kv+k-ROJGxXo!^!sn^ zg&##Mwpiv8D;iigi_A&1%>dRj7C*@+e^fvJa%3&y*q2naSAf+xF z(_GL@t~)}nv(P(|e(~|g6DJ9^opVg*8)%Ky`M6Ax0w~jrOlmNP#BY)OW5T}c#)ery zhDf-x@&P;&*1+V;z11iTd_j0&xi|L`#r-`V=PYe&<0y`OxR^|WCf1H7#>zV@>fb1L zK;CP$`O00cYs33HCQIwWSM;JK`Y_40ujI1_g(%nlB*N-9}(#2Z4D>ItVpGF&rqi4X{l7h z{ubCY-t!&}(jHNDw?J`NnY@Vfk@`HJe%gV441~&w3jUX3DhwfNvRb$KQX^(~ST5(x z23biy)Q@|tQ?Vq0rS}RyI}*|ld$(133Cd3T-TP~mcs}tnfJ)>Z|Eic%BjV_#IzV!( zN9Pxwe~;+kXaUiJyp;IER-yt%uJn|d2f&1HJ)V#&tVkq497O7g9d&pR5GKbqe~r@* zq39XieMM1cwBHz(oJM)VfDu>0`GJFYbe$~i_I&gQ@~^a};}J08B!5sV{P#F| z3|4y3D2-krIy%Dq7+*`s@zdbTsztQ*nXFvK$g&;Vyz)1loYydErYU~>&BCMkKY+iV zgBVDX5_~!dncH@=EDPp;i%2*%o?1Yt#UFY*(6slvSZ${z(CmMVHJ*f>QeA}geN(^o zWioz`fNU&;my0esoQG|St!A6+C{>wD{AimJG=g>6M=X&KQ zk^6F<%Qj*xim7ZJgE`SVyvS=AZ^a_C|N0(JTr|Ygprf+5hg+Gd^>%LSi#+QJ=VTk` zA!jP`Skp&?*r0EhUN*Ds;dJV-LaY7dnWt_-isf}=C!3`5V2H;) z+vTk7VB|6O@MdAf``oF%Gdw5B^TT2U063Vr(^n*z{LVwFA~*th_s$HyY{TtLZ~ zW21268Q;vo(SGsq`OwE@3G!CFMJcGwEOY6DzFC)e32|h}WzXw9V`-n6ocT!r+RKUjo zy|QYi&iZHfhLu#M0q-_>PTBVC_=VT3tq*kv^nFIFbW95?*UI#|6O2{1j;bPJ#67#j z-r1~Mt+j*Eyq|I%cLh_CZfVaI^YqKe1Axz^j-Pieju)!3!Zc`lyF({XQ6bZDc~^y~ zdPTtyQqyErle#Sk$XHn<-B~RJXNnMH4)SzU4a zA@|hf2PvS3r+H~27HY_3_;3epv`2liw$c}$h+bJ42*S=-iC_`3U5HzZ@RcNwxD?`shE*r$o-*&9)`sLO$FJ8Zr`qNFKB-*f7i%ZgfKyWWnM)jmT_%*|( z3ipq&!#bX(_Yt$=zXm=ixVZeKva;`)BHxGHxHF;;mnwD5hXz$V(*H20C! ziVhj1jW|_u)_P5D8BQR!Z8X0r#UG*dr>zP>tQXx!HD{osjI;6Zjyvr)X*?Sp=e#44 z-YybYEDXB(lyT@ym3*)HGpmC6q7 z^bk3ajs&91yy|b&2U_GK{Z@q#wNa@-+e6d;!=Hh%pEr;P4U@EEB^o3rIg#?N|AEqZ zvjp)D}Zy z61jfPfJq!Y0^Ov!P319gl0B$Gd_lv%=8NW0?HC}?1CLIw<(Jc~nmt<-{@%sB; zouT1Y&x@6t28Gsg&wVzM7_@>*2B4ez=st1Hey3DHVRzr{PhUq~acDHO?uvQvJqsDA z4f}lgvGq*gq-Hk`p`531OGBn)}!`!Oly7vUin)@`_j(j+@l4OBzav{s$4n$ z7%2K*4r~n^sHMK5_*dn9?~khV?-69ES#}xnwJn6q!;bh=gt}J(mAlU9$gSI0<}_CA z%w|f^?;DQ9_R{~x{azU}kv;zV=ldnkyVtWxd;EXPYzNM`fGdFo)zxyW4;;7Wi65R` zf-f(^25o6q85X6{&PT6{&Su3|G%#BpKE~Ybo9L9 z_Zc49Qvx3tz#gI=tNJoN`Jell{414zF2Ad!%Qpp8{w1=xY_znwnuZj=x4$JDuabkjQ66mCx^U}Zh!H%1ske6{dd2Y z5N9D1NmR4z$+JF!*RBV`vA1;uckfV~;I&Oh8k9BokvP+YGaDEO z?-$%aC>R0GuVqBZc?kq7IT1#VLkLl^`<7;h^PC zg8RqhxXVbBeT_zyna63d%6TH~%T&YiA&+YJVzZyRamCyCIbn6itYUk~zbZBk6#u?H5G&{%z5cW5=WIWlHSN)!>K@u(f9k#PGKqy-Q<&#g z*$6ZtmmqN_our#x=%ML4P>o6#UH^qV2qM#0j^!UdVn^eByg`F8JzYz!%WWjI&r6u? zA{r-b=FcQh{VLtmM!x092j^M%8>Q_?xkCzF^}MyFA1Q3YhytP zSS#AHK=hU-P1-wuC-bA<`Ociy-yt3N+kNGkwM`dQnS2|}GOqEtxWK`nm0M`P-j!a(zayK?Aq&(DGQdiJCZ7slI3>0tsee zsr1;z;S|S%;_>y$R4K8^D=qEP8G9PK!Nr}*>88{uGW;7?u>5L?D3Nrm_RQ0e^S8UC z8hiX;kn>vWojY^Gs%337v9^nA8dXeH9N}E7A+CQaWRV`D0KeyVBmqJstEylmZ$PAPfI8vtQYCAI zc|Up&6*D0sIUtp}m&=OcPsjr4pgmz=wAXgI-g%*RuXsx=itiB?+mx7a*ZhD;5z(cd!w_1l9-8bt3d_w^ZqD&eU~yTFh1!rEhAyscn9qe|8&abYJ0 z7RQN#b14{%u}=Yg?C1!t$M3<-Ueb@&tA*3PQ1P==y5G#E63eHa@$TY7Yp;US22gT> zA#q*+7!?adseNlezh0u$OwT^HR8p3O+)TYg8FOJfHD;Z?twZ!|5%a5|1m3uNTUwMm z(b5z*K|D7CYT-wY+oK-G7ac=hYoQLc-bOC9)YOd?lb?a!53IB1*aTH{s{4G(bJl~u zfZv*Gdl59J*0rc7p{&x?K+^Ct0EBO@j&t%d>f~pu<8*d$#V9w8<$-Nd-Iz-eRMUJh zI+i3v_bn!Z0dp{I93pX{Ums8+u!(6kn7+xsCIY(oB?VPKgQ_2@FUXsJ5enmjQuj<} zaX4u{sn*;_i8jQ0q$vleW3bq8k@aLU#m270YaCKtQ5!6p8CVCVS#2VpU8vC?Y=U!zxic9xZWn-AytBiB7B_xycbrMQ`7Si zW&9COfQ_n3XIzf!s^{UDCB3G$6E*8ZY%2+&A|N52?`;q!&m_g9Zu+%+Dq-~LA8PPzz1dwsqC5xFIplxubauaUOH459+-wQ0Pj234qi2-3SL|0A96E5ERTf z#HKl0^tGA2CaoYR&7$dtk4(CQtZRzLt_qG9v$w_t2t@K6%TD4?tXv$Nt|$l$3<{9j zTixe3!mC_AGC*^}$%Ry=BfTa%1Lh5sKC zy>|0IBud`e_upPT0NwTfA<_SU=)*?_Fw|p^s_*}R=(YcV=vk|d8tFhL^&r5R@HVks zMdsSFYZ@LdsE|CHQ?t)6qIX4cGbLz_-cl@NIaoh%?CVT9U?pKhFd1qmKGNg|CGLga zIh6TZm$-~#y$sC+djo%+*jiMvG;5BJM}C{RUw(H)aN5CSQ1@=wMPAypchWKeRhOmG z^(4F2I-fF#0|c?YhgjUND_7CApcWK1w;di|qCVCd<;-Mj%X5ls?y1=mtaCXQjy;Ky zpJ-yh+uXSrEY(Tbm}Rc7dD(Z~?PVMX)fbk`Dsgoi(Dqh|Fa6mwmA~$Da9Rm4J(rSa zrys24bdO*N@K-|g0p+cC>Ly;{&;iCLYLf|1f~z=WgyDbncQy2yJyQ}?wsT&Chb-=? zzfN7?p+2yQ(eJ-pS>U=%EgS=}@4ENiMDV0%I>>$tH7Fvqa19=$n0&!a9D>M}gAJ}q zLPW2-YILbCKBRc$W_l?5_evrcO*Gu0v>efv*VBlZB^a^Z)E!!ai+4bx+z#AHda4ay_io*6bBZ}oIUz|VX#Lhq0@4c@ zC`s5SM`x^=6TgTDN%&GfR}_1f-0oyCk+?3Y9r35&52Mj~r4;WUKa3V>Twhm%Ae7w+ z;0;75(yGJcVMfc-s&Iq!R{&_QL_(p5>MIA6rSfldAB%Xy+*;J*YGyq;#4cfiJ19mK zD2k9ETiN~@ve`b5;b zTDk@4Sud2IK5+SI-3^xBb|FwYWNWS&XUk1lL2gwOd z#~`?`K=y4XYKDZuXn71%gFz%z!e^a>@MXQen`f5j(@jtJfxEaxox`^+;Yg~PUE(+G zUaWv-j#-fUXdM#uzTq;_P%WJjxor178?r>NDqwQK{?rh>#Q|XD67O950hJpo#n70K zj?L^G_jdQIE@sR`w~Un_T4tUw+*G{8Redunc^Yh zIKa{PTD?yWKeJ?%wxkH+b@lu;AO;JHikchc#MmzB_8M|nc*E*_o{?QpF+En#YB~z` zxJwz`dvX)}i{R!lt+o8xL%o`51wn@JP2@{mKUcsG1AtS)Q0foRFJ;MJ;RB;f2*ItN zJ!eFIJpb6W!>ti3qA=#hESa$%*-^^Hd@KlJ^%O=L^WJ{4k3$rhRSi;!%=Aq^q&VHE#3s=BT;CI!QtUu zrGWY$h0|Q>5a(iDcG6I47OKH9Cepmf!YTb12fs)+;B}(-WnYKHm=dEBrT#+xPxoN7 zGM~*IDS{^_Az@0#kSA94Pm1@uJ&{VI zwe_+1=g&G+x)R)cwBYeZTAg)jC{Z?riHHT`sF*HuO{d8qosY_t7wP8XZOIdW&!58u zY@vps3TwTV920jIaBvWlNJ$cV{p+&v_G6)x9O74ER4lVWU%PX?Y_>*ZSNG54kCk6O zLw#q@HSRdjvkRa;e}*T2bhZ8B>iS$KZr4t4&ndfVB~X(0F%_QB7jOPn%tcZbzd*NQ zp$gnh$A{C3EVQ$JkT-^EFm#1ge6fou-)3}u3xwOH#6fF`1JIAQ!c@=C7ga$&f0)(D zOge;ezYXT!b$|NZi@gh_Zp0E##*qr$oGdY^=Ex3O8qGvzVd3d4oR*)4naB52NeJ6R zLtkt1obRSK1;;4t<)&=dlvWLXvi+MxmKTfhWPXH*t9Z0;LY?^0Ly1P8ek};E zXG;sko%k|8L9xDgH_7lN!9-WkXiJ|e`-U&uO9_j?kzZCv7q+Ey-wEAy{qFS}wI^L>)anYgn2EWdHFd8|LqTEu1I@Vw}+ay8*ti@z7+ zMR?b@SJI(z;{DMsKAj8QwO>tmzu4d0*WWL&ed3D!diFZ|pZ~-FIS>E=0|5jG1p);G z0|5a5000310udnt5E3yUA}~NfQDJZsGEiV~1VSTHfsvsUGjg$F!Qs)8|Jncu0RaF8 zKLYi3o;m@;Y%~t(0Xm#CSl47o2(rf0Tjr{4osak{2h;-Z^34lS$S0b8n|LU+^GcNd zSuY0P%-<>I5oZIEfNC;PX*1PpAh9>fqC&H>94@YmdUZX44Fsul4xX~e<)G2Dj%vCk z9n3kIf~`0L6NvH-IzV`so5}S-mexcQ(n6=0(Wt-fDb<|Q@GY(JgOA_vOMo~J^1T;`UDA99;Y9uq`78(MG$3kya90f}mvk=E>NI8PJ? zAmgJ|9ME6%py$Xbw9KM8s6oci4vL4}t&EpHTf=Ft7m%t`ZYzBX2WdMEeO3+)Om@`$5YaMCH zYf=Viz(1=00IR`&mQe7#f`fApYR1fu@QB;W$z|v{`UDDJRZnI?yE~_0Ivyz7M>R-} zC4X^J)UWS3O{3gVEVXp-5V8yL0)>{IN~%pt4m1F$;1Im*F-11q*zCe2ZJ_~~zCiW` z0@tFVrBzzh$SQj%5VP5YFL<592y1><+50LV;Sq?OU&5`mr~d$=n~m0`ylSwUGtjC+ z);Cv1lC_gz6I$FHP4MenFY1dXV@LqnlC=fP&-fx@|cxHr!pA z9~WU6Av&Q6d=t#(gY2z?EBmYtwRNo2h)p&Oej(9E)d~!h=g1?#t$B9|C1H2TD-Dxr z%@4#}$1ZpNwr4>xwm$|}i*zFyKiY%EuR;H)Ib*K&?X64Np4Q-hFp?H5q7LJ%D2U`aC zoQDgGjnTmp{J19gycVNyx0zC8lp29t4??lw&gjsFy9nqLO`(@Nn$C(uI?v-TKx0OU zy1OcE>2-Yui#$$W7gyanqHc~?1r4cK{;j|_lJG2BhRgk@I?bep)SgIvJ1vKT!6bqH z(2*uEgTv)UEpmegoaD8RNIGCQf}`-cYZ6YFsf1qDF$X{* z5UIDN^;F;88L7<@>JN2{SrH4wvLE`J$=ZcsIfPFnJT}d#%$14m#8-)FEV2GvzoPmU zV6kl;_5Cl>jbFL^%458|GELxPK1>LyE>>B z)g885{S;JA$Q{{Sn%`fW=APFTP3e@?@Nq|}VhOX-^W zU#D$sY@3eI^C+>tOD$3J$8#;bHa}g?ck1o4Qcj06zBd+kjT$t2qYKlbqcE7y%FwLr zOTP)3H%b2hP=CE^<^KS${^%W-;$!_0jJLSqzE>-$MV{75qN;@r-#`UxF;WosXvLDl z8mK+Fogs@Us%4#z_H6R%bR2draEf)`@igy!cKXx{R4xe4{SI2Mr$;KhtPgO-p-Dy9 zW9Qu9Ilz3Z!{59tv` z$D)98Uuj-J??)!=gMk#!YRCSFp1VKk?Q%X-$u+Jp(VBIeU^H_?w=Zf`4|@%fU=ur8 zjEcZ=c1Y})17>S!mA#?GWRd&WklwMU~mC{p#(m6Pr-998|Qzml-z}zgorK zW}y2j*t^Ph1h(0@huUb5iRApvs9=I;V`Ah zVF9kXZVl#xIKrh+r*FJR?J`)IxzP+%>W#IS{{SGNsACYC2(SB787H>pj*y&)Cac4H zHC^{2KV^<#V|SD+As-W!6t&aa(a0zo8R%!FBg?r8t#G1pULYU|TFZsbX+=4wBaf&~h%t?ZjtUS1HD29ARJ%K?lBkvCTC`NCRaxlL{3CAAa+EO8txb);IQT{5#>#4Y01+IRYc~RUFSI<$~m671VL#~7O_+cM+AFg(NHR1twoaZh2>hVA!@!>K&r5= zI~wjH9fT+nR)4yzeu%8pgeyB8Vq=zuYJ{xH*E+crW41W2qLZG+p=7m9)zX8xv#r^X zRDiM|d~A85KIH*C}WUQ zof+s&C%GEII6%uQ+;-u%nJO_7az*9?5e*F=0cKCit;YRye=XGgl@I8!y|A9x4A`7L)FqD&y`R^x9ahQYW($BdWpo7>R<+nVO4_^0gtQH;8y zst3ZwWZHkF98n}zQGeQ|e@zMCdtIp7b5m|{9!eMh8xS}RoekC7$SclPE-MrB*opI$ zXNn;+AC%EU8dI5UGv&ci(i5vpIUx4)T-P8L76Ux)$x4mN2WIg<$P_d{)6G>-dJl>A z%xoGOwX$9tg?Y+rnedtqHObu9&+?1kPLQ1xK(wC`VEa)88eLOxYr+M?6Mj%|!wZJT zBvxIY5wWkKH<5AE^2!fzswQj63rL_%Y0HulZgXv2QIsl>c}ms_zD^2ws;MMOo3S*( zQuIK{Q}*2Y_F^=(s1*f$5;zSp2sUc4I3pBA;jTZTqfEkSoPvF%z&S4pHN_UV7?uXk zE-MK-;3%XHO1mSZZ3IQtx;sTK^f>|o*2|vB&UHpoP_(nO4(Z7g^)+uLg2n@SC~*DJ z!$HwDsO2E6GgKZ$b~zo9U?&aqRqiWmh8KrtklA41v$?Y_D+n#3=Lp9&ZG#{s6T!75 z2qR+)F7O91!BR2N5V8gzkBL#>$ys=cBR=VJBMEGpPu+yG>vCL9q_PsGlykV z-g+mt!(l~VK@R+m2VoaTQfs1gv+aDHjaCx6bMy;A(OJ9xI&-i+u!}aySY9CL00zn( zlEUSL`T=j{BxzT-AfGepi^U5Dch!7s@RihWIceLst}Vc*?Q3}{U}<&Ow|f$?Tr-$6g)xO$x*)aRk)1|?xL=j z>wI>=-Bi{!(I~#k*p~s38!2~{K;LVAXzgCzIqg)a&<}257BzvBnVYGnHndn;tLPNb z#Re|RO#ErbZ0m8s3Z9Hx=P0&58rN?DoLnlqw3yX%3Liy0owD2-e6nac(x)+y7zyuy^SVE9yHZgo? z&uL(0fa0)?tc<+^x;ZSg3ZjX`I;zu5cDEVHsJr%4$7u=_dP!fd#kU#a*5$E*zd%w>)bmd)7_gevf7)z=T$Hj{IlC!Ej};xY0yrlh zO5?Pv%L9gCVYG+hsFC-7>TRX72(tSO$cQ08ZfNd1NBz zGYLK1ri~7UdkP@t=B(aq#C)l?h$=^Uv)DG#){Q~Wv;^|HM|Wzex5RCS_@L)noLsx! z?-JCuI0Wwz#JN*Ko#%$A<8kq4^iIUwT%~G=>7`EcRTp1WP8nFY%6B)d*l%{E&lp75 zwo%3)_qrohJHyFqcfUUJ)NJYAQ;E^v9Z}x_hH*m9z3%|zsS(pcz3r!a`uD!8SH3m& zpZ~-FD-Zwz0R#d81OfsA0|5X4000015fC9UK_F3KFhFsEk)cqr!O>vh@bUlJ00;pA z00BQC{!LY6PQ;~_I}Ms@CJ)>#V<(4n`{K!%azfYsAh~2&2p-@?s;!NWgb8p+svMm+ zf3hQX7CI(}DG!gOBI-48@%&jB$gZZynyJ;R_p(`+n<0)N#gd-K+<0Aok*n#b8Dw9P zeFM#YVsx3O!H7^TL1~KAhMO>`wz%jMBt-26yswCf@J9gmc^m?Og9`hh;oQBE+U_~pMdIILoRMyu=_jtxB_w-7mu6>^^wO3!9N6{} z+Pmyxdo&?aVq}f-OrHg(1o?xLS^TRitcW2C6lchjXcYXKX11p2=*L%_D+PdALr`gW zEJ`Ani|@%Pkx}!;fSqO*OAh0F+mhEzxCLanQH6% zLj&ob>5FvMjY)XpYO-M>57m1L{(Cox=K5qRI@5vmU zRHq{Oq@Icq97pNCDv4Z_uxFA>AWRE`_Y=YJk!tN9vj-CC8DL!F_^9Ymc6xvTq*g1 zp=3jzhC3wm8LUW(d{P46N0{I?8NpzB7}Zg)K?w-nD!&2XWDR=Q0kDrlA@F{h6&UKM zy*1>7jVU4sM-bceIClR40!scLe!QC)rkpi~C!u-s`5Un>Q2fm@f_(JhH{S2Ivl4 z+K9CX{{UmcJYN!SFMzqMxL4vy8tz}6UmbgZ+HDif0n5|P$s%lyc|!z5!d zDao0PViCp2F~SVCIn3m{E_^XbkQT!fj@cg+s*>PHkhn-RK$mE-dEouh6yNI-?Q*JK^fzvd9AM~WeE`68@iLbXAQ28KDbjJudJ_+v}QJVr>X zEc7MPz02MNA(W{ecr!|9(AK*{18>9`!7Su_B2#%7nNH2z@E`f)u`PTAUF3wrfBu{7 zYfA8TC@uUVM2-2lqm@5|A)#ILhI3?5;bsJ;O`=5Zn=Y({Zg4|RubL9vCJ63t)`w%Q-A{!fVVL;q)DAiyS@&Wm;Uh6^ygI zCDfbF)BgY_F^cgk{sw)nxFQNi89qw@t|d#B(HsfdT!aA&WU*lrS!ilI7Lvh+=doPI zjS=h(mc(>3n4HL&&N@RRa8D+wd1KRRLgROD78y+KF^Qh#nNlH_#@;s_Bj%NhCGt!= zJ%5ppH5mjDK+vs6wMR_Lpt~PO`opA1qa9Kdn3uPaNHTV0y8MvAY(qH7b;LW4u;zrI zg*G8X*MSBiV`B>RK`I?0jSdR-7>Y-sJXq+2EQ*egjBBwRljNH0%PMW&5e=y%P0W|G zOqeK-<`9G`{L|>)7lDq2;~vGyzC1F|h@uB`JRby~v35c+dGJ8R2A)d^+k!5KbS;!P zoQ?|#QcMds5KFf-5@aW!t+Y#N{>E|g%Loa6MYbzsO(bg@3hiWttl@{Fv2~=%T9-c} z<5JcUZpbED2f|T5u-0k#Vw6#%WwCTZe|Q>hhAd%VxH9UV1SNI{u~JI{(OP3>Yxi;I47uR=&bje{8YC01p} zCG(_DK?L+8%KWlS*z#)v^RR^pxJD8lBuIgy0OZI+qDh2KwklYQ5Qmp>iR-+Mh(Zv? zK2g2UmMcSo&vHkl1ALFs6cLwApkCqQ`II4Y*t}DsJPdpiD<6SJmdTecF0B|Lx^27& z_8pUvnN?(xQlMhCMZPRzN1ELAO&*0WfoYKD0D(o8Sz-;rMU;tbyodP^+?cm3 z0~&6J*)_8LdeR`YSyPzVEiXarCSk)!X)g07a9J47g!Aw;Pr_#`k-O$Y%WdX|o6)Ku zm5GlW8crOLm^I01@kF~a;)F!wvM5Vp7m>3Qzy*@3BqJk-*<5ZJIdZsLAz;zc$Wc>e%n4TJLhog()s ze6gxB%IZhT5)2-FU1Ig#PVxVGgYM2B2MqNOm{H{>1OA8(N7G)%Eci5nz{ zld)Zkx(4s^N=4jJh{*_B7$V?F*x6I6O0LFMN{`sVa~n^Q7^63gk0MZ}#7&GYDvx1h zkW3LG=1Y|aMY1jOWIQp^BLtE)5?S*Zko*W=0xB@|*yw~WOAIIER*+fN5=#}7u^Ub935a4!W8!?pboy6ONZKSPn zNlm&)wn5wf08hdp-FegcX$ts#A@C8ZF0`geOFamSmmArWxXicq(r=RFTFKDA-9+4- zb_YW%;C*PFjYaxN(8o=sfvo;8={IBDO|ExIjmj2YizZAld#SvHHYa$JYda7it+pg0 zOeqsJL}Xa0{rVvfVjH%)AZ{qfM~4@xQKCe{Eup4cV>rhH_+ZppyaWUslfK}NpwUm6M=^b*@7(O-{>Os4G$%Y2@inSb}(+q znl2m*Lf)C5)M(5{bfvmTnv8T=5}jW|5Mx-L$fU@VB*;K-(KHE6EGMipnz3q57e(Qc z5hSXzD=f2d^nui|@*RY$F9QrA~O%)z=~E$ z!gLtyEtQ|KEQV=cgd#N7d!S1P#UPN9Fjlx$+{{ZZgMj}Lk>@|@$(LbTRTu|8> z%==F`Ok`LXTI`l5LMV1~5aooVls&5qF_KLZAj1txrMe4bFM)~3@MRa@#uo+17P#>gk)}p`*e3!S289BK4}SDvchX<*gS!HR*AYcLA}`8(jb-v z3WhpFL99z!40uOSnk*umF3iIS&Jh6p1<4E2Ye}NVLys8nIVI$mF~mTE)`k~9FZpyX zWn7M%7{|?fN5P`#uynMc`9hk~{{VsPHNVMbkz&i`_Rg@$U5~91Xrp^KCf}Fmu^oJv zL3FPIhuBZZ-RDMIHSA!vmSQxr&FSG+_Qyz99Yj!64J4?s;Jh*&5*i-??7oDd3MI^r z;a&-rWppRt`x{8N;&8Aumt>oT_#mSCE;l5GGr+N3(8*bjGngXk^sx%abagD2Mhs>u zeg~XBi;EqJ!!HAEx?n$1(N&LnJJlYnR;JIxZY)O%N^euFQ!7hj?#y@3HPzT16*-9AkD|{P7t1B zNsejUSUubb5JIxyDn$4Z$#DbVMMK_>!UQ7^z>umiJ{K018tkz@$-I_2&a+*JSjj%@ zPP6o>N{7jTRj+0<{?W8IMS~{e!6IXFI%rPhOJPeEuswMyi6qpkdsQip$_vlEyv>_w+uh^{_ ztc+T2%@@#K_|7Lv1dh)i0|^PS4QW0`xNiLoHy_2ANNzm38@^8pS3FWENK!GE)S|$4 z7g1Gp3&fmp7KI1E(jd&Ea#5i&P?WC((lliR$+-*sh*yAF#SVml3-lA%h1iO<*zNj7 zTUgSrISjlR(F4$uS*j{XJ&9;=ZtS+ZCk<>d2#bFsVd3gNOn!qSEOPQNOpuES&~D%6 zTxDShgc+YlKg*#AMDUZo8>1Ng`@qeab+R*cgd3djAtGgxI|G~|_u%vHjo4@!+W02y zZ-Fx%i0)i#f7sS^mf|XcL&riEC5RSS*>I0CG+m>>BcUrsG+mx2vwdVnn299ia>p{O z5_i7?R(75Sk^YR`3|OL#*klVB^&mkqWq2?fbV`T7W8Ec^`{96)nn|Z(HklBtgV>RA z{{VtM3~qDkI;y^Cj)-KjkV&yz23$*Amh?Q6^Zdzjl4zYS-v{WwY{Ocu#{wpF){&VX zW5>iUE#H9}6~?nIxO!&gm>7r=kdVGdz$r>6L{|G{f0sg`)sK|gjDFpEC`_6g9T2i% z6q39Xheqx+GsVcMx<5ojaj}-V9A^?umlTCHx^y9_Yh%cz>huHzlK_?_7?s4xOHp(t zmhh7dzcHJ|<})9m3`ubrOZFn+CDGN6He*BQqvCwb=>lW7FultbAEpYbkUBp>W{Q%= zY^Fg?)Yp}wH|2w2gSZ`8NX&k zmSa_slQckqNN(zx#u+ZHTc>at_O$7XwXZCH|5nf+j zjg#sxT~b6pK|Y%Fr%65s15-}}WM${5Vr4IZ?*p!pmQL9>n13)-A!3nFiovl8)O2s( zt`3Nus}dzDk!tuG=tm{#4^%bXn`T2>!H_YX^G3pFf$25mBf!SDv7-%@XfVlWm6;Y$ zloYlhZ1NDikF4xngS5jgMQdomJeWpM=I${HC6g*rEbzDWcI zV-hVR5QCB$=Hu9;?3~EW=Ffsl%V1*?H-~aW#eNFNxH3G%OGH|{d1F4uCjrT;gA1~D z%W^(1-YbxmVwfasd}q^K-7X4){5u}?I!DNSp9IEHHW){6n>^#f^11EvDlh} zf}ylAl@PC!=x<>biWyNz&eoW%8w3=x#EN?h_9X(9DM-4wd4)tqIJOxN9f{RTp)8Bf z(uT;x8RBVqq9@x!^bmr{Ziwj$m!!BZ4yugM>c>Gl*HNR38XRBr7TlPZc+s*a(Ad+! z*fx9qSqN1=8{*K$K1f0s_&yKTLS&LLA|Ol%w2AP?X_y-0LjM2-`=l&q6lQ3&y$#_| zv!ZQ5e54yPPc%r|cw?iD%Wg-x67bpmp`~Z^_!mtfkwt?N?H?g*1PiHb$c~Ar;rJn? zph!U>Fu#_^gdGWSY%S6HJdNtZU*v0&C8=~=U#QoS!48E+G4q&^+u4Vzy%k5njBAWg zXe1`#)MiSQf%{30S{(E@Kg=O;d{t9oruXI?;KZAei9Z%>Oici3hqrTa+ zkAi7iWUM~In_47hbhz~0qsGF_6M=Z1?*URwVGK>^KqKH6ZqWdHsKZ3VV;Qk5S*Nw5 zsG6J&?m%fVfkR+~%Od9HEutUd#zO4r&gHANJa!eeyyoz zfYTZh1;O&h2of6h#Ye@}4JSuOKt+s;XL0?HKh2>CRdmfC2SzdSM!B*3CAA(*K}ti# z7et>wh-*>oSbUAyxi11D&JRL;X>);A_z-;Xwio zP|_M?r{r5etzD9f^PvXILj)wy)rXmZ-wl%*mZKzUWq#y4I_Of%87h4b6sr!45Hgce z#ksA8j3Mqg@?{vl67|+eQf~ukWM3n5p``)~9+SZ?;8WP!VQBp|!SGa$4~`9dG5-ME z8AjjpXhNYAS*960*!ZD)r)5ly{z6^?XhF*+fg%Rpd@;J^myzeOp&5A?g#Q4uwGD2` z`Rs2EvttdiZeTUZxZ)ZRVQxrwWeDkH+P*vp7KJ=)wk3?0(g@C`Uqo-n$om5MO*tV< zsfDr2P6ujVLSc3>61za?_PWa~*^N=b#mu!s49U}D;8AF*{Y;CN2juvrqmVU6$yo`O z#NGzaBWRKONM3^E$NVz)XhIcdiXyCI7{|eS57}Jd7Gn8CSr)ECvOS4=5=KZ!g7=YK zVm-wd2v8z2saIp%Ynf8iVdQb{NW=F?6o<8l5@c=3dJS+ll>Y!|hmd1QGri9k8Pasf zepw_a7kfUW&P;+9cuZWc5*4&2n4#h1Uug#lb}T0J%NZ?alW88DKFN8{f^*~KW*YKFTW_0}YArY1w7#v+VFeh18Bs6;krmX-#{ z+qE)9VPuddl1aKL+7y~|C}VqfwahjyHu-D|`49OJqEBSCQb{9XYvj1@QY}`2bh15{ zJ=^?w72+X%sDd=mz%rgn)IMFd+^K?@4f;BO<`af6OX z-HfU|2~%w}n&pjhVsIpLEO=?df!2u2kR&VMUs?UoMx3nEEkKULLmBhXrcI!^38^{7 zwqp?zDO%&IoP+q{R9jrfr}I-#}k#T zCUPK#&`W~K&84D!S$89F@GME-woJ`p#8NG|5+z?VCd$F!f6GXKx`iiV4gUaUA0p76 z*%D13xK(sQm=ScD@) zu;V8rz5=EZ8&ttAS=>o71hqw=k}6l=W~f%koowF4O-+O|vM&KB{^!`HO$~CcHiethaHA&=5u&9nFfsqZ3Y7Gc#YmCL=+>}d+=!-X7tjm}|c z%NiQqNdEvrqrC3$O+pu9djOA1g6Q;Y$80@ELoy}c@46!b<~_L(MIXCj5QW8zfA9n$ z3a*fi(=^faXk!@Y>ZrME*O>_HkzD2Ue4~(Pc4vF0y3{n%Th#@Qd?Fa{OW+*cL*Q#u zROMAfKruC_r{``9@ z`5)9qe}?3iQhcEgbkz`;#nSHul(%%A;f+gJ$AQ&ShfQR=Qb0v5vkCP<1)m`RWFt|B zdkSH)!F{6;xxXe`38S#@j<7zKlKC6N6DkrsBQ?9e%$YTFp>48<(U7)UK_%3`5pAR7}R5jrba>;3`lXY@-^O_`d{MM?H{WTwpn&1!1{B z{EKOgb}{h}(1bckL&%h^L}D1&RphvsTgTX*V8>zj0V0N@l6}}xR~^c%crGG3V^l9W z5X}Q-k+!ZcBf88YO-TOBS%-ro#)qHfS2Lmi0KpK1$r$*_BcmU<#4TMJ(4rz{?ClM7 z$cbco5_Tm%N1Z6$lFt;BU~>aPJdm@nhvkXT@@2qkT@nzeLM40wz7ZV>@hc=x?2OAR zBI}kC5BXeR)wNQqCUd# zL&#YI9UsVxETwA$+GjC39^03AbhbC4r7|w>1bNG0M=9@eLdo9AS{lTV=&y!lBRH`I zkIOgF)e$U9{1>6Ev#k7QgtKHzNU>nJt!ge>644&4d-N^{iZPG=6|O3e-7!d(OZ2;v zS`gCTh?}bU69=J#n&>Yu%JMfQ*q(AG>}uH_Sl467DeRiYN`@>;6)EUR-7#r&J~6S5 zikzeM#Gj@?Hlbu`&|izI%Y|16d`cTwYzVOGCwOc=}`}NkYhtLmQcP zk~q(oM(X+z=Qi26ku5Z)*$|uKW5(FO^d|fU!r(T-8KMuBf3#py%?j(GEGK~|WU+}Q z>2tgmNZ*p!v6gB@{{YCbYaR*^m#M(p9)Xs-Vq0r3xlAMxK z`We11Au>Ct4&|yaSxYG*m?oQCf69R!+Tfq$?V?RgE2Xh%^|oi-(1|6B`Sa{&$3&7? zldz_ve6+6KMF~#mg5V^);I?)+kpy&C+T$2XG06bwtPit1LLo@KmcL4d z(JSyrGBiwS*@oy^Rt%7;ekOh{=oD@%VO-K`wl zl9NKnhM>c|#&QyOT1~kttR+ zbTi`n0{9EN?9U=JO}BW9THI_o|-Lf3n6;huDPJ7>%E11tvv5kZBN*c6k{- za6Nv~FsTT%labt(9|)Amb2Q$}hQF#GQ*$J49mRG>n@x)r{S1zXi1#8KMY1muVd_ig$i1hi9AN_@m5ZA#Mz$!?>;UpPl#DT+w zFyCYB*OD(`Ru@E9ERH*8z|ARE9pEj`u!vu~eu5QH=4;7 zWEbKfVkFBTz2MOTT-f-kA<4N?PXsCRw6Vf#FUYFI)4ZbGW>+Y)UF9|=8aqn|)MnEK zWlZ4%t!2B=QY|gyX{zYwaylnuGFq{LjsAu7lOcX!NN7_i*_OzO*wZ5DSIo2hku*6N z+C=U_3uG`Mn66-gx(f`t0vk%-p`_fa(n7@q9Sgv_7$ygw;E;vNX#W6_M)sgttIkTypYl$uvFxT1r%LfAo;c@|i? zqVShgTHCOem&z5rmOETRuVEdCOG_IFa)nsVAXMFsu_2;0b}Q;j;7j^j_UJ+vDIfB0 z+COgnR)p#|WE8VEp)*uVnxxu11}9c*Xbt9v=@6oAtaIXyzvPW@7C(mRV z2`(2svK%~+$No4%Z#n+}WBCh0_{EC~@9Nh3lOaAAB8V#fSfzV9{O1R*6Su~4`A zATZesie-|0e*&>iwjoTP2+*^5J6}W^f1X#*vwn)K(s{r53goEi9@Z(pL7_OLgAySY zq%oCCplTS@kU27kMMq_au@ggN7ERoMxR?1FWw|fOq5g})mlORF zzmX&4#TLe5#26kEg<-@^*(j*_Nt9q?OhqRKJ&B#juE63ZhC*fXTP9jH@>u0qwGLT8 zt&4I$fL!PKMf{>S$)N`(1n4E`Okv)l)G|S2Oz=X*4wuDMAyv^)5F|ka2@OFYtQE!7 z=sygzj0$#wD>C8R1sEP+Qd*ijg@@6FCc6~KjE0Fpvqak=kHV3%{S#+6g8u*lVWx#N z+2@i|OAYLf8}iE=!7Wlq{{V-_vsBlvxcq+r)dfJqj3;r49YR4N6B8Y417)1bs3buH zRnUYWfyI$?B2Zi*1fw}?)2qoE@+BlJ&?CYvp(b=s4eQ_h{QoF2@o+Wh^Uq%Qe>@KPdp4o{wP9VwKhqhEJQq;1FZ@;dyY?%O z$FN-222Ti)s1q8Xi>9-IN+QL{7;OkKY$ssVP|xgWQe4J21yw~5f(RIb5LZx0flmp^OTK@oI^c0Y> z7f&(y1~eAMv?M~@io^a)r$vE1eg6Ou{p0pO-=ze5b?kmijY!lCCLtSGu|r9lUjisi z5-kX`WU+~&3hwwCqt6#aCCCH~2??cf4n8xF)_sCY)mbVh7i#zijz331dz7^GkKwB5EFp98NNu-ruX z339&!yE`qbi9Sq=EIc?FBUp*JCT1lU_7pX&)S0u&gJsAk1<1I93BnvHJ9h&p^ri0O z_-OT)CG1xn`q5i@A6z4q?% zk1FH1vWApQhIYu(2DI#JGIHXE=RC}f1(MEUL<+-*&C!Rw-98@Ae#$-4)j z6IbAb$(ebvb|h*-Rj^(n!@@UVszP#xbfFKW3-Fhxvh#Zmi)7Alc`P{cE`!1|5aC7F z)Mh5czqDSe{#SK*tb2H*+OL#Vc&g2J%GFfeHB`qb4+X^+%ay=}5}uUXDT<1X2TE_~ zyusiT8lv12B5g*2dFshq#{_U>U=UX#N)P`4AiA0;v6L3G{{WzaVzeVi+J?+n$n9oJ z@-K`>bQ9#K*$V!JpRrqXix_;gDHz>_rGh7v8e zP-Te{p%5o=?ku54Soh1`&pEE^K9=}v(~7|!p7^8djM4}rqB;Knd^gGjtR*a9oIRN& zYh9#ITiBGR*h;iC~i#B|>5tld(oIvik|Yp2UXL6BhzW;Towlr>M#W zZ&VGDVgBgYyB==`W<_Z(#h<+yHb&y)RMJ@~bWQx3FVih{DIvob!F=3L3q&M~Tx+&U zeny0+Uqz&`T?kIpxfs>S?w9pSM!9Hl(m^V0H&syCvE7T1OAUH|-yL$_roEhVe#LQ` zeAaDTkVPPZ2&8vM%~h^TmiVeoe*GjWDx%{ql#&+`J}Wz5Q(7o@4)H6%yLF+(?#4Fo zW-)7!Tp$w@qn0HIij8r1h%9`RLk_Y*8bgqp1eA7V-e^Iy%)u}#BNfY@gse)7T>k*s zJHYqBJMzesw1`Pq*mfqBkq+3DqoFBog>vjT{{X;Q!GMK5vgG~43%o;k`Yk@{{e%Rm zkhW^{Jlaex1cgad$fy#d4bxGEhDQB3^jEZ1b&upc(g>swM>kE7G&(F3=rNi#SwF8= z2i;iE(S0Q%4Ce69bFp=>U4lC-VnoDNa6RR@5XMN9v1DQCxRiHC!0CHNA|yG^3?OnH zkVWl+L2f)-BV6n(qe@8$laj}R9IO-Fsq!r(j5`+cE{eqI{xW3L*t9hWNidQuNZBS! z1{P3EZ**M(;J}VuOlfB3S{g(VvW#qQsPhyh=^S8<8W*b^fDS@H^3ZZj8S@k~itDSm82&+F1)A8zG(&Ng_7L(DMU8*z2)F%dyc6LP>u`g#f}p zJ--GAk(k2SBkXK>31}}r?6Wk%4R0pI&RHblGqPB3x*20lm=fVDnYQVFB4~;fqWlXv zier{YI2l-XM0#P3luvX9NSP6}1e0QxJP9HNhnGSUq>?r_!3}Y*k(lyzRmuB&dYku= z$6li4Bf)}6u&Mo5>XI)(4wHXFen32%XL9hh%@{gv_DKN0Kx=GSPUUqI1ubJO%=}K5U7^FB-&G8rmTlvROaJ`G01lLeP01viQ^_=SToLh4o){6an&k&(Ied}zRz)CG{^V+li6-d?W%fMy9_M4uF=UFh z8W_4LStJ_cbtb^Fv9l$xDg(u7~isF`#i+P4cPZQ0W`+!U1LFsw3^r$<&w4> zl1E3w1dhSdOiXJTn}T@AxNFf>jytc#xhGj27p*>q{fyRl!4;kmKiNHSwSEWaXNR6k zJT_iUQSyjGqclYrvrLU4NL!meG**=Zmq6Yk!XzZ~xf|L=2reGtOp8ff^e(~C5EVkQ zCXH?hjYhQ;nL^T`hrsj5mgttDD9BD;M*)&eBM6W-WMwkq#o22jHztbY<#D>YmO+qvovM$CS-Y-b}Se}!PGG^ z2^BpAc`f-MgD)-z8vN9dE`HU6`E?Fr3~iB7(Tquw(}D)p5+kApcN$MQ9>m>+C7O11 zafmB+;6~H@n7R@kO&j=Kb~f9{{=yIX5wcbwhQ+E82<>AduE{u{d`VeO%1j=E;-`_2q2Iz2lZ7&ehh*t$Tdjfxc67bT<6$F@H!-#-YU(}GI;+0 zM`W4dfmI8Jy$x{id~*8}E!g=Dvuu{rM~xPFA7GkC^l6A*$AiQMU4}Kml~}|oGedNw zC|U@re+Q8;Y!Xqcb|oyxm9R??u6RFXj)#b}he*fHipYoLhFK%V-4Q?GNYUVNG9iXU zJdIz1CQaGdnoG?QeVYNUO9a`IvPm{5_ChNItd{aiw?Y1R-%5N z_CcD@IV5}+J@B7tKJgEN;OiXsN%S{VDoq{@`bv{YrmBR-2Sy*F`g$H%&W5T&3hGjz z>Vz@Y(r3{UMi9n8>>!~+7Yup53Ov-O7{m>0ncpJtZ=w7_H9Imb9T15hNgw!=6~6_N zAyJ%=G1U(RE}xO7vN0dGnppBh7Z$e&nksT`WLjrKxY%EXW>iCfX8AIyd~{7ey0Q&X z7A;w@u~nW^=s$eDWkt_?Cyt97qv1Y}_2|z-b|hSPNhH-b=q=dUh--u`S*jV(_@y}g z8L^CXA&!Yl6>P{OEk^@2SLij!awV1q#vHzw^6W#8BUmgCIxiL;UI##u;|RM=e4Fql z@BI?tG7`fk=>Z_gbNMTiXtD}36>GTGTEpP8p}F)lBR84wj2EZarYM}YSj=OWvB{Dg z(F}B&O%ak7DVj}F;+bMbYM*2DCyWtD;i^A*uVU(iM}ey9sE$wBw^^k66T%H*uv(cF zvbx$4y{UE+LkNNjYDa!n+Xcx#5psvwF?(JDGReUIPIp#*ve_@lt;gsdfT zqXRX?`lx4*Q*_CqDCuz#95PR%tK^w;kC5p##!eaWRH-R_4$CZ#a}J6@1Pt*R#zjpd z6g3lKU}4=$QjgA05f3I4YRF{W%&)2!7?8Rh$q*$^i896{41yU3B8M$n#P(k2;tSaw zG%!0?F|2to3z%!*kg>rKvSf(tO>j;G$QWWMh7+*r$n++-r0`ssJQAZPi=+M?XpPkh zxgAig(KK{bX1xv8cx%v~L042m5}gem6*3CbM1{0FpUEWrQpe1El?}9$=O1Kvh35;uv4w4|QMEU@#==141 zzD&0T!Z^t4i1$mH;E5jv`x7RINf9Ds^ffL=barsKl~G~0}o5$g+n&cr#LBCvV`1$b;ZoA5G7f~X8Z=m%gTaKnaIYu4n|Rtgb>Z- zM`{brI1;6v1a>80i`m{}xZ}P>6`0SGR5RRNgNG};3P+X6>cahsR{9ZrF-SGF%VDx| zm8ws2We7Au1DH}Plc%C!(G?OA1Q0%KeuR=PXw_oGRS-!d&lx9zAEO?OlkQ|>kBe|k z#3p=@Iy_Pay(LG<2#zRAx;j|E**1!9#jBV{;RFrrZ_K#TjC#y`RadcznW^M5%$W+= zI0&lCSsMs2`wWYM#{|ScQ$?RG4p|b#@Fh-3!HjG{<{k2z8~F|P#{B$^p2xY^dt{t# zlE}>(5J^rhgv^cq0J{>ti>59#E2HS#k4|83gb_m6&=AzFAV~~i(o9@tyW#9vx7_Y@wC+bCG(T`&4ofE+kMnI7RQg$PZdTNUV@zFhCzbq37vm=>eK8L4~l&fw_ z2y513;Du7(v4ZT)M#kunmlGp!RR!#dB4{S`EDgO9LWu~Up{fZ?5xGzxsKK8Z22m>} zNSh>nkpkhTwgWC5JhH^ zO^LPr1xHuSd+pO4qt`@>1oUc>U@;7QKd(s%5yx~z&Zy}4VMNiPj!3}Tv*LtgXW99T z5u9`(1dY-dXc7P%IJQ<%9GZ9t3KOEfLW6n&c) zaUho8nGh%NktDppnPC|QObT42R30!mONkJYfeAgHw)_h>s6fyg06Qd@Lf_O80-=L`LithAubVJC+qR5v+Vyj~x z6mPnr zh-^siJmVvsq$0jXO=L8Vsgh3>!P%lif9NHOIHHP=1kh;|YlH|wvZJfXzeDGOCXzaQ za@Q1W_z+5hdMJFO)slaKn$0(3Lvu!a`bw)lq@PvA9Sq1yFgGfeJ_?GLxXSMb*bhc* zOw~s$3*(5!S)oNAVa>?!TvwSVvq}bJN>KHXwCt0nPl6%=DZy}AgSfUlgk0W%R2t-lehH*y8B!0H|8yNW^QU3r7 zKD_YItMTYZ6-c5YkVS-%1Eb?L!05<(856!qR@JC{%9pI5iwPeRH60P5WX%r%oeFmi zr)P+-BNVRV6N$*rEA~B>OGkii_86ej$Azv+;z^W49Eb*Pkts{bmfy1GALtpo1F65H z$R(S7KS%iFht*K1giQ`au%Z(rY|zHWNQ5ED4G={jM2U^|I&Xpyvx+>Alk}sCs&SGO zW9F-FY>GO?WS>qb$@JH&A|zxGMPr6YB8ZB>`r!U3@-gRx*m)$8vCIs}VSh#VcFDUB zLdSL`qEXsLJ}6lX86H`oXMpI2Y++I+#)U-gC$r~G#s*@U`2hM-;mt!D6GDP!l1Z#?vOj|cD3;UZeSd>9Yk*}4Mcj`9F47gJN z0Hh3yzkNSMZ$3Ic9T7|<$3sW(B)Ujhi2nd1*w9v}$lnN}6BQbwWYLY$9tOP>$*!(P z81)muBYY!@<0JKF-LFn56`Dqk$7g*sO9y#CBj&bkW;@miHLX@!;&krB1C9H$$tfmx#V;yq6sYE%|W{j{{TWt#2~dJu#lXYXlyq7 zqGE`Pz%>}n#*vqh@gwpY{s@*}df74MF%AWqQ$RhD5%Piv;@H^fnSjQKs;eT1Lg}&M zkAtG3HaaC)6BDio5**SC@3jCxC!I6CUD-g)ALA&rnbA*hEF9Uq{^F$$7R z7{oC&yCN7PqC2K&(JfJ95M+^yU&)0gxbj%Y9J?QZB1^nd5LRiKMCz7b_NTdpp>Pa=4E-lcLS%qP}Y^vynIw3KQ1Y zs#Vbrs7{b#hbRzSe|Zy>DXC*ulIW0{E$N#KGUG_iP9$`bs}7)yk&Q{TksdD4d=ipw zI~rn1MsmzWBveX=M5ly`f_D?-_&|s@Fx^*mf*E=$$uxWw5F|7@Ni}CBZE+E*sB#E2f<>Fr09oBR4`Abm0eX`5QK&j ziWSqU8=56SBA5{MRtq7PH~o^UTuX%A#XZ`B$T<+F78;$R=AZt?mMkgZaU)2?w8@wg ztr3SOiWVLd(+dxrh%!X@p(?X9WZIC)L^33WbULsdtomDU( z#1KVbNK^V1!FaSc=t~G!F=A8VobY7JFR~0FK@c@_ zV{nXxbZph3X~Z%q0!lffLogvUNJ{m<=-7maLRU1LiCC9`yBp%x=+dMK2qarc2^4># z=#kNLPKb&~-?DzTD&Huqde6{~D3J`4WBTC)c^VQB=)+g6S7PzN=%}3&A`a+JNhV-p z=IX08D0CvLppcNCLRfCY(V0}TCjS6Itp++u<%#)hW=`^|)Ib}R5KS>RWxI}t`Q zkgSO#@r-5kwFwG&CncP<23+$ciS!w9g^PmNAk@oy6~Q1?0ej z1e}aIEJMl|_$oRv)d`bF;*5&T_(?ThidH-TpysQy#?uNoA&W>Q5wZrs%(;NSrCm{vqeNW)fMx`YQ*$Y z8bpy{v|2LXpuGe*xG@oyi!sXMh7i>kF^pUoRh0 zn^49va4c}4+d@h7R~0RaefDGa9Xm-YCV`!Qjl;8m#lgw85Z&-yc_WeyE{jP646w`y zOjM9an;N<{hGB6oMKL029cG8Xj>K82A`aPL(2$IG4bid$uSc72gQMpplg0#wy`+*& zBZQOe9bkegs|V2Ofx0g|HAlsK@R~MF=`?JfX~Fw7=p!MCsvtq3I!HH5qvBYhj8D>1 z+#}%!f^UN>FNTAK%!yPhOcD&CzoBO2^js4VK&}4((_vg=u+mXC>*Pa@2y_w~{{SIh z7!y+qL$)wsc8NAlhXd$fSZa~@EHRS=noymTj6xiX0#6b@vTbr@5;5|MM>Zxmv!1xG zLU|$w!f6NeG)EQad~j5Gqa76_k#KI3NhH!~z9gddi_u&Lgenk%!7;uERv|hV=%1jJ zyHXPH5F%j=GLVz8B2i^`c!C8$*`_p!$iy!qp|^8R{ExX8P8lMija5^5`z9FGo;1*( zg3p3siQbBdCc|-2F$BcX2u={HAHY|Yuc_4iWq9K4&xw>2S-I!LmgqUt}6H<9LR(k;wBij!oX#ju=4Vt zt~-soERn?)wUOzzSSKWoheYXOt}FT(J&h1Y1)~xU;^Seurbw8Wfxf6?qH{&TlSr(S z$x-m1T6sq&#SmhuvOY-JiYk9pWYJet*o4KAx;n=OKTT0mWOaeBYO48@Ff~<*bx4Y} zM?@+nHZhK=vJyNef#QW%;#ni#Ws zFOy=TwOQnv7-Qs_p$Vg+7bYS}9b}#guiD25s~-sEHGC$Eilp#dp9JXY$TdhKgb+aM z6;w!cbb*Gwq?70&gk+8h(TrmsqWGoi3G_nig-I035i?|olVOC$#eq;oH+LjbiH1m- zH99>B^F&Dghxr)BPo|iet_cc_)@q5X;)G4c$@eo?!BTlIK~Yk8&j_UQRCL&laD^g} zHRviXa6e{VilH&6$HCEzev9CoBP=vTEHarNIK|Gw+N6nyCM&2+kujPu83)!6E8KH8nud10T8?qz>Fn zev2O!Hl@3I6`QwU+Z8OFlITT&zG;b)CQT%gNwJkxP{mtQ@+(|XG&DzJLqtgg30$)p zqofeM$`Hp`_il@f!9JVhy%s7zYXlKQxJZP=>`z1GWA?78iH$~X!=og~{U$yvX+_<` zX0{}Bu|AR{l1U_+5;gcCi;cs%m09fBBXl%6&50)Cf+*j*RCQb@m&c&#^TI~Stcs7; zWL$_KibobYq1Dy!*9j+#`Y=8lp@ti(AGA*-cnwA+k)B36Y>L4H9T@o~X<{Q}%Jrw4 z;`lreOcqfwjf$HrHF7vHF+2YN0=dZ~`x)arC(%?$f#Qc*r16nDZ-cDTD#z;_WhiV!_{&Q!IwFb}|u=Sok(%raaK($CD1jc8w~W7AxCqI6PrODGt4yH`bG177Hr%Q<`@_; z&{+9B%kD9~nXU-$Y*F*RCMVGXm*Pzx=GHSOPq@;^kR$Y#rcO38tHo%0k3B?F4WviUMf7eNFMU4~hBrB}JZ(E(2UA@ovE z?~^o;$1e+9Z~3&dG1I`0i*IcBH<%5U^|Ad8I?N8fvLr7s1uN0}`$0q4uFmo8g6L<; zJ4srz$>i5*wNgam&`EkE)_#8{@mv8lLP&?`owvn74f1r9iXpENcwfP~1?Yb%y0>~! zl5fpasJ4!jl3dwQ9JaQ?G&2xwc260a`&Vdykwr5;HJz1tNWJ{@;Bsl!8+`{<4AM(& zZ?8<$SW)B<0VA9#!XcNZ!7&TkMWw@aPXSeO-0~bycWw90$NX1M4qC$loluk?b2kTw zy2INv-{>~wZU>@KWBi&JJG^w3NW$C^ayA>e?e>>s*PAFN6Gj@H-A<5Qz|ujK5J^yb zmsQzWgid%O0!=d>JE7HejIz&}aFG=9-7rB!`rpkBwO9)DeL}0|N&H_xLZI%GPIKUh z!OO9ivHD(pw6ZrW>W^L5oMF}%2}Bl3Yz`EvmSI+uO&3-nVF#JkRz*jXL8QoOa&&p_ z5)uz2&wc*@ll^(!B@Z)=DDXM5D_sHZQx1P~H|g?_w{Do9{o*$|JZ5EcJ0OAkMw2Fz z$Q=h2;ZxB;PUPX&OLdGwn#Mc;WO%iy7D6aN79eSeOD`DNMj z*mmf84YsHPw-3JXXBAy!eSnTi#$`YTS_rMm!9O3R*_RF;rIE;GMB6bH8bk4k zov+_PcS9$viYsOx6@hjX9~kB&DpPGlEIQ%>vI$hTO+{M>+>Dwtg}1id8j! z=rq>ium1oY2VQ$#yH)YWb;rV1-_)K=+_K*-+ z(ZMuS3m5mvP~@(ssF`hWXAzSUZR7?Ww$@PwUXcU^THpyJqK;#%H^sN`vX<@=2!Du2 z!Zk>w-MXk|awMW9lTHE}olYqSZfFJ1v`rLP!KL&aKtMy}6J6n2B~#W1G#!~Z1jMV> zVFgkJ+EEf18nguS^xApDCwbL2w2fg;H(B z(gE|O9Y7`i!J<>qo!~^l3@W93tc@=tC;&`=m8Tl~L+@4t=oR z1$^9G*T_*q+fawsAmo_(sTvjcR826-WJI1MvDs0@St}I~T<6a~Qi=wX)^QX@8$pRP zx&hzj*{*9QS3`04+V3gR{kilsPwyCpl38y_9BC4@l50~u<`G{MdwlVec|{mR7fJ+2 zo!+^gc_rIfG#yQF8eHHF81)J%gb)oD4hvRRmwcPH#us2PLkx0l zII#pI0tp584K$R&d6d?jF;ec!Xi0M7mil1Qi+cNuTSC1kinAP38QcAW{W}(|tF`DL@h^ zIi46*v2Gq4W7fxt$g=AAA0zLM@lJyuw0?u9!sZI=9+*0G_sG>*FByP~UasJrd&;EJ z!!(4;EHML3uTTgTa>CifJ+_qHLR(zd-&_NqNHmI7L)K^!9eKe%Y(gM>@sEMz}D#UC6I z6$JkP^l=hA&s^@(&C@8xqrd{p1fT~{x12rT-e)7mXS_R{tF?a7l!M5l`K;&Jsh$m6bvJcbXK z3B^aAJ1re@+*soXa>yz{J?}_`#I8Hqk>5@REFol8KX0e>_Hf$(8O)$;>Xn=>0G+z$ zd^BK0ly$-$2=^-c7~ecF8W5*dQ3Sp7p4Oq2eg6Qk(K~7E z4EHPoyqkw$(+Yz=FX;u$m zR?tyMW2)23RmOr+@(>4}aadow2ARCZHZMu$SRWYk2)&Z*dhH|_8nvP)TF~giQ+qt$ ze&QXJ1B$DBKo%ftL*rL`o=c&tczU?<9$gng5GP1|7kz{w#56eSQ@bRRGu~rZELZ1@ zZySSof2W?PruPJNwe-8^vCF9)mPUJQc~mE7B3E`N-Z>+H)1*};0l|%a0>Hb_ITA#D zw%y~OtI93q34joB0tZBJ_WJ%!QRavqFv2^t?+Hw-9C9N@JzO!H zflP-5G;y+ChOq}6Q#DpmBwZ&)_QbUA`%6z}_M*El--m$0)MW?UK98LaJhI7AmsGIO zKpfgkN<7Z%X&kf8Uu)^knC9~x%>ortO*9w#k2W*_v6^tt zYN@@tPiV&|I3wb~Vnu%p@q?5SHTzXmG~0Pa33=-{^DAckB$EtYJwG{K-5P?07MmPM zu~Xhkd6Ytcp7tZJmFOel1k%FF-T-r^&x5U+n}DnuWJ^lIjha+Kj z1D|NX5pL@jp7-?)P}t*xbykqGS#!;}4EgBk&!Ug6F2e*rv2bmR=|sIgb9x@@G_fK< zwC$}Psw^;bX+Q8oq^SA0Gg-X2NYpks?;}XtxF_!6j7Uc@^{?g?Q?Ww(Af~{;Dbda< zIfX!UntHy(_`iQfA%Y$rzl^At?6jq0fHO}emh5v@jvBN`T4So8%mEL0*?X2r{{Xn) z-FH6E&Zg1k2Xqc+z;{r`$p~P>8%&{!tI%Bx_&66YJ*Q9V9gaUJoNmJH>xcvdnamf1=IK;< zVILb=^nL|T$sob%Bj>{O9Lxj-;4jZeYX|&VN;JhF1&<%EtbYA*-FO@vv!naYXw%r9 ziXG(w zDFIkuz~Cr+PbV7@C0#3YRj+|^Pa@+Ef*{a!(RH2UG=||P$s#o2D?K!iPW zXV&H-9>dd9&!g*RW`{4-aF~g~7Na(%g#BGyh-FpSNg#k(E2r=&2IR!T?&R^?L+hP&M(g|irDoU@u0)ci6|D@#GZOJF^s?8weCy~O=9zU zrsjnvwy$h^t}F!pECVA@)58tJ7d_u5B=@32GvXLXYa4!uLi3Sjwo$iBrszMOqhOjs zs32sPT=p9C2573R3dakDB-*Gb;GQH>T|s6}7Dw6o8#ImR#G0=sJ_j|fuRU3acJGEI z6JncLJzPMt61g6fS|VtpvYAqBYIXZyrJS58?m(~on}*XU2EK4C@PfAJPrD2+GD+;j z5U+<0@XGlIIIs#TX2gz5S38;)&Jb-(?#ML)w^pqg5H%ZD9*Uw|-NKnUD%%yS2(a#> ztu>aw%%Sd~Ol-5>#BwxV%sm2<0OV}3Sn5O%^Hck~B5bqoI{WMJN>qA2fR`3V(!pxA zbVCAUp0YrE&P(b8n3`Vz-E7HB^2KDRJSVZrTIVotlXj~B4?&*nq=@Wl;61``EADVX zm#z8K`d%Y!4*QekD!IEIXbK-Vx21RF{jNW;7=aF#Wkq)e2obCY$u7jnXH%lT%u(qrH!(;6alJS z&lWu(g;|ACzH6yH84OP^4|D5nD9p;>B)BA5Kho}TSZT(W)^don_^?MoJ(KNF@JuJK_%)M{lmyu}ne`a%|0)#Qy1c+weB zw>+ay#%g+6-$X1f_w%M>W7n^wax}@kT#(z}t}Xp6sDdn^H)nwoJp$!MO~87lf|n(} zc`~^GvoGBX&{*HU)`FQENY1QYDlN?*c&A+*}_XpB*0Yfg(?3C=49lt;7 zekp!R3w=;{vfomhOx+L74=j^O{{RSwNs0~~e{|ghM>2=jMnF_Af`m6elgRMKzE>-PzBAJHd+5lF%eh-(@n$(HCi@f_La>=7aRp;u)g+BTnk3*HbYh>ym+FZPw!a@J_(8qVx0 zmQYnPuE-r}v}e{6b=IBZ!WqyRE$LbL^T%Do#VQJ_6tl3bouk7HeI+4p|r;JX*4Q;5xS>POu0pw6np#VKKt z%L^|a23!Oa8if|;IptC{CS?L$Jo{VG{(=KwagVSp%l`l*?-h=%_wa=%8QeA6G*{QI zhBKR72uNrSpAjNOYC5uebsqUyji;s{NA-#m54+=wWh{{YZ@ao9co z!~iN000RI50s;a71Oov90RaF2009vYAs{g@K~Z6GK!LHrk)iP6(eY6K+5iXv0|5a) z5c1M^<`G5oG@iw1?yu)PlOK`lUrcZl+`Q5h(P)C(LfSGdHa_~Ov?4Y$KBNBt(tpS& z=xXU-@qSS7jcNY?U*t+X*tKrDV!rqGYPIhJdMYHAm9yYE5;N@@oel@J1elzc$|GW4 zMt%p$ar+T4#B{oRl07~X!LAw?ja1M|TTKsFq>pzkh=X=)_7;o8f<&;elp35DUB>gUJwwTSkN2jtAq5l9uI(3VB*T7^s%UW1B0;Or z)&`OjM`weY`Y5I+t`9@EM1px-Tpyl2A7#(J7lh#4A7~(*$n+m2;$BuwXnPUp-KXag zjNZKoS!xq<rPUrX0bw&M&;%)x`lRywe zp%d)bYHYTsS?KpaZ=&xBVd+s@Sh#6Be2eBODkoizA#mAY z(5lflvqJGMJK^`iTGMQ5YZ0$U>sZka_k{3_8wQsUYi)P))BfGZ3sY9XubrQ zpxRTfpR%g&{T}OY^-FToMXL|<=uNE!Xx*VHO;!91eqqWbM@Fe_v9dTP4K-p9;8P65 zgF9kH2c{*2pqFBFDZPp8G$P?MXob*>_Az!$K|PF^>%y?Go35_!;BQ43+KUmrb6H=c z?-2XPp)p~x9bs>av@|Ff=^;^>4BCO^-I7(IIccv;`(~-OP;dAB4^GAL`1V7+dKd{{VDVqu+kbP}T@pbtnl1qv&#R8w*Tfm?S^3bp;Hkwj}kH+1b#ujhEwR zOR-cJ$ZH3MQ15r5AcW%*d2C;Tf6$@dz^GyhZ_?|XIyyfm*#2<^&3F+b{F3~PlSwxI z{{ZgBS6EILMj@ku(MPwVRk6wiV+N;2Xh}xHVLLukR4%B?eGj2+rqG!*(-+_A-f#N?U5n&PS}dXu_$U5x+}iMiguj+`x&D&*pA%^9wNeooS?he ze#iBhjZqWBgT7dM|mQU^$edm^DYzY66s zIjkY$?1JImD}9r|u*4-T2uoOa?la^{;vatBAG{hM*`glM!aEA7R=QZ3a3Vdldcq&g zmNiyy=PYmZi^RsSfNi*>wj`$ZCy(D1g~D){xa&mEd~XZjx$M|3goTJaLyhcg($~}Z zGzz2Gv*0!KQfOVlW`vnRpZ5Mli(+DSdWN(n^QT>iN~B5Gnd9$*-;$k^40fEwG#m8B z%|<_u>3i@zwta}A7IlT z-~RwVVT_vk`W}&zK{P&74Ez<&`CGi#U#6Zb3R7rB=AVJPK8ds;>W%MPLs(U&I2N!siA5TxlX3{^@i*o}qJ{{WF#~QRp$3 z+!Az63e%4WVGy*tANU!x*)iMXdrg#j9Wi*BWaDtK^09KbFN{hhHb2#S@j-B2R#m1} z#Z^VwG)36Pg&x=b33|OB_4pO#t@ZcthdLINX|W9qdmjO`l^aAiP}y`kiaa9uI^>}X zi!m)C*L=jrh*QPSN9`IHjmJydBqZ={71vD%}4+h2%x&!iW-U$iN`61aK zMY!X?ktva-*WglhKiMR6c-6Ys@X2V$+=)tyqY~a)seYW8r<_GUCX_p)rW9h;g>)m0|?3Ay2WU_~g?D?g>Fk@3ba98>_qT@FR6L zzMz#A64L(v0NCPTlww-l>;Cv4eh=H^TfMhsRhoW|}j1ZOW<~twAB9qD57q(tLs(`y*7=Bx*I8 zI4n`O2-~A`V>i*-4!UN8KA4{aaY3nv=D4Eq&lU5c@K||xc${u0mTd`*VD*M+#x^H5 zH%9V=q74XH5ZH)Fr}Ki2Zi8eCLkv6hh=jB(W`nWWbqFD9t3PG%EMEiWu{bVN-zF?v zr;EX8xTV8+=x;UVlgUa%L10mB9d<)Qd{iLN)MD!3XhTR(XQbI5M`F;eGwF0}CO(d_ zI#Kp6#_HKevZjQbi0S2Lysi_+e0R#cQ!mD_t`?mkhxj1Pf}yrLg3uV-=zJ2u@fcbx ziZ@1WruE`Tgz&YQiN<+Wb;4((uMH=`)-GvBjhq^^ zY=6*ia6}FQu@Pt&i{4r{GQXWUu}BgYGql zt`W0z7)kM7hJ~Tj==LJi*tSS@?0Op;qk0;q2q9=Z9@KrEhE%vhV(UW1CT>3&WiKjT z7oU6>vokT?CN3^$nja2^E%q)DnV68-(9-tyQtD(6xeW~1lbZ@|`VZ9TV+B@S;dCH} z79fIDJu#xj$6{#;^g?H2RqR8v(h2A_;}D?qhOM!y8=5Z$hqa%fJkAK1S-4rHFM|1g zvhlGpmSKID4T!kw7s$IDFqqdbvNAC+imYsVJCtc*2*@%lLq#c}J&kN{LsNa>QYH3S z*xMG&LXPZ1(u)p#Ep>g|o5(YPds1aM)Q0A)&a&t}Bhn2Ne#mPozJgBbtb8_-&%_L&D?hE0xXgt`J{%L&D=3))=tJP6-g`-=P|@nwtr|n{01pEDt{LvZ@Ge zVF{1yDU>In+R`?7+w?4mVJY;8Kfh#1bqboIs5p~LqT^2S2tf^tc8;+zv8Br1$|fbk z&PYO8gD)q-i5HKoD@mQ=aK8iDDKL=MUM@A*+dYh3j95ra)I+K7f>uVsy_X4=qtYxU zjgXC$&BP?@Vg$MprP1z$=oq^mz}p5eMuDj2edUf!tjsbU<_m-JULO1n;v3II65xhT z6A2T8#3|AE5j{SKx9G8XLqse`6h@$VlR~IaXd6Zem$8H(g<$~HpLiY#^&1WAO1n-gf* zD4AV`JHukluc3@>?9xLj3qfKv;B-9{+9t?s>mB$mDQ<4?rTsGE`LkL3%HJmN$TL}8 z;h>^Bk1GU>h4+@(yF!Pf?+i%xX|y%Nw&`BP(WzS=wTMv$qt?X|j%wqv;vMuqlI7vN zEZi(Xb%(FeUT9fE;V`&#HI9zNK^HfdV@I-Nv^Ow$SiP<$Hf1|yC4#VB6_jP+i+HA{ zr8*lr6CPS(_c>lIiR+3MVLS*Twwm-N{ZzxiZ zAw0Zv+e7XNiL53i5*7A#(3(SaXi)A62~VMg(7!{*(3qjPJviKVnTf&)LSbU!VRU*K z1mR1<`2F#id=omt!zpsHL|pcEGi+H}79V3`ew_-N8X$+D`{U~o7YLIHBwK9Pv6DiG z(2lk>V}U^>NeEAp1u^(eOqw4;7GVj6ife*!ZI?63{MsRLGKq*n9Su@4W?^d`EG31Z zF~h8(kB@UmHG(bg2;Rh{5cZ(lEFeraU`>deBe1~GQES04*{&B1Ok7@yAzby!_%0_J zJ~QB1TM)=hHI~atY*~9D2tgqm!yS(_Y<#wC)eDsk%jl)HEdi?PvNV(V;C}1fvAS>=+UD>8pSjzelZc-62!uD4N^8v3owGq zL>C2{nVMIXnS{s2l8+Y&5)FJ1_EBT(uNU-4`#KR2v3L`Kv`o>tu_~iWJbh<4TwmO+ z-plBnAWHNhdheq5UPqK5x*(ziVRR{a9irDE(Ys-S(W1*}BZiP*B6|7XdEa}V`}KS| z&pFRId+)V=s~BNtzb#t_&)@x~y_F-g@~MWD$L zRC_gBGYkrp<5vr-U~}?XU1H5*B+Z3zd#cxs1AZIO#jmjPhi7(+G?P?vv1JWERT5F+ z$tn>nE2a0V2pk|27}R1SPnpYc|@D7 z8{vT9=f;K`?}6s~L`;a_o3AH9pjbk{i5^y{xW#Ug0RM!l{^zGAOVT)jJ7q7Kuo-dt<|w3v@e=;La%N zo8U}5|I{{?8_Fp2*qK@b1^Xw~)|VE4l=nZKhyS07!zaY~zomz`|Bs4OGjlTyf?`__ z=TBXSF+2au#o_%A7k91FdZQNxY_KWmNm;1W9^Xs%8>=?x)T+|9Fwo$T%=~qCgG~Xs z#^(3JURwNh0hKVuM*bTQm;L%M7@sxgmlVD=*R=4EbO@rkWY$@jD^x#aWg>X2r@R+~ zKf*K=ts z%iI&RtlxVXf@ZZ}H`+7HX^rQyzc)acEwvkexm8UDb%|Wb1@XK<3D1=EQ-4 ziSJFOQJpy48!7%DPSU~mhw**4e&$+FSg>=V8Ne#Vl85oNg0;|>uYk?XL?#A`=yZqN zx2>M0hT2n1Dy>ih?EAF$GDd$OdBJD{FDV^>J_hN{rA#S;=1s_;M+uRrRFVrTuV|iNI9#o0uYHk^f z21$(4g17Fe)<>3wdfee4?G_CtjVZhO^~%S!hNP<(kIIv%A(zSLMW%*Hh*|-H1vV%8 zpdB&FgO}A3eZQMweAlz11bxbh++ZF4^XM3^ulI^N6R(huv-_>F`1-&=2bLG`@Q=4b znCay5!EByEV^|2_9B=EUn>=r;z$Vc|3dkZ>U;^E634T-nxQagN;{QWAket5ew!=BT zilKb70c=H;v=lz@Oj&RJyiRsK;9TGLa)5_ z-o$S{!!)~8jDM3*$53JfuJM_hJ5Vn@P&tS0ANPrf>6iHc_vkAdf;!6AtlX(yg>S5O z1_&0@2Dih_dOk2*oaU(4pHu5Xvw!(j{}by@7vq2&k~|Y;qwG@1j?O$cU22}=n2iRRSYp#WO-p6CZccG1iz z&FBB&{E6L6@-}>GsVGy}skIgEz5rG)X^GW|Tg1vs{e4AGi*1H9xZG(U^QnXnaGYKK z^cRBLwef0FD$f@#+rMk{?Og3)il8U0)|vA^`+DJ%+yVIc@3q0!$!nR9e(I6fFJh(Y zA@(gwuq%~mL(5w6*T&tk={K34qh z7=8I#QIsT<$18{p7s35X&55*f;H9`h*T1P3a|4u@RhhXgMpX&obAX8p&H5KB^Mjpt z*mXn4K+ijId@BXGazvfVRN5M_>ZTc}2e0^s5kTpD5z0u@ux(CUO=MrpApgyz{z{~@ z1w!r}GfigieUR;oXsoLERP-NCEYFF~KW@cPiL9#g->;A}4+bOmVZn}KPmt{w!xIM- z#_xsvWs&(8Qe8zOV1Ae+$ru~RW!pr9O`_RNvQk5x-9{th`Z4%PN$O%e2kQ+j50m== zmW~7TIo0~T7|0xjDt?hsT>$(l3KFF@CM#ki1@(+kbL5TK{$V_)6xUJkY5d&4{KZo9 zNWtyu5i|4$!|1%K-5>|M5serea+IP;^e`?C2_t*H8oXX9Nej?)H*@qW$#LnS{ne=o zX)OBAX@9G{#`~St=C@8_+6_Q^!;Wzzv1@{QXwa;T_SCyqfio$qgWCu6gX{&b>xylL zrn26NN&Gv~Gz3j($err9;kKADqXW=q_t-K`)^sQOg_P(V0gWbwFVeo)l_!WS+6Dg8 z%`fDH znH82o^|+!*loH{m>1dXX6vO)E#^rYxw(f5;$Q~e0p{f=C* z9DHG#L9eB^l8qT{yxlgR;*zk{jsP)Gs3eU8pO6k@>bm-wi6 z(gVf$PPV0G@VDVp^;RAa?C9g?k68EW6Nd*xK(Hv+Ed%L`G-yvX`7csZmBjgbht z?pk2mBkZsX~hdLH?Rd{q4^fuFQNUFz_CLv6@rB|s?`c|{H8fN>1!k=nse4A+QVsn zP}i)~2yybFU1#4^$Jy*wcpG8p?@+3hYC#KHQ|LhEU)E-79$=t95saPcT@-C~VoBzy zCZv(}eDBS#H?vZ7@216`XzvtziGH0m zT%?JP&Io>S1NdM7VVuv@>m`xlt*aD)ra*S2+ztQCL5QyyJM@o;*0gG%5TA;*gLj|# zgtSLAISWGc&4Rl7Y*@|j^j%VdBKklYYm#61Ej0vDfXw*my^ppehFPEkJ-ucYKMR0J z6iKgdWjQ3BacvDW;z;l4-PM+tGje4)@Z2Pwr!}KZ_k#H~jd2?-6Kxx*<>O!F=kcqF zm5(Mn_~jIL;vFr2TPHw|*sQ=J<^VIf#ulDkxh-YHUlWx%ZEJaR4K;oB^DI~Iq%}Ze zX+{Z51W2#IHFs2je=Dj5Y|Rd$UVZX;HsYKt!RVX(MR+1#p{(>1eKRzsG;%!RIBYy3 zPxg=-nuG!NgSnr~!PLjnM9BcGkXOo4Pwl0N{L7cDAN!~v3fuB4c|K<0O;nH3vsGwx ztu6?>2db*u1*Bp$Kp`Nj=T~fx#w$2Ela5w66H`LX6*GC7G-jdal%)lS_U?p`GCxT| zZw-z9q$$UVphRvdc^CSTT_x~8RS^NjoTSAuIp(h!4sL_?wCiN}LaUWh|Okf`W+&K_G;A2?w@a|9-9( zf>?3+h@cJgx*C=r>4?3SWt_6h-zazUGv8$=asvYgHM~p7cQjae9GPerL^O3`Mg^fy z^?W#5qms0KN7?2I5Vh(je=D_nBSkl~DqbQ#NI0?$ox9J-ets467%-M%T>9#pp_HZa zfpP<9YeiXG;ctW0MZm>VZ7s4ub#D5Khym%H@=pqMSLB?1XNmjr+@z-O#l7YP3ZS8? zI9&;x+=ABQ`3oGh{iNR}eW;q@0u|%j$`aYFw}|bueB-BsL?HwE=HQ6LNAKlF=u$^D zHPB<5&hvAfeTM2V+xZmQZEwBox7AWsza8vZ$uv4v`$*mL(!_~cyXNn7C;!?y{T(13 zc9YBqN*sOkH)+J2EDL710XkUqel?zQV9a_$cPq%9?gl0`q1-oluKb3~g@WJVuSnwn zIei7_jRhrT?nkM-0ZQ&lu0@FOr_W;-!_R2m%6Y4mu*x3+5>cC+*pl+^r(O9Kv}eeu zEBXN<7z|?on;YW4#LdqS?$;4#-Erd+P?+|SDG@|~MVh3UpkthLi(g|+TVIjYmnZ!H+ z)L{H?eqU{$MLZL;I!~bS)fU6VM-oF;7=lGK!$!-Pb?$?n_YJ}NlbTe18Q}>^G%1P1 zA{(8Ik|EEhJ{qNPQu1_0FP4$ODnKqb=`iW_3cnb62I8rtHc?X2V=uD|a!RvDooQOF z>h91+K>n4Xx*&I&MDZ~vBUfsKrx=aCGc}fVsL3Tyu#7cHm?zPobZd3cVgw{;I5zX! zzLz4*eI*taSW5JOcPe81)Np`hr#OJ|5Io4_~#*2g4yN1u`c zR;TYu&;(?ro!Y#s7gx7q&c4zB7>l-j02`(Jb$&Ji@{HhCdVD6&6O`{uo;c$6=GjD1 z1iuXfgw2hhOCu&79)D#B8rdGOscd20J$Y<`ciOCqg{*=AtRd`wv?F-`Up#_C!wtkr zM*u-sv9rmbpl@ANlO({eZgPF)m?h&PjREJQpe$+^3VC=QJ zn1L4j0S3fRI8@GWcT;@ek;pt>iM4oYEd>s)%k0jHpPH5YE6lFW#CC-6`74YNHWD4f znyY<99j%soz)N-#I@vHyV`8SrHiGVT=io3rtLop0=AXiGKvrS(xrr*rJb#}`4?ke2 z=v-1lU7m}z#_(9j@ccb|+O(Gjuli_aBUhIWvUc5JZLVf=)ZomV1v?eg$`h`jBzL50 zAr)(L_Mp7;{N)jfy+bok18+icI9fp5bXww)i(!%ePo;W2>iz=`@z6*3nM>c$E+OIH zB&L~Na&Yr=#U?AwS4F;Jvo(ldDO6G1_aCKYJ`H?L?-=?C*I%e?%P>eW_?L-A@7gis zZxPGtF4|Msv;36qdXf9Y$#pbcZIuf(?643Ssg4>Hrd2QF&IT z@;6&^-6=dU&+bez5I|9nMuFlX#?cK}Ck^6MXQ>4Uuc0%Q%I_*d zHm*Fz*eC(I8UjP;LnJn4c(F!Y$6ge_7j30#aI>IHpT3LOU_x!;M9Ms!LcZSAF$nUb z1sH-q3%MjaGIeWMj5-D)y`-R2g{55iozKF=Dl47_E&!oH%rGRg+lPg&BH>S#O(lz+ zkRHCgMvtBK$hNc%yv-~V_ zwvyhhyGavm9U@=W<-b#V)fQ9>pEMXpix))xvqQUdesMVV7C$Dmg(N$>z_f+M_O#!~ zQa7UE;OLMNr%QT3{m&v2D|Oucb?*oTaQg}Xesio;sx&-mWcaq_RyKQlw>(IMo}ym( zGevD*NMK-^X|QI+py-e}HIN5+<%5=C4w;myBP0x95^PRHh_$-_ZP8h*T~OXv$onDO zaCukU_$WiK$I&{j<3e7)6VFx(+!pb3LRqfj$D@Wa^4FzJiLcZu5A?6nI0;Qy(yWN= zBf=Sc$oJy$oH9_BHvGCDA4V4_7wdQILuyb2*|=eTpdPvFOk2A04X^DOAId-KKI3T@ zQ^4%broM!&l!VVybG*C9{>&OBlV`;mWJ^?|9|vZmM+Ec_lAam05162pU+H(SVMBex z#SV%T8{wHV>+w~nDHwv50ff2AfpX{I<0tfUh@gtzg>)tp!}Rd-W_RyVlH}IV&HI#u7L>G;nUW%gL9F#mXxc)@ zquH1#s8BLz15qV*7jSRtwATsy#z=T%Dp}4HstT?=i5e`3Vw3xnB(Cci1Bv3+6#zhA zrX_)S4NvdKCvKbFoGq2Z$dx@WyT}=Ax`UgNOYRJrQa%*GsP$*f_eJ)#`gSF(d|bT( zJs6Vg9Jq^yVSyKj16P*}W8PnV1}iFgqfhKJxo68XTfj=~n;{(jenP@Y4=DDuW}do1 z#9aFsT8cB>bsBWIm%5PO;VBP|&({fJ_Hm{*!bn9V=bL!SM}b0U72yyH=VnS@jHn4( zNoi^rp8tcWCo`OF%n0*DdB^e4*}sCxOj7E_`dhFxA=4RY-6(GHn~`$symXr^V-FMN z^Rt83K}U#M6j#Aw(~JOYm$`I}_dwSxqzo`%*IZ9%xxt0FGu-SdHg2!gnBn*LkMj4^ zIf=|<9w_LVmb=q;5B?*@(9APdhOn}CS~7lSNh{|O{unKm6JC;C&?w(04*tD%NVqzG zW-4|CG(QkJvGs_{T?vUAi!2)Q+T_U>*+R?eZBG^SIPxj)ffXQ4CrGquqUx_FDRQq* z+s+Eo<#Hw88+(sSTh&FbH+1_(lJ@#n_8kD3lon&$ug)m@p{!k3`LC?l3dygf33>CY z_VOK26hJQtiGxC6SIn~-MB|)l@RGx+hF_&wiel|9I%CXPC(i9Hj(JzUTSlu&`FV6a z5q;B1rpM$->>F9rV+ zJ#r|G_v~RP%%Znw<7QY7g_c;sCr0~$V)W{41n#f~SRIA{4Un14#L!kw2z7RUxXE-m z^f7uhDSGT6^YfTF>`cMmDzZ2WrLgFLR*}XvK)3`qPMNpo?nR{c-#CWd>u$Of>*x5j zI7xM{$NpwYkn-mx{Y=etAdETVMJ#2*VED!^b7#}s`*KtII&tkPJ5^M-zuIux8$;<}{yF?5m8 zhh>{r&EOhET2aN;qDni~ch!^gV#ck7NjQEW@@;s@DDzkZc%3&|Y}df5AIWwZLOUbe zJqC|0){!~EtLh-b7*4*GPP4yumEO3+HUQvzgcgb;Cva5; zT5;Z3?$ur;P}S9sL~voIB#fXWhozNs#Ol%b>%I6dZwUa*@;M?0?7+J+WOEhS4MwQk zd?oq$#L6S#GTLEJ3gt&X2fjIwvrrdD9zwWjnf1@a9**%ezLN%3lM{Y>brUa2MX-xc zcGtWw^+db5JnZ*TT(W&6TAAl}=ljLb;#So`Z$MJhgyXGlLQaP*KLlrC<3AjlIDY*6 z1FPcYap{*c%&kRnA(ld6{>qj7`hypI5O*EZxa3m*?WL9PxZkL)vMwGaGa-EqR#3d* zMIElDODJx}lbO9b_uQ0E{4zfbby=lM7hcb7BcF4{TSa7S0Nj1h6K>yXSDcDF38Vs+z9!?Z2-+=mVE5sG<}`a4h*icxYxij6;jd_<1Q2> z|AO;bu|hg8U~II5|H&xcIbo+MKEn5pT)L&whl&CW!`dHu+pOnQNjnXT60alcoCO#Z z-t|q3cmENt@Zk(cge}_E6={Zu=rjj_$#>DxsEUwtQI1;^Dv(V~S5IM}%&AeflMiby zzFNG4r*QHp4vumoEH2X!h2;!`+lr}(AK`Vi$CN zFg+tcr;^ZU0@fFEu4JOC^=B@g4Sw~p;hl?UYZ(zke0K{V}7?(X?`Wwe17PTx1hmhZweOlf0pM$P)6eqi9K(_=k3}OV2m`Mo&1ft@IDsVrW3|_1< zPCMnEnK`!YbQi{r$bka+zAXD?gr*M5|9}IE{WhfUf%a`Vp|P~Ta--5O_t{5Uhcfs4 z;{2_`_8uP15jrpje1x?E{`k<=J5sh~f5hgC(+?+`;o(U;Cgkgo?$_1(gf7rKd8b*= zCtMd-{u(J2Kcc~mq+giT@?$2pEx&Nh(%2Ep`=lO{jR5VLa=T-LFz@l+yK@HLLaBVJ z!XjpofEt0tO6p8^ikx;S!{=x0GHZny*6SIL$I{4(_O8^1=61^dtuK?}#fLU!eo$OX z*H8^!J7JrG8GB4Yk;O+N=;8qd4dJOsA$-m4N45!|ANOir4xa>Ei`8s!S9K4TDt&uV1U2eWfJZNQm)f{ zsH4*z{lr)p(N;+J!$RQcVSlAzvp{m+F(LSbi$+om<<+&OSj-AD=4fJ*CXBfw`s0l!Fal9u;U_3d3z;+WefF`q1%`b4dwqg$SrYn9zTo4R8koin z0|rfEanyrrjr71|Y@G%~XfRiWw{g-PQQeh)yz`@9LrNebuWCQ*qJraY$}wmSVQuEj zbLcoIfe5-Lm5SyguL&hkBI~ZW*F98CmL_nI5GeR^ExUd9b?dF1W4YOwqI$<@&v5&1>Nb){g^~KnV9zd z%S`15-g4W9?Li4owg8_0aK4g2!>AmQ)`C@OS5#G-{MR}4=@ck5d3XAJK2z7%K{M7& zFUevQ8G{G#r{ev1t5XgbG9gLbO&52i^S5az>4=HaqH!@6c$+j4St=j_@2tj`Dx=$7 zMD#Ye57J>M+dX~C!-2&#-eW6DFy6-jP+eIOTG}z7Zo!PtY8k_jYD2>U zeKNpWDDlpQ`2qFr6I&nW)}NsQqj~%g&@x0oWaOgTy=5D%CMuj~EvQ%xdX{3R2@{`1;;?B=8Kk)3uty@e-SHnAvEJ-3G7t;lrqKFVk8 z$n1$_`}9Q9kw$0D$L@R9Tw1XUlXzwVTXb9hQ+pjQ4%pDu`&=SSOdA?bTF6$T`G=%~ z!nIMqcA9g|W<5BCcI9@Rg4Dz3#ID=ysf%W<#u&NAa8>wZ%Y^_@nnR z(*kXk#sUlkXOA7Iwn~qhq$#pj-9S8ENJ?9j#kI=xRxcfHe)FNuQuOm|UW#!-aPh`f zpYi8SRiN}#tmKwzkjs~;Sf{D_-2Q@A~;?wj7AYUotok@}tl9e=??B5V6 z#y5C|^6C1!#(8?toIJL%UWPKcIv^;$@+`8BRo;rCqHeX%ne{yR2?BO$WU4Hi^*`D6 z86;z19E3;RabZr{@=AqWC)6sk(V9s-HXmZXcm2Ca9DD)mUNJ>_zzgb=nG@nI$&+Ez zi<66oD#@lXJ2wfk7WiyUYM!T)36<*#h)BeD#k5~WKJ*A7RO7t&*$uyAAN`CT&Sb*s ztwy?2fhOIEJ{+mM37Wh>{?|)%^q~-**oTPV%4UB4yE_J0jnSA; zpnDe&Z0@YCpK&A%?YE%Zwwu!71Y#@5NfP{SivQ$9(*Lb=%j;t^_WjBN$9tKdVPtQg z!EaMye8MRwt15}_5&dc&3ujM=#pL=h_+lJ$F^*ba`NOW@`zZMjRi^c5nLfF64Po2| zgMuRM#hKG#@*fh;sD1;+9MdOu&EX_v4Ci?zP(6zryMeD{VlQoVa`(1+1#O$B=%>H$ z>Qyy1D~%G~#6ceNfnqowr{h1DI!NJP-NlhUOXjMJR^_hSbwC5MtFX}e+beh%k?oCa5%DbC~p=w$Qx zZqxV=lLxi#MmYabo1FMEsA1MVulahhl2GmR&TC!Coy(LmZJuM_E=$F?tLo0U?lnbC zzN!83+lMov8(Kt9-+wp*ITQs?d)IVBw?`g;o+AWlkv3~ezPkwkg4?^NO?bqD zTBD*e0OHJS1Yn2j1KFxIP+E%u3bRc<X9b$aquwGZJ1c{W_71 z^S6QdFclMRh5}RZp@a=pd3EiN^e_p)Wm#Pd5cg$MwL2hw?36{`G@EG$_S{nNeUoDRvhq@Vgn0}kEQ+(C7R2)@2J|d! z%C0-iBIl5-eySj4bf9t?!yd#$drr*yk6zKki}pM+-}}_ZdN-A4$$$6fSFRH7 zD&=7O;&X|-UYXTORlKt3XfF|vtCq8>85KwZD-wz9vg*om)D8Y(nSY5Pc+Pmx*4O%T zIjvg8Kue9GScGE{<8z(BTBIvn_A}MNJT8dc-4i>3p^4!emBLtbJKX@W@)*o`v=X)= z-Gp8Jsx0N4?CrSQRnmP8mMokqXh;K}nGI^30NzD?Y=BpXlfDZ1WtNBzQNGtZW}uvO zym;>>Ep#$aZWC+1jEOl_>j<2u@Y2Nd`Xk!3>oi zj;Oa6c6hYN>603;9UE&J6by4{52yf#O0?z0bujV3fd+K4xB_`2zdGt{eDUx4567`z z%B4W#tahbg>kITe zb_b?i!sJ00qvF*NgO%G$aktj$!hFW;>R-EP;oA7gnZb)k6EhP@Wng>dAR2_vhOupv zAlmYg5U=`5zM8SHoo{~5OV6V-9BtklO5(3Mg`!^u#ZjJw?sYmlRE|HUb*0Vgx~}SG z0ZF%s1<%rbUH~0MvG;yt1blhO_@!nGb1t<&ZT!f&Ormnkle~NvQM>l~P_$^#sxoM% zL5i5lt&MX-!9rupdPVvR>DQ(W6rM>F{|CTU@RXDG75L&7Lq02EQ6LyQQ;>k&jm;CWh;xobN zjGH$VHjE>5xMZJmt;ue&6Uad);F-MA4NJ*Z%~oZXaby{qX;Ama3OH&CvAYZ{Gv-bC zBbUVelx|c$q3ngb*tg@Tn;@oc*o6QL*{^Ar6fR0+=*f6SDciiSK1FnqTqf}yU1=53 zRZuhTF}D_rAO|`l3@oxJtG^2pTgD?vusLJz;M0C-8&)B1 zUs!=opTtVYmDOx1VrfrcUHd8vJJPc7@^CpEk0>5IcCsAHy*vZyj6(pnM-fUBkvv!> z`6npfk?l`J7mb0d4&9~(9i-82cqkVg?zFGJOwfncdJzLDmskgpLR9RAGz|L>v7LglVSb5o`HiZk zC%Yd8C06m8O*;-9iwx^e@;^ls>l2-*);ik1b5C|z^crcvU>0YRFg@|bh`dXgT_xS{ z1Ejf%>rY&JbUX%4;zVuM+lE!+y*D<_NzL_tJM(MPy*r2gM8aY0PV?KyFa3DlJHx+l zhkxI>Vrh)@+YZ5G`*83!BRXRcz>k~8ajTB2_o^%_g1Qr@sLj$>UZ2nW$FZA7AuEQc z=Fo3FK;RN!pa=^G;9TZ@QRL+PJyZ?JAn7esTMyQDuIriM6LaUv?>@uD68EkcF|_TX zVzG~lujj>cY9|iYeF~I-h!MeRU~dL>5S*A zT&Mms;v-mqC(lec{nD(bRXf3>oEl7_Z+?4zfM5K|+2$b}jI}R+{bks4iU?$w zBU!azVsh}6riuP$#u756y^MCZV)Se3Ap8nxQoqZ5DZSJbHF=XKv=smroq4e${M!p9 zHX+y)nReUMOCPpXVCav#z;%wKS;v1sJ!dD}eS1bvFpDpTVQs8QVSb>9=V7w=#lvi1n zJL$fg+^rFnXhQEleeY%Vse_Ta-}}(sjdZ?wXSlezzZ^6Xor|f?&NC?~MBb)f&$s}@ zK2agqlo{XGxomJ0r2?{#i7lhDBuiqUq+iKsQ(Ko!#ofOvOPZlGPSnGGCe7h0Z*2US z)S;(d2J2A$(^N{5h;+;?>{OY)u6XQ3dsNns%e~L-m#nVeZ!T#*uJ+NzgRjqeC9B8WWZK%gRyKrUsE(BZWMKu0DhNf*-z`Cf6EZe?m#4$re`u$bPYZTGsV7GoPb-AObXrs!+Yd`8l z1RqO!>cza zc}wjLiwBH!CX0#GG-R#& zs$l8t+&z~}kojsX6TAO-`|C`J^vnCHBu{xz`3&gSpc-;GH}J>uK0&wsqO9~5$`;S} z<@mC;%q51ETv}UKkEn6y_@(VvPf7i$rdzE^E#xpdqN~vQ&X8`R<1fgY!`$luw*DVZ zF~XaZ-I3VPnxJQ3R}2p=PUZRnO}2E~uHv~1uSr8FIfi^g$v4SU1HAiK>)U}HpaSXG zle<)s_9X5{BE|Oxa}YgIv^B7clX6Tp?gs3b(^XK;JrjJ$KL5+YW+GjHhMaC1G9Q$~ z_^ZxekU-{+H4`6i`=ZGTBgA5324oKi=}A9G>;eeqhg&Fp7^Jxdqm^gu`fi=~0&*kz zF$`xIk)WWE{3@O9EQBj#s<7?#>-adHu0Z8Tu>Ht)uhUTvP*44UyGFXY56{s@iZ6SK zf-yoTbI4glC zUP~o>|M8$KYsLJ)+oBnh7nmTqr=A`}#wLQ1;c-bK_Aj=qZ}VsHtaoY-*#{Sd&y$O_ ze6UY_qt*92bF$X-?9K4=A9cSaW-sLvQu`wEwh$`cY+bL@hV4r_#W%&3bh{&AeNm$@ z`Qq!;!?N18)pj(+oAhB5B+d8e5mDf&?yC_2R+|rA%X(Wq|Ka#Np|@CTy=g}SR^c2r z*IjBvQ=dd*QZ%aMIjJuyYs+6h@!8?*uy=0X}*>3`A>O0Tz zg4(4XzTnAo|A)hH;ozQIF?KGBbx(cF9v`m`j-ssrj}=~n*AAu}jrb+k>Jw5V9WV@| zY5X3_P=Ld+PeHB@e>qV-rL_&SKG~M-elUcQ+5h^TnL&FOxm-Jy|DzTf&*R-cDQ^%# ziHy9@y7+vPwgir;-ctN*ud_FcvCcxF$a<~gsJU+0zFj3`*qqT`U*y>cAy;)Bjd%Oe z&bIQd>3PpJLDwAvJl0;3Mg?aC-JOam6{)F%_e>Z;r+@81>{vE^Md-{F{{yiv=iF1N zja2u94tbpt?NVXb0&-4Fpa3Jy-Vx^fx9QX0dl24ld7t0N-E}7)$QTZVjrmG3vZg3U zI=?f>y;j9Tw!1cJXb>#&sKj8`3U*hCvgA3A8n5U?3kO;9K(kOjHs*d@3G42OqP^D{ z+PchBcZkN9+Q`M)45faQ42{I@rf2u{%)K%9(V*JIua!RRhnYYZPYWf>D`>lq_}6#L zl@F>iDL@$MmxNJFq9B))hc@T(85>EwCkKpW&q!y1XaHg#5$dDx z;C5i~+9S{1MWQl#lETyJMm)c2<*pd3K$AtDX&uWCY8*QZ89i4OqmDzfwNgq7swT7Mj#q1^B#Tfwhw@NU-Omy?kVdIjvX zpZ&Y>D1WumI%b49FRc;Qq~?Zx$v8@#(u{{-TtCAFY&!3e;%)r-4<{nmbO;uvGgfrQ zjBDv0JTy}fOQ4?43CuUXcmN%`M#Mv&9ElJ%Top_X7bXq|+s zcOFYRsREXrLQ<@43o2cmv}$OZkR(%466+y=YN+_As3&6(wepNk)znu##Y~0_KVi06 zr0Zuw;sPIQxS+y+IF^F7btOyx;WR(D^SME>il-Gbmqcb#N~pi3ZVPJU=W&wY^S9dH zW-)IoE6iB=5cMNB3{FRLtcZxn>TBEi75dV?-^r5og&@t~B^?PvKT!~xao89~)vPJy zlZ#Ra9FZ5M;CHQOTazVD!ujRvJO9)WrHz}?4tZd%shRvEcO@DmjfNWrHf1`0iPf;+pCVr!jS=e2xR+?{mbUNm z9>*rOt&MYIRO?Fnak^v|$woW;oxC%}Brxel#;&_kaGDTC`6P&;`17{P1g@a8zy!)e zp1Ep&z_r#2JpY|`tffc+B1~Dkw5z&k~G-udwWO`0}x7okq7mE&GZ%fK0q)CQa zRme?8!-CsdR89-qmLv&-wf@SMYIr7)-#whm;G6U~G9?evAz6BRJbs7XW-(jmXLM)q z>0D4=n#P+2!JSX%amZoMnp`3Ryv8eX1?_vdZVwU~C3gqa_m?L*+s{RCi=rAQQ$_d+ zZ&Uilu4>H~s{NPuWY=)(td`4P$4!C<_~Yz~8?!h;8OQbMh?ljID9c$Xt9P(vbm$v( zD_7OnTk%4(t-h8}tKOZA>N*pmyOD0_OstD}j;1bPe^d6kwEW>C?`G`A`Q=Vq5O7tW zGd!&ZoHes=xi9ER`+?shfQywCV7LlW&c#CNu$+3S8{cz3PmwtLie_gv{Vz3l$Fg++ z`SrPxn*MhB@hkEe4wZ;Q3MYfmXiE|Ysh-;`Sa*M9JY0HIT$?tF9c_a!azIu7F7Bey za%^8B2%W@>$f5@Bql5u^U=89?AqnZkI_Um`I{`r>FbX zQ+!H;Sf65E+!i*`&QiQmv zWvKvxj@ECnQGOrg1PIHfC&5pbF?69*>ottd>sWr}V}Sf^3YpCcxzLO6YwAT7a1PCF z4jG%t}?-8NmmbYQOhMC_uZwRTB0CltA;GQKV) zN9I!{2#nV5`uX7l^qj^K)^?|5J}%*LPL^tcX#Py4gf{b&8`(CS#`2egur*IH|Cp*a z8DA%T!Y3ryE9Q+-yvgs+n2+J&G{n5-4#j*tLXaJ(kc)eqXOqFj|ke+Kb_T-ba}y?}Fwu$gB6nIi@#jQ#osDoi>c)7sy00Wcd2gy0L_upiEbt{`y`D zJ{3x~ydD1Hw9}8Wf?I9ffl=w}>uunMZUZc2o8dt|N+_cE9Jr3amHma5LU*-PIQ!7Rg9Ei@NnA#m~_(JNNG%K^KUX^r2#Qt}-DO=r_jVXDlZq_wDOJT(65kQSHq& z9bP9(#dL@KsPH;FkI1s_+hWCkZZqZ2|FI@3Ij&G|0fAn~cH66*8e9=9LkS;@;S0AQ z*xrEA{y2(sSy=z zv@{K3_sR1_1(xh$6G`H%;F>&&8LdPVPsN-0sl zb@G<0ywf-Jv$sf}htmJr?dBFBH3U_^QxrO;{6!!xI2pbzveNtZ673vwjx+z8-*dHd zNb1kz0R>di9AEMrJjOzA0Fl!i8N8--&^&O^7kq7ix*|!1OU|YJ?hg zD7LzF$m;be2=Rfj!Z=ISR)i?Bh50(Us*X2b;nE*-tvFQxH^KLG53~rOyFAql{ejIE zC;rS`n297HpQz6I6EHoeOaHa>}^)pTu0(SK^t<95dDX+-P}&) zom`WJ`)EVU@T%~j`bce#mQG zTL_C=-2L6{SU|w^g#O@o?<6E|y2v)jdr=M9?Luui0Iw$>?w8)wKv}^M$j=u0VFqXy>}Fq zy+6~6dxw=?CcWVob6v{kbG<+bf+mX!3$Nzjg5nrG6=8cG^pN)u9d@&FK0n4&af1VV zL!W!cG!@Vpm9qU~6{6TVA`#tfxp-!rdo;!N{`q#X0VkvTg}Lf)*G=uzCNJST?bPGk z%C=>d>#G8Mk3+~&P5ByS$j7c6k+;}H*mwFfGDajXsToZEg_2gwRxS(iJ{XRr*w%M$ z=mD)*V!#UBoQ9KtHCIC!g_%6aCFr-Eqd!hT{1OgBw*_L?>zd*-zd&PCZE1!79mfCN zj0S<_YxtbPRupn1(4q2`q?xp1sVX%VHfRcNDkzrV80YJX8&LG`uP~;&za8qWRnAWq zViH{1tgzH0(5JF69x|9-XHXxi_oQ(V_2WW52+;)$iI-f~D@vYZC_T`99>cPuHV4}2 zM{qxz2rxL!o2m(An#$^Ai1QV+O}rD}hH8P9<+sbJT{Jq;dh{q=`Q*0WWM9@1bFwm!Yh@VCKfOK;)v8n}uTS#KF z14$2BZoWWF*}<$qc$T!udivlC6B#?RpvbIF+vzjRP>#4nxBX@Kd3>uXC!8Dc`w{ZTK4tgi-Tb`o0*zo)}Gts5LbSouJ8c)`Y78%}+ z?8z_#!tyY=8m?oh`-fOo|K*YWHTRZaE-ju{jQnS2_0V(Uc%@Z{DNT*;DxBcIHWmzA z3!ET1bC*B7Lvp>-WJ8U*ncsC}_+e69W_$;`f{BVl)`k(Cw2#slUpy&m^Z$7>k}NiY z@zkMgbyc<-0p7O2ZZw}1P5xt^m-1RO8sJoZ*H~4#5ztZ9q_sO(87$o5AahHqt~q^J3LP<+$ZfO#^Y-6j$v=%6IC zif5eF%i3ctZhCZhd*aELk7E|{v3R!#g>auHuNjbuW_ zk+1UIp31;BPdmwgA}$r9=<921&g}P#^-X3n1}r99w~^~$!_$4Q_vY7Bo@r$F&c}T$ zpugaQXM(W%M!5-vEAVD7NxknXmCS69I~02^JY{sB9^{o-+-n5wP*bH#-2a$eM-#RY zNH447!xKdLL@L~-DKT%*QZRyzc;&3v>QKv&;0vqyF`9}1yW%bqjKJ%lVB!vDnXBOH z4Qn^ANe6JURcwO_z2%-SpGOYdaPVEz4~l@o+Qv-j-s8s@;H$kb+BDbI1HA7?+~CM~ zU#tLQ@7jSvGgk~jqWNGQyf%J3v_Xke^09M-@HEA4yv2$Q8&1}WgHFQ3Fc)2YE?TQx zusTv7!E*psKQp0!0taVZAu2(i?h{iMqTG$|?doA?l?og#AeyCY=0^JjSF%!AA~Z@= zcmhPdnl{ve6E=P$^p`I2o=9h#N)+?1XzKf%MU6%)?*|)*T^>?1TsT_)pPN_9>)PY~ zQAfURjQZS>TqeQC%G7gpn(bnvCNEWeRYs%%=wiCB>zCDAE^E3BF2Z^?e`asv_~$ z{Blc)=ovpe_~%pO7lCFzS3adXy7#C4VM#02m4m3c%A);y>6E4a(!Csg(DMGIh~Fc) zIThK?|9FwW8zQ-Nf5LQ^MzS|V4_=xho|M@sY$8T}cH5=HkgI$r?QR7gcaN9TSbLeBPQ-m@9 z)?ousAiJ+lQ=vlavr}1L%F|H+EtB5!?IiU@W>pA>XDl{8e{Dy-3b0&dT^~ibVNo;( zm`=~qvQxaKI<5GG%P!kmWS`7sxu|E9mt=BPKkAKPQUdKSAoLkrC{|fCQN$KhxsxN+ zE-Xt3hL^>6GJ_qi3qBi(KO}46Qi75ddHHtte-zXQ0dtxzEX(mHmGPOZShlvEfwjQO zKto*;^WBX|LBm?D=jez(O-!&u?7<7_N7VPc zW+hP-r%W4YZ@a+=A}y7K+7p=sD0wGjX~`L3`dycgsh7lQ`qrltx99_X4gqh|LZY7C z79i9wqT;4gf0`C{wH3%b%K^bi9vU}xkEw7vHDT#Mr-Y#iz39g|*d0q{@`~`BocB6L z`7@ohG7Ug?kwYSt8h4CPh-VrA-^n*>pqh5fcuW-w!e4~dgKY<(LHm)~4MFg}f-+`D z=A;-=>Lt6>HGVRUl(ra`FET2}`bF#x*WT$GyyuesfnYyIzND6d_bVorlOlnJ>ktiK zt2NHs314R;@_vl-Q(oZ6dOL*J{SIpD>-BB~!cF&S)K{ZK8S(Wpz>HKPXOH3}eg7Yg z-|EYcd7MHxZ)|K6m@Sj_WOdBc#^5)Ep|1f-&?lP*MQL@1)(EvQ6vBV5a=0`oyv!AQ-G_)H5RnX3n*#Sc4^h$DS@U9bpK zr$9@YgB08X(eRc#K3qiMuE%7W0Adw;9jH`ETPE{kw_UtA$pn5HBi<<5f3ul)uT$lN z>PwlS1g!X!TV~*GFF}Yc%dJn4=$BZNTZ`taXA<5(!$9NFA8th)!HZJIF!c+Tf99Hr zyc*iz>v+NL;T>KNfWd`f@MMjI?!nho@@uGo{W;bq{$)yie=f%|AxT!`X5-^KK|X>A zX&2lbCr5q<`Q_@{XF;Ov(B5F3eIVypj3|ejKzMvfc^GzT=_Nl(mSxgmwn3@MHN8ME zz=#meg7-Nuk0msuFy;qzvneY9=(ar&r{V&+y?@dFM&6kV*Dri*9=Z~BLHdkIc-ipBv*XrjKmZwyUW%b z=%g`VH+F%E^n#ni-2z1KZD#0X&53{d>Q$I%s!05TnkN99V2DUJh8SBj!vS8{2@uuc z@$|Cp_U6E)Z1~dYWH-m_9_NRRE3SSly_X})LgDNy(MMSyy`VX59|F;fpLiBAJBZ@2 zEDrVWcyA7?ZeA?abOeCg$LgUmu|f^((LB`+s#xtEtPl6B;Z`3SFFovMrd{+3&^mL= zV4Dj3H&{2n71fRVeQE|$}(7!VL-dN78qu-{*erHD2tUq9T!l45O~}C6z*?euWs>Db>;xrQHa0# zgBtist6D(cCw3m2@_rUJxnjqh_YUl5f5x_B!p*mH*aBo95x zh~*sOPu;J#iM;n58JUoERUbQDuukMNE|j+3c8r<6JfFID%{wmnefzj#N9dzobX@6w zk0(+Ac5P-Hw+a6+!5*R<#>sRPiSyiu1t<8^exD`3vduA6q2p8I9a+93GQY(%Ul_nr z?d)zRBH)_04Z&8+(OsdMa&OS@rp7vzvrofjpv~K|5 zVUCyHRC@%^LutwwVWllOxX~T6h4`25eNlL5)|BS3p%LO=CS*}0L?IbuyFc5Yy{g@F zQhDkxMVugcZ32#9dM;VYA=jD*sT!($?!+tfvw$!rHMizeZmLT-^L0q3yz^l^MAX*5 zsZEmSbMFbX_+n$O9T6}%-s60do{%eu1MB!TcMU1+FA)C0?}3?+!2`u@?uFTQ-aCVz zX7Hh*F~#0S=*ijz4d87UFlqv<$t@)ZrSN&k;L+dmC$3uJR5g%(_~SSuqY0jc)C!kCNB}J;&ZEx(kj_R5OaQJ&D?O zZXellIyy}-9g@RSjve$t3Ta?lyqq}A%!xQF4@%j@5{HBil|D))odVYv#A&0P>PJ$d z4HmOIPiBYX+0BQ!Ld{SW&g=Jl=-&pu;HBIJ;k&q8+zUzp|*zs$Gu#=C_P0|+`GgTvb?4afS^ zr#TmdxFZC7Se8nW$eVPc6&Zl?E{vZKzC}*%EVLVzpK{ht+>F(31h4qHXo=f@3p23D zvK2_SmS7U|f#H<#D%}HRvmkQ-;p$s$|L>LIngxaf2$4Z8b6|V~8aLUnGF!tvVKaGn z?Y`UEI%q=sJK9NAtNOx{pFXu9Xfh)FeCkba)-FIOgrmT(YfAk%Mr?{7_1-4M{YRch zMT@2xjAt(t74$%8e8#%Mu|=y=-``a$d`wRmm1&bkr=cE0Z$XsRA35*qp3b;2BY}khY zL;A}OSAzOew(i{lZC=(?Kz!rRDBRrMEkTiO(=ni>n-}l6DkI_#VoDYu ze5CS8ak-KDq<7-58lxxz@pYojT%E*Z4OYB*nhfL0k3?YioG9NLv99AKNeM>hyw4_4 zIr0O+B!ZA=9M+1@T7|}7SbI?ycbA0-+dcQ6wdVcz!N0xIKWHxTd3=gw(b(R!B75*E zkR>6bTeYAu$AE?Bs%$7wS zJd$QnL!LImJg@YSYS%h=XLR%(*}icI_@hWE1MCX1OHaYYxSaeMBYZo1;B@GKDBLMjDl>H{$^ zGT6R=iQQwA<9T0gyl70fT~j8o7X8#oZr`?e^jD1A?p9PJtEcm4>I-o}wocW1UkRcG zen_Cfizu4ixZ{K1>_`)Sr!AQmeTltzU@e!@pj$qi$#(zS2-bR2wGJp)GQ88Nr3#?X z=gyf^wU@*?I*qxl`XnAv9_|Yrglb7VGI#kt{60P_BC(q_#x0-@-K{!gl6W9Ugy<_s z6pc;-;g_}Rb#%n-&rC9;bv#!XUG-nOZc&#-XYAo^%oh*IusxwR@{OiQJ*f!RKUhN` z1MXe*vX-jWuz^A29Ic2fnNtNMQd9;50&Nc@kdyzPzu)R-HMGKPF7VrE02g3 zuF^7ERK)}kfiRQhlLI3ACZe4rz!3>y_f$D+9hRCwx5?b55NjR6nBNTir2`&h$o)jF zvzG4#g2-;^#>CH@{RF?>t#Fdvc#5>kYlFID?Gl5U3f0=O7~4n}mc4O{XOpekx)%k6bhiYE&Uz7e=2C-wylFH&W@S${v;1p`~t?1N)G>b*w>2sp}}N zD{oZ(?5Vj%>x>-9a!jdK`m>G&wD}xjGaXa7H8ry|U?iC!iw3>B6hea^^9cN_%Y$%y zptH-Kvinv$6=T`o$QfEE{S=%(?ZwHy!z*@KmipCfdep7(tK|@wxj9P|H+l>LF_!h- zN}Bop_SK*1em*Brrs`f%r?vL(8KChBute_gVlp>(kJBW{-(COR>G?phdfrQO_FR|vG<#PS_UDmC=#1J{hK-+pE~}CLGT8);U<&_k8BQnT-LZtVVZA~b z{TV{}MWxfeykmgPpd$aStusSLbNJNn&MvS*&l=$3-QD`orE~MJ4a|E^_Ax|mi%tAq z_7|YItdgAvB+MB`fnOBA|T*%t>3)D%V9XPgl zfL^+J>a$$?<$S`R^R)alzDrkb_hY)^5X+ma_*2;6gV2;@eYJ!3xanLZDsZmKe3<}5 z;0;($9{9ddNQF2Bv?HE;N1+u?ATAd;)d?}Oyh^0bbN;m?)89r_k6Nc`32;I?vf%oP zHn&7V!3w^AUlqPjR*wOV4qEQ9MxlHCx2ocFa7$`cSn->H0&Rnli z6EC=52J|veHEJ|tD*Yg>Nt{K6|>>;JM)A%wt`sh$giX55dI-J3I ze3gNw3Y)aU-Ex>6ri4Av{L^^A@Lw}hEt`dQbwN0s6mY`9`FRbV18}DKM7~Z&eskS0hauwA z9(Ami0u$1hvntO=uMzASehvied&Kau^>&^_rp&wHCMy4(<82Umk@5#pGj=Ph1$X~i zFkeDZ{Ue=ujyD4%Ez^avUVz>~eRD7H+?iTnSCr+GQ|vnC+zO_?{zzv*4Rw-RWx3}m zTcgP9Y3Vh_;W83eA7ZD8B0T&(jeyg#td(1pLDqtXjfUC1a=Zw*6K#WbFn+WJ`)tU; zq1+sc3D}+8NJkW0FpKD==Rcs~>dU!W(iN>*&YGH;j^JqI%+pf?%8jNobGY&e^j~iq zi6}b9zBkghzVn|=nJqsp7A-3wdIOOcrvju0d%!BsyMib1xU93>tgS|x0m;Aigm$vY zz0@BA;G0||cwMVTENO|B1+qv{6_-?eo?O&&qj(AXq=U~c9O-4;^%4fI)0`P z(N~aU$}Fq-YiA#1;Q4zgAb@IXb~DCLExq%s9r>=_N`f)>sb#G*^TbQ1K(BY-q==Kv zdy$$%2^ws-rDpX@z8^5y%3UG4Cn&%8y_pu5!%^!|Crcs)l}6ezHyP)~@4(_8C*R$? z6&dJ#?Y!evnrbrcUAMl)8skMAWNI#tE5en=A zuUjVrb^g+AWIE&}sBakzUBA>piWgnyN?!|bKY!r4ZuKC+(F6B6!LYHWaB^6m*sU(>3xf)n`zf`Gh zM6E@TnmU4w@`$jVOn#dho=}{%6ET#$!*i%t9=X6Le6Ya%pmwO{aj%|s;f>dUe(y%Z zeUsivaI*#_*ZRULOy^bD@TtJcO|-2Ay5Weh$??CRI3F7*E`P|&hGbY!Wof`teF{Iy zq7g!`lWZfbKykHO@<~Zb!H}VxYCH4&?kW!~ktRb-tL%JYuLMW^Xll84 zW2t`YxGDZ?)H4wqpwgXx>4(Fdt^~IH?q>Fwu;GF`#=96|M@)c^NmvgV#%myRGwZ};Of8QTe9WaAqHo##q?Q5H7}>1n$6 zm_u<(NLtbH14osZOk3#vM2r{eSqlhvQ;MVB!XmElRU^iFyyk=2+a{Oni(l&PSKXcP zpF_gLrdC2imoX8g09vr3R+1uiqtEC}e*Dqk+l>%-zQDA4nAfE8jP0!+Zor@%56y`) z!WClv70K`#kY^dwN}pGLyhkUc(BVV4urP5k4yL6inRp7#oQk5_Uwk8OKlxNQtP)J* z)4m?`(5|O3535`!N2dSBW>3cN)_mUe$#|0yP7RLnPDcJ9_w~C%jfS5JL+{K-o?*Qz zUA47kSYES=mgyM%bkMpKn!_Ny*Jz%r0EKeBcO1*wV_Mt=x+Y_V*S>L%9Wqpx{>YJJ z+ecJUZ5>xU_nXSFF$BG)-&+fixbkBdmxk(|NXv`?CN?}u7+~l4n6M?hH3L&hNyE|uX+qdX-08uW=8FGUq~2R(3mq()ks=`{ zIO=nYx!U@$SS3t-{+X4@9rimUpBSpZDgi7)REZUe{7WYue=unNkb0PULiuhjfjC0) zEf-Y)C<2hSldRS(M#Gcm&Xew!H6I$WQw24xThNJ?c<7cP`5RbaSUj=l5SH+Coh)UTOYAZSfPKn0+viw}Iqm8oJVN4rc#iIMY|g23?>`a{|ddNk8I zt|Pk=#AG}&IIP|tA7Z(}5a_bz*<|>;@LWaUMU|T4vp-lmY1@26PE>Ujr0VBqtZ$Rc z35}K~4Y8Xn1FmXGhWNi~$VhUh~0Jz%#SxIK-JFbUiF z$>(JSxniv~49y+v;&o{@h4qB+#i~8&8)A~-Ql?IwTN@;$UPj}-&t&i4ETx69+Ub@Z z#I2mPCrn8uF}0alz$nd``mK&Vb;qy1?MJn}>f^nl=2oBXwB<<~SY0#M@B%6Q=6g*4 zP~2yf9ntG0%2)^zNp{d2w;ybIuXhisyDEnH$!0Zb(%O`mmLbwV2j7^{c&^B1L9ybi zx87GInVIU<+m~Qho|%*SZ?X^|}<> zt|3TZLWv zgj&vQZRalL4S|=iELpUGtXu+2(>$YypI$8;@eM!8M<}y6W{c;;P(L9o{{9 z*W$}yEs69P^xfJD9|VLmVFKj@g{(iu}ceCZGT zbxqr-;bHvZ$7;yP>Lh zTZex;FD0K@MmB}S&#ZGtPwQ*VjhuFBL6(P3s+ zgJd&(;YCyds3e+!bPox9QQ7(?PzUG;Q41U{>SzQH58I=2D&bhPn8=ciJ@9yCIn(XVX<-|)5RCahs-WmW0KGiitxtNjoU*FFv7s`sV zVy`7%2Liw3EhebXT>`(~1@Hcn@Fps9sj!dkh#J#Qs^T3vXg5vtA`l^$LD`aA-XVCl zd-Ak9S<%gp=>MGf8nF>SD^(pqqo-};U$`Ep9gK$ED*9cL$tZ`-@8>14%omO0*3q6b zs=%bnfbm_(?wHsPXua-QIV~7GC*DKKSm>9`sM$Z%yWP(~v-SmPSfE?S4iwkyzc09Q z<2-SkGC`xc?Eisc9`@cW6DYsjxFNF1;~~C7muH+07PjCgQQfO(+PdR-yx;EjxK%!V?@QG41r>!1p$C+Q z?h88?DBJY(fvf%hy`ATLp~;}WE9az_n2{FszL6;I+QF&e&X=8W{eSg()O(9>!f*Wl z*CcdMfll_sm&DdSYaRR>r-ozXAEtr9>7mzXAFkrM8Y^E5m!edtQ`9;XL6igRBEa19 z5No-;VDxe{MayuK{Rv+2)wtfNp*~{Aw%~73`fQkW%>@Kk@*)yKvnwT?q`eA5sjh zw1l;~7f;hN+OFOjQLJ)BBIlrESZ!#hSi26g(+ue@*mh@@SIQ^Jym%dYT96G0|2TPfS1+O#d~B|)6IvHnB-UzI z&@cx|K-7WCC&~B5K-u55gdA&XBqj*V`d6g-_!xgr_3s9P6rRm)lDgWx{29G0=|>_h=&*0JzJk$ugboM!RelsA^>>|RdI|fB1CM>z0o}cYhO!m0sU~x6e+iw9TFjc zuU~3JUvNtA>!K+?DBq22pWjWiGD{?hUCPEFY(@~S*lQG=%^c5qssQ89WDE4vgd6@oa9U-E&CgtvI zuxFQl@4ME$UOQs#tdF5voP4lVY)lt>`BLo$1w|yo_Z>o;}t^v%&oYBA6x8trr|1&Zhp;=ZAxFHL^nJh4{~T08GHCPV~h0g4^T>1 z0HcKM$_%%yF;nFQ6$J*XL->8OP&T^JS_Q>ujnT-e^&`ba%d& z_yrMkFeRQe+PksCLJ)AH%1~(Orog16xyYLH)7aofp6wl8I4LFh8pMIYc?%CRvLCK? z+`6>UfX`SFKyYulf5_OyyM})8MH0rfjcVyM^TgmQvE6x9sC|9tl}5oz?IMa22FcUN zC1p|S=2jrPZVb=8M5gLnKgO?e@0=A?5N?Flf7J3Cw#3X^cwx5b4C>v0AD1YB zH&L7$7^X1Z=M@o>jz2?Pokc$qWZ%y2MY50b2H!(Bw{8BxAcJ_zFl;w0Omk0_$z_FVj{ zRa=91rbFC<5zm3FqyQJU-%m2r|G*LN`$YUDkTgSG7&nPAT2+pV=esKZ-2z?sb%YNc zN`u$+Y~m9SKNC(kv(~{(Qiy%0_m-2z*c{etnr-74(Y?uElAC6F`)Qm$&p1M@Nr{hp zwpWsYf4VjP*%fzZXRbj84wGAji8E6yZ2-8+run}Y(?w}R>t4pzObf}S(27)^qENjE zr>QxI6nI&DF@ zMOhh(QNwzH+h&FfdGEOJnkKpBgdmD`z${SS(AVeE#MLmcDx_OG{i#oi^srE3?Z8pN zn{}{mQLi4Xk&ktJuFCQ#Pg059Knb!1gB~i4*e542OJ`z<O9u@bc9B%ATWUq?TrTk~5!JOY;%%?5p_<5&JkN%iDRDu9 zVU~gR?9H`u)9y>lqotdK*NM~3q`+J%|CZ8684ElzX6_9kl*zRxllOLG|2131F>kV% z$42DqXXP1l5JnMI12X55i}QuC8YmGp<6-bXAv>0f1!t-FlNi7>+bRDg)gGG7#o?41 zHE*)Q76-lJ0CX?7+Q9(`_;?5jWEb_9DUjJt!g>@;KIjl23f-`&cgR~Aoy&04jY zwl9hfgFuIN^FD`@l&U$;9Z`Kho`bF=gFkoC&)3*Y9=YZ16%Z3`PVB&vO;^~#ax|nOp8`h~9 zEvEuM^AUh)Lm_76cYMk9wLrFjLF}ndqj$M=z||m-VzT7{MHgdGqlCa7!vg>mEcID^ zmP%~6+~TQtP@mz`$%1-+FOcA_lTLSZCurTaoQ=u>hEJWs^eO{W0yncS`|}YlN*LCRz+Z(| z1PM|;nyGlRHp?dwxtZ>ZH8UnA9$m!!fY*7$gpt)^C7XWrZ>Fh;Fh9|sr5wNfeH!Dr z@(O{si6rkNQ$g;IVh)k)jv#rz!6L|KPx+oC3wjk27VBKlcC#s1e12z^C?{LbZCRN= zCV}^=uu%>LAFfWz%WewXc5#5`tUsc^(y~Nwe&Z=3{@{zagyBcLZ`k!SQZ1iP9R?8s^CrLk>l&eGW7bhhwP^N9!KeRG|}_jKSK}c)Xtt9WkDRWwwW#0 z8W{OPf~3K=9lyw^%DmSt0fPz-0(|^;>hv+`ujgXJEw4JZjsYenQzh9GO8jr}h0$qMliu9Bi>vTa<4R z4U0H5uHMNeMiD?d>6Nk+#ZZ=OC&3)4-v*aP_}J_Z;W=?|1oo}cM}pp8y3N0I-!DuY zg0_zWgAT}-USBNF~jv(Y;aT%w1oStObkEzOS=@;?yrtL zbVx7DsvJ@T43tkgRP^ZJf!||xy~a|m`iqk-1=K=z3CROUIl#aZ^J?ziDt|6n_maVY zF7GG76pllJ>bcbMY3_>tW!+Dk)H~1QqJL!%x*lih2R)q_dQTSj8*!+z93z0D8(-o& zTgGqos(jUe7a|)yZjwa#aQ`rhHO&o5<#0kHwq*kgMB_5?^o{CUS-u$_tjW+ul&4@x z%_erKnIQc?33V8!w53bK3%>DC*_;NdDBVz&n+*JqX(Y7aPl|N+apqlBY^$625`hSW zM+zSh><&4!(?(s8!lw*|e^&U5$`|Fh+_6jfUs0H?*MO>i2lwJ9RKWW^xaTZiQc>!8 zD=!noz*pS4o=E?Q$bG!%1klg`KMrf06oe}^yolS4ey99nFzHb2e+*P~sIn9MkJO(|&3EO{jGj*?xj%VkcGy#wIpX21^S5Vk zqT_>nD#T<7wE$jp%36bWqaYfSaL__jqZmQ$|0K91lz|PmNW5sckR*Yn2KfcMCv==G z?n@HdQtxjN4%d)JdWnKj=h#j}3E-e5AywkM8y>K*qM|v6^1(a}Sg>zEJeYaq;CBj} z2nq(4Pt68LSH-&)De9XhS&jK%XEY}rgql(vni5Oy*>~P37^F2ifrzmV&{?7NsI}PZ z6or7C+_Hi|P!&l}@+>nih+{k`e#Qz^#d{s2re$AY#J$p=gqhf(5IJ@uWJdG~JApd( z<2j;xI!E{~l>#0Gjken{DyIm75zI21YgP5!vS02>tl)9^Nx66*%=%_$yl=G{$Dx`_ zrNmMY&xyvCNL9Z~ShV&QMw7?E33STSKr8*A8^HcnLf^TxV`A^FTDk3{Hnchy6*DZA z*zi0>4(#wq?#)xWa^UTJK~&GVT4)w(4p8gsJs$`#l&XG;VUiHDd>bf}4K|AW7vGH) z*8&t(x0r;LMtl1`VY(YH!Xy94MXA2^n>Eq-PDmc-CFDQ%w|pn14aAxAtBACgvEM!X zzZTyXlRqz>kE-a9Hbd%g=t;^Awix+|O%lWIx727DQK|e^Sr+sb3pj%J(p1ew#|q!D zbba{#UH0aTr1NRXdy5i3&Ai$A_np+YB2w3F3HnW*6al&GRigJkj>Q}oydSA-V60_c z^ZkZ(7@y+|8q|Rt%!DnhI~?AAVzJf;Yy_64_<^ZP$y1fTzae{y!$9S{7YI+|J(*LU zMqzAxGQf#fbZi1UnOM1&RcjJHMN2bKG+2KrAF$7UK?o#d^{_oHHm!6P7OfcX?05aV znX=QXjBf~_>Xy$zz}n>}Wk~TLLPAi@FXYZ*#oYmEjT9Oz#q8Kq99ERcs)t7KmjhLp z*LsE4F)&^}AT7iQAW*&s4gd{mh=#0BgTPVXVh;!LQq0nYJ^{?49mArtTzzAA&DL70 z>H#nZ#Am?u!2jw#g;|qUFA_BR`9{Co#EDULR$YXC>d>jf6$Vs5O@jG08uDPiMAIp;G)$Ln$nTI3aPt^Pu> zUY{DXRwO=Rn2OI*^O}RgMA5J>Et|O!wXeM!F2+DWcu|bH{UBI_3p7S{_XfzSsElR(Nx5#?C$A$ zCCU`2#zJm9CV4f+g@J+Uok&qA73C*@6S4vcH82851lwYKGr_-;Q4nirpoA)$!%{OJ#?rkH zbtg5x_)F*ax_?4&qpLstKa}zZAHb0hX!(uTOcD0TqDVW?+QwRr{fy@C3G`2z;U#)U zcn+F)SwR~D<( zY7vGd8`QsAal~l>)^UmF9m@?pV*Bcws=AWHz9q2AjhFkEV|=HXC>Y0NsbB7%IArL~ zKHzFE_vi@}6GQO7X;Gzb;)Azn@+kUXaKSP(Jwer@9whNnzWXjdICTN*Xoxc0zQSO< zQBcQ}6LX8@$&XZ!vq~&Sy7VQMZkQ28as@|)g>|PBWPkNjK=#io-qJF3aC4R8B5Q9m zsWyv-@VMluS1j$+sJ8{j_&XMG9T5uSpjkh?R|j(lHt=b=UvbX%TEG}~Cg6kk?L#&7 zM1nUf$Zpv#h`F|7%vlgZ4KE%)Fn@pAVZ@oWt?VG5k@U{yBT$>l^i{BjMnpxgoa(2q zyfpRsH$&>fMk(uKLMS7BVe)VroH)mT_J(Y#gbNe@0SM8Wntt`9Li;B)Um0YGE}4B6+WEw{1bT zRH{`G_oVxfQ+tj(UEx_5LNI6VFM;L>MMU4_8qZVu#FHYh6Q2E@7B49PTp+VbF$$ld zvhA)3%K@V_5MKAjB6029TS!DYG#d;pJ3tEOCBlwr{>KxZvN5IeQx}f|`5lDa#S9Es zgyhS(0z>_+_-E0Fo#9{)&Kv?L>3dX3L~2N*kc9zl4`N6p7!U9QN{ z0CW|0#x5tT5k_>m91UXwjj|97UAu*^u~C{TayE(knU$}doPu6f@l;PcZoM^y-2Qgw zGu~bx=27y!0S^haZThg=Dl0=%M|8?D`3JcFT|?H(_1T>#Z<)LWQ#jPyHiNQte?Zcl z(gdk#4bW@>-FSUMJ@b zWUy4A+T$HP$ZFT@Ex8Nl1eo4@bmP3Jk@v>VGZi`aEMK4mT1UipAa*wg^*HXyGs^go zZ-qSy<0D@kSafEz<%?bfjVN0iay8TRV%8Z@GOZD69^(Hs_bsh>S1_K2o1_?Hl3Y&f zfA-pi$4$Pmj6&$f8AU~yA&$;<0{>|ibfAENL(*ncrGxTaq!V0<+x z7L%%uMvhTfkUrjd>L*oOw`}hnk_B9ko(royhJOrznz$d8bx*@7xPZhWVg2<++9h1* zrc;I^xTGS^Eq+3&jA|{`K?q2!n6)&`6E6p71REKau!xN%bT3rOVcL=0iiw1%%dO+R zU;~qaa|^=&#V>C7FEL7*7H4JS!zEP!Y0S9E1;Xi}wuWLKwEesUvNaDNh!JglQxAy|z`8|gJx(LC5L0YP4*AZh3Te|)8 zcAR3Y(bPTos+Gi^P}2N$+=J}vTpxYPiU%fza{o{fW{XbK7dnepPOY~mi{&2&7gX$g z44pm6G~n`pOhTNz0b=%As88@yscOQ8isSS}2I-P)$Q&VUjRSNV5|YHs?@t~Aw{?QN zCZBEOo99g{c02Hs@t)>T2VWold*+|bUWfIW6pqO{e%>j|H$d5WiR(X*ql$A7lu{B4 zZi8Sa3hE_qF;@Kq_VBH6C4#(Q57RzoY+N84E4EK^#LC}}OI?M|yyM*VPzv?ak?3*~ zst4aEFoqX;&lNK_MJaIJ3-pe-_1?Y($4s40g>hX-xxuvqKf4a^q81`uiheQjinh*% zBQXrAo8onkrXCv1V42eTc2-fN+|T{{nA}^2QeQ{23xlZaqh^oh3w#?~W`?5gmNk0_ zJTU82@F$#|Tug)qXsZxf)xWk|z4P0rJ(c0E*Gzc@({Ae;oMS_|)*@hW3u%wqF&ysf zBi~wUJYf{Ndjf8nj%ux0<&7iorTdFs50m@L!-84>qQ>uo$M_z>fNT1+{H4_#0u#$> zPS56}-l=psBW`1Z8^Nx-l_t$ldH+4lI>{9^$pV)hmCuS)(jNNJK`etq=Fq3(0)j$! ztWiNss0anW=X!~^AkQ15S4))40SmS$&T#t!c5j?(}2qMNGYzDJ8 z0)RmDz8FE&Gm;S6=yI8gv zWBgGC_!m2&!WtZ_m~725&%G3EjvzYOsEl}*>rV(cK%N@eU+fG%wc&2gLYKkYAtX=X z{}uPHs-~6f0FKNM-!h{qsss>nXqHM=b#Dh~X^$Ap9byxw6um)=1^QE@M@75{H>~tY zy3*{;Fp#iHUpLZ}-dNGe>$wll(`Jm)~Fc z=RP?nIp@Cb&-;2`*X!yzBMHW`IeVT}`E-*0$Fv@>uzZ@UeJ6}kmA)?Ov@it=tO#+^ z5p`0J%Q~9O-*2e=Sk;f-$`!wWZN^nef1TO%95miiaF!n&bM8q0@!b%~ITR|isnZZm zx!93*j#d3R?X2chyPl8%agK51F-C*=Cf`5v-#4ZH&3u!GeiDDH;oD0%+bonz2%env z#t@jm6J_D+80vm9VzXUhXsdO0>-&x8P2af?4dW({l1OzIblF2Hi#a08PBgQ-tXa0n zpAV26Ed8k)2b}3S^}5Gr_nbgOSE<7Q)m1Y!{jL9yhwm?mB+}Hi0lo`IUzP%-1l4jG zCJgBxRcHxQ6=mHJ!GB^{AFunsaoaGmC9W?AXJ|{~!EOJ|_^}5iik5Hi!#a)vT{`V? z3kB9LDL%SrV`$jrX~OSPqL7(^55QDfXA||=1;>{scP%jIYTUuD&0}&YPK-u?ew!{c z$J4X{KY!_yVc_}=yFR~V zKr+Q+UQihene&U@Ib;(-9u;GVA>nY$n*pp?MupLMgUGq8o&$9yQjo4>YjcCKnpM7? z1t9sWL0_TFgi^71knT}h1d)ezf`7%6a(36Wm@IP!Rgw7aRd9&>B@yjeyAX*~f)d)t zyyP~mWO^k7IwRUK0yW@bZ`BQcz)V}*Ma9<7+jlF(r#l@U{G*^ao}G7%s7$5u$N^8?BNyDL=WLFc4!0~?? zBE%-Q@kvwSW>=JizIkcB1 zDCil>}*~^~yuis-AwmbABH289|p@MvN8` zg`q~u7gUYi=RgyafeOWTW75PEZca4*1_cQi3G*F`h1 z0GW-Rrx8Yddd{Wj=`#CC%$_u1dyd!=lFS{z&Z?Ww64Mj3qD!a|Gp>Fv6dkHQIAO?h z;U+kiDQQ3KFqQXDsfS4YxcEiE6wdK^>D};Kp*DQ94>DnIMf^IYnX^E+d%cyr6DBHI z-4Ly|YgCGm<^rx`;#!}TrB1Y*{R;%*D7VM#aXULocRdw$e;g5IwWzpsdYtL7b&HRyTl-{x*QFVJ>}EYEa{Im3xDKBt=~`j%J#QVy|0|6w7;F zYLo9HyH}llkQgB`c<14;${sI^t91G4__rvAf*T<_YJUa=x^$fFB+t1&KSJOqh-7G7 z=HEO&doaVa>I;eesXK+&1|(aCTs;}KR#NZ0%1;_7clliby6ofwo8&Jt-jMXMc~;=8U~Ps)${vN=a3nFC?0I@`6~OlX#}p=? zi)AYGYdk4!nQMyih!DLBTmS$3XE4Q4AoZ)&<}mN#>~N!HYt<7k+*|h}*fhodTZB^# ztOT>mi`xtTbUF0HRF^g}MSe)19EX(v^LCvFl?ULxM1Gt8N&QkpJ1T^fpHB0x}3j;hU&%(#Rrt4rO`-0}({|4mOT8YF06t<|^BRNR8{oG)<6te2VYKnc-tLeZ#)JhMTV)EyO^q9pCDZ+lr2@ z!(U@POv*0BUgR?C@?H5uUWke1tm?QX*Y3J?78cb%>0QaZ8k3b`xLe> z!+6O%eD|5fY~w3qTxiSAO~Jc1j{8^3SYLXK_ShSJBC&XE$07vR#xk>2u44AM)jl?{ zF$gt%(C4n{ZLs?+-VvJeSFC~<^xH5~;lG%}XSeYxT0fMC1i+)0=PHog8D*JQu2R%^ zpHCe3)>skif-lpVA7hZ_V!j2s6DfXH_D!`r=dw4+dPBaGGe#3*MX~oRmP#pfZVry7 zs(G-mq!=7zrzRn|d79!~`6L6)u*2QKe)gFc_lipwb@y#$&_F`OE$S9i-`0B9u8R#{ zdUMYs9Ok`>5EvI_Ts#ace^Fu_7jurgw#Zf6mlThi%=J{dv=ZqCFW@~cvpy$_9u$?O z$fF2<8w@J25vXJ{`>k?m&tbdgX@tQ*@64Sq7)Cm7$alYSKBWTpyVSogpYW&bK?Uwp zL&GR`&@6lc(~mg3iq$Ow>n*pcM~%`Jg(yPtTGWhtbl+eHt$ zzLBmz81!QY8QKkwgVj+qA~#f>sFs+iJGA4c77}pq+E-ZjPd|2LT@LZL3YdFle9F^e zshi(bJ3Y4n4AignyG^Vag6brmjROGimBc;m!4Zm^pp7sQ07!D$l#ON995ij!^W1S! z{?zB0v8u5PcTeVhkDjg<&HOW6;}zXGjC$>!dJqXMb4T|wy97jSrs>dZyY?1G}IxoA}z$*?_2)eg71^Ns? zFJ=Pbr8W}hVWd2S(s#yC+pJSoOL0_Xk9?9>^NxvLK+r9!RJju6^F7UmsL(MzlXqd#*J#`toHYK% zDW(~6*=E*paU`li3*V4o3VlWN7i;OB>SE{k1}MQR8QtEVl!A8q-DYM$f7YCfAW*@d z+E2RU{DR`ew+*q4k&h_*XETaE&y6uC zMx39=H7&~gKJ)e8Y&V0^$LUH!camO&>Ohhh@Z-Eoo1oJ}B>~r&|1p6?;`Gd!v(_(i zag<_>8%^n{m@6TREz=eL%Y(Ht=@4v)n!MfcK_v1IV^j{(IVmbTXFQ||PjS1kx{L|r zZ-mo*Y^=^f+40jpdxK`)FRs3w@*3{e5b+?K_($sm>?6`cTR7gG0vP2|bq8SGkLc`& z2>R`cSpEMoF|g8SIMO^HU0tKF%(7!xv-IE(DNtw77lMa8dPNM0kG*w2l7C-KCJLym z`}Z})@1+-HZeMwd6lvd_gE!=9LgQ(KcOYV5MnOCo7GJi{O$C}J_7^nh&s2<|r)(Vd%XcpT&<3bm=H84474r`V zg9l$Wf6fa$DOfAf&GBlS=O_M6^B5UdAxDMNbXp#C9>0z&8s3xs)YvfB3zWI;iU>`$ zt5N40Io*cbw=U2{wx_FX0MeHUu*V+sE3EC;Wj*4Gb`r51)raNsUXpS*@uQ(#?iE6s zj^tjL*NcO6r^cMOl&h-y3Re#T&+^}q)}}P~fQ`5-o<5y6{%9P4?->}=OcX%{(N%|P za=|=9&2^rg@g*llWKvDs&=yPSO`+#>sw#=udYEryylTSm3Xh3D7vBN_`-`aexr%Gd z#xa)(N>I5!_u)MEbXvChoRCs=A&pUq!7^bp3Amc(GNr=7k;WmdV~$(k+l3jx+&@I9}|xP{osc7V=T zDV<$^I3xe}Os#Gx$Uy$(b>u$hh`aSwg4&K&tn#`L)nGF)#al3My48oUF{pG5zy9!R z(d)$Vdy6F0ra{mxlHZ^)DCNmg5Kxi%zf!q%Z~y$x@0gfWn<*ZkJytJ(5{T493OQ@)c3x6R99Da%C;cH`n&vSqU;5&64)rTn><(>z zg$~Io)##c2$KpR%Td4M!a5;U~b_ZM6WifF!ZQwB)(*6rV)vt2^Hzwr3k8a?UVM?Tl zJDZrm_UreL%I#XAxX~dwt5KrU|Ckzzf;o~FXe^V}_AW=T>_xiT6NpXq>MYq(xW-=; z!(a57Ttx@zJUokon__+F=U7)G{S`V>-6ir(MgymJHuwY?^b@CrYa1YekmJfKU?h3SsA9kcVy_*7`TF=@N`;NeLq z&X*b{`D0KgJK~8d2_k}ud$Ay#1&21LrHjI|*%KTc3Ln6lZ)-O9*)G)@NB84(n$sm2G(eHCxBO%3 zBz5HE?baJV#b4Hy2dS*hS`dKWllzbbr&-WeHAx@B;1Md@)|v5%1Ksr1ixJsCnOII4 z(0)kSpBgE7SP*qLG-oZ=W(H?jYnI+So!mv!P}QvZDkV70<1E5buTGiFFpy1{040@OVf*pT(|vY?c$8HBvOt_CvO+)dC~dxlBUNXVttF}0jlxw z={tjTKzTDidpsW9HZI9XDNBB;c33=p9>?+QE_58Y5IIQfqPRQ*N6B$(&L%;CMFgoD z$q<)$g4C3Of!vMcqo<0?6zSVP3VUi}L`e$V5S6|Lv$bPX5X!`P0=v2ZEjYgvqec{G z47RVe#YZzG9~eb&|1r8%|nc84jUZ?`k zx|$~|q6Tz}vty~=Iple%tah6YQS2djm$yi&i+YAf=a~64r0Gr=+|KOETXV5wzOXG? z$W^_YN$h8`;LxvguTdU6&V3krj(Gt$H3<9%I=jKwW3j_XdGK0IjgPDb(U?}=sV9fn zUWjj_gb!4>+JC~$%wFFnl^kg6&OQ;mNq_V5MPWhD%(F)hP#ZMjCVlI z-j){SP45MXn>`w7qxki?$f?;zwyBrv>y{t;28IY2JtHVpu90!wZW#<)%0B4ZA$!9l z3Oirlh4ovuudw3Z{&+@?Z4CG`JB;j&#U)^&E#`~XQ2o+EsHDu#=+3-pN+7M3Y=4Gw zZg@@L^mTnn1Z#HQ>a%Oce*3dm_X*}PK3P?u0sLFh7Dv^y^n%ABo**Upfst8_Ti1D; zC{X+{V?Ep!KlL*wvbMXCdT+#R#f1%FkC4o=u0<+wc`+ssHRadsCneUhM~xmYo1A); zh5nXNgkM9Lum2dABv^utag3k|!E&2+yHlh2TSL(z9k7vIbib_ghW6Jq?I7GJBhCA^ zk~~F>kcq_}d=f9jcFXb(#-l)*v_6>S$j1Cxaa6wF6}9qEc(Hw;;f97YjkLp@cMIQs z?8Bbi1avGCVlxPQ?uI6LCecOQ-tVjTmKIo?PL)^x75537EY$ ze}?8(+qn?je!Prr#WH#a6!}?t_LTZp*6*V1GAy%FXi{^aLxyg8@mFQr$raHH=-X1v z;X3t(2ZH~i1e##Q;X?r?J5yav6vlJ)tpV$`JL7K{nS6IKwt>?*YjbkLe!z<6n)_pm z&H%#-oQ7C*pRo{3L-zcZBZ+sgLe+f-jy0ad`rO1dIyg_YN*qa9S&5|Gu0!Kw98(rqGKZIzr zl}(85sQ4lDMw2X5TL({2X~F}sILinq?c1lH%5>ILcn(23-7^Nt-DD7ez>Gn@x2X`J zgfHLc1#e9e4p0qN0c9`t9Qjdkmg6{*4k3yW6wvrW)deY0V!|$pl(fnwO*hss_IS|{ z#X&=!U-%XW@3RN6b3YWFOV4<%!rp)RrDtm6Xzuv=gH#MC9rE)#&EWn^w4X{#g=QZ- zi$A@S4;f`XF`Xg}0pif(Dx@&C(I-0Js$I7-<$`Nmk@OvTgeIBmP3|N2Gm^!V=>|gUDvh{rSp>)Z9XF!lOMQd3VZ{!ZS8{U9z;ql>ajCND3)QPEb-cSpCRrv3)k zT|J>)nvl!f3Q)^Y3i^CgG7&bS7&7_7KKOxlgLA0Epv6y(PdGspRtJVwB1S-RS$&xB zlnJ@1_58_9rH46STkt8-_eRsfF3?+d$Z+MnTGvr^tK=4k?M)hPkmbL3Mshek`aE5^ z^A)yXpxR3iE3?HT!##PKt(jj08x!d6nfjxz`p|uPak;K`aqJk8o3cgT3%gxl2r&qO z`k>qmg$q**NB}EKFCmFg-~geLOtIZ2g1gNr@?vnwIPyy9`Fyl)KCO>r2p`DI-#L^( zAxQ=ys*#^)T=57nLuG*;emlSM);z6jN?Qw0i7T6-tDTWOjH7Alnw`oTdR7lh@U3wr zAWj+JR=qdOW9#*S`6B+q-z{wkSHNNWR{CkqzqEd#vHuHqD~L zv`EzSB&)aIKvBS@5f8i<0(LI{cD4_Dcvx0_W~_HQ4SLUYh5J_dC%1t{aC*1?o=BwN zO_BLn!Q#?MznPP=W5Qf8c4MgC*&qdu=$ms#z?P_6#>yPM+#;VWUR>yMJoFwihI`CXL zK(I1j{gvUDuF?hx?Xv|NFqWjowgla*sutNp$8~w7WmJguCRI}2@#N0Aw1UwV1njaW z_vnZ&DuFAZdIpra;mjtJH=ToVBXwF1eI4t-znL0W(sT*YRI^QmbCK7sa@>(#n6EZb zUyzq=!v??C+d745(o**}9fWi`uVdCg!D*zpB?&6l!ANQ91R302{(GYG>v4I=v-q5x zhxq>76Aefk&;`qOv8Bg)SL199I3hG&fb2oPzI4zKY@~vIn1Gi2F{kYQ@EgjA)U@yQ zbIjU_mL{iQ)`^}fKFZ~CJyf{78sQn@A1)~uNky)3Y%jbm`jQvo-lVUcfn$jduYn+D z;|Nuj8+Syn9bVp2t0`B^Tqz4jSLzI)IBsz7l8ou9=X1OLYq5QoLfx|~_N5*Bf^DgLPDRiYeCr{IppV&qCd zd=_4HF_zcWJ%!i`wyX30k7yqu1)^fM4FM9mWd2zETzwf4oVa+m%>@uOZQI!27G|Mx z2ro$XqA+(yHk!CRODkoF-o=iu!SHGLl>}Vdie3fE=GOAQqTh($7x!RZt;JZ;<8$9# z*Mh=NLTi`W6Mk9h&XeSM;td;LU3LESh2%W(-s$gk4ZcNjCz+vFdm)#O{;-VZ3!7W? zBu-Uv_-cT8ucq<}wmn?x25i7;mg$;oIeGEw^E{1@78udQ_rYhod#;SK8|(+W^>p5{ z=Anc#se$q1z7W|DKdBA>Nv+Bp-eh6`93?W)iLt;z@Zi@ugSs_P_{6h7AB=?MJ9)WqAINi2zyA1y&%x zL*1q$l&x!6(Tj1}Iow||z+R2MG|f#EW53N;((%?(VWQ9|o-0s`9h5~>lM`PG@%9qM zD8}f}2puIyE_C{};REhRG3u=WMJ9wJ?1o6%(v1USJ*(u=_L>yGD>(ywKX`(5v1s?? zBhf;QyLiLng%a#qYZ8P}G28gZnBtA1G2>oOJmLwNz$OD|6i-g%0Zyq;xwgKqTEtBM#6q&gA(rdN$ z;rpl?SeE5f)a>*BrY>E4ZMCr&=pf}h!o3v1`drF@=qao8 zjX6dT_WG7oLiFutch5=fGj2H|qg3^j`*|oNVAFp_X}nQM#f%O9?7zrXDM z4X$S+<5q2#c;}R7@ipNfw>{4vt<7yT9Mt3_W&7b92(qK8wEqyxk_;==#=+5kw3SuM~E}<^^nP^d?!vEm92O zCY#P*R#gRWi?{AoX03%T*Cxfoe^}R*{=qWy7f^H- z#Q&iY+IWA#ag7h!m6#R#HYiRJP9e3vvBPlk!eRd9Z5sm3z>nGphLua%lfv*@%WzZY z(?AwF=S`imVO-PSoTT=ob=gR}W^wa`vJ+!#hWd?re`CQR=j2Dc3dsHXo#e%PT4Gt|qxF z3+HPf3+~bygs_!gCS{48J69gx3}n04!v2PXpxW$2(-MgA194wJ%S(%>*1q#fql*KG zz$~rp+6JF*QZekXR2xxEOU=#8qWxuAYMfm-l0|78POZ-QEDZ7kM{eezmHq3P-^}~!Ny|f0 zN7~d+*DpUaviAOz8xv z)+C1#Cep?uz3bB9^Y6(akGQScG?DYp=B++I?+?0*1l|kL(40Mu$=K%W$PN+Wd(hYV&4)fyMy_glZ z)0w*m;=Z=#`a_kI9yfi%gMHWV16e0L{41e`(N(QGYZMPp*#%HcBl@{gtb=*2Tv_s8 zLrTCe<#8sLjVlVn6sLcSJ31w%ps1hoo~5!62nOE40U*&p8`IP2`Q`@eh+0B?&B9Vd zkmhdmzTNR_5`=ZXF(9?VD#Xk7*GYUvU+C^aU*bG=xN&A^DK}{9p6QGxtTiJ2J~EyO_^` zI-jU)h6h^DbpmC{Jd2Z^cE2B7Vq5=`zRkO&n%@zq>(_%XU>|REm;8v)NC`TQ`nm^c zYe11nEV_pXQ*DCkOFF3XU%#`4aP*_Qt&^RHiV=WA zd+!hP&HH-}&P9q8w|aI8bV&wmI~BP^I98Cv{)As>F4>dw=@7c;`E|(GZkj~W-WH4p z@B)_3cX|pXh{5YVzr??0ymWTRvHR*8v9l>QXf9~u@#gs&7%(E9{68j}G@rTdE1|6I zLsjWpZiUi6!qyFKz|L~-!e7i_(dvIjnVdOz-;)^~NNHNC$0SAfhQYq`S{e)8OY=um zZ5}yqf{O_{8CakDIC10x&Qs?&oxPcT$(Oywc6jgNO&9XvNxDK$XneZBcU<+T<*(l+ zy+8fEGfIoOnMI13yZ43U=0&ZPU#6H+K&gO4NM<&f&h+DrQZoQ0HcXwIP`Io8w zWzN&i2QL+ho8sXCpX2k4M7K`wfou;7f%6&~gC&R<4WIO8<{=kTFIy5fD3h-Hq<_+} z$me%Ny+|=zG3(h;0IjcG`BP+tW@oBB1mGU42q*}yVKghbpB;kOY>5s%eGEmo#+{}f zQ>QZzV-Q5$U~6LE2oxz=8%fq#uECJn z+0)>;4$Td^lXb4crfl$is32$R59K^fs-mbm?6|3~o|t@86!k@&cWnTXtzVa9F7}=` z5~!TP24z@uAuINZ13szxv&gjfY5Uw}oPu?pa-m7s8XZ0Jhr95CxMSJ++=x^(#()vh;CYMBBl z{U1{-zu=?kX1Lqv##s@#jPPO7H|gZ=+f5xo+_oAB>NbjJd$E0Q(BJPhP3`C3k_8E> z^Rv^@dC5f<4dkBlljxaks^)h}&7xn_+NuJ8 z#B9n@gY9}d`FeWHRf)T(()szNPV4LRYg(`Gj6^zebYu(>IpXAG+zL&5dz?-p-ucI9 zB;9SxH7~`=>ipcR@mh~3po!e~3l~E9=WabCvMlXM|6E(zgsH{!-FIWectpwTK4CV0 zAxaAR7{peKV2>s{P%Q(KWwK=9PI_$|3T}bJ6_j!YWP5HT$1Cw>r&X=TZ++*C= z2|4LUZqB1^{0c4}ZNC{iZPA{V&s4a}Uy1l4t%rGK!}u;{v$%t&sS)C$sEeA^!Klk5TXGT=fzr;ELQjkA9Bxcmr7`_31AFt$793OGz|hvTStV7;d4 z6H%z=oC#$Wg! z-)$O>en!V~(3ms>U>3ug4UzUjF=C8dqKJ8)i(i0cK1Ff`p)#S1Y$DZk#lLocHy7Af zP6kp}L`s&crbzY@_u7JOm5OC0rNXrN_Bk3T+jC@Ln6Nxh8y5Pp159+JX)Db?lo;=u z!cG$%4P=9C>iOOAWImkIJ5QMw2Ex$uW9c}5gMAKN^)pS~f9t$&%JbvLzv&x1P@U$! z#}*T@SBELC#O8G_%mQvTzFJu<8g2Bg?P1oVk-9I=zQpYY$yJO9Ma#u@0!)+-3Ff@K&|WEGu1)*=%je(KZ9aNQ*%vD8*D|0bMyce?SnEIjI#z|YAXq@Q8ePZqk9z`x zz%9_Dg2{U)1~U(|oBnpI_$!6LjOVF55I6a~Ui>{n;2pmZF}%k`n%Q;(r0KX(zm`I0 z-JEO!PKM&@02;FXfqSOB>=5_d&0Z_@vSwRjZ-LutVKzis*f%;DqwA~=bCB-~Zxe@#39A-i7M@*c zjwvTH^y4Ro2iZkJBU6ze(D9z80^T*upi(?`pux@S@>9+dpckj2F>jMcOeEBRw@hhuJq51;^1;AH67Y@+r4nZ7y0+S`QH@XF$5>n4R#8^YE!vsE_$Es^lYi|6tn z{I?T4>&(0tu4OQiC;nV^HF0p+c6Y8n{kdBVs>(0r_spawp(~_TSz{yEsKNY;UxBvX zXQrFu@JZ3BV(~h^uJ^VKz0kY6Dy%_ai-hTGD=gLxsOFJ~dSQtJ?OzN2o4tbM?#q+0 za#M1&UdXob+{Uf4U=37*5z}aov!toIEYA(T^z+E0G{0Aj6_k|I$U$7`b0^T*SWD3A z**@qtg{5CE&N>wtZ=1Vne}!om@th|nr1Ir z2B--q{82`mGJYo`L^U67Y$^vmrm;2DUdLi?gRTcU?onK!%Fd*CVLJ109K=o9{Xt(g zoeNkHX?`fDbBK{Bg+D12@#}>r|2K^4_xANYMD|A03_oXL5J)<~Om1#4e zQ%fPoe6ygs7O$=QJSGs2GbRGL^-}7rya-K$wqk=syKZ;mG9aG&Ph0_eXk(o=^#ZL7 zhiT6a@q63OglCUf&1{d)yv_y-7}C45loH62vi+n@81`9KISYA_{ImQje$lq|-x3h= zs{^-0Joe4v5Iww;ddTI3>~)4J-&BoQm--1fda`Y^nt3xf*}Q|we=YJW-nbMCtte`@ z#hxY4sD>zJZlX5uixGXOtH(l;$(7WekQwxy{}ks*zC=6N6Wid-EQ-B@r=+lov8S&N zaGcqhX`V+iZd&PN!&bs1oN;dK}V>n<>93r)D&UQ5))ly=^JzBS(KJoATFu=my>FsG$hc9dtun@i+t@Qc6>4s#PoC;ZT05 zU-8@3ZGHdZlXackW+Bka041-vs+Sx|4CQZK_E2_g`2;p`+WY8a>~nvbO~)|*XE{}t z+l3!z2mz)^God0Sn3z#_3kIe^WQ-8MQG)YP!mgqV$pob(nfk5#y< zBMjd-w@?=Bdre^QJ?=N5H%M$Jm{P(Fg%W^70f|mKJ0*CpRw8Ln9gs+vEf8c=r+D7@ zQ#y_bMp7U!k-{L+lFz&{&ZpKMW7(6NYdJz92zZJQQP{GBj@sw^O0=condj}nIi==+ zpM6QmmV^8X52bb!2QrmAgmv*^Kv&$|XS#G=_jQ_b`s-w46}P14b_#yh@mnYweI9M2m@%X|LeQ(Z&a6Ke8GbJAZ* zg%$2PIWv6bN|Rw&*YRt#97^SCI;++a9WPonj2~5(Tu(=~OxW9(Mo(Rc9`uV3=tUpF z)>;gFiiS45_8d`8-bdbk9QF^0Lj7$(VU+`tx@-C;_i?U4=uM3Ug76uE`R0bu>Df5z zh3l}%%FsIIFJ~r%#GG$kU4qbC1>MH~WBRY&B$cm&=ya0lS34y!6ZB**5%G8_QUBJg z4s38-oj2{##D0ZFYxg%v!)3)ho%voqOdY4PveETeFG|jV5X0dg(;~`P=3H3DeK2u~ zwAWn9SE9JO(yeBiIF^#zPp9iXw0tF)-fe2f$@Me`OTw+(UR&6-x)@@w)`Y5^q;r@W zw;^@hnrf!Hrk`wpy?DhGv~5jQk^T30*)+8|s!qVN20`kdsK1=vKV^+uAso>?v zqAOSoV_UZ^Yu!ihb`Wj8jZ;PTwruS>b;GhhY+tplExz@&(85b^QktA+WXZV&JbuEo zRN8)!7Ms3*hV3zay6P>NYM1#1PNJ|JBRFs3AT&PkR~Q*;8nmFE&T1H?2-0jLI*1-- zC0_dG*5mLq%e%`XiXM41vL1^Oyg05yRM-zoqVX}3OuXx* zh5z7=8{a;+Zr5~@E$G8*q(<-eG05=MREE|Ec)1lNs53DKIkQeh`Op}j=_H)Gdp_lP9ov2`*R zDVU)B`ebZq=L;%4@R}nXK$z;PQ-68+L&}Yf_DfXG!6S#XG2D%-mmIbmVLjx<@^ z<(nwHI%w*cU7X6v$r6fW8@%OFfnk|GjuAsc=aDS+w#;EVf}|iCEE?<_PD0%olGH7tfKV|gu+aIWLzWM zE1IZX8mQ!{(@;}{f4KHXWCnJVqcQK)xKrdeh4;If@(kb3Grtdn=$mgYk6L^2&7>q> z5PLL3{*VnUmmy6b9u>lbA#S8d=V3#fm>vg1I=pQeB!cB+t$%S!zx(N0;*T21P42>$^;zdE|n_J?<+p&ja0R zD$fIcXE$L=rBx#fU}0KFl2rKW>lZ3E;W=t|E7Mo!Hkmo}NLoVtdv@DJo27_BHn}PGtg*^MoDp+g?%Fe+OJ;=F69?+!>au?jGd{ zk$F=eO}L_vbk0Parky4Q0lMzH(RWAp zNpavHcG{hl*4Xlif6_0e07;#Snp@$uB#Ov{c8D~cnc`@MTWYxHnwq6VvT#Wa>8cGQ zX~&177(VPng}4+S7hU{Ezb@?UxEFzi0HJDVd~1ugkF7ZHUPUh8Q%>lTLM zei6*ImHgN1EtS5z1O|x~>U;vyC#=Co(v*a_QK*@Hh9+7 z%#~IQ;d5@o_{ZKf`xq1VK~a%U3@|88R0GjWylC56`=rY(-1dsuOV_R>)7dQ8Ex^SR zPQKDFDOT9oT^zc5U-cocve{{#_@`uR9qgdsOIHSBhMOGY*q9tGq-Y0Vok1uB8&^^744RHY7s zzS7y?YcHvOWi>1cJ#;9 zG8b!Ovk?NdWtzp#x_$Q*z(OqPE%wMeNrHvMOJOxs_C|9Lbii!n7aU9e0~$;HdqEe+ zAv!nAen=fK(o#aOzP_#W5X=?0S@-=NV`zqga;%sW8U43`%j6?z!rT0_IxTeHlbcJj zYQ1wi88LKCf^!*B2-h6JQtp##fW0_?3{8;=ey^Amb2;=H#$m=Cl<64ykB18h_p;7nvs{Y;q|=0j}bR`%8ake;_h1Bqz{pU5p9H5e9UVdS)OTe;p&OBHNIU z&OaI=-noP6^)QPA+?y`8ppZL(*1o7=Xsf-%jh>Mj!=4OmYCL7_ikY2}XNHb^q ztAYb5%&0=1!Mfj@RROMTTzj0vt58l)y*t6Gk}&i<*7JT!WNVOQ1vd0egWZWpsrOP6 zo^?^U>@v$<&-5MU1Sw_{^imi~ z!?v1(CD~W6Q5$Wqz-l$nU7R74ed4Ex6DYWz3pb8*CC;vZYlm|8_*lCTQ<$`x!8O9 zmOwgGXRv-DR-ZJgDqGded*G zrz#$P$Bktp3gVL?hHACl=oq!Ltw87H0(fZD@w1y7cHean?iSJDLD4<$^=6gbV-nL^ zh!O{ruXgIw*=_acd|ToAxh7)0aPoG}`|=y{%KtRSxhM8~vF=5+0-3d$1;{7|1d?Nb zFqssqMcfKom!H&0!sf8|Ke?Z{f3RoDEh1Ec#c80sDSm-FI@d;7tS)}OoR!oD zChA<$xRouOb*TZF;pn9S&veBgU3H#}T-^EAXrZ~|TgnlOcy=<{TPxk71!%(LTTflk0qEQ@^>PYvCxV`P zogbK8rTGG>!Q~8Ehw-lk)G? z$VVWCQQ=cg-#BknX@G&W&?m)6x(b7?l<4hs)gbGolBZATCDzTD$xQ)_lBhdr0QX}K z@KZs$Dn4B(YwdJOUI_Csq?wmp?4ST4&lBbB)&`goUfZXN3y4$@WmQFKyc_45O=Z~O z{pn8(qv*_p`Oxq2@Kft&t;qI&69*@T)Nd7%<+Bkb1_AyZn@o9r$go(R z3%_B!m7!Yu$KrZ0!e-R6|0^sM^8OW;xD|cU=St!VoGBCmi7Dff_5$XCC2frn7~1#q zz9$>R#|$kr3s?Wokr6q6>!Y*pqf?W?^PMf6L`v=9E@5!JavfQLZ>@|7bc!)Ut{sygM6t(Z@Z%e}yl`ewO<@7r^w`VN@uX>F zBqcNdW*&vfYm96J`)$tZ>pWVod~2Mab>A1NF}=^rl{gp9VIE|a9iVPLe2j1jlHNoy z{TR`+T^z(4SHmjV+?Hz85Fs%cnN54}ZJT!1{o9PM`e7_4=3|<9gj);^xXCL`UzK!? zKX+{BinJ+IXDvlc1XP%6Wr7@`k(!*YWgNX<^k=xW zA2-eJYA?x~6%I$kvcf5HxS*))pLMSBH?FufizD+Qalt7fKhmu+-S;+&WW?-~!S=wK z4}-EQQ#JO<9U;6x%m72l$Pi~k-8~8WQ3Vbv(C?v-DZbr?yKFQ6TPQN?YGH>!&F1F% z5iJW-_2zZWY5uP!F&Y1VM+G4N>gw2xZLViREOyS)T*&I+_lu+e-2Phb5_iygah)F?3BRn`iubZ#upN3hZZk;^yV5@t$fu6S zw&|{BJnt<<;JSa0>wLwrJl)Z_?}>pU=%1#EYFIU2e)v2Zql5 zVvAs%D_2ya?8@=FfEnD+O@ri0&7<6WeY6{}BqxV(rkhxoZw1J=$s%o&5lCi8Q5x49 z>&6=MKC-JwD*I!yg{=8$9-*T=lIjWK87N!|f|q<9N1NNAftS zMC-5_>~I7_f5*Ba*6iP-TkPB-R0V#QMVsLt6hUVb^&2K)v=wu;Bkl`puvCJ@Pq5~* zj!yxg8~nBIzuT%dwD94A+G8>guY%|LvaIbqZ;}Nor(=v-#2$fcm%=Yewuq8=pZt9K zXEiTBfeoKen)we1=dAArcrebO-?+Mk3t@6y17J{JKbQZ}WeRZH{!5Ysex?GToJzC@ zIuq>KX z3CNa*Udnhny)V|MwTrQKw@Bmeg(#%YrbKSNn7q^6(b95HaW7DcL&QVQxQdD7E>KXi;@$7(oSI{(kc>5GY3csTBrJ`{ zzBdaDu4Rs3Yg!29&mYggxI(C<#P>UXaBKn`Gegnt9wh7HSHsZwMp7Vh@k7X7gqSpM zDinr{c`%iSTQMtziXRxT28hLP#+lV#Yx-GIpa7J(u|%|RGV8^RNgX0AU+)&DMbNBk zx&MOz-=_Nwp>34E znIODw2oD86Q>MX?hHNJpiz7Hh!W@1k8QHC8g~uu%sNI1f)ngbH_fM1G*gH^;3)SDp zoff+73Cp@ow+buU^MUnELO5?x$CXh4*#xfqMM{{&{2Y8 z@eQBtBkR95aLz~KnT$^YccLX4Lq*KY%1G7GAH3Z^CkxyWKf;bLKH@!M19R>x z_VF?d97Gj$BmbvCtw^P$zCGy%%T^CIgzIb;v9D*;|_NY(x!DaloQ zSWv!<6Nw!ShL)P%Sj}*ZyI-S21Zn;^@eALoUHs#+B3!OPawlUT2;p>YuwH7aC{$#) z=l=RY9n)4m5NtJi75(^rq}bnAlakvJP)xmUmJ zVQ_-k!C}e+`EEl_OQEx@RsxTO67;6z%{O6PK!Ib#r$LpECo>i@%#*kZJ!D;=%3r`+ z4QcGZtetax$%UzGoV$QGJXB82ijJMV8+6KJ8Hqt#(PJA`QVcgj&Y)jABgX&=FE+dI z+Q`PLyr{AE!&vj)=%iF6q)$vh@;U>O2Gu$uC)!0nw z#~7DlgY6YQg_BiWZObEvA+rcOZoJ^KktkXlk)^GCa(TdE{YXbAhs8^J4>aRktkK8tMhhV|X7Sdl)JsH7q^eRDk_Mi2x*|0lH zleh;QRM%oVr#)ULAoTfd#6NGo)eM)4917+Q$rK~jH z1{JC@G7x!C=c%1yZ1sGU;G$S2T#VZ?@l$urj&Q;?h2N!Wx5yU9ZS`^EeqRhtdyQvg zcGY#ABstJKmv|i)j0V$Lb}IZC^nat>g3c`-J;#5YfvdmC^{#@d=C+f02et}@^W876 z+f$f9QAZr)hSt z1#F~SZ;T-K0TF3V5L#{z^oHcBNhwa;E%3dP6*0Oe*|jF2Anm?eM{muV9K!iFFhuj( zq}mJ5e>ws46pEZ+bhP#i^vW}VxN65>s%v%^Abd}8d{26jKG(j8i|4v77mKO<^Eu;&1Q48V$rF5c9-OLz|^P&Wb(ZF@F_*X(;$}S|GH-V zY=#fVJG6@DsOi-|)RPn)%2e6)F-d&^sWEu!ZkVn3_%&7utd_Nb?`q`6HKu%mE1D1R zRT~>J4cA9yz4U+SAFFY(ryez>gjj$1-ML$4mO`&n*kLRC;=Tu1vsE14Qovm%X|EVS zDWp;SyQTqEu7Z(=X_Luhml^;d?(bxa{mT9zUif8^ejYKJv8SvS6d0Y=QbCqDQk1bY z=B^9Ac7E$q;D5PO1G8mOjVUeUF|VLFm}U%AL7-Kgucal>{{==Z_-onoklBfv!CSe~q2ES3z?Qd~jd$^miSo`KCZ0U0OacN*K8z*iNp*MX2P-s zUOaxZp0U|K`86HK@NT1!?T+{v&zS1IV#Ety|C|Raf%W06F;*1NK5ANa1{d27-N1iw zwh2-YD7FGb%GuC64d+w(KOpSQcdbkpUyGKrthf`}GUk7DQeJI@!6W)T3!nLX z+Ng5~_S10GRI*M958*rkW#$&??$7=$dBEe%;jK3HcLSJ;b>0^I@%N9f|R!O2`e4P>#uL&_BY<-hLp!oX@U6?>nH*&4leILemN^$)7x_e%3;W zgnEdDN~6;evgN+k(ems?+tA-IDeA!BqZt7T7x-;(+kKaZCft!{`Ou%O#+vbe zh*KeOSmr9pskEpdHu&0T$N^7lS2F<&L-w`S4Z4l2f+C6#3%D=Zx4ekL!GK~e9$krI>B9pN?}t})ii0bG!^yDK(Z8#ej- za$|7J)4hkakH{8kz5y?u?pF9N7GR@*T=65;+wY2quZA6I9H%cEMwesod)?Q^twEy` zwNfe{nzA(Bx@A1JbTSf4LaHrZ+b3py#zg&z$_l^9 z>mH4;N4K6J(pl1rLmH&%b0(Op~r1UAgr8{(MMylVMV&+Opl9ispEv7kD8S z2+1SasDl;sKXXh4R}jl2BFhGU(A*PTn%B=8-l@#%b7ThYl(JF(J53MT#| zT6tw$X~;{STD)E```5y<_cT{t;qC|ra>jB`+Rmx&^~ttuXET{&?0Dc-FT4KA>{wP7 z!SO>UnobdGzrcHkV`5$tZZrF_$!uU+Yv!yT%_&lLmeEk5G+Z(n&g^oS^-mJE%^Vrr zJi1kRV->D~62byEU5=b-y)wTPY&t4>Xdk_8Zcp%s0Lmy;HesLq`0?EP;LYEByX`pz zo#CaUDKS%SP`G1w5V=xVAatT;I=JFRvTq6K3%_F%a6ws9&6<-W2yCZhl+z~8t1=NU>%*4IgWVZ3lWHIm2T4l~gUNPzt zoms6DQqX_Rdn#U%KMy~QHFX^(%a;0k?(Cp*v7>?Le&d<*vOhc4*d^vwUgpkLm1+L~ z`-MOE>1}tisk-lyFP3qwPs7<0LPz3A8RPo4sf!Kx$*tE~_|5-PW{ThrT^w^}pArN! z!qI8p+_f`To*|0sBi>I}A?y}+$?lKH?t2ye=6-1BW;0i^Z*@Se5ORhy2@{FmUJoJ@B2tZ^aY+C_KW-ZDw2M3>VfgJ#S~z! zsq-8>N)3B$zeQnadd*P%vv-@TAdoCKY-7`@^0F5^wNHjJjrk%)dXdNF+Fk~)5ZMVo zTw@)9F;&Y*@R8DyBf{n^* zIHaAm)0jKhd>RP@>Mhd0qXxOQe?1Gl&BB{HMY*O3)ZAyxt*<^Q;9y`@w@s5@Rs4BB zy7zq~P49j+`n?lqZG$QxZK^_ZDG_460<8^22ZEVn5xfPuGx4)RXM_#!;*`kwjkN2o zW|3wNm}LXWN_gHcKHK^7yN@R`=~wIe?)UCr?28?kWDy%?lc#rlCYEM|3IVUXs%xyD z^;W>2SntpX+cznKYgVW*BSW_Y8@Kky8}5Hd1vLBD))`#Fdw@@Y{cMJ#G@Yg9Odph3 z^?F|?`7s?CRyB$C{J5d4&ht@WdNYv)E4w_LotORi-Lck;6QTwz)IdPH%vyex)N5!v`BJQrq*acxw(Wp~8oxncNMe%sCZ_~EVZ zz-x+4SnADX1&yKt>#vO6akx$C{)}XkU-mZiHRpSfBNl0h2WBjFs-5-sgN5sfGBZbK z_*MxFSW|QY_la?IrJ|LSp;H_)PmjzDbobsnkyd73^LsjVP8)G3yc7Og=s zBF;*~$hhR7cRnu?gKL;ngDba=R1vBkf9&9b6w))UtJ+h;wH$9b1GVcCBXbllr4BRf zUoV4H%g|YOrUY{1rLVRdJ?6>mt)D@*KRC$vn|IyU1BUE$n~Xi1p>TsO|I1lL9Vn}+ zbKd&L&|YPTw8l|&flA<4>;MHuCZ1W$OH#y9RuY;sgqriAxV0a3^Oeq`Fy-*Na(Az} zwX{Ehn3&WZ%*rDVY%jZ6{2BwYV&`D_MC+DPp#3s6P^-PkLtE^&9Mx-5zf zWv=y)I>~HHRWmjN4k;i=vsCO5I$qFqc`B>$YOp=M|Gtttz;0J1I3$|3Pyr8l{!$qo z-W559%<>CU6&%ioMx7N76#Ap-01}{8Ec1$X!OOuDAq(-llhg5^MzoTW?0PPUty$lx zKyW1fMVhm-&4Bas=^YZSoBQJ#K_w;>dd2u=9gjmG*j&Ya{$o@iELf9|rxq1;(EeW! z<|%JP@P>OBv>a#P6=ysUSJgLOc^)k?f?gq+W&z0n{?!eXbMuVK7xY&KF)9+Z=Sj4N zxZ&;a;lXbq!lsQRz)t zs~UV9?tYubWi{&h>fIy0VSu4Pq0L(w-VPKIR~;UDpPcHYvLW#0)seZhm|slhVIF1* zYg*M~aeOU!IBLrSos7QD)c5mV46T=kRXbsYs{X=Y-MjZ^ra%h}<%r3(D{eNV>f53( ze6=lL^%k$OjV#2`hUuAe>+uoP~Kab~EHm_Bq_(?((kGbJ*G z##zqa@-jKeqQz1&iURH0^g)4|NW4Fjz$Emw5d z>=s2RhChMW;)Eq>XePjJY6yAW3mSlUydSCC`T{r_SzjKdDPT8_D z@me#-MF;h>jIEhIinvOkHFm!l=)6vUV!GSBBZLSN2}Eu`4uM~>Uu=EvA(uF>pf}>L za&^qGg&d(wRQe8ifmGUNn2H&emF+8l-T!08w;6Ji7*#i%#s+2WO)v9dz=wQ=jvP)e zfZOg=r0KbtGr#{aF4%cNbiK7%N_#oU@y;3t=^tg}zG60O`<3+#P-^hH{qE9|QlK1b zwf%$g5bkKa(BU4taa6tSj&_Qx8sLcyi5+TkpJmC9+~Aj5zO7*{C!1=A(5471bg zWEc#ayWsna=N>qNN)>+ ztjZ*_yW?esM;AyMyxtU`KCB4W?q>&hjWR}*PRm_EUZsM^W*M(?Rpevp~n}%^8qezm$w|%ixJ{sE0Dug>H;Tv*% zQDlL`B0?l&2fZV7s}aBwYkZ#wUhy#kk;Sx=;(yG{XR4EayaOf@E;}cc^*-84+|#xhX?$^j}5*~5B?W)x8kHRgK|mMjNqy{ zPK_JF@vZn2rHaQ*tHk0gu$C+_h0we`!Oj6px-VQyob2)4gLMhoy^T)5)VfRG2nP>G z#BHk=5qNo~A``#SI%%a0N@|JA2m*GTO^OIq>SVbj-$gh#EZ`j~pS1L%f<4DShZ&yZ zd)PbeKB+KIE&;u4jQ(s;89Pz6sNLkn8ZW*3pZl^B-JNu9j^jG8{(KwFc>)R6zd6@S z&JudF_#a~rjb=+qnsE=_|Bg&G2X|)N?}e^VY1_8uK81t~=l5EzTPSz`PPI62E7R7+ z<+;h0@?k~l2MUSxfimBH9^38G(Jr~W>yFLFzbWSi>d`qwA-h1d?KN?9T!uej6s<=V zkU6#faeLaV=dy0}(~zVYBPp{d9i;z z$`5#bPp~6z3ojbrj7SA6~@!)4|Vcy3y{-Z&W|1?5x zw#tU*k5&~?AvP!rLIE^$ zoh7R#5Ve(Y&I)Cuz(}%l(?&RVWN=^FeU$)NHHZGn7)REqT2TC_^lK154tfm!e#x8L z0IeA^OYh)bNZ68OD`o@)eH}VE$z~{&lHvZ)eh`m6L2PjAJ=m+^V~zLW1rJe?Pl%1v z>+c#TIntCJnNYz>^V`-ibZZ_`So2B`PJVL`dKsB3Vm`Ai7KuP=zM2{lJSX-NT=ju> z8Z+D}_r%`rUuor}0eR2R5L$N?oJ6_D3j^V+k?WjTX8$LPxI{cWwc$=A`9L#X&1Cec(S$wzv8~;p#_I#<=Ua6 z7Jev8p12Q%_f~ENCaz+oO70%09AHX|9$eZcZ~{fuB6kB+b2!{mW1VRv$iJyW$L+n2J( ztK4Pos4}USNz4t}=+IWh%?-#v8OORrW}CFlABy0GXMx`l95W zi$0m&#D834IanuyQ?AfGC}fb@LPO2Jyge;Msr=1@u%-NYZYCm^z|Zq}wN&t8h*@go z(v$c9tx95$>LsFEI}yZ9;vaxWZhTdt<~>-5MkfCX(5|W|EHv+^kOiilXfS(;ZM(1v!#k?1KUm)Z8yS8o z*wp-wZb6H1%ue#LKe+ms<_{LEwf=fU&v#+oyv=+zxS+7@xV+87RrncPtN%wXz=ouK zdn&RXp?5Y#{xJD`8xR}%C}{kG3z zj)9psa3i~1U0{;iJ*j;y{8oaxGUhpnrQv*t7tac%Q_ZmSz1)n6nSkAS+z@J(E7fwV zA@#(o)CbW!=sy;&u;)oquyX!>!`CdP*uqK=%0G_7sx!^3R-^_iVRB@eRUy~NUU)K%(wZ_>HRgOqLC&`O8v$wb|iZ>S0O9wk@4@7)QU=w!Da zS_P>C=Lww(mR(|Ig?x*%e2}}N*O!<>Xw zPWCG7bVlHq^cJf~WNu7Bxk^%sFO;!mleW6fB)B4ePyPEpy4R<~KzDnaQ^yl`#=wi{}XC^;U?k(%2I>bwr$+@*%_|+hkPT*^oR>~Dxi(H|P z7J!YyCThm$TFmgRyCl{~nm^e=VUpDZL1PIFGq~RUo~H>v6?;kLelpUdF#EI4-7f9M zC}1WML)J6SHr)~XS5615I2wK}^VEB>AZ%QU<@_>&g}+Tga2yG4T>_7N7&w5|6m84B zn4XsBZooY3sBen@AKjC8$yM*d4BUmMd=%-~!DB;9Tk+D1)qkYp?!O0hYhD<)_-I4R zsXE(%Wp^(t-SfWI+jP`x>xZpHVIBr6hj5`D^-}4YW!c;a7EXJ)(eNAnAG_i>EDM&M zz>ip#F6+FGuR%;E1GnJzUKIuiHUG?Z8r=C~#-E&A_c{IysBYG_*gv-Iib9_Nto>)k z9$N4Pl_671FxZM7Q+Q7rQ7q6nsVg=5czC=k2E?m>BiY+pSS0?fGogC=NOeG~qyn-| zk3CR)I!d-)lW)Y+(j=7yBDDN|xaK3&^O4`ft(flvk!3bMt`H1F1hU1ckr2T*p?;jw ziq|t#ABXQ#=p#z-1@JN}8r^=)9)g7_f;ta)S)zXB{w9lfY}=!@aJ)!#IX~CMW|&`{ z2d8c@f3Tj(SH|d)*gF?s{}WXWoP##u<4MVr66aQ~yeNCL9aCz$qPB~S#ly|h;>H5R zk!oZH!3y&?#&6b2Z%A#@gTfk6mAB_rbXsIuR$*L9XrvwW2VV=PSZd+>e7r%sbqM>q zhCeZ;YynDTev|xKCHIMU8^SZ9i0VE>RUiTD! zN*f4%GB+W40OV-v0bGq@g$xAbMHxNkooWq@vG4r0aFc8O?zhNvZOr>PeX$f|RwkVX zsw7)14W8s851-PAn&m*+l>75mKWf;<^_u5^giFWty=QwIJmhQ)5~+|aekcSy^6Noz zP+~Gpe!UEvjl^|V`Bpe=kbLNrzR8(5Ok07SFZcMFYlK`0jY1|-jT|H8$lUZ$&M)b& zJ|sYSj2t+#BeVm0_ITnWsfynUp2X(e=Jrp!)|1P{+-enSY$aC7Se5;lgjU*3z1t$b z!`JSVJ|KzUwA{hX2xZKB^^J$VWmU=TJmA-huioN}b=A99>1f+D4aNBWEUX?4ztYu8 zlFd5K(9VqrmuI0_t?|6h$Vh`}C6|C)3Gy~6Y&IoPw#ZTfJ6;nS@U>LDKNfU-p!so_P>fY1B07?qTT3Wf3Mb2p9 zE=qWqbdR4KO3zqPBU!e|8;z@la>yex_UjF<*CcQn-zuJj?|Jv7tg0N*YvB(kfAwEj z3g_vfx9TXU=a3srd16_{Lb(AVHxXno&#!zkE^z*mHwzdn`DvyUFM; zS+I2bCCxSAs>mDo3p@XUtO+{&%RS-FQ21nHMaCq1jAgx%#Q5S_5IoHL-k(j`EJ?G* z0R_~IIa%HIbNgql-{xT=%jT&{ByG8h^KlMH3+(}>TKM5t))l+|(dp}^Lu$qMadmT< zC%U;h4FjN;mL|UdH{nsvo_2~k%q#1+e!hk6UcVyKh~L+UL|;P`(MCQ_gDW$GVVO@` zPW~zIdWnsfSL{n;eyzq<{}Q&Bm=y_gm)=gE52lNBki*BjTGujY_#M@~E=rcm4Cv7N z>R?pW=ytH?(#prN84UNxJk*TE-4oA9;aR8FuH1lnn#`q+6#X8n;82-;obV$s+I)Io z^IKJu?-NdIHq)F1RleSb2C7Hmnz*pv#{9_d>=7z02f%ArHKKe_+F2G;NY26v?N1sEppx2Tf50aE5Ukkn@1FB(cUSb|R@4d6j~(8uMkTTgiU;g=j2< zd_ll^a6YPgKRj{o^0!edzHLVoRCiY&X-zOc-j-2y_deLCgDS=j8w;S7w&KjkyujMq zO0=^~c#JywGx;LJ?{bpLP}$AgSD(HY>SmQtPmJqkf*H|9*CGV*CQv9sdG~zW`Fwap z^{OM$UH+zcM%k7i!sud3by2YFR=`R50X=Vt5t3loJk;z$Q8k8g41jRZi_YAtM_mmA z{}kupKiymnJv&J~D^7HMxX-OrOJ(Qh4&*m>q%bbj-9@AB45;({-NFqDAj=+vrzsME68{?bFF^aBDhNw|M2)WQ1irFXG6{t$JNEvdGT_f{}+ zJR?Kgh2~b3^~sV8onUEQcyDSq*b+RsF7;kkSS8b-X;G0)l%i-C=;J&{c-JEK!sCqN z4WxVutHlf{{}mqx2F+%dzadK)#BK9&h`7iB0*C4) zzONW=Z8LnzwOMnmBCVX~_&8=@d9C^gKzhIhL1MxIhLv3G|P> zF9JgB{U@6hkiVLGT4$(&@Nbn?tS`8uP+EHcGR(Dr^JlH!H`DOwd

    ;U!gzcxFodu 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 literal 0 HcmV?d00001 diff --git a/themes/batblog/img/profile.jpg b/themes/batblog/img/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b40fbcd2124eef9c1f21a96cc522b2cb96abfb3a GIT binary patch literal 33959 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

    Pzzg4CaBrYn1h>rov{ZC=Jv*WfTa1g69rvHt)y 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 literal 0 HcmV?d00001 diff --git a/themes/batblog/inc/footer.html b/themes/batblog/inc/footer.html new file mode 100644 index 0000000..4613deb --- /dev/null +++ b/themes/batblog/inc/footer.html @@ -0,0 +1,21 @@ +


    + + +
    +
    +
    +
    + +
    +
    +
    +
    + + {loop: $bat.footer}{$value}{/loop} + + + + \ No newline at end of file diff --git a/themes/batblog/inc/header.html b/themes/batblog/inc/header.html new file mode 100644 index 0000000..85cfd8e --- /dev/null +++ b/themes/batblog/inc/header.html @@ -0,0 +1,45 @@ + + + + + + + + + + {$page.title} | {$settings.title} + + + + + + + {loop: $bat.header}{$value}{/loop} + + + + + + + \ No newline at end of file diff --git a/themes/batblog/inc/sidebar.html b/themes/batblog/inc/sidebar.html new file mode 100644 index 0000000..0daf7c2 --- /dev/null +++ b/themes/batblog/inc/sidebar.html @@ -0,0 +1,56 @@ + +
    + +
    \ No newline at end of file diff --git a/themes/batblog/index.html b/themes/batblog/index.html new file mode 100644 index 0000000..9dab16f --- /dev/null +++ b/themes/batblog/index.html @@ -0,0 +1,31 @@ +{template: inc/header.html} + + +
    +
    +
    +
    +
    +

    {$page.title}

    +
    + {if: $page.desc}{$page.desc}{else}{$settings.description}{/if} +
    +
    +
    +
    +
    +
    +
    +
    + {if: $bat.notify} +
    {$bat.notify.text}
    + {/if} +
    + {$page.content} +
    +
    + {template: inc/sidebar.html} +
    +
    + +{template: inc/footer.html} \ No newline at end of file diff --git a/themes/batblog/js/theme.js b/themes/batblog/js/theme.js new file mode 100644 index 0000000..e6ccd72 --- /dev/null +++ b/themes/batblog/js/theme.js @@ -0,0 +1,28 @@ +$(function() { + $("body").on("input propertychange", ".form-group", function(e) { + $(this).toggleClass("form-group-with-value", !!$(e.target).val()); + }).on("focus", ".form-group", function() { + $(this).addClass("form-group-with-focus"); + }).on("blur", ".form-group", function() { + $(this).removeClass("form-group-with-focus"); + }); +}); + +jQuery(document).ready(function($) { + $(window).scroll(function() { + if ($(window).scrollTop() > 0) + $(".navbar").addClass("is-fixed"); + else + $(".navbar").removeClass("is-fixed"); + }); + + $("article .post-footer .pull-left a").click(function(e) { + window.open($(this).attr('href'), "Share", "status = 1, height = 400, width = 640, resizable = 1") + e.preventDefault(); + }); + $(window).resize(function() { + $('.gallery > div').each(function() { + $('.thumbnail', this).height( $(this).width() * 1 ); + }); + }).resize(); +}); diff --git a/themes/batblog/manifest.json b/themes/batblog/manifest.json new file mode 100644 index 0000000..de81d1c --- /dev/null +++ b/themes/batblog/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "BatBlog", + "version": "1.0", + "author": "Sruu.pl", + "email": "support@batflat.org", + "thumb": "preview.png" +} \ No newline at end of file diff --git a/themes/batblog/post.html b/themes/batblog/post.html new file mode 100644 index 0000000..f039ca6 --- /dev/null +++ b/themes/batblog/post.html @@ -0,0 +1,75 @@ +{template: inc/header.html} + + +
    +
    +
    +
    +
    +

    {$blog.title}

    +
    + {$blog.desc} +
    +
    +
    +
    +
    + +
    +
    +
    + {if: $bat.notify} +
    {$bat.notify.text}
    + {/if} + +
    +
    +

    + {$post.title} +

    +
    + + {if: $post.cover_photo} +
    + + {$post.title} + +
    + {/if} +
    + {$post.content} +
    +
    +
    + +

    {$post.author.name}

    +
    +
    {$post.author.description}
    +
    + +
    +
    + +
    +
    +
    + {template: inc/sidebar.html} +
    +
    + +{template: inc/footer.html} \ No newline at end of file diff --git a/themes/batblog/preview.png b/themes/batblog/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..c47f79014bf2fd0d3b4e1aa9ceb66617234e2ccb GIT binary patch literal 122152 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%0A%n5MPmw%4p5SH(5J4>!cmKj$)gIwjH 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 +

    +
    +
    +
    +
    +

    {$blog.title}

    +
    + {$blog.desc} +
    +
    +
    +
    +
    + + +
    +
    +
    + {if: $bat.notify} +
    {$bat.notify.text}
    + {/if} + {loop: $blog.posts} +
    + + {if: $value.cover_photo} + + {/if} +

    + {$value.title} +

    +
    +

    {$value.content}

    + +
    +
    {/loop} + + +
    +
    +
    +{template: inc/footer.html} \ No newline at end of file diff --git a/themes/default/css/style.css b/themes/default/css/style.css new file mode 100644 index 0000000..131f28c --- /dev/null +++ b/themes/default/css/style.css @@ -0,0 +1,477 @@ +@import url('//fonts.googleapis.com/css?family=Lora:400,700|Open+Sans:300,400,700,800&subset=latin-ext'); +body { + font-family: 'Lora', 'Times New Roman', serif; + font-size: 20px; + color: #404040; + background-color: #fff; +} +p { + line-height: 1.5; + margin: 30px 0; +} +p a { + text-decoration: underline +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 800; +} +a { + color: #404040 +} +a:hover, +a:focus { + color: #f8be12 +} +a img:hover, +a img:focus { + cursor: zoom-in +} +blockquote { + color: #808080; + font-style: italic; +} +hr.small { + max-width: 100px; + margin: 15px auto; + border-width: 4px; + border-color: white; +} +.navbar-custom { + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 3; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; +} +.navbar-custom .navbar-brand { + font-weight: 800 +} +.navbar-custom .nav > li > a { + text-transform: uppercase; + font-size: 12px; + font-weight: 800; + letter-spacing: 1px; +} +.navbar-custom .nav > li.active > a { + color: #fff; +} +.navbar-custom .nav > li.active > a:hover { + color: rgba(255, 255, 255, 0.8); +} +.navbar-default .navbar-nav>.open>a, +.navbar-default .navbar-nav>.open>a:hover, +.navbar-default .navbar-nav>.open>a:focus { + background-color: transparent +} +@media only screen and (min-width: 768px) { + .navbar-custom { + background: transparent; + border-bottom: 1px solid transparent; + } + .navbar-custom .navbar-brand { + color: white; + padding: 20px; + } + .navbar-custom .navbar-brand:hover, + .navbar-custom .navbar-brand:focus { + color: rgba(255, 255, 255, 0.8) + } + .navbar-custom .nav > li > a { + color: white; + padding: 20px; + } + .navbar-custom .nav > li > form { + padding: 12px; + } + .navbar-custom .nav > li > form > select { + background:transparent; + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='white'%3E%E2%96%BE%3C/text%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: center right; + padding:6px 22px 6px 12px; + border:1px solid #FFF; + color:#FFF; + border-radius: 0; + -moz-appearance: none; + -webkit-appearance: none; + } + .navbar-custom .nav > li > form > select:focus { + box-shadow: none; + } + .navbar-custom .nav > li > form > select > option { + color: initial; + } + .navbar-custom .nav > li > a:hover, + .navbar-custom .nav > li > a:focus { + color: rgba(255, 255, 255, 0.8); + background-color: transparent; + } +} +@media only screen and (min-width: 1170px) { + .navbar-custom { + -webkit-transition: all 0.3s; + transition: all 0.3s; + } + .navbar-custom.is-fixed { + position: fixed; + background-color: rgba(255, 255, 255, 0.9); + border-bottom: 1px solid #f2f2f2; + } + .navbar-custom.is-fixed .navbar-brand { + color: #404040 + } + .navbar-custom.is-fixed .navbar-brand:hover, + .navbar-custom.is-fixed .navbar-brand:focus { + color: #f8be12 + } + .navbar-custom.is-fixed .nav > li > a { + color: #404040 + } + .navbar-custom.is-fixed .nav > li > a:hover, + .navbar-custom.is-fixed .nav > li > a:focus, + .navbar-custom.is-fixed .nav > li.active > a { + color: #f8be12 + } + .navbar-custom.is-fixed .nav > li > form > select { + background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='#404040'%3E%E2%96%BE%3C/text%3E%3C/svg%3E"); + border:1px solid #404040; + color:#404040; + } +} +.navbar-default .navbar-nav>.active>a, +.navbar-default .navbar-nav>.active>a:focus, +.navbar-default .navbar-nav>.active>a:hover, +.navbar-default .navbar-nav>li>a:focus, +.navbar-default .navbar-nav>li>a:hover { + background-color: transparent +} +.intro-header { + background-color: #808080; + background-attachment: fixed; + background-position: center; + background-repeat: no-repeat; + background-size: cover; + margin-bottom: 50px; +} +.intro-header .site-heading, +.intro-header .post-heading, +.intro-header .page-heading { + padding: 100px 0 50px; + color: white; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading, + .intro-header .post-heading, + .intro-header .page-heading { + padding: 150px 0 + } +} +.intro-header .site-heading, +.intro-header .page-heading { + text-align: center +} +.intro-header .site-heading h1, +.intro-header .page-heading h1 { + margin-top: 0; + font-size: 50px; +} +.intro-header .site-heading .subheading, +.intro-header .page-heading .subheading { + font-size: 24px; + line-height: 1.1; + display: block; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-weight: 300; + margin: 10px 0 0; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading h1, + .intro-header .page-heading h1 { + font-size: 80px + } +} +.intro-header .post-heading h1 { + font-size: 35px +} +.intro-header .post-heading .subheading, +.intro-header .post-heading .meta { + line-height: 1.1; + display: block; +} +.intro-header .post-heading .subheading { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 24px; + margin: 10px 0 30px; + font-weight: 600; +} +.intro-header .post-heading .meta { + font-family: 'Lora', 'Times New Roman', serif; + font-style: italic; + font-weight: 300; + font-size: 20px; +} +.intro-header .post-heading .meta a { + color: white +} +@media only screen and (min-width: 768px) { + .intro-header .post-heading h1 { + font-size: 55px + } + .intro-header .post-heading .subheading { + font-size: 30px + } +} +.post-preview > a { + color: #404040 +} +.post-preview > a:hover, +.post-preview > a:focus { + text-decoration: none; + color: #f8be12; +} +.post-preview > a > .post-cover { + max-width: 100% +} +.post-preview > a > .post-title { + font-size: 30px; + margin-top: 30px; + margin-bottom: 10px; +} +.post-preview > a > .post-subtitle { + margin: 0; + font-weight: 300; + margin-bottom: 10px; +} +.post-preview > .post-meta { + color: #808080; + font-size: 18px; + font-style: italic; + margin-top: 0; +} +.post-preview > .post-meta > a { + text-decoration: none; + color: #404040; +} +.post-preview > .post-meta > a:hover, +.post-preview > .post-meta > a:focus { + color: #f8be12; + text-decoration: underline; +} +@media only screen and (min-width: 768px) { + .post-preview > a > .post-title { + font-size: 36px + } +} +.section-heading { + font-size: 36px; + margin-top: 60px; + font-weight: 700; +} +.caption { + text-align: center; + font-size: 14px; + padding: 10px; + font-style: italic; + margin: 0; + display: block; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +.thumbnail .caption h3 { + margin-top: 0; + margin-bottom: 0; +} +.thumbnail .caption p { + margin-top: 10px; + margin-bottom: 0; + line-height: 1.2; +} +footer { + padding: 50px 0 65px +} +footer .list-inline { + margin: 0; + padding: 0; +} +footer .copyright { + font-size: 14px; + text-align: center; + margin-bottom: 0; +} +.form-control { + border-radius: 0; + box-shadow: none; +} +.form-control:focus { + border-color: #f8be12; + box-shadow: 0 0 8px rgba(249, 190, 18, .6); +} +.form-group { + font-size: 14px; + position: relative; + margin-bottom: 0; + padding-bottom: 1.5em; + padding-right: 15px; + padding-left: 15px; + border-bottom: 1px solid #eeeeee; +} +form .form-group:last-of-type { + margin-bottom: 25px +} +form .btn { + margin-left: 15px +} +.form-group input, +.form-group textarea { + z-index: 1; + position: relative; + padding-right: 0; + padding-left: 0; + border: none; + font-size: 1.5em; + background: none; + box-shadow: none !important; + resize: none; +} +.form-group label { + display: block; + z-index: 0; + position: relative; + top: 2em; + margin: 0; + font-size: 0.85em; + line-height: 1.764705882em; + opacity: 0; + -webkit-transition: top 0.3s ease, opacity 0.3s ease; + transition: top 0.3s ease, opacity 0.3s ease; +} +.form-group::not(:first-child) { + padding-left: 14px; + border-left: 1px solid #eeeeee; +} +.form-group-with-value label { + top: 0; + opacity: 1; +} +.form-group-with-focus label { + color: #f8be12 +} +form .row:first-child .form-group { + border-top: 1px solid #eeeeee +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #AAB2BD !important +} +input::-moz-placeholder, +textarea::-moz-placeholder { + color: #AAB2BD !important +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #AAB2BD !important +} +.btn { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + border-radius: 0; + padding: 15px 25px; +} +.btn-lg { + font-size: 16px; + padding: 25px 35px; +} +.btn-default { + background-color: #fff +} +.btn-default:hover, +.btn-default:focus { + background-color: #f8be12; + border: 1px solid #f8be12; + color: white; +} +.input-group .btn { + padding: 6px 12px; + font-size: 14px; + font-weight: 400; +} +.pager { + margin: 20px 0 0 +} +.pager li > a, +.pager li > span { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + padding: 15px 25px; + background-color: white; + border-radius: 0; +} +.pager li > a:hover, +.pager li > a:focus { + color: white; + background-color: #f8be12; + border: 1px solid #f8be12; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #808080; + background-color: #404040; + cursor: not-allowed; +} +.pagination > li > a, +.pagination > li > span { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + color: inherit; +} +.pagination > li > a:hover, +.pagination > li > span:hover { + color: inherit; +} +.pagination > li:first-child > a, +.pagination > li:last-child > a, +.pagination > li:first-child > span, +.pagination > li:last-child > span { + border-radius: 0; +} +.pagination > .active > a, +.pagination > .active > a:focus, +.pagination > .active > a:hover, +.pagination > .active > span, +.pagination > .active > span:focus, +.pagination > .active > span:hover { + border-color: #f8be12; + background: #f8be12; +} +::-moz-selection { + color: white; + text-shadow: none; + background: #f8be12; +} +::selection { + color: white; + text-shadow: none; + background: #f8be12; +} +img::selection { + color: white; + background: transparent; +} +img::-moz-selection { + color: white; + background: transparent; +} \ No newline at end of file diff --git a/themes/default/img/default-bg.jpg b/themes/default/img/default-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..867dc9a8227ee9f9aae92edab2ae6de8f36c4262 GIT binary patch literal 145218 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

    cDEdF3`#fg3;ogF=0(^ZKA^xCjI7*ScXH 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≻0E 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 literal 0 HcmV?d00001 diff --git a/themes/default/inc/footer.html b/themes/default/inc/footer.html new file mode 100644 index 0000000..6f3b5ad --- /dev/null +++ b/themes/default/inc/footer.html @@ -0,0 +1,47 @@ +
    + + + + + {loop: $bat.footer}{$value}{/loop} + + + + \ No newline at end of file diff --git a/themes/default/inc/header.html b/themes/default/inc/header.html new file mode 100644 index 0000000..99065d1 --- /dev/null +++ b/themes/default/inc/header.html @@ -0,0 +1,44 @@ + + + + + + + + + + {$page.title} - {$settings.title} + + + + + + + {loop: $bat.header}{$value}{/loop} + + + + + + diff --git a/themes/default/index.html b/themes/default/index.html new file mode 100644 index 0000000..9d1cfff --- /dev/null +++ b/themes/default/index.html @@ -0,0 +1,30 @@ +{template: inc/header.html} + + +
    +
    +
    +
    +
    +

    {$page.title}

    +
    + {if: $page.desc}{$page.desc}{else}{$settings.description}{/if} +
    +
    +
    +
    +
    + + +
    +
    +
    + {if: $bat.notify} +
    {$bat.notify.text}
    + {/if} + {$page.content} +
    +
    +
    + +{template: inc/footer.html} \ No newline at end of file diff --git a/themes/default/js/theme.js b/themes/default/js/theme.js new file mode 100644 index 0000000..4629402 --- /dev/null +++ b/themes/default/js/theme.js @@ -0,0 +1,18 @@ +$(function() { + $("body").on("input propertychange", ".form-group", function(e) { + $(this).toggleClass("form-group-with-value", !!$(e.target).val()); + }).on("focus", ".form-group", function() { + $(this).addClass("form-group-with-focus"); + }).on("blur", ".form-group", function() { + $(this).removeClass("form-group-with-focus"); + }); +}); + +jQuery(document).ready(function($) { + $(window).scroll(function() { + if ($(window).scrollTop() > 0) + $(".navbar").addClass("is-fixed"); + else + $(".navbar").removeClass("is-fixed"); + }); +}); diff --git a/themes/default/manifest.json b/themes/default/manifest.json new file mode 100644 index 0000000..cba1684 --- /dev/null +++ b/themes/default/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "Hello", + "version": "1.1", + "author": "Sruu.pl", + "email": "support@batflat.org", + "thumb": "preview.png" +} \ No newline at end of file diff --git a/themes/default/post.html b/themes/default/post.html new file mode 100644 index 0000000..dad3730 --- /dev/null +++ b/themes/default/post.html @@ -0,0 +1,43 @@ +{template: inc/header.html} + + +{if: $post.cover_photo} +
    +{else} +
    +{/if} +
    +
    +
    +
    +

    {$post.title}

    + +
    +
    +
    +
    +
    + + +
    +
    +
    +
    + {if: $bat.notify} +
    {$bat.notify.text}
    + {/if} + {$post.content} +

    {loop: $post.tags}{if: $key != 0}, {/if}{$value.name}{/loop}

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + +{template: inc/footer.html} diff --git a/themes/default/preview.png b/themes/default/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..85e08ce6bbd506237d8036aa0d9f0acb25f30d4a GIT binary patch literal 105865 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 +* @author Wojciech Król +* @copyright 2017 Paweł Klockiewicz, Wojciech Król +* @license https://batflat.org/license +* @link https://batflat.org +*/ + +if (!defined("UPGRADABLE")) { + exit(); +} + +function rrmdir($dir) +{ + $files = array_diff(scandir($dir), array('.','..')); + foreach ($files as $file) { + if (is_dir("$dir/$file")) { + rrmdir("$dir/$file"); + } else { + unlink("$dir/$file"); + } + } + return rmdir($dir); +} + +switch ($version) { + case '1.0.0': + /* + Change homepage id to slug + */ + $homepage = $this->core->getSettings('settings', 'homepage'); + $homepage = $this->core->db('pages')->where('id', $homepage)->oneArray(); + $this->core->db('settings')->where('field', 'homepage')->save(['value' => $homepage['slug']]); + + /* + Add 404 pages if does not exist + */ + if (!$this->core->db('pages')->where('slug', '404')->where('lang', 'en_english')->oneArray()) { + // 404 - EN + $this->core->db()->pdo()->exec("INSERT INTO `pages` (`title`, `slug`, `desc`, `lang`, `template`, `date`, `content`) + VALUES ('404', '404', 'Not found', 'en_english', 'index.html', datetime('now'), + '

    Sorry, page does not exist.

    ') + "); + } + if (!$this->core->db('pages')->where('slug', '404')->where('lang', 'pl_polski')->oneArray()) { + // 404 -PL + $this->core->db()->pdo()->exec("INSERT INTO `pages` (`title`, `slug`, `desc`, `lang`, `template`, `date`, `content`) + VALUES ('404', '404', 'Not found', 'pl_polski', 'index.html', datetime('now'), + '

    Niestety taka strona nie istnieje.

    ') + "); + } + + /* + Remove LESS directory + */ + deleteDir('inc/less'); + + // Upgrade version + $return = '1.0.1'; + + case '1.0.1': + $return = "1.0.2"; + + case '1.0.2': + $return = "1.0.3"; + + case '1.0.3': + // Add columns for markdown flag - blog and pages + $this->core->db()->pdo()->exec("ALTER TABLE blog ADD COLUMN markdown INTEGER DEFAULT 0"); + $this->core->db()->pdo()->exec("ALTER TABLE pages ADD COLUMN markdown INTEGER DEFAULT 0"); + $this->core->db()->pdo()->exec("CREATE TABLE `login_attempts` ( + `ip` TEXT NOT NULL, + `attempts` INTEGER NOT NULL, + `expires` INTEGER NOT NULL DEFAULT 0 + )"); + $this->rcopy(BASE_DIR.'/tmp/update/admin', BASE_DIR.'/admin'); + $return = "1.0.4"; + + case '1.0.4': + $return = '1.0.4a'; + + case '1.0.4a': + $this->core->db()->pdo()->exec("ALTER TABLE modules ADD COLUMN sequence INTEGER DEFAULT 0"); + $this->rcopy(BASE_DIR.'/tmp/update/admin', BASE_DIR.'/admin'); + $this->rcopy(BASE_DIR.'/tmp/update/.htaccess', BASE_DIR.'/.htaccess'); + $this->rcopy(BASE_DIR.'/tmp/update/inc/fonts', BASE_DIR.'/inc/fonts'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/admin', BASE_DIR.'/themes/admin'); + $return = '1.0.5'; + + case '1.0.5': + if (file_exists(BASE_DIR.'/themes/default')) { + $this->rcopy(BASE_DIR.'/tmp/update/themes/default/preview.png', BASE_DIR.'/themes/default/preview.png'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/default/manifest.json', BASE_DIR.'/themes/default/manifest.json'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/admin', BASE_DIR.'/themes/admin'); + } + $return = '1.1.0'; + + case '1.1.0': + $this->core->db()->pdo()->exec('CREATE TABLE "blog_tags" ( + `id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `name` TEXT, + `slug` TEXT + );'); + $this->core->db()->pdo()->exec('CREATE TABLE `blog_tags_relationship` ( + `blog_id` INTEGER NOT NULL, + `tag_id` INTEGER NOT NULL + );'); + $this->core->db()->pdo()->exec("INSERT INTO `settings` + (`module`, `field`, `value`) + VALUES + ('contact', 'email', 1), + ('contact', 'driver', 'mail'), + ('contact', 'phpmailer.server', 'smtp.example.com'), + ('contact', 'phpmailer.port', '587'), + ('contact', 'phpmailer.username', 'login@example.com'), + ('contact', 'phpmailer.name', 'Batflat contact'), + ('contact', 'phpmailer.password', 'yourpassword')"); + + $this->rcopy(BASE_DIR.'/tmp/update/inc/core', BASE_DIR.'/inc/core'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/admin', BASE_DIR.'/themes/admin'); + $this->rcopy(BASE_DIR.'/tmp/update/admin', BASE_DIR.'/admin'); + $this->rcopy(BASE_DIR.'/tmp/update/index.php', BASE_DIR.'/index.php'); + $return = '1.2.0'; + + case '1.2.0': + $return = '1.2.1'; + + case '1.2.1': + register_shutdown_function(function () { + sleep(2); + redirect(url([ADMIN, 'settings', 'updates'])); + }); + + $lang = $this->core->getSettings('settings', 'lang_site'); + + $this->rcopy(BASE_DIR.'/tmp/update/admin', BASE_DIR.'/admin'); + $this->rcopy(BASE_DIR.'/tmp/update/index.php', BASE_DIR.'/index.php'); + $this->rcopy(BASE_DIR.'/tmp/update/LICENSE.txt', BASE_DIR.'/LICENSE.txt'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/admin', BASE_DIR.'/themes/admin'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/batblog', BASE_DIR.'/themes/batblog'); + + // Settings + $this->core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'timezone', '".date_default_timezone_get()."')"); + $this->core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('settings', 'license', '')"); + $this->core->db()->pdo()->exec("INSERT INTO `settings` (`module`, `field`, `value`) VALUES ('blog', 'latestPostsCount', '5')"); + + // Users + $this->core->db()->pdo()->exec("ALTER TABLE users ADD COLUMN description TEXT NULL"); + $this->core->db()->pdo()->exec("ALTER TABLE users ADD COLUMN avatar TEXT NULL"); + $this->core->db()->pdo()->exec("CREATE TABLE IF NOT EXISTS `remember_me` ( + `id` integer NOT NULL PRIMARY KEY AUTOINCREMENT, + `token` text NOT NULL, + `user_id` integer NOT NULL REFERENCES users(id) ON DELETE CASCADE, + `expiry` integer NOT NULL + )"); + if (!is_dir(UPLOADS."/users")) { + mkdir(UPLOADS."/users", 0777); + } + + $users = $this->core->db('users')->toArray(); + foreach ($users as $user) { + $avatar = uniqid('avatar').'.png'; + copy(MODULES.'/users/img/default.png', UPLOADS.'/users/'.$avatar); + $this->core->db('users')->where('id', $user['id'])->save(['avatar' => $avatar]); + } + + // Blog + $this->core->db()->pdo()->exec("ALTER TABLE blog ADD COLUMN lang TEXT NULL"); + $this->core->db()->pdo()->exec("UPDATE blog SET lang = '".$lang."'"); + + // Snippets + $snippets = $this->core->db('snippets')->toArray(); + foreach ($snippets as $snippet) { + $this->core->db('snippets')->where('id', $snippet['id'])->save(['content' => '{lang: '.$lang.'}'.$snippet['content'].'{/lang}']); + } + $return = '1.3.0'; + + case '1.3.0': + $this->core->db()->pdo()->exec("ALTER TABLE navs_items ADD COLUMN class TEXT NULL"); + $return = '1.3.1'; + + case '1.3.1': + $this->rcopy(BASE_DIR.'/backup/'.$backup_date.'/inc/core/defines.php', BASE_DIR.'/inc/core/defines.php'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/admin', BASE_DIR.'/themes/admin'); + $return = '1.3.1a'; + + case '1.3.1a': + $return = '1.3.1b'; + + case '1.3.1b': + $return = '1.3.2'; + + case '1.3.2': + $this->rcopy(BASE_DIR.'/tmp/update/admin', BASE_DIR.'/admin'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/admin', BASE_DIR.'/themes/admin'); + $this->core->db()->pdo()->exec("INSERT INTO modules (`dir`) VALUES ('devbar')"); + $return = '1.3.3'; + + case '1.3.3': + $this->rcopy(BASE_DIR.'/tmp/update/admin', BASE_DIR.'/admin'); + $this->rcopy(BASE_DIR.'/tmp/update/themes/admin', BASE_DIR.'/themes/admin'); + $return = '1.3.4'; +} + +return $return; diff --git a/uploads/.htaccess b/uploads/.htaccess new file mode 100644 index 0000000..0e70384 --- /dev/null +++ b/uploads/.htaccess @@ -0,0 +1,4 @@ +Options -Indexes + +SetHandler default-handler +AddType text/plain php \ No newline at end of file diff --git a/uploads/index.html b/uploads/index.html new file mode 100644 index 0000000..e69de29